mirror of
https://github.com/frappe/erpnext.git
synced 2026-05-27 00:44:45 +00:00
fix: not able to reserve extra items against the work order (#47511)
This commit is contained in:
@@ -1362,13 +1362,6 @@ class WorkOrder(Document):
|
|||||||
)
|
)
|
||||||
)
|
)
|
||||||
|
|
||||||
if details.reserved_qty < details.transferred_qty:
|
|
||||||
frappe.throw(
|
|
||||||
_("Transferred Qty {0} cannot be greater than Reserved Qty {1} for item {2}").format(
|
|
||||||
details.transferred_qty, details.reserved_qty, item.item_code
|
|
||||||
)
|
|
||||||
)
|
|
||||||
|
|
||||||
@frappe.whitelist()
|
@frappe.whitelist()
|
||||||
def make_bom(self):
|
def make_bom(self):
|
||||||
data = frappe.db.sql(
|
data = frappe.db.sql(
|
||||||
@@ -1414,7 +1407,7 @@ class WorkOrder(Document):
|
|||||||
|
|
||||||
def get_list_of_materials_for_reservation(self, stock_entry):
|
def get_list_of_materials_for_reservation(self, stock_entry):
|
||||||
items = frappe._dict()
|
items = frappe._dict()
|
||||||
vocher_detail_no = {d.item_code: d.name for d in self.required_items}
|
voucher_detail_no = {d.item_code: d.name for d in self.required_items}
|
||||||
|
|
||||||
for row in stock_entry.items:
|
for row in stock_entry.items:
|
||||||
if row.item_code not in items:
|
if row.item_code not in items:
|
||||||
@@ -1422,7 +1415,7 @@ class WorkOrder(Document):
|
|||||||
{
|
{
|
||||||
"voucher_no": self.name,
|
"voucher_no": self.name,
|
||||||
"voucher_type": self.doctype,
|
"voucher_type": self.doctype,
|
||||||
"voucher_detail_no": vocher_detail_no.get(row.item_code),
|
"voucher_detail_no": voucher_detail_no.get(row.item_code),
|
||||||
"item_code": row.item_code,
|
"item_code": row.item_code,
|
||||||
"warehouse": row.t_warehouse,
|
"warehouse": row.t_warehouse,
|
||||||
"stock_qty": row.transfer_qty,
|
"stock_qty": row.transfer_qty,
|
||||||
@@ -1590,6 +1583,46 @@ class WorkOrder(Document):
|
|||||||
if sre_list:
|
if sre_list:
|
||||||
cancel_stock_reservation_entries(self, sre_list)
|
cancel_stock_reservation_entries(self, sre_list)
|
||||||
|
|
||||||
|
def remove_additional_items(self, stock_entry):
|
||||||
|
for row in stock_entry.items:
|
||||||
|
for item in self.required_items:
|
||||||
|
if row.item_code == item.item_code and row.name == item.voucher_detail_reference:
|
||||||
|
item.delete()
|
||||||
|
|
||||||
|
def add_additional_items(self, stock_entry):
|
||||||
|
if stock_entry.purpose != "Material Transfer for Manufacture":
|
||||||
|
return
|
||||||
|
|
||||||
|
required_items = [d.item_code for d in self.required_items]
|
||||||
|
|
||||||
|
additional_items = frappe._dict()
|
||||||
|
for row in stock_entry.items:
|
||||||
|
if row.item_code not in required_items:
|
||||||
|
additional_items.setdefault(row.item_code, []).append(row)
|
||||||
|
|
||||||
|
for item_code, rows in additional_items.items():
|
||||||
|
for row in rows:
|
||||||
|
child_row = self.append(
|
||||||
|
"required_items",
|
||||||
|
{
|
||||||
|
"item_code": item_code,
|
||||||
|
"source_warehouse": row.s_warehouse,
|
||||||
|
"item_name": row.item_name,
|
||||||
|
"required_qty": row.transfer_qty,
|
||||||
|
"stock_uom": row.stock_uom,
|
||||||
|
"rate": row.basic_rate,
|
||||||
|
"amount": row.amount,
|
||||||
|
"description": row.description,
|
||||||
|
"docstatus": 1,
|
||||||
|
"is_additional_item": 1,
|
||||||
|
"voucher_detail_reference": row.name,
|
||||||
|
},
|
||||||
|
)
|
||||||
|
|
||||||
|
child_row.insert()
|
||||||
|
|
||||||
|
stock_entry.reload()
|
||||||
|
|
||||||
|
|
||||||
@frappe.whitelist()
|
@frappe.whitelist()
|
||||||
def make_stock_reservation_entries(doc, items=None, table_name=None, notify=False):
|
def make_stock_reservation_entries(doc, items=None, table_name=None, notify=False):
|
||||||
|
|||||||
@@ -27,7 +27,9 @@
|
|||||||
"available_qty_at_source_warehouse",
|
"available_qty_at_source_warehouse",
|
||||||
"available_qty_at_wip_warehouse",
|
"available_qty_at_wip_warehouse",
|
||||||
"column_break_jash",
|
"column_break_jash",
|
||||||
"stock_reserved_qty"
|
"stock_reserved_qty",
|
||||||
|
"is_additional_item",
|
||||||
|
"voucher_detail_reference"
|
||||||
],
|
],
|
||||||
"fields": [
|
"fields": [
|
||||||
{
|
{
|
||||||
@@ -172,19 +174,37 @@
|
|||||||
"no_copy": 1,
|
"no_copy": 1,
|
||||||
"print_hide": 1,
|
"print_hide": 1,
|
||||||
"read_only": 1
|
"read_only": 1
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"default": "0",
|
||||||
|
"fieldname": "is_additional_item",
|
||||||
|
"fieldtype": "Check",
|
||||||
|
"label": "Is Additional Item",
|
||||||
|
"no_copy": 1,
|
||||||
|
"read_only": 1
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"depends_on": "is_additional_item",
|
||||||
|
"fieldname": "voucher_detail_reference",
|
||||||
|
"fieldtype": "Data",
|
||||||
|
"label": "Voucher Detail Reference",
|
||||||
|
"no_copy": 1,
|
||||||
|
"read_only": 1
|
||||||
}
|
}
|
||||||
],
|
],
|
||||||
|
"grid_page_length": 50,
|
||||||
"istable": 1,
|
"istable": 1,
|
||||||
"links": [],
|
"links": [],
|
||||||
"modified": "2024-11-20 15:48:16.823384",
|
"modified": "2025-05-12 17:36:00.115181",
|
||||||
"modified_by": "Administrator",
|
"modified_by": "Administrator",
|
||||||
"module": "Manufacturing",
|
"module": "Manufacturing",
|
||||||
"name": "Work Order Item",
|
"name": "Work Order Item",
|
||||||
"owner": "Administrator",
|
"owner": "Administrator",
|
||||||
"permissions": [],
|
"permissions": [],
|
||||||
"quick_entry": 1,
|
"quick_entry": 1,
|
||||||
|
"row_format": "Dynamic",
|
||||||
"sort_field": "creation",
|
"sort_field": "creation",
|
||||||
"sort_order": "DESC",
|
"sort_order": "DESC",
|
||||||
"states": [],
|
"states": [],
|
||||||
"track_changes": 1
|
"track_changes": 1
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -22,6 +22,7 @@ class WorkOrderItem(Document):
|
|||||||
consumed_qty: DF.Float
|
consumed_qty: DF.Float
|
||||||
description: DF.Text | None
|
description: DF.Text | None
|
||||||
include_item_in_manufacturing: DF.Check
|
include_item_in_manufacturing: DF.Check
|
||||||
|
is_additional_item: DF.Check
|
||||||
item_code: DF.Link | None
|
item_code: DF.Link | None
|
||||||
item_name: DF.Data | None
|
item_name: DF.Data | None
|
||||||
operation: DF.Link | None
|
operation: DF.Link | None
|
||||||
@@ -33,9 +34,10 @@ class WorkOrderItem(Document):
|
|||||||
required_qty: DF.Float
|
required_qty: DF.Float
|
||||||
returned_qty: DF.Float
|
returned_qty: DF.Float
|
||||||
source_warehouse: DF.Link | None
|
source_warehouse: DF.Link | None
|
||||||
stock_uom: DF.Link | None
|
|
||||||
stock_reserved_qty: DF.Float
|
stock_reserved_qty: DF.Float
|
||||||
|
stock_uom: DF.Link | None
|
||||||
transferred_qty: DF.Float
|
transferred_qty: DF.Float
|
||||||
|
voucher_detail_reference: DF.Data | None
|
||||||
# end: auto-generated types
|
# end: auto-generated types
|
||||||
|
|
||||||
pass
|
pass
|
||||||
|
|||||||
@@ -29,6 +29,9 @@ def get_data(report_filters):
|
|||||||
if d.consumed_qty and d.consumed_qty > d.required_qty:
|
if d.consumed_qty and d.consumed_qty > d.required_qty:
|
||||||
d.extra_consumed_qty = d.consumed_qty - d.required_qty
|
d.extra_consumed_qty = d.consumed_qty - d.required_qty
|
||||||
|
|
||||||
|
if d.is_additional_item:
|
||||||
|
d.extra_consumed_qty = d.consumed_qty
|
||||||
|
|
||||||
if d.extra_consumed_qty or not report_filters.show_extra_consumed_materials:
|
if d.extra_consumed_qty or not report_filters.show_extra_consumed_materials:
|
||||||
wo_items.setdefault((d.name, d.production_item), []).append(d)
|
wo_items.setdefault((d.name, d.production_item), []).append(d)
|
||||||
|
|
||||||
@@ -81,6 +84,7 @@ def get_fields():
|
|||||||
"`tabWork Order Item`.`required_qty`",
|
"`tabWork Order Item`.`required_qty`",
|
||||||
"`tabWork Order Item`.`transferred_qty`",
|
"`tabWork Order Item`.`transferred_qty`",
|
||||||
"`tabWork Order Item`.`consumed_qty`",
|
"`tabWork Order Item`.`consumed_qty`",
|
||||||
|
"`tabWork Order Item`.`is_additional_item`",
|
||||||
"`tabWork Order`.`status`",
|
"`tabWork Order`.`status`",
|
||||||
"`tabWork Order`.`name`",
|
"`tabWork Order`.`name`",
|
||||||
"`tabWork Order`.`production_item`",
|
"`tabWork Order`.`production_item`",
|
||||||
|
|||||||
@@ -1635,6 +1635,11 @@ class StockEntry(StockController):
|
|||||||
_validate_work_order(pro_doc)
|
_validate_work_order(pro_doc)
|
||||||
|
|
||||||
if self.fg_completed_qty:
|
if self.fg_completed_qty:
|
||||||
|
if self.docstatus == 1:
|
||||||
|
pro_doc.add_additional_items(self)
|
||||||
|
else:
|
||||||
|
pro_doc.remove_additional_items(self)
|
||||||
|
|
||||||
pro_doc.run_method("update_work_order_qty")
|
pro_doc.run_method("update_work_order_qty")
|
||||||
if self.purpose == "Manufacture":
|
if self.purpose == "Manufacture":
|
||||||
pro_doc.run_method("update_planned_qty")
|
pro_doc.run_method("update_planned_qty")
|
||||||
|
|||||||
Reference in New Issue
Block a user