diff --git a/base_sequence_option/README.rst b/base_sequence_option/README.rst new file mode 100644 index 00000000000..8e5b25dff5f --- /dev/null +++ b/base_sequence_option/README.rst @@ -0,0 +1,136 @@ +==================== +Base Sequence Option +==================== + +.. + !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! + !! This file is generated by oca-gen-addon-readme !! + !! changes will be overwritten. !! + !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! + !! source digest: sha256:e409091f81bde204304e68835c3f5ed9f5ae0eae0c7be7e797c1930ff5e63196 + !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! + +.. |badge1| image:: https://img.shields.io/badge/maturity-Alpha-red.png + :target: https://odoo-community.org/page/development-status + :alt: Alpha +.. |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--tools-lightgray.png?logo=github + :target: https://github.com/OCA/server-tools/tree/17.0/base_sequence_option + :alt: OCA/server-tools +.. |badge4| image:: https://img.shields.io/badge/weblate-Translate%20me-F47D42.png + :target: https://translation.odoo-community.org/projects/server-tools-17-0/server-tools-17-0-base_sequence_option + :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-tools&target_branch=17.0 + :alt: Try me on Runboat + +|badge1| |badge2| |badge3| |badge4| |badge5| + +This module allow user to add optional sequences to some document model. +On which sequence is used, is based on domain matching with document +values (and original sequence will be bypassed). + +For example, it is now possible to, + +- Avoid using Odoo automatic sequence on invoice and vendor bill with + old style sequence. +- Customer payment and vendor payment to run on different sequence. +- Assign different sales order sequence based on customer region. + +This is a base module and does nothing by itself. Following are modules +that will allow managing sequence options for each type of documents, +I.e., + +- Purchase Order: purchase_sequence_option +- Invoice / Bill / Refund / Payment: account_sequence_option +- Others: create a new module with few lines of code + +.. IMPORTANT:: + This is an alpha version, the data model and design can change at any time without warning. + Only for development or testing purpose, do not use in production. + `More details on development status `_ + +**Table of contents** + +.. contents:: + :local: + +Usage +===== + +To use this module, you need to: + +1. Go to *Settings > Technical > Sequences & Identifier > Manage + Sequence Options*. + +2. Based on extended module installed, different document types will be + listed, i.e., Purchase Order. + +3. Activite "Use sequence options" to use, if not, fall back to normal + sequence. + +4. For each option, provide, + + - Name: i.e., Customer Invoice for Cust A., Customer Payment, etc. + - Apply On: a filter domain to test whether a document match this + option. + - Sequence: select underlining sequence to perform + +**Note:** + +- If no options matches the document, fall back to normal sequence. +- If there are multiple sequence options that match same document, + error will be raised. + +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 to smash it by providing a detailed and welcomed +`feedback `_. + +Do not contact contributors directly about support or help with technical issues. + +Credits +======= + +Authors +------- + +* Ecosoft + +Contributors +------------ + +- Kitti U. +- [APSL-Nagarro](https://apsl.tech): + + - Antoni Marroig + +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-kittiu| image:: https://github.com/kittiu.png?size=40px + :target: https://github.com/kittiu + :alt: kittiu + +Current `maintainer `__: + +|maintainer-kittiu| + +This module is part of the `OCA/server-tools `_ project on GitHub. + +You are welcome to contribute. To learn how please visit https://odoo-community.org/page/Contribute. diff --git a/base_sequence_option/__init__.py b/base_sequence_option/__init__.py new file mode 100644 index 00000000000..b7f345e3e80 --- /dev/null +++ b/base_sequence_option/__init__.py @@ -0,0 +1,4 @@ +# Copyright 2021 Ecosoft Co., Ltd. (http://ecosoft.co.th) +# License LGPL-3.0 or later (https://www.gnu.org/licenses/lgpl.html). + +from . import models diff --git a/base_sequence_option/__manifest__.py b/base_sequence_option/__manifest__.py new file mode 100644 index 00000000000..7eb203d2ec6 --- /dev/null +++ b/base_sequence_option/__manifest__.py @@ -0,0 +1,22 @@ +# Copyright 2021 Ecosoft Co., Ltd. (http://ecosoft.co.th) +# License LGPL-3.0 or later (https://www.gnu.org/licenses/lgpl.html). + +{ + "name": "Base Sequence Option", + "summary": "Alternative sequence options for specific models", + "version": "17.0.1.0.0", + "author": "Ecosoft, Odoo Community Association (OCA)", + "maintainers": ["kittiu"], + "development_status": "Alpha", + "website": "https://github.com/OCA/server-tools", + "category": "Tools", + "depends": ["base"], + "external_dependencies": {"python": ["odoo_test_helper"]}, + "data": [ + "security/ir.model.access.csv", + "security/sequence_option_security.xml", + "views/sequence_option_view.xml", + ], + "license": "LGPL-3", + "installable": True, +} diff --git a/base_sequence_option/i18n/base_sequence_option.pot b/base_sequence_option/i18n/base_sequence_option.pot new file mode 100644 index 00000000000..7faecdf5d12 --- /dev/null +++ b/base_sequence_option/i18n/base_sequence_option.pot @@ -0,0 +1,205 @@ +# Translation of Odoo Server. +# This file contains the translation of the following modules: +# * base_sequence_option +# +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: base_sequence_option +#: model:ir.model.fields,field_description:base_sequence_option.field_ir_sequence_option_line__filter_domain +msgid "Apply On" +msgstr "" + +#. module: base_sequence_option +#: model:ir.model.fields,field_description:base_sequence_option.field_ir_sequence_option__model +#: model:ir.model.fields,field_description:base_sequence_option.field_ir_sequence_option_line__model +msgid "Apply On Model" +msgstr "" + +#. module: base_sequence_option +#: model:ir.model.fields,field_description:base_sequence_option.field_ir_sequence_option_line__base_id +msgid "Base" +msgstr "" + +#. module: base_sequence_option +#: model:ir.model.fields,field_description:base_sequence_option.field_ir_sequence_option__company_id +#: model:ir.model.fields,field_description:base_sequence_option.field_ir_sequence_option_line__company_id +msgid "Company" +msgstr "" + +#. module: base_sequence_option +#: model:ir.model.fields,help:base_sequence_option.field_ir_sequence_option__company_id +#: model:ir.model.fields,help:base_sequence_option.field_ir_sequence_option_line__company_id +msgid "Company related to this sequence option" +msgstr "" + +#. module: base_sequence_option +#: model:ir.model.fields,field_description:base_sequence_option.field_ir_sequence_option__create_uid +#: model:ir.model.fields,field_description:base_sequence_option.field_ir_sequence_option_line__create_uid +msgid "Created by" +msgstr "" + +#. module: base_sequence_option +#: model:ir.model.fields,field_description:base_sequence_option.field_ir_sequence_option__create_date +#: model:ir.model.fields,field_description:base_sequence_option.field_ir_sequence_option_line__create_date +msgid "Created on" +msgstr "" + +#. module: base_sequence_option +#: model:ir.model.fields,field_description:base_sequence_option.field_ir_sequence_option_line__name +msgid "Description" +msgstr "" + +#. module: base_sequence_option +#: model:ir.model.fields,field_description:base_sequence_option.field_ir_sequence_option__display_name +#: model:ir.model.fields,field_description:base_sequence_option.field_ir_sequence_option_line__display_name +msgid "Display Name" +msgstr "" + +#. module: base_sequence_option +#: model_terms:ir.ui.view,arch_db:base_sequence_option.view_ir_sequence_option_form +msgid "Doctype Sequence" +msgstr "" + +#. module: base_sequence_option +#: model:ir.model.fields,help:base_sequence_option.field_ir_sequence_option_line__filter_domain +msgid "Find matching option by document values" +msgstr "" + +#. module: base_sequence_option +#: model:ir.model.fields,field_description:base_sequence_option.field_ir_sequence_option__id +#: model:ir.model.fields,field_description:base_sequence_option.field_ir_sequence_option_line__id +msgid "ID" +msgstr "" + +#. module: base_sequence_option +#: model:ir.model.fields,help:base_sequence_option.field_ir_sequence_option__use_sequence_option +#: model:ir.model.fields,help:base_sequence_option.field_ir_sequence_option_line__use_sequence_option +msgid "" +"If checked, Odoo will try to find the new matching sequence first, if not " +"found, fall back to use the original Odoo sequence." +msgstr "" + +#. module: base_sequence_option +#: model:ir.model.fields,field_description:base_sequence_option.field_ir_sequence_option_line__implementation +msgid "Implementation" +msgstr "" + +#. module: base_sequence_option +#: model:ir.model.fields,field_description:base_sequence_option.field_ir_sequence_option____last_update +#: model:ir.model.fields,field_description:base_sequence_option.field_ir_sequence_option_line____last_update +msgid "Last Modified on" +msgstr "" + +#. module: base_sequence_option +#: model:ir.model.fields,field_description:base_sequence_option.field_ir_sequence_option__write_uid +#: model:ir.model.fields,field_description:base_sequence_option.field_ir_sequence_option_line__write_uid +msgid "Last Updated by" +msgstr "" + +#. module: base_sequence_option +#: model:ir.model.fields,field_description:base_sequence_option.field_ir_sequence_option__write_date +#: model:ir.model.fields,field_description:base_sequence_option.field_ir_sequence_option_line__write_date +msgid "Last Updated on" +msgstr "" + +#. module: base_sequence_option +#: model:ir.actions.act_window,name:base_sequence_option.action_ir_sequence_option +#: model:ir.ui.menu,name:base_sequence_option.menu_ir_sequence_option +msgid "Manage Sequence Options" +msgstr "" + +#. module: base_sequence_option +#: model_terms:ir.ui.view,arch_db:base_sequence_option.view_ir_sequence_option_form +msgid "Matching Domain" +msgstr "" + +#. module: base_sequence_option +#. odoo-python +#: code:addons/base_sequence_option/models/ir_sequence_option.py:0 +#, python-format +msgid "Multiple optional sequences found for this model!" +msgstr "" + +#. module: base_sequence_option +#: model:ir.model.fields,field_description:base_sequence_option.field_ir_sequence_option__name +#: model_terms:ir.ui.view,arch_db:base_sequence_option.view_ir_sequence_option_form +msgid "Name" +msgstr "" + +#. module: base_sequence_option +#: model:ir.model.fields,field_description:base_sequence_option.field_ir_sequence_option_line__prefix +msgid "Prefix" +msgstr "" + +#. module: base_sequence_option +#: model:ir.model.fields,help:base_sequence_option.field_ir_sequence_option_line__prefix +msgid "Prefix value of the record for the sequence" +msgstr "" + +#. module: base_sequence_option +#: model:ir.model,name:base_sequence_option.model_ir_sequence +#: model:ir.model.fields,field_description:base_sequence_option.field_ir_sequence_option_line__sequence_id +msgid "Sequence" +msgstr "" + +#. module: base_sequence_option +#: model:ir.model,name:base_sequence_option.model_ir_sequence_option +msgid "Sequence Option Base Model" +msgstr "" + +#. module: base_sequence_option +#: model:ir.model,name:base_sequence_option.model_ir_sequence_option_line +msgid "Sequence Option Line" +msgstr "" + +#. module: base_sequence_option +#: model:ir.model.fields,field_description:base_sequence_option.field_ir_sequence_option__option_ids +msgid "Sequence Options" +msgstr "" + +#. module: base_sequence_option +#: model:ir.model.fields,field_description:base_sequence_option.field_ir_sequence__smart_search +#: model:ir.model.fields,field_description:base_sequence_option.field_ir_sequence_option__smart_search +#: model:ir.model.fields,field_description:base_sequence_option.field_ir_sequence_option_line__smart_search +msgid "Smart Search" +msgstr "" + +#. module: base_sequence_option +#: model:ir.model.fields,field_description:base_sequence_option.field_ir_sequence_option_line__suffix +msgid "Suffix" +msgstr "" + +#. module: base_sequence_option +#: model:ir.model.fields,help:base_sequence_option.field_ir_sequence_option_line__suffix +msgid "Suffix value of the record for the sequence" +msgstr "" + +#. module: base_sequence_option +#: model_terms:ir.ui.view,arch_db:base_sequence_option.view_ir_sequence_option_form +msgid "Use Sequence" +msgstr "" + +#. module: base_sequence_option +#: model:ir.model.fields,field_description:base_sequence_option.field_ir_sequence_option__use_sequence_option +#: model:ir.model.fields,field_description:base_sequence_option.field_ir_sequence_option_line__use_sequence_option +msgid "Use sequence options" +msgstr "" + +#. module: base_sequence_option +#: model:ir.model.fields,help:base_sequence_option.field_ir_sequence_option_line__implementation +msgid "" +"While assigning a sequence number to a record, the 'no gap' sequence " +"implementation ensures that each previous sequence number has been assigned " +"already. While this sequence implementation will not skip any sequence " +"number upon assignment, there can still be gaps in the sequence if records " +"are deleted. The 'no gap' implementation is slower than the standard one." +msgstr "" diff --git a/base_sequence_option/i18n/es.po b/base_sequence_option/i18n/es.po new file mode 100644 index 00000000000..53dc2e7db64 --- /dev/null +++ b/base_sequence_option/i18n/es.po @@ -0,0 +1,217 @@ +# Translation of Odoo Server. +# This file contains the translation of the following modules: +# * base_sequence_option +# +msgid "" +msgstr "" +"Project-Id-Version: Odoo Server 16.0\n" +"Report-Msgid-Bugs-To: \n" +"PO-Revision-Date: 2023-11-11 15:39+0000\n" +"Last-Translator: Ivorra78 \n" +"Language-Team: none\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 4.17\n" + +#. module: base_sequence_option +#: model:ir.model.fields,field_description:base_sequence_option.field_ir_sequence_option_line__filter_domain +msgid "Apply On" +msgstr "Aplicar En" + +#. module: base_sequence_option +#: model:ir.model.fields,field_description:base_sequence_option.field_ir_sequence_option__model +#: model:ir.model.fields,field_description:base_sequence_option.field_ir_sequence_option_line__model +msgid "Apply On Model" +msgstr "Aplicar en el Modelo" + +#. module: base_sequence_option +#: model:ir.model.fields,field_description:base_sequence_option.field_ir_sequence_option_line__base_id +msgid "Base" +msgstr "Base" + +#. module: base_sequence_option +#: model:ir.model.fields,field_description:base_sequence_option.field_ir_sequence_option__company_id +#: model:ir.model.fields,field_description:base_sequence_option.field_ir_sequence_option_line__company_id +msgid "Company" +msgstr "Compañía" + +#. module: base_sequence_option +#: model:ir.model.fields,help:base_sequence_option.field_ir_sequence_option__company_id +#: model:ir.model.fields,help:base_sequence_option.field_ir_sequence_option_line__company_id +msgid "Company related to this sequence option" +msgstr "Compañía relacionada con esta opción de secuencia" + +#. module: base_sequence_option +#: model:ir.model.fields,field_description:base_sequence_option.field_ir_sequence_option__create_uid +#: model:ir.model.fields,field_description:base_sequence_option.field_ir_sequence_option_line__create_uid +msgid "Created by" +msgstr "Creado por" + +#. module: base_sequence_option +#: model:ir.model.fields,field_description:base_sequence_option.field_ir_sequence_option__create_date +#: model:ir.model.fields,field_description:base_sequence_option.field_ir_sequence_option_line__create_date +msgid "Created on" +msgstr "Creado el" + +#. module: base_sequence_option +#: model:ir.model.fields,field_description:base_sequence_option.field_ir_sequence_option_line__name +msgid "Description" +msgstr "Descripción" + +#. module: base_sequence_option +#: model:ir.model.fields,field_description:base_sequence_option.field_ir_sequence_option__display_name +#: model:ir.model.fields,field_description:base_sequence_option.field_ir_sequence_option_line__display_name +msgid "Display Name" +msgstr "Mostrar Nombre" + +#. module: base_sequence_option +#: model_terms:ir.ui.view,arch_db:base_sequence_option.view_ir_sequence_option_form +msgid "Doctype Sequence" +msgstr "Secuencia de tipo de Documento" + +#. module: base_sequence_option +#: model:ir.model.fields,help:base_sequence_option.field_ir_sequence_option_line__filter_domain +msgid "Find matching option by document values" +msgstr "Buscar opción coincidente por valores del documento" + +#. module: base_sequence_option +#: model:ir.model.fields,field_description:base_sequence_option.field_ir_sequence_option__id +#: model:ir.model.fields,field_description:base_sequence_option.field_ir_sequence_option_line__id +msgid "ID" +msgstr "ID (identificación)" + +#. module: base_sequence_option +#: model:ir.model.fields,help:base_sequence_option.field_ir_sequence_option__use_sequence_option +#: model:ir.model.fields,help:base_sequence_option.field_ir_sequence_option_line__use_sequence_option +msgid "" +"If checked, Odoo will try to find the new matching sequence first, if not " +"found, fall back to use the original Odoo sequence." +msgstr "" +"Si esta marcada, Odoo tratara de encontrar la nueva secuencia coincidente " +"primero, si no se encuentra, retrocede para usar la secuencia original de " +"Odoo." + +#. module: base_sequence_option +#: model:ir.model.fields,field_description:base_sequence_option.field_ir_sequence_option_line__implementation +msgid "Implementation" +msgstr "Implementación" + +#. module: base_sequence_option +#: model:ir.model.fields,field_description:base_sequence_option.field_ir_sequence_option____last_update +#: model:ir.model.fields,field_description:base_sequence_option.field_ir_sequence_option_line____last_update +msgid "Last Modified on" +msgstr "Última Modificación el" + +#. module: base_sequence_option +#: model:ir.model.fields,field_description:base_sequence_option.field_ir_sequence_option__write_uid +#: model:ir.model.fields,field_description:base_sequence_option.field_ir_sequence_option_line__write_uid +msgid "Last Updated by" +msgstr "Actualizado por Última vez por" + +#. module: base_sequence_option +#: model:ir.model.fields,field_description:base_sequence_option.field_ir_sequence_option__write_date +#: model:ir.model.fields,field_description:base_sequence_option.field_ir_sequence_option_line__write_date +msgid "Last Updated on" +msgstr "Última Actualización el" + +#. module: base_sequence_option +#: model:ir.actions.act_window,name:base_sequence_option.action_ir_sequence_option +#: model:ir.ui.menu,name:base_sequence_option.menu_ir_sequence_option +msgid "Manage Sequence Options" +msgstr "Gestionar Opciones de Secuencia" + +#. module: base_sequence_option +#: model_terms:ir.ui.view,arch_db:base_sequence_option.view_ir_sequence_option_form +msgid "Matching Domain" +msgstr "Dominio Correspondiente" + +#. module: base_sequence_option +#. odoo-python +#: code:addons/base_sequence_option/models/ir_sequence_option.py:0 +#, python-format +msgid "Multiple optional sequences found for this model!" +msgstr "¡Múltiples secuencias opcionales encontradas para este modelo!" + +#. module: base_sequence_option +#: model:ir.model.fields,field_description:base_sequence_option.field_ir_sequence_option__name +#: model_terms:ir.ui.view,arch_db:base_sequence_option.view_ir_sequence_option_form +msgid "Name" +msgstr "Nombre" + +#. module: base_sequence_option +#: model:ir.model.fields,field_description:base_sequence_option.field_ir_sequence_option_line__prefix +msgid "Prefix" +msgstr "Prefijo" + +#. module: base_sequence_option +#: model:ir.model.fields,help:base_sequence_option.field_ir_sequence_option_line__prefix +msgid "Prefix value of the record for the sequence" +msgstr "Valor del prefijo del registro para la secuencia" + +#. module: base_sequence_option +#: model:ir.model,name:base_sequence_option.model_ir_sequence +#: model:ir.model.fields,field_description:base_sequence_option.field_ir_sequence_option_line__sequence_id +msgid "Sequence" +msgstr "Secuencia" + +#. module: base_sequence_option +#: model:ir.model,name:base_sequence_option.model_ir_sequence_option +msgid "Sequence Option Base Model" +msgstr "Secuencia Opción Modelo Base" + +#. module: base_sequence_option +#: model:ir.model,name:base_sequence_option.model_ir_sequence_option_line +msgid "Sequence Option Line" +msgstr "Línea de Opción de Secuencia" + +#. module: base_sequence_option +#: model:ir.model.fields,field_description:base_sequence_option.field_ir_sequence_option__option_ids +msgid "Sequence Options" +msgstr "Opciones de Secuencia" + +#. module: base_sequence_option +#: model:ir.model.fields,field_description:base_sequence_option.field_ir_sequence__smart_search +#: model:ir.model.fields,field_description:base_sequence_option.field_ir_sequence_option__smart_search +#: model:ir.model.fields,field_description:base_sequence_option.field_ir_sequence_option_line__smart_search +msgid "Smart Search" +msgstr "Búsqueda Inteligente" + +#. module: base_sequence_option +#: model:ir.model.fields,field_description:base_sequence_option.field_ir_sequence_option_line__suffix +msgid "Suffix" +msgstr "Sufijo" + +#. module: base_sequence_option +#: model:ir.model.fields,help:base_sequence_option.field_ir_sequence_option_line__suffix +msgid "Suffix value of the record for the sequence" +msgstr "Valor del sufijo del registro para la secuencia" + +#. module: base_sequence_option +#: model_terms:ir.ui.view,arch_db:base_sequence_option.view_ir_sequence_option_form +msgid "Use Sequence" +msgstr "Secuencia de Uso" + +#. module: base_sequence_option +#: model:ir.model.fields,field_description:base_sequence_option.field_ir_sequence_option__use_sequence_option +#: model:ir.model.fields,field_description:base_sequence_option.field_ir_sequence_option_line__use_sequence_option +msgid "Use sequence options" +msgstr "Utilizar opciones de secuencia" + +#. module: base_sequence_option +#: model:ir.model.fields,help:base_sequence_option.field_ir_sequence_option_line__implementation +msgid "" +"While assigning a sequence number to a record, the 'no gap' sequence " +"implementation ensures that each previous sequence number has been assigned " +"already. While this sequence implementation will not skip any sequence " +"number upon assignment, there can still be gaps in the sequence if records " +"are deleted. The 'no gap' implementation is slower than the standard one." +msgstr "" +"Al asignar un número de secuencia a un registro, la implementación de la " +"secuencia \"sin espacios\" garantiza que ya se ha asignado cada número de " +"secuencia anterior. Aunque esta implementación de la secuencia no omitirá " +"ningún número de secuencia al asignarlo, puede haber huecos en la secuencia " +"si se borran registros. La implementación \"sin huecos\" es más lenta que la " +"estándar." diff --git a/base_sequence_option/i18n/it.po b/base_sequence_option/i18n/it.po new file mode 100644 index 00000000000..140ab81ce5b --- /dev/null +++ b/base_sequence_option/i18n/it.po @@ -0,0 +1,217 @@ +# Translation of Odoo Server. +# This file contains the translation of the following modules: +# * base_sequence_option +# +msgid "" +msgstr "" +"Project-Id-Version: Odoo Server 16.0\n" +"Report-Msgid-Bugs-To: \n" +"PO-Revision-Date: 2024-01-08 17:35+0000\n" +"Last-Translator: mymage \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 4.17\n" + +#. module: base_sequence_option +#: model:ir.model.fields,field_description:base_sequence_option.field_ir_sequence_option_line__filter_domain +msgid "Apply On" +msgstr "Applica a" + +#. module: base_sequence_option +#: model:ir.model.fields,field_description:base_sequence_option.field_ir_sequence_option__model +#: model:ir.model.fields,field_description:base_sequence_option.field_ir_sequence_option_line__model +msgid "Apply On Model" +msgstr "Applica sul modello" + +#. module: base_sequence_option +#: model:ir.model.fields,field_description:base_sequence_option.field_ir_sequence_option_line__base_id +msgid "Base" +msgstr "Base" + +#. module: base_sequence_option +#: model:ir.model.fields,field_description:base_sequence_option.field_ir_sequence_option__company_id +#: model:ir.model.fields,field_description:base_sequence_option.field_ir_sequence_option_line__company_id +msgid "Company" +msgstr "Azienda" + +#. module: base_sequence_option +#: model:ir.model.fields,help:base_sequence_option.field_ir_sequence_option__company_id +#: model:ir.model.fields,help:base_sequence_option.field_ir_sequence_option_line__company_id +msgid "Company related to this sequence option" +msgstr "Azienda collegata a questa opzione di sequenza" + +#. module: base_sequence_option +#: model:ir.model.fields,field_description:base_sequence_option.field_ir_sequence_option__create_uid +#: model:ir.model.fields,field_description:base_sequence_option.field_ir_sequence_option_line__create_uid +msgid "Created by" +msgstr "Creato da" + +#. module: base_sequence_option +#: model:ir.model.fields,field_description:base_sequence_option.field_ir_sequence_option__create_date +#: model:ir.model.fields,field_description:base_sequence_option.field_ir_sequence_option_line__create_date +msgid "Created on" +msgstr "Creato il" + +#. module: base_sequence_option +#: model:ir.model.fields,field_description:base_sequence_option.field_ir_sequence_option_line__name +msgid "Description" +msgstr "Descrizione" + +#. module: base_sequence_option +#: model:ir.model.fields,field_description:base_sequence_option.field_ir_sequence_option__display_name +#: model:ir.model.fields,field_description:base_sequence_option.field_ir_sequence_option_line__display_name +msgid "Display Name" +msgstr "Nome visualizzato" + +#. module: base_sequence_option +#: model_terms:ir.ui.view,arch_db:base_sequence_option.view_ir_sequence_option_form +msgid "Doctype Sequence" +msgstr "Sequenza del tipo di documento" + +#. module: base_sequence_option +#: model:ir.model.fields,help:base_sequence_option.field_ir_sequence_option_line__filter_domain +msgid "Find matching option by document values" +msgstr "Trova l'opzione di corrispondenza in base ai valori del documento" + +#. module: base_sequence_option +#: model:ir.model.fields,field_description:base_sequence_option.field_ir_sequence_option__id +#: model:ir.model.fields,field_description:base_sequence_option.field_ir_sequence_option_line__id +msgid "ID" +msgstr "ID" + +#. module: base_sequence_option +#: model:ir.model.fields,help:base_sequence_option.field_ir_sequence_option__use_sequence_option +#: model:ir.model.fields,help:base_sequence_option.field_ir_sequence_option_line__use_sequence_option +msgid "" +"If checked, Odoo will try to find the new matching sequence first, if not " +"found, fall back to use the original Odoo sequence." +msgstr "" +"Se selezionata, Odoo proverà prima a trovare la nuova sequenza " +"corrispondente, se non la trova, torna indietro per utilizzare la sequenza " +"Odoo originale." + +#. module: base_sequence_option +#: model:ir.model.fields,field_description:base_sequence_option.field_ir_sequence_option_line__implementation +msgid "Implementation" +msgstr "Implementazione" + +#. module: base_sequence_option +#: model:ir.model.fields,field_description:base_sequence_option.field_ir_sequence_option____last_update +#: model:ir.model.fields,field_description:base_sequence_option.field_ir_sequence_option_line____last_update +msgid "Last Modified on" +msgstr "Ultima modifica il" + +#. module: base_sequence_option +#: model:ir.model.fields,field_description:base_sequence_option.field_ir_sequence_option__write_uid +#: model:ir.model.fields,field_description:base_sequence_option.field_ir_sequence_option_line__write_uid +msgid "Last Updated by" +msgstr "Ultimo aggiornamento di" + +#. module: base_sequence_option +#: model:ir.model.fields,field_description:base_sequence_option.field_ir_sequence_option__write_date +#: model:ir.model.fields,field_description:base_sequence_option.field_ir_sequence_option_line__write_date +msgid "Last Updated on" +msgstr "Ultimo aggiornamento il" + +#. module: base_sequence_option +#: model:ir.actions.act_window,name:base_sequence_option.action_ir_sequence_option +#: model:ir.ui.menu,name:base_sequence_option.menu_ir_sequence_option +msgid "Manage Sequence Options" +msgstr "Gestisci le opzioni di sequenza" + +#. module: base_sequence_option +#: model_terms:ir.ui.view,arch_db:base_sequence_option.view_ir_sequence_option_form +msgid "Matching Domain" +msgstr "Dominio corrispondente" + +#. module: base_sequence_option +#. odoo-python +#: code:addons/base_sequence_option/models/ir_sequence_option.py:0 +#, python-format +msgid "Multiple optional sequences found for this model!" +msgstr "Molteplici opzionali sequenze trovate per questo modello!" + +#. module: base_sequence_option +#: model:ir.model.fields,field_description:base_sequence_option.field_ir_sequence_option__name +#: model_terms:ir.ui.view,arch_db:base_sequence_option.view_ir_sequence_option_form +msgid "Name" +msgstr "Nome" + +#. module: base_sequence_option +#: model:ir.model.fields,field_description:base_sequence_option.field_ir_sequence_option_line__prefix +msgid "Prefix" +msgstr "Prefisso" + +#. module: base_sequence_option +#: model:ir.model.fields,help:base_sequence_option.field_ir_sequence_option_line__prefix +msgid "Prefix value of the record for the sequence" +msgstr "Valore prefisso del record per la sequenza" + +#. module: base_sequence_option +#: model:ir.model,name:base_sequence_option.model_ir_sequence +#: model:ir.model.fields,field_description:base_sequence_option.field_ir_sequence_option_line__sequence_id +msgid "Sequence" +msgstr "Sequenza" + +#. module: base_sequence_option +#: model:ir.model,name:base_sequence_option.model_ir_sequence_option +msgid "Sequence Option Base Model" +msgstr "Sequenza modello base opzione" + +#. module: base_sequence_option +#: model:ir.model,name:base_sequence_option.model_ir_sequence_option_line +msgid "Sequence Option Line" +msgstr "Riga opzione sequenza" + +#. module: base_sequence_option +#: model:ir.model.fields,field_description:base_sequence_option.field_ir_sequence_option__option_ids +msgid "Sequence Options" +msgstr "Opzioni sequenza" + +#. module: base_sequence_option +#: model:ir.model.fields,field_description:base_sequence_option.field_ir_sequence__smart_search +#: model:ir.model.fields,field_description:base_sequence_option.field_ir_sequence_option__smart_search +#: model:ir.model.fields,field_description:base_sequence_option.field_ir_sequence_option_line__smart_search +msgid "Smart Search" +msgstr "Ricerca intelligente" + +#. module: base_sequence_option +#: model:ir.model.fields,field_description:base_sequence_option.field_ir_sequence_option_line__suffix +msgid "Suffix" +msgstr "Suffisso" + +#. module: base_sequence_option +#: model:ir.model.fields,help:base_sequence_option.field_ir_sequence_option_line__suffix +msgid "Suffix value of the record for the sequence" +msgstr "Valore suffisso del record per la sequenza" + +#. module: base_sequence_option +#: model_terms:ir.ui.view,arch_db:base_sequence_option.view_ir_sequence_option_form +msgid "Use Sequence" +msgstr "Usa sequenza" + +#. module: base_sequence_option +#: model:ir.model.fields,field_description:base_sequence_option.field_ir_sequence_option__use_sequence_option +#: model:ir.model.fields,field_description:base_sequence_option.field_ir_sequence_option_line__use_sequence_option +msgid "Use sequence options" +msgstr "Usa opzioni sequenza" + +#. module: base_sequence_option +#: model:ir.model.fields,help:base_sequence_option.field_ir_sequence_option_line__implementation +msgid "" +"While assigning a sequence number to a record, the 'no gap' sequence " +"implementation ensures that each previous sequence number has been assigned " +"already. While this sequence implementation will not skip any sequence " +"number upon assignment, there can still be gaps in the sequence if records " +"are deleted. The 'no gap' implementation is slower than the standard one." +msgstr "" +"Nell'assegnare un numero sequenza ad un record, l'implementazione 'senza " +"salti' assicura che ogni numero sequenza precedente sia già stato assegnato. " +"Mentre questa implementazione di sequenza non salta alcun numero " +"nell'assegnamento, ci possono essere dei salti nella sequenza se i record " +"vengono cancellati. L'implementazione 'senza salti' è più lenta di quella " +"standard." diff --git a/base_sequence_option/models/__init__.py b/base_sequence_option/models/__init__.py new file mode 100644 index 00000000000..e3f324a793e --- /dev/null +++ b/base_sequence_option/models/__init__.py @@ -0,0 +1,5 @@ +# Copyright 2021 Ecosoft Co., Ltd. (http://ecosoft.co.th) +# License LGPL-3.0 or later (https://www.gnu.org/licenses/lgpl.html). + +from . import ir_sequence_option +from . import ir_sequence diff --git a/base_sequence_option/models/ir_sequence.py b/base_sequence_option/models/ir_sequence.py new file mode 100644 index 00000000000..c3b54f29277 --- /dev/null +++ b/base_sequence_option/models/ir_sequence.py @@ -0,0 +1,22 @@ +# Copyright 2021 Ecosoft Co., Ltd. (http://ecosoft.co.th) +# License LGPL-3.0 or later (https://www.gnu.org/licenses/lgpl.html). + +from odoo import api, models + + +class IrSequence(models.Model): + _inherit = "ir.sequence" + + def next_by_id(self, sequence_date=None): + sequence_id = self.env.context.get("sequence_option_id", False) + if sequence_id: + self = self.browse(sequence_id) + return super().next_by_id(sequence_date=sequence_date) + + @api.model + def next_by_code(self, sequence_code, sequence_date=None): + sequence_id = self.env.context.get("sequence_option_id", False) + if sequence_id: + self = self.browse(sequence_id) + return super().next_by_id(sequence_date=sequence_date) + return super().next_by_code(sequence_code, sequence_date=sequence_date) diff --git a/base_sequence_option/models/ir_sequence_option.py b/base_sequence_option/models/ir_sequence_option.py new file mode 100644 index 00000000000..f3ae37d2ac1 --- /dev/null +++ b/base_sequence_option/models/ir_sequence_option.py @@ -0,0 +1,120 @@ +# Copyright 2021 Ecosoft Co., Ltd. (http://ecosoft.co.th) +# License LGPL-3.0 or later (https://www.gnu.org/licenses/lgpl.html). + +from odoo import _, fields, models +from odoo.exceptions import ValidationError +from odoo.tools import safe_eval + + +class IrSequenceOption(models.Model): + _name = "ir.sequence.option" + _description = "Sequence Option Base Model" + _check_company_auto = True + + name = fields.Char() + use_sequence_option = fields.Boolean( + string="Use sequence options", + help="If checked, Odoo will try to find the new matching sequence first, " + "if not found, fall back to use the original Odoo sequence.", + ) + model = fields.Selection( + selection=[], + string="Apply On Model", + required=True, + readonly=False, + index=True, + ) + option_ids = fields.One2many( + string="Sequence Options", + comodel_name="ir.sequence.option.line", + inverse_name="base_id", + ) + company_id = fields.Many2one( + comodel_name="res.company", + string="Company", + required=True, + readonly=False, + index=True, + default=lambda self: self.env.company, + help="Company related to this sequence option", + ) + + +class IrSequenceOptionLine(models.Model): + _name = "ir.sequence.option.line" + _description = "Sequence Option Line" + _check_company_auto = True + + base_id = fields.Many2one( + comodel_name="ir.sequence.option", + index=True, + required=True, + ondelete="cascade", + ) + name = fields.Char( + string="Description", + required=True, + ) + model = fields.Selection( + related="base_id.model", + store=True, + ) + use_sequence_option = fields.Boolean( + related="base_id.use_sequence_option", + store=True, + ) + filter_domain = fields.Char( + string="Apply On", + default="[]", + help="Find matching option by document values", + ) + sequence_id = fields.Many2one( + comodel_name="ir.sequence", + string="Sequence", + required=True, + check_company=True, + ) + prefix = fields.Char( + related="sequence_id.prefix", + string="Prefix", + ) + suffix = fields.Char( + related="sequence_id.suffix", + string="Suffix", + ) + implementation = fields.Selection( + related="sequence_id.implementation", + string="Implementation", + ) + company_id = fields.Many2one( + comodel_name="res.company", + related="base_id.company_id", + store=True, + ) + + def get_model_options(self, model): + return self.sudo().search( + [("use_sequence_option", "=", True), ("model", "=", model)] + ) + + def get_sequence(self, record, options=False): + """ + Find sequence option that match the record values + """ + if not options: + options = self.get_model_options(record._name) + # multi-company + company = ( + hasattr(record, "company_id") and record.company_id or self.env.company + ) + options = options.filtered(lambda x: x.company_id == company) + sequence = self.env["ir.sequence"] + for option in options: + domain = safe_eval.safe_eval(option.filter_domain) + if record.sudo().filtered_domain(domain): + if sequence: # Do not allow > 1 match + raise ValidationError( + _("Multiple optional sequences found for this model!") + ) + sequence = option.sequence_id + return sequence diff --git a/base_sequence_option/pyproject.toml b/base_sequence_option/pyproject.toml new file mode 100644 index 00000000000..4231d0cccb3 --- /dev/null +++ b/base_sequence_option/pyproject.toml @@ -0,0 +1,3 @@ +[build-system] +requires = ["whool"] +build-backend = "whool.buildapi" diff --git a/base_sequence_option/readme/CONTRIBUTORS.md b/base_sequence_option/readme/CONTRIBUTORS.md new file mode 100644 index 00000000000..6dd896a7478 --- /dev/null +++ b/base_sequence_option/readme/CONTRIBUTORS.md @@ -0,0 +1,3 @@ +- Kitti U. \<\> +- \[APSL-Nagarro\](): + - Antoni Marroig \<\> \ No newline at end of file diff --git a/base_sequence_option/readme/DESCRIPTION.md b/base_sequence_option/readme/DESCRIPTION.md new file mode 100644 index 00000000000..1ec9c218aa8 --- /dev/null +++ b/base_sequence_option/readme/DESCRIPTION.md @@ -0,0 +1,18 @@ +This module allow user to add optional sequences to some document model. +On which sequence is used, is based on domain matching with document +values (and original sequence will be bypassed). + +For example, it is now possible to, + +- Avoid using Odoo automatic sequence on invoice and vendor bill with + old style sequence. +- Customer payment and vendor payment to run on different sequence. +- Assign different sales order sequence based on customer region. + +This is a base module and does nothing by itself. Following are modules +that will allow managing sequence options for each type of documents, +I.e., + +- Purchase Order: purchase_sequence_option +- Invoice / Bill / Refund / Payment: account_sequence_option +- Others: create a new module with few lines of code diff --git a/base_sequence_option/readme/USAGE.md b/base_sequence_option/readme/USAGE.md new file mode 100644 index 00000000000..04c47ab04ad --- /dev/null +++ b/base_sequence_option/readme/USAGE.md @@ -0,0 +1,22 @@ +To use this module, you need to: + +1. Go to *Settings \> Technical \> Sequences & Identifier \> Manage + Sequence Options*. + +2. Based on extended module installed, different document types will be + listed, i.e., Purchase Order. + +3. Activite "Use sequence options" to use, if not, fall back to normal + sequence. + +4. For each option, provide, + - Name: i.e., Customer Invoice for Cust A., Customer Payment, etc. + - Apply On: a filter domain to test whether a document match this + option. + - Sequence: select underlining sequence to perform + +**Note:** + +- If no options matches the document, fall back to normal sequence. +- If there are multiple sequence options that match same document, error + will be raised. diff --git a/base_sequence_option/security/ir.model.access.csv b/base_sequence_option/security/ir.model.access.csv new file mode 100644 index 00000000000..90a101a56e7 --- /dev/null +++ b/base_sequence_option/security/ir.model.access.csv @@ -0,0 +1,5 @@ +id,name,model_id:id,group_id:id,perm_read,perm_write,perm_create,perm_unlink +access_ir_sequence_option_line,access_ir_sequence_option_line,model_ir_sequence_option_line,base.group_user,1,0,0,0 +access_ir_sequence_option_line_system,access_ir_sequence_option_line_system,model_ir_sequence_option_line,base.group_system,1,1,1,1 +access_ir_sequence_option,access_ir_sequence_option,model_ir_sequence_option,base.group_user,1,0,0,0 +access_ir_sequence_option_system,access_ir_sequence_option_system,model_ir_sequence_option,base.group_system,1,1,1,1 diff --git a/base_sequence_option/security/sequence_option_security.xml b/base_sequence_option/security/sequence_option_security.xml new file mode 100644 index 00000000000..14ab82d31bf --- /dev/null +++ b/base_sequence_option/security/sequence_option_security.xml @@ -0,0 +1,18 @@ + + + Sequence Option: multi-company + + + + [('company_id', 'in', company_ids)] + + + + Sequence Option Line: multi-company + + + + [('company_id', 'in', company_ids)] + + + diff --git a/base_sequence_option/static/description/icon.png b/base_sequence_option/static/description/icon.png new file mode 100644 index 00000000000..3a0328b516c Binary files /dev/null and b/base_sequence_option/static/description/icon.png differ diff --git a/base_sequence_option/static/description/index.html b/base_sequence_option/static/description/index.html new file mode 100644 index 00000000000..cde89fff6cc --- /dev/null +++ b/base_sequence_option/static/description/index.html @@ -0,0 +1,475 @@ + + + + + +Base Sequence Option + + + +
+

