From 6e198188ff90ad7291a48f2fbfaac069eaee8381 Mon Sep 17 00:00:00 2001 From: Rohit Waghchaure Date: Thu, 15 Jun 2023 14:45:19 +0530 Subject: [PATCH 1/2] fix: incorrect gl entries for standalone debit note with update stock --- erpnext/controllers/buying_controller.py | 24 ++++++++++++++++++++++++ 1 file changed, 24 insertions(+) diff --git a/erpnext/controllers/buying_controller.py b/erpnext/controllers/buying_controller.py index ad6a49a029a3..cf26baefb5de 100644 --- a/erpnext/controllers/buying_controller.py +++ b/erpnext/controllers/buying_controller.py @@ -26,6 +26,8 @@ def __setup__(self): self.flags.ignore_permlevel_for_fields = ["buying_price_list", "price_list_currency"] def validate(self): + self.set_rate_for_standalone_debit_note() + super(BuyingController, self).validate() if getattr(self, "supplier", None) and not self.supplier_name: self.supplier_name = frappe.db.get_value("Supplier", self.supplier, "supplier_name") @@ -100,6 +102,28 @@ def create_package_for_transfer(self) -> None: do_not_submit=True, ) + def set_rate_for_standalone_debit_note(self): + if self.get("is_return") and self.get("update_stock") and not self.return_against: + for row in self.items: + row.rate = get_incoming_rate( + { + "item_code": row.item_code, + "warehouse": row.warehouse, + "posting_date": self.get("posting_date"), + "posting_time": self.get("posting_time"), + "qty": row.qty, + "serial_and_batch_bundle": row.get("serial_and_batch_bundle"), + "company": self.company, + "voucher_type": self.doctype, + "voucher_no": self.name, + }, + raise_error_if_no_rate=False, + ) + + row.discount_percentage = 0.0 + row.discount_amount = 0.0 + row.margin_rate_or_amount = 0.0 + def set_missing_values(self, for_validate=False): super(BuyingController, self).set_missing_values(for_validate) From f9f662679fc7ebcbfb96198b931c449cecab6ec2 Mon Sep 17 00:00:00 2001 From: Rohit Waghchaure Date: Thu, 15 Jun 2023 15:01:15 +0530 Subject: [PATCH 2/2] test: added test case --- .../purchase_invoice/test_purchase_invoice.py | 22 +++++++++++++------ erpnext/controllers/buying_controller.py | 2 ++ 2 files changed, 17 insertions(+), 7 deletions(-) diff --git a/erpnext/accounts/doctype/purchase_invoice/test_purchase_invoice.py b/erpnext/accounts/doctype/purchase_invoice/test_purchase_invoice.py index 42eb018078e0..45bddfc0963e 100644 --- a/erpnext/accounts/doctype/purchase_invoice/test_purchase_invoice.py +++ b/erpnext/accounts/doctype/purchase_invoice/test_purchase_invoice.py @@ -642,13 +642,6 @@ def test_standalone_return_using_pi(self): gle_filters={"account": "Stock In Hand - TCP1"}, ) - # assert loss booked in COGS - self.assertGLEs( - return_pi, - [{"credit": 0, "debit": 200}], - gle_filters={"account": "Cost of Goods Sold - TCP1"}, - ) - def test_return_with_lcv(self): from erpnext.controllers.sales_and_purchase_return import make_return_doc from erpnext.stock.doctype.landed_cost_voucher.test_landed_cost_voucher import ( @@ -1671,6 +1664,21 @@ def test_batch_expiry_for_purchase_invoice(self): self.assertTrue(return_pi.docstatus == 1) + def test_gl_entries_for_standalone_debit_note(self): + make_purchase_invoice(qty=5, rate=500, update_stock=True) + + returned_inv = make_purchase_invoice(qty=-5, rate=5, update_stock=True, is_return=True) + + # override the rate with valuation rate + sle = frappe.get_all( + "Stock Ledger Entry", + fields=["stock_value_difference", "actual_qty"], + filters={"voucher_no": returned_inv.name}, + )[0] + + rate = flt(sle.stock_value_difference) / flt(sle.actual_qty) + self.assertAlmostEqual(returned_inv.items[0].rate, rate) + def check_gl_entries(doc, voucher_no, expected_gle, posting_date): gl_entries = frappe.db.sql( diff --git a/erpnext/controllers/buying_controller.py b/erpnext/controllers/buying_controller.py index cf26baefb5de..a3a1461c9a78 100644 --- a/erpnext/controllers/buying_controller.py +++ b/erpnext/controllers/buying_controller.py @@ -105,6 +105,8 @@ def create_package_for_transfer(self) -> None: def set_rate_for_standalone_debit_note(self): if self.get("is_return") and self.get("update_stock") and not self.return_against: for row in self.items: + + # override the rate with valuation rate row.rate = get_incoming_rate( { "item_code": row.item_code,