Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

[16.0][MIG] shopfloor_gs1 #966

Draft
wants to merge 9 commits into
base: 16.0
Choose a base branch
from
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions requirements.txt
Original file line number Diff line number Diff line change
@@ -1,2 +1,3 @@
# generated from manifests external_dependencies
biip
openupgradelib
1 change: 1 addition & 0 deletions setup/shopfloor_gs1/odoo/addons/shopfloor_gs1
6 changes: 6 additions & 0 deletions setup/shopfloor_gs1/setup.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,6 @@
import setuptools

setuptools.setup(
setup_requires=['setuptools-odoo'],
odoo_addon=True,
)
99 changes: 99 additions & 0 deletions shopfloor_gs1/README.rst
Original file line number Diff line number Diff line change
@@ -0,0 +1,99 @@
=============
Shopfloor GS1
=============

..
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
!! This file is generated by oca-gen-addon-readme !!
!! changes will be overwritten. !!
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
!! source digest: sha256:15ac24e92ed1dc3217969411ccf2ffaba7bd0a61c8eabadcab6cdb06030189cd
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!

.. |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%2Fwms-lightgray.png?logo=github
:target: https://github.com/OCA/wms/tree/16.0/shopfloor_gs1
:alt: OCA/wms
.. |badge4| image:: https://img.shields.io/badge/weblate-Translate%20me-F47D42.png
:target: https://translation.odoo-community.org/projects/wms-16-0/wms-16-0-shopfloor_gs1
:alt: Translate me on Weblate
.. |badge5| image:: https://img.shields.io/badge/runboat-Try%20me-875A7B.png
:target: https://runboat.odoo-community.org/builds?repo=OCA/wms&target_branch=16.0
:alt: Try me on Runboat

|badge1| |badge2| |badge3| |badge4| |badge5|

Add GS1 barcode support to Shopfloor.

Based on https://biip.readthedocs.io/

This module allows to use the biip library to interpret a scanned GS1 barcode
and return the corresponding Odoo record for Shopfloor `find` method.

**Table of contents**

.. contents::
:local:

Usage
=====

- You can use the `Scan` action in Shopfloor with a GS1 barcode. The

Bug Tracker
===========

Bugs are tracked on `GitHub Issues <https://github.com/OCA/wms/issues>`_.
In case of trouble, please check there if your issue has already been reported.
If you spotted it first, help us to smash it by providing a detailed and welcomed
`feedback <https://github.com/OCA/wms/issues/new?body=module:%20shopfloor_gs1%0Aversion:%2016.0%0A%0A**Steps%20to%20reproduce**%0A-%20...%0A%0A**Current%20behavior**%0A%0A**Expected%20behavior**>`_.

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

Credits
=======

Authors
~~~~~~~

* Camptocamp

Contributors
~~~~~~~~~~~~

* Simone Orsi <[email protected]>
* Sébastien Alix <[email protected]>
* Denis Roussel <[email protected]>

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.

.. |maintainer-simahawk| image:: https://github.com/simahawk.png?size=40px
:target: https://github.com/simahawk
:alt: simahawk
.. |maintainer-sebalix| image:: https://github.com/sebalix.png?size=40px
:target: https://github.com/sebalix
:alt: sebalix

Current `maintainers <https://odoo-community.org/page/maintainer-role>`__:

|maintainer-simahawk| |maintainer-sebalix|

This module is part of the `OCA/wms <https://github.com/OCA/wms/tree/16.0/shopfloor_gs1>`_ project on GitHub.

You are welcome to contribute. To learn how please visit https://odoo-community.org/page/Contribute.
1 change: 1 addition & 0 deletions shopfloor_gs1/__init__.py
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
from . import actions
24 changes: 24 additions & 0 deletions shopfloor_gs1/__manifest__.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,24 @@
# Copyright 2022 Camptocamp SA (http://www.camptocamp.com)
# @author Simone Orsi <[email protected]>
# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl.html).

{
"name": "Shopfloor GS1",
"summary": "Integrate GS1 barcode scan into Shopfloor app",
"version": "16.0.1.0.0",
"development_status": "Beta",
"category": "Inventory",
"website": "https://github.com/OCA/wms",
"author": "Camptocamp, Odoo Community Association (OCA)",
"maintainers": ["simahawk", "sebalix"],
"license": "AGPL-3",
"depends": ["shopfloor"],
"external_dependencies": {
"python": [
# >= 2.3.0 required to use 'GS1Message.parse_hri' method
# and next version 3.0.0 has been refactored bringing
# incompatibility issues (to check later).
"biip"
]
},
}
1 change: 1 addition & 0 deletions shopfloor_gs1/actions/__init__.py
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
from . import search
102 changes: 102 additions & 0 deletions shopfloor_gs1/actions/search.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,102 @@
# Copyright 2022 Camptocamp SA (http://www.camptocamp.com)
# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl.html).
from odoo.models import Model

