From 673f3ed584625b13a71436026e3f119f26fb0232 Mon Sep 17 00:00:00 2001 From: oca-travis Date: Wed, 7 Aug 2019 07:08:02 +0000 Subject: [PATCH 01/19] [ADD] stock_barcodes_gs1: Add support to stock_barcodes module to read GS1 barcodes --- stock_barcodes_gs1/README.rst | 85 ++++ stock_barcodes_gs1/__init__.py | 3 + stock_barcodes_gs1/__manifest__.py | 17 + stock_barcodes_gs1/i18n/es.po | 61 +++ .../i18n/stock_barcodes_gs1.pot | 55 +++ stock_barcodes_gs1/readme/CONTRIBUTORS.rst | 6 + stock_barcodes_gs1/readme/DESCRIPTION.rst | 3 + stock_barcodes_gs1/readme/USAGE.rst | 1 + .../static/description/icon.png | Bin 0 -> 9455 bytes .../static/description/index.html | 430 ++++++++++++++++++ stock_barcodes_gs1/tests/__init__.py | 3 + .../tests/test_stock_barcodes_gs1.py | 85 ++++ .../tests/test_stock_barcodes_new_lot_gs1.py | 30 ++ stock_barcodes_gs1/wizard/__init__.py | 4 + .../wizard/stock_barcodes_read.py | 77 ++++ .../wizard/stock_production_lot.py | 35 ++ 16 files changed, 895 insertions(+) create mode 100644 stock_barcodes_gs1/README.rst create mode 100644 stock_barcodes_gs1/__init__.py create mode 100644 stock_barcodes_gs1/__manifest__.py create mode 100644 stock_barcodes_gs1/i18n/es.po create mode 100644 stock_barcodes_gs1/i18n/stock_barcodes_gs1.pot create mode 100644 stock_barcodes_gs1/readme/CONTRIBUTORS.rst create mode 100644 stock_barcodes_gs1/readme/DESCRIPTION.rst create mode 100644 stock_barcodes_gs1/readme/USAGE.rst create mode 100644 stock_barcodes_gs1/static/description/icon.png create mode 100644 stock_barcodes_gs1/static/description/index.html create mode 100644 stock_barcodes_gs1/tests/__init__.py create mode 100644 stock_barcodes_gs1/tests/test_stock_barcodes_gs1.py create mode 100644 stock_barcodes_gs1/tests/test_stock_barcodes_new_lot_gs1.py create mode 100644 stock_barcodes_gs1/wizard/__init__.py create mode 100644 stock_barcodes_gs1/wizard/stock_barcodes_read.py create mode 100644 stock_barcodes_gs1/wizard/stock_production_lot.py diff --git a/stock_barcodes_gs1/README.rst b/stock_barcodes_gs1/README.rst new file mode 100644 index 000000000000..12cbc2707d1c --- /dev/null +++ b/stock_barcodes_gs1/README.rst @@ -0,0 +1,85 @@ +================== +Stock Barcodes GS1 +================== + +.. !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! + !! This file is generated by oca-gen-addon-readme !! + !! changes will be overwritten. !! + !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! + +.. |badge1| image:: https://img.shields.io/badge/maturity-Beta-yellow.png + :target: https://odoo-community.org/page/development-status + :alt: Beta +.. |badge2| image:: https://img.shields.io/badge/licence-AGPL--3-blue.png + :target: http://www.gnu.org/licenses/agpl-3.0-standalone.html + :alt: License: AGPL-3 +.. |badge3| image:: https://img.shields.io/badge/github-OCA%2Fstock--logistics--barcode-lightgray.png?logo=github + :target: https://github.com/OCA/stock-logistics-barcode/tree/11.0/stock_barcodes_gs1 + :alt: OCA/stock-logistics-barcode +.. |badge4| image:: https://img.shields.io/badge/weblate-Translate%20me-F47D42.png + :target: https://translation.odoo-community.org/projects/stock-logistics-barcode-11-0/stock-logistics-barcode-11-0-stock_barcodes_gs1 + :alt: Translate me on Weblate +.. |badge5| image:: https://img.shields.io/badge/runbot-Try%20me-875A7B.png + :target: https://runbot.odoo-community.org/runbot/150/11.0 + :alt: Try me on Runbot + +|badge1| |badge2| |badge3| |badge4| |badge5| + +This module extends barcode reader interface to allow to read GS1 barcodes. + +The AI's implemented are 01(Group), 02(Product), 37(Quantity) and 10(Lots). + +**Table of contents** + +.. contents:: + :local: + +Usage +===== + +Read usage section from stock_barcodes module. + +Bug Tracker +=========== + +Bugs are tracked on `GitHub Issues `_. +In case of trouble, please check there if your issue has already been reported. +If you spotted it first, help us smashing it by providing a detailed and welcomed +`feedback `_. + +Do not contact contributors directly about support or help with technical issues. + +Credits +======= + +Authors +~~~~~~~ + +* Tecnativa + +Contributors +~~~~~~~~~~~~ + + +* `Tecnativa `_: + + * Sergio Teruel + * Carlos Dauden + * Pedro M. Baeza + +Maintainers +~~~~~~~~~~~ + +This module is maintained by the OCA. + +.. image:: https://odoo-community.org/logo.png + :alt: Odoo Community Association + :target: https://odoo-community.org + +OCA, or the Odoo Community Association, is a nonprofit organization whose +mission is to support the collaborative development of Odoo features and +promote its widespread use. + +This module is part of the `OCA/stock-logistics-barcode `_ project on GitHub. + +You are welcome to contribute. To learn how please visit https://odoo-community.org/page/Contribute. diff --git a/stock_barcodes_gs1/__init__.py b/stock_barcodes_gs1/__init__.py new file mode 100644 index 000000000000..ec87b80cddd4 --- /dev/null +++ b/stock_barcodes_gs1/__init__.py @@ -0,0 +1,3 @@ +# Copyright 2019 Sergio Teruel +# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl.html). +from . import wizard diff --git a/stock_barcodes_gs1/__manifest__.py b/stock_barcodes_gs1/__manifest__.py new file mode 100644 index 000000000000..b19f4a63a2dd --- /dev/null +++ b/stock_barcodes_gs1/__manifest__.py @@ -0,0 +1,17 @@ +# Copyright 2019 Sergio Teruel +# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl.html). +{ + "name": "Stock Barcodes GS1", + "summary": "It provides read GS1 barcode on stock operations.", + "version": "11.0.1.0.0", + "author": "Tecnativa, " + "Odoo Community Association (OCA)", + "website": "https://odoo-community.org/", + "license": "AGPL-3", + "category": "Extra Tools", + "depends": [ + 'stock_barcodes', + 'base_gs1_barcode', + ], + 'installable': True, +} diff --git a/stock_barcodes_gs1/i18n/es.po b/stock_barcodes_gs1/i18n/es.po new file mode 100644 index 000000000000..beea65190087 --- /dev/null +++ b/stock_barcodes_gs1/i18n/es.po @@ -0,0 +1,61 @@ +# Translation of Odoo Server. +# This file contains the translation of the following modules: +# * stock_barcodes_gs1 +# +msgid "" +msgstr "" +"Project-Id-Version: Odoo Server 11.0\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2019-08-27 14:47+0000\n" +"PO-Revision-Date: 2019-08-27 16:48+0200\n" +"Last-Translator: \n" +"Language-Team: \n" +"Language: es\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" +"X-Generator: Poedit 2.0.6\n" + +#. module: stock_barcodes_gs1 +#: code:addons/stock_barcodes_gs1/wizard/stock_barcodes_read.py:48 +#, python-format +msgid "Barcode for product not found" +msgstr "Código de barras no encontrado" + +#. module: stock_barcodes_gs1 +#: code:addons/stock_barcodes_gs1/wizard/stock_barcodes_read.py:58 +#, python-format +msgid "Barcode for product packaging not found" +msgstr "Código de barras de empaquetado no encontrado" + +#. module: stock_barcodes_gs1 +#: code:addons/stock_barcodes_gs1/wizard/stock_barcodes_read.py:76 +#, python-format +msgid "Barcode not found" +msgstr "Código de barras no encontrado" + +#. module: stock_barcodes_gs1 +#: code:addons/stock_barcodes_gs1/wizard/stock_barcodes_read.py:74 +#, python-format +msgid "Barcode read correctly" +msgstr "Código de barras leído correctamente" + +#. module: stock_barcodes_gs1 +#: code:addons/stock_barcodes_gs1/wizard/stock_barcodes_read.py:63 +#, python-format +msgid "More than one package found" +msgstr "Se ha encontrado más de un empaquetado." + +#. module: stock_barcodes_gs1 +#: model:ir.model,name:stock_barcodes_gs1.model_wiz_stock_barcodes_new_lot +msgid "Wizard to create new lot from barcode scanner" +msgstr "Asistente para crear nuevo lote desde el lector de códigos de barras" + +#. module: stock_barcodes_gs1 +#: model:ir.model,name:stock_barcodes_gs1.model_wiz_stock_barcodes_read +msgid "Wizard to read barcode" +msgstr "Asistente para leer código de barras" + +#~ msgid "More than one product found" +#~ msgstr "Se ha encontrado más de un producto." diff --git a/stock_barcodes_gs1/i18n/stock_barcodes_gs1.pot b/stock_barcodes_gs1/i18n/stock_barcodes_gs1.pot new file mode 100644 index 000000000000..e09dac434fea --- /dev/null +++ b/stock_barcodes_gs1/i18n/stock_barcodes_gs1.pot @@ -0,0 +1,55 @@ +# Translation of Odoo Server. +# This file contains the translation of the following modules: +# * stock_barcodes_gs1 +# +msgid "" +msgstr "" +"Project-Id-Version: Odoo Server 11.0\n" +"Report-Msgid-Bugs-To: \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_barcodes_gs1 +#: code:addons/stock_barcodes_gs1/wizard/stock_barcodes_read.py:48 +#, python-format +msgid "Barcode for product not found" +msgstr "" + +#. module: stock_barcodes_gs1 +#: code:addons/stock_barcodes_gs1/wizard/stock_barcodes_read.py:58 +#, python-format +msgid "Barcode for product packaging not found" +msgstr "" + +#. module: stock_barcodes_gs1 +#: code:addons/stock_barcodes_gs1/wizard/stock_barcodes_read.py:76 +#, python-format +msgid "Barcode not found" +msgstr "" + +#. module: stock_barcodes_gs1 +#: code:addons/stock_barcodes_gs1/wizard/stock_barcodes_read.py:74 +#, python-format +msgid "Barcode read correctly" +msgstr "" + +#. module: stock_barcodes_gs1 +#: code:addons/stock_barcodes_gs1/wizard/stock_barcodes_read.py:63 +#, python-format +msgid "More than one package found" +msgstr "" + +#. module: stock_barcodes_gs1 +#: model:ir.model,name:stock_barcodes_gs1.model_wiz_stock_barcodes_new_lot +msgid "Wizard to create new lot from barcode scanner" +msgstr "" + +#. module: stock_barcodes_gs1 +#: model:ir.model,name:stock_barcodes_gs1.model_wiz_stock_barcodes_read +msgid "Wizard to read barcode" +msgstr "" + diff --git a/stock_barcodes_gs1/readme/CONTRIBUTORS.rst b/stock_barcodes_gs1/readme/CONTRIBUTORS.rst new file mode 100644 index 000000000000..7ba43eb43fcb --- /dev/null +++ b/stock_barcodes_gs1/readme/CONTRIBUTORS.rst @@ -0,0 +1,6 @@ + +* `Tecnativa `_: + + * Sergio Teruel + * Carlos Dauden + * Pedro M. Baeza diff --git a/stock_barcodes_gs1/readme/DESCRIPTION.rst b/stock_barcodes_gs1/readme/DESCRIPTION.rst new file mode 100644 index 000000000000..01eb26f73c42 --- /dev/null +++ b/stock_barcodes_gs1/readme/DESCRIPTION.rst @@ -0,0 +1,3 @@ +This module extends barcode reader interface to allow to read GS1 barcodes. + +The AI's implemented are 01(Group), 02(Product), 37(Quantity) and 10(Lots). diff --git a/stock_barcodes_gs1/readme/USAGE.rst b/stock_barcodes_gs1/readme/USAGE.rst new file mode 100644 index 000000000000..b0b4bac558c0 --- /dev/null +++ b/stock_barcodes_gs1/readme/USAGE.rst @@ -0,0 +1 @@ +Read usage section from stock_barcodes module. diff --git a/stock_barcodes_gs1/static/description/icon.png b/stock_barcodes_gs1/static/description/icon.png new file mode 100644 index 0000000000000000000000000000000000000000..3a0328b516c4980e8e44cdb63fd945757ddd132d GIT binary patch literal 9455 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 z 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 Xviia!U7SGha1wx#SCgwmn*{w2TRX*I literal 0 HcmV?d00001 diff --git a/stock_barcodes_gs1/static/description/index.html b/stock_barcodes_gs1/static/description/index.html new file mode 100644 index 000000000000..ba1a893dda5d --- /dev/null +++ b/stock_barcodes_gs1/static/description/index.html @@ -0,0 +1,430 @@ + + + + + + +Stock Barcodes GS1 + + + +
+

Stock Barcodes GS1

+ + +

Beta License: AGPL-3 OCA/stock-logistics-barcode Translate me on Weblate Try me on Runbot

+

This module extends barcode reader interface to allow to read GS1 barcodes.

+

The AI’s implemented are 01(Group), 02(Product), 37(Quantity) and 10(Lots).

+

Table of contents

+ +
+

Usage

+

Read usage section from stock_barcodes module.

+
+
+

Bug Tracker

+

Bugs are tracked on GitHub Issues. +In case of trouble, please check there if your issue has already been reported. +If you spotted it first, help us smashing it by providing a detailed and welcomed +feedback.

+

Do not contact contributors directly about support or help with technical issues.

+
+
+

Credits

+
+

Authors

+
    +
  • Tecnativa
  • +
+
+
+

Contributors

+
    +
  • Tecnativa:
      +
    • Sergio Teruel
    • +
    • Carlos Dauden
    • +
    • Pedro M. Baeza
    • +
    +
  • +
+
+
+

Maintainers

+

This module is maintained by the OCA.

+Odoo Community Association +

OCA, or the Odoo Community Association, is a nonprofit organization whose +mission is to support the collaborative development of Odoo features and +promote its widespread use.

+

This module is part of the OCA/stock-logistics-barcode project on GitHub.

+

You are welcome to contribute. To learn how please visit https://odoo-community.org/page/Contribute.

