From 65d8ce75599e14e120bbee350a283cc995e92542 Mon Sep 17 00:00:00 2001 From: sngohodoo Date: Mon, 1 Jun 2026 18:24:37 +0530 Subject: [PATCH 1/2] [ADD] stock_custom_picking_report: create MO Delivery Note custom report Standard delivery slips only show the final product sold, which isn't helpful for warehouse teams who need a picking list of the actual manufacturing components to fulfill the order. - Added a new 'MO Delivery Note' option in the Print/Action menu specifically for Delivery Orders (WH/OUT). - Instead of the final product, the report dynamically fetches and prints the actual raw materials required on the factory floor. - Strictly filters out exploded sub-kit items to prevent confusion and accidental double-picking. Project: [PSIN]INTERNSHIP ONBOARDING Task: Custom Picking report --- stock_custom_picking_report/__init__.py | 2 + stock_custom_picking_report/__manifest__.py | 13 ++++ .../models/__init__.py | 1 + .../models/stock_picking.py | 5 ++ .../report/__init__.py | 1 + .../report/report_mo_delivery_note.py | 32 +++++++++ .../report/report_mo_delivery_note.xml | 68 +++++++++++++++++++ .../report/stock_report_view.xml | 15 ++++ .../security/ir.model.access.csv | 2 + 9 files changed, 139 insertions(+) create mode 100644 stock_custom_picking_report/__init__.py create mode 100644 stock_custom_picking_report/__manifest__.py create mode 100644 stock_custom_picking_report/models/__init__.py create mode 100644 stock_custom_picking_report/models/stock_picking.py create mode 100644 stock_custom_picking_report/report/__init__.py create mode 100644 stock_custom_picking_report/report/report_mo_delivery_note.py create mode 100644 stock_custom_picking_report/report/report_mo_delivery_note.xml create mode 100644 stock_custom_picking_report/report/stock_report_view.xml create mode 100644 stock_custom_picking_report/security/ir.model.access.csv diff --git a/stock_custom_picking_report/__init__.py b/stock_custom_picking_report/__init__.py new file mode 100644 index 00000000000..bf588bc8b80 --- /dev/null +++ b/stock_custom_picking_report/__init__.py @@ -0,0 +1,2 @@ +from . import models +from . import report diff --git a/stock_custom_picking_report/__manifest__.py b/stock_custom_picking_report/__manifest__.py new file mode 100644 index 00000000000..ca3caa967fb --- /dev/null +++ b/stock_custom_picking_report/__manifest__.py @@ -0,0 +1,13 @@ +{ + "name": "Stock Custom Picking Report", + "application": False, + "installable": True, + "author": "sngoh", + "depends": ["mrp", "stock"], + "license": "LGPL-3", + "data": [ + "security/ir.model.access.csv", + "report/report_mo_delivery_note.xml", + "report/stock_report_view.xml", + ], +} diff --git a/stock_custom_picking_report/models/__init__.py b/stock_custom_picking_report/models/__init__.py new file mode 100644 index 00000000000..ae4c27227f1 --- /dev/null +++ b/stock_custom_picking_report/models/__init__.py @@ -0,0 +1 @@ +from . import stock_picking diff --git a/stock_custom_picking_report/models/stock_picking.py b/stock_custom_picking_report/models/stock_picking.py new file mode 100644 index 00000000000..c59932f9053 --- /dev/null +++ b/stock_custom_picking_report/models/stock_picking.py @@ -0,0 +1,5 @@ +from odoo import models + + +class StockPicking(models.Model): + _inherit = "stock.picking" diff --git a/stock_custom_picking_report/report/__init__.py b/stock_custom_picking_report/report/__init__.py new file mode 100644 index 00000000000..5277f4b5c22 --- /dev/null +++ b/stock_custom_picking_report/report/__init__.py @@ -0,0 +1 @@ +from . import report_mo_delivery_note diff --git a/stock_custom_picking_report/report/report_mo_delivery_note.py b/stock_custom_picking_report/report/report_mo_delivery_note.py new file mode 100644 index 00000000000..ffd4f474b1d --- /dev/null +++ b/stock_custom_picking_report/report/report_mo_delivery_note.py @@ -0,0 +1,32 @@ +from odoo import api, models + + +class ReportMODeliveryNote(models.AbstractModel): + _name = "report.stock_custom_picking_report.mo_delivery_note_report" + _description = "MO Delivery Note Report" + + @api.model + def _get_report_values(self, docids, data=None): + docs = self.env["stock.picking"].browse(docids) + filtered_moves_by_picking = {} + + for picking in docs: + linked_mos = picking.move_ids.move_orig_ids.production_id + + if linked_mos: + components = self.env["stock.move"].search( + [ + ("raw_material_production_id", "in", linked_mos.ids), + "|", + ("bom_line_id", "=", False), + ("bom_line_id.bom_id.type", "!=", "phantom"), + ] + ) + filtered_moves_by_picking[picking.id] = components + else: + filtered_moves_by_picking[picking.id] = picking.move_ids + + return { + "docs": docs, + "filtered_moves": filtered_moves_by_picking, + } diff --git a/stock_custom_picking_report/report/report_mo_delivery_note.xml b/stock_custom_picking_report/report/report_mo_delivery_note.xml new file mode 100644 index 00000000000..00c61652cc0 --- /dev/null +++ b/stock_custom_picking_report/report/report_mo_delivery_note.xml @@ -0,0 +1,68 @@ + + + + diff --git a/stock_custom_picking_report/report/stock_report_view.xml b/stock_custom_picking_report/report/stock_report_view.xml new file mode 100644 index 00000000000..c8a737ee7c5 --- /dev/null +++ b/stock_custom_picking_report/report/stock_report_view.xml @@ -0,0 +1,15 @@ + + + + + MO Delivery Note + stock.picking + qweb-pdf + stock_custom_picking_report.mo_delivery_note_report + stock_custom_picking_report.mo_delivery_note_report + 'MO Delivery Note - %s' % (object.name) + + report + + + diff --git a/stock_custom_picking_report/security/ir.model.access.csv b/stock_custom_picking_report/security/ir.model.access.csv new file mode 100644 index 00000000000..0426acd629b --- /dev/null +++ b/stock_custom_picking_report/security/ir.model.access.csv @@ -0,0 +1,2 @@ +id,name,model_id:id,group_id:id,perm_read,perm_write,perm_create,perm_unlink +access_stock_picking_user,access_stock_picking,model_stock_picking,base.group_user,1,1,1,1 From baffd0b760b52b1f54ec9fd897b9627956888715 Mon Sep 17 00:00:00 2001 From: sngohodoo Date: Tue, 2 Jun 2026 10:57:27 +0530 Subject: [PATCH 2/2] [CLN] stock_custom_picking_report : remove unused model and clean up Leaving dead code in the system clutters the database and makes future maintenance harder. This commit removes an unnecessary model and cleans up the corresponding security access rules, ensuring strict permission controls and preventing any lingering access errors. Project: [PSIN]INTERNSHIP ONBOARDING Task: Custom Picking report --- stock_custom_picking_report/__init__.py | 1 - stock_custom_picking_report/__manifest__.py | 1 - stock_custom_picking_report/models/__init__.py | 1 - stock_custom_picking_report/models/stock_picking.py | 5 ----- .../report/report_mo_delivery_note.py | 2 -- stock_custom_picking_report/report/stock_report_view.xml | 2 +- stock_custom_picking_report/security/ir.model.access.csv | 2 +- 7 files changed, 2 insertions(+), 12 deletions(-) delete mode 100644 stock_custom_picking_report/models/__init__.py delete mode 100644 stock_custom_picking_report/models/stock_picking.py diff --git a/stock_custom_picking_report/__init__.py b/stock_custom_picking_report/__init__.py index bf588bc8b80..4c4f242fa03 100644 --- a/stock_custom_picking_report/__init__.py +++ b/stock_custom_picking_report/__init__.py @@ -1,2 +1 @@ -from . import models from . import report diff --git a/stock_custom_picking_report/__manifest__.py b/stock_custom_picking_report/__manifest__.py index ca3caa967fb..37c9b15f491 100644 --- a/stock_custom_picking_report/__manifest__.py +++ b/stock_custom_picking_report/__manifest__.py @@ -6,7 +6,6 @@ "depends": ["mrp", "stock"], "license": "LGPL-3", "data": [ - "security/ir.model.access.csv", "report/report_mo_delivery_note.xml", "report/stock_report_view.xml", ], diff --git a/stock_custom_picking_report/models/__init__.py b/stock_custom_picking_report/models/__init__.py deleted file mode 100644 index ae4c27227f1..00000000000 --- a/stock_custom_picking_report/models/__init__.py +++ /dev/null @@ -1 +0,0 @@ -from . import stock_picking diff --git a/stock_custom_picking_report/models/stock_picking.py b/stock_custom_picking_report/models/stock_picking.py deleted file mode 100644 index c59932f9053..00000000000 --- a/stock_custom_picking_report/models/stock_picking.py +++ /dev/null @@ -1,5 +0,0 @@ -from odoo import models - - -class StockPicking(models.Model): - _inherit = "stock.picking" diff --git a/stock_custom_picking_report/report/report_mo_delivery_note.py b/stock_custom_picking_report/report/report_mo_delivery_note.py index ffd4f474b1d..1096bfd7caa 100644 --- a/stock_custom_picking_report/report/report_mo_delivery_note.py +++ b/stock_custom_picking_report/report/report_mo_delivery_note.py @@ -17,8 +17,6 @@ def _get_report_values(self, docids, data=None): components = self.env["stock.move"].search( [ ("raw_material_production_id", "in", linked_mos.ids), - "|", - ("bom_line_id", "=", False), ("bom_line_id.bom_id.type", "!=", "phantom"), ] ) diff --git a/stock_custom_picking_report/report/stock_report_view.xml b/stock_custom_picking_report/report/stock_report_view.xml index c8a737ee7c5..1f2892986a8 100644 --- a/stock_custom_picking_report/report/stock_report_view.xml +++ b/stock_custom_picking_report/report/stock_report_view.xml @@ -8,7 +8,7 @@ stock_custom_picking_report.mo_delivery_note_report stock_custom_picking_report.mo_delivery_note_report 'MO Delivery Note - %s' % (object.name) - + report diff --git a/stock_custom_picking_report/security/ir.model.access.csv b/stock_custom_picking_report/security/ir.model.access.csv index 0426acd629b..a350a90aaaa 100644 --- a/stock_custom_picking_report/security/ir.model.access.csv +++ b/stock_custom_picking_report/security/ir.model.access.csv @@ -1,2 +1,2 @@ id,name,model_id:id,group_id:id,perm_read,perm_write,perm_create,perm_unlink -access_stock_picking_user,access_stock_picking,model_stock_picking,base.group_user,1,1,1,1 +access_report_stock_picking_report_mo_delivery_note_report,access_report_stock_picking_report_mo_delivery_note_report,model_report_stock_custom_picking_report_mo_delivery_note_report,base.group_user,1,1,1,1