From 233bf5dd294382ce6d5a5cdd7ad02aafe921a584 Mon Sep 17 00:00:00 2001 From: "mergify[bot]" <37929162+mergify[bot]@users.noreply.github.com> Date: Tue, 5 Oct 2021 16:16:21 +0530 Subject: [PATCH] fix: using DN for transfer w/o internal customer (backport #27798) (backport #27805) (#27807) * fix: using DN for transfer w/o internal customer (backport #27798) (#27805) * fix: using DN for transfer w/o internal customer (#27798) This used to be work before though not "advertised", since a lot of users have started using it as feature, it can't be broken now. (cherry picked from commit df1f8fddf6e2f4106c1a2778614ba9a1dc5ff67e) * fix(ux): use toast instead of popup Co-authored-by: Ankush Menat (cherry picked from commit fa944382c53bdeeb92f2dcc876e2c11ed03e20cc) # Conflicts: # erpnext/accounts/doctype/sales_invoice/test_sales_invoice.py * fix: resolve conflict * fix: resolve conflicts Co-authored-by: mergify[bot] <37929162+mergify[bot]@users.noreply.github.com> Co-authored-by: Ankush Menat --- .../doctype/sales_invoice/test_sales_invoice.py | 12 ++++-------- erpnext/controllers/selling_controller.py | 8 +++++++- erpnext/stock/doctype/delivery_note/delivery_note.py | 1 - .../delivery_note_item/delivery_note_item.json | 6 +++--- 4 files changed, 14 insertions(+), 13 deletions(-) diff --git a/erpnext/accounts/doctype/sales_invoice/test_sales_invoice.py b/erpnext/accounts/doctype/sales_invoice/test_sales_invoice.py index 8a2e9450e9..f492a03daf 100644 --- a/erpnext/accounts/doctype/sales_invoice/test_sales_invoice.py +++ b/erpnext/accounts/doctype/sales_invoice/test_sales_invoice.py @@ -2023,11 +2023,7 @@ class TestSalesInvoice(unittest.TestCase): frappe.local.enable_perpetual_inventory['_Test Company 1'] = old_perpetual_inventory frappe.db.set_value("Stock Settings", None, "allow_negative_stock", old_negative_stock) - def test_sle_if_target_warehouse_exists_accidentally(self): - """ - Check if inward entry exists if Target Warehouse accidentally exists - but Customer is not an internal customer. - """ + def test_sle_for_target_warehouse(self): se = make_stock_entry( item_code="138-CMS Shoe", target="Finished Goods - _TC", @@ -2048,9 +2044,9 @@ class TestSalesInvoice(unittest.TestCase): sles = frappe.get_all("Stock Ledger Entry", filters={"voucher_no": si.name}, fields=["name", "actual_qty"]) - # check if only one SLE for outward entry is created - self.assertEqual(len(sles), 1) - self.assertEqual(sles[0].actual_qty, -1) + # check if both SLEs are created + self.assertEqual(len(sles), 2) + self.assertEqual(sum(d.actual_qty for d in sles), 0.0) # tear down si.cancel() diff --git a/erpnext/controllers/selling_controller.py b/erpnext/controllers/selling_controller.py index 0158a1120f..bb269f3db2 100644 --- a/erpnext/controllers/selling_controller.py +++ b/erpnext/controllers/selling_controller.py @@ -424,7 +424,7 @@ class SellingController(StockController): or (cint(self.is_return) and self.docstatus==2)): sl_entries.append(self.get_sle_for_source_warehouse(d)) - if d.target_warehouse and self.get("is_internal_customer"): + if d.target_warehouse: sl_entries.append(self.get_sle_for_target_warehouse(d)) if d.warehouse and ((not cint(self.is_return) and self.docstatus==2) @@ -559,6 +559,12 @@ class SellingController(StockController): frappe.throw(_("Row {0}: Delivery Warehouse ({1}) and Customer Warehouse ({2}) can not be same") .format(d.idx, warehouse, warehouse)) + if not self.get("is_internal_customer") and any(d.get("target_warehouse") for d in items): + msg = _("Target Warehouse is set for some items but the customer is not an internal customer.") + msg += " " + _("This {} will be treated as material transfer.").format(_(self.doctype)) + frappe.msgprint(msg, title="Internal Transfer", alert=True) + + def validate_items(self): # validate items to see if they have is_sales_item enabled from erpnext.controllers.buying_controller import validate_item_type diff --git a/erpnext/stock/doctype/delivery_note/delivery_note.py b/erpnext/stock/doctype/delivery_note/delivery_note.py index 5542cd00d4..f75b52cec8 100644 --- a/erpnext/stock/doctype/delivery_note/delivery_note.py +++ b/erpnext/stock/doctype/delivery_note/delivery_note.py @@ -185,7 +185,6 @@ class DeliveryNote(SellingController): if not d['warehouse'] and frappe.db.get_value("Item", d['item_code'], "is_stock_item") == 1: frappe.throw(_("Warehouse required for stock Item {0}").format(d["item_code"])) - def update_current_stock(self): if self.get("_action") and self._action != "update_after_submit": for d in self.get('items'): diff --git a/erpnext/stock/doctype/delivery_note_item/delivery_note_item.json b/erpnext/stock/doctype/delivery_note_item/delivery_note_item.json index b05090a237..a96c29925e 100644 --- a/erpnext/stock/doctype/delivery_note_item/delivery_note_item.json +++ b/erpnext/stock/doctype/delivery_note_item/delivery_note_item.json @@ -468,7 +468,7 @@ "width": "100px" }, { - "depends_on": "eval:parent.is_internal_customer", + "depends_on": "eval:parent.is_internal_customer || doc.target_warehouse", "fieldname": "target_warehouse", "fieldtype": "Link", "hidden": 1, @@ -759,7 +759,7 @@ "index_web_pages_for_search": 1, "istable": 1, "links": [], - "modified": "2021-02-23 01:04:08.588104", + "modified": "2021-10-05 12:12:44.018872", "modified_by": "Administrator", "module": "Stock", "name": "Delivery Note Item", @@ -767,4 +767,4 @@ "permissions": [], "sort_field": "modified", "sort_order": "DESC" -} \ No newline at end of file +}