Merge branch 'edge'
Conflicts:
home/page/latest_updates/latest_updates.js
diff --git a/accounts/doctype/purchase_invoice/test_purchase_invoice.py b/accounts/doctype/purchase_invoice/test_purchase_invoice.py
index 621604b..a70c932 100644
--- a/accounts/doctype/purchase_invoice/test_purchase_invoice.py
+++ b/accounts/doctype/purchase_invoice/test_purchase_invoice.py
@@ -72,7 +72,38 @@
["Stock Received But Not Billed - _TC", 750.0, 0],
["_Test Account Shipping Charges - _TC", 100.0, 0],
["_Test Account VAT - _TC", 120.0, 0],
- ["Expenses Included In Valuation - _TC", 0, 250.0]
+ ["Expenses Included In Valuation - _TC", 0, 250.0],
+ ])
+
+ for i, gle in enumerate(gl_entries):
+ self.assertEquals(expected_values[i][0], gle.account)
+ self.assertEquals(expected_values[i][1], gle.debit)
+ self.assertEquals(expected_values[i][2], gle.credit)
+
+ webnotes.defaults.set_global_default("auto_inventory_accounting", 0)
+
+ def test_gl_entries_with_aia_for_non_stock_items(self):
+ webnotes.defaults.set_global_default("auto_inventory_accounting", 1)
+ self.assertEqual(cint(webnotes.defaults.get_global_default("auto_inventory_accounting")), 1)
+
+ pi = webnotes.bean(copy=test_records[1])
+ pi.doclist[1].item_code = "_Test Non Stock Item"
+ pi.doclist[1].expense_head = "_Test Account Cost for Goods Sold - _TC"
+ pi.doclist.pop(2)
+ pi.doclist.pop(3)
+ pi.run_method("calculate_taxes_and_totals")
+ pi.insert()
+ pi.submit()
+
+ gl_entries = webnotes.conn.sql("""select account, debit, credit
+ from `tabGL Entry` where voucher_type='Purchase Invoice' and voucher_no=%s
+ order by account asc""", pi.doc.name, as_dict=1)
+ self.assertTrue(gl_entries)
+
+ expected_values = sorted([
+ ["_Test Supplier - _TC", 0, 620],
+ ["_Test Account Cost for Goods Sold - _TC", 500.0, 0],
+ ["_Test Account VAT - _TC", 120.0, 0],
])
for i, gle in enumerate(gl_entries):
@@ -106,7 +137,6 @@
self.assertEqual(tax.account_head, expected_values[i][0])
self.assertEqual(tax.tax_amount, expected_values[i][1])
self.assertEqual(tax.total, expected_values[i][2])
- # print tax.account_head, tax.tax_amount, tax.item_wise_tax_detail
expected_values = [
["_Test Item Home Desktop 100", 90, 59],
@@ -142,7 +172,6 @@
self.assertEqual(tax.account_head, expected_values[i][0])
self.assertEqual(tax.tax_amount, expected_values[i][1])
self.assertEqual(tax.total, expected_values[i][2])
- # print tax.account_head, tax.tax_amount, tax.item_wise_tax_detail
expected_values = [
["_Test FG Item", 90, 7059],
diff --git a/accounts/page/accounts_home/accounts_home.js b/accounts/page/accounts_home/accounts_home.js
index 3e9ea92..2703d27 100644
--- a/accounts/page/accounts_home/accounts_home.js
+++ b/accounts/page/accounts_home/accounts_home.js
@@ -149,6 +149,11 @@
route: "query-report/Accounts Payable",
doctype: "Purchase Invoice"
},
+ {
+ "label":wn._("Sales Register"),
+ route: "query-report/Sales Register",
+ doctype: "Sales Invoice"
+ },
]
},
{
diff --git a/accounts/report/sales_register/__init__.py b/accounts/report/sales_register/__init__.py
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/accounts/report/sales_register/__init__.py
diff --git a/accounts/report/sales_register/sales_register.js b/accounts/report/sales_register/sales_register.js
new file mode 100644
index 0000000..8224619
--- /dev/null
+++ b/accounts/report/sales_register/sales_register.js
@@ -0,0 +1,42 @@
+wn.query_reports["Sales Register"] = {
+ "filters": [
+ {
+ "fieldname":"from_date",
+ "label": "From Date",
+ "fieldtype": "Date",
+ "default": wn.defaults.get_user_default("year_start_date"),
+ "width": "80"
+ },
+ {
+ "fieldname":"to_date",
+ "label": "To Date",
+ "fieldtype": "Date",
+ "default": get_today()
+ },
+ {
+ "fieldname":"account",
+ "label": "Account",
+ "fieldtype": "Link",
+ "options": "Account",
+ "get_query": function() {
+ var company = wn.query_report.filters_by_name.company.get_value();
+ return {
+ "query": "accounts.utils.get_account_list",
+ "filters": {
+ "is_pl_account": "No",
+ "debit_or_credit": "Debit",
+ "company": company,
+ "master_type": "Customer"
+ }
+ }
+ }
+ },
+ {
+ "fieldname":"company",
+ "label": "Company",
+ "fieldtype": "Link",
+ "options": "Company",
+ "default": sys_defaults.company
+ }
+ ]
+}
\ No newline at end of file
diff --git a/accounts/report/sales_register/sales_register.py b/accounts/report/sales_register/sales_register.py
new file mode 100644
index 0000000..07772cb
--- /dev/null
+++ b/accounts/report/sales_register/sales_register.py
@@ -0,0 +1,161 @@
+# ERPNext - web based ERP (http://erpnext.com)
+# Copyright (C) 2012 Web Notes Technologies Pvt Ltd
+#
+# This program is free software: you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation, either version 3 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program. If not, see <http://www.gnu.org/licenses/>.
+
+from __future__ import unicode_literals
+import webnotes
+from webnotes.utils import flt
+
+def execute(filters=None):
+ if not filters: filters = {}
+ columns, income_accounts, tax_accounts = get_columns()
+
+ invoice_list = get_invoices(filters)
+ invoice_income_map = get_invoice_income_map(invoice_list)
+ invoice_tax_map = get_invoice_tax_map(invoice_list)
+
+ invoice_so_dn_map = get_invoice_so_dn_map(invoice_list)
+ customer_map = get_customer_deatils(invoice_list)
+ account_map = get_account_details(invoice_list)
+
+ data = []
+ for inv in invoice_list:
+ # invoice details
+ sales_order = ", ".join(invoice_so_dn_map.get(inv.name, {}).get("sales_order", []))
+ delivery_note = ", ".join(invoice_so_dn_map.get(inv.name, {}).get("delivery_note", []))
+ # webnotes.errprint(customer_map.get(inv.customer, []))
+ row = [inv.name, inv.posting_date, inv.customer, inv.debit_to,
+ account_map.get(inv.debit_to), customer_map.get(inv.customer), inv.project_name,
+ inv.remarks, sales_order, delivery_note]
+
+ # map income values
+ for income_acc in income_accounts:
+ row.append(invoice_income_map.get(inv.name, {}).get(income_acc))
+
+ # net total
+ row.append(inv.net_total)
+
+ # tax account
+ for tax_acc in tax_accounts:
+ row.append(invoice_tax_map.get(inv.name, {}).get(tax_acc))
+
+ # total tax, grand total
+ row += [inv.other_charges_total, inv.grand_total]
+
+ data.append(row)
+
+ return columns, data
+
+
+def get_columns():
+ """return columns based on filters"""
+ columns = [
+ "Invoice:Link/Sales Invoice:120", "Posting Date:Date:80", "Customer:Link/Customer:120",
+ "Customer Account:Link/Account:120", "Account Group:LInk/Account:120",
+ "Territory:Link/Territory:80", "Project:Link/Project:80",
+ "Remarks::150", "Sales Order:Link/Sales Order:100", "Delivery Note:Link/Delivery Note:100"
+ ]
+
+ income_accounts = webnotes.conn.sql_list("""select distinct income_account
+ from `tabSales Invoice Item` where docstatus = 1 order by income_account""")
+
+ tax_accounts = webnotes.conn.sql_list("""select distinct account_head
+ from `tabSales Taxes and Charges` where parenttype = 'Sales Invoice'
+ and docstatus = 1 order by account_head""")
+
+ columns = columns + [(account + ":Currency:120") for account in income_accounts] + \
+ ["Net Total:Currency:120"] + [(account + ":Currency:120") for account in tax_accounts] + \
+ ["Total Tax:Currency:120"] + ["Grand Total:Currency:120"]
+
+ return columns, income_accounts, tax_accounts
+
+def get_conditions(filters):
+ conditions = ""
+
+ if filters.get("company"): conditions += " and company=%(company)s"
+ if filters.get("account"): conditions += " and account = %(account)s"
+
+ if filters.get("from_date"): conditions += " and posting_date>=%(from_date)s"
+ if filters.get("to_date"): conditions += " and posting_date<=%(to_date)s"
+
+ return conditions
+
+def get_invoices(filters):
+ conditions = get_conditions(filters)
+ return webnotes.conn.sql("""select name, posting_date, territory, debit_to, territory,
+ project_name, customer, remarks, net_total, other_charges_total, grand_total
+ from `tabSales Invoice` where docstatus = 1 %s
+ order by posting_date desc, name desc""" % conditions, filters, as_dict=1)
+
+def get_invoice_income_map(invoice_list):
+ income_details = webnotes.conn.sql("""select parent, income_account, sum(amount) as amount
+ from `tabSales Invoice Item` where parent in (%s) group by parent, income_account""" %
+ ', '.join(['%s']*len(invoice_list)), tuple([inv.name for inv in invoice_list]), as_dict=1)
+
+ invoice_income_map = {}
+ for d in income_details:
+ invoice_income_map.setdefault(d.parent, webnotes._dict()).setdefault(d.income_account, [])
+ invoice_income_map[d.parent][d.income_account] = flt(d.amount)
+
+ return invoice_income_map
+
+def get_invoice_tax_map(invoice_list):
+ tax_details = webnotes.conn.sql("""select parent, account_head, sum(tax_amount) as tax_amount
+ from `tabSales Taxes and Charges` where parent in (%s) group by parent, account_head""" %
+ ', '.join(['%s']*len(invoice_list)), tuple([inv.name for inv in invoice_list]), as_dict=1)
+
+ invoice_tax_map = {}
+ for d in tax_details:
+ invoice_tax_map.setdefault(d.parent, webnotes._dict()).setdefault(d.account_head, [])
+ invoice_tax_map[d.parent][d.account_head] = flt(d.tax_amount)
+
+ return invoice_tax_map
+
+def get_invoice_so_dn_map(invoice_list):
+ si_items = webnotes.conn.sql("""select parent, sales_order, delivery_note
+ from `tabSales Invoice Item` where parent in (%s)
+ and (ifnull(sales_order, '') != '' or ifnull(delivery_note, '') != '')""" %
+ ', '.join(['%s']*len(invoice_list)), tuple([inv.name for inv in invoice_list]), as_dict=1)
+
+ invoice_so_dn_map = {}
+ for d in si_items:
+ if d.sales_order:
+ invoice_so_dn_map.setdefault(d.parent, webnotes._dict()).setdefault(
+ "sales_order", []).append(d.sales_order)
+ if d.delivery_note:
+ invoice_so_dn_map.setdefault(d.parent, webnotes._dict()).setdefault(
+ "delivery_note", []).append(d.delivery_note)
+
+ return invoice_so_dn_map
+
+def get_customer_deatils(invoice_list):
+ customer_map = {}
+ customers = list(set([inv.customer for inv in invoice_list]))
+ for cust in webnotes.conn.sql("""select name, territory from `tabCustomer`
+ where name in (%s)""" % ", ".join(["%s"]*len(customers)), tuple(customers), as_dict=1):
+ customer_map.setdefault(cust.name, "")
+ customer_map[cust.name] = cust.territory
+
+ return customer_map
+
+def get_account_details(invoice_list):
+ account_map = {}
+ accounts = list(set([inv.debit_to for inv in invoice_list]))
+ for acc in webnotes.conn.sql("""select name, parent_account from tabAccount
+ where name in (%s)""" % ", ".join(["%s"]*len(accounts)), tuple(accounts), as_dict=1):
+ account_map.setdefault(acc.name, "")
+ account_map[acc.name] = acc.parent_account
+
+ return account_map
\ No newline at end of file
diff --git a/accounts/report/sales_register/sales_register.txt b/accounts/report/sales_register/sales_register.txt
new file mode 100644
index 0000000..5aef814
--- /dev/null
+++ b/accounts/report/sales_register/sales_register.txt
@@ -0,0 +1,21 @@
+[
+ {
+ "creation": "2013-04-23 18:15:29",
+ "docstatus": 0,
+ "modified": "2013-04-23 18:15:29",
+ "modified_by": "Administrator",
+ "owner": "Administrator"
+ },
+ {
+ "doctype": "Report",
+ "is_standard": "Yes",
+ "name": "__common__",
+ "ref_doctype": "Sales Invoice",
+ "report_name": "Sales Register",
+ "report_type": "Script Report"
+ },
+ {
+ "doctype": "Report",
+ "name": "Sales Register"
+ }
+]
\ No newline at end of file
diff --git a/accounts/search_criteria/sales_register/sales_register.js b/accounts/search_criteria/sales_register/sales_register.js
index 5a09713..872e198 100644
--- a/accounts/search_criteria/sales_register/sales_register.js
+++ b/accounts/search_criteria/sales_register/sales_register.js
@@ -28,5 +28,5 @@
this.filter_fields_dict['Sales Invoice'+FILTER_SEP +'Grand Total <='].df.filter_hide = 1;
this.filter_fields_dict['Sales Invoice'+FILTER_SEP +'Fiscal Year'].df.filter_hide = 1;
this.filter_fields_dict['Sales Invoice'+FILTER_SEP +'Sales Partner'].df.filter_hide = 1;
- this.filter_fields_dict['Sales Invoice'+FILTER_SEP +'Is Opening'].df.filter_hide = 1;
+ this.filter_fields_dict['Sales Invoice'+FILTER_SEP +'Is Opening Entry'].df.filter_hide = 1;
}
diff --git a/controllers/buying_controller.py b/controllers/buying_controller.py
index 429737e..e167dc5 100644
--- a/controllers/buying_controller.py
+++ b/controllers/buying_controller.py
@@ -29,6 +29,7 @@
class BuyingController(StockController):
def validate(self):
super(BuyingController, self).validate()
+ self.validate_stock_or_nonstock_items()
if self.meta.get_field("currency"):
self.company_currency = get_company_currency(self.doc.company)
self.validate_conversion_rate("currency", "conversion_rate")
@@ -41,7 +42,25 @@
# set total in words
self.set_total_in_words()
-
+
+ def validate_stock_or_nonstock_items(self):
+ items = [d.item_code for d in self.doclist.get({"parentfield": self.fname})]
+ if self.stock_items:
+ nonstock_items = list(set(items) - set(self.stock_items))
+ if nonstock_items:
+ webnotes.msgprint(_("Stock and non-stock items can not be entered in the same ") +
+ self.doc.doctype + _(""". You should make separate documents for them.
+ Stock Items: """) + ", ".join(self.stock_items) + _("""
+ Non-stock Items: """) + ", ".join(nonstock_items), raise_exception=1)
+
+ elif items and not self.stock_items:
+ tax_for_valuation = [d.account_head for d in
+ self.doclist.get({"parentfield": "purchase_tax_details"})
+ if d.category in ["Valuation", "Valuation and Total"]]
+ if tax_for_valuation:
+ webnotes.msgprint(_("""Tax Category can not be 'Valuation' or 'Valuation and Total'
+ as all items are non-stock items"""), raise_exception=1)
+
def update_item_details(self):
for item in self.doclist.get({"parentfield": self.fname}):
ret = get_item_details({
diff --git a/home/page/latest_updates/latest_updates.js b/home/page/latest_updates/latest_updates.js
index 1e35a92..b768f1a 100644
--- a/home/page/latest_updates/latest_updates.js
+++ b/home/page/latest_updates/latest_updates.js
@@ -1,6 +1,8 @@
erpnext.updates = [
- ["10th April", ["Redesigned File Uploads and added File Manager in Setup"]],
+ ["18th April", ["Cost Center: Set a default Cost Center for a Company"]],
["12th April", ["Employee: List of Leave Approvers who can approve the Employee's Leave Applications"]],
+ ["10th April", ["Redesigned File Uploads and added File Manager in Setup"]],
+ ["3rd April", ["Update Manager: Open source users can update their ERPNext instance from Setup > Update Manager"]],
["27th March", ["Rename multiple items together. Go to Setup > Rename Tool"]],
["26th March", ["Added project to Stock Ledger and Balance",
"Added Default Cash Account in Company."]],
diff --git a/manufacturing/doctype/bom/bom.js b/manufacturing/doctype/bom/bom.js
index 4e8fbc9..f0c15fa 100644
--- a/manufacturing/doctype/bom/bom.js
+++ b/manufacturing/doctype/bom/bom.js
@@ -59,27 +59,22 @@
set_operation_no(doc);
}
-cur_frm.cscript.item = function(doc, dt, dn) {
- if (doc.item) {
- get_server_fields('get_item_details', doc.item, '', doc, dt, dn, 1);
- }
-}
+cur_frm.add_fetch("item", "description", "description");
+cur_frm.add_fetch("item", "stock_uom", "uom");
cur_frm.cscript.workstation = function(doc,dt,dn) {
var d = locals[dt][dn];
- if (d.workstation) {
- var callback = function(r, rt) {
- calculate_op_cost(doc, dt, dn);
- calculate_total(doc);
- }
- get_server_fields('get_workstation_details', d.workstation,
- 'bom_operations', doc, dt, dn, 1, callback);
- }
+ wn.model.with_doc("Workstation", d.workstation, function(i, v) {
+ d.hour_rate = v.hour_rate;
+ refresh_field("hour_rate");
+ calculate_op_cost(doc);
+ calculate_total(doc);
+ });
}
cur_frm.cscript.hour_rate = function(doc, dt, dn) {
- calculate_op_cost(doc, dt, dn);
+ calculate_op_cost(doc);
calculate_total(doc);
}
@@ -114,7 +109,7 @@
$.extend(d, r.message);
refresh_field("bom_materials");
doc = locals[doc.doctype][doc.name];
- calculate_rm_cost(doc, cdt, cdn);
+ calculate_rm_cost(doc);
calculate_total(doc);
},
freeze: true
@@ -124,7 +119,7 @@
cur_frm.cscript.qty = function(doc, cdt, cdn) {
- calculate_rm_cost(doc, cdt, cdn);
+ calculate_rm_cost(doc);
calculate_total(doc);
}
@@ -134,12 +129,12 @@
msgprint("You can not change rate if BOM mentioned agianst any item");
get_bom_material_detail(doc, cdt, cdn);
} else {
- calculate_rm_cost(doc, cdt, cdn);
+ calculate_rm_cost(doc);
calculate_total(doc);
}
}
-var calculate_op_cost = function(doc, dt, dn) {
+var calculate_op_cost = function(doc) {
var op = getchildren('BOM Operation', doc.name, 'bom_operations');
total_op_cost = 0;
for(var i=0;i<op.length;i++) {
@@ -151,7 +146,7 @@
refresh_field('operating_cost');
}
-var calculate_rm_cost = function(doc, dt, dn) {
+var calculate_rm_cost = function(doc) {
var rm = getchildren('BOM Item', doc.name, 'bom_materials');
total_rm_cost = 0;
for(var i=0;i<rm.length;i++) {
@@ -201,7 +196,7 @@
}
cur_frm.cscript.validate = function(doc, dt, dn) {
- calculate_op_cost(doc, dt, dn);
- calculate_rm_cost(doc, dt, dn);
+ calculate_op_cost(doc);
+ calculate_rm_cost(doc);
calculate_total(doc);
}
diff --git a/manufacturing/doctype/bom/bom.py b/manufacturing/doctype/bom/bom.py
index b4eeaff..5f42f4d 100644
--- a/manufacturing/doctype/bom/bom.py
+++ b/manufacturing/doctype/bom/bom.py
@@ -44,10 +44,11 @@
self.validate_main_item()
self.validate_operations()
self.validate_materials()
+ self.set_bom_material_details()
+ self.calculate_cost()
def on_update(self):
self.check_recursion()
- self.calculate_cost()
self.update_exploded_items()
self.doc.save()
@@ -73,15 +74,7 @@
from `tabItem` where name=%s""", item_code, as_dict = 1)
return item
-
- def get_item_details(self, item_code):
- res = webnotes.conn.sql("""select description, stock_uom as uom
- from `tabItem` where name=%s""", item_code, as_dict = 1)
- return res and res[0] or {}
-
- def get_workstation_details(self,workstation):
- return {'hour_rate': webnotes.conn.get_value("Workstation", workstation, "hour_rate")}
-
+
def validate_rm_item(self, item):
if item[0]['name'] == self.doc.item:
msgprint("Item_code: %s in materials tab cannot be same as FG Item",
@@ -89,32 +82,42 @@
if not item or item[0]['docstatus'] == 2:
msgprint("Item %s does not exist in system" % item[0]['item_code'], raise_exception = 1)
-
- def get_bom_material_detail(self):
+
+ def set_bom_material_details(self):
+ for item in self.doclist.get({"parentfield": "bom_materials"}):
+ ret = self.get_bom_material_detail({ "item_code": item.item_code, "bom_no": item.bom_no,
+ "qty": item.qty })
+
+ for r in ret:
+ if not item.fields.get(r):
+ item.fields[r] = ret[r]
+
+ def get_bom_material_detail(self, args=None):
""" Get raw material details like uom, desc and rate"""
- arg = webnotes.form_dict.get('args')
- import json
- arg = json.loads(arg)
-
- item = self.get_item_det(arg['item_code'])
+ if not args:
+ args = webnotes.form_dict.get('args')
+ import json
+ args = json.loads(args)
+
+ item = self.get_item_det(args['item_code'])
self.validate_rm_item(item)
- arg['bom_no'] = arg['bom_no'] or item and cstr(item[0]['default_bom']) or ''
- arg.update(item[0])
+ args['bom_no'] = args['bom_no'] or item and cstr(item[0]['default_bom']) or ''
+ args.update(item[0])
- rate = self.get_rm_rate(arg)
+ rate = self.get_rm_rate(args)
ret_item = {
- 'description' : item and arg['description'] or '',
- 'stock_uom' : item and arg['stock_uom'] or '',
- 'bom_no' : arg['bom_no'],
+ 'description' : item and args['description'] or '',
+ 'stock_uom' : item and args['stock_uom'] or '',
+ 'bom_no' : args['bom_no'],
'rate' : rate
}
return ret_item
def get_rm_rate(self, arg):
""" Get raw material rate as per selected method, if bom exists takes bom cost """
-
+ rate = 0
if arg['bom_no']:
rate = self.get_bom_unitcost(arg['bom_no'])
elif arg and (arg['is_purchase_item'] == 'Yes' or arg['is_sub_contracted_item'] == 'Yes'):
@@ -183,11 +186,14 @@
if not item:
msgprint("Item %s does not exists in the system or expired." %
self.doc.item, raise_exception = 1)
-
elif item[0]['is_manufactured_item'] != 'Yes' \
and item[0]['is_sub_contracted_item'] != 'Yes':
msgprint("""As Item: %s is not a manufactured / sub-contracted item, \
you can not make BOM for it""" % self.doc.item, raise_exception = 1)
+ else:
+ ret = webnotes.conn.get_value("Item", self.doc.item, ["description", "stock_uom"])
+ self.doc.description = ret[0]
+ self.doc.uom = ret[1]
def validate_operations(self):
""" Check duplicate operation no"""
@@ -293,9 +299,10 @@
"""Update workstation rate and calculates totals"""
total_op_cost = 0
for d in getlist(self.doclist, 'bom_operations'):
+ if d.workstation and not d.hour_rate:
+ d.hour_rate = webnotes.conn.get_value("Workstation", d.workstation, "hour_rate")
if d.hour_rate and d.time_in_mins:
d.operating_cost = flt(d.hour_rate) * flt(d.time_in_mins) / 60.0
- d.save()
total_op_cost += flt(d.operating_cost)
self.doc.operating_cost = total_op_cost
@@ -307,7 +314,6 @@
d.rate = self.get_bom_unitcost(d.bom_no)
d.amount = flt(d.rate) * flt(d.qty)
d.qty_consumed_per_unit = flt(d.qty) / flt(self.doc.quantity)
- d.save()
total_rm_cost += d.amount
self.doc.raw_material_cost = total_rm_cost
diff --git a/stock/doctype/delivery_note/delivery_note.js b/stock/doctype/delivery_note/delivery_note.js
index 8d09cbd..0a31dfe 100644
--- a/stock/doctype/delivery_note/delivery_note.js
+++ b/stock/doctype/delivery_note/delivery_note.js
@@ -326,6 +326,17 @@
}
// cost center
+ cur_frm.cscript.cost_center = function(doc, cdt, cdn){
+ var d = locals[cdt][cdn];
+ if(d.cost_center) {
+ var cl = getchildren('Delivery Note Item', doc.name, cur_frm.cscript.fname, doc.doctype);
+ for(var i = 0; i < cl.length; i++){
+ if(!cl[i].cost_center) cl[i].cost_center = d.cost_center;
+ }
+ }
+ refresh_field(cur_frm.cscript.fname);
+ }
+
cur_frm.fields_dict.delivery_note_details.grid.get_field("cost_center").get_query = function(doc) {
return {
query: "accounts.utils.get_cost_center_list",