Skip to content
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
3 changes: 2 additions & 1 deletion erpnext/manufacturing/doctype/bom/bom.json
Original file line number Diff line number Diff line change
Expand Up @@ -749,6 +749,7 @@
},
{
"description": "Controls how raw materials are consumed during the \u2018Manufacture\u2019 stock entry.",
"documentation_url": "https://docs.frappe.io/erpnext/bill-of-materials#21-consume-components-based-on",
"fieldname": "backflush_based_on",
"fieldtype": "Select",
"label": "Based On",
Expand All @@ -761,7 +762,7 @@
"image_field": "image",
"is_submittable": 1,
"links": [],
"modified": "2026-04-17 15:22:33.598938",
"modified": "2026-04-20 16:41:37.723586",
"modified_by": "Administrator",
"module": "Manufacturing",
"name": "BOM",
Expand Down
2 changes: 1 addition & 1 deletion erpnext/manufacturing/doctype/bom/bom.py
Original file line number Diff line number Diff line change
Expand Up @@ -2002,7 +2002,7 @@ def get_secondary_items_from_sub_assemblies(bom_no, company, qty, secondary_item
return secondary_items


def get_backflush_based_on(bom_no):
def get_backflush_based_on(bom_no=None):
backflush_based_on = None
if bom_no:
backflush_based_on = frappe.get_cached_value("BOM", bom_no, "backflush_based_on")
Expand Down
6 changes: 3 additions & 3 deletions erpnext/manufacturing/doctype/job_card/job_card.py
Original file line number Diff line number Diff line change
Expand Up @@ -1476,6 +1476,8 @@ def complete_job_card(self, **kwargs):

@frappe.whitelist()
def make_stock_entry_for_semi_fg_item(self, auto_submit: bool = False):
from erpnext.stock.doctype.stock_entry.manufacturing_handler import ManufactureHandler

def get_consumed_process_loss():
table = frappe.qb.DocType("Stock Entry")
query = (
Expand Down Expand Up @@ -1511,9 +1513,7 @@ def get_consumed_process_loss():
ste.stock_entry.flags.ignore_mandatory = True
wo_doc = frappe.get_doc("Work Order", self.work_order)
add_additional_cost(ste.stock_entry, wo_doc, self)

ste.stock_entry.pro_doc = frappe.get_doc("Work Order", self.work_order)
ste.stock_entry.set_secondary_items_from_job_card()
ManufactureHandler(ste.stock_entry).set_secondary_items_from_job_card()
for row in ste.stock_entry.items:
if (row.type or row.is_legacy_scrap_item) and not row.t_warehouse:
row.t_warehouse = self.target_warehouse
Expand Down
5 changes: 3 additions & 2 deletions erpnext/manufacturing/doctype/work_order/test_work_order.py
Original file line number Diff line number Diff line change
Expand Up @@ -31,6 +31,7 @@
)
from erpnext.stock.doctype.serial_no.serial_no import get_serial_nos
from erpnext.stock.doctype.stock_entry import test_stock_entry
from erpnext.stock.doctype.stock_entry.manufacturing_handler import ManufactureHandler
from erpnext.stock.doctype.warehouse.test_warehouse import create_warehouse
from erpnext.stock.utils import get_bin
from erpnext.tests.utils import ERPNextTestSuite
Expand Down Expand Up @@ -1319,7 +1320,7 @@ def test_auto_serial_no_creation(self):

stock_entry = frappe.get_doc(make_stock_entry(wo_order.name, "Manufacture", 10))
stock_entry.set_work_order_details()
stock_entry.set_serial_no_batch_for_finished_good()
ManufactureHandler(stock_entry).set_serial_no_for_finished_good()
for row in stock_entry.items:
if row.item_code == fg_item:
self.assertTrue(row.serial_and_batch_bundle)
Expand Down Expand Up @@ -1360,7 +1361,7 @@ def test_auto_serial_no_batch_creation(self):

stock_entry = frappe.get_doc(make_stock_entry(wo_order.name, "Manufacture", 10))
stock_entry.set_work_order_details()
stock_entry.set_serial_no_batch_for_finished_good()
ManufactureHandler(stock_entry).set_serial_no_for_finished_good()
for row in stock_entry.items:
if row.item_code == fg_item:
self.assertTrue(row.serial_and_batch_bundle)
Expand Down
11 changes: 5 additions & 6 deletions erpnext/manufacturing/doctype/work_order/work_order.py
Original file line number Diff line number Diff line change
Expand Up @@ -2441,10 +2441,6 @@ def make_stock_entry(
stock_entry.set_stock_entry_type()
stock_entry.is_additional_transfer_entry = is_additional_transfer_entry
stock_entry.get_items()
stock_entry.set_secondary_items_from_job_card()

if purpose != "Disassemble":
stock_entry.set_serial_no_batch_for_finished_good()

return stock_entry.as_dict()

Expand Down Expand Up @@ -2805,7 +2801,10 @@ def get_reserved_qty_for_production(

@frappe.whitelist()
def make_stock_return_entry(work_order: str):
from erpnext.stock.doctype.stock_entry.stock_entry import get_available_materials
from erpnext.stock.doctype.stock_entry.manufacturing_handler import (
ManufactureHandler,
get_available_materials,
)

non_consumed_items = get_available_materials(work_order)
if not non_consumed_items:
Expand All @@ -2819,7 +2818,7 @@ def make_stock_return_entry(work_order: str):
stock_entry.work_order = work_order
stock_entry.purpose = "Material Transfer for Manufacture"
stock_entry.bom_no = wo_doc.bom_no
stock_entry.add_transfered_raw_materials_in_items()
ManufactureHandler(stock_entry).add_transfered_raw_materials_in_items()
stock_entry.set_stock_entry_type()

return stock_entry
Expand Down
34 changes: 34 additions & 0 deletions erpnext/projects/doctype/project/project.py
Original file line number Diff line number Diff line change
Expand Up @@ -164,6 +164,40 @@ def dependency_mapping(self, template_tasks, project_tasks):
self.check_depends_on_value(template_task, project_task, project_tasks)
self.check_for_parent_tasks(template_task, project_task, project_tasks)

def set_consumed_material_cost(self):
parent_doc = frappe.qb.DocType("Stock Entry")
child_doc = frappe.qb.DocType("Stock Entry Detail")
lcv_doc = frappe.qb.DocType("Landed Cost Taxes and Charges")

amount = (
qb.from_(child_doc)
.select(Sum(child_doc.amount))
.where(
(child_doc.project == self.name)
& (child_doc.docstatus == 1)
& ((child_doc.t_warehouse.isnull()) | (child_doc.t_warehouse == ""))
)
).run(as_list=1)

amount = flt(amount[0][0]) if amount else 0

additional_costs = (
qb.from_(parent_doc)
.join(lcv_doc)
.on(parent_doc.name == lcv_doc.parent)
.select(Sum(lcv_doc.base_amount))
.where(
(parent_doc.project == self.name)
& (parent_doc.docstatus == 1)
& (parent_doc.purpose == "Manufacture")
)
).run(as_list=1)

additional_cost_amt = flt(additional_costs[0][0]) if additional_costs else 0

amount += additional_cost_amt
self.total_consumed_material_cost = amount

def check_depends_on_value(self, template_task, project_task, project_tasks):
if template_task.get("depends_on") and not project_task.get("depends_on"):
project_template_map = {pt.template_task: pt for pt in project_tasks}
Expand Down
4 changes: 2 additions & 2 deletions erpnext/stock/doctype/purchase_receipt/purchase_receipt.js
Original file line number Diff line number Diff line change
Expand Up @@ -344,7 +344,7 @@ erpnext.stock.PurchaseReceiptController = class PurchaseReceiptController extend

make_retention_stock_entry() {
frappe.call({
method: "erpnext.stock.doctype.stock_entry.stock_entry.move_sample_to_retention_warehouse",
method: "erpnext.stock.doctype.stock_entry.manufacturing_handler.move_sample_to_retention_warehouse",
args: {
company: cur_frm.doc.company,
items: cur_frm.doc.items,
Expand Down Expand Up @@ -463,7 +463,7 @@ var validate_sample_quantity = function (frm, cdt, cdn) {
var d = locals[cdt][cdn];
if (d.sample_quantity && d.qty) {
frappe.call({
method: "erpnext.stock.doctype.stock_entry.stock_entry.validate_sample_quantity",
method: "erpnext.stock.doctype.stock_entry.manufacturing_handler.validate_sample_quantity",
args: {
batch_no: d.batch_no,
item_code: d.item_code,
Expand Down
Loading
Loading