Revert "fix: preserve inventory dimensions when raw materials are reset (backport #54440)" (#54507)

Revert "fix: preserve inventory dimensions when raw materials are reset (back…"

This reverts commit 722dc8c3f1.
This commit is contained in:
Mihir Kandoi
2026-04-24 14:13:59 +05:30
committed by GitHub
parent 722dc8c3f1
commit 1b08ac248b
7 changed files with 6 additions and 116 deletions

View File

@@ -433,4 +433,3 @@ erpnext.patches.v15_0.replace_http_with_https_in_sales_partner
erpnext.patches.v16_0.add_portal_redirects
erpnext.patches.v16_0.update_order_qty_and_requested_qty_based_on_mr_and_po
erpnext.patches.v16_0.depends_on_inv_dimensions
erpnext.patches.v16_0.scr_inv_dimension

View File

@@ -1,24 +0,0 @@
import frappe
from erpnext.stock.doctype.inventory_dimension.inventory_dimension import get_inventory_dimensions
def execute():
for dimension in get_inventory_dimensions():
if frappe.db.exists(
"Custom Field",
{
"fieldname": dimension.source_fieldname,
"dt": "Subcontracting Receipt Supplied Item",
"reqd": 1,
},
):
frappe.set_value(
"Custom Field",
{
"fieldname": dimension.source_fieldname,
"dt": "Subcontracting Receipt Supplied Item",
"reqd": 1,
},
{"reqd": 0, "mandatory_depends_on": "eval:doc.reference_name"},
)

View File

@@ -166,13 +166,6 @@ class InventoryDimension(Document):
if label_start_with:
label = f"{label_start_with} {self.dimension_name}"
mandatory_depends_on = self.mandatory_depends_on
if self.reqd:
if doctype == "Stock Entry Detail":
mandatory_depends_on = "eval:doc.s_warehouse"
elif doctype == "Subcontracting Receipt Supplied Item":
mandatory_depends_on = "eval:doc.reference_name"
dimension_fields = [
dict(
fieldname="inventory_dimension",
@@ -190,11 +183,11 @@ class InventoryDimension(Document):
depends_on="eval:doc.s_warehouse" if doctype == "Stock Entry Detail" else "",
search_index=1,
reqd=1
if self.reqd
and not self.mandatory_depends_on
and doctype not in ["Stock Entry Detail", "Subcontracting Receipt Supplied Item"]
if self.reqd and not self.mandatory_depends_on and doctype != "Stock Entry Detail"
else 0,
mandatory_depends_on=mandatory_depends_on,
mandatory_depends_on="eval:doc.s_warehouse"
if self.reqd and doctype == "Stock Entry Detail"
else self.mandatory_depends_on,
),
]

View File

@@ -234,6 +234,7 @@ class TestInventoryDimension(FrappeTestCase):
)
)
doc.load_from_db
doc.reqd = 0
doc.save()

View File

@@ -425,13 +425,7 @@ frappe.ui.form.on("Subcontracting Receipt Item", {
set_missing_values(frm);
},
before_items_remove(frm, cdt, cdn) {
const filtered_rows = frm.doc.supplied_items.filter((item) => item.reference_name !== cdn);
frm.doc.supplied_items = filtered_rows;
frm.refresh_field("supplied_items");
},
items_delete(frm) {
items_delete: (frm) => {
set_missing_values(frm);
},

View File

@@ -14,7 +14,6 @@ from erpnext.buying.utils import check_on_hold_or_closed_status
from erpnext.controllers.subcontracting_controller import SubcontractingController
from erpnext.setup.doctype.brand.brand import get_brand_defaults
from erpnext.setup.doctype.item_group.item_group import get_item_group_defaults
from erpnext.stock.doctype.inventory_dimension.inventory_dimension import get_inventory_dimensions
from erpnext.stock.doctype.item.item import get_item_defaults
from erpnext.stock.get_item_details import get_default_cost_center, get_default_expense_account
from erpnext.stock.stock_ledger import get_valuation_rate
@@ -119,7 +118,6 @@ class SubcontractingReceipt(SubcontractingController):
)
def before_validate(self):
self.save_inventory_dimensions()
super().before_validate()
self.validate_items_qty()
self.set_items_bom()
@@ -160,7 +158,6 @@ class SubcontractingReceipt(SubcontractingController):
self.set_supplied_items_expense_account()
self.set_supplied_items_cost_center()
self.set_supplied_items_inventory_dimensions()
def on_submit(self):
self.validate_closed_subcontracting_order()
@@ -292,22 +289,6 @@ class SubcontractingReceipt(SubcontractingController):
self.company,
)
def set_supplied_items_inventory_dimensions(self):
if hasattr(self, "inventory_dimensions") and (inventory_dimensions := get_inventory_dimensions()):
for item in self.supplied_items:
key = (
item.reference_name,
item.rm_item_code,
item.main_item_code,
item.batch_no,
item.serial_no,
)
for dimension in inventory_dimensions:
dimension_values = self.inventory_dimensions.get(dimension.source_fieldname, {})
if key in dimension_values:
item.set(dimension.source_fieldname, dimension_values[key])
def set_supplied_items_expense_account(self):
for item in self.supplied_items:
if not item.expense_account:
@@ -324,19 +305,6 @@ class SubcontractingReceipt(SubcontractingController):
get_brand_defaults(item.rm_item_code, self.company),
)
def save_inventory_dimensions(self):
if inventory_dimensions := get_inventory_dimensions():
if not getattr(self, "inventory_dimensions", None):
self.inventory_dimensions = {}
for dimension in inventory_dimensions:
self.inventory_dimensions[dimension.source_fieldname] = {
(d.reference_name, d.rm_item_code, d.main_item_code, d.batch_no, d.serial_no): d.get(
dimension.source_fieldname
)
for d in self.supplied_items
}
def reset_supplied_items(self):
if (
frappe.db.get_single_value("Buying Settings", "backflush_raw_materials_of_subcontract_based_on")

View File

@@ -2002,47 +2002,6 @@ class TestSubcontractingReceipt(FrappeTestCase):
self.assertRaises(BOMQuantityError, scr.submit)
def test_inventory_dimensions(self):
"""
The subcontracting controller resets the supplied items table on each save causing the inventory dimensions to be lost.
This test ensures that the inventory dimensions are retained on each save.
"""
from erpnext.stock.doctype.inventory_dimension.test_inventory_dimension import (
create_inventory_dimension,
)
inventory_dimension = create_inventory_dimension(
apply_to_all_doctypes=1,
dimension_name="Inv Site",
reference_document="Inv Site",
document_type="Inv Site",
)
inventory_dimension.reqd = 1
inventory_dimension.save()
set_backflush_based_on("BOM")
sco = get_subcontracting_order()
rm_items = get_rm_items(sco.supplied_items)
itemwise_details = make_stock_in_entry(rm_items=rm_items)
make_stock_transfer_entry(
sco_no=sco.name,
rm_items=rm_items,
itemwise_details=copy.deepcopy(itemwise_details),
)
scr = make_subcontracting_receipt(sco.name)
scr.items[0].inv_site = "Site 1"
scr.save()
scr.supplied_items[0].inv_site = "Site 1"
scr.save()
self.assertEqual(scr.supplied_items[0].inv_site, "Site 1")
inventory_dimension.reqd = 0
inventory_dimension.save()
def make_return_subcontracting_receipt(**args):
args = frappe._dict(args)