+
+
+
+ + diff --git a/stock_barcodes_gs1/tests/__init__.py b/stock_barcodes_gs1/tests/__init__.py new file mode 100644 index 000000000000..b9b522c53541 --- /dev/null +++ b/stock_barcodes_gs1/tests/__init__.py @@ -0,0 +1,3 @@ +# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl). +from . import test_stock_barcodes_gs1 +from . import test_stock_barcodes_new_lot_gs1 diff --git a/stock_barcodes_gs1/tests/test_stock_barcodes_gs1.py b/stock_barcodes_gs1/tests/test_stock_barcodes_gs1.py new file mode 100644 index 000000000000..22890ee7d174 --- /dev/null +++ b/stock_barcodes_gs1/tests/test_stock_barcodes_gs1.py @@ -0,0 +1,85 @@ +# Copyright 2108-2019 Sergio Teruel +# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl). + +from odoo.addons.stock_barcodes.tests.\ + test_stock_barcodes import TestStockBarcodes + + +class TestStockBarcodesGS1(TestStockBarcodes): + + def setUp(self): + super().setUp() + # Barcode for packaging and lot + self.gs1_barcode_01 = '01195011015300001714070410AB-123' + self.gs1_barcode_01_not_found = '011xxx11015300001714070410AB-123' + self.gs1_barcode_01_not_lot = '01195011015300001714070410AB-124' + # Barcode for product and quantities + self.gs1_barcode_02 = '0207010001234567150410183724' + self.gs1_barcode_02_not_found = '020xxx0001234567150410183724' + # Barcode not processed + self.gs1_barcode_01_not_processed = '01993167101234533101002620130' \ + '5041710ABC123214145354' + + self.product_wo_tracking_gs1 = self.product_wo_tracking.copy({ + 'barcode': '07010001234567', + }) + self.product_tracking_gs1 = self.product_tracking.copy() + self.packaging_gs1 = self.ProductPackaging.create({ + 'product_id': self.product_wo_tracking_gs1.id, + 'name': 'Box 10 Units', + 'qty': 10.0, + 'barcode': '19501101530000', + }) + + def test_wizard_scan_gs1_package(self): + self.action_barcode_scanned(self.wiz_scan, self.gs1_barcode_01) + self.assertEqual(self.wiz_scan.packaging_id, self.packaging_gs1) + # Scan no exist packaging + self.action_barcode_scanned( + self.wiz_scan, self.gs1_barcode_01_not_found) + self.assertEqual(self.wiz_scan.message, + 'Barcode: 011xxx11015300001714070410AB-123 ' + '(Barcode for product packaging not found)') + # Scan packaging barcode with more than one package + self.packaging_gs1.copy({ + 'barcode': '19501101530000', + }) + self.action_barcode_scanned( + self.wiz_scan, self.gs1_barcode_01) + self.assertEqual(self.wiz_scan.message, + 'Barcode: 01195011015300001714070410AB-123 ' + '(More than one package found)') + + def test_wizard_scan_gs1_product(self): + self.action_barcode_scanned(self.wiz_scan, self.gs1_barcode_02) + self.assertEqual( + self.wiz_scan.product_id, self.product_wo_tracking_gs1) + self.assertEqual(self.wiz_scan.product_qty, 24) + # Scan non exists product + self.action_barcode_scanned( + self.wiz_scan, self.gs1_barcode_02_not_found) + self.assertEqual(self.wiz_scan.message, + 'Barcode: 020xxx0001234567150410183724 ' + '(Barcode for product not found)') + + def test_wizard_scan_gs1_lot(self): + self.packaging_gs1.product_id = self.product_tracking_gs1 + lot = self.StockProductionLot.create({ + 'name': 'AB-123', + 'product_id': self.product_tracking_gs1.id, + }) + self.action_barcode_scanned(self.wiz_scan, self.gs1_barcode_01) + self.assertEqual(self.wiz_scan.lot_id, lot) + self.assertEqual(self.wiz_scan.message, + 'Barcode: 01195011015300001714070410AB-123 ' + '(Barcode read correctly)') + self.action_barcode_scanned(self.wiz_scan, self.gs1_barcode_01_not_lot) + self.assertEqual(self.wiz_scan.lot_id.name, 'AB-124') + + def test_wizard_scan_gs1_not_found(self): + self.action_barcode_scanned( + self.wiz_scan, self.gs1_barcode_01_not_processed) + self.assertEqual(self.wiz_scan.message, + 'Barcode: 0199316710123453310100262013050417' + '10ABC123214145354 (Barcode for product packaging ' + 'not found)') diff --git a/stock_barcodes_gs1/tests/test_stock_barcodes_new_lot_gs1.py b/stock_barcodes_gs1/tests/test_stock_barcodes_new_lot_gs1.py new file mode 100644 index 000000000000..0f528f8e3e0d --- /dev/null +++ b/stock_barcodes_gs1/tests/test_stock_barcodes_new_lot_gs1.py @@ -0,0 +1,30 @@ +# Copyright 2108-2019 Sergio Teruel +# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl). +from odoo.addons.stock_barcodes_gs1.tests.test_stock_barcodes_gs1 import\ + TestStockBarcodesGS1 + + +class TestStockBarcodesNewLotGS1(TestStockBarcodesGS1): + + def setUp(self): + super().setUp() + self.ScanReadLot = self.env['wiz.stock.barcodes.new.lot'] + self.wiz_scan_lot = self.ScanReadLot.new() + self.gs1_barcode_02_10 = '02174512345678911718112510AAA2701370150' + + def test_new_lot_gs1_package(self): + self.action_barcode_scanned(self.wiz_scan_lot, self.gs1_barcode_01) + self.assertEqual( + self.wiz_scan_lot.product_id, self.product_wo_tracking_gs1) + self.assertEqual(self.wiz_scan_lot.lot_name, 'AB-123') + + def test_new_lot_gs1_product(self): + self.product_tracking_gs1.barcode = '17451234567891' + self.action_barcode_scanned(self.wiz_scan_lot, self.gs1_barcode_02_10) + self.assertEqual( + self.wiz_scan_lot.product_id, self.product_tracking_gs1) + self.assertEqual(self.wiz_scan_lot.lot_name, 'AAA2701370150') + + def test_new_lot_gs1_no_lot(self): + self.action_barcode_scanned(self.wiz_scan_lot, self.gs1_barcode_02) + self.assertFalse(self.wiz_scan_lot.product_id) diff --git a/stock_barcodes_gs1/wizard/__init__.py b/stock_barcodes_gs1/wizard/__init__.py new file mode 100644 index 000000000000..4f764e17dfba --- /dev/null +++ b/stock_barcodes_gs1/wizard/__init__.py @@ -0,0 +1,4 @@ +# Copyright 2019 Sergio Teruel +# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl.html). +from . import stock_barcodes_read +from . import stock_production_lot diff --git a/stock_barcodes_gs1/wizard/stock_barcodes_read.py b/stock_barcodes_gs1/wizard/stock_barcodes_read.py new file mode 100644 index 000000000000..4a44751e88fd --- /dev/null +++ b/stock_barcodes_gs1/wizard/stock_barcodes_read.py @@ -0,0 +1,77 @@ +# Copyright 2019 Sergio Teruel +# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl.html). +from odoo import _, models + + +class WizStockBarcodesRead(models.AbstractModel): + _inherit = 'wiz.stock.barcodes.read' + + def _prepare_lot_values(self, barcode_decoded): + lot_barcode = barcode_decoded.get('10', False) + return { + 'name': lot_barcode, + 'product_id': self.product_id.id, + } + + def _create_lot(self, barcode_decoded): + return self.env['stock.production.lot'].create( + self._prepare_lot_values(barcode_decoded)) + + def process_lot(self, barcode_decoded): + lot_barcode = barcode_decoded.get('10', False) + lot = self.env['stock.production.lot'].search([ + ('name', '=', lot_barcode), + ('product_id', '=', self.product_id.id), + ]) + if not lot: + lot = self._create_lot(barcode_decoded) + self.lot_id = lot + + def process_barcode(self, barcode): + """ Only has been implemented AI (01, 02, 10, 37), so is possible that + scanner reads a barcode ok but this one is not precessed. + """ + try: + barcode_decoded = self.env['gs1_barcode'].decode(barcode) + except Exception: + return super().process_barcode(barcode) + processed = False + package_barcode = barcode_decoded.get('01', False) + product_barcode = barcode_decoded.get('02', False) + lot_barcode = barcode_decoded.get('10', False) + product_qty = barcode_decoded.get('37', False) + if product_barcode: + product = self.env['product.product'].search( + self._barcode_domain(product_barcode)) + if not product: + self._set_messagge_info( + 'not_found', _('Barcode for product not found')) + return False + else: + processed = True + self.action_product_scaned_post(product) + if package_barcode: + packaging = self.env['product.packaging'].search( + self._barcode_domain(package_barcode)) + if not packaging: + self._set_messagge_info( + 'not_found', _('Barcode for product packaging not found')) + return False + else: + if len(packaging) > 1: + self._set_messagge_info( + 'more_match', _('More than one package found')) + return False + processed = True + self.action_packaging_scaned_post(packaging) + if lot_barcode and self.product_id.tracking != 'none': + self.process_lot(barcode_decoded) + processed = True + if product_qty: + self.product_qty = product_qty + if processed: + self.action_done() + self._set_messagge_info('success', _('Barcode read correctly')) + return True + self._set_messagge_info('not_found', _('Barcode not found')) + return False diff --git a/stock_barcodes_gs1/wizard/stock_production_lot.py b/stock_barcodes_gs1/wizard/stock_production_lot.py new file mode 100644 index 000000000000..a080c392ac32 --- /dev/null +++ b/stock_barcodes_gs1/wizard/stock_production_lot.py @@ -0,0 +1,35 @@ +# Copyright 2019 Sergio Teruel +# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl.html). +from odoo import models + + +class WizStockBarcodesNewLot(models.TransientModel): + _inherit = 'wiz.stock.barcodes.new.lot' + _description = 'Wizard to create new lot from barcode scanner' + + def _decode_barcode(self, barcode): + return self.env['gs1_barcode'].decode(barcode) + + def on_barcode_scanned(self, barcode): + try: + barcode_decoded = self._decode_barcode(barcode) + except Exception: + return super().on_barcode_scanned(barcode) + package_barcode = barcode_decoded.get('01', False) + product_barcode = barcode_decoded.get('02', False) + lot_barcode = barcode_decoded.get('10', False) + if not lot_barcode: + return + if package_barcode: + packaging = self.env['product.packaging'].search([ + ('barcode', '=', package_barcode), + ]) + if packaging: + self.product_id = packaging.product_id + elif product_barcode: + product = self.env['product.product'].search([ + ('barcode', '=', product_barcode), + ]) + if product: + self.product_id = product + self.lot_name = lot_barcode From 7d4a52d8eff9c46ff08c387daca16b47625a906b Mon Sep 17 00:00:00 2001 From: Jordi Ballester Alomar Date: Thu, 14 Nov 2019 18:53:34 +0100 Subject: [PATCH 02/19] Sometimes the product does not yet have a GTIN. In this case try the AI 240 'Additional product identification assigned by the manufacturer' --- stock_barcodes_gs1/wizard/stock_barcodes_read.py | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/stock_barcodes_gs1/wizard/stock_barcodes_read.py b/stock_barcodes_gs1/wizard/stock_barcodes_read.py index 4a44751e88fd..58cde49bb748 100644 --- a/stock_barcodes_gs1/wizard/stock_barcodes_read.py +++ b/stock_barcodes_gs1/wizard/stock_barcodes_read.py @@ -38,6 +38,11 @@ def process_barcode(self, barcode): processed = False package_barcode = barcode_decoded.get('01', False) product_barcode = barcode_decoded.get('02', False) + if not product_barcode: + # Sometimes the product does not yet have a GTIN. In this case + # try the AI 240 'Additional product identification assigned + # by the manufacturer'. + product_barcode = barcode_decoded.get('240', False) lot_barcode = barcode_decoded.get('10', False) product_qty = barcode_decoded.get('37', False) if product_barcode: From 6e83db00957dcf4f49fa6b48402d3f68aec679fd Mon Sep 17 00:00:00 2001 From: oca-travis Date: Mon, 25 Nov 2019 11:30:48 +0000 Subject: [PATCH 03/19] [UPD] Update stock_barcodes_gs1.pot --- stock_barcodes_gs1/i18n/stock_barcodes_gs1.pot | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/stock_barcodes_gs1/i18n/stock_barcodes_gs1.pot b/stock_barcodes_gs1/i18n/stock_barcodes_gs1.pot index e09dac434fea..f22aab41030b 100644 --- a/stock_barcodes_gs1/i18n/stock_barcodes_gs1.pot +++ b/stock_barcodes_gs1/i18n/stock_barcodes_gs1.pot @@ -14,31 +14,31 @@ msgstr "" "Plural-Forms: \n" #. module: stock_barcodes_gs1 -#: code:addons/stock_barcodes_gs1/wizard/stock_barcodes_read.py:48 +#: code:addons/stock_barcodes_gs1/wizard/stock_barcodes_read.py:53 #, python-format msgid "Barcode for product not found" msgstr "" #. module: stock_barcodes_gs1 -#: code:addons/stock_barcodes_gs1/wizard/stock_barcodes_read.py:58 +#: code:addons/stock_barcodes_gs1/wizard/stock_barcodes_read.py:63 #, python-format msgid "Barcode for product packaging not found" msgstr "" #. module: stock_barcodes_gs1 -#: code:addons/stock_barcodes_gs1/wizard/stock_barcodes_read.py:76 +#: code:addons/stock_barcodes_gs1/wizard/stock_barcodes_read.py:81 #, python-format msgid "Barcode not found" msgstr "" #. module: stock_barcodes_gs1 -#: code:addons/stock_barcodes_gs1/wizard/stock_barcodes_read.py:74 +#: code:addons/stock_barcodes_gs1/wizard/stock_barcodes_read.py:79 #, python-format msgid "Barcode read correctly" msgstr "" #. module: stock_barcodes_gs1 -#: code:addons/stock_barcodes_gs1/wizard/stock_barcodes_read.py:63 +#: code:addons/stock_barcodes_gs1/wizard/stock_barcodes_read.py:68 #, python-format msgid "More than one package found" msgstr "" From ee2f588262b7a536a1e7fb7c9ea4df091c38b0a9 Mon Sep 17 00:00:00 2001 From: OCA-git-bot Date: Mon, 25 Nov 2019 11:40:53 +0000 Subject: [PATCH 04/19] stock_barcodes_gs1 11.0.1.0.1 --- stock_barcodes_gs1/__manifest__.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/stock_barcodes_gs1/__manifest__.py b/stock_barcodes_gs1/__manifest__.py index b19f4a63a2dd..3ffc10b1a338 100644 --- a/stock_barcodes_gs1/__manifest__.py +++ b/stock_barcodes_gs1/__manifest__.py @@ -3,7 +3,7 @@ { "name": "Stock Barcodes GS1", "summary": "It provides read GS1 barcode on stock operations.", - "version": "11.0.1.0.0", + "version": "11.0.1.0.1", "author": "Tecnativa, " "Odoo Community Association (OCA)", "website": "https://odoo-community.org/", From 0406318cfe2fecc930beb1065f25fc7823e5db51 Mon Sep 17 00:00:00 2001 From: OCA Transbot Date: Mon, 25 Nov 2019 11:41:09 +0000 Subject: [PATCH 05/19] Update translation files Updated by "Update PO files to match POT (msgmerge)" hook in Weblate. Translation: stock-logistics-barcode-11.0/stock-logistics-barcode-11.0-stock_barcodes_gs1 Translate-URL: https://translation.odoo-community.org/projects/stock-logistics-barcode-11-0/stock-logistics-barcode-11-0-stock_barcodes_gs1/ --- stock_barcodes_gs1/i18n/es.po | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/stock_barcodes_gs1/i18n/es.po b/stock_barcodes_gs1/i18n/es.po index beea65190087..da7045978b0a 100644 --- a/stock_barcodes_gs1/i18n/es.po +++ b/stock_barcodes_gs1/i18n/es.po @@ -18,31 +18,31 @@ msgstr "" "X-Generator: Poedit 2.0.6\n" #. module: stock_barcodes_gs1 -#: code:addons/stock_barcodes_gs1/wizard/stock_barcodes_read.py:48 +#: code:addons/stock_barcodes_gs1/wizard/stock_barcodes_read.py:53 #, python-format msgid "Barcode for product not found" msgstr "Código de barras no encontrado" #. module: stock_barcodes_gs1 -#: code:addons/stock_barcodes_gs1/wizard/stock_barcodes_read.py:58 +#: code:addons/stock_barcodes_gs1/wizard/stock_barcodes_read.py:63 #, python-format msgid "Barcode for product packaging not found" msgstr "Código de barras de empaquetado no encontrado" #. module: stock_barcodes_gs1 -#: code:addons/stock_barcodes_gs1/wizard/stock_barcodes_read.py:76 +#: code:addons/stock_barcodes_gs1/wizard/stock_barcodes_read.py:81 #, python-format msgid "Barcode not found" msgstr "Código de barras no encontrado" #. module: stock_barcodes_gs1 -#: code:addons/stock_barcodes_gs1/wizard/stock_barcodes_read.py:74 +#: code:addons/stock_barcodes_gs1/wizard/stock_barcodes_read.py:79 #, python-format msgid "Barcode read correctly" msgstr "Código de barras leído correctamente" #. module: stock_barcodes_gs1 -#: code:addons/stock_barcodes_gs1/wizard/stock_barcodes_read.py:63 +#: code:addons/stock_barcodes_gs1/wizard/stock_barcodes_read.py:68 #, python-format msgid "More than one package found" msgstr "Se ha encontrado más de un empaquetado." From 447c7db92bde5e371c88ce6e851cc28d0658bcde Mon Sep 17 00:00:00 2001 From: Joan Sisquella Date: Tue, 17 Dec 2019 09:26:17 +0100 Subject: [PATCH 06/19] [MIG] stock_barcodes_gs1: Migration to 12.0 --- stock_barcodes_gs1/README.rst | 10 +++++----- stock_barcodes_gs1/__manifest__.py | 2 +- stock_barcodes_gs1/i18n/stock_barcodes_gs1.pot | 2 +- stock_barcodes_gs1/static/description/index.html | 6 +++--- 4 files changed, 10 insertions(+), 10 deletions(-) diff --git a/stock_barcodes_gs1/README.rst b/stock_barcodes_gs1/README.rst index 12cbc2707d1c..17df208ceb67 100644 --- a/stock_barcodes_gs1/README.rst +++ b/stock_barcodes_gs1/README.rst @@ -14,13 +14,13 @@ Stock Barcodes GS1 :target: http://www.gnu.org/licenses/agpl-3.0-standalone.html :alt: License: AGPL-3 .. |badge3| image:: https://img.shields.io/badge/github-OCA%2Fstock--logistics--barcode-lightgray.png?logo=github - :target: https://github.com/OCA/stock-logistics-barcode/tree/11.0/stock_barcodes_gs1 + :target: https://github.com/OCA/stock-logistics-barcode/tree/12.0/stock_barcodes_gs1 :alt: OCA/stock-logistics-barcode .. |badge4| image:: https://img.shields.io/badge/weblate-Translate%20me-F47D42.png - :target: https://translation.odoo-community.org/projects/stock-logistics-barcode-11-0/stock-logistics-barcode-11-0-stock_barcodes_gs1 + :target: https://translation.odoo-community.org/projects/stock-logistics-barcode-12-0/stock-logistics-barcode-12-0-stock_barcodes_gs1 :alt: Translate me on Weblate .. |badge5| image:: https://img.shields.io/badge/runbot-Try%20me-875A7B.png - :target: https://runbot.odoo-community.org/runbot/150/11.0 + :target: https://runbot.odoo-community.org/runbot/150/12.0 :alt: Try me on Runbot |badge1| |badge2| |badge3| |badge4| |badge5| @@ -45,7 +45,7 @@ Bug Tracker Bugs are tracked on `GitHub Issues `_. In case of trouble, please check there if your issue has already been reported. If you spotted it first, help us smashing it by providing a detailed and welcomed -`feedback `_. +`feedback `_. Do not contact contributors directly about support or help with technical issues. @@ -80,6 +80,6 @@ OCA, or the Odoo Community Association, is a nonprofit organization whose mission is to support the collaborative development of Odoo features and promote its widespread use. -This module is part of the `OCA/stock-logistics-barcode `_ project on GitHub. +This module is part of the `OCA/stock-logistics-barcode `_ project on GitHub. You are welcome to contribute. To learn how please visit https://odoo-community.org/page/Contribute. diff --git a/stock_barcodes_gs1/__manifest__.py b/stock_barcodes_gs1/__manifest__.py index 3ffc10b1a338..055a7e32a34a 100644 --- a/stock_barcodes_gs1/__manifest__.py +++ b/stock_barcodes_gs1/__manifest__.py @@ -3,7 +3,7 @@ { "name": "Stock Barcodes GS1", "summary": "It provides read GS1 barcode on stock operations.", - "version": "11.0.1.0.1", + "version": "12.0.1.0.0", "author": "Tecnativa, " "Odoo Community Association (OCA)", "website": "https://odoo-community.org/", diff --git a/stock_barcodes_gs1/i18n/stock_barcodes_gs1.pot b/stock_barcodes_gs1/i18n/stock_barcodes_gs1.pot index f22aab41030b..c873cd984728 100644 --- a/stock_barcodes_gs1/i18n/stock_barcodes_gs1.pot +++ b/stock_barcodes_gs1/i18n/stock_barcodes_gs1.pot @@ -4,7 +4,7 @@ # msgid "" msgstr "" -"Project-Id-Version: Odoo Server 11.0\n" +"Project-Id-Version: Odoo Server 12.0\n" "Report-Msgid-Bugs-To: \n" "Last-Translator: <>\n" "Language-Team: \n" diff --git a/stock_barcodes_gs1/static/description/index.html b/stock_barcodes_gs1/static/description/index.html index ba1a893dda5d..9b9225287c3d 100644 --- a/stock_barcodes_gs1/static/description/index.html +++ b/stock_barcodes_gs1/static/description/index.html @@ -367,7 +367,7 @@