Base Sequence Option

+ + +

Alpha License: LGPL-3 OCA/server-tools Translate me on Weblate Try me on Runboat

+

This module allow user to add optional sequences to some document model. +On which sequence is used, is based on domain matching with document +values (and original sequence will be bypassed).

+

For example, it is now possible to,

+
    +
  • Avoid using Odoo automatic sequence on invoice and vendor bill with +old style sequence.
  • +
  • Customer payment and vendor payment to run on different sequence.
  • +
  • Assign different sales order sequence based on customer region.
  • +
+

This is a base module and does nothing by itself. Following are modules +that will allow managing sequence options for each type of documents, +I.e.,

+
    +
  • Purchase Order: purchase_sequence_option
  • +
  • Invoice / Bill / Refund / Payment: account_sequence_option
  • +
  • Others: create a new module with few lines of code
  • +
+
+

Important

+

This is an alpha version, the data model and design can change at any time without warning. +Only for development or testing purpose, do not use in production. +More details on development status

+
+

Table of contents

+ +
+

Usage

+

To use this module, you need to:

+
    +
  1. Go to Settings > Technical > Sequences & Identifier > Manage +Sequence Options.
  2. +
  3. Based on extended module installed, different document types will be +listed, i.e., Purchase Order.
  4. +
  5. Activite “Use sequence options” to use, if not, fall back to normal +sequence.
  6. +
  7. For each option, provide,
      +
    • Name: i.e., Customer Invoice for Cust A., Customer Payment, etc.
    • +
    • Apply On: a filter domain to test whether a document match this +option.
    • +
    • Sequence: select underlining sequence to perform
    • +
    +
  8. +
