mirror of
https://github.com/frappe/erpnext.git
synced 2026-03-27 23:21:32 +01:00
feat: inventory dimension for rejected materials (#44156)
(cherry picked from commit 9bf16df41e)
Co-authored-by: rohitwaghchaure <rohitw1991@gmail.com>
This commit is contained in:
@@ -839,6 +839,15 @@ class StockController(AccountsController):
|
|||||||
if not dimension:
|
if not dimension:
|
||||||
continue
|
continue
|
||||||
|
|
||||||
|
if (
|
||||||
|
self.doctype in ["Purchase Invoice", "Purchase Receipt"]
|
||||||
|
and row.get("rejected_warehouse")
|
||||||
|
and sl_dict.get("warehouse") == row.get("rejected_warehouse")
|
||||||
|
):
|
||||||
|
fieldname = f"rejected_{dimension.source_fieldname}"
|
||||||
|
sl_dict[dimension.target_fieldname] = row.get(fieldname)
|
||||||
|
continue
|
||||||
|
|
||||||
if self.doctype in [
|
if self.doctype in [
|
||||||
"Purchase Invoice",
|
"Purchase Invoice",
|
||||||
"Purchase Receipt",
|
"Purchase Receipt",
|
||||||
|
|||||||
@@ -107,6 +107,7 @@ class InventoryDimension(Document):
|
|||||||
self.source_fieldname,
|
self.source_fieldname,
|
||||||
f"to_{self.source_fieldname}",
|
f"to_{self.source_fieldname}",
|
||||||
f"from_{self.source_fieldname}",
|
f"from_{self.source_fieldname}",
|
||||||
|
f"rejected_{self.source_fieldname}",
|
||||||
],
|
],
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
@@ -171,12 +172,12 @@ class InventoryDimension(Document):
|
|||||||
if label_start_with:
|
if label_start_with:
|
||||||
label = f"{label_start_with} {self.dimension_name}"
|
label = f"{label_start_with} {self.dimension_name}"
|
||||||
|
|
||||||
return [
|
dimension_fields = [
|
||||||
dict(
|
dict(
|
||||||
fieldname="inventory_dimension",
|
fieldname="inventory_dimension",
|
||||||
fieldtype="Section Break",
|
fieldtype="Section Break",
|
||||||
insert_after=self.get_insert_after_fieldname(doctype),
|
insert_after=self.get_insert_after_fieldname(doctype),
|
||||||
label="Inventory Dimension",
|
label=_("Inventory Dimension"),
|
||||||
collapsible=1,
|
collapsible=1,
|
||||||
),
|
),
|
||||||
dict(
|
dict(
|
||||||
@@ -184,13 +185,29 @@ class InventoryDimension(Document):
|
|||||||
fieldtype="Link",
|
fieldtype="Link",
|
||||||
insert_after="inventory_dimension",
|
insert_after="inventory_dimension",
|
||||||
options=self.reference_document,
|
options=self.reference_document,
|
||||||
label=label,
|
label=_(label),
|
||||||
search_index=1,
|
search_index=1,
|
||||||
reqd=self.reqd,
|
reqd=self.reqd,
|
||||||
mandatory_depends_on=self.mandatory_depends_on,
|
mandatory_depends_on=self.mandatory_depends_on,
|
||||||
),
|
),
|
||||||
]
|
]
|
||||||
|
|
||||||
|
if doctype in ["Purchase Invoice Item", "Purchase Receipt Item"]:
|
||||||
|
dimension_fields.append(
|
||||||
|
dict(
|
||||||
|
fieldname="rejected_" + self.source_fieldname,
|
||||||
|
fieldtype="Link",
|
||||||
|
insert_after=self.source_fieldname,
|
||||||
|
options=self.reference_document,
|
||||||
|
label=_("Rejected " + self.dimension_name),
|
||||||
|
search_index=1,
|
||||||
|
reqd=self.reqd,
|
||||||
|
mandatory_depends_on=self.mandatory_depends_on,
|
||||||
|
)
|
||||||
|
)
|
||||||
|
|
||||||
|
return dimension_fields
|
||||||
|
|
||||||
def add_custom_fields(self):
|
def add_custom_fields(self):
|
||||||
custom_fields = {}
|
custom_fields = {}
|
||||||
|
|
||||||
|
|||||||
@@ -269,21 +269,47 @@ class TestInventoryDimension(FrappeTestCase):
|
|||||||
item_code = "Test Inventory Dimension Item"
|
item_code = "Test Inventory Dimension Item"
|
||||||
create_item(item_code)
|
create_item(item_code)
|
||||||
warehouse = create_warehouse("Store Warehouse")
|
warehouse = create_warehouse("Store Warehouse")
|
||||||
|
rj_warehouse = create_warehouse("RJ Warehouse")
|
||||||
|
|
||||||
|
if not frappe.db.exists("Store", "Rejected Store"):
|
||||||
|
frappe.get_doc({"doctype": "Store", "store_name": "Rejected Store"}).insert(
|
||||||
|
ignore_permissions=True
|
||||||
|
)
|
||||||
|
|
||||||
# Purchase Receipt -> Inward in Store 1
|
# Purchase Receipt -> Inward in Store 1
|
||||||
pr_doc = make_purchase_receipt(
|
pr_doc = make_purchase_receipt(
|
||||||
item_code=item_code, warehouse=warehouse, qty=10, rate=100, do_not_submit=True
|
item_code=item_code,
|
||||||
|
warehouse=warehouse,
|
||||||
|
qty=10,
|
||||||
|
rejected_qty=5,
|
||||||
|
rate=100,
|
||||||
|
rejected_warehouse=rj_warehouse,
|
||||||
|
do_not_submit=True,
|
||||||
)
|
)
|
||||||
|
|
||||||
pr_doc.items[0].store = "Store 1"
|
pr_doc.items[0].store = "Store 1"
|
||||||
|
pr_doc.items[0].rejected_store = "Rejected Store"
|
||||||
pr_doc.save()
|
pr_doc.save()
|
||||||
pr_doc.submit()
|
pr_doc.submit()
|
||||||
|
|
||||||
entries = get_voucher_sl_entries(pr_doc.name, ["warehouse", "store", "incoming_rate"])
|
entries = frappe.get_all(
|
||||||
|
"Stock Ledger Entry",
|
||||||
|
filters={"voucher_no": pr_doc.name, "warehouse": warehouse},
|
||||||
|
fields=["store"],
|
||||||
|
order_by="creation",
|
||||||
|
)
|
||||||
|
|
||||||
self.assertEqual(entries[0].warehouse, warehouse)
|
|
||||||
self.assertEqual(entries[0].store, "Store 1")
|
self.assertEqual(entries[0].store, "Store 1")
|
||||||
|
|
||||||
|
entries = frappe.get_all(
|
||||||
|
"Stock Ledger Entry",
|
||||||
|
filters={"voucher_no": pr_doc.name, "warehouse": rj_warehouse},
|
||||||
|
fields=["store"],
|
||||||
|
order_by="creation",
|
||||||
|
)
|
||||||
|
|
||||||
|
self.assertEqual(entries[0].store, "Rejected Store")
|
||||||
|
|
||||||
# Stock Entry -> Transfer from Store 1 to Store 2
|
# Stock Entry -> Transfer from Store 1 to Store 2
|
||||||
se_doc = make_stock_entry(
|
se_doc = make_stock_entry(
|
||||||
item_code=item_code, qty=10, from_warehouse=warehouse, to_warehouse=warehouse, do_not_save=True
|
item_code=item_code, qty=10, from_warehouse=warehouse, to_warehouse=warehouse, do_not_save=True
|
||||||
|
|||||||
Reference in New Issue
Block a user