From c49321f6dad6473007817b2e8258b1de49aaf128 Mon Sep 17 00:00:00 2001 From: rohitwaghchaure Date: Mon, 23 Dec 2024 16:58:07 +0530 Subject: [PATCH] fix: incoming rate should be zero for rejected items (#44857) (cherry picked from commit a515a399cf7778b8a5fa430b11188fe9b677024d) # Conflicts: # erpnext/stock/doctype/purchase_receipt/purchase_receipt.py --- .../purchase_invoice/test_purchase_invoice.py | 46 +++++++++++++++ .../purchase_receipt/purchase_receipt.py | 57 +++++++++++++++++++ 2 files changed, 103 insertions(+) diff --git a/erpnext/accounts/doctype/purchase_invoice/test_purchase_invoice.py b/erpnext/accounts/doctype/purchase_invoice/test_purchase_invoice.py index 2855d999233..a937b0b55fa 100644 --- a/erpnext/accounts/doctype/purchase_invoice/test_purchase_invoice.py +++ b/erpnext/accounts/doctype/purchase_invoice/test_purchase_invoice.py @@ -1746,6 +1746,52 @@ class TestPurchaseInvoice(FrappeTestCase, StockTestMixin): frappe.db.set_single_value("Buying Settings", "maintain_same_rate", 1) + def test_adjust_incoming_rate_for_rejected_item(self): + frappe.db.set_single_value("Buying Settings", "maintain_same_rate", 0) + + frappe.db.set_single_value("Buying Settings", "set_landed_cost_based_on_purchase_invoice_rate", 1) + + # Cost of Item is zero in Purchase Receipt + pr = make_purchase_receipt(qty=1, rejected_qty=1, rate=0) + + stock_value_difference = frappe.db.get_value( + "Stock Ledger Entry", + {"voucher_type": "Purchase Receipt", "voucher_no": pr.name}, + "stock_value_difference", + ) + self.assertEqual(stock_value_difference, 0) + + pi = create_purchase_invoice_from_receipt(pr.name) + for row in pi.items: + row.qty = 1 + row.rate = 150 + + pi.save() + pi.submit() + + stock_value_difference = frappe.db.get_value( + "Stock Ledger Entry", + {"voucher_type": "Purchase Receipt", "voucher_no": pr.name, "warehouse": pi.items[0].warehouse}, + "stock_value_difference", + ) + self.assertEqual(stock_value_difference, 150) + + stock_value_difference = frappe.db.get_value( + "Stock Ledger Entry", + { + "voucher_type": "Purchase Receipt", + "voucher_no": pr.name, + "warehouse": pi.items[0].rejected_warehouse, + }, + "stock_value_difference", + ) + + self.assertFalse(stock_value_difference) + + frappe.db.set_single_value("Buying Settings", "set_landed_cost_based_on_purchase_invoice_rate", 0) + + frappe.db.set_single_value("Buying Settings", "maintain_same_rate", 1) + def test_item_less_defaults(self): pi = frappe.new_doc("Purchase Invoice") pi.supplier = "_Test Supplier" diff --git a/erpnext/stock/doctype/purchase_receipt/purchase_receipt.py b/erpnext/stock/doctype/purchase_receipt/purchase_receipt.py index b293a45580a..716639bd392 100644 --- a/erpnext/stock/doctype/purchase_receipt/purchase_receipt.py +++ b/erpnext/stock/doctype/purchase_receipt/purchase_receipt.py @@ -750,6 +750,63 @@ class PurchaseReceipt(BuyingController): pr_doc = self if (pr == self.name) else frappe.get_doc("Purchase Receipt", pr) update_billing_percentage(pr_doc, update_modified=update_modified) +<<<<<<< HEAD +======= + def reserve_stock_for_sales_order(self): + if ( + self.is_return + or not frappe.db.get_single_value("Stock Settings", "enable_stock_reservation") + or not frappe.db.get_single_value( + "Stock Settings", "auto_reserve_stock_for_sales_order_on_purchase" + ) + ): + return + + self.reload() # reload to get the Serial and Batch Bundle Details + + so_items_details_map = {} + for item in self.items: + if item.sales_order and item.sales_order_item: + item_details = { + "sales_order_item": item.sales_order_item, + "item_code": item.item_code, + "warehouse": item.warehouse, + "qty_to_reserve": item.stock_qty, + "from_voucher_no": item.parent, + "from_voucher_detail_no": item.name, + "serial_and_batch_bundle": item.serial_and_batch_bundle, + } + so_items_details_map.setdefault(item.sales_order, []).append(item_details) + + if so_items_details_map: + if get_datetime(f"{self.posting_date} {self.posting_time}") > get_datetime(): + return frappe.msgprint( + _("Cannot create Stock Reservation Entries for future dated Purchase Receipts.") + ) + + for so, items_details in so_items_details_map.items(): + so_doc = frappe.get_doc("Sales Order", so) + so_doc.create_stock_reservation_entries( + items_details=items_details, + from_voucher_type="Purchase Receipt", + notify=True, + ) + + def enable_recalculate_rate_in_sles(self): + rejected_warehouses = frappe.get_all( + "Purchase Receipt Item", filters={"parent": self.name}, pluck="rejected_warehouse" + ) + + sle_table = frappe.qb.DocType("Stock Ledger Entry") + ( + frappe.qb.update(sle_table) + .set(sle_table.recalculate_rate, 1) + .where(sle_table.voucher_no == self.name) + .where(sle_table.voucher_type == "Purchase Receipt") + .where(sle_table.warehouse.notin(rejected_warehouses)) + ).run() + +>>>>>>> a515a399cf (fix: incoming rate should be zero for rejected items (#44857)) def get_stock_value_difference(voucher_no, voucher_detail_no, warehouse): return frappe.db.get_value(