From 73d04b155c0822d6895d4b9ffa6b12a4505d3cf9 Mon Sep 17 00:00:00 2001 From: Nabin Hait Date: Mon, 5 Aug 2013 12:19:38 +0530 Subject: [PATCH] [minor] [fix] test cases fix for perpetual accounting --- accounts/doctype/account/test_account.py | 2 + accounts/utils.py | 4 +- controllers/stock_controller.py | 26 +++++--- stock/doctype/delivery_note/delivery_note.py | 24 +++++-- .../purchase_receipt/purchase_receipt.py | 18 +++--- .../purchase_receipt/test_purchase_receipt.py | 62 ++++++++++++++----- stock/doctype/serial_no/test_serial_no.py | 8 +-- stock/doctype/warehouse/test_warehouse.py | 9 ++- stock/utils.py | 4 +- 9 files changed, 108 insertions(+), 49 deletions(-) diff --git a/accounts/doctype/account/test_account.py b/accounts/doctype/account/test_account.py index ad6319c2b5..e979b89b7e 100644 --- a/accounts/doctype/account/test_account.py +++ b/accounts/doctype/account/test_account.py @@ -12,6 +12,7 @@ def make_test_records(verbose): ["_Test Account Shipping Charges", "_Test Account Stock Expenses - _TC", "Ledger"], ["_Test Account Customs Duty", "_Test Account Stock Expenses - _TC", "Ledger"], + ["_Test Account Tax Assets", "Current Assets - _TC", "Group"], ["_Test Account VAT", "_Test Account Tax Assets - _TC", "Ledger"], ["_Test Account Service Tax", "_Test Account Tax Assets - _TC", "Ledger"], @@ -25,6 +26,7 @@ def make_test_records(verbose): # related to Account Inventory Integration ["_Test Account Stock In Hand", "Current Assets - _TC", "Ledger"], + ["_Test Account Fixed Assets", "Current Assets - _TC", "Ledger"], ] test_objects = make_test_objects("Account", [[{ diff --git a/accounts/utils.py b/accounts/utils.py index 690371e4c6..98d825257e 100644 --- a/accounts/utils.py +++ b/accounts/utils.py @@ -371,7 +371,6 @@ def get_stock_and_account_difference(warehouse_list=None): account_warehouse_map = {} warehouse_with_no_account = [] difference = {} - warehouse_account = webnotes.conn.sql("""select name, account from tabWarehouse where name in (%s)""" % ', '.join(['%s']*len(warehouse_list)), warehouse_list, as_dict=1) @@ -387,6 +386,7 @@ def get_stock_and_account_difference(warehouse_list=None): account_balance = get_balance_on(account) stock_value = get_latest_stock_balance(warehouse) - difference.setdefault(account, (account_balance - stock_value)) + if stock_value - account_balance: + difference.setdefault(account, (stock_value - account_balance)) return difference \ No newline at end of file diff --git a/controllers/stock_controller.py b/controllers/stock_controller.py index 03bdc98d92..640a49e186 100644 --- a/controllers/stock_controller.py +++ b/controllers/stock_controller.py @@ -21,18 +21,24 @@ import webnotes.defaults from controllers.accounts_controller import AccountsController 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_company_default("stock_in_hand_account") + def get_gl_entries_for_stock(self, against_stock_account, amount=None, + stock_in_hand_account=None, cost_center=None, warehouse_list=None): if not cost_center: cost_center = self.get_company_default("stock_adjustment_cost_center") - - if amount: - gl_entries = [ + + acc_diff = {} + if warehouse_list: + from accounts.utils import get_stock_and_account_difference + acc_diff = get_stock_and_account_difference(warehouse_list) + elif amount and stock_in_hand_account: + acc_diff = {stock_in_hand_account: amount} + + gl_entries = [] + for account, amount in acc_diff.items(): + gl_entries += [ # stock in hand account self.get_gl_dict({ - "account": stock_in_hand_account, + "account": account, "against": against_stock_account, "debit": amount, "remarks": self.doc.remarks or "Accounting Entry for Stock", @@ -41,14 +47,14 @@ class StockController(AccountsController): # account against stock in hand self.get_gl_dict({ "account": against_stock_account, - "against": stock_in_hand_account, + "against": account, "credit": amount, "cost_center": cost_center or None, "remarks": self.doc.remarks or "Accounting Entry for Stock", }, self.doc.docstatus == 2), ] - return gl_entries + return gl_entries def get_sl_entries(self, d, args): diff --git a/stock/doctype/delivery_note/delivery_note.py b/stock/doctype/delivery_note/delivery_note.py index 49747d24bf..9f119db9f2 100644 --- a/stock/doctype/delivery_note/delivery_note.py +++ b/stock/doctype/delivery_note/delivery_note.py @@ -329,15 +329,31 @@ class DocType(SellingController): get_obj('Sales Common').check_credit(self, total) def make_gl_entries(self): - if not cint(webnotes.defaults.get_global_default("auto_inventory_accounting")): + if not cint(webnotes.defaults.get_global_default("perpetual_accounting")): return - gl_entries = [] + gl_entries = [] + warehouse_item_map = {} for item in self.doclist.get({"parentfield": "delivery_note_details"}): self.check_expense_account(item) - if item.buying_amount: + warehouse_item_map.setdefault(item.warehouse, []) + if item.item_code not in warehouse_item_map[item.warehouse]: + warehouse_item_map[item.warehouse].append(item.item_code) + + + + + if [item.item_code, item.warehouse] not in item_warehouse: + item_warehouse.append([item.item_code, item.warehouse]) + + for + + + + for wh, cc_dict in expense_account_map.items: + for cost_center, warehouse_list in cc_dict.items(): gl_entries += self.get_gl_entries_for_stock(item.expense_account, - -1*item.buying_amount, cost_center=item.cost_center) + cost_center=item.cost_center, warehouse_list=warehouse_list) if gl_entries: from accounts.general_ledger import make_gl_entries diff --git a/stock/doctype/purchase_receipt/purchase_receipt.py b/stock/doctype/purchase_receipt/purchase_receipt.py index 0ae263eca9..bfe01e63a1 100644 --- a/stock/doctype/purchase_receipt/purchase_receipt.py +++ b/stock/doctype/purchase_receipt/purchase_receipt.py @@ -205,14 +205,17 @@ class DocType(BuyingController): if pr_qty: sl_entries.append(self.get_sl_entries(d, { "actual_qty": flt(pr_qty), - "serial_no": cstr(d.serial_no).strip() + "serial_no": cstr(d.serial_no).strip(), + "incoming_rate": d.valuation_rate + })) if flt(d.rejected_qty) > 0: sl_entries.append(self.get_sl_entries(d, { "warehouse": self.doc.rejected_warehouse, "actual_qty": flt(d.rejected_qty) * flt(d.conversion_factor), - "serial_no": cstr(d.rejected_serial_no).strip() + "serial_no": cstr(d.rejected_serial_no).strip(), + "incoming_rate": d.valuation_rate })) self.bk_flush_supp_wh(sl_entries) @@ -312,16 +315,17 @@ class DocType(BuyingController): return get_obj('Purchase Common').get_rate(arg,self) def make_gl_entries(self): - if not cint(webnotes.defaults.get_global_default("auto_inventory_accounting")): + if not cint(webnotes.defaults.get_global_default("perpetual_accounting")): return - from accounts.general_ledger import make_gl_entries - 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) + warehouse_list = [d.warehouse for d in + self.doclist.get({"parentfield": "purchase_receipt_details"})] + + gl_entries = self.get_gl_entries_for_stock(against_stock_account, warehouse_list=warehouse_list) if gl_entries: + from accounts.general_ledger import make_gl_entries make_gl_entries(gl_entries, cancel=(self.doc.docstatus == 2)) def get_total_valuation_amount(self): diff --git a/stock/doctype/purchase_receipt/test_purchase_receipt.py b/stock/doctype/purchase_receipt/test_purchase_receipt.py index b7e27a1773..eb2ae54b8d 100644 --- a/stock/doctype/purchase_receipt/test_purchase_receipt.py +++ b/stock/doctype/purchase_receipt/test_purchase_receipt.py @@ -23,6 +23,8 @@ from webnotes.utils import cint class TestPurchaseReceipt(unittest.TestCase): def test_make_purchase_invoice(self): + webnotes.defaults.set_global_default("perpetual_accounting", 0) + self._clear_stock_account_balance() from stock.doctype.purchase_receipt.purchase_receipt import make_purchase_invoice pr = webnotes.bean(copy=test_records[0]).insert() @@ -42,8 +44,9 @@ class TestPurchaseReceipt(unittest.TestCase): self.assertRaises(webnotes.ValidationError, webnotes.bean(pi).submit) def test_purchase_receipt_no_gl_entry(self): + webnotes.defaults.set_global_default("perpetual_accounting", 0) + self._clear_stock_account_balance() pr = webnotes.bean(copy=test_records[0]) - pr.run_method("calculate_taxes_and_totals") pr.insert() pr.submit() @@ -54,11 +57,12 @@ class TestPurchaseReceipt(unittest.TestCase): self.assertTrue(not gl_entries) def test_purchase_receipt_gl_entry(self): - webnotes.defaults.set_global_default("auto_inventory_accounting", 1) - self.assertEqual(cint(webnotes.defaults.get_global_default("auto_inventory_accounting")), 1) + webnotes.defaults.set_global_default("perpetual_accounting", 1) + self.assertEqual(cint(webnotes.defaults.get_global_default("perpetual_accounting")), 1) + + self._clear_stock_account_balance() pr = webnotes.bean(copy=test_records[0]) - pr.run_method("calculate_taxes_and_totals") pr.insert() pr.submit() @@ -67,20 +71,28 @@ class TestPurchaseReceipt(unittest.TestCase): order by account desc""", pr.doc.name, as_dict=1) self.assertTrue(gl_entries) - stock_in_hand_account = webnotes.conn.get_value("Company", pr.doc.company, - "stock_in_hand_account") + stock_in_hand_account = webnotes.conn.get_value("Warehouse", pr.doclist[1].warehouse, + "account") - expected_values = [ - [stock_in_hand_account, 750.0, 0.0], - ["Stock Received But Not Billed - _TC", 0.0, 750.0] - ] + fixed_asset_account = webnotes.conn.get_value("Warehouse", pr.doclist[2].warehouse, + "account") - 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) + expected_values = { + stock_in_hand_account: [375.0, 0.0], + fixed_asset_account: [375.0, 0.0], + "Stock Received But Not Billed - _TC": [0.0, 750.0] + } + + for gle in gl_entries: + self.assertEquals(expected_values[gle.account][0], gle.debit) + self.assertEquals(expected_values[gle.account][1], gle.credit) - webnotes.defaults.set_global_default("auto_inventory_accounting", 0) + webnotes.defaults.set_global_default("perpetual_accounting", 0) + + def _clear_stock_account_balance(self): + webnotes.conn.sql("delete from `tabStock Ledger Entry`") + webnotes.conn.sql("""delete from `tabBin`""") + webnotes.conn.sql("""delete from `tabGL Entry`""") def test_subcontracting(self): pr = webnotes.bean(copy=test_records[1]) @@ -115,8 +127,8 @@ test_records = [ "item_code": "_Test Item", "item_name": "_Test Item", "parentfield": "purchase_receipt_details", - "received_qty": 10.0, - "qty": 10.0, + "received_qty": 5.0, + "qty": 5.0, "rejected_qty": 0.0, "import_rate": 50.0, "amount": 500.0, @@ -124,6 +136,22 @@ test_records = [ "stock_uom": "Nos", "uom": "_Test UOM", }, + { + "conversion_factor": 1.0, + "description": "_Test Item", + "doctype": "Purchase Receipt Item", + "item_code": "_Test Item", + "item_name": "_Test Item", + "parentfield": "purchase_receipt_details", + "received_qty": 5.0, + "qty": 5.0, + "rejected_qty": 0.0, + "import_rate": 50.0, + "amount": 500.0, + "warehouse": "_Test Warehouse 1 - _TC", + "stock_uom": "Nos", + "uom": "_Test UOM", + }, { "account_head": "_Test Account Shipping Charges - _TC", "add_deduct_tax": "Add", diff --git a/stock/doctype/serial_no/test_serial_no.py b/stock/doctype/serial_no/test_serial_no.py index 58f6226943..db575626dd 100644 --- a/stock/doctype/serial_no/test_serial_no.py +++ b/stock/doctype/serial_no/test_serial_no.py @@ -6,7 +6,7 @@ import webnotes, unittest class TestSerialNo(unittest.TestCase): def test_aii_gl_entries_for_serial_no_in_store(self): - webnotes.defaults.set_global_default("auto_inventory_accounting", 1) + webnotes.defaults.set_global_default("perpetual_accounting", 1) sr = webnotes.bean(copy=test_records[0]) sr.doc.serial_no = "_Test Serial No 1" @@ -64,11 +64,11 @@ class TestSerialNo(unittest.TestCase): self.assertEquals(gl_count[0][0], 4) - webnotes.defaults.set_global_default("auto_inventory_accounting", 0) + webnotes.defaults.set_global_default("perpetual_accounting", 0) def test_aii_gl_entries_for_serial_no_delivered(self): - webnotes.defaults.set_global_default("auto_inventory_accounting", 1) + webnotes.defaults.set_global_default("perpetual_accounting", 1) sr = webnotes.bean(copy=test_records[0]) sr.doc.serial_no = "_Test Serial No 2" @@ -80,7 +80,7 @@ class TestSerialNo(unittest.TestCase): order by account desc""", sr.doc.name, as_dict=1) self.assertFalse(gl_entries) - webnotes.defaults.set_global_default("auto_inventory_accounting", 0) + webnotes.defaults.set_global_default("perpetual_accounting", 0) test_dependencies = ["Item"] test_records = [ diff --git a/stock/doctype/warehouse/test_warehouse.py b/stock/doctype/warehouse/test_warehouse.py index 34cc28cf56..d1b4491f60 100644 --- a/stock/doctype/warehouse/test_warehouse.py +++ b/stock/doctype/warehouse/test_warehouse.py @@ -2,16 +2,19 @@ test_records = [ [{ "doctype": "Warehouse", "warehouse_name": "_Test Warehouse", - "company": "_Test Company" + "company": "_Test Company", + "account": "_Test Account Stock In Hand - _TC" }], [{ "doctype": "Warehouse", "warehouse_name": "_Test Warehouse 1", - "company": "_Test Company" + "company": "_Test Company", + "account": "_Test Account Fixed Assets - _TC" }], [{ "doctype": "Warehouse", "warehouse_name": "_Test Warehouse 2", - "company": "_Test Company 1" + "company": "_Test Company 1", + "account": "_Test Account Stock In Hand - _TC" }] ] diff --git a/stock/utils.py b/stock/utils.py index 0b42e0f103..9ff8314f47 100644 --- a/stock/utils.py +++ b/stock/utils.py @@ -43,9 +43,9 @@ def get_stock_balance_on(warehouse_list, posting_date=None): return sum([sum(item_dict.values()) for item_dict in sle_map.values()]) -def get_latest_stock_balance(warehouse_list): +def get_latest_stock_balance(warehouse, item): return webnotes.conn.sql(""" - SELECT sum(stock_value) + SELECT sum(stock_value) FROM tabBin where warehouse in (%s) """ % ', '.join(['%s']*len(warehouse_list)), warehouse_list)[0][0]