Initial commit: OCA Technical packages (595 packages)

This commit is contained in:
Ernad Husremovic 2025-08-29 15:43:03 +02:00
commit 2cc02aac6e
24950 changed files with 2318079 additions and 0 deletions

View file

@ -0,0 +1,46 @@
# Check Digit on Sequences
Odoo addon: sequence_check_digit
## Installation
```bash
pip install odoo-bringout-oca-server-ux-sequence_check_digit
```
## Dependencies
This addon depends on:
- base
## Manifest Information
- **Name**: Check Digit on Sequences
- **Version**: 16.0.1.0.1
- **Category**: Reporting
- **License**: LGPL-3
- **Installable**: True
## Source
Based on [OCA/server-ux](https://github.com/OCA/server-ux) branch 16.0, addon `sequence_check_digit`.
## License
This package maintains the original LGPL-3 license from the upstream Odoo project.
## Documentation
- Overview: doc/OVERVIEW.md
- Architecture: doc/ARCHITECTURE.md
- Models: doc/MODELS.md
- Controllers: doc/CONTROLLERS.md
- Wizards: doc/WIZARDS.md
- Reports: doc/REPORTS.md
- Security: doc/SECURITY.md
- Install: doc/INSTALL.md
- Usage: doc/USAGE.md
- Configuration: doc/CONFIGURATION.md
- Dependencies: doc/DEPENDENCIES.md
- Troubleshooting: doc/TROUBLESHOOTING.md
- FAQ: doc/FAQ.md

View file

@ -0,0 +1,32 @@
# Architecture
```mermaid
flowchart TD
U[Users] -->|HTTP| V[Views and QWeb Templates]
V --> C[Controllers]
V --> W[Wizards Transient Models]
C --> M[Models and ORM]
W --> M
M --> R[Reports]
DX[Data XML] --> M
S[Security ACLs and Groups] -. enforces .-> M
subgraph Sequence_check_digit Module - sequence_check_digit
direction LR
M:::layer
W:::layer
C:::layer
V:::layer
R:::layer
S:::layer
DX:::layer
end
classDef layer fill:#eef8ff,stroke:#6ea8fe,stroke-width:1px
```
Notes
- Views include tree/form/kanban templates and report templates.
- Controllers provide website/portal routes when present.
- Wizards are UI flows implemented with `models.TransientModel`.
- Data XML loads data/demo records; Security defines groups and access.

View file

@ -0,0 +1,3 @@
# Configuration
Refer to Odoo settings for sequence_check_digit. Configure related models, access rights, and options as needed.

View file

@ -0,0 +1,3 @@
# Controllers
This module does not define custom HTTP controllers.

View file

@ -0,0 +1,5 @@
# Dependencies
This addon depends on:
- base

View file

@ -0,0 +1,4 @@
# FAQ
- Q: Which Odoo version? A: 16.0 (OCA/OCB packaged).
- Q: How to enable? A: Start server with --addon sequence_check_digit or install in UI.

View file

@ -0,0 +1,7 @@
# Install
```bash
pip install odoo-bringout-oca-server-ux-sequence_check_digit"
# or
uv pip install odoo-bringout-oca-server-ux-sequence_check_digit"
```

View file

@ -0,0 +1,12 @@
# Models
Detected core models and extensions in sequence_check_digit.
```mermaid
classDiagram
class ir_sequence
```
Notes
- Classes show model technical names; fields omitted for brevity.
- Items listed under _inherit are extensions of existing models.

View file

@ -0,0 +1,6 @@
# Overview
Packaged Odoo addon: sequence_check_digit. Provides features documented in upstream Odoo 16 under this addon.
- Source: OCA/OCB 16.0, addon sequence_check_digit
- License: LGPL-3

View file

@ -0,0 +1,3 @@
# Reports
This module does not define custom reports.

View file

@ -0,0 +1,8 @@
# Security
This module does not define custom security rules or access controls beyond Odoo defaults.
Default Odoo security applies:
- Base user access through standard groups
- Model access inherited from dependencies
- No custom row-level security rules

View file

@ -0,0 +1,5 @@
# Troubleshooting
- Ensure Python and Odoo environment matches repo guidance.
- Check database connectivity and logs if startup fails.
- Validate that dependent addons listed in DEPENDENCIES.md are installed.

View file

@ -0,0 +1,7 @@
# Usage
Start Odoo including this addon (from repo root):
```bash
python3 scripts/nix_odoo_web_server.py --db-name mydb --addon sequence_check_digit
```

View file

@ -0,0 +1,3 @@
# Wizards
This module does not include UI wizards.

View file

@ -0,0 +1,42 @@
[project]
name = "odoo-bringout-oca-server-ux-sequence_check_digit"
version = "16.0.0"
description = "Check Digit on Sequences - Adds a check digit on sequences"
authors = [
{ name = "Ernad Husremovic", email = "hernad@bring.out.ba" }
]
dependencies = [
"odoo-bringout-oca-ocb-base>=16.0.0",
"requests>=2.25.1"
]
readme = "README.md"
requires-python = ">= 3.11"
classifiers = [
"Development Status :: 5 - Production/Stable",
"Intended Audience :: Developers",
"License :: OSI Approved :: GNU Lesser General Public License v3 (LGPLv3)",
"Programming Language :: Python :: 3",
"Programming Language :: Python :: 3.11",
"Programming Language :: Python :: 3.12",
"Topic :: Office/Business",
]
[project.urls]
homepage = "https://github.com/bringout/0"
repository = "https://github.com/bringout/0"
[build-system]
requires = ["hatchling"]
build-backend = "hatchling.build"
[tool.hatch.metadata]
allow-direct-references = true
[tool.hatch.build.targets.wheel]
packages = ["sequence_check_digit"]
[tool.rye]
managed = true
dev-dependencies = [
"pytest>=8.4.1",
]

View file

@ -0,0 +1,97 @@
========================
Check Digit on Sequences
========================
..
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
!! This file is generated by oca-gen-addon-readme !!
!! changes will be overwritten. !!
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
!! source digest: sha256:f490c17e5ab3c72729d892fb9755584a86e146d94d14b15198915ab806ea7a2f
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
.. |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-LGPL--3-blue.png
:target: http://www.gnu.org/licenses/lgpl-3.0-standalone.html
:alt: License: LGPL-3
.. |badge3| image:: https://img.shields.io/badge/github-OCA%2Fserver--ux-lightgray.png?logo=github
:target: https://github.com/OCA/server-ux/tree/16.0/sequence_check_digit
:alt: OCA/server-ux
.. |badge4| image:: https://img.shields.io/badge/weblate-Translate%20me-F47D42.png
:target: https://translation.odoo-community.org/projects/server-ux-16-0/server-ux-16-0-sequence_check_digit
: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/server-ux&target_branch=16.0
:alt: Try me on Runboat
|badge1| |badge2| |badge3| |badge4| |badge5|
This module was written to configure check digits on sequences added on the end.
It is useful as a control of the number on visual validation.
It is useful when some manual checks are required or on integrations.
The implemented codes can avoid modification of one character and flip of
two consecutive characters.
**Table of contents**
.. contents::
:local:
Usage
=====
* Access sequences and configurate the model to use.
* The model will check if the format of prefix, suffix and number is valid
* Implemented algorithms
* Luhn: [0-9]*
* Damm: [0-9]*
* Verhoeff: [0-9]*
* ISO 7064 Mod 11, 2: [0-9]*
* ISO 7064 Mod 11, 10: [0-9]*
* ISO 7064 Mod 37, 2: [0-9A-Z]*
* ISO 7064 Mod 37, 36: [0-9A-Z]*
* ISO 7064 Mod 97, 10: [0-9A-Z]*
Bug Tracker
===========
Bugs are tracked on `GitHub Issues <https://github.com/OCA/server-ux/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/server-ux/issues/new?body=module:%20sequence_check_digit%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
~~~~~~~
* Creu Blanca
Contributors
~~~~~~~~~~~~
* Enric Tobella <etobella@creublanca.es>
* Sunanda Chhatbar <sunanda.chhatbar@initos.com>
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/server-ux <https://github.com/OCA/server-ux/tree/16.0/sequence_check_digit>`_ project on GitHub.
You are welcome to contribute. To learn how please visit https://odoo-community.org/page/Contribute.

View file

@ -0,0 +1,3 @@
# License LGPL-3.0 or later (http://www.gnu.org/licenses/lgpl.html).
from . import models

View file

@ -0,0 +1,16 @@
# Copyright (C) 2017 Creu Blanca
# License LGPL-3.0 or later (http://www.gnu.org/licenses/lgpl.html).
{
"name": "Check Digit on Sequences",
"version": "16.0.1.0.1",
"category": "Reporting",
"website": "https://github.com/OCA/server-ux",
"author": "Creu Blanca, Odoo Community Association (OCA)",
"license": "LGPL-3",
"installable": True,
"application": False,
"summary": "Adds a check digit on sequences",
"depends": ["base"],
"data": ["views/sequence_views.xml"],
}

View file

@ -0,0 +1,84 @@
# Translation of Odoo Server.
# This file contains the translation of the following modules:
# * sequence_check_digit
#
msgid ""
msgstr ""
"Project-Id-Version: Odoo Server 16.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: sequence_check_digit
#. odoo-python
#: code:addons/sequence_check_digit/models/ir_sequence.py:0
#, python-format
msgid "%s is not an implemented function"
msgstr "%s is not an implemented function"
#. module: sequence_check_digit
#: model:ir.model.fields,field_description:sequence_check_digit.field_ir_sequence__check_digit_formula
msgid "Check Digit Formula"
msgstr "Check Digit Formula"
#. module: sequence_check_digit
#: model:ir.model.fields.selection,name:sequence_check_digit.selection__ir_sequence__check_digit_formula__damm
msgid "Damm"
msgstr "Damm"
#. module: sequence_check_digit
#. odoo-python
#: code:addons/sequence_check_digit/models/ir_sequence.py:0
#: code:addons/sequence_check_digit/models/ir_sequence.py:0
#, python-format
msgid "Format is not accepted"
msgstr "Format is not accepted"
#. module: sequence_check_digit
#: model:ir.model.fields.selection,name:sequence_check_digit.selection__ir_sequence__check_digit_formula__iso7064_11_10
msgid "ISO 7064 Mod 11, 10"
msgstr "ISO 7064 Mod 11, 10"
#. module: sequence_check_digit
#: model:ir.model.fields.selection,name:sequence_check_digit.selection__ir_sequence__check_digit_formula__iso7064_11_2
msgid "ISO 7064 Mod 11, 2"
msgstr "ISO 7064 Mod 11, 2"
#. module: sequence_check_digit
#: model:ir.model.fields.selection,name:sequence_check_digit.selection__ir_sequence__check_digit_formula__iso7064_37_2
msgid "ISO 7064 Mod 37, 2"
msgstr "ISO 7064 Mod 37, 2"
#. module: sequence_check_digit
#: model:ir.model.fields.selection,name:sequence_check_digit.selection__ir_sequence__check_digit_formula__iso7064_37_36
msgid "ISO 7064 Mod 37, 36"
msgstr "ISO 7064 Mod 37, 36"
#. module: sequence_check_digit
#: model:ir.model.fields.selection,name:sequence_check_digit.selection__ir_sequence__check_digit_formula__iso7064_97_10
msgid "ISO 7064 Mod 97, 10"
msgstr "ISO 7064 Mod 97, 10"
#. module: sequence_check_digit
#: model:ir.model.fields.selection,name:sequence_check_digit.selection__ir_sequence__check_digit_formula__luhn
msgid "Luhn"
msgstr "Luhn"
#. module: sequence_check_digit
#: model:ir.model.fields.selection,name:sequence_check_digit.selection__ir_sequence__check_digit_formula__none
msgid "None"
msgstr ""
#. module: sequence_check_digit
#: model:ir.model,name:sequence_check_digit.model_ir_sequence
msgid "Sequence"
msgstr "Sekvenca"
#. module: sequence_check_digit
#: model:ir.model.fields.selection,name:sequence_check_digit.selection__ir_sequence__check_digit_formula__verhoeff
msgid "Verhoeff"
msgstr "Verhoeff"

View file

@ -0,0 +1,91 @@
# Translation of Odoo Server.
# This file contains the translation of the following modules:
# * sequence_check_digit
#
msgid ""
msgstr ""
"Project-Id-Version: Odoo Server 10.0\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2017-09-28 10:14+0000\n"
"PO-Revision-Date: 2018-07-13 08:48+0000\n"
"Last-Translator: Enric Tobella <etobella@creublanca.es>\n"
"Language-Team: \n"
"Language: es\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 3.0.1\n"
#. module: sequence_check_digit
#. odoo-python
#: code:addons/sequence_check_digit/models/ir_sequence.py:0
#, python-format
msgid "%s is not an implemented function"
msgstr "%s no es una función implementada"
#. module: sequence_check_digit
#: model:ir.model.fields,field_description:sequence_check_digit.field_ir_sequence__check_digit_formula
msgid "Check Digit Formula"
msgstr "Fórmula del Dígito de control"
#. module: sequence_check_digit
#: model:ir.model.fields.selection,name:sequence_check_digit.selection__ir_sequence__check_digit_formula__damm
msgid "Damm"
msgstr "Damm"
#. module: sequence_check_digit
#. odoo-python
#: code:addons/sequence_check_digit/models/ir_sequence.py:0
#, python-format
msgid "Format is not accepted"
msgstr "El formato no está aceptado"
#. module: sequence_check_digit
#: model:ir.model.fields.selection,name:sequence_check_digit.selection__ir_sequence__check_digit_formula__iso7064_11_10
msgid "ISO 7064 Mod 11, 10"
msgstr "ISO 7064 Mod 11, 10"
#. module: sequence_check_digit
#: model:ir.model.fields.selection,name:sequence_check_digit.selection__ir_sequence__check_digit_formula__iso7064_11_2
msgid "ISO 7064 Mod 11, 2"
msgstr "ISO 7064 Mod 11, 2"
#. module: sequence_check_digit
#: model:ir.model.fields.selection,name:sequence_check_digit.selection__ir_sequence__check_digit_formula__iso7064_37_2
msgid "ISO 7064 Mod 37, 2"
msgstr "ISO 7064 Mod 37, 2"
#. module: sequence_check_digit
#: model:ir.model.fields.selection,name:sequence_check_digit.selection__ir_sequence__check_digit_formula__iso7064_37_36
msgid "ISO 7064 Mod 37, 36"
msgstr "ISO 7064 Mod 37, 36"
#. module: sequence_check_digit
#: model:ir.model.fields.selection,name:sequence_check_digit.selection__ir_sequence__check_digit_formula__iso7064_97_10
msgid "ISO 7064 Mod 97, 10"
msgstr "ISO 7064 Mod 97, 10"
#. module: sequence_check_digit
#: model:ir.model.fields.selection,name:sequence_check_digit.selection__ir_sequence__check_digit_formula__luhn
msgid "Luhn"
msgstr "Luhn"
#. module: sequence_check_digit
#: model:ir.model.fields.selection,name:sequence_check_digit.selection__ir_sequence__check_digit_formula__none
msgid "None"
msgstr "Ninguno"
#. module: sequence_check_digit
#: model:ir.model,name:sequence_check_digit.model_ir_sequence
#, fuzzy
msgid "Sequence"
msgstr "ir.sequence"
#. module: sequence_check_digit
#: model:ir.model.fields.selection,name:sequence_check_digit.selection__ir_sequence__check_digit_formula__verhoeff
msgid "Verhoeff"
msgstr "Verhoeff"
#~ msgid "Function not found"
#~ msgstr "Función no encontrada"

View file

@ -0,0 +1,86 @@
# Translation of Odoo Server.
# This file contains the translation of the following modules:
# * sequence_check_digit
#
msgid ""
msgstr ""
"Project-Id-Version: Odoo Server 14.0\n"
"Report-Msgid-Bugs-To: \n"
"PO-Revision-Date: 2025-01-11 13:06+0000\n"
"Last-Translator: mymage <stefano.consolaro@mymage.it>\n"
"Language-Team: none\n"
"Language: it\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 5.6.2\n"
#. module: sequence_check_digit
#. odoo-python
#: code:addons/sequence_check_digit/models/ir_sequence.py:0
#, python-format
msgid "%s is not an implemented function"
msgstr "%s non è una funzione implementata"
#. module: sequence_check_digit
#: model:ir.model.fields,field_description:sequence_check_digit.field_ir_sequence__check_digit_formula
msgid "Check Digit Formula"
msgstr "Controllare la formula numerica"
#. module: sequence_check_digit
#: model:ir.model.fields.selection,name:sequence_check_digit.selection__ir_sequence__check_digit_formula__damm
msgid "Damm"
msgstr "Damm"
#. module: sequence_check_digit
#. odoo-python
#: code:addons/sequence_check_digit/models/ir_sequence.py:0
#, python-format
msgid "Format is not accepted"
msgstr "Il formato non è accettato"
#. module: sequence_check_digit
#: model:ir.model.fields.selection,name:sequence_check_digit.selection__ir_sequence__check_digit_formula__iso7064_11_10
msgid "ISO 7064 Mod 11, 10"
msgstr "ISO 7064 Mod 11, 10"
#. module: sequence_check_digit
#: model:ir.model.fields.selection,name:sequence_check_digit.selection__ir_sequence__check_digit_formula__iso7064_11_2
msgid "ISO 7064 Mod 11, 2"
msgstr "ISO 7064 Mod 11, 2"
#. module: sequence_check_digit
#: model:ir.model.fields.selection,name:sequence_check_digit.selection__ir_sequence__check_digit_formula__iso7064_37_2
msgid "ISO 7064 Mod 37, 2"
msgstr "ISO 7064 Mod 37, 2"
#. module: sequence_check_digit
#: model:ir.model.fields.selection,name:sequence_check_digit.selection__ir_sequence__check_digit_formula__iso7064_37_36
msgid "ISO 7064 Mod 37, 36"
msgstr "ISO 7064 Mod 37, 36"
#. module: sequence_check_digit
#: model:ir.model.fields.selection,name:sequence_check_digit.selection__ir_sequence__check_digit_formula__iso7064_97_10
msgid "ISO 7064 Mod 97, 10"
msgstr "ISO 7064 Mod 97, 10"
#. module: sequence_check_digit
#: model:ir.model.fields.selection,name:sequence_check_digit.selection__ir_sequence__check_digit_formula__luhn
msgid "Luhn"
msgstr "Luhn"
#. module: sequence_check_digit
#: model:ir.model.fields.selection,name:sequence_check_digit.selection__ir_sequence__check_digit_formula__none
msgid "None"
msgstr "Nessuno"
#. module: sequence_check_digit
#: model:ir.model,name:sequence_check_digit.model_ir_sequence
msgid "Sequence"
msgstr "Sequenza"
#. module: sequence_check_digit
#: model:ir.model.fields.selection,name:sequence_check_digit.selection__ir_sequence__check_digit_formula__verhoeff
msgid "Verhoeff"
msgstr "Verhoeff"

View file

@ -0,0 +1,84 @@
# Translation of Odoo Server.
# This file contains the translation of the following modules:
# * sequence_check_digit
#
msgid ""
msgstr ""
"Project-Id-Version: Odoo Server 16.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: sequence_check_digit
#. odoo-python
#: code:addons/sequence_check_digit/models/ir_sequence.py:0
#, python-format
msgid "%s is not an implemented function"
msgstr ""
#. module: sequence_check_digit
#: model:ir.model.fields,field_description:sequence_check_digit.field_ir_sequence__check_digit_formula
msgid "Check Digit Formula"
msgstr ""
#. module: sequence_check_digit
#: model:ir.model.fields.selection,name:sequence_check_digit.selection__ir_sequence__check_digit_formula__damm
msgid "Damm"
msgstr ""
#. module: sequence_check_digit
#. odoo-python
#: code:addons/sequence_check_digit/models/ir_sequence.py:0
#: code:addons/sequence_check_digit/models/ir_sequence.py:0
#, python-format
msgid "Format is not accepted"
msgstr ""
#. module: sequence_check_digit
#: model:ir.model.fields.selection,name:sequence_check_digit.selection__ir_sequence__check_digit_formula__iso7064_11_10
msgid "ISO 7064 Mod 11, 10"
msgstr ""
#. module: sequence_check_digit
#: model:ir.model.fields.selection,name:sequence_check_digit.selection__ir_sequence__check_digit_formula__iso7064_11_2
msgid "ISO 7064 Mod 11, 2"
msgstr ""
#. module: sequence_check_digit
#: model:ir.model.fields.selection,name:sequence_check_digit.selection__ir_sequence__check_digit_formula__iso7064_37_2
msgid "ISO 7064 Mod 37, 2"
msgstr ""
#. module: sequence_check_digit
#: model:ir.model.fields.selection,name:sequence_check_digit.selection__ir_sequence__check_digit_formula__iso7064_37_36
msgid "ISO 7064 Mod 37, 36"
msgstr ""
#. module: sequence_check_digit
#: model:ir.model.fields.selection,name:sequence_check_digit.selection__ir_sequence__check_digit_formula__iso7064_97_10
msgid "ISO 7064 Mod 97, 10"
msgstr ""
#. module: sequence_check_digit
#: model:ir.model.fields.selection,name:sequence_check_digit.selection__ir_sequence__check_digit_formula__luhn
msgid "Luhn"
msgstr ""
#. module: sequence_check_digit
#: model:ir.model.fields.selection,name:sequence_check_digit.selection__ir_sequence__check_digit_formula__none
msgid "None"
msgstr ""
#. module: sequence_check_digit
#: model:ir.model,name:sequence_check_digit.model_ir_sequence
msgid "Sequence"
msgstr ""
#. module: sequence_check_digit
#: model:ir.model.fields.selection,name:sequence_check_digit.selection__ir_sequence__check_digit_formula__verhoeff
msgid "Verhoeff"
msgstr ""

View file

@ -0,0 +1,3 @@
# License LGPL-3.0 or later (http://www.gnu.org/licenses/lgpl.html).
from . import ir_sequence

View file

@ -0,0 +1,70 @@
# Copyright (C) 2017 Creu Blanca
# License LGPL-3.0 or later (http://www.gnu.org/licenses/lgpl.html).
import logging
from odoo import _, api, fields, models
from odoo.exceptions import ValidationError
_logger = logging.getLogger(__name__)
try:
from stdnum import damm, luhn, verhoeff
from stdnum.iso7064 import mod_11_2, mod_11_10, mod_37_2, mod_37_36, mod_97_10
except (ImportError, IOError) as err:
_logger.debug(err)
class IrSequence(models.Model):
_inherit = "ir.sequence"
check_digit_formula = fields.Selection(
selection=[
("none", "None"),
("luhn", "Luhn"),
("damm", "Damm"),
("verhoeff", "Verhoeff"),
("ISO7064_11_2", "ISO 7064 Mod 11, 2"),
("ISO7064_11_10", "ISO 7064 Mod 11, 10"),
("ISO7064_37_2", "ISO 7064 Mod 37, 2"),
("ISO7064_37_36", "ISO 7064 Mod 37, 36"),
("ISO7064_97_10", "ISO 7064 Mod 97, 10"),
],
default="none",
)
@api.constrains("check_digit_formula", "prefix", "suffix")
def check_check_digit_formula(self):
for record in self:
try:
record.get_next_char(0)
except Exception as err:
raise ValidationError(_("Format is not accepted")) from err
def get_check_digit(self, code):
try:
return self.get_formula_map()[self.check_digit_formula](code)
except KeyError as err:
raise ValidationError(
_("%s is not an implemented function" % self.check_digit_formula)
) from err
except Exception as err:
raise ValidationError(_("Format is not accepted")) from err
def get_formula_map(self):
return {
"none": lambda _: "",
"luhn": luhn.calc_check_digit,
"damm": damm.calc_check_digit,
"verhoeff": verhoeff.calc_check_digit,
"ISO7064_11_2": mod_11_2.calc_check_digit,
"ISO7064_11_10": mod_11_10.calc_check_digit,
"ISO7064_37_2": mod_37_2.calc_check_digit,
"ISO7064_37_36": mod_37_36.calc_check_digit,
"ISO7064_97_10": mod_97_10.calc_check_digits,
}
def get_next_char(self, number_next):
code = super(IrSequence, self).get_next_char(number_next)
if not self.check_digit_formula:
return code
return "{}{}".format(code, self.get_check_digit(code))

View file

@ -0,0 +1,2 @@
* Enric Tobella <etobella@creublanca.es>
* Sunanda Chhatbar <sunanda.chhatbar@initos.com>

View file

@ -0,0 +1,6 @@
This module was written to configure check digits on sequences added on the end.
It is useful as a control of the number on visual validation.
It is useful when some manual checks are required or on integrations.
The implemented codes can avoid modification of one character and flip of
two consecutive characters.

View file

@ -0,0 +1,11 @@
* Access sequences and configurate the model to use.
* The model will check if the format of prefix, suffix and number is valid
* Implemented algorithms
* Luhn: [0-9]*
* Damm: [0-9]*
* Verhoeff: [0-9]*
* ISO 7064 Mod 11, 2: [0-9]*
* ISO 7064 Mod 11, 10: [0-9]*
* ISO 7064 Mod 37, 2: [0-9A-Z]*
* ISO 7064 Mod 37, 36: [0-9A-Z]*
* ISO 7064 Mod 97, 10: [0-9A-Z]*

Binary file not shown.

After

Width:  |  Height:  |  Size: 9.2 KiB

View file

@ -0,0 +1,451 @@
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<meta name="generator" content="Docutils: https://docutils.sourceforge.io/" />
<title>Check Digit on Sequences</title>
<style type="text/css">
/*
:Author: David Goodger (goodger@python.org)
:Id: $Id: html4css1.css 9511 2024-01-13 09:50:07Z milde $
:Copyright: This stylesheet has been placed in the public domain.
Default cascading style sheet for the HTML output of Docutils.
Despite the name, some widely supported CSS2 features are used.
See https://docutils.sourceforge.io/docs/howto/html-stylesheets.html for how to
customize this style sheet.
*/
/* used to remove borders from tables and images */
.borderless, table.borderless td, table.borderless th {
border: 0 }
table.borderless td, table.borderless th {
/* Override padding for "table.docutils td" with "! important".
The right padding separates the table cells. */
padding: 0 0.5em 0 0 ! important }
.first {
/* Override more specific margin styles with "! important". */
margin-top: 0 ! important }
.last, .with-subtitle {
margin-bottom: 0 ! important }
.hidden {
display: none }
.subscript {
vertical-align: sub;
font-size: smaller }
.superscript {
vertical-align: super;
font-size: smaller }
a.toc-backref {
text-decoration: none ;
color: black }
blockquote.epigraph {
margin: 2em 5em ; }
dl.docutils dd {
margin-bottom: 0.5em }
object[type="image/svg+xml"], object[type="application/x-shockwave-flash"] {
overflow: hidden;
}
/* Uncomment (and remove this text!) to get bold-faced definition list terms
dl.docutils dt {
font-weight: bold }
*/
div.abstract {
margin: 2em 5em }
div.abstract p.topic-title {
font-weight: bold ;
text-align: center }
div.admonition, div.attention, div.caution, div.danger, div.error,
div.hint, div.important, div.note, div.tip, div.warning {
margin: 2em ;
border: medium outset ;
padding: 1em }
div.admonition p.admonition-title, div.hint p.admonition-title,
div.important p.admonition-title, div.note p.admonition-title,
div.tip p.admonition-title {
font-weight: bold ;
font-family: sans-serif }
div.attention p.admonition-title, div.caution p.admonition-title,
div.danger p.admonition-title, div.error p.admonition-title,
div.warning p.admonition-title, .code .error {
color: red ;
font-weight: bold ;
font-family: sans-serif }
/* Uncomment (and remove this text!) to get reduced vertical space in
compound paragraphs.
div.compound .compound-first, div.compound .compound-middle {
margin-bottom: 0.5em }
div.compound .compound-last, div.compound .compound-middle {
margin-top: 0.5em }
*/
div.dedication {
margin: 2em 5em ;
text-align: center ;
font-style: italic }
div.dedication p.topic-title {
font-weight: bold ;
font-style: normal }
div.figure {
margin-left: 2em ;
margin-right: 2em }
div.footer, div.header {
clear: both;
font-size: smaller }
div.line-block {
display: block ;
margin-top: 1em ;
margin-bottom: 1em }
div.line-block div.line-block {
margin-top: 0 ;
margin-bottom: 0 ;
margin-left: 1.5em }
div.sidebar {
margin: 0 0 0.5em 1em ;
border: medium outset ;
padding: 1em ;
background-color: #ffffee ;
width: 40% ;
float: right ;
clear: right }
div.sidebar p.rubric {
font-family: sans-serif ;
font-size: medium }
div.system-messages {
margin: 5em }
div.system-messages h1 {
color: red }
div.system-message {
border: medium outset ;
padding: 1em }
div.system-message p.system-message-title {
color: red ;
font-weight: bold }
div.topic {
margin: 2em }
h1.section-subtitle, h2.section-subtitle, h3.section-subtitle,
h4.section-subtitle, h5.section-subtitle, h6.section-subtitle {
margin-top: 0.4em }
h1.title {
text-align: center }
h2.subtitle {
text-align: center }
hr.docutils {
width: 75% }
img.align-left, .figure.align-left, object.align-left, table.align-left {
clear: left ;
float: left ;
margin-right: 1em }
img.align-right, .figure.align-right, object.align-right, table.align-right {
clear: right ;
float: right ;
margin-left: 1em }
img.align-center, .figure.align-center, object.align-center {
display: block;
margin-left: auto;
margin-right: auto;
}
table.align-center {
margin-left: auto;
margin-right: auto;
}
.align-left {
text-align: left }
.align-center {
clear: both ;
text-align: center }
.align-right {
text-align: right }
/* reset inner alignment in figures */
div.align-right {
text-align: inherit }
/* div.align-center * { */
/* text-align: left } */
.align-top {
vertical-align: top }
.align-middle {
vertical-align: middle }
.align-bottom {
vertical-align: bottom }
ol.simple, ul.simple {
margin-bottom: 1em }
ol.arabic {
list-style: decimal }
ol.loweralpha {
list-style: lower-alpha }
ol.upperalpha {
list-style: upper-alpha }
ol.lowerroman {
list-style: lower-roman }
ol.upperroman {
list-style: upper-roman }
p.attribution {
text-align: right ;
margin-left: 50% }
p.caption {
font-style: italic }
p.credits {
font-style: italic ;
font-size: smaller }
p.label {
white-space: nowrap }
p.rubric {
font-weight: bold ;
font-size: larger ;
color: maroon ;
text-align: center }
p.sidebar-title {
font-family: sans-serif ;
font-weight: bold ;
font-size: larger }
p.sidebar-subtitle {
font-family: sans-serif ;
font-weight: bold }
p.topic-title {
font-weight: bold }
pre.address {
margin-bottom: 0 ;
margin-top: 0 ;
font: inherit }
pre.literal-block, pre.doctest-block, pre.math, pre.code {
margin-left: 2em ;
margin-right: 2em }
pre.code .ln { color: gray; } /* line numbers */
pre.code, code { background-color: #eeeeee }
pre.code .comment, code .comment { color: #5C6576 }
pre.code .keyword, code .keyword { color: #3B0D06; font-weight: bold }
pre.code .literal.string, code .literal.string { color: #0C5404 }
pre.code .name.builtin, code .name.builtin { color: #352B84 }
pre.code .deleted, code .deleted { background-color: #DEB0A1}
pre.code .inserted, code .inserted { background-color: #A3D289}
span.classifier {
font-family: sans-serif ;
font-style: oblique }
span.classifier-delimiter {
font-family: sans-serif ;
font-weight: bold }
span.interpreted {
font-family: sans-serif }
span.option {
white-space: nowrap }
span.pre {
white-space: pre }
span.problematic, pre.problematic {
color: red }
span.section-subtitle {
/* font-size relative to parent (h1..h6 element) */
font-size: 80% }
table.citation {
border-left: solid 1px gray;
margin-left: 1px }
table.docinfo {
margin: 2em 4em }
table.docutils {
margin-top: 0.5em ;
margin-bottom: 0.5em }
table.footnote {
border-left: solid 1px black;
margin-left: 1px }
table.docutils td, table.docutils th,
table.docinfo td, table.docinfo th {
padding-left: 0.5em ;
padding-right: 0.5em ;
vertical-align: top }
table.docutils th.field-name, table.docinfo th.docinfo-name {
font-weight: bold ;
text-align: left ;
white-space: nowrap ;
padding-left: 0 }
/* "booktabs" style (no vertical lines) */
table.docutils.booktabs {
border: 0px;
border-top: 2px solid;
border-bottom: 2px solid;
border-collapse: collapse;
}
table.docutils.booktabs * {
border: 0px;
}
table.docutils.booktabs th {
border-bottom: thin solid;
text-align: left;
}
h1 tt.docutils, h2 tt.docutils, h3 tt.docutils,
h4 tt.docutils, h5 tt.docutils, h6 tt.docutils {
font-size: 100% }
ul.auto-toc {
list-style-type: none }
</style>
</head>
<body>
<div class="document" id="check-digit-on-sequences">
<h1 class="title">Check Digit on Sequences</h1>
<!-- !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
!! This file is generated by oca-gen-addon-readme !!
!! changes will be overwritten. !!
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
!! source digest: sha256:f490c17e5ab3c72729d892fb9755584a86e146d94d14b15198915ab806ea7a2f
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! -->
<p><a class="reference external image-reference" href="https://odoo-community.org/page/development-status"><img alt="Beta" src="https://img.shields.io/badge/maturity-Beta-yellow.png" /></a> <a class="reference external image-reference" href="http://www.gnu.org/licenses/lgpl-3.0-standalone.html"><img alt="License: LGPL-3" src="https://img.shields.io/badge/licence-LGPL--3-blue.png" /></a> <a class="reference external image-reference" href="https://github.com/OCA/server-ux/tree/16.0/sequence_check_digit"><img alt="OCA/server-ux" src="https://img.shields.io/badge/github-OCA%2Fserver--ux-lightgray.png?logo=github" /></a> <a class="reference external image-reference" href="https://translation.odoo-community.org/projects/server-ux-16-0/server-ux-16-0-sequence_check_digit"><img alt="Translate me on Weblate" src="https://img.shields.io/badge/weblate-Translate%20me-F47D42.png" /></a> <a class="reference external image-reference" href="https://runboat.odoo-community.org/builds?repo=OCA/server-ux&amp;target_branch=16.0"><img alt="Try me on Runboat" src="https://img.shields.io/badge/runboat-Try%20me-875A7B.png" /></a></p>
<p>This module was written to configure check digits on sequences added on the end.
It is useful as a control of the number on visual validation.</p>
<p>It is useful when some manual checks are required or on integrations.
The implemented codes can avoid modification of one character and flip of
two consecutive characters.</p>
<p><strong>Table of contents</strong></p>
<div class="contents local topic" id="contents">
<ul class="simple">
<li><a class="reference internal" href="#usage" id="toc-entry-1">Usage</a></li>
<li><a class="reference internal" href="#bug-tracker" id="toc-entry-2">Bug Tracker</a></li>
<li><a class="reference internal" href="#credits" id="toc-entry-3">Credits</a><ul>
<li><a class="reference internal" href="#authors" id="toc-entry-4">Authors</a></li>
<li><a class="reference internal" href="#contributors" id="toc-entry-5">Contributors</a></li>
<li><a class="reference internal" href="#maintainers" id="toc-entry-6">Maintainers</a></li>
</ul>
</li>
</ul>
</div>
<div class="section" id="usage">
<h1><a class="toc-backref" href="#toc-entry-1">Usage</a></h1>
<ul class="simple">
<li>Access sequences and configurate the model to use.</li>
<li>The model will check if the format of prefix, suffix and number is valid</li>
<li><dl class="first docutils">
<dt>Implemented algorithms</dt>
<dd><ul class="first last">
<li>Luhn: [0-9]*</li>
<li>Damm: [0-9]*</li>
<li>Verhoeff: [0-9]*</li>
<li>ISO 7064 Mod 11, 2: [0-9]*</li>
<li>ISO 7064 Mod 11, 10: [0-9]*</li>
<li>ISO 7064 Mod 37, 2: [0-9A-Z]*</li>
<li>ISO 7064 Mod 37, 36: [0-9A-Z]*</li>
<li>ISO 7064 Mod 97, 10: [0-9A-Z]*</li>
</ul>
</dd>
</dl>
</li>
</ul>
</div>
<div class="section" id="bug-tracker">
<h1><a class="toc-backref" href="#toc-entry-2">Bug Tracker</a></h1>
<p>Bugs are tracked on <a class="reference external" href="https://github.com/OCA/server-ux/issues">GitHub Issues</a>.
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
<a class="reference external" href="https://github.com/OCA/server-ux/issues/new?body=module:%20sequence_check_digit%0Aversion:%2016.0%0A%0A**Steps%20to%20reproduce**%0A-%20...%0A%0A**Current%20behavior**%0A%0A**Expected%20behavior**">feedback</a>.</p>
<p>Do not contact contributors directly about support or help with technical issues.</p>
</div>
<div class="section" id="credits">
<h1><a class="toc-backref" href="#toc-entry-3">Credits</a></h1>
<div class="section" id="authors">
<h2><a class="toc-backref" href="#toc-entry-4">Authors</a></h2>
<ul class="simple">
<li>Creu Blanca</li>
</ul>
</div>
<div class="section" id="contributors">
<h2><a class="toc-backref" href="#toc-entry-5">Contributors</a></h2>
<ul class="simple">
<li>Enric Tobella &lt;<a class="reference external" href="mailto:etobella&#64;creublanca.es">etobella&#64;creublanca.es</a>&gt;</li>
<li>Sunanda Chhatbar &lt;<a class="reference external" href="mailto:sunanda.chhatbar&#64;initos.com">sunanda.chhatbar&#64;initos.com</a>&gt;</li>
</ul>
</div>
<div class="section" id="maintainers">
<h2><a class="toc-backref" href="#toc-entry-6">Maintainers</a></h2>
<p>This module is maintained by the OCA.</p>
<a class="reference external image-reference" href="https://odoo-community.org">
<img alt="Odoo Community Association" src="https://odoo-community.org/logo.png" />
</a>
<p>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.</p>
<p>This module is part of the <a class="reference external" href="https://github.com/OCA/server-ux/tree/16.0/sequence_check_digit">OCA/server-ux</a> project on GitHub.</p>
<p>You are welcome to contribute. To learn how please visit <a class="reference external" href="https://odoo-community.org/page/Contribute">https://odoo-community.org/page/Contribute</a>.</p>
</div>
</div>
</div>
</body>
</html>

View file

@ -0,0 +1,3 @@
# License LGPL-3.0 or later (http://www.gnu.org/licenses/lgpl.html).
from . import test_check_digit

View file

@ -0,0 +1,74 @@
# Copyright 2017 Creu Blanca <https://creublanca.es/>
# License LGPL-3.0 or later (http://www.gnu.org/licenses/lgpl.html).
import logging
from odoo.exceptions import ValidationError
from odoo.tests import common
_logger = logging.getLogger(__name__)
try:
from stdnum import damm, luhn, verhoeff
from stdnum.iso7064 import mod_11_2, mod_11_10, mod_37_2, mod_37_36, mod_97_10
except (ImportError, IOError) as err:
_logger.debug(err)
class TestSequenceCheckDigit(common.TransactionCase):
def get_sequence(self, method):
return self.env["ir.sequence"].create(
{
"name": "Test sequence",
"implementation": "standard",
"check_digit_formula": method,
"padding": "5",
}
)
def test_none(self):
sequence = self.get_sequence("none")
self.assertEqual("00001", sequence.next_by_id())
def test_null(self):
sequence = self.get_sequence(None)
self.assertEqual("00001", sequence.next_by_id())
def test_luhn(self):
sequence = self.get_sequence("luhn")
self.assertTrue(luhn.validate(sequence.next_by_id()))
def test_damm(self):
sequence = self.get_sequence("damm")
self.assertTrue(damm.validate(sequence.next_by_id()))
def test_verhoeff(self):
sequence = self.get_sequence("verhoeff")
self.assertTrue(verhoeff.validate(sequence.next_by_id()))
def test_mod_11_2(self):
sequence = self.get_sequence("ISO7064_11_2")
self.assertTrue(mod_11_2.validate(sequence.next_by_id()))
def test_mod11_10(self):
sequence = self.get_sequence("ISO7064_11_10")
self.assertTrue(mod_11_10.validate(sequence.next_by_id()))
def test_validation(self):
sequence = self.get_sequence("ISO7064_11_10")
with self.assertRaises(ValidationError):
sequence.prefix = "A"
sequence.prefix = ""
def test_mod37_2(self):
sequence = self.get_sequence("ISO7064_37_2")
sequence.prefix = "A"
self.assertTrue(mod_37_2.validate(sequence.next_by_id()))
def test_mod37_36(self):
sequence = self.get_sequence("ISO7064_37_36")
self.assertTrue(mod_37_36.validate(sequence.next_by_id()))
def test_mod97_10(self):
sequence = self.get_sequence("ISO7064_97_10")
self.assertTrue(mod_97_10.validate(sequence.next_by_id()))

View file

@ -0,0 +1,12 @@
<?xml version="1.0" encoding="utf-8" ?>
<odoo>
<record id="sequence_view" model="ir.ui.view">
<field name="model">ir.sequence</field>
<field name="inherit_id" ref="base.sequence_view" />
<field name="arch" type="xml">
<field name="implementation" position="after">
<field name="check_digit_formula" />
</field>
</field>
</record>
</odoo>