From 74560223322525fc3f1f86f2c85ffd6f58dd5dab Mon Sep 17 00:00:00 2001 From: Devendra Ladhani Date: Wed, 19 Mar 2025 17:43:18 +0530 Subject: [PATCH] [ADD] put_in_pack_stock: Created custom put in pack module - **Custom Put in Pack Button:** - Added a button in stock move list to package the full line quantity. - Removed existing move lines before creating a new packaged one. - **Detailed Operations Wizard Update:** - Updated the detailed operations wizard from the hamburger button. - Added fields for package quantity, package size, and package type. - Integrated a "Generate Packages" button inside the wizard. - **Lot Number Handling:** - Implemented logic for both **quantity-tracked** and **lot-tracked** products. - Assigned packages correctly for each lot while distributing quantities.. - **Inventory View Enhancements:** - Added a **Group By Packaging** filter in Inventory Locations view. - Allows users to view stock grouped by packaging type. --- put_in_pack_stock/__init__.py | 1 + put_in_pack_stock/__manifest__.py | 16 ++++ put_in_pack_stock/models/__init__.py | 2 + put_in_pack_stock/models/stock_move.py | 82 +++++++++++++++++++ put_in_pack_stock/models/stock_picking.py | 16 ++++ put_in_pack_stock/views/stock_move_views.xml | 17 ++++ put_in_pack_stock/views/stock_quant_views.xml | 12 +++ .../views/view_custom_put_in_pack.xml | 12 +++ .../views/view_stock_move_put_in_pack.xml | 24 ++++++ 9 files changed, 182 insertions(+) create mode 100644 put_in_pack_stock/__init__.py create mode 100644 put_in_pack_stock/__manifest__.py create mode 100644 put_in_pack_stock/models/__init__.py create mode 100644 put_in_pack_stock/models/stock_move.py create mode 100644 put_in_pack_stock/models/stock_picking.py create mode 100644 put_in_pack_stock/views/stock_move_views.xml create mode 100644 put_in_pack_stock/views/stock_quant_views.xml create mode 100644 put_in_pack_stock/views/view_custom_put_in_pack.xml create mode 100644 put_in_pack_stock/views/view_stock_move_put_in_pack.xml diff --git a/put_in_pack_stock/__init__.py b/put_in_pack_stock/__init__.py new file mode 100644 index 00000000000..0650744f6bc --- /dev/null +++ b/put_in_pack_stock/__init__.py @@ -0,0 +1 @@ +from . import models diff --git a/put_in_pack_stock/__manifest__.py b/put_in_pack_stock/__manifest__.py new file mode 100644 index 00000000000..705d4d44048 --- /dev/null +++ b/put_in_pack_stock/__manifest__.py @@ -0,0 +1,16 @@ +{ + 'name': 'Put In Pack -Stock', + 'category': 'Stock/PutInPack2', + 'summary': 'Full Traceability Report Demo Data', + 'author': 'Odoo S.A.', + 'depends': ['stock','purchase'], + 'description': "Custom put in pack button for Inventory Transfer", + 'license': 'LGPL-3', + 'installable': True, + 'data': [ + 'views/view_custom_put_in_pack.xml', + 'views/view_stock_move_put_in_pack.xml', + 'views/stock_move_views.xml', + 'views/stock_quant_views.xml', + ] +} diff --git a/put_in_pack_stock/models/__init__.py b/put_in_pack_stock/models/__init__.py new file mode 100644 index 00000000000..3c71fd1b863 --- /dev/null +++ b/put_in_pack_stock/models/__init__.py @@ -0,0 +1,2 @@ +from . import stock_picking +from . import stock_move diff --git a/put_in_pack_stock/models/stock_move.py b/put_in_pack_stock/models/stock_move.py new file mode 100644 index 00000000000..961db392b21 --- /dev/null +++ b/put_in_pack_stock/models/stock_move.py @@ -0,0 +1,82 @@ +from odoo import api, models, fields + + +class StockMove(models.Model): + _inherit = 'stock.move' + + put_in_pack_toggle = fields.Boolean( + string="Put In Pack", + related="picking_type_id.put_in_pack_toggle" + ) + package_qty = fields.Integer( + string = "Package Qty:", + help="Package Quantity", + default=1 + ) + package_type = fields.Selection( + selection = [ + ('box', "Box"), + ('carton', "Carton") + ], + string="Package Type", + help="Package Type for the Product to be kept in the package." + ) + package_size = fields.Integer( + string="Package Size", + help="How many quantity of the particular product will go into the package", + default=0 + ) + + def action_custom_put_in_pack(self): + self.ensure_one() + if self.product_uom_qty <= 0: + raise UserError("No quantity available to package.") + self.move_line_ids.unlink() + package = self.env['stock.quant.package'].create({ + 'name': f"{self.product_id.name} Package" + }) + self.env['stock.move.line'].create({ + 'move_id': self.id, + 'result_package_id': package.id, + 'qty_done': self.product_uom_qty, + 'product_id': self.product_id.id, + 'product_uom_id': self.product_id.uom_id.id, + }) + def action_generate_package(self): + self.ensure_one() + self.move_line_ids.unlink() + if self.has_tracking == 'none': + demand = self.product_uom_qty + correct_uom = self.product_id.uom_id.id + if not correct_uom: + raise ValueError(f"Product {self.product_id.name} does not have a valid UoM set!") + for _ in range(self.package_qty): + if demand <= 0: + break + package = self.env['stock.quant.package'].create({'name': f"{self.product_id.name} Package"}) + qty_to_pack = min(demand, self.package_size) + move_line = self.env['stock.move.line'].create({ + 'move_id': self.id, + 'result_package_id': package.id, + 'qty_done': qty_to_pack, + 'product_id': self.product_id.id, + 'product_uom_id': correct_uom, + }) + demand -= qty_to_pack + elif self.has_tracking=='lot': + correct_uom = self.product_id.uom_id.id + for line in self.move_line_ids: + lot_quantity = line.quantity + while lot_quantity: + package = self.env['stock.quant.package'].create({'name': f"{self.product_id.name} Package"}) + qty_to_pack = min(lot_quantity, self.package_size) + move_line = self.env['stock.move.line'].create({ + 'move_id': self.id, + 'lot_id': line.lot_id.id, + 'lot_name': line.lot_name, + 'result_package_id': package.id, + 'qty_done': qty_to_pack, + 'product_id': self.product_id.id, + 'product_uom_id': correct_uom, + }) + lot_quantity -= qty_to_pack diff --git a/put_in_pack_stock/models/stock_picking.py b/put_in_pack_stock/models/stock_picking.py new file mode 100644 index 00000000000..47ab5f5f9e2 --- /dev/null +++ b/put_in_pack_stock/models/stock_picking.py @@ -0,0 +1,16 @@ +from odoo import fields, models + + +class PickingType(models.Model): + _inherit = "stock.picking.type" + + put_in_pack_toggle = fields.Boolean( + string = "Put In Pack" + ) + +class Picking(models.Model): + _inherit = "stock.picking" + + put_in_pack_toggle = fields.Boolean( + related="picking_type_id.put_in_pack_toggle" + ) diff --git a/put_in_pack_stock/views/stock_move_views.xml b/put_in_pack_stock/views/stock_move_views.xml new file mode 100644 index 00000000000..895b8d9479e --- /dev/null +++ b/put_in_pack_stock/views/stock_move_views.xml @@ -0,0 +1,17 @@ + + + Detailed Operation Inherit + stock.move + + + + + + + +