Stock Barcodes GS1

!! This file is generated by oca-gen-addon-readme !! !! changes will be overwritten. !! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! --> -

Beta License: AGPL-3 OCA/stock-logistics-barcode Translate me on Weblate Try me on Runbot

+

Beta License: AGPL-3 OCA/stock-logistics-barcode Translate me on Weblate Try me on Runbot

This module extends barcode reader interface to allow to read GS1 barcodes.

The AI’s implemented are 01(Group), 02(Product), 37(Quantity) and 10(Lots).

Table of contents

@@ -392,7 +392,7 @@

Bug Tracker

Bugs are tracked on GitHub Issues. In case of trouble, please check there if your issue has already been reported. If you spotted it first, help us smashing it by providing a detailed and welcomed -feedback.

+feedback.

Do not contact contributors directly about support or help with technical issues.

@@ -421,7 +421,7 @@

Maintainers

OCA, or the Odoo Community Association, is a nonprofit organization whose mission is to support the collaborative development of Odoo features and promote its widespread use.

-

This module is part of the OCA/stock-logistics-barcode project on GitHub.

+

This module is part of the OCA/stock-logistics-barcode project on GitHub.

You are welcome to contribute. To learn how please visit https://odoo-community.org/page/Contribute.

From f65d16d779fd60c7c444f79c05d0f70cf96537b5 Mon Sep 17 00:00:00 2001 From: Sergio Teruel Date: Thu, 13 Feb 2020 22:19:37 +0100 Subject: [PATCH 07/19] [IMP] stock_barcodes_gs1: black, isort --- stock_barcodes_gs1/__manifest__.py | 10 +- .../tests/test_stock_barcodes_gs1.py | 107 +++++++++--------- .../tests/test_stock_barcodes_new_lot_gs1.py | 22 ++-- .../wizard/stock_barcodes_read.py | 60 +++++----- .../wizard/stock_production_lot.py | 24 ++-- 5 files changed, 109 insertions(+), 114 deletions(-) diff --git a/stock_barcodes_gs1/__manifest__.py b/stock_barcodes_gs1/__manifest__.py index 055a7e32a34a..7338dc3eed2b 100644 --- a/stock_barcodes_gs1/__manifest__.py +++ b/stock_barcodes_gs1/__manifest__.py @@ -4,14 +4,10 @@ "name": "Stock Barcodes GS1", "summary": "It provides read GS1 barcode on stock operations.", "version": "12.0.1.0.0", - "author": "Tecnativa, " - "Odoo Community Association (OCA)", + "author": "Tecnativa, " "Odoo Community Association (OCA)", "website": "https://odoo-community.org/", "license": "AGPL-3", "category": "Extra Tools", - "depends": [ - 'stock_barcodes', - 'base_gs1_barcode', - ], - 'installable': True, + "depends": ["stock_barcodes", "base_gs1_barcode"], + "installable": True, } diff --git a/stock_barcodes_gs1/tests/test_stock_barcodes_gs1.py b/stock_barcodes_gs1/tests/test_stock_barcodes_gs1.py index 22890ee7d174..7c04e61876d7 100644 --- a/stock_barcodes_gs1/tests/test_stock_barcodes_gs1.py +++ b/stock_barcodes_gs1/tests/test_stock_barcodes_gs1.py @@ -1,85 +1,86 @@ # Copyright 2108-2019 Sergio Teruel # License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl). -from odoo.addons.stock_barcodes.tests.\ - test_stock_barcodes import TestStockBarcodes +from odoo.addons.stock_barcodes.tests.test_stock_barcodes import TestStockBarcodes class TestStockBarcodesGS1(TestStockBarcodes): - def setUp(self): super().setUp() # Barcode for packaging and lot - self.gs1_barcode_01 = '01195011015300001714070410AB-123' - self.gs1_barcode_01_not_found = '011xxx11015300001714070410AB-123' - self.gs1_barcode_01_not_lot = '01195011015300001714070410AB-124' + self.gs1_barcode_01 = "01195011015300001714070410AB-123" + self.gs1_barcode_01_not_found = "011xxx11015300001714070410AB-123" + self.gs1_barcode_01_not_lot = "01195011015300001714070410AB-124" # Barcode for product and quantities - self.gs1_barcode_02 = '0207010001234567150410183724' - self.gs1_barcode_02_not_found = '020xxx0001234567150410183724' + self.gs1_barcode_02 = "0207010001234567150410183724" + self.gs1_barcode_02_not_found = "020xxx0001234567150410183724" # Barcode not processed - self.gs1_barcode_01_not_processed = '01993167101234533101002620130' \ - '5041710ABC123214145354' + self.gs1_barcode_01_not_processed = ( + "01993167101234533101002620130" "5041710ABC123214145354" + ) - self.product_wo_tracking_gs1 = self.product_wo_tracking.copy({ - 'barcode': '07010001234567', - }) + self.product_wo_tracking_gs1 = self.product_wo_tracking.copy( + {"barcode": "07010001234567"} + ) self.product_tracking_gs1 = self.product_tracking.copy() - self.packaging_gs1 = self.ProductPackaging.create({ - 'product_id': self.product_wo_tracking_gs1.id, - 'name': 'Box 10 Units', - 'qty': 10.0, - 'barcode': '19501101530000', - }) + self.packaging_gs1 = self.ProductPackaging.create( + { + "product_id": self.product_wo_tracking_gs1.id, + "name": "Box 10 Units", + "qty": 10.0, + "barcode": "19501101530000", + } + ) def test_wizard_scan_gs1_package(self): self.action_barcode_scanned(self.wiz_scan, self.gs1_barcode_01) self.assertEqual(self.wiz_scan.packaging_id, self.packaging_gs1) # Scan no exist packaging - self.action_barcode_scanned( - self.wiz_scan, self.gs1_barcode_01_not_found) - self.assertEqual(self.wiz_scan.message, - 'Barcode: 011xxx11015300001714070410AB-123 ' - '(Barcode for product packaging not found)') + self.action_barcode_scanned(self.wiz_scan, self.gs1_barcode_01_not_found) + self.assertEqual( + self.wiz_scan.message, + "Barcode: 011xxx11015300001714070410AB-123 " + "(Barcode for product packaging not found)", + ) # Scan packaging barcode with more than one package - self.packaging_gs1.copy({ - 'barcode': '19501101530000', - }) - self.action_barcode_scanned( - self.wiz_scan, self.gs1_barcode_01) - self.assertEqual(self.wiz_scan.message, - 'Barcode: 01195011015300001714070410AB-123 ' - '(More than one package found)') + self.packaging_gs1.copy({"barcode": "19501101530000"}) + self.action_barcode_scanned(self.wiz_scan, self.gs1_barcode_01) + self.assertEqual( + self.wiz_scan.message, + "Barcode: 01195011015300001714070410AB-123 " + "(More than one package found)", + ) def test_wizard_scan_gs1_product(self): self.action_barcode_scanned(self.wiz_scan, self.gs1_barcode_02) - self.assertEqual( - self.wiz_scan.product_id, self.product_wo_tracking_gs1) + self.assertEqual(self.wiz_scan.product_id, self.product_wo_tracking_gs1) self.assertEqual(self.wiz_scan.product_qty, 24) # Scan non exists product - self.action_barcode_scanned( - self.wiz_scan, self.gs1_barcode_02_not_found) - self.assertEqual(self.wiz_scan.message, - 'Barcode: 020xxx0001234567150410183724 ' - '(Barcode for product not found)') + self.action_barcode_scanned(self.wiz_scan, self.gs1_barcode_02_not_found) + self.assertEqual( + self.wiz_scan.message, + "Barcode: 020xxx0001234567150410183724 " "(Barcode for product not found)", + ) def test_wizard_scan_gs1_lot(self): self.packaging_gs1.product_id = self.product_tracking_gs1 - lot = self.StockProductionLot.create({ - 'name': 'AB-123', - 'product_id': self.product_tracking_gs1.id, - }) + lot = self.StockProductionLot.create( + {"name": "AB-123", "product_id": self.product_tracking_gs1.id} + ) self.action_barcode_scanned(self.wiz_scan, self.gs1_barcode_01) self.assertEqual(self.wiz_scan.lot_id, lot) - self.assertEqual(self.wiz_scan.message, - 'Barcode: 01195011015300001714070410AB-123 ' - '(Barcode read correctly)') + self.assertEqual( + self.wiz_scan.message, + "Barcode: 01195011015300001714070410AB-123 " "(Barcode read correctly)", + ) self.action_barcode_scanned(self.wiz_scan, self.gs1_barcode_01_not_lot) - self.assertEqual(self.wiz_scan.lot_id.name, 'AB-124') + self.assertEqual(self.wiz_scan.lot_id.name, "AB-124") def test_wizard_scan_gs1_not_found(self): - self.action_barcode_scanned( - self.wiz_scan, self.gs1_barcode_01_not_processed) - self.assertEqual(self.wiz_scan.message, - 'Barcode: 0199316710123453310100262013050417' - '10ABC123214145354 (Barcode for product packaging ' - 'not found)') + self.action_barcode_scanned(self.wiz_scan, self.gs1_barcode_01_not_processed) + self.assertEqual( + self.wiz_scan.message, + "Barcode: 0199316710123453310100262013050417" + "10ABC123214145354 (Barcode for product packaging " + "not found)", + ) diff --git a/stock_barcodes_gs1/tests/test_stock_barcodes_new_lot_gs1.py b/stock_barcodes_gs1/tests/test_stock_barcodes_new_lot_gs1.py index 0f528f8e3e0d..c1a6262ce080 100644 --- a/stock_barcodes_gs1/tests/test_stock_barcodes_new_lot_gs1.py +++ b/stock_barcodes_gs1/tests/test_stock_barcodes_new_lot_gs1.py @@ -1,29 +1,27 @@ # Copyright 2108-2019 Sergio Teruel # License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl). -from odoo.addons.stock_barcodes_gs1.tests.test_stock_barcodes_gs1 import\ - TestStockBarcodesGS1 +from odoo.addons.stock_barcodes_gs1.tests.test_stock_barcodes_gs1 import ( + TestStockBarcodesGS1, +) class TestStockBarcodesNewLotGS1(TestStockBarcodesGS1): - def setUp(self): super().setUp() - self.ScanReadLot = self.env['wiz.stock.barcodes.new.lot'] + self.ScanReadLot = self.env["wiz.stock.barcodes.new.lot"] self.wiz_scan_lot = self.ScanReadLot.new() - self.gs1_barcode_02_10 = '02174512345678911718112510AAA2701370150' + self.gs1_barcode_02_10 = "02174512345678911718112510AAA2701370150" def test_new_lot_gs1_package(self): self.action_barcode_scanned(self.wiz_scan_lot, self.gs1_barcode_01) - self.assertEqual( - self.wiz_scan_lot.product_id, self.product_wo_tracking_gs1) - self.assertEqual(self.wiz_scan_lot.lot_name, 'AB-123') + self.assertEqual(self.wiz_scan_lot.product_id, self.product_wo_tracking_gs1) + self.assertEqual(self.wiz_scan_lot.lot_name, "AB-123") def test_new_lot_gs1_product(self): - self.product_tracking_gs1.barcode = '17451234567891' + self.product_tracking_gs1.barcode = "17451234567891" self.action_barcode_scanned(self.wiz_scan_lot, self.gs1_barcode_02_10) - self.assertEqual( - self.wiz_scan_lot.product_id, self.product_tracking_gs1) - self.assertEqual(self.wiz_scan_lot.lot_name, 'AAA2701370150') + self.assertEqual(self.wiz_scan_lot.product_id, self.product_tracking_gs1) + self.assertEqual(self.wiz_scan_lot.lot_name, "AAA2701370150") def test_new_lot_gs1_no_lot(self): self.action_barcode_scanned(self.wiz_scan_lot, self.gs1_barcode_02) diff --git a/stock_barcodes_gs1/wizard/stock_barcodes_read.py b/stock_barcodes_gs1/wizard/stock_barcodes_read.py index 58cde49bb748..46a361d8ab7f 100644 --- a/stock_barcodes_gs1/wizard/stock_barcodes_read.py +++ b/stock_barcodes_gs1/wizard/stock_barcodes_read.py @@ -4,25 +4,22 @@ class WizStockBarcodesRead(models.AbstractModel): - _inherit = 'wiz.stock.barcodes.read' + _inherit = "wiz.stock.barcodes.read" def _prepare_lot_values(self, barcode_decoded): - lot_barcode = barcode_decoded.get('10', False) - return { - 'name': lot_barcode, - 'product_id': self.product_id.id, - } + lot_barcode = barcode_decoded.get("10", False) + return {"name": lot_barcode, "product_id": self.product_id.id} def _create_lot(self, barcode_decoded): - return self.env['stock.production.lot'].create( - self._prepare_lot_values(barcode_decoded)) + return self.env["stock.production.lot"].create( + self._prepare_lot_values(barcode_decoded) + ) def process_lot(self, barcode_decoded): - lot_barcode = barcode_decoded.get('10', False) - lot = self.env['stock.production.lot'].search([ - ('name', '=', lot_barcode), - ('product_id', '=', self.product_id.id), - ]) + lot_barcode = barcode_decoded.get("10", False) + lot = self.env["stock.production.lot"].search( + [("name", "=", lot_barcode), ("product_id", "=", self.product_id.id)] + ) if not lot: lot = self._create_lot(barcode_decoded) self.lot_id = lot @@ -32,51 +29,54 @@ def process_barcode(self, barcode): scanner reads a barcode ok but this one is not precessed. """ try: - barcode_decoded = self.env['gs1_barcode'].decode(barcode) + barcode_decoded = self.env["gs1_barcode"].decode(barcode) except Exception: return super().process_barcode(barcode) processed = False - package_barcode = barcode_decoded.get('01', False) - product_barcode = barcode_decoded.get('02', False) + package_barcode = barcode_decoded.get("01", False) + product_barcode = barcode_decoded.get("02", False) if not product_barcode: # Sometimes the product does not yet have a GTIN. In this case # try the AI 240 'Additional product identification assigned # by the manufacturer'. - product_barcode = barcode_decoded.get('240', False) - lot_barcode = barcode_decoded.get('10', False) - product_qty = barcode_decoded.get('37', False) + product_barcode = barcode_decoded.get("240", False) + lot_barcode = barcode_decoded.get("10", False) + product_qty = barcode_decoded.get("37", False) if product_barcode: - product = self.env['product.product'].search( - self._barcode_domain(product_barcode)) + product = self.env["product.product"].search( + self._barcode_domain(product_barcode) + ) if not product: - self._set_messagge_info( - 'not_found', _('Barcode for product not found')) + self._set_messagge_info("not_found", _("Barcode for product not found")) return False else: processed = True self.action_product_scaned_post(product) if package_barcode: - packaging = self.env['product.packaging'].search( - self._barcode_domain(package_barcode)) + packaging = self.env["product.packaging"].search( + self._barcode_domain(package_barcode) + ) if not packaging: self._set_messagge_info( - 'not_found', _('Barcode for product packaging not found')) + "not_found", _("Barcode for product packaging not found") + ) return False else: if len(packaging) > 1: self._set_messagge_info( - 'more_match', _('More than one package found')) + "more_match", _("More than one package found") + ) return False processed = True self.action_packaging_scaned_post(packaging) - if lot_barcode and self.product_id.tracking != 'none': + if lot_barcode and self.product_id.tracking != "none": self.process_lot(barcode_decoded) processed = True if product_qty: self.product_qty = product_qty if processed: self.action_done() - self._set_messagge_info('success', _('Barcode read correctly')) + self._set_messagge_info("success", _("Barcode read correctly")) return True - self._set_messagge_info('not_found', _('Barcode not found')) + self._set_messagge_info("not_found", _("Barcode not found")) return False diff --git a/stock_barcodes_gs1/wizard/stock_production_lot.py b/stock_barcodes_gs1/wizard/stock_production_lot.py index a080c392ac32..5ccf9fe1a497 100644 --- a/stock_barcodes_gs1/wizard/stock_production_lot.py +++ b/stock_barcodes_gs1/wizard/stock_production_lot.py @@ -4,32 +4,32 @@ class WizStockBarcodesNewLot(models.TransientModel): - _inherit = 'wiz.stock.barcodes.new.lot' - _description = 'Wizard to create new lot from barcode scanner' + _inherit = "wiz.stock.barcodes.new.lot" + _description = "Wizard to create new lot from barcode scanner" def _decode_barcode(self, barcode): - return self.env['gs1_barcode'].decode(barcode) + return self.env["gs1_barcode"].decode(barcode) def on_barcode_scanned(self, barcode): try: barcode_decoded = self._decode_barcode(barcode) except Exception: return super().on_barcode_scanned(barcode) - package_barcode = barcode_decoded.get('01', False) - product_barcode = barcode_decoded.get('02', False) - lot_barcode = barcode_decoded.get('10', False) + package_barcode = barcode_decoded.get("01", False) + product_barcode = barcode_decoded.get("02", False) + lot_barcode = barcode_decoded.get("10", False) if not lot_barcode: return if package_barcode: - packaging = self.env['product.packaging'].search([ - ('barcode', '=', package_barcode), - ]) + packaging = self.env["product.packaging"].search( + [("barcode", "=", package_barcode)] + ) if packaging: self.product_id = packaging.product_id elif product_barcode: - product = self.env['product.product'].search([ - ('barcode', '=', product_barcode), - ]) + product = self.env["product.product"].search( + [("barcode", "=", product_barcode)] + ) if product: self.product_id = product self.lot_name = lot_barcode From d5fb638bd1eb80298820f611aaec2263691d074c Mon Sep 17 00:00:00 2001 From: Sergio Teruel Date: Thu, 13 Feb 2020 22:19:38 +0100 Subject: [PATCH 08/19] [MIG] stock_barcodes_gs1: Migration to v13.0 --- stock_barcodes_gs1/README.rst | 10 +++++----- stock_barcodes_gs1/__manifest__.py | 2 +- stock_barcodes_gs1/i18n/es.po | 10 +++++----- stock_barcodes_gs1/i18n/stock_barcodes_gs1.pot | 17 ++++++++--------- .../static/description/index.html | 6 +++--- .../tests/test_stock_barcodes_gs1.py | 15 +++++++++++---- .../tests/test_stock_barcodes_new_lot_gs1.py | 3 +++ .../wizard/stock_barcodes_read.py | 6 +++++- 8 files changed, 41 insertions(+), 28 deletions(-) diff --git a/stock_barcodes_gs1/README.rst b/stock_barcodes_gs1/README.rst index 17df208ceb67..676c4c33a2c0 100644 --- a/stock_barcodes_gs1/README.rst +++ b/stock_barcodes_gs1/README.rst @@ -14,13 +14,13 @@ Stock Barcodes GS1 :target: http://www.gnu.org/licenses/agpl-3.0-standalone.html :alt: License: AGPL-3 .. |badge3| image:: https://img.shields.io/badge/github-OCA%2Fstock--logistics--barcode-lightgray.png?logo=github - :target: https://github.com/OCA/stock-logistics-barcode/tree/12.0/stock_barcodes_gs1 + :target: https://github.com/OCA/stock-logistics-barcode/tree/13.0/stock_barcodes_gs1 :alt: OCA/stock-logistics-barcode .. |badge4| image:: https://img.shields.io/badge/weblate-Translate%20me-F47D42.png - :target: https://translation.odoo-community.org/projects/stock-logistics-barcode-12-0/stock-logistics-barcode-12-0-stock_barcodes_gs1 + :target: https://translation.odoo-community.org/projects/stock-logistics-barcode-13-0/stock-logistics-barcode-13-0-stock_barcodes_gs1 :alt: Translate me on Weblate .. |badge5| image:: https://img.shields.io/badge/runbot-Try%20me-875A7B.png - :target: https://runbot.odoo-community.org/runbot/150/12.0 + :target: https://runbot.odoo-community.org/runbot/150/13.0 :alt: Try me on Runbot |badge1| |badge2| |badge3| |badge4| |badge5| @@ -45,7 +45,7 @@ Bug Tracker Bugs are tracked on `GitHub Issues `_. In case of trouble, please check there if your issue has already been reported. If you spotted it first, help us smashing it by providing a detailed and welcomed -`feedback `_. +`feedback `_. Do not contact contributors directly about support or help with technical issues. @@ -80,6 +80,6 @@ OCA, or the Odoo Community Association, is a nonprofit organization whose mission is to support the collaborative development of Odoo features and promote its widespread use. -This module is part of the `OCA/stock-logistics-barcode `_ project on GitHub. +This module is part of the `OCA/stock-logistics-barcode `_ project on GitHub. You are welcome to contribute. To learn how please visit https://odoo-community.org/page/Contribute. diff --git a/stock_barcodes_gs1/__manifest__.py b/stock_barcodes_gs1/__manifest__.py index 7338dc3eed2b..9edd5fe844ff 100644 --- a/stock_barcodes_gs1/__manifest__.py +++ b/stock_barcodes_gs1/__manifest__.py @@ -3,7 +3,7 @@ { "name": "Stock Barcodes GS1", "summary": "It provides read GS1 barcode on stock operations.", - "version": "12.0.1.0.0", + "version": "13.0.1.0.0", "author": "Tecnativa, " "Odoo Community Association (OCA)", "website": "https://odoo-community.org/", "license": "AGPL-3", diff --git a/stock_barcodes_gs1/i18n/es.po b/stock_barcodes_gs1/i18n/es.po index da7045978b0a..0d83010e887a 100644 --- a/stock_barcodes_gs1/i18n/es.po +++ b/stock_barcodes_gs1/i18n/es.po @@ -18,31 +18,31 @@ msgstr "" "X-Generator: Poedit 2.0.6\n" #. module: stock_barcodes_gs1 -#: code:addons/stock_barcodes_gs1/wizard/stock_barcodes_read.py:53 +#: code:addons/stock_barcodes_gs1/wizard/stock_barcodes_read.py:0 #, python-format msgid "Barcode for product not found" msgstr "Código de barras no encontrado" #. module: stock_barcodes_gs1 -#: code:addons/stock_barcodes_gs1/wizard/stock_barcodes_read.py:63 +#: code:addons/stock_barcodes_gs1/wizard/stock_barcodes_read.py:0 #, python-format msgid "Barcode for product packaging not found" msgstr "Código de barras de empaquetado no encontrado" #. module: stock_barcodes_gs1 -#: code:addons/stock_barcodes_gs1/wizard/stock_barcodes_read.py:81 +#: code:addons/stock_barcodes_gs1/wizard/stock_barcodes_read.py:0 #, python-format msgid "Barcode not found" msgstr "Código de barras no encontrado" #. module: stock_barcodes_gs1 -#: code:addons/stock_barcodes_gs1/wizard/stock_barcodes_read.py:79 +#: code:addons/stock_barcodes_gs1/wizard/stock_barcodes_read.py:0 #, python-format msgid "Barcode read correctly" msgstr "Código de barras leído correctamente" #. module: stock_barcodes_gs1 -#: code:addons/stock_barcodes_gs1/wizard/stock_barcodes_read.py:68 +#: code:addons/stock_barcodes_gs1/wizard/stock_barcodes_read.py:0 #, python-format msgid "More than one package found" msgstr "Se ha encontrado más de un empaquetado." diff --git a/stock_barcodes_gs1/i18n/stock_barcodes_gs1.pot b/stock_barcodes_gs1/i18n/stock_barcodes_gs1.pot index c873cd984728..1dd5cdc7b1cc 100644 --- a/stock_barcodes_gs1/i18n/stock_barcodes_gs1.pot +++ b/stock_barcodes_gs1/i18n/stock_barcodes_gs1.pot @@ -1,12 +1,12 @@ # Translation of Odoo Server. # This file contains the translation of the following modules: -# * stock_barcodes_gs1 +# * stock_barcodes_gs1 # msgid "" msgstr "" -"Project-Id-Version: Odoo Server 12.0\n" +"Project-Id-Version: Odoo Server 13.0\n" "Report-Msgid-Bugs-To: \n" -"Last-Translator: <>\n" +"Last-Translator: \n" "Language-Team: \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" @@ -14,31 +14,31 @@ msgstr "" "Plural-Forms: \n" #. module: stock_barcodes_gs1 -#: code:addons/stock_barcodes_gs1/wizard/stock_barcodes_read.py:53 +#: code:addons/stock_barcodes_gs1/wizard/stock_barcodes_read.py:0 #, python-format msgid "Barcode for product not found" msgstr "" #. module: stock_barcodes_gs1 -#: code:addons/stock_barcodes_gs1/wizard/stock_barcodes_read.py:63 +#: code:addons/stock_barcodes_gs1/wizard/stock_barcodes_read.py:0 #, python-format msgid "Barcode for product packaging not found" msgstr "" #. module: stock_barcodes_gs1 -#: code:addons/stock_barcodes_gs1/wizard/stock_barcodes_read.py:81 +#: code:addons/stock_barcodes_gs1/wizard/stock_barcodes_read.py:0 #, python-format msgid "Barcode not found" msgstr "" #. module: stock_barcodes_gs1 -#: code:addons/stock_barcodes_gs1/wizard/stock_barcodes_read.py:79 +#: code:addons/stock_barcodes_gs1/wizard/stock_barcodes_read.py:0 #, python-format msgid "Barcode read correctly" msgstr "" #. module: stock_barcodes_gs1 -#: code:addons/stock_barcodes_gs1/wizard/stock_barcodes_read.py:68 +#: code:addons/stock_barcodes_gs1/wizard/stock_barcodes_read.py:0 #, python-format msgid "More than one package found" msgstr "" @@ -52,4 +52,3 @@ msgstr "" #: model:ir.model,name:stock_barcodes_gs1.model_wiz_stock_barcodes_read msgid "Wizard to read barcode" msgstr "" - diff --git a/stock_barcodes_gs1/static/description/index.html b/stock_barcodes_gs1/static/description/index.html index 9b9225287c3d..1723a4efa42f 100644 --- a/stock_barcodes_gs1/static/description/index.html +++ b/stock_barcodes_gs1/static/description/index.html @@ -367,7 +367,7 @@