from odoo.addons.component.core import Component
from odoo.addons.shopfloor.actions.barcode_parser import BarcodeResult

from ..config import MAPPING_AI_TO_TYPE, MAPPING_TYPE_TO_AI
from ..utils import GS1Barcode


class BarcodeParser(Component):
"""
Some barcodes can have complex data structure
"""

_inherit = "shopfloor.barcode.parser"

# def __init__(self, search_action: SearchAction):
# # Get search action keys
# self.search_action = search_action

# @property
# def _authorized_barcode_types(self):
# return self.search_action._barcode_type_handler.keys()

def parse(self, barcode):
"""
This method will parse the barcode and return the
value with its type if determined.

Override this to implement specific parsing

"""
search = self._actions_for("search")
parsed, record = search._find_gs1(barcode)
if parsed:
result = []
for barcode_type in search._barcode_type_handler.keys():
for parsed_item in parsed:
if parsed_item.ai in MAPPING_TYPE_TO_AI.get(barcode_type, tuple()):
result.append(
BarcodeResult(
type=barcode_type,
value=parsed_item.value,
raw=parsed_item.raw_value,
)
)
if result:
return result
return super().parse(barcode)


class SearchAction(Component):
_inherit = "shopfloor.search.action"

def _get_barcode_parser(self):
return self.env[""]

def _search_type_to_gs1_ai(self, _type):
"""Convert search type to AIs.

Each type can be mapped to multiple AIs.
For instance, you can search a product by barcode (01) or manufacturer code (240).
"""
return MAPPING_TYPE_TO_AI.get(_type)

def _gs1_ai_to_search_type(self, ai):
"""Convert back GS1 AI to search type."""
return MAPPING_AI_TO_TYPE[ai]

def find(self, barcode, types=None, handler_kw=None):
barcode = barcode or ""
# Try to find records via GS1 and fallback to normal search
_, record = self._find_gs1(barcode, types=types)
if record:
return record
return super().find(barcode, types=types, handler_kw=handler_kw)

def _find_gs1(
self, barcode, types=None, handler_kw=None, safe=True
) -> tuple[list[GS1Barcode], Model] | None:
types = types or ()
ai_whitelist = ()
# Collect all AIs by converting from search types
for _type in types:
ai = self._search_type_to_gs1_ai(_type)
if ai:
ai_whitelist += ai
if types and not ai_whitelist:
# A specific type was asked but no AI could be found.
return
parsed = GS1Barcode.parse(barcode, ai_whitelist=ai_whitelist, safe=safe)
# Return the 1st record found if parsing was successful
for item in parsed:
record = self.generic_find(
item.value,
types=(self._gs1_ai_to_search_type(item.ai),),
handler_kw=handler_kw,
)
if record:
return parsed, record
28 changes: 28 additions & 0 deletions shopfloor_gs1/config.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,28 @@
# Copyright 2022 Camptocamp SA (http://www.camptocamp.com)
# @author Simone Orsi <[email protected]>
# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl.html).

# https://www.gs1.org/standards/barcodes/application-identifiers
# TODO: define other internal mappings by convention


# Each type can be mapped to multiple AIs.
# For instance, you can search a product by barcode (01) or manufacturer code (240).
MAPPING_TYPE_TO_AI = {
"product": ("01", "240"),
"lot": ("10",),
"production_date": ("11",),
"expiration_date": ("17",),
"serial": ("21",),
"manuf_product_code": ("240",),
"location": ("254",),
}
MAPPING_AI_TO_TYPE = {
"01": "product",
"10": "lot",
"11": "production_date",
"17": "expiration_date",
"21": "serial",
"240": "product",
"254": "location",
}
3 changes: 3 additions & 0 deletions shopfloor_gs1/readme/CONTRIBUTORS.rst
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
* Simone Orsi <[email protected]>
* Sébastien Alix <[email protected]>
* Denis Roussel <[email protected]>
6 changes: 6 additions & 0 deletions shopfloor_gs1/readme/DESCRIPTION.rst
Original file line number Diff line number Diff line change
@@ -0,0 +1,6 @@
Add GS1 barcode support to Shopfloor.

Based on https://biip.readthedocs.io/

This module allows to use the biip library to interpret a scanned GS1 barcode
and return the corresponding Odoo record for Shopfloor `find` method.
1 change: 1 addition & 0 deletions shopfloor_gs1/readme/USAGE.rst
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
- You can use the `Scan` action in Shopfloor with a GS1 barcode. The
Loading
Loading