From 0fc24543843c4e3f727f914562d3b6d6885290e8 Mon Sep 17 00:00:00 2001 From: Nabin Hait Date: Mon, 25 Mar 2013 11:06:00 +0530 Subject: [PATCH] aii: patches and fine tuning --- .../purchase_invoice/purchase_invoice.py | 100 +++++++++--------- .../purchase_invoice/test_purchase_invoice.py | 41 ++++++- .../doctype/sales_invoice/sales_invoice.py | 25 +++-- .../sales_invoice_item/sales_invoice_item.txt | 15 ++- accounts/utils.py | 61 +++++++++++ .../purchase_common/purchase_common.py | 2 +- controllers/accounts_controller.py | 16 +-- controllers/buying_controller.py | 4 +- controllers/selling_controller.py | 10 +- controllers/stock_controller.py | 10 +- selling/doctype/sales_common/sales_common.py | 8 +- setup/doctype/company/company.js | 7 ++ setup/doctype/company/company.py | 14 +-- setup/doctype/company/company.txt | 32 +++--- .../global_defaults/global_defaults.py | 9 ++ .../delivery_note_item/delivery_note_item.txt | 6 +- .../purchase_receipt/purchase_receipt.py | 2 +- stock/doctype/stock_entry/stock_entry.js | 4 +- stock/doctype/stock_entry/stock_entry.py | 3 +- .../stock_reconciliation.js | 4 +- .../stock_reconciliation.py | 6 +- 21 files changed, 255 insertions(+), 124 deletions(-) diff --git a/accounts/doctype/purchase_invoice/purchase_invoice.py b/accounts/doctype/purchase_invoice/purchase_invoice.py index f535d56e60..fb9977c486 100644 --- a/accounts/doctype/purchase_invoice/purchase_invoice.py +++ b/accounts/doctype/purchase_invoice/purchase_invoice.py @@ -33,6 +33,47 @@ class DocType(BuyingController): self.doc, self.doclist = d, dl self.tname = 'Purchase Invoice Item' self.fname = 'entries' + + def validate(self): + super(DocType, self).validate() + + self.po_required() + self.pr_required() + self.check_active_purchase_items() + self.check_conversion_rate() + self.validate_bill_no_date() + self.validate_bill_no() + self.validate_reference_value() + self.validate_credit_acc() + self.clear_unallocated_advances("Purchase Invoice Advance", "advance_allocation_details") + self.check_for_acc_head_of_supplier() + self.check_for_stopped_status() + + self.po_list, self.pr_list = [], [] + for d in getlist(self.doclist, 'entries'): + self.validate_supplier(d) + self.validate_po_pr(d) + if not d.purchase_order in self.po_list: + self.po_list.append(d.purchase_order) + if not d.purhcase_receipt in self.pr_list: + self.pr_list.append(d.purchase_receipt) + + + if not self.doc.is_opening: + self.doc.is_opening = 'No' + + self.set_aging_date() + + #set against account for credit to + self.set_against_expense_account() + + #FY validation + get_obj('Sales Common').validate_fiscal_year(self.doc.fiscal_year, + self.doc.posting_date,'Posting Date') + + self.validate_write_off_account() + self.update_raw_material_cost() + self.update_valuation_rate("entries") def get_credit_to(self): acc_head = sql("select name, credit_days from `tabAccount` where (name = %s or (master_name = %s and master_type = 'supplier')) and docstatus != 2", (cstr(self.doc.supplier) + " - " + self.company_abbr,self.doc.supplier)) @@ -265,7 +306,7 @@ class DocType(BuyingController): def set_against_expense_account(self): auto_inventory_accounting = \ cint(webnotes.defaults.get_global_default("auto_inventory_accounting")) - stock_not_billed_account = "Stock Received But Not Billed - %s" % self.company_abbr + stock_not_billed_account = self.get_company_default("stock_received_but_not_billed") against_accounts = [] for item in self.doclist.get({"parentfield": "entries"}): @@ -277,6 +318,10 @@ class DocType(BuyingController): if stock_not_billed_account not in against_accounts: against_accounts.append(stock_not_billed_account) + elif not item.expense_head: + msgprint(_("""Expense account is mandatory for item: """) + item.item_code, + raise_exception=1) + elif item.expense_head not in against_accounts: # if no auto_inventory_accounting or not a stock item against_accounts.append(item.expense_head) @@ -303,47 +348,6 @@ class DocType(BuyingController): if self.doc.write_off_amount and not self.doc.write_off_account: msgprint("Please enter Write Off Account", raise_exception=1) - def validate(self): - super(DocType, self).validate() - - self.po_required() - self.pr_required() - self.check_active_purchase_items() - self.check_conversion_rate() - self.validate_bill_no_date() - self.validate_bill_no() - self.validate_reference_value() - self.validate_credit_acc() - self.clear_unallocated_advances("Purchase Invoice Advance", "advance_allocation_details") - self.check_for_acc_head_of_supplier() - self.check_for_stopped_status() - - self.po_list, self.pr_list = [], [] - for d in getlist(self.doclist, 'entries'): - self.validate_supplier(d) - self.validate_po_pr(d) - if not d.purchase_order in self.po_list: - self.po_list.append(d.purchase_order) - if not d.purhcase_receipt in self.pr_list: - self.pr_list.append(d.purchase_receipt) - - - if not self.doc.is_opening: - self.doc.is_opening = 'No' - - self.set_aging_date() - - #set against account for credit to - self.set_against_expense_account() - - #FY validation - get_obj('Sales Common').validate_fiscal_year(self.doc.fiscal_year, - self.doc.posting_date,'Posting Date') - - self.validate_write_off_account() - self.update_raw_material_cost() - self.update_valuation_rate("entries") - def check_prev_docstatus(self): for d in getlist(self.doclist,'entries'): if d.purchase_order: @@ -445,7 +449,7 @@ class DocType(BuyingController): # item gl entries stock_item_and_auto_inventory_accounting = False if auto_inventory_accounting: - stock_acocunt = self.get_default_account("stock_received_but_not_billed") + stock_account = self.get_company_default("stock_received_but_not_billed") for item in self.doclist.get({"parentfield": "entries"}): if auto_inventory_accounting and item.item_code in self.stock_items: @@ -458,7 +462,7 @@ class DocType(BuyingController): gl_entries.append( self.get_gl_dict({ - "account": stock_acocunt, + "account": stock_account, "against": self.doc.credit_to, "debit": flt(item.valuation_rate) * flt(item.conversion_factor) \ * flt(item.qty), @@ -483,8 +487,8 @@ class DocType(BuyingController): # this will balance out valuation amount included in cost of goods sold gl_entries.append( self.get_gl_dict({ - "account": self.get_default_account("expenses_included_in_valuation"), - "cost_center": "Auto Inventory Accounting - %s" % self.company_abbr, + "account": self.get_company_default("expenses_included_in_valuation"), + "cost_center": self.get_company_default("stock_adjustment_cost_center"), "against": self.doc.credit_to, "credit": valuation_tax, "remarks": self.doc.remarks or "Accounting Entry for Stock" @@ -525,8 +529,8 @@ class DocType(BuyingController): and is_active = 1 """, (d.item_code,)) rm_cost = rm_cost and flt(rm_cost[0][0]) or 0 - d.conversion_factor = d.conversion_factor or webnotes.conn.get_value( + d.conversion_factor = d.conversion_factor or flt(webnotes.conn.get_value( "UOM Conversion Detail", {"parent": d.item_code, "uom": d.uom}, - "conversion_factor") or 1 + "conversion_factor")) or 1 d.rm_supp_cost = rm_cost * flt(d.qty) * flt(d.conversion_factor) \ No newline at end of file diff --git a/accounts/doctype/purchase_invoice/test_purchase_invoice.py b/accounts/doctype/purchase_invoice/test_purchase_invoice.py index 6d9cfca048..621604b96b 100644 --- a/accounts/doctype/purchase_invoice/test_purchase_invoice.py +++ b/accounts/doctype/purchase_invoice/test_purchase_invoice.py @@ -109,12 +109,49 @@ class TestPurchaseInvoice(unittest.TestCase): # print tax.account_head, tax.tax_amount, tax.item_wise_tax_detail expected_values = [ - ["_Test Item Home Desktop 100", 90], - ["_Test Item Home Desktop 200", 135] + ["_Test Item Home Desktop 100", 90, 59], + ["_Test Item Home Desktop 200", 135, 177] ] for i, item in enumerate(wrapper.doclist.get({"parentfield": "entries"})): self.assertEqual(item.item_code, expected_values[i][0]) self.assertEqual(item.item_tax_amount, expected_values[i][1]) + self.assertEqual(item.valuation_rate, expected_values[i][2]) + + def test_purchase_invoice_with_subcontracted_item(self): + wrapper = webnotes.bean(copy=test_records[0]) + wrapper.doclist[1].item_code = "_Test FG Item" + wrapper.run_method("calculate_taxes_and_totals") + wrapper.insert() + wrapper.load_from_db() + + self.assertEqual(wrapper.doclist[0].net_total, 1250) + + # tax amounts + expected_values = [ + ["_Test Account Shipping Charges - _TC", 100, 1350], + ["_Test Account Customs Duty - _TC", 125, 1350], + ["_Test Account Excise Duty - _TC", 140, 1490], + ["_Test Account Education Cess - _TC", 2.8, 1492.8], + ["_Test Account S&H Education Cess - _TC", 1.4, 1494.2], + ["_Test Account CST - _TC", 29.88, 1524.08], + ["_Test Account VAT - _TC", 156.25, 1680.33], + ["_Test Account Discount - _TC", 168.03, 1512.30], + ] + + for i, tax in enumerate(wrapper.doclist.get({"parentfield": "purchase_tax_details"})): + 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], + ["_Test Item Home Desktop 200", 135, 177] + ] + for i, item in enumerate(wrapper.doclist.get({"parentfield": "entries"})): + self.assertEqual(item.item_code, expected_values[i][0]) + self.assertEqual(item.item_tax_amount, expected_values[i][1]) + self.assertEqual(item.valuation_rate, expected_values[i][2]) def test_purchase_invoice_with_advance(self): from accounts.doctype.journal_voucher.test_journal_voucher \ diff --git a/accounts/doctype/sales_invoice/sales_invoice.py b/accounts/doctype/sales_invoice/sales_invoice.py index 9b5c80cfbb..4b0f3b1608 100644 --- a/accounts/doctype/sales_invoice/sales_invoice.py +++ b/accounts/doctype/sales_invoice/sales_invoice.py @@ -249,7 +249,7 @@ class DocType(SellingController): ['Delivery Note Item', 'Sales Invoice Item'], ['Sales Taxes and Charges','Sales Taxes and Charges'], ['Sales Team','Sales Team']]""") - self.get_income_account('entries') + self.get_income_expense_account('entries') elif self.doc.sales_order_main: self.validate_prev_docname('sales order') @@ -259,7 +259,7 @@ class DocType(SellingController): """[['Sales Order', 'Sales Invoice'],['Sales Order Item', 'Sales Invoice Item'], ['Sales Taxes and Charges','Sales Taxes and Charges'], ['Sales Team', 'Sales Team']]""") - self.get_income_account('entries') + self.get_income_expense_account('entries') ret = self.get_debit_to() self.doc.debit_to = ret.get('debit_to') @@ -269,16 +269,21 @@ class DocType(SellingController): """ Loads default accounts from items, customer when called from mapper """ - self.get_income_account('entries') + self.get_income_expense_account('entries') - def get_income_account(self,doctype): + def get_income_expense_account(self,doctype): for d in getlist(self.doclist, doctype): if d.item_code: - item = webnotes.conn.get_value("Item", d.item_code, - ["default_income_account", "default_sales_cost_center"], as_dict=True) + item = webnotes.conn.get_value("Item", d.item_code, ["default_income_account", + "default_sales_cost_center", "purchase_account", "cost_center"], as_dict=True) d.income_account = item['default_income_account'] or "" - d.cost_center = item['default_sales_cost_center'] or "" + d.cost_center = item['default_sales_cost_center'] or "" + + if cint(webnotes.defaults.get_global_default("auto_inventory_accounting")) \ + and cint(self.doc.is_pos) and cint(self.doc.update_stock): + d.expense_account = item['purchase_account'] or "" + d.purchase_cost_center = item['cost_center'] or "" def get_item_details(self, args=None): @@ -294,8 +299,10 @@ class DocType(SellingController): 'item_code':doc.fields.get('item_code'), 'income_account':doc.fields.get('income_account'), 'cost_center': doc.fields.get('cost_center'), - 'warehouse': doc.fields.get('warehouse') - }; + 'warehouse': doc.fields.get('warehouse'), + 'expense_account': doc.fields.get('expense_account'), + 'purchase_cost_center': doc.fields.get('purchase_cost_center') + } ret = self.get_pos_details(arg) for r in ret: diff --git a/accounts/doctype/sales_invoice_item/sales_invoice_item.txt b/accounts/doctype/sales_invoice_item/sales_invoice_item.txt index bc51198f3b..221359ce90 100644 --- a/accounts/doctype/sales_invoice_item/sales_invoice_item.txt +++ b/accounts/doctype/sales_invoice_item/sales_invoice_item.txt @@ -2,7 +2,7 @@ { "creation": "2013-03-07 11:42:55", "docstatus": 0, - "modified": "2013-03-21 18:35:47", + "modified": "2013-03-22 18:40:48", "modified_by": "Administrator", "owner": "Administrator" }, @@ -222,7 +222,7 @@ "fieldname": "cost_center", "fieldtype": "Link", "in_filter": 1, - "label": "Cost Center", + "label": "Sales Cost Center", "oldfieldname": "cost_center", "oldfieldtype": "Link", "options": "Cost Center", @@ -232,6 +232,17 @@ "reqd": 0, "width": "120px" }, + { + "doctype": "DocField", + "fieldname": "purchase_cost_center", + "fieldtype": "Link", + "hidden": 1, + "in_filter": 1, + "label": "Purchase Cost Center", + "options": "Cost Center", + "print_hide": 1, + "width": "120px" + }, { "doctype": "DocField", "fieldname": "serial_no", diff --git a/accounts/utils.py b/accounts/utils.py index 051cdd1b24..92173ab8ee 100644 --- a/accounts/utils.py +++ b/accounts/utils.py @@ -248,3 +248,64 @@ def remove_against_link_from_jv(ref_type, ref_no, against_field): and voucher_no != ifnull(against_voucher, "") and ifnull(is_cancelled, "No")="No" """, (now(), webnotes.session.user, ref_type, ref_no)) + +@webnotes.whitelist() +def get_company_default(company, fieldname): + value = webnotes.conn.get_value("Company", company, fieldname) + + if not value: + msgprint(_("Please mention default value for '") + + _(webnotes.get_doctype("company").get_label(fieldname) + + _("' in Company: ") + company), raise_exception=True) + + return value + +def create_stock_in_hand_jv(reverse=False): + from webnotes.utils import nowdate + today = nowdate() + fiscal_year = get_fiscal_year(today)[0] + + for company in webnotes.conn.sql_list("select name from `tabCompany`"): + stock_rbnb_value = get_stock_rbnb_value(company) + + jv = webnotes.bean([ + { + "doctype": "Journal Voucher", + "naming_series": "_PATCH-", + "company": company, + "posting_date": today, + "fiscal_year": fiscal_year, + "voucher_type": "Journal Entry" + }, + { + "doctype": "Journal Voucher Detail", + "parentfield": "entries", + "account": get_company_default(company, "stock_received_but_not_billed"), + (reverse and "debit" or "credit"): stock_rbnb_value + }, + { + "doctype": "Journal Voucher Detail", + "parentfield": "entries", + "account": get_company_default(company, "stock_adjustment_account"), + (reverse and "credit" or "debit"): stock_rbnb_value + }, + ]) + jv.insert() + jv.submit() + +def get_stock_rbnb_value(company): + total_received_amount = webnotes.conn.sql("""select sum(valuation_amount) + from `tabPurchase Receipt Item` pr_item where docstatus=1 + and exists(select name from `tabItem` where name = pr_item.item_code + and is_stock_item='Yes') + and exist(select name from `tabPurchase Receipt` + where name = pr_item.parent and company = %s)""", company) + + total_billed_amount = webnotes.conn.sql("""select sum(valuation_amount) + from `tabPurchase Invoice Item` pi_item where docstatus=1 + and exists(select name from `tabItem` where name = pi_item.item_code + and is_stock_item='Yes') + and exist(select name from `tabPurchase Invoice` + where name = pi_item.parent and company = %s)""", company) + + return flt(total_received_amount[0][0]) - flt(total_billed_amount[0][0]) diff --git a/buying/doctype/purchase_common/purchase_common.py b/buying/doctype/purchase_common/purchase_common.py index 6af08c6520..d5b563b3c5 100644 --- a/buying/doctype/purchase_common/purchase_common.py +++ b/buying/doctype/purchase_common/purchase_common.py @@ -402,7 +402,7 @@ class DocType(BuyingController): yed=add_days(str(ysd),365) if str(transaction_date) < str(ysd) or str(transaction_date) > str(yed): msgprint("'%s' Not Within The Fiscal Year"%(dn)) - raise Exception + raise Exception def load_default_taxes(self, obj): return self.get_purchase_tax_details(obj, 1) diff --git a/controllers/accounts_controller.py b/controllers/accounts_controller.py index ac6481cef7..0e7c108f3d 100644 --- a/controllers/accounts_controller.py +++ b/controllers/accounts_controller.py @@ -76,14 +76,9 @@ class AccountsController(TransactionBase): "allocate_amount": 0 }) - def get_default_account(self, account_for): - account = webnotes.conn.get_value("Company", self.doc.company, account_for) - if not account: - msgprint(_("Please mention default account for '") + - _(webnotes.get_doctype("company").get_label(account_for) + - _("' in Company: ") + self.doc.company), raise_exception=True) - - return account + def get_company_default(self, fieldname): + from accounts.utils import get_company_default + return get_company_default(self.doc.company, fieldname) @property def stock_items(self): @@ -101,8 +96,3 @@ class AccountsController(TransactionBase): self._abbr = webnotes.conn.get_value("Company", self.doc.company, "abbr") return self._abbr - - -@webnotes.whitelist() -def get_default_account(account_for, company): - return webnotes.conn.get_value("Company", company, account_for) diff --git a/controllers/buying_controller.py b/controllers/buying_controller.py index 2c2bb44a56..560dec2a15 100644 --- a/controllers/buying_controller.py +++ b/controllers/buying_controller.py @@ -332,9 +332,9 @@ class BuyingController(StockController): # update valuation rate def update_valuation_rate(self, parentfield): for d in self.doclist.get({"parentfield": parentfield}): - d.conversion_factor = d.conversion_factor or webnotes.conn.get_value( + d.conversion_factor = d.conversion_factor or flt(webnotes.conn.get_value( "UOM Conversion Detail", {"parent": d.item_code, "uom": d.uom}, - "conversion_factor") or 1 + "conversion_factor")) or 1 if d.item_code and d.qty: # if no item code, which is sometimes the case in purchase invoice, # then it is not possible to track valuation against it diff --git a/controllers/selling_controller.py b/controllers/selling_controller.py index 538c5c1a7e..ab002be801 100644 --- a/controllers/selling_controller.py +++ b/controllers/selling_controller.py @@ -18,6 +18,7 @@ from __future__ import unicode_literals import webnotes from webnotes.utils import cint from setup.utils import get_company_currency +from webnotes import msgprint, _ from controllers.stock_controller import StockController @@ -58,5 +59,10 @@ class SellingController(StockController): self.doc.doctype, self.doc.name, item.name, stock_ledger_entries, item_sales_bom) item.buying_amount = buying_amount > 0 and buying_amount or 0 - webnotes.conn.set_value(self.tname, item.name, "buying_amount", - item.buying_amount) \ No newline at end of file + webnotes.conn.set_value(item.doctype, item.name, "buying_amount", + item.buying_amount) + + def check_expense_account(self, item): + if item.buying_amount and not item.expense_account: + msgprint(_("""Expense account is mandatory for item: """) + item.item_code, + raise_exception=1) \ No newline at end of file diff --git a/controllers/stock_controller.py b/controllers/stock_controller.py index c76865d371..89f62aacf3 100644 --- a/controllers/stock_controller.py +++ b/controllers/stock_controller.py @@ -23,7 +23,9 @@ class StockController(AccountsController): def get_gl_entries_for_stock(self, against_stock_account, amount, stock_in_hand_account=None, cost_center=None): if not stock_in_hand_account: - stock_in_hand_account = self.get_default_account("stock_in_hand_account") + stock_in_hand_account = self.get_company_default("stock_in_hand_account") + if not cost_center: + cost_center = self.get_company_default("stock_adjustment_cost_center") if amount: gl_entries = [ @@ -46,12 +48,6 @@ class StockController(AccountsController): ] return gl_entries - - - def check_expense_account(self, item): - if not item.expense_account: - msgprint(_("""Expense account is mandatory for item: """) + item.item_code, - raise_exception=1) def get_stock_ledger_entries(self, item_list=None, warehouse_list=None): if not (item_list and warehouse_list): diff --git a/selling/doctype/sales_common/sales_common.py b/selling/doctype/sales_common/sales_common.py index 12ae4a8c90..fca96b8fa5 100644 --- a/selling/doctype/sales_common/sales_common.py +++ b/selling/doctype/sales_common/sales_common.py @@ -17,11 +17,11 @@ from __future__ import unicode_literals import webnotes -from webnotes.utils import cint, cstr, flt, getdate, nowdate, formatdate +from webnotes.utils import cint, cstr, flt, getdate, nowdate from webnotes.model.doc import addchild from webnotes.model.bean import getlist from webnotes.model.code import get_obj -from webnotes import msgprint, _ +from webnotes import msgprint from setup.utils import get_company_currency get_value = webnotes.conn.get_value @@ -127,7 +127,7 @@ class DocType(TransactionBase): if not obj.doc.price_list_name: msgprint("Please Select Price List before selecting Items") raise Exception - item = webnotes.conn.sql("select description, item_name, brand, item_group, stock_uom, default_warehouse, default_income_account, default_sales_cost_center, description_html, barcode from `tabItem` where name = '%s' and (ifnull(end_of_life,'')='' or end_of_life > now() or end_of_life = '0000-00-00') and (is_sales_item = 'Yes' or is_service_item = 'Yes')" % (args['item_code']), as_dict=1) + item = webnotes.conn.sql("select description, item_name, brand, item_group, stock_uom, default_warehouse, default_income_account, default_sales_cost_center, purchase_account, cost_center, description_html, barcode from `tabItem` where name = '%s' and (ifnull(end_of_life,'')='' or end_of_life > now() or end_of_life = '0000-00-00') and (is_sales_item = 'Yes' or is_service_item = 'Yes')" % (args['item_code']), as_dict=1) tax = webnotes.conn.sql("select tax_type, tax_rate from `tabItem Tax` where parent = %s" , args['item_code']) t = {} for x in tax: t[x[0]] = flt(x[1]) @@ -141,7 +141,9 @@ class DocType(TransactionBase): 'reserved_warehouse' : item and item[0]['default_warehouse'] or '', 'warehouse' : item and item[0]['default_warehouse'] or args.get('warehouse'), 'income_account' : item and item[0]['default_income_account'] or args.get('income_account'), + 'expense_account' : item and item[0]['purchase_account'] or args.get('expense_account'), 'cost_center' : item and item[0]['default_sales_cost_center'] or args.get('cost_center'), + 'purchase_cost_center' : item and item[0]['cost_center'] or args.get('purchase_cost_center'), 'qty' : 1.00, # this is done coz if item once fetched is fetched again thn its qty shld be reset to 1 'adj_rate' : 0, 'amount' : 0, diff --git a/setup/doctype/company/company.js b/setup/doctype/company/company.js index a89882347e..735f5149cc 100644 --- a/setup/doctype/company/company.js +++ b/setup/doctype/company/company.js @@ -97,4 +97,11 @@ cur_frm.fields_dict["stock_received_but_not_billed"].get_query = function(doc) { "company": doc.name } } +} + +cur_frm.fields_dict["stock_adjustment_cost_center"].get_query = function(doc) { + return { + "query": "accounts.utils.get_cost_center_list", + "filters": {"company": doc.name} + } } \ No newline at end of file diff --git a/setup/doctype/company/company.py b/setup/doctype/company/company.py index 15241a2ba6..a2e56eb331 100644 --- a/setup/doctype/company/company.py +++ b/setup/doctype/company/company.py @@ -199,12 +199,7 @@ class DocType: if not self.doc.payables_group and webnotes.conn.exists('Account', 'Accounts Payable - ' + self.doc.abbr): webnotes.conn.set(self.doc, 'payables_group', 'Accounts Payable - ' + self.doc.abbr) - - if not self.doc.stock_delivered_but_not_billed and webnotes.conn.exists("Account", - "Stock Delivered But Not Billed - " + self.doc.abbr): - webnotes.conn.set(self.doc, "stock_delivered_but_not_billed", - "Stock Delivered But Not Billed - " + self.doc.abbr) - + if not self.doc.stock_received_but_not_billed and webnotes.conn.exists("Account", "Stock Received But Not Billed - " + self.doc.abbr): webnotes.conn.set(self.doc, "stock_received_but_not_billed", @@ -219,7 +214,12 @@ class DocType: "Expenses Included In Valuation - " + self.doc.abbr): webnotes.conn.set(self.doc, "expenses_included_in_valuation", "Expenses Included In Valuation - " + self.doc.abbr) - + + if not self.doc.stock_adjustment_cost_center and webnotes.conn.exists("Cost Center", + "Auto Inventory Accounting - " + self.doc.abbr): + webnotes.conn.set(self.doc, "stock_adjustment_cost_center", + "Auto Inventory Accounting - " + self.doc.abbr) + # Create default cost center # --------------------------------------------------- def create_default_cost_center(self): diff --git a/setup/doctype/company/company.txt b/setup/doctype/company/company.txt index 4d2dcdae68..e9976aa26d 100644 --- a/setup/doctype/company/company.txt +++ b/setup/doctype/company/company.txt @@ -2,7 +2,7 @@ { "creation": "2013-02-27 09:38:05", "docstatus": 0, - "modified": "2013-03-19 12:52:00", + "modified": "2013-03-22 18:19:36", "modified_by": "Administrator", "owner": "Administrator" }, @@ -189,16 +189,10 @@ }, { "doctype": "DocField", - "fieldname": "stock_adjustment_account", + "fieldname": "stock_received_but_not_billed", "fieldtype": "Link", - "label": "Stock Adjustment Account", - "options": "Account" - }, - { - "doctype": "DocField", - "fieldname": "expenses_included_in_valuation", - "fieldtype": "Link", - "label": "Expenses Included In Valuation", + "label": "Stock Received But Not Billed", + "no_copy": 1, "options": "Account" }, { @@ -209,18 +203,28 @@ }, { "doctype": "DocField", - "fieldname": "stock_delivered_but_not_billed", + "fieldname": "stock_adjustment_account", "fieldtype": "Link", - "label": "Stock Delivered But Not Billed", + "label": "Stock Adjustment Account", + "no_copy": 1, "options": "Account" }, { "doctype": "DocField", - "fieldname": "stock_received_but_not_billed", + "fieldname": "expenses_included_in_valuation", "fieldtype": "Link", - "label": "Stock Received But Not Billed", + "label": "Expenses Included In Valuation", + "no_copy": 1, "options": "Account" }, + { + "doctype": "DocField", + "fieldname": "stock_adjustment_cost_center", + "fieldtype": "Link", + "label": "Stock Adjustment Cost Center", + "no_copy": 1, + "options": "Cost Center" + }, { "description": "For reference only.", "doctype": "DocField", diff --git a/setup/doctype/global_defaults/global_defaults.py b/setup/doctype/global_defaults/global_defaults.py index 8d94a03aa5..e755bb9522 100644 --- a/setup/doctype/global_defaults/global_defaults.py +++ b/setup/doctype/global_defaults/global_defaults.py @@ -44,11 +44,20 @@ keydict = { 'session_expiry': 'session_expiry', 'disable_rounded_total': 'disable_rounded_total', "update_stock": "update_stock", + # "auto_inventory_accounting": "auto_inventory_accounting", } class DocType: def __init__(self, d, dl): self.doc, self.doclist = d, dl + + def validate(self): + previous_auto_inventory_accounting = cint(webnotes.conn.get_value("Global Defaults", None, + "auto_inventory_accounting")) + if cint(self.doc.auto_inventory_accounting) != previous_auto_inventory_accounting: + from accounts.utils import create_stock_in_hand_jv + create_stock_in_hand_jv(reverse = \ + cint(self.doc.auto_inventory_accounting) < previous_auto_inventory_accounting) def on_update(self): """update defaults""" diff --git a/stock/doctype/delivery_note_item/delivery_note_item.txt b/stock/doctype/delivery_note_item/delivery_note_item.txt index 94c6541172..ffc19c36e1 100644 --- a/stock/doctype/delivery_note_item/delivery_note_item.txt +++ b/stock/doctype/delivery_note_item/delivery_note_item.txt @@ -2,7 +2,7 @@ { "creation": "2013-03-07 11:42:59", "docstatus": 0, - "modified": "2013-03-21 18:36:22", + "modified": "2013-03-22 18:43:10", "modified_by": "Administrator", "owner": "Administrator" }, @@ -257,10 +257,10 @@ }, { "doctype": "DocField", - "fieldname": "cost_center", + "fieldname": "purchase_cost_center", "fieldtype": "Link", "hidden": 1, - "label": "Cost Center", + "label": "Purchase Cost Center", "no_copy": 1, "options": "Cost Center", "print_hide": 1, diff --git a/stock/doctype/purchase_receipt/purchase_receipt.py b/stock/doctype/purchase_receipt/purchase_receipt.py index 7949a1c1c3..11c294c72d 100644 --- a/stock/doctype/purchase_receipt/purchase_receipt.py +++ b/stock/doctype/purchase_receipt/purchase_receipt.py @@ -320,7 +320,7 @@ class DocType(BuyingController): from accounts.general_ledger import make_gl_entries - against_stock_account = self.get_default_account("stock_received_but_not_billed") + against_stock_account = self.get_company_default("stock_received_but_not_billed") total_valuation_amount = self.get_total_valuation_amount() gl_entries = self.get_gl_entries_for_stock(against_stock_account, total_valuation_amount) diff --git a/stock/doctype/stock_entry/stock_entry.js b/stock/doctype/stock_entry/stock_entry.js index 447f5035ab..dc57ec6340 100644 --- a/stock/doctype/stock_entry/stock_entry.js +++ b/stock/doctype/stock_entry/stock_entry.js @@ -33,9 +33,9 @@ erpnext.stock.StockEntry = erpnext.stock.StockController.extend({ else account_for = "stock_adjustment_account"; this.frm.call({ - method: "controllers.accounts_controller.get_default_account", + method: "accounts.utils.get_company_default", args: { - "account_for": account_for, + "fieldname": account_for, "company": this.frm.doc.company }, callback: function(r) { diff --git a/stock/doctype/stock_entry/stock_entry.py b/stock/doctype/stock_entry/stock_entry.py index f54ce605a0..a4a3f9124a 100644 --- a/stock/doctype/stock_entry/stock_entry.py +++ b/stock/doctype/stock_entry/stock_entry.py @@ -176,11 +176,10 @@ class DocType(StockController): from accounts.general_ledger import make_gl_entries - cost_center = "Auto Inventory Accounting - %s" % (self.company_abbr,) total_valuation_amount = self.get_total_valuation_amount() gl_entries = self.get_gl_entries_for_stock(self.doc.expense_adjustment_account, - total_valuation_amount, cost_center=cost_center) + total_valuation_amount) if gl_entries: make_gl_entries(gl_entries, cancel=self.doc.docstatus == 2) diff --git a/stock/doctype/stock_reconciliation/stock_reconciliation.js b/stock/doctype/stock_reconciliation/stock_reconciliation.js index 372166eaac..e66ae3b2a3 100644 --- a/stock/doctype/stock_reconciliation/stock_reconciliation.js +++ b/stock/doctype/stock_reconciliation/stock_reconciliation.js @@ -27,9 +27,9 @@ erpnext.stock.StockReconciliation = erpnext.stock.StockController.extend({ if (sys_defaults.auto_inventory_accounting && !this.frm.doc.expense_account) { this.frm.call({ - method: "controllers.accounts_controller.get_default_account", + method: "accounts.utils.get_company_default", args: { - "account_for": "stock_adjustment_account", + "fieldname": "stock_adjustment_account", "company": this.frm.doc.company }, callback: function(r) { diff --git a/stock/doctype/stock_reconciliation/stock_reconciliation.py b/stock/doctype/stock_reconciliation/stock_reconciliation.py index ac0ab987f4..13c8ee4880 100644 --- a/stock/doctype/stock_reconciliation/stock_reconciliation.py +++ b/stock/doctype/stock_reconciliation/stock_reconciliation.py @@ -310,11 +310,9 @@ class DocType(StockController): msgprint(_("Please enter Expense Account"), raise_exception=1) from accounts.general_ledger import make_gl_entries - - cost_center = "Auto Inventory Accounting - %s" % (self.company_abbr,) - + gl_entries = self.get_gl_entries_for_stock(self.doc.expense_account, - self.doc.stock_value_difference, cost_center=cost_center) + self.doc.stock_value_difference) if gl_entries: make_gl_entries(gl_entries, cancel=self.doc.docstatus == 2)