fix: patch and validation message to fix target warehouse issue (#21371)

This commit is contained in:
rohitwaghchaure 2020-04-23 09:46:29 +05:30 committed by GitHub
parent e8a651bc00
commit 6fa6caf46c
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
3 changed files with 81 additions and 0 deletions

View File

@ -46,6 +46,7 @@ class SellingController(StockController):
set_default_income_account_for_item(self)
self.set_customer_address()
self.validate_for_duplicate_items()
self.validate_target_warehouse()
def set_missing_values(self, for_validate=False):
@ -403,6 +404,14 @@ class SellingController(StockController):
else:
chk_dupl_itm.append(f)
def validate_target_warehouse(self):
items = self.get("items") + (self.get("packed_items") or [])
for d in items:
if d.get("target_warehouse") and d.get("warehouse") == d.get("target_warehouse"):
warehouse = frappe.bold(d.get("target_warehouse"))
frappe.throw(_("Row {0}: Delivery Warehouse ({1}) and Customer Warehouse ({2}) can not be same")
.format(d.idx, warehouse, warehouse))
def validate_items(self):
# validate items to see if they have is_sales_item enabled

View File

@ -667,3 +667,4 @@ erpnext.patches.v12_0.update_healthcare_refactored_changes
erpnext.patches.v12_0.set_total_batch_quantity
erpnext.patches.v12_0.rename_mws_settings_fields
erpnext.patches.v12_0.set_updated_purpose_in_pick_list
erpnext.patches.v12_0.repost_stock_ledger_entries_for_target_warehouse

View File

@ -0,0 +1,71 @@
# Copyright (c) 2020, Frappe and Contributors
# License: GNU General Public License v3. See license.txt
from __future__ import unicode_literals
import frappe
def execute():
warehouse_perm = frappe.get_all("User Permission",
fields=["count(*) as p_count", "is_default", "user"], filters={"allow": "Warehouse"}, group_by="user")
if not warehouse_perm:
return
execute_patch = False
for perm_data in warehouse_perm:
if perm_data.p_count == 1 or (perm_data.p_count > 1 and frappe.get_all("User Permission",
filters = {"user": perm_data.user, "allow": "warehouse", "is_default": 1}, limit=1)):
execute_patch = True
break
if not execute_patch: return
for doctype in ["Sales Invoice", "Delivery Note"]:
if not frappe.get_meta(doctype + ' Item').get_field("target_warehouse").hidden: continue
cond = ""
if doctype == "Sales Invoice":
cond = " AND parent_doc.update_stock = 1"
data = frappe.db.sql(""" SELECT parent_doc.name as name, child_doc.name as child_name
FROM
`tab{doctype}` parent_doc, `tab{doctype} Item` child_doc
WHERE
parent_doc.name = child_doc.parent AND parent_doc.docstatus < 2
AND child_doc.target_warehouse is not null AND child_doc.target_warehouse != ''
AND child_doc.creation > '2020-04-16' {cond}
""".format(doctype=doctype, cond=cond), as_dict=1)
if data:
names = [d.child_name for d in data]
frappe.db.sql(""" UPDATE `tab{0} Item` set target_warehouse = null
WHERE name in ({1}) """.format(doctype, ','.join(["%s"] * len(names) )), tuple(names))
frappe.db.sql(""" UPDATE `tabPacked Item` set target_warehouse = null
WHERE parenttype = '{0}' and parent_detail_docname in ({1})
""".format(doctype, ','.join(["%s"] * len(names) )), tuple(names))
parent_names = list(set([d.name for d in data]))
for d in parent_names:
doc = frappe.get_doc(doctype, d)
if doc.docstatus != 1: continue
doc.docstatus = 2
doc.update_stock_ledger()
doc.make_gl_entries_on_cancel(repost_future_gle=False)
# update stock & gl entries for submit state of PR
doc.docstatus = 1
doc.update_stock_ledger()
doc.make_gl_entries()
if frappe.get_meta('Sales Order Item').get_field("target_warehouse").hidden:
frappe.db.sql(""" UPDATE `tabSales Order Item` set target_warehouse = null
WHERE creation > '2020-04-16' and docstatus < 2 """)
frappe.db.sql(""" UPDATE `tabPacked Item` set target_warehouse = null
WHERE creation > '2020-04-16' and docstatus < 2 and parenttype = 'Sales Order' """)