+

Note:

+
    +
  • If no options matches the document, fall back to normal sequence.
  • +
  • If there are multiple sequence options that match same document, +error will be raised.
  • +
+
+
+

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 to smash it by providing a detailed and welcomed +feedback.

+

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

+
+
+

Credits

+
+

Authors

+
    +
  • Ecosoft
  • +
+
+
+

Contributors

+ +
+
+

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.

+

Current maintainer:

+

kittiu

+

This module is part of the OCA/server-tools project on GitHub.

+

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

+
+
+
+ + diff --git a/base_sequence_option/tests/__init__.py b/base_sequence_option/tests/__init__.py new file mode 100644 index 00000000000..118f59c2e7e --- /dev/null +++ b/base_sequence_option/tests/__init__.py @@ -0,0 +1,5 @@ +# Copyright 2021 Ecosoft Co., Ltd. (http://ecosoft.co.th) +# License LGPL-3.0 or later (https://www.gnu.org/licenses/lgpl.html). + +from . import common +from . import test_ir_sequence_option diff --git a/base_sequence_option/tests/base_sequence_tester.py b/base_sequence_option/tests/base_sequence_tester.py new file mode 100644 index 00000000000..652bcc9a390 --- /dev/null +++ b/base_sequence_option/tests/base_sequence_tester.py @@ -0,0 +1,30 @@ +# Copyright 2021 Ecosoft Co., Ltd. (http://ecosoft.co.th) +# License LGPL-3.0 or later (https://www.gnu.org/licenses/lgpl.html). + +from odoo import api, fields, models + + +class BaseSequenceTester(models.Model): + _name = "base.sequence.tester" + _description = "Base Sequence Tester" + + name = fields.Char(default="/") + test_type = fields.Selection(selection=[("a", "A"), ("b", "B")]) + + @api.model + def create(self, vals): + seq = self.env["ir.sequence.option.line"].get_sequence(self.new(vals)) + if seq: # use sequence from sequence.option, instead of base.sequence.tester + self = self.with_context(sequence_option_id=seq.id) + new_seq = self.env["ir.sequence"].next_by_code("base.sequence.tester") + vals["name"] = new_seq + return super().create(vals) + + +class IrSequenceOption(models.Model): + _inherit = "ir.sequence.option" + + model = fields.Selection( + selection_add=[("base.sequence.tester", "base.sequence.tester")], + ondelete={"base.sequence.tester": "cascade"}, + ) diff --git a/base_sequence_option/tests/common.py b/base_sequence_option/tests/common.py new file mode 100644 index 00000000000..84c9724385d --- /dev/null +++ b/base_sequence_option/tests/common.py @@ -0,0 +1,93 @@ +# Copyright 2021 Ecosoft Co., Ltd. (http://ecosoft.co.th) +# License LGPL-3.0 or later (https://www.gnu.org/licenses/lgpl.html). + +from odoo_test_helper import FakeModelLoader + +from odoo.tests import common + + +class CommonBaseSequenceOption(common.TransactionCase): + @classmethod + def setUpClass(cls): + super().setUpClass() + + cls.loader = FakeModelLoader(cls.env, cls.__module__) + cls.loader.backup_registry() + from .base_sequence_tester import BaseSequenceTester, IrSequenceOption + + cls.loader.update_registry((BaseSequenceTester, IrSequenceOption)) + + cls.test_model = cls.env[BaseSequenceTester._name] + + cls.tester_model = cls.env["ir.model"].search( + [("model", "=", "base.sequence.tester")] + ) + + # Access record: + cls.env["ir.model.access"].create( + { + "name": "access.tester", + "model_id": cls.tester_model.id, + "perm_read": 1, + "perm_write": 1, + "perm_create": 1, + "perm_unlink": 1, + } + ) + + # Create sequence for type A and type B + cls.ir_sequence_obj = cls.env["ir.sequence"] + cls.ir_sequence_obj.create( + { + "name": "Default Sequence", + "code": "base.sequence.tester", + "padding": 5, + "prefix": "DEF/", + } + ) + seq_a = cls.ir_sequence_obj.create( + { + "name": "Type A", + "padding": 5, + "prefix": "TYPE-A/", + } + ) + seq_b = cls.ir_sequence_obj.create( + { + "name": "Type B", + "padding": 5, + "prefix": "TYPE-B/", + } + ) + + # Create sequence options for model base.sequence.tester: + cls.base_sequence_obj = cls.env["ir.sequence.option"] + cls.base_seq = cls.base_sequence_obj.create( + { + "name": "Test Model", + "model": "base.sequence.tester", + "use_sequence_option": True, + } + ) + cls.sequence_obj = cls.env["ir.sequence.option.line"] + cls.sequence_obj.create( + { + "base_id": cls.base_seq.id, + "name": "Option 1", + "filter_domain": [("test_type", "=", "a")], + "sequence_id": seq_a.id, + } + ) + cls.sequence_obj.create( + { + "base_id": cls.base_seq.id, + "name": "Option 1", + "filter_domain": [("test_type", "=", "b")], + "sequence_id": seq_b.id, + } + ) + + @classmethod + def tearDownClass(cls): + cls.loader.restore_registry() + return super().tearDownClass() diff --git a/base_sequence_option/tests/test_ir_sequence_option.py b/base_sequence_option/tests/test_ir_sequence_option.py new file mode 100644 index 00000000000..ecbc23e61b3 --- /dev/null +++ b/base_sequence_option/tests/test_ir_sequence_option.py @@ -0,0 +1,30 @@ +# Copyright 2021 Ecosoft Co., Ltd. (http://ecosoft.co.th) +# License LGPL-3.0 or later (https://www.gnu.org/licenses/lgpl.html). + +from odoo.tests.common import tagged + +from .common import CommonBaseSequenceOption + + +@tagged("post_install", "-at_install") +class TestBaseSequenceTester(CommonBaseSequenceOption): + def test_sequence_options(self): + """ + Test 3 cases, + 1. Default + 2. Sequence Type A + 3. Sequence Type B + """ + # 1. Default + rec = self.test_model.create({}) + self.assertIn("DEF/", rec.name) + # 2. Type A + rec = self.test_model.create({"test_type": "a"}) + self.assertIn("TYPE-A/", rec.name) + # 3. Type B + rec = self.test_model.create({"test_type": "b"}) + self.assertIn("TYPE-B/", rec.name) + # Not useing the sequence + self.base_seq.use_sequence_option = False + rec = self.test_model.create({"test_type": "b"}) + self.assertIn("DEF/", rec.name) diff --git a/base_sequence_option/views/sequence_option_view.xml b/base_sequence_option/views/sequence_option_view.xml new file mode 100644 index 00000000000..7bc3c205e1a --- /dev/null +++ b/base_sequence_option/views/sequence_option_view.xml @@ -0,0 +1,99 @@ + + + + + + + view.ir.sequence.option.tree + ir.sequence.option + + + + + + + + + + + + view.ir.sequence.option.line.tree + ir.sequence.option.line + + + + + + + + + + + + + view.ir.sequence.option.form + ir.sequence.option + +
+

+ +

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+
+ + + Manage Sequence Options + ir.sequence.option + tree,form + + + + + +
diff --git a/requirements.txt b/requirements.txt index 09418114542..11176ae5b53 100644 --- a/requirements.txt +++ b/requirements.txt @@ -2,6 +2,7 @@ astor dataclasses mako +odoo_test_helper odoorpc openupgradelib sentry_sdk<=1.9.0