Stock Barcodes GS1

!! This file is generated by oca-gen-addon-readme !! !! changes will be overwritten. !! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! --> -

Beta License: AGPL-3 OCA/stock-logistics-barcode Translate me on Weblate Try me on Runbot

+

Beta License: AGPL-3 OCA/stock-logistics-barcode Translate me on Weblate Try me on Runbot

This module extends barcode reader interface to allow to read GS1 barcodes.

The AI’s implemented are 01(Group), 02(Product), 37(Quantity) and 10(Lots).

Table of contents

@@ -392,7 +392,7 @@

Bug Tracker

Bugs are tracked on GitHub Issues. In case of trouble, please check there if your issue has already been reported. If you spotted it first, help us smashing it by providing a detailed and welcomed -feedback.

+feedback.

Do not contact contributors directly about support or help with technical issues.

@@ -421,7 +421,7 @@

Maintainers

OCA, or the Odoo Community Association, is a nonprofit organization whose mission is to support the collaborative development of Odoo features and promote its widespread use.

-

This module is part of the OCA/stock-logistics-barcode project on GitHub.

+

This module is part of the OCA/stock-logistics-barcode project on GitHub.

You are welcome to contribute. To learn how please visit https://odoo-community.org/page/Contribute.

diff --git a/stock_barcodes_gs1/tests/test_stock_barcodes_gs1.py b/stock_barcodes_gs1/tests/test_stock_barcodes_gs1.py index 7c04e61876d7..0eb1fe569825 100644 --- a/stock_barcodes_gs1/tests/test_stock_barcodes_gs1.py +++ b/stock_barcodes_gs1/tests/test_stock_barcodes_gs1.py @@ -1,9 +1,12 @@ # Copyright 2108-2019 Sergio Teruel # License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl). +from odoo.tests import common + from odoo.addons.stock_barcodes.tests.test_stock_barcodes import TestStockBarcodes +@common.tagged("post_install", "-at_install") class TestStockBarcodesGS1(TestStockBarcodes): def setUp(self): super().setUp() @@ -19,10 +22,10 @@ def setUp(self): "01993167101234533101002620130" "5041710ABC123214145354" ) - self.product_wo_tracking_gs1 = self.product_wo_tracking.copy( + self.product_wo_tracking_gs1 = self.product_wo_tracking.with_context({}).copy( {"barcode": "07010001234567"} ) - self.product_tracking_gs1 = self.product_tracking.copy() + self.product_tracking_gs1 = self.product_tracking.with_context({}).copy() self.packaging_gs1 = self.ProductPackaging.create( { "product_id": self.product_wo_tracking_gs1.id, @@ -43,7 +46,7 @@ def test_wizard_scan_gs1_package(self): "(Barcode for product packaging not found)", ) # Scan packaging barcode with more than one package - self.packaging_gs1.copy({"barcode": "19501101530000"}) + self.packaging_gs1.with_context({}).copy({"barcode": "19501101530000"}) self.action_barcode_scanned(self.wiz_scan, self.gs1_barcode_01) self.assertEqual( self.wiz_scan.message, @@ -65,7 +68,11 @@ def test_wizard_scan_gs1_product(self): def test_wizard_scan_gs1_lot(self): self.packaging_gs1.product_id = self.product_tracking_gs1 lot = self.StockProductionLot.create( - {"name": "AB-123", "product_id": self.product_tracking_gs1.id} + { + "name": "AB-123", + "product_id": self.product_tracking_gs1.id, + "company_id": self.company.id, + } ) self.action_barcode_scanned(self.wiz_scan, self.gs1_barcode_01) self.assertEqual(self.wiz_scan.lot_id, lot) diff --git a/stock_barcodes_gs1/tests/test_stock_barcodes_new_lot_gs1.py b/stock_barcodes_gs1/tests/test_stock_barcodes_new_lot_gs1.py index c1a6262ce080..271c546b156d 100644 --- a/stock_barcodes_gs1/tests/test_stock_barcodes_new_lot_gs1.py +++ b/stock_barcodes_gs1/tests/test_stock_barcodes_new_lot_gs1.py @@ -1,10 +1,13 @@ # Copyright 2108-2019 Sergio Teruel # License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl). +from odoo.tests import common + from odoo.addons.stock_barcodes_gs1.tests.test_stock_barcodes_gs1 import ( TestStockBarcodesGS1, ) +@common.tagged("post_install", "-at_install") class TestStockBarcodesNewLotGS1(TestStockBarcodesGS1): def setUp(self): super().setUp() diff --git a/stock_barcodes_gs1/wizard/stock_barcodes_read.py b/stock_barcodes_gs1/wizard/stock_barcodes_read.py index 46a361d8ab7f..b1befd409995 100644 --- a/stock_barcodes_gs1/wizard/stock_barcodes_read.py +++ b/stock_barcodes_gs1/wizard/stock_barcodes_read.py @@ -8,7 +8,11 @@ class WizStockBarcodesRead(models.AbstractModel): def _prepare_lot_values(self, barcode_decoded): lot_barcode = barcode_decoded.get("10", False) - return {"name": lot_barcode, "product_id": self.product_id.id} + return { + "name": lot_barcode, + "product_id": self.product_id.id, + "company_id": self.env.user.company_id.id, + } def _create_lot(self, barcode_decoded): return self.env["stock.production.lot"].create( From 72f7e6816592258977058905f1f82e1ac21cfb23 Mon Sep 17 00:00:00 2001 From: Sergio Teruel Date: Fri, 31 Jul 2020 10:16:43 +0200 Subject: [PATCH 09/19] [FIX] stock_barcodes_gs1: Continue reading barcode if can not read it as gs1 --- stock_barcodes_gs1/__manifest__.py | 2 +- stock_barcodes_gs1/i18n/es.po | 9 +++------ stock_barcodes_gs1/i18n/stock_barcodes_gs1.pot | 6 ------ stock_barcodes_gs1/wizard/stock_barcodes_read.py | 3 +-- 4 files changed, 5 insertions(+), 15 deletions(-) diff --git a/stock_barcodes_gs1/__manifest__.py b/stock_barcodes_gs1/__manifest__.py index 9edd5fe844ff..a7ac530eb636 100644 --- a/stock_barcodes_gs1/__manifest__.py +++ b/stock_barcodes_gs1/__manifest__.py @@ -3,7 +3,7 @@ { "name": "Stock Barcodes GS1", "summary": "It provides read GS1 barcode on stock operations.", - "version": "13.0.1.0.0", + "version": "13.0.1.0.1", "author": "Tecnativa, " "Odoo Community Association (OCA)", "website": "https://odoo-community.org/", "license": "AGPL-3", diff --git a/stock_barcodes_gs1/i18n/es.po b/stock_barcodes_gs1/i18n/es.po index 0d83010e887a..3424eabe865a 100644 --- a/stock_barcodes_gs1/i18n/es.po +++ b/stock_barcodes_gs1/i18n/es.po @@ -29,12 +29,6 @@ msgstr "Código de barras no encontrado" msgid "Barcode for product packaging not found" msgstr "Código de barras de empaquetado no encontrado" -#. module: stock_barcodes_gs1 -#: code:addons/stock_barcodes_gs1/wizard/stock_barcodes_read.py:0 -#, python-format -msgid "Barcode not found" -msgstr "Código de barras no encontrado" - #. module: stock_barcodes_gs1 #: code:addons/stock_barcodes_gs1/wizard/stock_barcodes_read.py:0 #, python-format @@ -57,5 +51,8 @@ msgstr "Asistente para crear nuevo lote desde el lector de códigos de barras" msgid "Wizard to read barcode" msgstr "Asistente para leer código de barras" +#~ msgid "Barcode not found" +#~ msgstr "Código de barras no encontrado" + #~ msgid "More than one product found" #~ msgstr "Se ha encontrado más de un producto." diff --git a/stock_barcodes_gs1/i18n/stock_barcodes_gs1.pot b/stock_barcodes_gs1/i18n/stock_barcodes_gs1.pot index 1dd5cdc7b1cc..27e1ecaa051b 100644 --- a/stock_barcodes_gs1/i18n/stock_barcodes_gs1.pot +++ b/stock_barcodes_gs1/i18n/stock_barcodes_gs1.pot @@ -25,12 +25,6 @@ msgstr "" msgid "Barcode for product packaging not found" msgstr "" -#. module: stock_barcodes_gs1 -#: code:addons/stock_barcodes_gs1/wizard/stock_barcodes_read.py:0 -#, python-format -msgid "Barcode not found" -msgstr "" - #. module: stock_barcodes_gs1 #: code:addons/stock_barcodes_gs1/wizard/stock_barcodes_read.py:0 #, python-format diff --git a/stock_barcodes_gs1/wizard/stock_barcodes_read.py b/stock_barcodes_gs1/wizard/stock_barcodes_read.py index b1befd409995..244277670490 100644 --- a/stock_barcodes_gs1/wizard/stock_barcodes_read.py +++ b/stock_barcodes_gs1/wizard/stock_barcodes_read.py @@ -82,5 +82,4 @@ def process_barcode(self, barcode): self.action_done() self._set_messagge_info("success", _("Barcode read correctly")) return True - self._set_messagge_info("not_found", _("Barcode not found")) - return False + return super().process_barcode() From eda8374bd51d9da0c46e38ca8317fe0603a8581b Mon Sep 17 00:00:00 2001 From: "Pedro M. Baeza" Date: Fri, 31 Jul 2020 12:16:17 +0200 Subject: [PATCH 10/19] [FIX] stock_barcodes_gs1: Pass argument to super If not, you got an error. --- stock_barcodes_gs1/__manifest__.py | 4 ++-- stock_barcodes_gs1/wizard/stock_barcodes_read.py | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/stock_barcodes_gs1/__manifest__.py b/stock_barcodes_gs1/__manifest__.py index a7ac530eb636..9c299ac3d2ce 100644 --- a/stock_barcodes_gs1/__manifest__.py +++ b/stock_barcodes_gs1/__manifest__.py @@ -3,8 +3,8 @@ { "name": "Stock Barcodes GS1", "summary": "It provides read GS1 barcode on stock operations.", - "version": "13.0.1.0.1", - "author": "Tecnativa, " "Odoo Community Association (OCA)", + "version": "13.0.1.0.2", + "author": "Tecnativa, Odoo Community Association (OCA)", "website": "https://odoo-community.org/", "license": "AGPL-3", "category": "Extra Tools", diff --git a/stock_barcodes_gs1/wizard/stock_barcodes_read.py b/stock_barcodes_gs1/wizard/stock_barcodes_read.py index 244277670490..8c0517c41010 100644 --- a/stock_barcodes_gs1/wizard/stock_barcodes_read.py +++ b/stock_barcodes_gs1/wizard/stock_barcodes_read.py @@ -82,4 +82,4 @@ def process_barcode(self, barcode): self.action_done() self._set_messagge_info("success", _("Barcode read correctly")) return True - return super().process_barcode() + return super().process_barcode(barcode) From 65ce7d4eb0da4bc6fc5a5d07d5f99d2932231a60 Mon Sep 17 00:00:00 2001 From: Enric Tobella Date: Mon, 21 Sep 2020 17:29:25 +0200 Subject: [PATCH 11/19] [IMP] stock_barcodes_gs1: Allow the use of double GS1-128 barcodes --- stock_barcodes_gs1/__manifest__.py | 2 +- stock_barcodes_gs1/i18n/ca.po | 51 +++++++++++++++++++ stock_barcodes_gs1/i18n/es.po | 10 ++-- .../tests/test_stock_barcodes_gs1.py | 26 +++++++++- .../wizard/stock_barcodes_read.py | 7 +++ 5 files changed, 89 insertions(+), 7 deletions(-) create mode 100644 stock_barcodes_gs1/i18n/ca.po diff --git a/stock_barcodes_gs1/__manifest__.py b/stock_barcodes_gs1/__manifest__.py index 9c299ac3d2ce..2aa040709601 100644 --- a/stock_barcodes_gs1/__manifest__.py +++ b/stock_barcodes_gs1/__manifest__.py @@ -3,7 +3,7 @@ { "name": "Stock Barcodes GS1", "summary": "It provides read GS1 barcode on stock operations.", - "version": "13.0.1.0.2", + "version": "13.0.1.0.3", "author": "Tecnativa, Odoo Community Association (OCA)", "website": "https://odoo-community.org/", "license": "AGPL-3", diff --git a/stock_barcodes_gs1/i18n/ca.po b/stock_barcodes_gs1/i18n/ca.po new file mode 100644 index 000000000000..56b300ad5959 --- /dev/null +++ b/stock_barcodes_gs1/i18n/ca.po @@ -0,0 +1,51 @@ +# Translation of Odoo Server. +# This file contains the translation of the following modules: +# * stock_barcodes_gs1 +# +msgid "" +msgstr "" +"Project-Id-Version: Odoo Server 13.0\n" +"Report-Msgid-Bugs-To: \n" +"PO-Revision-Date: 2021-05-11 12:47+0000\n" +"Last-Translator: Haftec \n" +"Language-Team: none\n" +"Language: ca\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: \n" +"Plural-Forms: nplurals=2; plural=n != 1;\n" +"X-Generator: Weblate 4.3.2\n" + +#. module: stock_barcodes_gs1 +#: code:addons/stock_barcodes_gs1/wizard/stock_barcodes_read.py:0 +#, python-format +msgid "Barcode for product not found" +msgstr "No s'ha trobat el codi de barres del producte" + +#. module: stock_barcodes_gs1 +#: code:addons/stock_barcodes_gs1/wizard/stock_barcodes_read.py:0 +#, python-format +msgid "Barcode for product packaging not found" +msgstr "No s'ha trobat el codi de barres per a l'empaquetat del producte" + +#. module: stock_barcodes_gs1 +#: code:addons/stock_barcodes_gs1/wizard/stock_barcodes_read.py:0 +#, python-format +msgid "Barcode read correctly" +msgstr "Codi de barres llegit correctament" + +#. module: stock_barcodes_gs1 +#: code:addons/stock_barcodes_gs1/wizard/stock_barcodes_read.py:0 +#, python-format +msgid "More than one package found" +msgstr "S'ha trobat més d'un empaquetat" + +#. module: stock_barcodes_gs1 +#: model:ir.model,name:stock_barcodes_gs1.model_wiz_stock_barcodes_new_lot +msgid "Wizard to create new lot from barcode scanner" +msgstr "Assistent per crear un lot nou des de l'escàner de codis de barres" + +#. module: stock_barcodes_gs1 +#: model:ir.model,name:stock_barcodes_gs1.model_wiz_stock_barcodes_read +msgid "Wizard to read barcode" +msgstr "Assistent per llegir codi de barres" diff --git a/stock_barcodes_gs1/i18n/es.po b/stock_barcodes_gs1/i18n/es.po index 3424eabe865a..a5ff1ebe317a 100644 --- a/stock_barcodes_gs1/i18n/es.po +++ b/stock_barcodes_gs1/i18n/es.po @@ -7,15 +7,15 @@ msgstr "" "Project-Id-Version: Odoo Server 11.0\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2019-08-27 14:47+0000\n" -"PO-Revision-Date: 2019-08-27 16:48+0200\n" -"Last-Translator: \n" +"PO-Revision-Date: 2021-05-11 12:47+0000\n" +"Last-Translator: Haftec \n" "Language-Team: \n" "Language: es\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" -"Plural-Forms: nplurals=2; plural=(n != 1);\n" -"X-Generator: Poedit 2.0.6\n" +"Plural-Forms: nplurals=2; plural=n != 1;\n" +"X-Generator: Weblate 4.3.2\n" #. module: stock_barcodes_gs1 #: code:addons/stock_barcodes_gs1/wizard/stock_barcodes_read.py:0 @@ -39,7 +39,7 @@ msgstr "Código de barras leído correctamente" #: code:addons/stock_barcodes_gs1/wizard/stock_barcodes_read.py:0 #, python-format msgid "More than one package found" -msgstr "Se ha encontrado más de un empaquetado." +msgstr "Se ha encontrado más de un empaquetado" #. module: stock_barcodes_gs1 #: model:ir.model,name:stock_barcodes_gs1.model_wiz_stock_barcodes_new_lot diff --git a/stock_barcodes_gs1/tests/test_stock_barcodes_gs1.py b/stock_barcodes_gs1/tests/test_stock_barcodes_gs1.py index 0eb1fe569825..2950c7c3c12a 100644 --- a/stock_barcodes_gs1/tests/test_stock_barcodes_gs1.py +++ b/stock_barcodes_gs1/tests/test_stock_barcodes_gs1.py @@ -11,7 +11,9 @@ class TestStockBarcodesGS1(TestStockBarcodes): def setUp(self): super().setUp() # Barcode for packaging and lot - self.gs1_barcode_01 = "01195011015300001714070410AB-123" + self.gs1_barcode_01_product = "0119501101530000" + self.gs1_barcode_01_lot = "1714070410AB-123" + self.gs1_barcode_01 = self.gs1_barcode_01_product + self.gs1_barcode_01_lot self.gs1_barcode_01_not_found = "011xxx11015300001714070410AB-123" self.gs1_barcode_01_not_lot = "01195011015300001714070410AB-124" # Barcode for product and quantities @@ -35,6 +37,28 @@ def setUp(self): } ) + def test_wizard_scan_gs1_package_multi(self): + self.packaging_gs1.product_id = self.product_tracking_gs1 + lot = self.StockProductionLot.create( + { + "name": "AB-123", + "product_id": self.product_tracking_gs1.id, + "company_id": self.company.id, + } + ) + self.action_barcode_scanned(self.wiz_scan, self.gs1_barcode_01_product) + self.assertEqual(self.wiz_scan.product_id, self.product_tracking_gs1) + self.assertEqual(self.wiz_scan.packaging_id, self.packaging_gs1) + self.assertFalse(self.wiz_scan.lot_id) + self.assertEqual(self.wiz_scan.packaging_qty, 1) + self.assertEqual(self.wiz_scan.product_qty, 10) + self.action_barcode_scanned(self.wiz_scan, self.gs1_barcode_01_lot) + self.assertEqual(self.wiz_scan.product_id, self.product_tracking_gs1) + self.assertEqual(self.wiz_scan.packaging_id, self.packaging_gs1) + self.assertEqual(self.wiz_scan.lot_id, lot) + self.assertEqual(self.wiz_scan.packaging_qty, 1) + self.assertEqual(self.wiz_scan.product_qty, 10) + def test_wizard_scan_gs1_package(self): self.action_barcode_scanned(self.wiz_scan, self.gs1_barcode_01) self.assertEqual(self.wiz_scan.packaging_id, self.packaging_gs1) diff --git a/stock_barcodes_gs1/wizard/stock_barcodes_read.py b/stock_barcodes_gs1/wizard/stock_barcodes_read.py index 8c0517c41010..5b1ec95ca213 100644 --- a/stock_barcodes_gs1/wizard/stock_barcodes_read.py +++ b/stock_barcodes_gs1/wizard/stock_barcodes_read.py @@ -78,6 +78,13 @@ def process_barcode(self, barcode): processed = True if product_qty: self.product_qty = product_qty + if not self.product_qty: + # This could happen with double GS1-128 barcodes + if self.packaging_id: + self.packaging_qty = 0.0 if self.manual_entry else 1.0 + self.product_qty = self.packaging_id.qty * self.packaging_qty + else: + self.product_qty = 0.0 if self.manual_entry else 1.0 if processed: self.action_done() self._set_messagge_info("success", _("Barcode read correctly")) From 5c4683e4a4cc5c76c25dfa07e41780a8cf46d5c0 Mon Sep 17 00:00:00 2001 From: Enric Tobella Date: Wed, 2 Jun 2021 11:11:13 +0200 Subject: [PATCH 12/19] [FIX] stock_barcodes_gs1 * Do not replace the quantity if a package is readed, we should multiply it * Use the product barcode as a packaging barcode if no packaging barcode has been read and no product has been found --- stock_barcodes_gs1/__manifest__.py | 2 +- .../tests/test_stock_barcodes_gs1.py | 41 ++++++++++++++++++- .../wizard/stock_barcodes_read.py | 11 ++++- 3 files changed, 50 insertions(+), 4 deletions(-) diff --git a/stock_barcodes_gs1/__manifest__.py b/stock_barcodes_gs1/__manifest__.py index 2aa040709601..140545bee9fd 100644 --- a/stock_barcodes_gs1/__manifest__.py +++ b/stock_barcodes_gs1/__manifest__.py @@ -3,7 +3,7 @@ { "name": "Stock Barcodes GS1", "summary": "It provides read GS1 barcode on stock operations.", - "version": "13.0.1.0.3", + "version": "13.0.1.1.0", "author": "Tecnativa, Odoo Community Association (OCA)", "website": "https://odoo-community.org/", "license": "AGPL-3", diff --git a/stock_barcodes_gs1/tests/test_stock_barcodes_gs1.py b/stock_barcodes_gs1/tests/test_stock_barcodes_gs1.py index 2950c7c3c12a..56b8fe07c38c 100644 --- a/stock_barcodes_gs1/tests/test_stock_barcodes_gs1.py +++ b/stock_barcodes_gs1/tests/test_stock_barcodes_gs1.py @@ -13,6 +13,9 @@ def setUp(self): # Barcode for packaging and lot self.gs1_barcode_01_product = "0119501101530000" self.gs1_barcode_01_lot = "1714070410AB-123" + self.gs1_separator = self.env.user.gs1_barcode_separator or "\x1D" + self.gs1_barcode_unit_01 = self.gs1_separator + "371" + self.gs1_barcode_unit_02 = self.gs1_separator + "372" self.gs1_barcode_01 = self.gs1_barcode_01_product + self.gs1_barcode_01_lot self.gs1_barcode_01_not_found = "011xxx11015300001714070410AB-123" self.gs1_barcode_01_not_lot = "01195011015300001714070410AB-124" @@ -78,6 +81,21 @@ def test_wizard_scan_gs1_package(self): "(More than one package found)", ) + def test_wizard_scan_gs1_package_units(self): + self.action_barcode_scanned(self.wiz_scan, self.gs1_barcode_01) + self.assertEqual(self.wiz_scan.packaging_id, self.packaging_gs1) + self.assertEqual(self.wiz_scan.product_qty, 10) + self.action_barcode_scanned( + self.wiz_scan, self.gs1_barcode_01 + self.gs1_barcode_unit_01 + ) + self.assertEqual(self.wiz_scan.packaging_id, self.packaging_gs1) + self.assertEqual(self.wiz_scan.product_qty, 10) + self.action_barcode_scanned( + self.wiz_scan, self.gs1_barcode_01 + self.gs1_barcode_unit_02 + ) + self.assertEqual(self.wiz_scan.packaging_id, self.packaging_gs1) + self.assertEqual(self.wiz_scan.product_qty, 20) + def test_wizard_scan_gs1_product(self): self.action_barcode_scanned(self.wiz_scan, self.gs1_barcode_02) self.assertEqual(self.wiz_scan.product_id, self.product_wo_tracking_gs1) @@ -86,8 +104,29 @@ def test_wizard_scan_gs1_product(self): self.action_barcode_scanned(self.wiz_scan, self.gs1_barcode_02_not_found) self.assertEqual( self.wiz_scan.message, - "Barcode: 020xxx0001234567150410183724 " "(Barcode for product not found)", + "Barcode: 020xxx0001234567150410183724 " + "(Barcode for product packaging not found)", + ) + + def test_wizard_scan_gs1_product_as_packaging(self): + self.product_wo_tracking_gs1.barcode = "X07010001234567Xg" + self.action_barcode_scanned(self.wiz_scan, self.gs1_barcode_02) + self.assertEqual( + self.wiz_scan.message, + "Barcode: 0207010001234567150410183724 " + "(Barcode for product packaging not found)", ) + self.ProductPackaging.create( + { + "product_id": self.product_wo_tracking_gs1.id, + "name": "Barcode as package", + "qty": 2.0, + "barcode": "07010001234567", + } + ) + self.action_barcode_scanned(self.wiz_scan, self.gs1_barcode_02) + self.assertEqual(self.wiz_scan.product_id, self.product_wo_tracking_gs1) + self.assertEqual(self.wiz_scan.product_qty, 48) def test_wizard_scan_gs1_lot(self): self.packaging_gs1.product_id = self.product_tracking_gs1 diff --git a/stock_barcodes_gs1/wizard/stock_barcodes_read.py b/stock_barcodes_gs1/wizard/stock_barcodes_read.py index 5b1ec95ca213..2be6218bc7af 100644 --- a/stock_barcodes_gs1/wizard/stock_barcodes_read.py +++ b/stock_barcodes_gs1/wizard/stock_barcodes_read.py @@ -50,7 +50,11 @@ def process_barcode(self, barcode): product = self.env["product.product"].search( self._barcode_domain(product_barcode) ) - if not product: + if not product and not package_barcode: + # If we did not found a product and we have not a package, maybe we + # can try to use this product barcode as a packaging barcode + package_barcode = product_barcode + elif not product: self._set_messagge_info("not_found", _("Barcode for product not found")) return False else: @@ -76,7 +80,10 @@ def process_barcode(self, barcode): if lot_barcode and self.product_id.tracking != "none": self.process_lot(barcode_decoded) processed = True - if product_qty: + if product_qty and package_barcode: + # If we have processed a package, we need to multiply it + self.product_qty = self.product_qty * product_qty + elif product_qty: self.product_qty = product_qty if not self.product_qty: # This could happen with double GS1-128 barcodes From 8ad5b878df48f510481b6230712806b7783e620a Mon Sep 17 00:00:00 2001 From: Jasmin Solanki Date: Wed, 16 Feb 2022 11:31:50 +0530 Subject: [PATCH 13/19] [IMP] stock_barcodes_gs1: black, isort, prettier --- stock_barcodes_gs1/__manifest__.py | 2 +- stock_barcodes_gs1/wizard/stock_barcodes_read.py | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/stock_barcodes_gs1/__manifest__.py b/stock_barcodes_gs1/__manifest__.py index 140545bee9fd..6373fa76efcb 100644 --- a/stock_barcodes_gs1/__manifest__.py +++ b/stock_barcodes_gs1/__manifest__.py @@ -5,7 +5,7 @@ "summary": "It provides read GS1 barcode on stock operations.", "version": "13.0.1.1.0", "author": "Tecnativa, Odoo Community Association (OCA)", - "website": "https://odoo-community.org/", + "website": "https://github.com/OCA/stock-logistics-barcode", "license": "AGPL-3", "category": "Extra Tools", "depends": ["stock_barcodes", "base_gs1_barcode"], diff --git a/stock_barcodes_gs1/wizard/stock_barcodes_read.py b/stock_barcodes_gs1/wizard/stock_barcodes_read.py index 2be6218bc7af..c1791109aaed 100644 --- a/stock_barcodes_gs1/wizard/stock_barcodes_read.py +++ b/stock_barcodes_gs1/wizard/stock_barcodes_read.py @@ -29,7 +29,7 @@ def process_lot(self, barcode_decoded): self.lot_id = lot def process_barcode(self, barcode): - """ Only has been implemented AI (01, 02, 10, 37), so is possible that + """Only has been implemented AI (01, 02, 10, 37), so is possible that scanner reads a barcode ok but this one is not precessed. """ try: From a2da250c6f0b69bf67b2b66f5647668cbabb1ba2 Mon Sep 17 00:00:00 2001 From: Jasmin Solanki Date: Wed, 16 Feb 2022 12:35:11 +0530 Subject: [PATCH 14/19] [MIG] stock_barcodes_gs1: Migration to 14.0 --- stock_barcodes_gs1/README.rst | 10 +++++----- stock_barcodes_gs1/__manifest__.py | 2 +- .../i18n/stock_barcodes_gs1.pot | 20 ++++++++++++++++++- .../static/description/index.html | 6 +++--- .../tests/test_stock_barcodes_new_lot_gs1.py | 4 +--- 5 files changed, 29 insertions(+), 13 deletions(-) diff --git a/stock_barcodes_gs1/README.rst b/stock_barcodes_gs1/README.rst index 676c4c33a2c0..c56956ea31ba 100644 --- a/stock_barcodes_gs1/README.rst +++ b/stock_barcodes_gs1/README.rst @@ -14,13 +14,13 @@ Stock Barcodes GS1 :target: http://www.gnu.org/licenses/agpl-3.0-standalone.html :alt: License: AGPL-3 .. |badge3| image:: https://img.shields.io/badge/github-OCA%2Fstock--logistics--barcode-lightgray.png?logo=github - :target: https://github.com/OCA/stock-logistics-barcode/tree/13.0/stock_barcodes_gs1 + :target: https://github.com/OCA/stock-logistics-barcode/tree/14.0/stock_barcodes_gs1 :alt: OCA/stock-logistics-barcode .. |badge4| image:: https://img.shields.io/badge/weblate-Translate%20me-F47D42.png - :target: https://translation.odoo-community.org/projects/stock-logistics-barcode-13-0/stock-logistics-barcode-13-0-stock_barcodes_gs1 + :target: https://translation.odoo-community.org/projects/stock-logistics-barcode-14-0/stock-logistics-barcode-14-0-stock_barcodes_gs1 :alt: Translate me on Weblate .. |badge5| image:: https://img.shields.io/badge/runbot-Try%20me-875A7B.png - :target: https://runbot.odoo-community.org/runbot/150/13.0 + :target: https://runbot.odoo-community.org/runbot/150/14.0 :alt: Try me on Runbot |badge1| |badge2| |badge3| |badge4| |badge5| @@ -45,7 +45,7 @@ Bug Tracker Bugs are tracked on `GitHub Issues `_. In case of trouble, please check there if your issue has already been reported. If you spotted it first, help us smashing it by providing a detailed and welcomed -`feedback `_. +`feedback `_. Do not contact contributors directly about support or help with technical issues. @@ -80,6 +80,6 @@ OCA, or the Odoo Community Association, is a nonprofit organization whose mission is to support the collaborative development of Odoo features and promote its widespread use. -This module is part of the `OCA/stock-logistics-barcode `_ project on GitHub. +This module is part of the `OCA/stock-logistics-barcode `_ project on GitHub. You are welcome to contribute. To learn how please visit https://odoo-community.org/page/Contribute. diff --git a/stock_barcodes_gs1/__manifest__.py b/stock_barcodes_gs1/__manifest__.py index 6373fa76efcb..7418e0d7970e 100644 --- a/stock_barcodes_gs1/__manifest__.py +++ b/stock_barcodes_gs1/__manifest__.py @@ -3,7 +3,7 @@ { "name": "Stock Barcodes GS1", "summary": "It provides read GS1 barcode on stock operations.", - "version": "13.0.1.1.0", + "version": "14.0.1.0.0", "author": "Tecnativa, Odoo Community Association (OCA)", "website": "https://github.com/OCA/stock-logistics-barcode", "license": "AGPL-3", diff --git a/stock_barcodes_gs1/i18n/stock_barcodes_gs1.pot b/stock_barcodes_gs1/i18n/stock_barcodes_gs1.pot index 27e1ecaa051b..7606769b2d7b 100644 --- a/stock_barcodes_gs1/i18n/stock_barcodes_gs1.pot +++ b/stock_barcodes_gs1/i18n/stock_barcodes_gs1.pot @@ -4,7 +4,7 @@ # msgid "" msgstr "" -"Project-Id-Version: Odoo Server 13.0\n" +"Project-Id-Version: Odoo Server 14.0\n" "Report-Msgid-Bugs-To: \n" "Last-Translator: \n" "Language-Team: \n" @@ -31,6 +31,24 @@ msgstr "" msgid "Barcode read correctly" msgstr "" +#. module: stock_barcodes_gs1 +#: model:ir.model.fields,field_description:stock_barcodes_gs1.field_wiz_stock_barcodes_new_lot__display_name +#: model:ir.model.fields,field_description:stock_barcodes_gs1.field_wiz_stock_barcodes_read__display_name +msgid "Display Name" +msgstr "" + +#. module: stock_barcodes_gs1 +#: model:ir.model.fields,field_description:stock_barcodes_gs1.field_wiz_stock_barcodes_new_lot__id +#: model:ir.model.fields,field_description:stock_barcodes_gs1.field_wiz_stock_barcodes_read__id +msgid "ID" +msgstr "" + +#. module: stock_barcodes_gs1 +#: model:ir.model.fields,field_description:stock_barcodes_gs1.field_wiz_stock_barcodes_new_lot____last_update +#: model:ir.model.fields,field_description:stock_barcodes_gs1.field_wiz_stock_barcodes_read____last_update +msgid "Last Modified on" +msgstr "" + #. module: stock_barcodes_gs1 #: code:addons/stock_barcodes_gs1/wizard/stock_barcodes_read.py:0 #, python-format diff --git a/stock_barcodes_gs1/static/description/index.html b/stock_barcodes_gs1/static/description/index.html index 1723a4efa42f..35cc12413d76 100644 --- a/stock_barcodes_gs1/static/description/index.html +++ b/stock_barcodes_gs1/static/description/index.html @@ -367,7 +367,7 @@

