From 5661cff1c415a3c53c0562487156e2c79f37562a Mon Sep 17 00:00:00 2001 From: majouda Date: Thu, 18 Apr 2024 17:12:06 -0400 Subject: [PATCH] TA#57380 [ADD] stock_picking_barcode --- .docker_files/main/__manifest__.py | 1 + Dockerfile | 1 + stock_picking_barcode/I18n/fr.po | 98 ++++++++++++++++++ stock_picking_barcode/README.rst | 18 ++++ stock_picking_barcode/__init__.py | 4 + stock_picking_barcode/__manifest__.py | 21 ++++ .../data/picking_barcodes_data.xml | 15 +++ stock_picking_barcode/models/__init__.py | 5 + stock_picking_barcode/models/stock_picking.py | 96 +++++++++++++++++ .../models/stock_picking_type.py | 26 +++++ .../static/description/icon.png | Bin 0 -> 7982 bytes .../views/stock_picking_type_view.xml | 23 ++++ .../views/stock_picking_view.xml | 20 ++++ 13 files changed, 328 insertions(+) create mode 100644 stock_picking_barcode/I18n/fr.po create mode 100644 stock_picking_barcode/README.rst create mode 100644 stock_picking_barcode/__init__.py create mode 100644 stock_picking_barcode/__manifest__.py create mode 100755 stock_picking_barcode/data/picking_barcodes_data.xml create mode 100644 stock_picking_barcode/models/__init__.py create mode 100644 stock_picking_barcode/models/stock_picking.py create mode 100644 stock_picking_barcode/models/stock_picking_type.py create mode 100644 stock_picking_barcode/static/description/icon.png create mode 100644 stock_picking_barcode/views/stock_picking_type_view.xml create mode 100644 stock_picking_barcode/views/stock_picking_view.xml diff --git a/.docker_files/main/__manifest__.py b/.docker_files/main/__manifest__.py index 80ceffd..a71cdfd 100644 --- a/.docker_files/main/__manifest__.py +++ b/.docker_files/main/__manifest__.py @@ -26,6 +26,7 @@ "stock_move_valuation_adjustment", "stock_orderpoint_scheduled_date", "stock_orderpoint_secondary_unit", + "stock_picking_barcode", "stock_picking_groupby_parent_affiliate", "stock_picking_responsible_editable", "stock_picking_secondary_unit_demand", diff --git a/Dockerfile b/Dockerfile index 2122dd5..346823f 100644 --- a/Dockerfile +++ b/Dockerfile @@ -33,6 +33,7 @@ COPY stock_move_origin_link /mnt/extra-addons/stock_move_origin_link COPY stock_move_valuation_adjustment /mnt/extra-addons/stock_move_valuation_adjustment COPY stock_orderpoint_scheduled_date /mnt/extra-addons/stock_orderpoint_scheduled_date COPY stock_orderpoint_secondary_unit /mnt/extra-addons/stock_orderpoint_secondary_unit +COPY stock_picking_barcode /mnt/extra-addons/stock_picking_barcode COPY stock_picking_groupby_parent_affiliate /mnt/extra-addons/stock_picking_groupby_parent_affiliate COPY stock_picking_responsible_editable /mnt/extra-addons/stock_picking_responsible_editable COPY stock_picking_secondary_unit_demand /mnt/extra-addons/stock_picking_secondary_unit_demand diff --git a/stock_picking_barcode/I18n/fr.po b/stock_picking_barcode/I18n/fr.po new file mode 100644 index 0000000..62ec72c --- /dev/null +++ b/stock_picking_barcode/I18n/fr.po @@ -0,0 +1,98 @@ +# Translation of Odoo Server. +# This file contains the translation of the following modules: +# * stock_picking_barcode +# +msgid "" +msgstr "" +"Project-Id-Version: Odoo Server 14.0+e\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2024-04-22 04:07+0000\n" +"PO-Revision-Date: 2024-04-22 04:07+0000\n" +"Last-Translator: \n" +"Language-Team: \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: \n" +"Plural-Forms: \n" + +#. module: stock_picking_barcode +#: model_terms:ir.ui.view,arch_db:stock_picking_barcode.stock_picking_type_view_form_inherit +msgid "Barcode" +msgstr "Code-barres" + +#. module: stock_picking_barcode +#: model:ir.model.fields,field_description:stock_picking_barcode.field_stock_picking___barcode_scanned +msgid "Barcode Scanned" +msgstr "Code-barres numérisé" + +#. module: stock_picking_barcode +#: model:ir.model.fields,field_description:stock_picking_barcode.field_stock_picking__display_name +#: model:ir.model.fields,field_description:stock_picking_barcode.field_stock_picking_type__display_name +msgid "Display Name" +msgstr "Nom d'affichage" + +#. module: stock_picking_barcode +#: model:ir.model.fields,field_description:stock_picking_barcode.field_stock_picking__id +#: model:ir.model.fields,field_description:stock_picking_barcode.field_stock_picking_type__id +msgid "ID" +msgstr "" + +#. module: stock_picking_barcode +#: model:ir.model.fields,field_description:stock_picking_barcode.field_stock_picking____last_update +#: model:ir.model.fields,field_description:stock_picking_barcode.field_stock_picking_type____last_update +msgid "Last Modified on" +msgstr "Dernière modification le" + +#. module: stock_picking_barcode +#: model:ir.model.fields,field_description:stock_picking_barcode.field_stock_picking_type__nomenclature_id +msgid "Nomenclature" +msgstr "Nomenclature" + +#. module: stock_picking_barcode +#: model:ir.model,name:stock_picking_barcode.model_stock_picking_type +msgid "Picking Type" +msgstr "Type de préparation" + +#. module: stock_picking_barcode +#: model:ir.model.fields,field_description:stock_picking_barcode.field_stock_picking__scan_barcode +#: model:ir.model.fields,field_description:stock_picking_barcode.field_stock_picking_type__scan_barcode +msgid "Scan from this Operation Type" +msgstr "Numériser depuis ce type d'opération" + +#. module: stock_picking_barcode +#: code:addons/stock_picking_barcode/models/stock_picking.py:0 +#, python-format +msgid "The barcode \"%(barcode)s\" doesn't correspond to a proper product." +msgstr "" + +#. module: stock_picking_barcode +#: model:ir.model.fields,help:stock_picking_barcode.field_stock_picking_type__nomenclature_id +msgid "" +"This field allows you to choose the Barcodes Nomenclature\n" +" to apply when scanning." +msgstr "" +"Ce champ vous permet de choisir la nomenclature des code-barres à appliquer lors de la numérisation." + +#. module: stock_picking_barcode +#: model:ir.model,name:stock_picking_barcode.model_stock_picking +msgid "Transfer" +msgstr "Transfert" + +#. module: stock_picking_barcode +#: model:ir.model.fields,help:stock_picking_barcode.field_stock_picking___barcode_scanned +msgid "Value of the last barcode scanned." +msgstr "Valeur du dernier code-barres scanné." + +#. module: stock_picking_barcode +#: model:ir.model.fields,help:stock_picking_barcode.field_stock_picking__scan_barcode +#: model:ir.model.fields,help:stock_picking_barcode.field_stock_picking_type__scan_barcode +msgid "" +"When this box is checked, a new “Scan” field is displayed on\n" +" transfers of this type of operation to allow scanning of a barcode." +msgstr "Lorsque cette case est cochée, un nouveau champ “Numériser” est affiché sur les transferts de ce type d’opération afin de permettre de numériser un code-barres." + +#. module: stock_picking_barcode +#: code:addons/stock_picking_barcode/models/stock_picking.py:0 +#, python-format +msgid "Wrong barcode" +msgstr "Mauvais code-barres." diff --git a/stock_picking_barcode/README.rst b/stock_picking_barcode/README.rst new file mode 100644 index 0000000..99c0d14 --- /dev/null +++ b/stock_picking_barcode/README.rst @@ -0,0 +1,18 @@ +Stock Picking Barcode +===================== + +Context +------- +The module allows scanning a barcode by type of operation. + +Description +----------- + +This module allows, when the user scans a product, to find a candidate movement line (or create one if necessary) +and process it by incrementing its 'Done' field. +In this case, we will use a nomenclature with a rule of type 'Weighed Item' +and the barcode model should look like this: `.......{NNDDD}` + +Contributors +------------ +* Numigi (tm) and all its contributors (https://bit.ly/numigiens) diff --git a/stock_picking_barcode/__init__.py b/stock_picking_barcode/__init__.py new file mode 100644 index 0000000..bd036d3 --- /dev/null +++ b/stock_picking_barcode/__init__.py @@ -0,0 +1,4 @@ +# © 2024 Numigi (tm) and all its contributors (https://bit.ly/numigiens) +# License LGPL-3.0 or later (http://www.gnu.org/licenses/lgpl). + +from . import models diff --git a/stock_picking_barcode/__manifest__.py b/stock_picking_barcode/__manifest__.py new file mode 100644 index 0000000..efb2c05 --- /dev/null +++ b/stock_picking_barcode/__manifest__.py @@ -0,0 +1,21 @@ +# © 2024 Numigi (tm) and all its contributors (https://bit.ly/numigiens) +# License LGPL-3.0 or later (http://www.gnu.org/licenses/lgpl). + +{ + "name": "Stock Picking Barcode", + "version": "14.0.1.0.0", + "author": "Numigi", + "maintainer": "Numigi", + "website": "https://bit.ly/numigi-com", + "license": "LGPL-3", + "category": "Product", + "summary": "Scan a barcode by picking", + "depends": ["stock", "barcodes"], + "data": [ + "data/picking_barcodes_data.xml", + "views/stock_picking_view.xml", + "views/stock_picking_type_view.xml", + ], + "installable": True, + "application": False, +} diff --git a/stock_picking_barcode/data/picking_barcodes_data.xml b/stock_picking_barcode/data/picking_barcodes_data.xml new file mode 100755 index 0000000..b87d9c6 --- /dev/null +++ b/stock_picking_barcode/data/picking_barcodes_data.xml @@ -0,0 +1,15 @@ + + + + Operations/ Detailed Operations + + + + Product Weight + + 10 + weight + any + .....{NNNDD} + + diff --git a/stock_picking_barcode/models/__init__.py b/stock_picking_barcode/models/__init__.py new file mode 100644 index 0000000..2d9ccd6 --- /dev/null +++ b/stock_picking_barcode/models/__init__.py @@ -0,0 +1,5 @@ +# © 2024 Numigi (tm) and all its contributors (https://bit.ly/numigiens) +# License LGPL-3.0 or later (http://www.gnu.org/licenses/lgpl). + +from . import stock_picking +from . import stock_picking_type diff --git a/stock_picking_barcode/models/stock_picking.py b/stock_picking_barcode/models/stock_picking.py new file mode 100644 index 0000000..963f05a --- /dev/null +++ b/stock_picking_barcode/models/stock_picking.py @@ -0,0 +1,96 @@ +# © 2024 Numigi (tm) and all its contributors (https://bit.ly/numigiens) +# License LGPL-3.0 or later (http://www.gnu.org/licenses/lgpl). +from odoo import models, fields, _ + + +class StockPicking(models.Model): + _name = "stock.picking" + _inherit = ["stock.picking", "barcodes.barcode_events_mixin"] + + scan_barcode = fields.Boolean( + string="Scan from this Operation Type", + related="picking_type_id.scan_barcode" + ) + + def on_barcode_scanned(self, barcode): + if not self.scan_barcode or not self.picking_type_id.nomenclature_id: + return + else: + parsed_result = self.picking_type_id.nomenclature_id.parse_barcode(barcode) + if parsed_result["type"] in ["weight", "product"]: + if parsed_result["type"] == "weight": + product_barcode = parsed_result["base_code"] + qty = parsed_result["value"] + else: # product + product_barcode = parsed_result["code"] + qty = 1.0 + product = self.env["product.product"].search( + [ + "|", + ("barcode", "=", product_barcode), + ("default_code", "=", product_barcode), + ], + limit=1, + ) + if product: + if self._check_product(product, qty): + return + return { + "warning": { + "title": _("Wrong barcode"), + "message": _( + 'The barcode "%(barcode)s" doesn\'t correspond to a proper product.' + ) + % {"barcode": barcode}, + } + } + + def _check_product(self, product, qty=1.0): + """ This method is called when the user scans a product. Its goal + is to find a candidate move line (or create one, if necessary) + and process it by incrementing its `qty_done` field with the + `qty` parameter. + """ + # Get back the move line to increase. If multiple are found, chose + # arbitrary the first one that doesn't have qty_done set. + # Filter out the ones processed by `_check_location` and the ones already + # having a # destination package. + picking_move_lines = self.move_line_ids_without_package + if not self.show_reserved: + picking_move_lines = self.move_line_nosuggest_ids + + corresponding_ml = picking_move_lines.filtered( + lambda ml: ml.product_id.id == product.id + and not ml.result_package_id + and not ml.lots_visible + and not ml.qty_done + )[:1] + if corresponding_ml: + corresponding_ml.qty_done += qty + else: + # If a candidate is not found, we create one here. If the move + # line we add here is linked to a tracked product, we don't + # set a `qty_done`: a next scan of this product will open the + # lots wizard. + picking_type_lots = ( + self.picking_type_id.use_create_lots + or self.picking_type_id.use_existing_lots + ) + new_move_line = self.move_line_ids.new( + { + "product_id": product.id, + "product_uom_id": product.uom_id.id, + "location_id": self.location_id.id, + "location_dest_id": self.location_dest_id.id, + "qty_done": (product.tracking == "none" and picking_type_lots) + and qty + or 0.0, + "product_uom_qty": 0.0, + "date": fields.datetime.now(), + } + ) + if self.show_reserved: + self.move_line_ids_without_package += new_move_line + else: + self.move_line_nosuggest_ids += new_move_line + return True diff --git a/stock_picking_barcode/models/stock_picking_type.py b/stock_picking_barcode/models/stock_picking_type.py new file mode 100644 index 0000000..a2a2edd --- /dev/null +++ b/stock_picking_barcode/models/stock_picking_type.py @@ -0,0 +1,26 @@ +# © 2024 Numigi (tm) and all its contributors (https://bit.ly/numigiens) +# License LGPL-3.0 or later (http://www.gnu.org/licenses/lgpl). +from odoo import models, fields + + +class StockPickingType(models.Model): + _inherit = "stock.picking.type" + + def _get_default_nomenclature(self): + return self.env.ref( + "stock_picking_barcode.picking_barcode_nomenclature", + raise_if_not_found=False + ) + + scan_barcode = fields.Boolean( + string="Scan from this Operation Type", + help="""When this box is checked, a new “Scan” field is displayed on + transfers of this type of operation to allow scanning of a barcode.""", + ) + nomenclature_id = fields.Many2one( + "barcode.nomenclature", + string="Nomenclature", + default=_get_default_nomenclature, + help="""This field allows you to choose the Barcodes Nomenclature + to apply when scanning.""", + ) diff --git a/stock_picking_barcode/static/description/icon.png b/stock_picking_barcode/static/description/icon.png new file mode 100644 index 0000000000000000000000000000000000000000..92a86b10ed6e2f6a40b286805c8c92c5dc775111 GIT binary patch literal 7982 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 + + + + Stock Picking Type Form: Scan Barcode + stock.picking.type + + + + + + + + + + + + + + diff --git a/stock_picking_barcode/views/stock_picking_view.xml b/stock_picking_barcode/views/stock_picking_view.xml new file mode 100644 index 0000000..30afec5 --- /dev/null +++ b/stock_picking_barcode/views/stock_picking_view.xml @@ -0,0 +1,20 @@ + + + + + Stock Picking Form: Barcode + stock.picking + + + + + + + + + +