diff --git a/erpnext/__init__.py b/erpnext/__init__.py index 7a4ccd625f..adaae4feff 100644 --- a/erpnext/__init__.py +++ b/erpnext/__init__.py @@ -39,6 +39,9 @@ def get_company_currency(company): def set_perpetual_inventory(enable=1, company=None): if not company: company = get_default_company() + + if frappe.flags.in_test: + company = "_Test Company" company = frappe.get_doc("Company", company) company.enable_perpetual_inventory = enable diff --git a/erpnext/accounts/doctype/purchase_invoice/purchase_invoice.py b/erpnext/accounts/doctype/purchase_invoice/purchase_invoice.py index 8a7bbe7e32..b391127f89 100644 --- a/erpnext/accounts/doctype/purchase_invoice/purchase_invoice.py +++ b/erpnext/accounts/doctype/purchase_invoice/purchase_invoice.py @@ -164,7 +164,7 @@ class PurchaseInvoice(BuyingController): frappe.msgprint(_("Item Code required at Row No {0}").format(d.idx), raise_exception=True) def set_expense_account(self, for_validate=False): - auto_accounting_for_stock = self.get_company_default("enable_perpetual_inventory") + auto_accounting_for_stock = frappe.db.get_value('Company', self.company, 'enable_perpetual_inventory') if auto_accounting_for_stock: stock_not_billed_account = self.get_company_default("stock_received_but_not_billed") @@ -335,9 +335,7 @@ class PurchaseInvoice(BuyingController): delete_gl_entries(voucher_type=self.doctype, voucher_no=self.name) def get_gl_entries(self, warehouse_account=None): - self.auto_accounting_for_stock = \ - cint(self.get_company_default("enable_perpetual_inventory")) - + self.auto_accounting_for_stock = frappe.db.get_value('Company', self.company, 'enable_perpetual_inventory') self.stock_received_but_not_billed = self.get_company_default("stock_received_but_not_billed") self.expenses_included_in_valuation = self.get_company_default("expenses_included_in_valuation") self.negative_expense_to_be_booked = 0.0 diff --git a/erpnext/accounts/doctype/purchase_invoice/test_purchase_invoice.py b/erpnext/accounts/doctype/purchase_invoice/test_purchase_invoice.py index cf0ec57c74..8094e99600 100644 --- a/erpnext/accounts/doctype/purchase_invoice/test_purchase_invoice.py +++ b/erpnext/accounts/doctype/purchase_invoice/test_purchase_invoice.py @@ -25,11 +25,10 @@ class TestPurchaseInvoice(unittest.TestCase): def tearDown(self): unlink_payment_on_cancel_of_invoice(0) - def test_gl_entries_without_auto_accounting_for_stock(self): - set_perpetual_inventory(0) - self.assertTrue(not cint(frappe.defaults.get_global_default("auto_accounting_for_stock"))) - + def test_gl_entries_without_perpetual_inventory(self): wrapper = frappe.copy_doc(test_records[0]) + set_perpetual_inventory(0, wrapper.company) + self.assertTrue(not cint(frappe.db.get_value('Company', wrapper.company, 'enable_perpetual_inventory'))) wrapper.insert() wrapper.submit() wrapper.load_from_db() @@ -51,17 +50,16 @@ class TestPurchaseInvoice(unittest.TestCase): for d in gl_entries: self.assertEqual([d.debit, d.credit], expected_gl_entries.get(d.account)) - def test_gl_entries_with_auto_accounting_for_stock(self): - set_perpetual_inventory(1) - self.assertEqual(cint(frappe.defaults.get_global_default("auto_accounting_for_stock")), 1) - + def test_gl_entries_with_perpetual_inventory(self): pi = frappe.copy_doc(test_records[1]) + set_perpetual_inventory(1, pi.company) + self.assertTrue(cint(frappe.db.get_value('Company', pi.company, 'enable_perpetual_inventory')), 1) pi.insert() pi.submit() self.check_gle_for_pi(pi.name) - set_perpetual_inventory(0) + set_perpetual_inventory(0, pi.company) def test_payment_entry_unlink_against_purchase_invoice(self): from erpnext.accounts.doctype.payment_entry.test_payment_entry import get_payment_entry @@ -84,11 +82,10 @@ class TestPurchaseInvoice(unittest.TestCase): self.assertRaises(frappe.LinkExistsError, pi_doc.cancel) - def test_gl_entries_with_auto_accounting_for_stock_against_pr(self): - set_perpetual_inventory(1) - self.assertEqual(cint(frappe.defaults.get_global_default("auto_accounting_for_stock")), 1) - + def test_gl_entries_with_perpetual_inventory_against_pr(self): pr = frappe.copy_doc(pr_test_records[0]) + set_perpetual_inventory(1, pr.company) + self.assertTrue(cint(frappe.db.get_value('Company', pr.company, 'enable_perpetual_inventory')), 1) pr.submit() pi = frappe.copy_doc(test_records[1]) @@ -99,7 +96,7 @@ class TestPurchaseInvoice(unittest.TestCase): self.check_gle_for_pi(pi.name) - set_perpetual_inventory(0) + set_perpetual_inventory(0, pr.company) def check_gle_for_pi(self, pi): gl_entries = frappe.db.sql("""select account, debit, credit @@ -133,10 +130,9 @@ class TestPurchaseInvoice(unittest.TestCase): self.assertRaises(frappe.CannotChangeConstantError, pi.save) def test_gl_entries_with_aia_for_non_stock_items(self): - set_perpetual_inventory() - self.assertEqual(cint(frappe.defaults.get_global_default("auto_accounting_for_stock")), 1) - pi = frappe.copy_doc(test_records[1]) + set_perpetual_inventory(1, pi.company) + self.assertTrue(cint(frappe.db.get_value('Company', pi.company, 'enable_perpetual_inventory')), 1) pi.get("items")[0].item_code = "_Test Non Stock Item" pi.get("items")[0].expense_account = "_Test Account Cost for Goods Sold - _TC" pi.get("taxes").pop(0) @@ -159,7 +155,7 @@ class TestPurchaseInvoice(unittest.TestCase): self.assertEquals(expected_values[i][0], gle.account) self.assertEquals(expected_values[i][1], gle.debit) self.assertEquals(expected_values[i][2], gle.credit) - set_perpetual_inventory(0) + set_perpetual_inventory(0, pi.company) def test_purchase_invoice_calculation(self): pi = frappe.copy_doc(test_records[0]) diff --git a/erpnext/accounts/doctype/sales_invoice/sales_invoice.py b/erpnext/accounts/doctype/sales_invoice/sales_invoice.py index 20d58b90f8..b7aca8f188 100644 --- a/erpnext/accounts/doctype/sales_invoice/sales_invoice.py +++ b/erpnext/accounts/doctype/sales_invoice/sales_invoice.py @@ -559,7 +559,7 @@ class SalesInvoice(SellingController): throw(_("Delivery Note {0} is not submitted").format(d.delivery_note)) def make_gl_entries(self, gl_entries=None, repost_future_gle=True, from_repost=False): - self.auto_accounting_for_stock = self.get_company_default("enable_perpetual_inventory") + auto_accounting_for_stock = frappe.db.get_value('Company', self.company, 'enable_perpetual_inventory') if not self.grand_total: return @@ -582,11 +582,11 @@ class SalesInvoice(SellingController): self.doctype, self.return_against if cint(self.is_return) else self.name) if repost_future_gle and cint(self.update_stock) \ - and cint(self.auto_accounting_for_stock): + and cint(auto_accounting_for_stock): items, warehouses = self.get_items_and_warehouses() update_gl_entries_after(self.posting_date, self.posting_time, warehouses, items) elif self.docstatus == 2 and cint(self.update_stock) \ - and cint(self.auto_accounting_for_stock): + and cint(auto_accounting_for_stock): from erpnext.accounts.general_ledger import delete_gl_entries delete_gl_entries(voucher_type=self.doctype, voucher_no=self.name) @@ -674,8 +674,8 @@ class SalesInvoice(SellingController): ) # expense account gl entries - if cint(self.auto_accounting_for_stock) \ - and cint(self.update_stock): + if cint(self.update_stock) and \ + frappe.db.get_value('Company', self.company, 'enable_perpetual_inventory'): gl_entries += super(SalesInvoice, self).get_gl_entries() def make_pos_gl_entries(self, gl_entries): diff --git a/erpnext/accounts/doctype/sales_invoice/test_sales_invoice.py b/erpnext/accounts/doctype/sales_invoice/test_sales_invoice.py index cb05ac88e4..2e044cc981 100644 --- a/erpnext/accounts/doctype/sales_invoice/test_sales_invoice.py +++ b/erpnext/accounts/doctype/sales_invoice/test_sales_invoice.py @@ -488,8 +488,8 @@ class TestSalesInvoice(unittest.TestCase): self.assertEquals(frappe.db.get_value("Sales Invoice", w.name, "outstanding_amount"), 561.8) def test_sales_invoice_gl_entry_without_perpetual_inventory(self): - set_perpetual_inventory(0) si = frappe.copy_doc(test_records[1]) + set_perpetual_inventory(0, si.company) si.insert() si.submit() @@ -617,6 +617,7 @@ class TestSalesInvoice(unittest.TestCase): self.assertEquals(expected_gl_entries[i][2], gle.credit) si.cancel() + frappe.delete_doc('Sales Invoice', si.name) gle = frappe.db.sql("""select * from `tabGL Entry` where voucher_type='Sales Invoice' and voucher_no=%s""", si.name) diff --git a/erpnext/controllers/stock_controller.py b/erpnext/controllers/stock_controller.py index f8df04d680..b3c2f8c10a 100644 --- a/erpnext/controllers/stock_controller.py +++ b/erpnext/controllers/stock_controller.py @@ -21,7 +21,7 @@ class StockController(AccountsController): if self.docstatus == 2: delete_gl_entries(voucher_type=self.doctype, voucher_no=self.name) - if cint(self.get_company_default("enable_perpetual_inventory")): + if cint(frappe.db.get_value('Company', self.company, 'enable_perpetual_inventory')): warehouse_account = get_warehouse_account_map() if self.docstatus==1: diff --git a/erpnext/stock/doctype/delivery_note/test_delivery_note.py b/erpnext/stock/doctype/delivery_note/test_delivery_note.py index 0f3099fb1b..751d5274b4 100644 --- a/erpnext/stock/doctype/delivery_note/test_delivery_note.py +++ b/erpnext/stock/doctype/delivery_note/test_delivery_note.py @@ -47,9 +47,8 @@ class TestDeliveryNote(unittest.TestCase): self.assertRaises(frappe.ValidationError, frappe.get_doc(si).insert) def test_delivery_note_no_gl_entry(self): - set_perpetual_inventory(0) - self.assertEqual(cint(frappe.defaults.get_global_default("auto_accounting_for_stock")), 0) - + company = frappe.db.get_value('Warehouse', '_Test Warehouse - _TC', 'company') + set_perpetual_inventory(0, company) make_stock_entry(target="_Test Warehouse - _TC", qty=5, basic_rate=100) stock_queue = json.loads(get_previous_sle({ @@ -68,8 +67,9 @@ class TestDeliveryNote(unittest.TestCase): self.assertFalse(get_gl_entries("Delivery Note", dn.name)) def test_delivery_note_gl_entry(self): - set_perpetual_inventory() - self.assertEqual(cint(frappe.defaults.get_global_default("auto_accounting_for_stock")), 1) + company = frappe.db.get_value('Warehouse', '_Test Warehouse - _TC', 'company') + set_perpetual_inventory(1, company) + set_valuation_method("_Test Item", "FIFO") make_stock_entry(target="_Test Warehouse - _TC", qty=5, basic_rate=100) @@ -115,10 +115,11 @@ class TestDeliveryNote(unittest.TestCase): dn.cancel() self.assertFalse(get_gl_entries("Delivery Note", dn.name)) - set_perpetual_inventory(0) + set_perpetual_inventory(0, company) def test_delivery_note_gl_entry_packing_item(self): - set_perpetual_inventory() + company = frappe.db.get_value('Warehouse', '_Test Warehouse - _TC', 'company') + set_perpetual_inventory(1, company) make_stock_entry(item_code="_Test Item", target="_Test Warehouse - _TC", qty=10, basic_rate=100) make_stock_entry(item_code="_Test Item Home Desktop 100", @@ -156,7 +157,7 @@ class TestDeliveryNote(unittest.TestCase): dn.cancel() self.assertFalse(get_gl_entries("Delivery Note", dn.name)) - set_perpetual_inventory(0) + set_perpetual_inventory(0, company) def test_serialized(self): se = make_serialized_item() @@ -196,7 +197,8 @@ class TestDeliveryNote(unittest.TestCase): self.assertEquals(cstr(serial_no.get(field)), value) def test_sales_return_for_non_bundled_items(self): - set_perpetual_inventory() + company = frappe.db.get_value('Warehouse', '_Test Warehouse - _TC', 'company') + set_perpetual_inventory(1, company) make_stock_entry(item_code="_Test Item", target="_Test Warehouse - _TC", qty=50, basic_rate=100) @@ -230,10 +232,11 @@ class TestDeliveryNote(unittest.TestCase): self.assertEquals(gle_warehouse_amount, stock_value_difference) - set_perpetual_inventory(0) + set_perpetual_inventory(0, company) def test_return_single_item_from_bundled_items(self): - set_perpetual_inventory() + company = frappe.db.get_value('Warehouse', '_Test Warehouse - _TC', 'company') + set_perpetual_inventory(1, company) create_stock_reconciliation(item_code="_Test Item", target="_Test Warehouse - _TC", qty=50, rate=100) create_stock_reconciliation(item_code="_Test Item Home Desktop 100", target="_Test Warehouse - _TC", @@ -270,10 +273,11 @@ class TestDeliveryNote(unittest.TestCase): self.assertEquals(gle_warehouse_amount, stock_value_difference) - set_perpetual_inventory(0) + set_perpetual_inventory(0, company) def test_return_entire_bundled_items(self): - set_perpetual_inventory() + company = frappe.db.get_value('Warehouse', '_Test Warehouse - _TC', 'company') + set_perpetual_inventory(1, company) create_stock_reconciliation(item_code="_Test Item", target="_Test Warehouse - _TC", qty=50, rate=100) @@ -312,7 +316,7 @@ class TestDeliveryNote(unittest.TestCase): self.assertEquals(gle_warehouse_amount, 1400) - set_perpetual_inventory(0) + set_perpetual_inventory(0, company) def test_return_for_serialized_items(self): se = make_serialized_item() @@ -350,7 +354,8 @@ class TestDeliveryNote(unittest.TestCase): }) def test_delivery_of_bundled_items_to_target_warehouse(self): - set_perpetual_inventory() + company = frappe.db.get_value('Warehouse', '_Test Warehouse - _TC', 'company') + set_perpetual_inventory(1, company) set_valuation_method("_Test Item", "FIFO") set_valuation_method("_Test Item Home Desktop 100", "FIFO") @@ -418,7 +423,7 @@ class TestDeliveryNote(unittest.TestCase): for i, gle in enumerate(gl_entries): self.assertEquals([gle.debit, gle.credit], expected_values.get(gle.account)) - set_perpetual_inventory(0) + set_perpetual_inventory(0, company) def test_closed_delivery_note(self): from erpnext.stock.doctype.delivery_note.delivery_note import update_delivery_note_status diff --git a/erpnext/stock/doctype/material_request/test_material_request.py b/erpnext/stock/doctype/material_request/test_material_request.py index c3a2137412..1531f4096e 100644 --- a/erpnext/stock/doctype/material_request/test_material_request.py +++ b/erpnext/stock/doctype/material_request/test_material_request.py @@ -5,13 +5,13 @@ # For license information, please see license.txt from __future__ import unicode_literals -import frappe, unittest +import frappe, unittest, erpnext from frappe.utils import flt from erpnext.stock.doctype.material_request.material_request import raise_production_orders class TestMaterialRequest(unittest.TestCase): def setUp(self): - frappe.defaults.set_global_default("auto_accounting_for_stock", 0) + erpnext.set_perpetual_inventory(0) def test_make_purchase_order(self): from erpnext.stock.doctype.material_request.material_request import make_purchase_order diff --git a/erpnext/stock/doctype/purchase_receipt/test_purchase_receipt.py b/erpnext/stock/doctype/purchase_receipt/test_purchase_receipt.py index 4ea0add97d..fe157e087d 100644 --- a/erpnext/stock/doctype/purchase_receipt/test_purchase_receipt.py +++ b/erpnext/stock/doctype/purchase_receipt/test_purchase_receipt.py @@ -30,7 +30,8 @@ class TestPurchaseReceipt(unittest.TestCase): self.assertRaises(frappe.ValidationError, frappe.get_doc(pi).submit) def test_purchase_receipt_no_gl_entry(self): - set_perpetual_inventory(0) + company = frappe.db.get_value('Warehouse', '_Test Warehouse - _TC', 'company') + set_perpetual_inventory(0, company) existing_bin_stock_value = frappe.db.get_value("Bin", {"item_code": "_Test Item", "warehouse": "_Test Warehouse - _TC"}, "stock_value") @@ -50,9 +51,9 @@ class TestPurchaseReceipt(unittest.TestCase): self.assertFalse(get_gl_entries("Purchase Receipt", pr.name)) def test_purchase_receipt_gl_entry(self): - set_perpetual_inventory() - self.assertEqual(cint(frappe.defaults.get_global_default("auto_accounting_for_stock")), 1) pr = frappe.copy_doc(test_records[0]) + set_perpetual_inventory(1, pr.company) + self.assertEqual(cint(frappe.db.get_value("Company", pr.company, 'enable_perpetual_inventory')), 1) pr.insert() pr.submit() @@ -84,7 +85,7 @@ class TestPurchaseReceipt(unittest.TestCase): pr.cancel() self.assertFalse(get_gl_entries("Purchase Receipt", pr.name)) - set_perpetual_inventory(0) + set_perpetual_inventory(0, pr.company) def test_subcontracting(self): from erpnext.stock.doctype.stock_entry.test_stock_entry import make_stock_entry diff --git a/erpnext/stock/doctype/stock_entry/test_stock_entry.py b/erpnext/stock/doctype/stock_entry/test_stock_entry.py index 2451a9b2c9..8670f73225 100644 --- a/erpnext/stock/doctype/stock_entry/test_stock_entry.py +++ b/erpnext/stock/doctype/stock_entry/test_stock_entry.py @@ -123,7 +123,8 @@ class TestStockEntry(unittest.TestCase): self.assertTrue(item_code in items) def test_material_receipt_gl_entry(self): - set_perpetual_inventory() + company = frappe.db.get_value('Warehouse', '_Test Warehouse - _TC', 'company') + set_perpetual_inventory(1, company) mr = make_stock_entry(item_code="_Test Item", target="_Test Warehouse - _TC", qty=50, basic_rate=100, expense_account="Stock Adjustment - _TC") @@ -148,7 +149,8 @@ class TestStockEntry(unittest.TestCase): where voucher_type='Stock Entry' and voucher_no=%s""", mr.name)) def test_material_issue_gl_entry(self): - set_perpetual_inventory() + company = frappe.db.get_value('Warehouse', '_Test Warehouse - _TC', 'company') + set_perpetual_inventory(1, company) make_stock_entry(item_code="_Test Item", target="_Test Warehouse - _TC", qty=50, basic_rate=100, expense_account="Stock Adjustment - _TC") @@ -179,7 +181,8 @@ class TestStockEntry(unittest.TestCase): where voucher_type='Stock Entry' and voucher_no=%s""", mi.name)) def test_material_transfer_gl_entry(self): - set_perpetual_inventory() + company = frappe.db.get_value('Warehouse', '_Test Warehouse - _TC', 'company') + set_perpetual_inventory(1, company) create_stock_reconciliation(qty=100, rate=100) @@ -217,7 +220,8 @@ class TestStockEntry(unittest.TestCase): where voucher_type='Stock Entry' and voucher_no=%s""", mtn.name)) def test_repack_no_change_in_valuation(self): - set_perpetual_inventory(0) + company = frappe.db.get_value('Warehouse', '_Test Warehouse - _TC', 'company') + set_perpetual_inventory(0, company) make_stock_entry(item_code="_Test Item", target="_Test Warehouse - _TC", qty=50, basic_rate=100) make_stock_entry(item_code="_Test Item Home Desktop 100", target="_Test Warehouse - _TC", @@ -238,10 +242,11 @@ class TestStockEntry(unittest.TestCase): order by account desc""", repack.name, as_dict=1) self.assertFalse(gl_entries) - set_perpetual_inventory(0) + set_perpetual_inventory(0, repack.company) def test_repack_with_additional_costs(self): - set_perpetual_inventory() + company = frappe.db.get_value('Warehouse', '_Test Warehouse - _TC', 'company') + set_perpetual_inventory(1, company) make_stock_entry(item_code="_Test Item", target="_Test Warehouse - _TC", qty=50, basic_rate=100) repack = frappe.copy_doc(test_records[3]) @@ -278,7 +283,7 @@ class TestStockEntry(unittest.TestCase): ["Expenses Included In Valuation - _TC", 0.0, 1200.0] ]) ) - set_perpetual_inventory(0) + set_perpetual_inventory(0, repack.company) def check_stock_ledger_entries(self, voucher_type, voucher_no, expected_sle): expected_sle.sort(key=lambda x: x[0]) @@ -452,7 +457,8 @@ class TestStockEntry(unittest.TestCase): self.assertFalse(frappe.db.get_value("Serial No", serial_no, "warehouse")) def test_warehouse_company_validation(self): - set_perpetual_inventory(0) + company = frappe.db.get_value('Warehouse', '_Test Warehouse 2 - _TC1', 'company') + set_perpetual_inventory(0, company) frappe.get_doc("User", "test2@example.com")\ .add_roles("Sales User", "Sales Manager", "Stock User", "Stock Manager") frappe.set_user("test2@example.com") @@ -465,8 +471,6 @@ class TestStockEntry(unittest.TestCase): # permission tests def test_warehouse_user(self): - set_perpetual_inventory(0) - for role in ("Stock User", "Sales User"): set_user_permission_doctypes(doctype="Stock Entry", role=role, apply_user_permissions=1, user_permission_doctypes=["Warehouse"]) @@ -483,6 +487,7 @@ class TestStockEntry(unittest.TestCase): frappe.set_user("test@example.com") st1 = frappe.copy_doc(test_records[0]) st1.company = "_Test Company 1" + set_perpetual_inventory(0, st1.company) st1.get("items")[0].t_warehouse="_Test Warehouse 2 - _TC1" self.assertRaises(frappe.PermissionError, st1.insert) @@ -490,6 +495,8 @@ class TestStockEntry(unittest.TestCase): st1 = frappe.copy_doc(test_records[0]) st1.company = "_Test Company 1" st1.get("items")[0].t_warehouse="_Test Warehouse 2 - _TC1" + st1.get("items")[0].expense_account = "Stock Adjustment - _TC1" + st1.get("items")[0].cost_center = "Main - _TC1" st1.insert() st1.submit()