diff --git a/erpnext/controllers/status_updater.py b/erpnext/controllers/status_updater.py index 17f072ebb07b..1bca8c5a7908 100644 --- a/erpnext/controllers/status_updater.py +++ b/erpnext/controllers/status_updater.py @@ -102,7 +102,10 @@ def validate_status(status, options): ["To Bill", "eval:self.per_billed == 0 and self.docstatus == 1"], ["Partly Billed", "eval:self.per_billed > 0 and self.per_billed < 100 and self.docstatus == 1"], ["Return Issued", "eval:self.per_returned == 100 and self.docstatus == 1"], - ["Completed", "eval:self.per_billed == 100 and self.docstatus == 1"], + [ + "Completed", + "eval:(self.per_billed == 100 and self.docstatus == 1 and self.grand_total != 0) or (self.docstatus == 1 and self.grand_total == 0)" + ], ["Cancelled", "eval:self.docstatus==2"], ["Closed", "eval:self.status=='Closed' and self.docstatus != 2"], ], diff --git a/erpnext/stock/doctype/purchase_receipt/test_purchase_receipt.py b/erpnext/stock/doctype/purchase_receipt/test_purchase_receipt.py index aff09af25e33..47229b92b933 100644 --- a/erpnext/stock/doctype/purchase_receipt/test_purchase_receipt.py +++ b/erpnext/stock/doctype/purchase_receipt/test_purchase_receipt.py @@ -3060,6 +3060,38 @@ def test_purchase_return_from_rejected_warehouse(self): self.assertEqual(pr_return.items[0].rejected_qty, 0.0) self.assertEqual(pr_return.items[0].rejected_warehouse, "") + def test_status_mapping(self): + purchase_receipt = frappe.get_doc( + { + "doctype": "Purchase Receipt", + "supplier": "Test Supplier", + "grand_total": 0.0, + "base_rounded_total": 0.0, + "rounded_total": 0.0, + "base_net_total": 0.0, + "posting_date": frappe.utils.today(), + "items": [ + { + "item_code": "item_for_status", + "item_name": "item_for_status", + "description": "item_for_status", + "uom": "Nos", + "qty": 1, + "rate": 0, + "amount": 0, + "base_rate": 0, + "base_amount": 0, + "warehouse": "Stores - W", + } + ], + } + ) + purchase_receipt.insert() + purchase_receipt.save() + purchase_receipt.submit() + purchase_receipt.reload() + self.assertEqual(purchase_receipt.grand_total, 0.0) + self.assertEqual(purchase_receipt.status, "Completed") def prepare_data_for_internal_transfer(): from erpnext.accounts.doctype.sales_invoice.test_sales_invoice import create_internal_supplier