diff --git a/erpnext/accounts/doctype/purchase_invoice/purchase_invoice.py b/erpnext/accounts/doctype/purchase_invoice/purchase_invoice.py index bdd936a520b..261b26fe316 100644 --- a/erpnext/accounts/doctype/purchase_invoice/purchase_invoice.py +++ b/erpnext/accounts/doctype/purchase_invoice/purchase_invoice.py @@ -2097,10 +2097,26 @@ def make_purchase_receipt(source_name, target_doc=None, args=None): if isinstance(args, str): args = json.loads(args) + def post_parent_process(source_parent, target_parent): + for row in target_parent.get("items"): + if row.get("qty") == 0: + target_parent.remove(row) + def update_item(obj, target, source_parent): - target.qty = flt(obj.qty) - flt(obj.received_qty) + from erpnext.controllers.sales_and_purchase_return import get_returned_qty_map_for_row + + returned_qty_map = ( + get_returned_qty_map_for_row( + source_parent.name, source_parent.supplier, obj.name, "Purchase Invoice" + ) + or {} + ) + + target.qty = flt(obj.qty) - flt(obj.received_qty) - flt(returned_qty_map.get("qty")) target.received_qty = flt(obj.qty) - flt(obj.received_qty) - target.stock_qty = (flt(obj.qty) - flt(obj.received_qty)) * flt(obj.conversion_factor) + target.stock_qty = (flt(obj.qty) - flt(obj.received_qty) - flt(returned_qty_map.get("qty"))) * flt( + obj.conversion_factor + ) target.amount = (flt(obj.qty) - flt(obj.received_qty)) * flt(obj.rate) target.base_amount = ( (flt(obj.qty) - flt(obj.received_qty)) * flt(obj.rate) * flt(source_parent.conversion_rate) @@ -2139,6 +2155,7 @@ def make_purchase_receipt(source_name, target_doc=None, args=None): "Purchase Taxes and Charges": {"doctype": "Purchase Taxes and Charges"}, }, target_doc, + post_parent_process, ) return doc diff --git a/erpnext/accounts/doctype/purchase_invoice/test_purchase_invoice.py b/erpnext/accounts/doctype/purchase_invoice/test_purchase_invoice.py index c6324c10373..5bd7e80f188 100644 --- a/erpnext/accounts/doctype/purchase_invoice/test_purchase_invoice.py +++ b/erpnext/accounts/doctype/purchase_invoice/test_purchase_invoice.py @@ -2931,6 +2931,29 @@ class TestPurchaseInvoice(IntegrationTestCase, StockTestMixin): pi.save() self.assertEqual(pi.discount_amount, discount_amount) + def test_returned_item_purchase_receipt(self): + from erpnext.accounts.doctype.purchase_invoice.purchase_invoice import ( + make_purchase_receipt as make_purchase_receipt_from_pi, + ) + + item = create_item("_Test Returned Item Purchase Receipt", is_stock_item=1) + + pi = make_purchase_invoice(item_code=item.name, qty=5, rate=100) + + return_pi = make_purchase_invoice( + item_code=item.name, + is_return=1, + return_against=pi.name, + qty=-5, + do_not_submit=True, + ) + + return_pi.items[0].purchase_invoice_item = pi.items[0].name + return_pi.submit() + + pr = make_purchase_receipt_from_pi(pi.name) + self.assertFalse(pr.items) + def set_advance_flag(company, flag, default_account): frappe.db.set_value(