mirror of
https://github.com/frappe/erpnext.git
synced 2026-03-17 22:12:12 +00:00
fix: purchase return validation issue (backport #43871) (#43874) fix: purchase return validation issue (#43871) (cherry picked from commita7cc7b28c0) Co-authored-by: rohitwaghchaure <rohitw1991@gmail.com> (cherry picked from commitb4d4c4a736) Co-authored-by: mergify[bot] <37929162+mergify[bot]@users.noreply.github.com>
This commit is contained in:
@@ -79,6 +79,9 @@ def validate_returned_items(doc):
|
|||||||
if doc.doctype in ["Purchase Invoice", "Purchase Receipt", "Subcontracting Receipt"]:
|
if doc.doctype in ["Purchase Invoice", "Purchase Receipt", "Subcontracting Receipt"]:
|
||||||
select_fields += ",rejected_qty, received_qty"
|
select_fields += ",rejected_qty, received_qty"
|
||||||
|
|
||||||
|
if doc.doctype in ["Purchase Receipt", "Purchase Invoice"]:
|
||||||
|
select_fields += ",name"
|
||||||
|
|
||||||
for d in frappe.db.sql(
|
for d in frappe.db.sql(
|
||||||
f"""select {select_fields} from `tab{doc.doctype} Item` where parent = %s""",
|
f"""select {select_fields} from `tab{doc.doctype} Item` where parent = %s""",
|
||||||
doc.return_against,
|
doc.return_against,
|
||||||
@@ -104,15 +107,24 @@ def validate_returned_items(doc):
|
|||||||
|
|
||||||
items_returned = False
|
items_returned = False
|
||||||
for d in doc.get("items"):
|
for d in doc.get("items"):
|
||||||
|
key = d.item_code
|
||||||
|
raise_exception = False
|
||||||
|
if doc.doctype in ["Purchase Receipt", "Purchase Invoice"]:
|
||||||
|
field = frappe.scrub(doc.doctype) + "_item"
|
||||||
|
if d.get(field):
|
||||||
|
key = (d.item_code, d.get(field))
|
||||||
|
raise_exception = True
|
||||||
|
|
||||||
if d.item_code and (flt(d.qty) < 0 or flt(d.get("received_qty")) < 0):
|
if d.item_code and (flt(d.qty) < 0 or flt(d.get("received_qty")) < 0):
|
||||||
if d.item_code not in valid_items:
|
if key not in valid_items:
|
||||||
frappe.throw(
|
frappe.msgprint(
|
||||||
_("Row # {0}: Returned Item {1} does not exist in {2} {3}").format(
|
_("Row # {0}: Returned Item {1} does not exist in {2} {3}").format(
|
||||||
d.idx, d.item_code, doc.doctype, doc.return_against
|
d.idx, d.item_code, doc.doctype, doc.return_against
|
||||||
)
|
),
|
||||||
|
raise_exception=raise_exception,
|
||||||
)
|
)
|
||||||
else:
|
else:
|
||||||
ref = valid_items.get(d.item_code, frappe._dict())
|
ref = valid_items.get(key, frappe._dict())
|
||||||
validate_quantity(doc, d, ref, valid_items, already_returned_items)
|
validate_quantity(doc, d, ref, valid_items, already_returned_items)
|
||||||
|
|
||||||
if (
|
if (
|
||||||
@@ -193,8 +205,12 @@ def validate_quantity(doc, args, ref, valid_items, already_returned_items):
|
|||||||
def get_ref_item_dict(valid_items, ref_item_row):
|
def get_ref_item_dict(valid_items, ref_item_row):
|
||||||
from erpnext.stock.doctype.serial_no.serial_no import get_serial_nos
|
from erpnext.stock.doctype.serial_no.serial_no import get_serial_nos
|
||||||
|
|
||||||
|
key = ref_item_row.item_code
|
||||||
|
if ref_item_row.get("name"):
|
||||||
|
key = (ref_item_row.item_code, ref_item_row.name)
|
||||||
|
|
||||||
valid_items.setdefault(
|
valid_items.setdefault(
|
||||||
ref_item_row.item_code,
|
key,
|
||||||
frappe._dict(
|
frappe._dict(
|
||||||
{
|
{
|
||||||
"qty": 0,
|
"qty": 0,
|
||||||
@@ -208,7 +224,7 @@ def get_ref_item_dict(valid_items, ref_item_row):
|
|||||||
}
|
}
|
||||||
),
|
),
|
||||||
)
|
)
|
||||||
item_dict = valid_items[ref_item_row.item_code]
|
item_dict = valid_items[key]
|
||||||
item_dict["qty"] += ref_item_row.qty
|
item_dict["qty"] += ref_item_row.qty
|
||||||
item_dict["stock_qty"] += ref_item_row.get("stock_qty", 0)
|
item_dict["stock_qty"] += ref_item_row.get("stock_qty", 0)
|
||||||
if ref_item_row.get("rate", 0) > item_dict["rate"]:
|
if ref_item_row.get("rate", 0) > item_dict["rate"]:
|
||||||
|
|||||||
Reference in New Issue
Block a user