Skip to content

Commit 44363c0

Browse files
fix: Respect allowed zero qty in SO and PO based on Buying/Selling settings when update items (#49673)
* fix: respect allowed zero qty in SO and PO based on buying/selling settings * refactor: remove parent_doctype param due to it's already avaliable * refactor: rename is_allowed_zero_qty_for to is_allowed_zero_qty * fix: prevent rate change for unit price items * fix: unboundlocal variable rate_unchanged * refactor: only throw on 'zero' qty items --------- Co-authored-by: ruthra kumar <[email protected]>
1 parent 5b11710 commit 44363c0

File tree

1 file changed

+13
-1
lines changed

1 file changed

+13
-1
lines changed

erpnext/controllers/accounts_controller.py

Lines changed: 13 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3680,8 +3680,15 @@ def get_new_child_item(item_row):
36803680
child_doctype = "Sales Order Item" if parent_doctype == "Sales Order" else "Purchase Order Item"
36813681
return set_order_defaults(parent_doctype, parent_doctype_name, child_doctype, child_docname, item_row)
36823682

3683+
def is_allowed_zero_qty():
3684+
if parent_doctype == "Sales Order":
3685+
return frappe.db.get_single_value("Selling Settings", "allow_zero_qty_in_sales_order") or False
3686+
elif parent_doctype == "Purchase Order":
3687+
return frappe.db.get_single_value("Buying Settings", "allow_zero_qty_in_purchase_order") or False
3688+
return False
3689+
36833690
def validate_quantity(child_item, new_data):
3684-
if not flt(new_data.get("qty")):
3691+
if not flt(new_data.get("qty")) and not is_allowed_zero_qty():
36853692
frappe.throw(
36863693
_("Row #{0}: Quantity for Item {1} cannot be zero.").format(
36873694
new_data.get("idx"), frappe.bold(new_data.get("item_code"))
@@ -3817,6 +3824,11 @@ def validate_fg_item_for_subcontracting(new_data, is_new):
38173824
conv_fac_precision = child_item.precision("conversion_factor") or 2
38183825
qty_precision = child_item.precision("qty") or 2
38193826

3827+
prev_rate, new_rate = flt(child_item.get("rate")), flt(d.get("rate"))
3828+
rate_unchanged = prev_rate == new_rate
3829+
if not rate_unchanged and not child_item.get("qty") and is_allowed_zero_qty():
3830+
frappe.throw(_("Rate of '{}' items cannot be changed").format(frappe.bold(_("Unit Price"))))
3831+
38203832
# Amount cannot be lesser than billed amount, except for negative amounts
38213833
row_rate = flt(d.get("rate"), rate_precision)
38223834
amount_below_billed_amt = flt(child_item.billed_amt, rate_precision) > flt(

0 commit comments

Comments
 (0)