Stock Barcodes GS1

!! This file is generated by oca-gen-addon-readme !! !! changes will be overwritten. !! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! --> -

Beta License: AGPL-3 OCA/stock-logistics-barcode Translate me on Weblate Try me on Runbot

+

Beta License: AGPL-3 OCA/stock-logistics-barcode Translate me on Weblate Try me on Runbot

This module extends barcode reader interface to allow to read GS1 barcodes.

The AI’s implemented are 01(Group), 02(Product), 37(Quantity) and 10(Lots).

Table of contents

@@ -392,7 +392,7 @@

Bug Tracker

Bugs are tracked on GitHub Issues. In case of trouble, please check there if your issue has already been reported. If you spotted it first, help us smashing it by providing a detailed and welcomed -feedback.

+feedback.

Do not contact contributors directly about support or help with technical issues.

@@ -421,7 +421,7 @@

Maintainers

OCA, or the Odoo Community Association, is a nonprofit organization whose mission is to support the collaborative development of Odoo features and promote its widespread use.

-

This module is part of the OCA/stock-logistics-barcode project on GitHub.

+

This module is part of the OCA/stock-logistics-barcode project on GitHub.

You are welcome to contribute. To learn how please visit https://odoo-community.org/page/Contribute.

diff --git a/stock_barcodes_gs1/tests/test_stock_barcodes_new_lot_gs1.py b/stock_barcodes_gs1/tests/test_stock_barcodes_new_lot_gs1.py index 271c546b156d..188be5523442 100644 --- a/stock_barcodes_gs1/tests/test_stock_barcodes_new_lot_gs1.py +++ b/stock_barcodes_gs1/tests/test_stock_barcodes_new_lot_gs1.py @@ -2,9 +2,7 @@ # License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl). from odoo.tests import common -from odoo.addons.stock_barcodes_gs1.tests.test_stock_barcodes_gs1 import ( - TestStockBarcodesGS1, -) +from .test_stock_barcodes_gs1 import TestStockBarcodesGS1 @common.tagged("post_install", "-at_install") From d4bca0e637f86f142971467ff1dc8be6da8de8d7 Mon Sep 17 00:00:00 2001 From: Lois Rilo Date: Tue, 15 Mar 2022 17:57:44 +0100 Subject: [PATCH 15/19] [FIX] stock_barcodes_gs1: take company from env --- stock_barcodes_gs1/__manifest__.py | 2 +- stock_barcodes_gs1/wizard/stock_barcodes_read.py | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/stock_barcodes_gs1/__manifest__.py b/stock_barcodes_gs1/__manifest__.py index 7418e0d7970e..801d32bd809f 100644 --- a/stock_barcodes_gs1/__manifest__.py +++ b/stock_barcodes_gs1/__manifest__.py @@ -3,7 +3,7 @@ { "name": "Stock Barcodes GS1", "summary": "It provides read GS1 barcode on stock operations.", - "version": "14.0.1.0.0", + "version": "14.0.1.0.1", "author": "Tecnativa, Odoo Community Association (OCA)", "website": "https://github.com/OCA/stock-logistics-barcode", "license": "AGPL-3", diff --git a/stock_barcodes_gs1/wizard/stock_barcodes_read.py b/stock_barcodes_gs1/wizard/stock_barcodes_read.py index c1791109aaed..a94269e28a91 100644 --- a/stock_barcodes_gs1/wizard/stock_barcodes_read.py +++ b/stock_barcodes_gs1/wizard/stock_barcodes_read.py @@ -11,7 +11,7 @@ def _prepare_lot_values(self, barcode_decoded): return { "name": lot_barcode, "product_id": self.product_id.id, - "company_id": self.env.user.company_id.id, + "company_id": self.env.company.id, } def _create_lot(self, barcode_decoded): From c8fccdbf3932f3bee39f6c0c1d87b044a28e35a8 Mon Sep 17 00:00:00 2001 From: sergio-teruel Date: Wed, 27 Oct 2021 21:20:41 +0200 Subject: [PATCH 16/19] [IMP] stock_barcodes: Refactoring code and improvements --- .../tests/test_stock_barcodes_gs1.py | 18 +++++++++--------- 1 file changed, 9 insertions(+), 9 deletions(-) diff --git a/stock_barcodes_gs1/tests/test_stock_barcodes_gs1.py b/stock_barcodes_gs1/tests/test_stock_barcodes_gs1.py index 56b8fe07c38c..487856e0eb72 100644 --- a/stock_barcodes_gs1/tests/test_stock_barcodes_gs1.py +++ b/stock_barcodes_gs1/tests/test_stock_barcodes_gs1.py @@ -39,6 +39,8 @@ def setUp(self): "barcode": "19501101530000", } ) + # Set location to avoid crash tests + self.wiz_scan.location_id = self.location_1 def test_wizard_scan_gs1_package_multi(self): self.packaging_gs1.product_id = self.product_tracking_gs1 @@ -69,7 +71,7 @@ def test_wizard_scan_gs1_package(self): self.action_barcode_scanned(self.wiz_scan, self.gs1_barcode_01_not_found) self.assertEqual( self.wiz_scan.message, - "Barcode: 011xxx11015300001714070410AB-123 " + "011xxx11015300001714070410AB-123 " "(Barcode for product packaging not found)", ) # Scan packaging barcode with more than one package @@ -77,8 +79,7 @@ def test_wizard_scan_gs1_package(self): self.action_barcode_scanned(self.wiz_scan, self.gs1_barcode_01) self.assertEqual( self.wiz_scan.message, - "Barcode: 01195011015300001714070410AB-123 " - "(More than one package found)", + "01195011015300001714070410AB-123 " "(More than one package found)", ) def test_wizard_scan_gs1_package_units(self): @@ -97,6 +98,7 @@ def test_wizard_scan_gs1_package_units(self): self.assertEqual(self.wiz_scan.product_qty, 20) def test_wizard_scan_gs1_product(self): + self.wiz_scan.location_id = self.location_1 self.action_barcode_scanned(self.wiz_scan, self.gs1_barcode_02) self.assertEqual(self.wiz_scan.product_id, self.product_wo_tracking_gs1) self.assertEqual(self.wiz_scan.product_qty, 24) @@ -104,8 +106,7 @@ def test_wizard_scan_gs1_product(self): self.action_barcode_scanned(self.wiz_scan, self.gs1_barcode_02_not_found) self.assertEqual( self.wiz_scan.message, - "Barcode: 020xxx0001234567150410183724 " - "(Barcode for product packaging not found)", + "020xxx0001234567150410183724 (Barcode for product packaging not found)", ) def test_wizard_scan_gs1_product_as_packaging(self): @@ -113,8 +114,7 @@ def test_wizard_scan_gs1_product_as_packaging(self): self.action_barcode_scanned(self.wiz_scan, self.gs1_barcode_02) self.assertEqual( self.wiz_scan.message, - "Barcode: 0207010001234567150410183724 " - "(Barcode for product packaging not found)", + "0207010001234567150410183724 " "(Barcode for product packaging not found)", ) self.ProductPackaging.create( { @@ -141,7 +141,7 @@ def test_wizard_scan_gs1_lot(self): self.assertEqual(self.wiz_scan.lot_id, lot) self.assertEqual( self.wiz_scan.message, - "Barcode: 01195011015300001714070410AB-123 " "(Barcode read correctly)", + "01195011015300001714070410AB-123 " "(Barcode read correctly)", ) self.action_barcode_scanned(self.wiz_scan, self.gs1_barcode_01_not_lot) self.assertEqual(self.wiz_scan.lot_id.name, "AB-124") @@ -150,7 +150,7 @@ def test_wizard_scan_gs1_not_found(self): self.action_barcode_scanned(self.wiz_scan, self.gs1_barcode_01_not_processed) self.assertEqual( self.wiz_scan.message, - "Barcode: 0199316710123453310100262013050417" + "0199316710123453310100262013050417" "10ABC123214145354 (Barcode for product packaging " "not found)", ) From e13621316eab8bd62ceface61eb1cc0c326bac2a Mon Sep 17 00:00:00 2001 From: Lois Rilo Date: Thu, 7 Jul 2022 13:22:08 +0200 Subject: [PATCH 17/19] [IMP] stock_barcodes_gs1: improvements after refactor of stock_barcodes * Auto create lot controlled from barcode options. * Check required options before processing. * Reduce complexity of `process_barcode` and enhance extensibility of package barcode processing. * More extensibility on product_qty handling. * Align new lot wizard with barcodes read one by adding support to AI 240 --- stock_barcodes_gs1/__manifest__.py | 2 +- .../wizard/stock_barcodes_read.py | 44 ++++++++++++------- .../wizard/stock_production_lot.py | 5 +++ 3 files changed, 33 insertions(+), 18 deletions(-) diff --git a/stock_barcodes_gs1/__manifest__.py b/stock_barcodes_gs1/__manifest__.py index 801d32bd809f..6de5d195c66b 100644 --- a/stock_barcodes_gs1/__manifest__.py +++ b/stock_barcodes_gs1/__manifest__.py @@ -3,7 +3,7 @@ { "name": "Stock Barcodes GS1", "summary": "It provides read GS1 barcode on stock operations.", - "version": "14.0.1.0.1", + "version": "14.0.2.0.0", "author": "Tecnativa, Odoo Community Association (OCA)", "website": "https://github.com/OCA/stock-logistics-barcode", "license": "AGPL-3", diff --git a/stock_barcodes_gs1/wizard/stock_barcodes_read.py b/stock_barcodes_gs1/wizard/stock_barcodes_read.py index a94269e28a91..aa03f0e6a694 100644 --- a/stock_barcodes_gs1/wizard/stock_barcodes_read.py +++ b/stock_barcodes_gs1/wizard/stock_barcodes_read.py @@ -24,10 +24,29 @@ def process_lot(self, barcode_decoded): lot = self.env["stock.production.lot"].search( [("name", "=", lot_barcode), ("product_id", "=", self.product_id.id)] ) - if not lot: + if not lot and self.option_group_id.create_lot: lot = self._create_lot(barcode_decoded) self.lot_id = lot + def _process_product_qty_gs1(self, product_qty): + """Extend for custom processing of product qty.""" + return product_qty + + def process_barcode_package(self, package_barcode, processed): + packaging = self.env["product.packaging"].search( + self._barcode_domain(package_barcode) + ) + if not packaging: + self._set_messagge_info( + "not_found", _("Barcode for product packaging not found") + ) + return False + else: + if len(packaging) > 1: + self._set_messagge_info("more_match", _("More than one package found")) + return False + self.action_packaging_scaned_post(packaging) + def process_barcode(self, barcode): """Only has been implemented AI (01, 02, 10, 37), so is possible that scanner reads a barcode ok but this one is not precessed. @@ -61,29 +80,18 @@ def process_barcode(self, barcode): processed = True self.action_product_scaned_post(product) if package_barcode: - packaging = self.env["product.packaging"].search( - self._barcode_domain(package_barcode) - ) - if not packaging: - self._set_messagge_info( - "not_found", _("Barcode for product packaging not found") - ) - return False - else: - if len(packaging) > 1: - self._set_messagge_info( - "more_match", _("More than one package found") - ) - return False - processed = True - self.action_packaging_scaned_post(packaging) + value_returned = self.process_barcode_package(package_barcode, processed) + if value_returned is not None: + return value_returned if lot_barcode and self.product_id.tracking != "none": self.process_lot(barcode_decoded) processed = True if product_qty and package_barcode: # If we have processed a package, we need to multiply it + product_qty = self._process_product_qty_gs1(product_qty) self.product_qty = self.product_qty * product_qty elif product_qty: + product_qty = self._process_product_qty_gs1(product_qty) self.product_qty = product_qty if not self.product_qty: # This could happen with double GS1-128 barcodes @@ -93,6 +101,8 @@ def process_barcode(self, barcode): else: self.product_qty = 0.0 if self.manual_entry else 1.0 if processed: + if not self.check_option_required(): + return False self.action_done() self._set_messagge_info("success", _("Barcode read correctly")) return True diff --git a/stock_barcodes_gs1/wizard/stock_production_lot.py b/stock_barcodes_gs1/wizard/stock_production_lot.py index 5ccf9fe1a497..167cd17e105c 100644 --- a/stock_barcodes_gs1/wizard/stock_production_lot.py +++ b/stock_barcodes_gs1/wizard/stock_production_lot.py @@ -17,6 +17,11 @@ def on_barcode_scanned(self, barcode): return super().on_barcode_scanned(barcode) package_barcode = barcode_decoded.get("01", False) product_barcode = barcode_decoded.get("02", False) + if not product_barcode: + # Sometimes the product does not yet have a GTIN. In this case + # try the AI 240 'Additional product identification assigned + # by the manufacturer'. + product_barcode = barcode_decoded.get("240", False) lot_barcode = barcode_decoded.get("10", False) if not lot_barcode: return From 17673c322e5a1385ce5c7e66b2050269155e4b11 Mon Sep 17 00:00:00 2001 From: sergio-teruel Date: Fri, 5 Aug 2022 12:06:56 +0200 Subject: [PATCH 18/19] [FIX] stock_barcodes_gs1: Do action_confirm after gs1 is readed instead of action_done --- stock_barcodes_gs1/__manifest__.py | 2 +- stock_barcodes_gs1/wizard/stock_barcodes_read.py | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/stock_barcodes_gs1/__manifest__.py b/stock_barcodes_gs1/__manifest__.py index 6de5d195c66b..df007d7ef83d 100644 --- a/stock_barcodes_gs1/__manifest__.py +++ b/stock_barcodes_gs1/__manifest__.py @@ -3,7 +3,7 @@ { "name": "Stock Barcodes GS1", "summary": "It provides read GS1 barcode on stock operations.", - "version": "14.0.2.0.0", + "version": "14.0.2.0.1", "author": "Tecnativa, Odoo Community Association (OCA)", "website": "https://github.com/OCA/stock-logistics-barcode", "license": "AGPL-3", diff --git a/stock_barcodes_gs1/wizard/stock_barcodes_read.py b/stock_barcodes_gs1/wizard/stock_barcodes_read.py index aa03f0e6a694..c8614c0149c5 100644 --- a/stock_barcodes_gs1/wizard/stock_barcodes_read.py +++ b/stock_barcodes_gs1/wizard/stock_barcodes_read.py @@ -103,7 +103,7 @@ def process_barcode(self, barcode): if processed: if not self.check_option_required(): return False - self.action_done() + self.action_confirm() self._set_messagge_info("success", _("Barcode read correctly")) return True return super().process_barcode(barcode) From 8e7e8aac792d03f267f38c5161d4e86cddb3d052 Mon Sep 17 00:00:00 2001 From: sergio-teruel Date: Thu, 16 Feb 2023 23:59:08 +0100 Subject: [PATCH 19/19] [MIG] stock_barcodes_gs1: Migration to v15.0 --- .../models/barcode_generate_mixin.py | 2 +- .../odoo/addons/stock_barcodes_gs1 | 1 + setup/stock_barcodes_gs1/setup.py | 6 ++++++ stock_barcodes_gs1/README.rst | 14 +++++++------- stock_barcodes_gs1/__manifest__.py | 2 +- stock_barcodes_gs1/static/description/index.html | 8 ++++---- .../tests/test_stock_barcodes_gs1.py | 2 +- 7 files changed, 21 insertions(+), 14 deletions(-) create mode 120000 setup/stock_barcodes_gs1/odoo/addons/stock_barcodes_gs1 create mode 100644 setup/stock_barcodes_gs1/setup.py diff --git a/barcodes_generator_abstract/models/barcode_generate_mixin.py b/barcodes_generator_abstract/models/barcode_generate_mixin.py index 9f5706d395ad..7a552cd36551 100644 --- a/barcodes_generator_abstract/models/barcode_generate_mixin.py +++ b/barcodes_generator_abstract/models/barcode_generate_mixin.py @@ -6,7 +6,7 @@ import logging -import barcode +import barcode # pylint: disable=W7936 from odoo import _, api, exceptions, fields, models diff --git a/setup/stock_barcodes_gs1/odoo/addons/stock_barcodes_gs1 b/setup/stock_barcodes_gs1/odoo/addons/stock_barcodes_gs1 new file mode 120000 index 000000000000..204b6b05edf9 --- /dev/null +++ b/setup/stock_barcodes_gs1/odoo/addons/stock_barcodes_gs1 @@ -0,0 +1 @@ +../../../../stock_barcodes_gs1 \ No newline at end of file diff --git a/setup/stock_barcodes_gs1/setup.py b/setup/stock_barcodes_gs1/setup.py new file mode 100644 index 000000000000..28c57bb64031 --- /dev/null +++ b/setup/stock_barcodes_gs1/setup.py @@ -0,0 +1,6 @@ +import setuptools + +setuptools.setup( + setup_requires=['setuptools-odoo'], + odoo_addon=True, +) diff --git a/stock_barcodes_gs1/README.rst b/stock_barcodes_gs1/README.rst index c56956ea31ba..0293d2c52b5d 100644 --- a/stock_barcodes_gs1/README.rst +++ b/stock_barcodes_gs1/README.rst @@ -14,14 +14,14 @@ Stock Barcodes GS1 :target: http://www.gnu.org/licenses/agpl-3.0-standalone.html :alt: License: AGPL-3 .. |badge3| image:: https://img.shields.io/badge/github-OCA%2Fstock--logistics--barcode-lightgray.png?logo=github - :target: https://github.com/OCA/stock-logistics-barcode/tree/14.0/stock_barcodes_gs1 + :target: https://github.com/OCA/stock-logistics-barcode/tree/15.0/stock_barcodes_gs1 :alt: OCA/stock-logistics-barcode .. |badge4| image:: https://img.shields.io/badge/weblate-Translate%20me-F47D42.png - :target: https://translation.odoo-community.org/projects/stock-logistics-barcode-14-0/stock-logistics-barcode-14-0-stock_barcodes_gs1 + :target: https://translation.odoo-community.org/projects/stock-logistics-barcode-15-0/stock-logistics-barcode-15-0-stock_barcodes_gs1 :alt: Translate me on Weblate -.. |badge5| image:: https://img.shields.io/badge/runbot-Try%20me-875A7B.png - :target: https://runbot.odoo-community.org/runbot/150/14.0 - :alt: Try me on Runbot +.. |badge5| image:: https://img.shields.io/badge/runboat-Try%20me-875A7B.png + :target: https://runboat.odoo-community.org/webui/builds.html?repo=OCA/stock-logistics-barcode&target_branch=15.0 + :alt: Try me on Runboat |badge1| |badge2| |badge3| |badge4| |badge5| @@ -45,7 +45,7 @@ Bug Tracker Bugs are tracked on `GitHub Issues `_. In case of trouble, please check there if your issue has already been reported. If you spotted it first, help us smashing it by providing a detailed and welcomed -`feedback `_. +`feedback `_. Do not contact contributors directly about support or help with technical issues. @@ -80,6 +80,6 @@ OCA, or the Odoo Community Association, is a nonprofit organization whose mission is to support the collaborative development of Odoo features and promote its widespread use. -This module is part of the `OCA/stock-logistics-barcode `_ project on GitHub. +This module is part of the `OCA/stock-logistics-barcode `_ project on GitHub. You are welcome to contribute. To learn how please visit https://odoo-community.org/page/Contribute. diff --git a/stock_barcodes_gs1/__manifest__.py b/stock_barcodes_gs1/__manifest__.py index df007d7ef83d..8a5d0e6478fd 100644 --- a/stock_barcodes_gs1/__manifest__.py +++ b/stock_barcodes_gs1/__manifest__.py @@ -3,7 +3,7 @@ { "name": "Stock Barcodes GS1", "summary": "It provides read GS1 barcode on stock operations.", - "version": "14.0.2.0.1", + "version": "15.0.1.0.0", "author": "Tecnativa, Odoo Community Association (OCA)", "website": "https://github.com/OCA/stock-logistics-barcode", "license": "AGPL-3", diff --git a/stock_barcodes_gs1/static/description/index.html b/stock_barcodes_gs1/static/description/index.html index 35cc12413d76..c10c9d710dcc 100644 --- a/stock_barcodes_gs1/static/description/index.html +++ b/stock_barcodes_gs1/static/description/index.html @@ -3,7 +3,7 @@ - + Stock Barcodes GS1