diff --git a/erpnext/public/js/controllers/transaction.js b/erpnext/public/js/controllers/transaction.js index 1c6af4fc978..d9b62bee8e8 100644 --- a/erpnext/public/js/controllers/transaction.js +++ b/erpnext/public/js/controllers/transaction.js @@ -405,7 +405,7 @@ erpnext.TransactionController = class TransactionController extends erpnext.taxe } const incoming_doctypes = ["Purchase Receipt", "Purchase Invoice", "Subcontracting Receipt"]; - const incoming_purposes = ["Manufacture", "Material Receipt"]; + const incoming_purposes = ["Manufacture", "Material Receipt", "Repack"]; const inspection_type = incoming_doctypes.includes(this.frm.doc.doctype) || (this.frm.doc.doctype === "Stock Entry" && incoming_purposes.includes(this.frm.doc.purpose)) @@ -2967,7 +2967,7 @@ erpnext.TransactionController = class TransactionController extends erpnext.taxe const me = this; const incoming_doctypes = ["Purchase Receipt", "Purchase Invoice", "Subcontracting Receipt"]; - const incoming_purposes = ["Manufacture", "Material Receipt"]; + const incoming_purposes = ["Manufacture", "Material Receipt", "Repack"]; const inspection_type = incoming_doctypes.includes(this.frm.doc.doctype) || (this.frm.doc.doctype === "Stock Entry" && incoming_purposes.includes(this.frm.doc.purpose)) @@ -3065,13 +3065,20 @@ erpnext.TransactionController = class TransactionController extends erpnext.taxe } has_inspection_required(item) { - if (this.frm.doc.doctype === "Stock Entry" && this.frm.doc.purpose == "Manufacture") { - if (item.is_finished_item && !item.quality_inspection) { - return true; - } - } else if (!item.quality_inspection) { + if (item.quality_inspection) { + return false; + } + if (this.frm.doc.doctype !== "Stock Entry") { return true; } + const purpose = this.frm.doc.purpose; + if (purpose === "Manufacture") { + return !!item.is_finished_item; + } + if (["Material Receipt", "Repack"].includes(purpose)) { + return !!item.t_warehouse; + } + return !!item.s_warehouse && item.s_warehouse !== item.t_warehouse; } get_method_for_payment() { diff --git a/erpnext/stock/doctype/quality_inspection/quality_inspection.py b/erpnext/stock/doctype/quality_inspection/quality_inspection.py index ff536f01d55..d51d384b1c2 100644 --- a/erpnext/stock/doctype/quality_inspection/quality_inspection.py +++ b/erpnext/stock/doctype/quality_inspection/quality_inspection.py @@ -387,12 +387,29 @@ def item_query(doctype: Any, txt: str | None, searchfield: Any, start: int, page ] if reference_doctype == "Stock Entry": - my_filters.extend( - [ - "and", - ["items.t_warehouse", "is", "not set"], - ] - ) + if filters.get("inspection_type") == "Incoming": + purpose = frappe.db.get_value("Stock Entry", filters.get("reference_name"), "purpose") + if purpose == "Manufacture": + my_filters.extend( + [ + "and", + ["items.is_finished_item", "=", 1], + ] + ) + else: + my_filters.extend( + [ + "and", + ["items.t_warehouse", "is", "set"], + ] + ) + elif filters.get("inspection_type") == "Outgoing": + my_filters.extend( + [ + "and", + ["items.s_warehouse", "is", "set"], + ] + ) elif filters.get("inspection_type") != "In Process": my_filters.extend( [ diff --git a/erpnext/stock/doctype/stock_entry/stock_entry.js b/erpnext/stock/doctype/stock_entry/stock_entry.js index 58185d3c40e..19025148116 100644 --- a/erpnext/stock/doctype/stock_entry/stock_entry.js +++ b/erpnext/stock/doctype/stock_entry/stock_entry.js @@ -199,6 +199,17 @@ frappe.ui.form.on("Stock Entry", { }, setup_quality_inspection: function (frm) { + const incoming_purposes = ["Manufacture", "Material Receipt", "Repack"]; + + // Show the Quality Inspection field only on rows that require inspection. + frm.get_docfield("items", "quality_inspection").depends_on = (row) => + frm.doc.inspection_required && + (frm.doc.purpose === "Manufacture" + ? row.is_finished_item + : incoming_purposes.includes(frm.doc.purpose) + ? row.t_warehouse + : row.s_warehouse && row.s_warehouse !== row.t_warehouse); + if (!frm.doc.inspection_required) { return; } @@ -216,7 +227,6 @@ frappe.ui.form.on("Stock Entry", { } let quality_inspection_field = frm.get_docfield("items", "quality_inspection"); - const incoming_purposes = ["Manufacture", "Material Receipt"]; quality_inspection_field.get_route_options_for_new_doc = function (row) { if (frm.is_new()) return {}; return { diff --git a/erpnext/stock/doctype/stock_entry_detail/stock_entry_detail.json b/erpnext/stock/doctype/stock_entry_detail/stock_entry_detail.json index c21d9ec91cb..71adb7ed566 100644 --- a/erpnext/stock/doctype/stock_entry_detail/stock_entry_detail.json +++ b/erpnext/stock/doctype/stock_entry_detail/stock_entry_detail.json @@ -324,7 +324,6 @@ "options": "Batch" }, { - "depends_on": "eval:parent.inspection_required && doc.t_warehouse", "fieldname": "quality_inspection", "fieldtype": "Link", "label": "Quality Inspection", @@ -679,7 +678,7 @@ "index_web_pages_for_search": 1, "istable": 1, "links": [], - "modified": "2026-06-01 10:00:00.000000", + "modified": "2026-06-25 11:39:55.152526", "modified_by": "Administrator", "module": "Stock", "name": "Stock Entry Detail", diff --git a/erpnext/stock/services/quality_inspection_service.py b/erpnext/stock/services/quality_inspection_service.py index 7e7fc4ba078..e524eda4e2c 100644 --- a/erpnext/stock/services/quality_inspection_service.py +++ b/erpnext/stock/services/quality_inspection_service.py @@ -49,8 +49,16 @@ class QualityInspectionService: "Item", row.item_code, inspection_required_fieldname ): qi_required = True - elif self.doc.doctype == "Stock Entry" and row.t_warehouse: - qi_required = True # inward stock needs inspection + elif self.doc.doctype == "Stock Entry": + if self.doc.purpose == "Manufacture": + # only the finished good needs inspection + if row.is_finished_item: + qi_required = True + elif self.doc.purpose in ["Material Receipt", "Repack"]: + if row.t_warehouse: + qi_required = True + elif row.s_warehouse and row.s_warehouse != row.t_warehouse: + qi_required = True if row.get("secondary_item_type") or row.get("is_legacy_scrap_item"): continue