From 00cb0d029464a713fdc1046c7be1c3c05a745cab Mon Sep 17 00:00:00 2001 From: Saqib Ansari Date: Tue, 29 Mar 2022 10:47:27 +0530 Subject: [PATCH 1/6] fix(asset): do not validate warehouse on asset purchase (cherry picked from commit 136466d255651ba29be16248e822c2a374114c67) # Conflicts: # erpnext/accounts/doctype/purchase_invoice/purchase_invoice.py --- .../accounts/doctype/purchase_invoice/purchase_invoice.py | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/erpnext/accounts/doctype/purchase_invoice/purchase_invoice.py b/erpnext/accounts/doctype/purchase_invoice/purchase_invoice.py index 49a01dcaa19..a026445831d 100644 --- a/erpnext/accounts/doctype/purchase_invoice/purchase_invoice.py +++ b/erpnext/accounts/doctype/purchase_invoice/purchase_invoice.py @@ -245,6 +245,7 @@ class PurchaseInvoice(BuyingController): def validate_warehouse(self, for_validate=True): if self.update_stock and for_validate: +<<<<<<< HEAD for d in self.get("items"): if not d.warehouse: frappe.throw( @@ -252,6 +253,12 @@ class PurchaseInvoice(BuyingController): "Warehouse required at Row No {0}, please set default warehouse for the item {1} for the company {2}" ).format(d.idx, d.item_code, self.company) ) +======= + for d in self.get('items'): + if not d.warehouse and not d.is_fixed_asset: + frappe.throw(_("Row No {0}: Warehouse is required. Please set a Default Warehouse for Item {1} and Company {2}"). + format(d.idx, d.item_code, self.company), exc=WarehouseMissingError) +>>>>>>> 136466d255 (fix(asset): do not validate warehouse on asset purchase) super(PurchaseInvoice, self).validate_warehouse() From ad91d57a419a1c0d7fd8b85e12aaf32e6725439a Mon Sep 17 00:00:00 2001 From: Saqib Ansari Date: Tue, 29 Mar 2022 18:43:33 +0530 Subject: [PATCH 2/6] perf: skip warehouse validation for non-stock items (cherry picked from commit 6528218ac31001e04e6b5ebfa0f3d429e296742f) # Conflicts: # erpnext/accounts/doctype/purchase_invoice/purchase_invoice.py --- .../accounts/doctype/purchase_invoice/purchase_invoice.py | 6 ++++++ erpnext/controllers/accounts_controller.py | 4 ++++ 2 files changed, 10 insertions(+) diff --git a/erpnext/accounts/doctype/purchase_invoice/purchase_invoice.py b/erpnext/accounts/doctype/purchase_invoice/purchase_invoice.py index a026445831d..716bda0d33e 100644 --- a/erpnext/accounts/doctype/purchase_invoice/purchase_invoice.py +++ b/erpnext/accounts/doctype/purchase_invoice/purchase_invoice.py @@ -245,9 +245,15 @@ class PurchaseInvoice(BuyingController): def validate_warehouse(self, for_validate=True): if self.update_stock and for_validate: +<<<<<<< HEAD <<<<<<< HEAD for d in self.get("items"): if not d.warehouse: +======= + stock_items = self.get_stock_items() + for d in self.get("items"): + if not d.warehouse and d.item_code in stock_items: +>>>>>>> 6528218ac3 (perf: skip warehouse validation for non-stock items) frappe.throw( _( "Warehouse required at Row No {0}, please set default warehouse for the item {1} for the company {2}" diff --git a/erpnext/controllers/accounts_controller.py b/erpnext/controllers/accounts_controller.py index f0143962874..964d8fb06fe 100644 --- a/erpnext/controllers/accounts_controller.py +++ b/erpnext/controllers/accounts_controller.py @@ -1265,6 +1265,9 @@ class AccountsController(TransactionBase): return get_company_default(self.company, fieldname, ignore_validation=ignore_validation) def get_stock_items(self): + if hasattr(self, "_stock_items") and self._stock_items: + return self._stock_items + stock_items = [] item_codes = list(set(item.item_code for item in self.get("items"))) if item_codes: @@ -1280,6 +1283,7 @@ class AccountsController(TransactionBase): ) ] + self._stock_items = stock_items return stock_items def set_total_advance_paid(self): From c36b5d9ab835793ccc5b084406024d45b3e0022a Mon Sep 17 00:00:00 2001 From: Saqib Ansari Date: Thu, 31 Mar 2022 11:41:52 +0530 Subject: [PATCH 3/6] perf: skip warehouse validation for non-stock items (cherry picked from commit 199a6da960c0419a16db59e7c93b2d23405efdc4) # Conflicts: # erpnext/controllers/accounts_controller.py --- erpnext/controllers/accounts_controller.py | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) diff --git a/erpnext/controllers/accounts_controller.py b/erpnext/controllers/accounts_controller.py index 964d8fb06fe..f06ced36373 100644 --- a/erpnext/controllers/accounts_controller.py +++ b/erpnext/controllers/accounts_controller.py @@ -1265,12 +1265,10 @@ class AccountsController(TransactionBase): return get_company_default(self.company, fieldname, ignore_validation=ignore_validation) def get_stock_items(self): - if hasattr(self, "_stock_items") and self._stock_items: - return self._stock_items - stock_items = [] item_codes = list(set(item.item_code for item in self.get("items"))) if item_codes: +<<<<<<< HEAD stock_items = [ r[0] for r in frappe.db.sql( @@ -1282,8 +1280,12 @@ class AccountsController(TransactionBase): item_codes, ) ] +======= + stock_items = frappe.db.get_values( + "Item", {"name": ["in", item_codes], "is_stock_item": 1}, pluck="name", cache=True + ) +>>>>>>> 199a6da960 (perf: skip warehouse validation for non-stock items) - self._stock_items = stock_items return stock_items def set_total_advance_paid(self): From b4a10d571f50e3f9e64d2011f148c4868161a82e Mon Sep 17 00:00:00 2001 From: Saqib Ansari Date: Thu, 31 Mar 2022 12:48:00 +0530 Subject: [PATCH 4/6] fix(test): Item MacBook does not exist (cherry picked from commit 4623a1bc5777f8bb16a147eae52b9f8e695612af) --- erpnext/assets/doctype/asset/test_asset.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/erpnext/assets/doctype/asset/test_asset.py b/erpnext/assets/doctype/asset/test_asset.py index fcb2ad2277b..79455bb1b4e 100644 --- a/erpnext/assets/doctype/asset/test_asset.py +++ b/erpnext/assets/doctype/asset/test_asset.py @@ -68,7 +68,7 @@ class TestAsset(AssetSetup): def test_item_exists(self): asset = create_asset(item_code="MacBook", do_not_save=1) - self.assertRaises(frappe.DoesNotExistError, asset.save) + self.assertRaises(frappe.ValidationError, asset.save) def test_validate_item(self): asset = create_asset(item_code="MacBook Pro", do_not_save=1) From a51b32b7e013ca6e1bbb5f31c956f07c11111c89 Mon Sep 17 00:00:00 2001 From: Saqib Ansari Date: Thu, 31 Mar 2022 14:19:53 +0530 Subject: [PATCH 5/6] fix: merge conflicts --- .../doctype/purchase_invoice/purchase_invoice.py | 12 ------------ erpnext/controllers/accounts_controller.py | 14 -------------- 2 files changed, 26 deletions(-) diff --git a/erpnext/accounts/doctype/purchase_invoice/purchase_invoice.py b/erpnext/accounts/doctype/purchase_invoice/purchase_invoice.py index 716bda0d33e..8500d57f44b 100644 --- a/erpnext/accounts/doctype/purchase_invoice/purchase_invoice.py +++ b/erpnext/accounts/doctype/purchase_invoice/purchase_invoice.py @@ -245,26 +245,14 @@ class PurchaseInvoice(BuyingController): def validate_warehouse(self, for_validate=True): if self.update_stock and for_validate: -<<<<<<< HEAD -<<<<<<< HEAD - for d in self.get("items"): - if not d.warehouse: -======= stock_items = self.get_stock_items() for d in self.get("items"): if not d.warehouse and d.item_code in stock_items: ->>>>>>> 6528218ac3 (perf: skip warehouse validation for non-stock items) frappe.throw( _( "Warehouse required at Row No {0}, please set default warehouse for the item {1} for the company {2}" ).format(d.idx, d.item_code, self.company) ) -======= - for d in self.get('items'): - if not d.warehouse and not d.is_fixed_asset: - frappe.throw(_("Row No {0}: Warehouse is required. Please set a Default Warehouse for Item {1} and Company {2}"). - format(d.idx, d.item_code, self.company), exc=WarehouseMissingError) ->>>>>>> 136466d255 (fix(asset): do not validate warehouse on asset purchase) super(PurchaseInvoice, self).validate_warehouse() diff --git a/erpnext/controllers/accounts_controller.py b/erpnext/controllers/accounts_controller.py index f06ced36373..61db921f9cc 100644 --- a/erpnext/controllers/accounts_controller.py +++ b/erpnext/controllers/accounts_controller.py @@ -1268,23 +1268,9 @@ class AccountsController(TransactionBase): stock_items = [] item_codes = list(set(item.item_code for item in self.get("items"))) if item_codes: -<<<<<<< HEAD - stock_items = [ - r[0] - for r in frappe.db.sql( - """ - select name from `tabItem` - where name in (%s) and is_stock_item=1 - """ - % (", ".join((["%s"] * len(item_codes))),), - item_codes, - ) - ] -======= stock_items = frappe.db.get_values( "Item", {"name": ["in", item_codes], "is_stock_item": 1}, pluck="name", cache=True ) ->>>>>>> 199a6da960 (perf: skip warehouse validation for non-stock items) return stock_items From 8416dc713c5197f71ea5deae2794bee1e10dfe0b Mon Sep 17 00:00:00 2001 From: Saqib Ansari Date: Thu, 31 Mar 2022 14:36:26 +0530 Subject: [PATCH 6/6] fix: unexpected keyword argument 'pluck' --- erpnext/controllers/accounts_controller.py | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/erpnext/controllers/accounts_controller.py b/erpnext/controllers/accounts_controller.py index 61db921f9cc..0dbff48f02a 100644 --- a/erpnext/controllers/accounts_controller.py +++ b/erpnext/controllers/accounts_controller.py @@ -1269,8 +1269,10 @@ class AccountsController(TransactionBase): item_codes = list(set(item.item_code for item in self.get("items"))) if item_codes: stock_items = frappe.db.get_values( - "Item", {"name": ["in", item_codes], "is_stock_item": 1}, pluck="name", cache=True + "Item", {"name": ["in", item_codes], "is_stock_item": 1}, as_dict=True, cache=True ) + if stock_items: + stock_items = [d.get("name") for d in stock_items] return stock_items