mirror of
https://github.com/frappe/erpnext.git
synced 2026-06-07 07:02:54 +00:00
fix: incoming rate should be zero for rejected items (#44857)
(cherry picked from commit a515a399cf)
# Conflicts:
# erpnext/stock/doctype/purchase_receipt/purchase_receipt.py
This commit is contained in:
@@ -1746,6 +1746,52 @@ class TestPurchaseInvoice(FrappeTestCase, StockTestMixin):
|
|||||||
|
|
||||||
frappe.db.set_single_value("Buying Settings", "maintain_same_rate", 1)
|
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):
|
def test_item_less_defaults(self):
|
||||||
pi = frappe.new_doc("Purchase Invoice")
|
pi = frappe.new_doc("Purchase Invoice")
|
||||||
pi.supplier = "_Test Supplier"
|
pi.supplier = "_Test Supplier"
|
||||||
|
|||||||
@@ -750,6 +750,63 @@ class PurchaseReceipt(BuyingController):
|
|||||||
pr_doc = self if (pr == self.name) else frappe.get_doc("Purchase Receipt", pr)
|
pr_doc = self if (pr == self.name) else frappe.get_doc("Purchase Receipt", pr)
|
||||||
update_billing_percentage(pr_doc, update_modified=update_modified)
|
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):
|
def get_stock_value_difference(voucher_no, voucher_detail_no, warehouse):
|
||||||
return frappe.db.get_value(
|
return frappe.db.get_value(
|
||||||
|
|||||||
Reference in New Issue
Block a user