diff --git a/sale_elaboration/README.rst b/sale_elaboration/README.rst new file mode 100644 index 00000000000..6e43947d426 --- /dev/null +++ b/sale_elaboration/README.rst @@ -0,0 +1,133 @@ +================ +Sale Elaboration +================ + +.. + !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! + !! This file is generated by oca-gen-addon-readme !! + !! changes will be overwritten. !! + !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! + !! source digest: sha256:fb2acb1d933040120f2642c0747e4f7f34761bd5bcd9c833c38e4615333e1fda + !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! + +.. |badge1| image:: https://img.shields.io/badge/maturity-Production%2FStable-green.png + :target: https://odoo-community.org/page/development-status + :alt: Production/Stable +.. |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%2Fsale--workflow-lightgray.png?logo=github + :target: https://github.com/OCA/sale-workflow/tree/17.0/sale_elaboration + :alt: OCA/sale-workflow +.. |badge4| image:: https://img.shields.io/badge/weblate-Translate%20me-F47D42.png + :target: https://translation.odoo-community.org/projects/sale-workflow-17-0/sale-workflow-17-0-sale_elaboration + :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/sale-workflow&target_branch=17.0 + :alt: Try me on Runboat + +|badge1| |badge2| |badge3| |badge4| |badge5| + +This module extends the functionality of sales orders to allow to set an +elaboration on lines that will add an extra order line with an +elaboration product linked to it when the delivery order is validated. + +An **elaboration** is a process that needs to be done over the product, +usually on picking/handling phase. It doesn't modify too much the +product for needing an specific product, but it adds a surcharge on the +final price. + +**Table of contents** + +.. contents:: + :local: + +Configuration +============= + +To configure this module you need to: + +1. Go to *Sale > Configuration > Products > Sale Elaboration*. +2. Create a new record. +3. Set a product linked to the elaboration. +4. Also you can select a route to procure this elaboration. + +Usage +===== + +1. Go to *Sale > Quotations*. +2. Create a sales order. +3. Add a new line. +4. Select an elaboration in the line. +5. Confirm the sales order. +6. Go to the picking created by this sales order and validate it. +7. Go back to the sales order. A new line is created with the product + linked to the elaboration. + +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 +------- + +* Tecnativa + +Contributors +------------ + +- `Tecnativa `__: + + - Sergio Teruel + - Pedro M. Baeza + - Carlos Roca + - Ernesto Tejeda + +- Eduardo de Miguel (`Moduon `__) +- Jairo Llopis (`Moduon `__) +- `APSL-Nagarro `__: + + - 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-CarlosRoca13| image:: https://github.com/CarlosRoca13.png?size=40px + :target: https://github.com/CarlosRoca13 + :alt: CarlosRoca13 +.. |maintainer-rafaelbn| image:: https://github.com/rafaelbn.png?size=40px + :target: https://github.com/rafaelbn + :alt: rafaelbn +.. |maintainer-sergio-teruel| image:: https://github.com/sergio-teruel.png?size=40px + :target: https://github.com/sergio-teruel + :alt: sergio-teruel +.. |maintainer-yajo| image:: https://github.com/yajo.png?size=40px + :target: https://github.com/yajo + :alt: yajo + +Current `maintainers `__: + +|maintainer-CarlosRoca13| |maintainer-rafaelbn| |maintainer-sergio-teruel| |maintainer-yajo| + +This module is part of the `OCA/sale-workflow `_ project on GitHub. + +You are welcome to contribute. To learn how please visit https://odoo-community.org/page/Contribute. diff --git a/sale_elaboration/__init__.py b/sale_elaboration/__init__.py new file mode 100644 index 00000000000..71dfb72843b --- /dev/null +++ b/sale_elaboration/__init__.py @@ -0,0 +1,3 @@ +# License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl). +from . import models +from .hooks import pre_init_hook diff --git a/sale_elaboration/__manifest__.py b/sale_elaboration/__manifest__.py new file mode 100644 index 00000000000..c1a3c722a34 --- /dev/null +++ b/sale_elaboration/__manifest__.py @@ -0,0 +1,33 @@ +# Copyright 2018 Tecnativa - Sergio Teruel +# License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl). +{ + "name": "Sale Elaboration", + "summary": "Set an elaboration for any sale line", + "version": "17.0.1.0.0", + "development_status": "Production/Stable", + "category": "Sale", + "website": "https://github.com/OCA/sale-workflow", + "author": "Tecnativa, Odoo Community Association (OCA)", + "license": "AGPL-3", + "application": False, + "installable": True, + "depends": ["sale_stock"], + "data": [ + "security/ir.model.access.csv", + "security/security.xml", + "views/product_views.xml", + "views/res_config_settings_views.xml", + "views/sale_elaboration_profile_views.xml", + "views/sale_elaboration_views.xml", + "views/sale_order_views.xml", + "views/sale_elaboration_report_views.xml", + "views/stock_move_line_views.xml", + "views/stock_picking_views.xml", + "views/stock_move_views.xml", + "reports/report_base.xml", + "reports/report_deliveryslip.xml", + "reports/report_picking_operations.xml", + ], + "pre_init_hook": "pre_init_hook", + "maintainers": ["CarlosRoca13", "rafaelbn", "sergio-teruel", "yajo"], +} diff --git a/sale_elaboration/hooks.py b/sale_elaboration/hooks.py new file mode 100644 index 00000000000..afa90412e21 --- /dev/null +++ b/sale_elaboration/hooks.py @@ -0,0 +1,17 @@ +# Copyright 2022 Tecnativa - Sergio Teruel +# License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl). + + +def pre_init_hook(env): + """Create computed columns if not exists when the module is instelled""" + env.cr.execute( + """ + ALTER TABLE sale_order_line + ADD COLUMN IF NOT EXISTS is_elaboration BOOLEAN; + """ + ) + env.cr.execute( + """ + ALTER TABLE sale_order_line ADD COLUMN IF NOT EXISTS elaboration_note VARCHAR; + """ + ) diff --git a/sale_elaboration/i18n/de.po b/sale_elaboration/i18n/de.po new file mode 100644 index 00000000000..981dcf52582 --- /dev/null +++ b/sale_elaboration/i18n/de.po @@ -0,0 +1,340 @@ +# Translation of Odoo Server. +# This file contains the translation of the following modules: +# * sale_elaboration +# +msgid "" +msgstr "" +"Project-Id-Version: Odoo Server 11.0\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2022-04-27 10:18+0000\n" +"PO-Revision-Date: 2022-04-27 12:19+0200\n" +"Last-Translator: Maria Sparenberg \n" +"Language-Team: none\n" +"Language: de\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Plural-Forms: nplurals=2; plural=n != 1;\n" +"X-Generator: Poedit 2.3\n" + +#. module: sale_elaboration +#: model:ir.model.fields,field_description:sale_elaboration.field_product_elaboration__active +#: model:ir.model.fields,field_description:sale_elaboration.field_product_elaboration_profile__active +msgid "Active" +msgstr "" + +#. module: sale_elaboration +#: model_terms:ir.ui.view,arch_db:sale_elaboration.view_sales_order_line_filter +msgid "After Date" +msgstr "" + +#. module: sale_elaboration +#: model_terms:ir.ui.view,arch_db:sale_elaboration.elaboration_view_form +#: model_terms:ir.ui.view,arch_db:sale_elaboration.elaboration_view_search +#: model_terms:ir.ui.view,arch_db:sale_elaboration.product_elaboration_profile_form_view +msgid "Archived" +msgstr "" + +#. module: sale_elaboration +#: model:ir.model.constraint,message:sale_elaboration.constraint_product_elaboration_code_uniq +msgid "Code must be unique!" +msgstr "" + +#. module: sale_elaboration +#: model:ir.model,name:sale_elaboration.model_res_config_settings +msgid "Config Settings" +msgstr "" + +#. module: sale_elaboration +#: model:ir.model.fields,field_description:sale_elaboration.field_product_elaboration__create_uid +#: model:ir.model.fields,field_description:sale_elaboration.field_product_elaboration_profile__create_uid +msgid "Created by" +msgstr "Erstellt von" + +#. module: sale_elaboration +#: model:ir.model.fields,field_description:sale_elaboration.field_product_elaboration__create_date +#: model:ir.model.fields,field_description:sale_elaboration.field_product_elaboration_profile__create_date +msgid "Created on" +msgstr "Erstellt am" + +#. module: sale_elaboration +#: model:ir.model.fields,help:sale_elaboration.field_sale_order_line__date_order +msgid "" +"Creation date of draft/sent orders,\n" +"Confirmation date of confirmed orders." +msgstr "" + +#. module: sale_elaboration +#: model:ir.model.fields,field_description:sale_elaboration.field_sale_order_line__date_order +msgid "Date" +msgstr "" + +#. module: sale_elaboration +#: model:ir.model.fields,field_description:sale_elaboration.field_res_config_settings__group_elaboration_note_on_delivery_slip +msgid "Display Elaboration notes on Delivery Slips" +msgstr "" + +#. module: sale_elaboration +#: model:ir.model.fields,field_description:sale_elaboration.field_res_config_settings__group_elaboration_note_on_picking_operations +msgid "Display Elaboration notes on Picking Operations" +msgstr "" + +#. module: sale_elaboration +#: model:ir.model.fields,field_description:sale_elaboration.field_product_elaboration__display_name +#: model:ir.model.fields,field_description:sale_elaboration.field_product_elaboration_profile__display_name +msgid "Display Name" +msgstr "Anzeigename" + +#. module: sale_elaboration +#: model:ir.model.fields,help:sale_elaboration.field_sale_order_line__is_prepared +msgid "Dummy field to be able to find prepared lines" +msgstr "" + +#. module: sale_elaboration +#: model:ir.model.fields,field_description:sale_elaboration.field_sale_order_line__elaboration_price_unit +msgid "Elab. Price" +msgstr "" + +#. module: sale_elaboration +#: model_terms:ir.ui.view,arch_db:sale_elaboration.elaboration_view_search +#: model_terms:ir.ui.view,arch_db:sale_elaboration.view_sales_order_line_filter +msgid "Elaboration" +msgstr "" + +#. module: sale_elaboration +#: model:ir.model.fields,field_description:sale_elaboration.field_product_elaboration_mixin__elaboration_note +#: model:ir.model.fields,field_description:sale_elaboration.field_sale_order_line__elaboration_note +#: model:ir.model.fields,field_description:sale_elaboration.field_stock_move__elaboration_note +#: model:ir.model.fields,field_description:sale_elaboration.field_stock_move_line__elaboration_note +msgid "Elaboration Note" +msgstr "" + +#. module: sale_elaboration +#: model:ir.model.fields,field_description:sale_elaboration.field_product_product__elaboration_profile_id +#: model:ir.model.fields,field_description:sale_elaboration.field_product_template__elaboration_profile_id +#: model:ir.model.fields,field_description:sale_elaboration.field_sale_order_line__elaboration_profile_id +msgid "Elaboration Profile" +msgstr "" + +#. module: sale_elaboration +#: model_terms:ir.ui.view,arch_db:sale_elaboration.res_config_settings_view +msgid "Elaboration notes will appear on the delivery slip" +msgstr "" + +#. module: sale_elaboration +#: model_terms:ir.ui.view,arch_db:sale_elaboration.res_config_settings_view +msgid "Elaboration notes will appear on the picking operations report" +msgstr "" + +#. module: sale_elaboration +#: model_terms:ir.ui.view,arch_db:sale_elaboration.view_order_form +msgid "Elaboration price:" +msgstr "" + +#. module: sale_elaboration +#: model:ir.model.fields,field_description:sale_elaboration.field_product_elaboration_mixin__elaboration_ids +#: model:ir.model.fields,field_description:sale_elaboration.field_product_elaboration_profile__elaboration_ids +#: model:ir.model.fields,field_description:sale_elaboration.field_sale_order_line__elaboration_ids +#: model:ir.model.fields,field_description:sale_elaboration.field_stock_move__elaboration_ids +#: model:ir.model.fields,field_description:sale_elaboration.field_stock_move_line__elaboration_ids +#: model:ir.ui.menu,name:sale_elaboration.menu_sale_elaboration_root +#: model_terms:ir.ui.view,arch_db:sale_elaboration.elaboration_view_form +#: model_terms:ir.ui.view,arch_db:sale_elaboration.product_elaboration_profile_form_view +#: model_terms:ir.ui.view,arch_db:sale_elaboration.product_template_form_view +#: model_terms:ir.ui.view,arch_db:sale_elaboration.view_order_form +msgid "Elaborations" +msgstr "" + +#. module: sale_elaboration +#: model_terms:ir.ui.view,arch_db:sale_elaboration.elaboration_view_search +msgid "Elaborations Search" +msgstr "" + +#. module: sale_elaboration +#: model_terms:ir.ui.view,arch_db:sale_elaboration.elaboration_view_search +msgid "Group By" +msgstr "" + +#. module: sale_elaboration +#: model:ir.model.fields,field_description:sale_elaboration.field_product_elaboration__id +#: model:ir.model.fields,field_description:sale_elaboration.field_product_elaboration_profile__id +msgid "ID" +msgstr "ID" + +#. module: sale_elaboration +#: model:ir.model.fields,help:sale_elaboration.field_product_elaboration__active +msgid "" +"If unchecked, it will allow you to hide the product elaborations without " +"removing it." +msgstr "" + +#. module: sale_elaboration +#: model:res.groups,name:sale_elaboration.group_elaboration_note_on_delivery_slip +msgid "Include elaboration notes on delivery slip" +msgstr "" + +#. module: sale_elaboration +#: model:res.groups,name:sale_elaboration.group_elaboration_note_on_picking_operations +msgid "Include elaboration notes on picking operations" +msgstr "" + +#. module: sale_elaboration +#: model:ir.model.fields,field_description:sale_elaboration.field_product_elaboration_mixin__is_elaboration +#: model:ir.model.fields,field_description:sale_elaboration.field_product_product__is_elaboration +#: model:ir.model.fields,field_description:sale_elaboration.field_product_template__is_elaboration +#: model:ir.model.fields,field_description:sale_elaboration.field_sale_order_line__is_elaboration +#: model:ir.model.fields,field_description:sale_elaboration.field_stock_move__is_elaboration +#: model_terms:ir.ui.view,arch_db:sale_elaboration.view_sales_order_line_filter +msgid "Is Elaboration" +msgstr "" + +#. module: sale_elaboration +#: model_terms:ir.ui.view,arch_db:sale_elaboration.view_sales_order_line_filter +msgid "Is Not Prepared" +msgstr "" + +#. module: sale_elaboration +#: model:ir.model.fields,field_description:sale_elaboration.field_sale_order_line__is_prepared +#: model_terms:ir.ui.view,arch_db:sale_elaboration.view_sales_order_line_filter +msgid "Is Prepared" +msgstr "" + +#. module: sale_elaboration +#: model:ir.model.fields,field_description:sale_elaboration.field_product_elaboration____last_update +#: model:ir.model.fields,field_description:sale_elaboration.field_product_elaboration_profile____last_update +msgid "Last Modified on" +msgstr "Zuletzt geändert am" + +#. module: sale_elaboration +#: model:ir.model.fields,field_description:sale_elaboration.field_product_elaboration__write_uid +#: model:ir.model.fields,field_description:sale_elaboration.field_product_elaboration_profile__write_uid +msgid "Last Updated by" +msgstr "Zuletzt aktualisiert von" + +#. module: sale_elaboration +#: model:ir.model.fields,field_description:sale_elaboration.field_product_elaboration__write_date +#: model:ir.model.fields,field_description:sale_elaboration.field_product_elaboration_profile__write_date +msgid "Last Updated on" +msgstr "Zuletzt aktualisiert am" + +#. module: sale_elaboration +#: model:ir.model.fields,field_description:sale_elaboration.field_product_elaboration__name +#: model:ir.model.fields,field_description:sale_elaboration.field_product_elaboration_profile__name +msgid "Name" +msgstr "Bezeichnung" + +#. module: sale_elaboration +#: model:ir.model.constraint,message:sale_elaboration.constraint_product_elaboration_name_uniq +msgid "Name must be unique!" +msgstr "" + +#. module: sale_elaboration +#: model:ir.model,name:sale_elaboration.model_product_template +#: model:ir.model.fields,field_description:sale_elaboration.field_product_elaboration__product_id +#: model_terms:ir.ui.view,arch_db:sale_elaboration.elaboration_view_search +msgid "Product" +msgstr "Produkt" + +#. module: sale_elaboration +#: model:ir.model,name:sale_elaboration.model_product_elaboration_mixin +msgid "Product Elaboration Mixin" +msgstr "" + +#. module: sale_elaboration +#: model:ir.model,name:sale_elaboration.model_stock_move_line +msgid "Product Moves (Stock Move Line)" +msgstr "" + +#. module: sale_elaboration +#: model:ir.model,name:sale_elaboration.model_product_product +msgid "Product Variant" +msgstr "" + +#. module: sale_elaboration +#: model:ir.model,name:sale_elaboration.model_product_elaboration_profile +msgid "Product elaboration profiles" +msgstr "" + +#. module: sale_elaboration +#: model:ir.model,name:sale_elaboration.model_product_elaboration +#, fuzzy +msgid "Product elaborations" +msgstr "Produktvorlage" + +#. module: sale_elaboration +#: model:ir.model.fields,field_description:sale_elaboration.field_product_elaboration__profile_ids +msgid "Profile" +msgstr "" + +#. module: sale_elaboration +#: model:ir.model.fields,field_description:sale_elaboration.field_sale_order_line__route_id +msgid "Route" +msgstr "" + +#. module: sale_elaboration +#: model:ir.model.fields,field_description:sale_elaboration.field_product_elaboration__route_ids +msgid "Routes" +msgstr "" + +#. module: sale_elaboration +#: model:ir.actions.act_window,name:sale_elaboration.sale_elaboration_action +#: model:ir.ui.menu,name:sale_elaboration.menu_sale_elaboration +msgid "Sale Elaboration" +msgstr "" + +#. module: sale_elaboration +#: model:ir.actions.act_window,name:sale_elaboration.sale_elaboration_profile_action +#: model:ir.ui.menu,name:sale_elaboration.menu_sale_elaboration_profile +msgid "Sale Elaboration Profiles" +msgstr "" + +#. module: sale_elaboration +#: model:ir.actions.act_window,name:sale_elaboration.sale_elaboration_report_action +#: model:ir.ui.menu,name:sale_elaboration.menu_sale_elaboration_report +#: model:ir.ui.menu,name:sale_elaboration.menu_stock_sale_elaboration_report +msgid "Sale Elaboration Report" +msgstr "" + +#. module: sale_elaboration +#: model:ir.model,name:sale_elaboration.model_sale_order +msgid "Sales Order" +msgstr "" + +#. module: sale_elaboration +#: model:ir.model,name:sale_elaboration.model_sale_order_line +msgid "Sales Order Line" +msgstr "" + +#. module: sale_elaboration +#: model:ir.model.fields,field_description:sale_elaboration.field_product_elaboration__code +#: model:ir.model.fields,field_description:sale_elaboration.field_product_elaboration_profile__code +msgid "Short Code" +msgstr "" + +#. module: sale_elaboration +#: model:ir.model,name:sale_elaboration.model_stock_move +msgid "Stock Move" +msgstr "" + +#. module: sale_elaboration +#: model:ir.model,name:sale_elaboration.model_stock_rule +msgid "Stock Rule" +msgstr "" + +#. module: sale_elaboration +#: model:ir.model,name:sale_elaboration.model_stock_picking +msgid "Transfer" +msgstr "" + +#. module: sale_elaboration +#. odoo-python +#: code:addons/sale_elaboration/models/sale_order.py:0 +#, python-format +msgid "Unsupported operator %s for searching on is_prepared" +msgstr "" + +#~ msgid "Product Template" +#~ msgstr "Produktvorlage" + +#~ msgid "Quotation" +#~ msgstr "Angebot" diff --git a/sale_elaboration/i18n/es.po b/sale_elaboration/i18n/es.po new file mode 100644 index 00000000000..9d6606dab3a --- /dev/null +++ b/sale_elaboration/i18n/es.po @@ -0,0 +1,345 @@ +# Translation of Odoo Server. +# This file contains the translation of the following modules: +# * sale_elaboration +# +msgid "" +msgstr "" +"Project-Id-Version: Odoo Server 11.0\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2024-06-14 06:02+0000\n" +"PO-Revision-Date: 2024-06-14 08:05+0200\n" +"Last-Translator: Gelojr \n" +"Language-Team: \n" +"Language: es\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Plural-Forms: nplurals=2; plural=n != 1;\n" +"X-Generator: Poedit 3.0.1\n" + +#. module: sale_elaboration +#: model:ir.model.fields,field_description:sale_elaboration.field_product_elaboration__active +#: model:ir.model.fields,field_description:sale_elaboration.field_product_elaboration_profile__active +msgid "Active" +msgstr "Activo" + +#. module: sale_elaboration +#: model_terms:ir.ui.view,arch_db:sale_elaboration.view_sales_order_line_filter +msgid "After Date" +msgstr "Después de" + +#. module: sale_elaboration +#: model_terms:ir.ui.view,arch_db:sale_elaboration.elaboration_view_form +#: model_terms:ir.ui.view,arch_db:sale_elaboration.elaboration_view_search +#: model_terms:ir.ui.view,arch_db:sale_elaboration.product_elaboration_profile_form_view +msgid "Archived" +msgstr "Archivado" + +#. module: sale_elaboration +#: model:ir.model.constraint,message:sale_elaboration.constraint_product_elaboration_code_uniq +msgid "Code must be unique!" +msgstr "El código debe ser único!" + +#. module: sale_elaboration +#: model:ir.model,name:sale_elaboration.model_res_config_settings +msgid "Config Settings" +msgstr "Ajustes de configuración" + +#. module: sale_elaboration +#: model:ir.model.fields,field_description:sale_elaboration.field_product_elaboration__create_uid +#: model:ir.model.fields,field_description:sale_elaboration.field_product_elaboration_profile__create_uid +msgid "Created by" +msgstr "Creado por" + +#. module: sale_elaboration +#: model:ir.model.fields,field_description:sale_elaboration.field_product_elaboration__create_date +#: model:ir.model.fields,field_description:sale_elaboration.field_product_elaboration_profile__create_date +msgid "Created on" +msgstr "Creado el" + +#. module: sale_elaboration +#: model:ir.model.fields,help:sale_elaboration.field_sale_order_line__date_order +msgid "" +"Creation date of draft/sent orders,\n" +"Confirmation date of confirmed orders." +msgstr "" +"Fecha de creación de las órdenes giradas/enviadas,\n" +"Fecha de confirmación de las órdenes confirmadas." + +#. module: sale_elaboration +#: model:ir.model.fields,field_description:sale_elaboration.field_sale_order_line__date_order +msgid "Date" +msgstr "Fecha" + +#. module: sale_elaboration +#: model:ir.model.fields,field_description:sale_elaboration.field_res_config_settings__group_elaboration_note_on_delivery_slip +msgid "Display Elaboration notes on Delivery Slips" +msgstr "Mostrar notas de elaboración en los albaranes" + +#. module: sale_elaboration +#: model:ir.model.fields,field_description:sale_elaboration.field_res_config_settings__group_elaboration_note_on_picking_operations +msgid "Display Elaboration notes on Picking Operations" +msgstr "Mostrar notas de elaboración en Operaciones de picking" + +#. module: sale_elaboration +#: model:ir.model.fields,field_description:sale_elaboration.field_product_elaboration__display_name +#: model:ir.model.fields,field_description:sale_elaboration.field_product_elaboration_profile__display_name +msgid "Display Name" +msgstr "Nombre a mostrar" + +#. module: sale_elaboration +#: model:ir.model.fields,help:sale_elaboration.field_sale_order_line__is_prepared +msgid "Dummy field to be able to find prepared lines" +msgstr "Campo ficticio para poder encontrar líneas preparadas" + +#. module: sale_elaboration +#: model:ir.model.fields,field_description:sale_elaboration.field_sale_order_line__elaboration_price_unit +msgid "Elab. Price" +msgstr "Precio elab" + +#. module: sale_elaboration +#: model_terms:ir.ui.view,arch_db:sale_elaboration.elaboration_view_search +#: model_terms:ir.ui.view,arch_db:sale_elaboration.view_sales_order_line_filter +msgid "Elaboration" +msgstr "Elaboración" + +#. module: sale_elaboration +#: model:ir.model.fields,field_description:sale_elaboration.field_product_elaboration_mixin__elaboration_note +#: model:ir.model.fields,field_description:sale_elaboration.field_sale_order_line__elaboration_note +#: model:ir.model.fields,field_description:sale_elaboration.field_stock_move__elaboration_note +#: model:ir.model.fields,field_description:sale_elaboration.field_stock_move_line__elaboration_note +msgid "Elaboration Note" +msgstr "Nota de elaboración" + +#. module: sale_elaboration +#: model:ir.model.fields,field_description:sale_elaboration.field_product_product__elaboration_profile_id +#: model:ir.model.fields,field_description:sale_elaboration.field_product_template__elaboration_profile_id +#: model:ir.model.fields,field_description:sale_elaboration.field_sale_order_line__elaboration_profile_id +msgid "Elaboration Profile" +msgstr "Perfil de elaboración" + +#. module: sale_elaboration +#: model_terms:ir.ui.view,arch_db:sale_elaboration.res_config_settings_view +msgid "Elaboration notes will appear on the delivery slip" +msgstr "Las notas de elaboración aparecerán en los albaranes" + +#. module: sale_elaboration +#: model_terms:ir.ui.view,arch_db:sale_elaboration.res_config_settings_view +msgid "Elaboration notes will appear on the picking operations report" +msgstr "" +"Las notas de elaboración aparecerán en el informe de operaciones de picking" + +#. module: sale_elaboration +#: model_terms:ir.ui.view,arch_db:sale_elaboration.view_order_form +msgid "Elaboration price:" +msgstr "Precio de elaboración:" + +#. module: sale_elaboration +#: model:ir.model.fields,field_description:sale_elaboration.field_product_elaboration_mixin__elaboration_ids +#: model:ir.model.fields,field_description:sale_elaboration.field_product_elaboration_profile__elaboration_ids +#: model:ir.model.fields,field_description:sale_elaboration.field_sale_order_line__elaboration_ids +#: model:ir.model.fields,field_description:sale_elaboration.field_stock_move__elaboration_ids +#: model:ir.model.fields,field_description:sale_elaboration.field_stock_move_line__elaboration_ids +#: model:ir.ui.menu,name:sale_elaboration.menu_sale_elaboration_root +#: model_terms:ir.ui.view,arch_db:sale_elaboration.elaboration_view_form +#: model_terms:ir.ui.view,arch_db:sale_elaboration.product_elaboration_profile_form_view +#: model_terms:ir.ui.view,arch_db:sale_elaboration.product_template_form_view +#: model_terms:ir.ui.view,arch_db:sale_elaboration.view_order_form +msgid "Elaborations" +msgstr "Elaboraciones" + +#. module: sale_elaboration +#: model_terms:ir.ui.view,arch_db:sale_elaboration.elaboration_view_search +msgid "Elaborations Search" +msgstr "Búsqueda de elaboraciones" + +#. module: sale_elaboration +#: model_terms:ir.ui.view,arch_db:sale_elaboration.elaboration_view_search +msgid "Group By" +msgstr "Agrupado por" + +#. module: sale_elaboration +#: model:ir.model.fields,field_description:sale_elaboration.field_product_elaboration__id +#: model:ir.model.fields,field_description:sale_elaboration.field_product_elaboration_profile__id +msgid "ID" +msgstr "ID (identificación)" + +#. module: sale_elaboration +#: model:ir.model.fields,help:sale_elaboration.field_product_elaboration__active +msgid "" +"If unchecked, it will allow you to hide the product elaborations without " +"removing it." +msgstr "Si no está marcado, permitirá ocultar la elaboración sin eliminarla." + +#. module: sale_elaboration +#: model:res.groups,name:sale_elaboration.group_elaboration_note_on_delivery_slip +msgid "Include elaboration notes on delivery slip" +msgstr "Incluir notas de elaboración en los albaranes" + +#. module: sale_elaboration +#: model:res.groups,name:sale_elaboration.group_elaboration_note_on_picking_operations +msgid "Include elaboration notes on picking operations" +msgstr "Incluir notas de elaboración en las operaciones de picking" + +#. module: sale_elaboration +#: model:ir.model.fields,field_description:sale_elaboration.field_product_elaboration_mixin__is_elaboration +#: model:ir.model.fields,field_description:sale_elaboration.field_product_product__is_elaboration +#: model:ir.model.fields,field_description:sale_elaboration.field_product_template__is_elaboration +#: model:ir.model.fields,field_description:sale_elaboration.field_sale_order_line__is_elaboration +#: model:ir.model.fields,field_description:sale_elaboration.field_stock_move__is_elaboration +#: model_terms:ir.ui.view,arch_db:sale_elaboration.view_sales_order_line_filter +msgid "Is Elaboration" +msgstr "Es elaboración" + +#. module: sale_elaboration +#: model_terms:ir.ui.view,arch_db:sale_elaboration.view_sales_order_line_filter +msgid "Is Not Prepared" +msgstr "No está preparado" + +#. module: sale_elaboration +#: model:ir.model.fields,field_description:sale_elaboration.field_sale_order_line__is_prepared +#: model_terms:ir.ui.view,arch_db:sale_elaboration.view_sales_order_line_filter +msgid "Is Prepared" +msgstr "Está preparado" + +#. module: sale_elaboration +#: model:ir.model.fields,field_description:sale_elaboration.field_product_elaboration____last_update +#: model:ir.model.fields,field_description:sale_elaboration.field_product_elaboration_profile____last_update +msgid "Last Modified on" +msgstr "Última modificación el" + +#. module: sale_elaboration +#: model:ir.model.fields,field_description:sale_elaboration.field_product_elaboration__write_uid +#: model:ir.model.fields,field_description:sale_elaboration.field_product_elaboration_profile__write_uid +msgid "Last Updated by" +msgstr "Última modificación por" + +#. module: sale_elaboration +#: model:ir.model.fields,field_description:sale_elaboration.field_product_elaboration__write_date +#: model:ir.model.fields,field_description:sale_elaboration.field_product_elaboration_profile__write_date +msgid "Last Updated on" +msgstr "Última actualización el" + +#. module: sale_elaboration +#: model:ir.model.fields,field_description:sale_elaboration.field_product_elaboration__name +#: model:ir.model.fields,field_description:sale_elaboration.field_product_elaboration_profile__name +msgid "Name" +msgstr "Nombre" + +#. module: sale_elaboration +#: model:ir.model.constraint,message:sale_elaboration.constraint_product_elaboration_name_uniq +msgid "Name must be unique!" +msgstr "¡El nombre debe ser único!" + +#. module: sale_elaboration +#: model:ir.model,name:sale_elaboration.model_product_template +#: model:ir.model.fields,field_description:sale_elaboration.field_product_elaboration__product_id +#: model_terms:ir.ui.view,arch_db:sale_elaboration.elaboration_view_search +msgid "Product" +msgstr "Producto" + +#. module: sale_elaboration +#: model:ir.model,name:sale_elaboration.model_product_elaboration_mixin +msgid "Product Elaboration Mixin" +msgstr "Elaboraciones de productos (Mixin)" + +#. module: sale_elaboration +#: model:ir.model,name:sale_elaboration.model_stock_move_line +msgid "Product Moves (Stock Move Line)" +msgstr "Movimientos de Producto (Stock Move Line)" + +#. module: sale_elaboration +#: model:ir.model,name:sale_elaboration.model_product_product +msgid "Product Variant" +msgstr "Variante de Producto" + +#. module: sale_elaboration +#: model:ir.model,name:sale_elaboration.model_product_elaboration_profile +msgid "Product elaboration profiles" +msgstr "Perfiles de elaboración" + +#. module: sale_elaboration +#: model:ir.model,name:sale_elaboration.model_product_elaboration +msgid "Product elaborations" +msgstr "Elaboraciones de productos" + +#. module: sale_elaboration +#: model:ir.model.fields,field_description:sale_elaboration.field_product_elaboration__profile_ids +msgid "Profile" +msgstr "Perfil" + +#. module: sale_elaboration +#: model:ir.model.fields,field_description:sale_elaboration.field_sale_order_line__route_id +msgid "Route" +msgstr "Ruta preferida" + +#. module: sale_elaboration +#: model:ir.model.fields,field_description:sale_elaboration.field_product_elaboration__route_ids +msgid "Routes" +msgstr "Rutas preferidas" + +#. module: sale_elaboration +#: model:ir.actions.act_window,name:sale_elaboration.sale_elaboration_action +#: model:ir.ui.menu,name:sale_elaboration.menu_sale_elaboration +msgid "Sale Elaboration" +msgstr "Elaboraciones de venta" + +#. module: sale_elaboration +#: model:ir.actions.act_window,name:sale_elaboration.sale_elaboration_profile_action +#: model:ir.ui.menu,name:sale_elaboration.menu_sale_elaboration_profile +msgid "Sale Elaboration Profiles" +msgstr "Perfiles de elaboraciones" + +#. module: sale_elaboration +#: model:ir.actions.act_window,name:sale_elaboration.sale_elaboration_report_action +#: model:ir.ui.menu,name:sale_elaboration.menu_sale_elaboration_report +#: model:ir.ui.menu,name:sale_elaboration.menu_stock_sale_elaboration_report +msgid "Sale Elaboration Report" +msgstr "Informe de elaboraciones" + +#. module: sale_elaboration +#: model:ir.model,name:sale_elaboration.model_sale_order +msgid "Sales Order" +msgstr "Pedido de venta" + +#. module: sale_elaboration +#: model:ir.model,name:sale_elaboration.model_sale_order_line +msgid "Sales Order Line" +msgstr "Líneas de pedido" + +#. module: sale_elaboration +#: model:ir.model.fields,field_description:sale_elaboration.field_product_elaboration__code +#: model:ir.model.fields,field_description:sale_elaboration.field_product_elaboration_profile__code +msgid "Short Code" +msgstr "Nombre corto" + +#. module: sale_elaboration +#: model:ir.model,name:sale_elaboration.model_stock_move +msgid "Stock Move" +msgstr "Movimiento de Stock" + +#. module: sale_elaboration +#: model:ir.model,name:sale_elaboration.model_stock_rule +msgid "Stock Rule" +msgstr "Regla de Inventario" + +#. module: sale_elaboration +#: model:ir.model,name:sale_elaboration.model_stock_picking +msgid "Transfer" +msgstr "Albarán" + +#. module: sale_elaboration +#. odoo-python +#: code:addons/sale_elaboration/models/sale_order.py:0 +#, python-format +msgid "Unsupported operator %s for searching on is_prepared" +msgstr "Operador %s no soportado para buscar en is_prepared" + +#~ msgid "Elab." +#~ msgstr "elab." + +#~ msgid "Elaboration" +#~ msgstr "Elaboración" + +#~ msgid "Product Template" +#~ msgstr "Plantilla de producto" diff --git a/sale_elaboration/i18n/it.po b/sale_elaboration/i18n/it.po new file mode 100644 index 00000000000..04650248032 --- /dev/null +++ b/sale_elaboration/i18n/it.po @@ -0,0 +1,344 @@ +# Translation of Odoo Server. +# This file contains the translation of the following modules: +# * sale_elaboration +# +msgid "" +msgstr "" +"Project-Id-Version: Odoo Server 16.0\n" +"Report-Msgid-Bugs-To: \n" +"PO-Revision-Date: 2024-06-14 17:42+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: sale_elaboration +#: model:ir.model.fields,field_description:sale_elaboration.field_product_elaboration__active +#: model:ir.model.fields,field_description:sale_elaboration.field_product_elaboration_profile__active +msgid "Active" +msgstr "Attivo" + +#. module: sale_elaboration +#: model_terms:ir.ui.view,arch_db:sale_elaboration.view_sales_order_line_filter +msgid "After Date" +msgstr "Dopo la data" + +#. module: sale_elaboration +#: model_terms:ir.ui.view,arch_db:sale_elaboration.elaboration_view_form +#: model_terms:ir.ui.view,arch_db:sale_elaboration.elaboration_view_search +#: model_terms:ir.ui.view,arch_db:sale_elaboration.product_elaboration_profile_form_view +msgid "Archived" +msgstr "In archivio" + +#. module: sale_elaboration +#: model:ir.model.constraint,message:sale_elaboration.constraint_product_elaboration_code_uniq +msgid "Code must be unique!" +msgstr "Il codice deve essere univoco!" + +#. module: sale_elaboration +#: model:ir.model,name:sale_elaboration.model_res_config_settings +msgid "Config Settings" +msgstr "Impostazioni configurazione" + +#. module: sale_elaboration +#: model:ir.model.fields,field_description:sale_elaboration.field_product_elaboration__create_uid +#: model:ir.model.fields,field_description:sale_elaboration.field_product_elaboration_profile__create_uid +msgid "Created by" +msgstr "Creato da" + +#. module: sale_elaboration +#: model:ir.model.fields,field_description:sale_elaboration.field_product_elaboration__create_date +#: model:ir.model.fields,field_description:sale_elaboration.field_product_elaboration_profile__create_date +msgid "Created on" +msgstr "Creato il" + +#. module: sale_elaboration +#: model:ir.model.fields,help:sale_elaboration.field_sale_order_line__date_order +msgid "" +"Creation date of draft/sent orders,\n" +"Confirmation date of confirmed orders." +msgstr "" +"Data di creazione degli ordini in bozza/spediti,\n" +"data di conferma degli ordini confermati." + +#. module: sale_elaboration +#: model:ir.model.fields,field_description:sale_elaboration.field_sale_order_line__date_order +msgid "Date" +msgstr "Data" + +#. module: sale_elaboration +#: model:ir.model.fields,field_description:sale_elaboration.field_res_config_settings__group_elaboration_note_on_delivery_slip +msgid "Display Elaboration notes on Delivery Slips" +msgstr "Visualizza note elaborazione sulle bolle di consegna" + +#. module: sale_elaboration +#: model:ir.model.fields,field_description:sale_elaboration.field_res_config_settings__group_elaboration_note_on_picking_operations +msgid "Display Elaboration notes on Picking Operations" +msgstr "Visualizza note elaborazione nell operazioni di prelievo" + +#. module: sale_elaboration +#: model:ir.model.fields,field_description:sale_elaboration.field_product_elaboration__display_name +#: model:ir.model.fields,field_description:sale_elaboration.field_product_elaboration_profile__display_name +msgid "Display Name" +msgstr "Nome visualizzato" + +#. module: sale_elaboration +#: model:ir.model.fields,help:sale_elaboration.field_sale_order_line__is_prepared +msgid "Dummy field to be able to find prepared lines" +msgstr "Campo di appoggio per poter trovare le righe preparate" + +#. module: sale_elaboration +#: model:ir.model.fields,field_description:sale_elaboration.field_sale_order_line__elaboration_price_unit +msgid "Elab. Price" +msgstr "Elab. prezzo" + +#. module: sale_elaboration +#: model_terms:ir.ui.view,arch_db:sale_elaboration.elaboration_view_search +#: model_terms:ir.ui.view,arch_db:sale_elaboration.view_sales_order_line_filter +msgid "Elaboration" +msgstr "Elaborazione" + +#. module: sale_elaboration +#: model:ir.model.fields,field_description:sale_elaboration.field_product_elaboration_mixin__elaboration_note +#: model:ir.model.fields,field_description:sale_elaboration.field_sale_order_line__elaboration_note +#: model:ir.model.fields,field_description:sale_elaboration.field_stock_move__elaboration_note +#: model:ir.model.fields,field_description:sale_elaboration.field_stock_move_line__elaboration_note +msgid "Elaboration Note" +msgstr "Nota elaborazione" + +#. module: sale_elaboration +#: model:ir.model.fields,field_description:sale_elaboration.field_product_product__elaboration_profile_id +#: model:ir.model.fields,field_description:sale_elaboration.field_product_template__elaboration_profile_id +#: model:ir.model.fields,field_description:sale_elaboration.field_sale_order_line__elaboration_profile_id +msgid "Elaboration Profile" +msgstr "Profilo elaborazione" + +#. module: sale_elaboration +#: model_terms:ir.ui.view,arch_db:sale_elaboration.res_config_settings_view +msgid "Elaboration notes will appear on the delivery slip" +msgstr "Le note di elaborazione verranno visualizzate nella bolla di consegna" + +#. module: sale_elaboration +#: model_terms:ir.ui.view,arch_db:sale_elaboration.res_config_settings_view +msgid "Elaboration notes will appear on the picking operations report" +msgstr "" +"Le note di elaborazione appariranno nel resoconto delle operazioni di " +"prelievo" + +#. module: sale_elaboration +#: model_terms:ir.ui.view,arch_db:sale_elaboration.view_order_form +msgid "Elaboration price:" +msgstr "Prezzo elaborazione:" + +#. module: sale_elaboration +#: model:ir.model.fields,field_description:sale_elaboration.field_product_elaboration_mixin__elaboration_ids +#: model:ir.model.fields,field_description:sale_elaboration.field_product_elaboration_profile__elaboration_ids +#: model:ir.model.fields,field_description:sale_elaboration.field_sale_order_line__elaboration_ids +#: model:ir.model.fields,field_description:sale_elaboration.field_stock_move__elaboration_ids +#: model:ir.model.fields,field_description:sale_elaboration.field_stock_move_line__elaboration_ids +#: model:ir.ui.menu,name:sale_elaboration.menu_sale_elaboration_root +#: model_terms:ir.ui.view,arch_db:sale_elaboration.elaboration_view_form +#: model_terms:ir.ui.view,arch_db:sale_elaboration.product_elaboration_profile_form_view +#: model_terms:ir.ui.view,arch_db:sale_elaboration.product_template_form_view +#: model_terms:ir.ui.view,arch_db:sale_elaboration.view_order_form +msgid "Elaborations" +msgstr "Elaborazioni" + +#. module: sale_elaboration +#: model_terms:ir.ui.view,arch_db:sale_elaboration.elaboration_view_search +msgid "Elaborations Search" +msgstr "Ricerca elaborazioni" + +#. module: sale_elaboration +#: model_terms:ir.ui.view,arch_db:sale_elaboration.elaboration_view_search +msgid "Group By" +msgstr "Raggruppa per" + +#. module: sale_elaboration +#: model:ir.model.fields,field_description:sale_elaboration.field_product_elaboration__id +#: model:ir.model.fields,field_description:sale_elaboration.field_product_elaboration_profile__id +msgid "ID" +msgstr "ID" + +#. module: sale_elaboration +#: model:ir.model.fields,help:sale_elaboration.field_product_elaboration__active +msgid "" +"If unchecked, it will allow you to hide the product elaborations without " +"removing it." +msgstr "" +"Se deselezionata, consente di nascondere le elaborazioni del prodotto senza " +"rimuoverlo." + +#. module: sale_elaboration +#: model:res.groups,name:sale_elaboration.group_elaboration_note_on_delivery_slip +msgid "Include elaboration notes on delivery slip" +msgstr "Include le note elaborazione nella bolla di consegna" + +#. module: sale_elaboration +#: model:res.groups,name:sale_elaboration.group_elaboration_note_on_picking_operations +msgid "Include elaboration notes on picking operations" +msgstr "Includi note elaborazione nell operazioni di prelievo" + +#. module: sale_elaboration +#: model:ir.model.fields,field_description:sale_elaboration.field_product_elaboration_mixin__is_elaboration +#: model:ir.model.fields,field_description:sale_elaboration.field_product_product__is_elaboration +#: model:ir.model.fields,field_description:sale_elaboration.field_product_template__is_elaboration +#: model:ir.model.fields,field_description:sale_elaboration.field_sale_order_line__is_elaboration +#: model:ir.model.fields,field_description:sale_elaboration.field_stock_move__is_elaboration +#: model_terms:ir.ui.view,arch_db:sale_elaboration.view_sales_order_line_filter +msgid "Is Elaboration" +msgstr "È elaborazione" + +#. module: sale_elaboration +#: model_terms:ir.ui.view,arch_db:sale_elaboration.view_sales_order_line_filter +msgid "Is Not Prepared" +msgstr "Non è preparata" + +#. module: sale_elaboration +#: model:ir.model.fields,field_description:sale_elaboration.field_sale_order_line__is_prepared +#: model_terms:ir.ui.view,arch_db:sale_elaboration.view_sales_order_line_filter +msgid "Is Prepared" +msgstr "È preparata" + +#. module: sale_elaboration +#: model:ir.model.fields,field_description:sale_elaboration.field_product_elaboration____last_update +#: model:ir.model.fields,field_description:sale_elaboration.field_product_elaboration_profile____last_update +msgid "Last Modified on" +msgstr "Ultima modifica il" + +#. module: sale_elaboration +#: model:ir.model.fields,field_description:sale_elaboration.field_product_elaboration__write_uid +#: model:ir.model.fields,field_description:sale_elaboration.field_product_elaboration_profile__write_uid +msgid "Last Updated by" +msgstr "Ultimo aggiornamento di" + +#. module: sale_elaboration +#: model:ir.model.fields,field_description:sale_elaboration.field_product_elaboration__write_date +#: model:ir.model.fields,field_description:sale_elaboration.field_product_elaboration_profile__write_date +msgid "Last Updated on" +msgstr "Ultimo aggiornamento il" + +#. module: sale_elaboration +#: model:ir.model.fields,field_description:sale_elaboration.field_product_elaboration__name +#: model:ir.model.fields,field_description:sale_elaboration.field_product_elaboration_profile__name +msgid "Name" +msgstr "Nome" + +#. module: sale_elaboration +#: model:ir.model.constraint,message:sale_elaboration.constraint_product_elaboration_name_uniq +msgid "Name must be unique!" +msgstr "Il nome deve essere univoco!" + +#. module: sale_elaboration +#: model:ir.model,name:sale_elaboration.model_product_template +#: model:ir.model.fields,field_description:sale_elaboration.field_product_elaboration__product_id +#: model_terms:ir.ui.view,arch_db:sale_elaboration.elaboration_view_search +msgid "Product" +msgstr "Prodotto" + +#. module: sale_elaboration +#: model:ir.model,name:sale_elaboration.model_product_elaboration_mixin +msgid "Product Elaboration Mixin" +msgstr "Mixin elaborazione prodotto" + +#. module: sale_elaboration +#: model:ir.model,name:sale_elaboration.model_stock_move_line +msgid "Product Moves (Stock Move Line)" +msgstr "Movimenti prodotto (riga movimento di magazzino)" + +#. module: sale_elaboration +#: model:ir.model,name:sale_elaboration.model_product_product +msgid "Product Variant" +msgstr "Variante prodotto" + +#. module: sale_elaboration +#: model:ir.model,name:sale_elaboration.model_product_elaboration_profile +msgid "Product elaboration profiles" +msgstr "Profili elaborazione prodotto" + +#. module: sale_elaboration +#: model:ir.model,name:sale_elaboration.model_product_elaboration +msgid "Product elaborations" +msgstr "Elaborazioni prodotto" + +#. module: sale_elaboration +#: model:ir.model.fields,field_description:sale_elaboration.field_product_elaboration__profile_ids +msgid "Profile" +msgstr "Profilo" + +#. module: sale_elaboration +#: model:ir.model.fields,field_description:sale_elaboration.field_sale_order_line__route_id +msgid "Route" +msgstr "Percorso" + +#. module: sale_elaboration +#: model:ir.model.fields,field_description:sale_elaboration.field_product_elaboration__route_ids +msgid "Routes" +msgstr "Percorsi" + +#. module: sale_elaboration +#: model:ir.actions.act_window,name:sale_elaboration.sale_elaboration_action +#: model:ir.ui.menu,name:sale_elaboration.menu_sale_elaboration +msgid "Sale Elaboration" +msgstr "Elaborazione vendita" + +#. module: sale_elaboration +#: model:ir.actions.act_window,name:sale_elaboration.sale_elaboration_profile_action +#: model:ir.ui.menu,name:sale_elaboration.menu_sale_elaboration_profile +msgid "Sale Elaboration Profiles" +msgstr "Profilo elaborazione vendita" + +#. module: sale_elaboration +#: model:ir.actions.act_window,name:sale_elaboration.sale_elaboration_report_action +#: model:ir.ui.menu,name:sale_elaboration.menu_sale_elaboration_report +#: model:ir.ui.menu,name:sale_elaboration.menu_stock_sale_elaboration_report +msgid "Sale Elaboration Report" +msgstr "Resoconto elaborazione vendita" + +#. module: sale_elaboration +#: model:ir.model,name:sale_elaboration.model_sale_order +msgid "Sales Order" +msgstr "Ordine di vendita" + +#. module: sale_elaboration +#: model:ir.model,name:sale_elaboration.model_sale_order_line +msgid "Sales Order Line" +msgstr "Riga ordine di vendita" + +#. module: sale_elaboration +#: model:ir.model.fields,field_description:sale_elaboration.field_product_elaboration__code +#: model:ir.model.fields,field_description:sale_elaboration.field_product_elaboration_profile__code +msgid "Short Code" +msgstr "Codice breve" + +#. module: sale_elaboration +#: model:ir.model,name:sale_elaboration.model_stock_move +msgid "Stock Move" +msgstr "Movimento di magazzino" + +#. module: sale_elaboration +#: model:ir.model,name:sale_elaboration.model_stock_rule +msgid "Stock Rule" +msgstr "Regola di giacenza" + +#. module: sale_elaboration +#: model:ir.model,name:sale_elaboration.model_stock_picking +msgid "Transfer" +msgstr "Trasferimento" + +#. module: sale_elaboration +#. odoo-python +#: code:addons/sale_elaboration/models/sale_order.py:0 +#, python-format +msgid "Unsupported operator %s for searching on is_prepared" +msgstr "Operatore %s non supportato per la ricerca in is_prepared" + +#~ msgid "Elab." +#~ msgstr "Elab." + +#~ msgid "Elaboration" +#~ msgstr "Elaborazione" diff --git a/sale_elaboration/i18n/sale_elaboration.pot b/sale_elaboration/i18n/sale_elaboration.pot new file mode 100644 index 00000000000..d4ada79e142 --- /dev/null +++ b/sale_elaboration/i18n/sale_elaboration.pot @@ -0,0 +1,329 @@ +# Translation of Odoo Server. +# This file contains the translation of the following modules: +# * sale_elaboration +# +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: sale_elaboration +#: model:ir.model.fields,field_description:sale_elaboration.field_product_elaboration__active +#: model:ir.model.fields,field_description:sale_elaboration.field_product_elaboration_profile__active +msgid "Active" +msgstr "" + +#. module: sale_elaboration +#: model_terms:ir.ui.view,arch_db:sale_elaboration.view_sales_order_line_filter +msgid "After Date" +msgstr "" + +#. module: sale_elaboration +#: model_terms:ir.ui.view,arch_db:sale_elaboration.elaboration_view_form +#: model_terms:ir.ui.view,arch_db:sale_elaboration.elaboration_view_search +#: model_terms:ir.ui.view,arch_db:sale_elaboration.product_elaboration_profile_form_view +msgid "Archived" +msgstr "" + +#. module: sale_elaboration +#: model:ir.model.constraint,message:sale_elaboration.constraint_product_elaboration_code_uniq +msgid "Code must be unique!" +msgstr "" + +#. module: sale_elaboration +#: model:ir.model,name:sale_elaboration.model_res_config_settings +msgid "Config Settings" +msgstr "" + +#. module: sale_elaboration +#: model:ir.model.fields,field_description:sale_elaboration.field_product_elaboration__create_uid +#: model:ir.model.fields,field_description:sale_elaboration.field_product_elaboration_profile__create_uid +msgid "Created by" +msgstr "" + +#. module: sale_elaboration +#: model:ir.model.fields,field_description:sale_elaboration.field_product_elaboration__create_date +#: model:ir.model.fields,field_description:sale_elaboration.field_product_elaboration_profile__create_date +msgid "Created on" +msgstr "" + +#. module: sale_elaboration +#: model:ir.model.fields,help:sale_elaboration.field_sale_order_line__date_order +msgid "" +"Creation date of draft/sent orders,\n" +"Confirmation date of confirmed orders." +msgstr "" + +#. module: sale_elaboration +#: model:ir.model.fields,field_description:sale_elaboration.field_sale_order_line__date_order +msgid "Date" +msgstr "" + +#. module: sale_elaboration +#: model:ir.model.fields,field_description:sale_elaboration.field_res_config_settings__group_elaboration_note_on_delivery_slip +msgid "Display Elaboration notes on Delivery Slips" +msgstr "" + +#. module: sale_elaboration +#: model:ir.model.fields,field_description:sale_elaboration.field_res_config_settings__group_elaboration_note_on_picking_operations +msgid "Display Elaboration notes on Picking Operations" +msgstr "" + +#. module: sale_elaboration +#: model:ir.model.fields,field_description:sale_elaboration.field_product_elaboration__display_name +#: model:ir.model.fields,field_description:sale_elaboration.field_product_elaboration_profile__display_name +msgid "Display Name" +msgstr "" + +#. module: sale_elaboration +#: model:ir.model.fields,help:sale_elaboration.field_sale_order_line__is_prepared +msgid "Dummy field to be able to find prepared lines" +msgstr "" + +#. module: sale_elaboration +#: model:ir.model.fields,field_description:sale_elaboration.field_sale_order_line__elaboration_price_unit +msgid "Elab. Price" +msgstr "" + +#. module: sale_elaboration +#: model_terms:ir.ui.view,arch_db:sale_elaboration.elaboration_view_search +#: model_terms:ir.ui.view,arch_db:sale_elaboration.view_sales_order_line_filter +msgid "Elaboration" +msgstr "" + +#. module: sale_elaboration +#: model:ir.model.fields,field_description:sale_elaboration.field_product_elaboration_mixin__elaboration_note +#: model:ir.model.fields,field_description:sale_elaboration.field_sale_order_line__elaboration_note +#: model:ir.model.fields,field_description:sale_elaboration.field_stock_move__elaboration_note +#: model:ir.model.fields,field_description:sale_elaboration.field_stock_move_line__elaboration_note +msgid "Elaboration Note" +msgstr "" + +#. module: sale_elaboration +#: model:ir.model.fields,field_description:sale_elaboration.field_product_product__elaboration_profile_id +#: model:ir.model.fields,field_description:sale_elaboration.field_product_template__elaboration_profile_id +#: model:ir.model.fields,field_description:sale_elaboration.field_sale_order_line__elaboration_profile_id +msgid "Elaboration Profile" +msgstr "" + +#. module: sale_elaboration +#: model_terms:ir.ui.view,arch_db:sale_elaboration.res_config_settings_view +msgid "Elaboration notes will appear on the delivery slip" +msgstr "" + +#. module: sale_elaboration +#: model_terms:ir.ui.view,arch_db:sale_elaboration.res_config_settings_view +msgid "Elaboration notes will appear on the picking operations report" +msgstr "" + +#. module: sale_elaboration +#: model_terms:ir.ui.view,arch_db:sale_elaboration.view_order_form +msgid "Elaboration price:" +msgstr "" + +#. module: sale_elaboration +#: model:ir.model.fields,field_description:sale_elaboration.field_product_elaboration_mixin__elaboration_ids +#: model:ir.model.fields,field_description:sale_elaboration.field_product_elaboration_profile__elaboration_ids +#: model:ir.model.fields,field_description:sale_elaboration.field_sale_order_line__elaboration_ids +#: model:ir.model.fields,field_description:sale_elaboration.field_stock_move__elaboration_ids +#: model:ir.model.fields,field_description:sale_elaboration.field_stock_move_line__elaboration_ids +#: model:ir.ui.menu,name:sale_elaboration.menu_sale_elaboration_root +#: model_terms:ir.ui.view,arch_db:sale_elaboration.elaboration_view_form +#: model_terms:ir.ui.view,arch_db:sale_elaboration.product_elaboration_profile_form_view +#: model_terms:ir.ui.view,arch_db:sale_elaboration.product_template_form_view +#: model_terms:ir.ui.view,arch_db:sale_elaboration.view_order_form +msgid "Elaborations" +msgstr "" + +#. module: sale_elaboration +#: model_terms:ir.ui.view,arch_db:sale_elaboration.elaboration_view_search +msgid "Elaborations Search" +msgstr "" + +#. module: sale_elaboration +#: model_terms:ir.ui.view,arch_db:sale_elaboration.elaboration_view_search +msgid "Group By" +msgstr "" + +#. module: sale_elaboration +#: model:ir.model.fields,field_description:sale_elaboration.field_product_elaboration__id +#: model:ir.model.fields,field_description:sale_elaboration.field_product_elaboration_profile__id +msgid "ID" +msgstr "" + +#. module: sale_elaboration +#: model:ir.model.fields,help:sale_elaboration.field_product_elaboration__active +msgid "" +"If unchecked, it will allow you to hide the product elaborations without " +"removing it." +msgstr "" + +#. module: sale_elaboration +#: model:res.groups,name:sale_elaboration.group_elaboration_note_on_delivery_slip +msgid "Include elaboration notes on delivery slip" +msgstr "" + +#. module: sale_elaboration +#: model:res.groups,name:sale_elaboration.group_elaboration_note_on_picking_operations +msgid "Include elaboration notes on picking operations" +msgstr "" + +#. module: sale_elaboration +#: model:ir.model.fields,field_description:sale_elaboration.field_product_elaboration_mixin__is_elaboration +#: model:ir.model.fields,field_description:sale_elaboration.field_product_product__is_elaboration +#: model:ir.model.fields,field_description:sale_elaboration.field_product_template__is_elaboration +#: model:ir.model.fields,field_description:sale_elaboration.field_sale_order_line__is_elaboration +#: model:ir.model.fields,field_description:sale_elaboration.field_stock_move__is_elaboration +#: model_terms:ir.ui.view,arch_db:sale_elaboration.view_sales_order_line_filter +msgid "Is Elaboration" +msgstr "" + +#. module: sale_elaboration +#: model_terms:ir.ui.view,arch_db:sale_elaboration.view_sales_order_line_filter +msgid "Is Not Prepared" +msgstr "" + +#. module: sale_elaboration +#: model:ir.model.fields,field_description:sale_elaboration.field_sale_order_line__is_prepared +#: model_terms:ir.ui.view,arch_db:sale_elaboration.view_sales_order_line_filter +msgid "Is Prepared" +msgstr "" + +#. module: sale_elaboration +#: model:ir.model.fields,field_description:sale_elaboration.field_product_elaboration____last_update +#: model:ir.model.fields,field_description:sale_elaboration.field_product_elaboration_profile____last_update +msgid "Last Modified on" +msgstr "" + +#. module: sale_elaboration +#: model:ir.model.fields,field_description:sale_elaboration.field_product_elaboration__write_uid +#: model:ir.model.fields,field_description:sale_elaboration.field_product_elaboration_profile__write_uid +msgid "Last Updated by" +msgstr "" + +#. module: sale_elaboration +#: model:ir.model.fields,field_description:sale_elaboration.field_product_elaboration__write_date +#: model:ir.model.fields,field_description:sale_elaboration.field_product_elaboration_profile__write_date +msgid "Last Updated on" +msgstr "" + +#. module: sale_elaboration +#: model:ir.model.fields,field_description:sale_elaboration.field_product_elaboration__name +#: model:ir.model.fields,field_description:sale_elaboration.field_product_elaboration_profile__name +msgid "Name" +msgstr "" + +#. module: sale_elaboration +#: model:ir.model.constraint,message:sale_elaboration.constraint_product_elaboration_name_uniq +msgid "Name must be unique!" +msgstr "" + +#. module: sale_elaboration +#: model:ir.model,name:sale_elaboration.model_product_template +#: model:ir.model.fields,field_description:sale_elaboration.field_product_elaboration__product_id +#: model_terms:ir.ui.view,arch_db:sale_elaboration.elaboration_view_search +msgid "Product" +msgstr "" + +#. module: sale_elaboration +#: model:ir.model,name:sale_elaboration.model_product_elaboration_mixin +msgid "Product Elaboration Mixin" +msgstr "" + +#. module: sale_elaboration +#: model:ir.model,name:sale_elaboration.model_stock_move_line +msgid "Product Moves (Stock Move Line)" +msgstr "" + +#. module: sale_elaboration +#: model:ir.model,name:sale_elaboration.model_product_product +msgid "Product Variant" +msgstr "" + +#. module: sale_elaboration +#: model:ir.model,name:sale_elaboration.model_product_elaboration_profile +msgid "Product elaboration profiles" +msgstr "" + +#. module: sale_elaboration +#: model:ir.model,name:sale_elaboration.model_product_elaboration +msgid "Product elaborations" +msgstr "" + +#. module: sale_elaboration +#: model:ir.model.fields,field_description:sale_elaboration.field_product_elaboration__profile_ids +msgid "Profile" +msgstr "" + +#. module: sale_elaboration +#: model:ir.model.fields,field_description:sale_elaboration.field_sale_order_line__route_id +msgid "Route" +msgstr "" + +#. module: sale_elaboration +#: model:ir.model.fields,field_description:sale_elaboration.field_product_elaboration__route_ids +msgid "Routes" +msgstr "" + +#. module: sale_elaboration +#: model:ir.actions.act_window,name:sale_elaboration.sale_elaboration_action +#: model:ir.ui.menu,name:sale_elaboration.menu_sale_elaboration +msgid "Sale Elaboration" +msgstr "" + +#. module: sale_elaboration +#: model:ir.actions.act_window,name:sale_elaboration.sale_elaboration_profile_action +#: model:ir.ui.menu,name:sale_elaboration.menu_sale_elaboration_profile +msgid "Sale Elaboration Profiles" +msgstr "" + +#. module: sale_elaboration +#: model:ir.actions.act_window,name:sale_elaboration.sale_elaboration_report_action +#: model:ir.ui.menu,name:sale_elaboration.menu_sale_elaboration_report +#: model:ir.ui.menu,name:sale_elaboration.menu_stock_sale_elaboration_report +msgid "Sale Elaboration Report" +msgstr "" + +#. module: sale_elaboration +#: model:ir.model,name:sale_elaboration.model_sale_order +msgid "Sales Order" +msgstr "" + +#. module: sale_elaboration +#: model:ir.model,name:sale_elaboration.model_sale_order_line +msgid "Sales Order Line" +msgstr "" + +#. module: sale_elaboration +#: model:ir.model.fields,field_description:sale_elaboration.field_product_elaboration__code +#: model:ir.model.fields,field_description:sale_elaboration.field_product_elaboration_profile__code +msgid "Short Code" +msgstr "" + +#. module: sale_elaboration +#: model:ir.model,name:sale_elaboration.model_stock_move +msgid "Stock Move" +msgstr "" + +#. module: sale_elaboration +#: model:ir.model,name:sale_elaboration.model_stock_rule +msgid "Stock Rule" +msgstr "" + +#. module: sale_elaboration +#: model:ir.model,name:sale_elaboration.model_stock_picking +msgid "Transfer" +msgstr "" + +#. module: sale_elaboration +#. odoo-python +#: code:addons/sale_elaboration/models/sale_order.py:0 +#, python-format +msgid "Unsupported operator %s for searching on is_prepared" +msgstr "" diff --git a/sale_elaboration/models/__init__.py b/sale_elaboration/models/__init__.py new file mode 100644 index 00000000000..cd54a345a2c --- /dev/null +++ b/sale_elaboration/models/__init__.py @@ -0,0 +1,11 @@ +# License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl). +from . import product +from . import product_elaboration +from . import product_elaboration_mixin +from . import product_elaboration_profile +from . import product_template +from . import res_config_settings +from . import sale_order +from . import stock_move +from . import stock_picking +from . import stock_rule diff --git a/sale_elaboration/models/product.py b/sale_elaboration/models/product.py new file mode 100644 index 00000000000..c83cde98370 --- /dev/null +++ b/sale_elaboration/models/product.py @@ -0,0 +1,11 @@ +# Copyright 2019 Tecnativa - Sergio Teruel +# License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl). +from odoo import fields, models + + +class ProductProduct(models.Model): + _inherit = "product.product" + + elaboration_profile_id = fields.Many2one( + comodel_name="product.elaboration.profile", ondelete="restrict" + ) diff --git a/sale_elaboration/models/product_elaboration.py b/sale_elaboration/models/product_elaboration.py new file mode 100644 index 00000000000..be2691e9982 --- /dev/null +++ b/sale_elaboration/models/product_elaboration.py @@ -0,0 +1,54 @@ +# Copyright 2018 Tecnativa - Sergio Teruel +# Copyright 2019 Tecnativa - Pedro M. Baeza +# License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl). +from odoo import api, fields, models + + +class Elaboration(models.Model): + _name = "product.elaboration" + _description = "Product elaborations" + + name = fields.Char(required=True, translate=True) + code = fields.Char(string="Short Code") + product_id = fields.Many2one( + comodel_name="product.product", + string="Product", + ondelete="restrict", + domain=[("type", "=", "service"), ("is_elaboration", "=", True)], + required=True, + ) + active = fields.Boolean( + default=True, + help="If unchecked, it will allow you to hide the product " + "elaborations without removing it.", + ) + route_ids = fields.Many2many( + comodel_name="stock.route", + string="Routes", + domain=[("sale_selectable", "=", True)], + ondelete="restrict", + ) + profile_ids = fields.Many2many( + comodel_name="product.elaboration.profile", + relation="product_elaboration_profile_rel", + column1="elaboration_id", + column2="profile_id", + ) + + _sql_constraints = [ + ("name_uniq", "unique(name)", "Name must be unique!"), + ("code_uniq", "unique(code)", "Code must be unique!"), + ] + + @api.model + def name_search(self, name, args=None, operator="ilike", limit=100): + """Give preference to codes on name search, appending + the rest of the results after. + """ + args = args or [] + recs = self.browse() + if name: + recs = self.search([("code", "=ilike", name)] + args, limit=limit) + if not recs: + recs = self.search([("name", operator, name)] + args, limit=limit) + return [(record.id, record.display_name) for record in recs.sudo()] diff --git a/sale_elaboration/models/product_elaboration_mixin.py b/sale_elaboration/models/product_elaboration_mixin.py new file mode 100644 index 00000000000..286e423a8e0 --- /dev/null +++ b/sale_elaboration/models/product_elaboration_mixin.py @@ -0,0 +1,31 @@ +# Copyright 2023 Tecnativa - Sergio Teruel +# Copyright 2023 Tecnativa - Carlos Dauden +# License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl). +from odoo import api, fields, models + + +class ProductElaborationMixin(models.AbstractModel): + _name = "product.elaboration.mixin" + _description = "Product Elaboration Mixin" + + elaboration_ids = fields.Many2many( + comodel_name="product.elaboration", + string="Elaborations", + ) + elaboration_note = fields.Char( + store=True, + ) + is_elaboration = fields.Boolean( + store=True, + compute="_compute_is_elaboration", + readonly=False, + ) + + @api.depends("product_id") + def _compute_is_elaboration(self): + """We use computed instead of a related field because related fields are not + initialized with their value on one2many which related field is the + inverse_name, so with this we get immediately the value on NewIds. + """ + for line in self: + line.is_elaboration = line.product_id.is_elaboration diff --git a/sale_elaboration/models/product_elaboration_profile.py b/sale_elaboration/models/product_elaboration_profile.py new file mode 100644 index 00000000000..eba9d1b84f0 --- /dev/null +++ b/sale_elaboration/models/product_elaboration_profile.py @@ -0,0 +1,20 @@ +# Copyright 2023 Tecnativa - Sergio Teruel +# Copyright 2023 Tecnativa - Carlos Dauden +# License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl). +from odoo import fields, models + + +class ProductElaborationProfile(models.Model): + _name = "product.elaboration.profile" + _description = "Product elaboration profiles" + + name = fields.Char(required=True, translate=True) + code = fields.Char(string="Short Code") + active = fields.Boolean(default=True) + elaboration_ids = fields.Many2many( + string="Elaborations", + comodel_name="product.elaboration", + relation="product_elaboration_profile_rel", + column1="profile_id", + column2="elaboration_id", + ) diff --git a/sale_elaboration/models/product_template.py b/sale_elaboration/models/product_template.py new file mode 100644 index 00000000000..fe9cc9bbc0f --- /dev/null +++ b/sale_elaboration/models/product_template.py @@ -0,0 +1,43 @@ +# Copyright 2019 Tecnativa - Sergio Teruel +# License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl). +from odoo import api, fields, models + + +class ProductTemplate(models.Model): + _inherit = "product.template" + + is_elaboration = fields.Boolean() + elaboration_profile_id = fields.Many2one( + comodel_name="product.elaboration.profile", + compute="_compute_elaboration_profile_id", + inverse="_inverse_elaboration_profile_id", + store=True, + ) + + @api.depends("product_variant_ids", "product_variant_ids.elaboration_profile_id") + def _compute_elaboration_profile_id(self): + unique_variants = self.filtered(lambda tmpl: tmpl.product_variant_count == 1) + for template in unique_variants: + template.elaboration_profile_id = ( + template.product_variant_ids.elaboration_profile_id + ) + for template in self - unique_variants: + template.elaboration_profile_id = False + + def _inverse_elaboration_profile_id(self): + for template in self: + if len(template.product_variant_ids) == 1: + template.product_variant_ids.elaboration_profile_id = ( + template.elaboration_profile_id + ) + + @api.model_create_multi + def create(self, vals_list): + templates = super().create(vals_list) + # This is needed to set given values to first variant after creation + for template, vals in zip(templates, vals_list, strict=True): + if vals.get("elaboration_profile_id"): + template.write( + {"elaboration_profile_id": vals["elaboration_profile_id"]} + ) + return templates diff --git a/sale_elaboration/models/res_config_settings.py b/sale_elaboration/models/res_config_settings.py new file mode 100644 index 00000000000..bc83a34f93e --- /dev/null +++ b/sale_elaboration/models/res_config_settings.py @@ -0,0 +1,17 @@ +# Copyright 2022 Tecnativa - Sergio Teruel +# License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl). + +from odoo import fields, models + + +class ResConfigSettings(models.TransientModel): + _inherit = "res.config.settings" + + group_elaboration_note_on_delivery_slip = fields.Boolean( + "Display Elaboration notes on Delivery Slips", + implied_group="sale_elaboration.group_elaboration_note_on_delivery_slip", + ) + group_elaboration_note_on_picking_operations = fields.Boolean( + "Display Elaboration notes on Picking Operations", + implied_group="sale_elaboration.group_elaboration_note_on_picking_operations", + ) diff --git a/sale_elaboration/models/sale_order.py b/sale_elaboration/models/sale_order.py new file mode 100644 index 00000000000..33e0fdd4e4f --- /dev/null +++ b/sale_elaboration/models/sale_order.py @@ -0,0 +1,117 @@ +# Copyright 2018 Tecnativa - Sergio Teruel +# Copyright 2019 Tecnativa - Pedro M. Baeza +# License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl). +from odoo import _, api, fields, models +from odoo.exceptions import UserError + + +def _execute_onchanges(records, field_name): + """Helper methods that executes all onchanges associated to a field.""" + for onchange in records._onchange_methods.get(field_name, []): + for record in records: + onchange(record) + + +class SaleOrder(models.Model): + _inherit = "sale.order" + + def _create_elaboration_line(self, product, qty): + """Create a sale order line from a elaboration product, search a line + with the same elaboration product to add qty + :param product: + :param qty: + :return: the sale order line record created + """ + SaleOrderLine = self.env["sale.order.line"] + sol_for_product = self.order_line.filtered(lambda x: x.product_id == product)[ + :1 + ] + if sol_for_product: + sol_for_product.product_uom_qty += qty + return sol_for_product + sol = SaleOrderLine.new( + {"order_id": self.id, "product_id": product.id, "is_elaboration": True} + ) + _execute_onchanges(sol, "product_id") + sol.update({"product_uom_qty": qty}) + _execute_onchanges(sol, "product_uom_qty") + vals = sol._convert_to_write(sol._cache) + if self.order_line: + vals["sequence"] = self.order_line[-1].sequence + 1 + return SaleOrderLine.sudo().create(vals) + + +class SaleOrderLine(models.Model): + _inherit = ["sale.order.line", "product.elaboration.mixin"] + _name = "sale.order.line" + + date_order = fields.Datetime(related="order_id.date_order", string="Date") + route_id = fields.Many2one(compute="_compute_route_id", store=True, readonly=False) + elaboration_profile_id = fields.Many2one( + related="product_id.elaboration_profile_id" + ) + elaboration_price_unit = fields.Float( + "Elab. Price", compute="_compute_elaboration_price_unit", store=True + ) + is_prepared = fields.Boolean( + compute=lambda self: None, + search="_search_is_prepared", + help=("Dummy field to be able to find prepared lines"), + ) + + def get_elaboration_stock_route(self): + self.ensure_one() + return self.elaboration_ids.route_ids[:1] + + @api.depends("elaboration_ids") + def _compute_route_id(self): + for line in self: + route_id = line.get_elaboration_stock_route() + if route_id: + line.route_id = route_id + + @api.depends("elaboration_ids", "order_id.pricelist_id") + def _compute_elaboration_price_unit(self): + for line in self: + if not line.order_id.pricelist_id: + line.elaboration_price_unit = 0 + else: + line.elaboration_price_unit = sum( + line.order_id.pricelist_id._get_products_price( + line.elaboration_ids.product_id, + quantity=1, + ).values() + ) + + def _prepare_invoice_line(self, **optional_values): + vals = super()._prepare_invoice_line(**optional_values) + if self.is_elaboration: + vals["name"] = f"{self.order_id.name} - {self.name}" + return vals + + def _search_is_prepared(self, operator, value): + if operator != "=": + raise UserError( + _("Unsupported operator %s for searching on is_prepared") % (operator,) + ) + moves = self.env["stock.move"].search( + [ + ( + "state", + "not in" if value else "in", + [ + "draft", + "waiting", + "confirmed", + "partially_available", + "assigned", + ], + ), + ( + "location_dest_id", + "=", + self.env.ref("stock.stock_location_customers").id, + ), + ] + ) + return [("move_ids", "in", moves.ids)] diff --git a/sale_elaboration/models/stock_move.py b/sale_elaboration/models/stock_move.py new file mode 100644 index 00000000000..7b4c681164d --- /dev/null +++ b/sale_elaboration/models/stock_move.py @@ -0,0 +1,23 @@ +# Copyright 2023 Tecnativa - Sergio Teruel +# Copyright 2023 Tecnativa - Carlos Dauden +# License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl). +from odoo import api, fields, models + + +class StockMove(models.Model): + _inherit = ["stock.move", "product.elaboration.mixin"] + _name = "stock.move" + + @api.model + def _prepare_merge_moves_distinct_fields(self): + """Don't merge moves with distinct elaborations""" + distinct_fields = super()._prepare_merge_moves_distinct_fields() + distinct_fields += ["elaboration_ids", "elaboration_note"] + return distinct_fields + + +class StockMoveLine(models.Model): + _inherit = "stock.move.line" + + elaboration_ids = fields.Many2many(related="move_id.elaboration_ids") + elaboration_note = fields.Char(related="move_id.elaboration_note") diff --git a/sale_elaboration/models/stock_picking.py b/sale_elaboration/models/stock_picking.py new file mode 100644 index 00000000000..1598b1666d4 --- /dev/null +++ b/sale_elaboration/models/stock_picking.py @@ -0,0 +1,18 @@ +# Copyright 2018 Tecnativa - Sergio Teruel +# License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl). +from odoo import models + + +class StockPicking(models.Model): + _inherit = "stock.picking" + + def _action_done(self): + res = super()._action_done() + for pick in self.filtered(lambda x: x.picking_type_code == "outgoing"): + elaboration_lines = pick.move_ids.filtered( + lambda x: x.sale_line_id.elaboration_ids + ) + for line in elaboration_lines: + for product in line.sale_line_id.elaboration_ids.product_id: + pick.sale_id._create_elaboration_line(product, line.product_uom_qty) + return res diff --git a/sale_elaboration/models/stock_rule.py b/sale_elaboration/models/stock_rule.py new file mode 100644 index 00000000000..1596d72185b --- /dev/null +++ b/sale_elaboration/models/stock_rule.py @@ -0,0 +1,44 @@ +# Copyright 2023 Tecnativa - Sergio Teruel +# License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl). +from odoo import models + + +class StockRule(models.Model): + _inherit = "stock.rule" + + def _get_stock_move_values( + self, + product_id, + product_qty, + product_uom, + location_id, + name, + origin, + company_id, + values, + ): + res = super()._get_stock_move_values( + product_id, + product_qty, + product_uom, + location_id, + name, + origin, + company_id, + values, + ) + sale_line_id = values.get("sale_line_id", False) + # Record can be a sale order line or a stock move depending of pull + # and push rules + if sale_line_id: + record = self.env["sale.order.line"].browse(sale_line_id) + else: + record = values.get("move_dest_ids", self.env["stock.move"].browse())[:1] + if record and (record.elaboration_ids or record.elaboration_note): + res.update( + { + "elaboration_ids": [(6, 0, record.elaboration_ids.ids)], + "elaboration_note": record.elaboration_note, + } + ) + return res diff --git a/sale_elaboration/pyproject.toml b/sale_elaboration/pyproject.toml new file mode 100644 index 00000000000..4231d0cccb3 --- /dev/null +++ b/sale_elaboration/pyproject.toml @@ -0,0 +1,3 @@ +[build-system] +requires = ["whool"] +build-backend = "whool.buildapi" diff --git a/sale_elaboration/readme/CONFIGURE.md b/sale_elaboration/readme/CONFIGURE.md new file mode 100644 index 00000000000..305535001f6 --- /dev/null +++ b/sale_elaboration/readme/CONFIGURE.md @@ -0,0 +1,6 @@ +To configure this module you need to: + +1. Go to *Sale \> Configuration \> Products \> Sale Elaboration*. +2. Create a new record. +3. Set a product linked to the elaboration. +4. Also you can select a route to procure this elaboration. diff --git a/sale_elaboration/readme/CONTRIBUTORS.md b/sale_elaboration/readme/CONTRIBUTORS.md new file mode 100644 index 00000000000..18b89e1a82d --- /dev/null +++ b/sale_elaboration/readme/CONTRIBUTORS.md @@ -0,0 +1,9 @@ +- [Tecnativa](https://www.tecnativa.com): + - Sergio Teruel + - Pedro M. Baeza + - Carlos Roca + - Ernesto Tejeda +- Eduardo de Miguel ([Moduon](https://www.moduon.team/)) +- Jairo Llopis ([Moduon](https://www.moduon.team/)) +- [APSL-Nagarro](https://apsl.tech): + - Antoni Marroig \<\> diff --git a/sale_elaboration/readme/DESCRIPTION.md b/sale_elaboration/readme/DESCRIPTION.md new file mode 100644 index 00000000000..b63b6c9dd15 --- /dev/null +++ b/sale_elaboration/readme/DESCRIPTION.md @@ -0,0 +1,8 @@ +This module extends the functionality of sales orders to allow to set an +elaboration on lines that will add an extra order line with an +elaboration product linked to it when the delivery order is validated. + +An **elaboration** is a process that needs to be done over the product, +usually on picking/handling phase. It doesn't modify too much the +product for needing an specific product, but it adds a surcharge on the +final price. diff --git a/sale_elaboration/readme/USAGE.md b/sale_elaboration/readme/USAGE.md new file mode 100644 index 00000000000..5d205d1ac05 --- /dev/null +++ b/sale_elaboration/readme/USAGE.md @@ -0,0 +1,8 @@ +1. Go to *Sale \> Quotations*. +2. Create a sales order. +3. Add a new line. +4. Select an elaboration in the line. +5. Confirm the sales order. +6. Go to the picking created by this sales order and validate it. +7. Go back to the sales order. A new line is created with the product + linked to the elaboration. diff --git a/sale_elaboration/reports/report_base.xml b/sale_elaboration/reports/report_base.xml new file mode 100644 index 00000000000..a1f4b0aafd0 --- /dev/null +++ b/sale_elaboration/reports/report_base.xml @@ -0,0 +1,19 @@ + + + + + + diff --git a/sale_elaboration/reports/report_deliveryslip.xml b/sale_elaboration/reports/report_deliveryslip.xml new file mode 100644 index 00000000000..c8369c430c0 --- /dev/null +++ b/sale_elaboration/reports/report_deliveryslip.xml @@ -0,0 +1,55 @@ + + + + + + + diff --git a/sale_elaboration/reports/report_picking_operations.xml b/sale_elaboration/reports/report_picking_operations.xml new file mode 100644 index 00000000000..4ac39388fb3 --- /dev/null +++ b/sale_elaboration/reports/report_picking_operations.xml @@ -0,0 +1,17 @@ + + + + + diff --git a/sale_elaboration/security/ir.model.access.csv b/sale_elaboration/security/ir.model.access.csv new file mode 100644 index 00000000000..4910663d49a --- /dev/null +++ b/sale_elaboration/security/ir.model.access.csv @@ -0,0 +1,6 @@ +id,name,model_id:id,group_id:id,perm_read,perm_write,perm_create,perm_unlink +access_elaboration_user,access_elaboration_user,model_product_elaboration,base.group_user,1,0,0,0 +access_elaboration_manager,access_elaboration_manager,model_product_elaboration,sales_team.group_sale_manager,1,1,1,1 +access_elaboration_portal,product.elaboration.portal,model_product_elaboration,base.group_portal,1,0,0,0 +access_elaboration_profile_user,product_elaboration_profile_user,sale_elaboration.model_product_elaboration_profile,base.group_user,1,0,0,0 +access_elaboration_profile_manager,product_elaboration_profile_manager,sale_elaboration.model_product_elaboration_profile,sales_team.group_sale_manager,1,1,1,1 diff --git a/sale_elaboration/security/security.xml b/sale_elaboration/security/security.xml new file mode 100644 index 00000000000..8f2d7ef7ffa --- /dev/null +++ b/sale_elaboration/security/security.xml @@ -0,0 +1,12 @@ + + + + Include elaboration notes on delivery slip + + + + + Include elaboration notes on picking operations + + + diff --git a/sale_elaboration/static/description/icon.png b/sale_elaboration/static/description/icon.png new file mode 100644 index 00000000000..3a0328b516c Binary files /dev/null and b/sale_elaboration/static/description/icon.png differ diff --git a/sale_elaboration/static/description/index.html b/sale_elaboration/static/description/index.html new file mode 100644 index 00000000000..4626f9b5424 --- /dev/null +++ b/sale_elaboration/static/description/index.html @@ -0,0 +1,465 @@ + + + + + +Sale Elaboration + + + +
+

Sale Elaboration

+ + +

Production/Stable License: AGPL-3 OCA/sale-workflow Translate me on Weblate Try me on Runboat

+

This module extends the functionality of sales orders to allow to set an +elaboration on lines that will add an extra order line with an +elaboration product linked to it when the delivery order is validated.

+

An elaboration is a process that needs to be done over the product, +usually on picking/handling phase. It doesn’t modify too much the +product for needing an specific product, but it adds a surcharge on the +final price.

+

Table of contents

+ +
+

Configuration

+

To configure this module you need to:

+
    +
  1. Go to Sale > Configuration > Products > Sale Elaboration.
  2. +
  3. Create a new record.
  4. +
  5. Set a product linked to the elaboration.
  6. +
  7. Also you can select a route to procure this elaboration.
  8. +
+
+
+

Usage

+
    +
  1. Go to Sale > Quotations.
  2. +
  3. Create a sales order.
  4. +
  5. Add a new line.
  6. +
  7. Select an elaboration in the line.
  8. +
  9. Confirm the sales order.
  10. +
  11. Go to the picking created by this sales order and validate it.
  12. +
  13. Go back to the sales order. A new line is created with the product +linked to the elaboration.
  14. +
+
+
+

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

+
    +
  • Tecnativa
  • +
+
+
+

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 maintainers:

+

CarlosRoca13 rafaelbn sergio-teruel yajo

+

This module is part of the OCA/sale-workflow project on GitHub.

+

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

+
+
+
+ + diff --git a/sale_elaboration/tests/__init__.py b/sale_elaboration/tests/__init__.py new file mode 100644 index 00000000000..a12476b7878 --- /dev/null +++ b/sale_elaboration/tests/__init__.py @@ -0,0 +1,2 @@ +# License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl). +from . import test_sale_elaboration diff --git a/sale_elaboration/tests/test_sale_elaboration.py b/sale_elaboration/tests/test_sale_elaboration.py new file mode 100644 index 00000000000..5614dab8016 --- /dev/null +++ b/sale_elaboration/tests/test_sale_elaboration.py @@ -0,0 +1,199 @@ +# Copyright 2018 Tecnativa - Sergio Teruel +# License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl). +from odoo.tests import Form, tagged + +from odoo.addons.account.tests.common import AccountTestInvoicingCommon + + +@tagged("post_install", "-at_install") +class TestSaleElaboration(AccountTestInvoicingCommon): + @classmethod + def setUpClass(cls): + super().setUpClass() + cls.Elaboration = cls.env["product.elaboration"] + cls.product = cls.env["product.product"].create( + {"name": "test", "tracking": "none", "list_price": 1000} + ) + cls.product_elaboration_A = cls.env["product.product"].create( + { + "name": "Product Elaboration A", + "type": "service", + "list_price": 50.0, + "invoice_policy": "order", + "is_elaboration": True, + } + ) + cls.product_elaboration_B = cls.env["product.product"].create( + { + "name": "Product Elaboration B", + "type": "service", + "list_price": 25.0, + "invoice_policy": "order", + "is_elaboration": True, + } + ) + cls.pricelist = cls.env["product.pricelist"].create( + { + "name": "Test pricelist", + "item_ids": [ + ( + 0, + 0, + { + "applied_on": "3_global", + "compute_price": "formula", + "base": "list_price", + }, + ) + ], + } + ) + cls.partner = cls.env["res.partner"].create( + {"name": "test - partner", "property_product_pricelist": cls.pricelist.id} + ) + cls.elaboration_a = cls.Elaboration.create( + { + "code": "AA", + "name": "Elaboration A", + "product_id": cls.product_elaboration_A.id, + } + ) + cls.elaboration_b = cls.Elaboration.create( + { + "code": "BB", + "name": "Elaboration B", + "product_id": cls.product_elaboration_B.id, + } + ) + cls.order = cls._create_sale_order( + cls, [(cls.product, 10, [cls.elaboration_a])] + ) + + def _create_sale_order(self, products_info): + order_form = Form(self.env["sale.order"]) + order_form.partner_id = self.partner + for product, qty, elaborations in products_info: + with order_form.order_line.new() as line_form: + line_form.product_id = product + line_form.product_uom_qty = qty + for elaboration in elaborations: + line_form.elaboration_ids.add(elaboration) + return order_form.save() + + def test_search_elaboration(self): + elaboration = self.Elaboration.name_search("Elaboration") + self.assertEqual(len(elaboration), 2) + elaboration = self.Elaboration.name_search("AA") + self.assertEqual(len(elaboration), 1) + + def test_sale_elaboration_doesnt_change(self): + self.order.order_line.elaboration_note = "Some details" + self.order.order_line.elaboration_ids = self.elaboration_b + self.assertEqual(self.order.order_line.elaboration_note, "Some details") + + def test_sale_elaboration(self): + self.order.action_confirm() + self.order.picking_ids.move_ids.product_uom_qty = 10.0 + self.order.picking_ids._action_done() + elaboration_lines = self.order.order_line.filtered("is_elaboration") + self.assertEqual(len(elaboration_lines), 1) + self.assertEqual(elaboration_lines.price_unit, 50.0) + + def test_sale_elaboration_multi(self): + self.order.order_line.create( + { + "order_id": self.order.id, + "product_id": self.product_elaboration_A.id, + "product_uom_qty": 1.0, + "price_unit": 50.0, + "is_elaboration": True, + } + ) + self.order.action_confirm() + self.order.picking_ids.move_ids.product_uom_qty = 10.0 + self.order.picking_ids._action_done() + elaboration_lines = self.order.order_line.filtered("is_elaboration") + self.assertEqual(len(elaboration_lines), 1) + self.assertEqual(elaboration_lines.product_uom_qty, 11.0) + + def test_invoice_elaboration(self): + self.order = self._create_sale_order( + [ + (self.product_elaboration_A, 1, []), + (self.product_elaboration_B, 1, []), + ] + ) + self.order.order_line.filtered( + lambda x: x.product_id == self.product_elaboration_B + ).is_elaboration = False + self.order.action_confirm() + invoice = self.order._create_invoices() + so_line_elaboration = self.order.order_line.filtered("is_elaboration") + so_line_no_elaboration = self.order.order_line - so_line_elaboration + inv_line_elaboration = invoice.invoice_line_ids.filtered( + lambda x: x.sale_line_ids == so_line_elaboration + ) + inv_line_no_elaboration = invoice.invoice_line_ids.filtered( + lambda x: x.sale_line_ids == so_line_no_elaboration + ) + self.assertEqual( + inv_line_elaboration.name, + f"{self.order.name} - {so_line_elaboration.name}", + ) + self.assertNotEqual( + inv_line_no_elaboration.name, + f"{self.order.name} - {so_line_no_elaboration.name}", + ) + + def test_sale_elaboration_change_product(self): + self.order.order_line.product_id = self.product_elaboration_A + self.assertTrue(self.order.order_line.is_elaboration) + self.order.order_line.product_id = self.product + self.assertFalse(self.order.order_line.is_elaboration) + + def test_multi_elaboration_per_line(self): + product2 = self.env["product.product"].create({"name": "product 2"}) + with Form(self.order) as order_form: + with order_form.order_line.new() as line_form: + line_form.product_id = product2 + line_form.product_uom_qty = 1 + line_form.elaboration_ids.add(self.elaboration_a) + line_form.elaboration_ids.add(self.elaboration_b) + self.order.action_confirm() + move_ids = self.order.picking_ids.move_ids + move_line_a = move_ids.filtered(lambda r: r.product_id == self.product) + move_line_a.product_uom_qty = 10.0 + move_line_b = move_ids.filtered(lambda r: r.product_id == product2) + move_line_b.product_uom_qty = 1.0 + self.order.picking_ids._action_done() + elaboration_lines = self.order.order_line.filtered("is_elaboration") + self.assertEqual(len(elaboration_lines), 2) + self.assertEqual(sum(elaboration_lines.mapped("product_uom_qty")), 12.0) + + def test_propagation_from_sale_order_to_stock_move(self): + with Form(self.order) as order_f: + # Edit order's line to add custom elaboration note + with order_f.order_line.edit(0) as line_f: + line_f.elaboration_note = "Custom note 1" + # Add a new line with a custom elaboration note, but without elaborations + with order_f.order_line.new() as line_f: + line_f.product_id = self.product + line_f.product_uom_qty = 1 + line_f.elaboration_note = "Custom note 2" + self.order.action_confirm() + # Check that the custom elaboration notes are propagated to the stock moves + self.assertRecordValues( + self.order.picking_ids.move_ids, + [ + { + "product_id": self.product.id, + "elaboration_ids": self.elaboration_a.ids, + "elaboration_note": "Custom note 1", + }, + { + "product_id": self.product.id, + "elaboration_ids": [], + "elaboration_note": "Custom note 2", + }, + ], + ) diff --git a/sale_elaboration/views/product_views.xml b/sale_elaboration/views/product_views.xml new file mode 100644 index 00000000000..06da0106229 --- /dev/null +++ b/sale_elaboration/views/product_views.xml @@ -0,0 +1,30 @@ + + + + + product.template + + + + + + + + + + product.template + + + + + + + + + + + diff --git a/sale_elaboration/views/res_config_settings_views.xml b/sale_elaboration/views/res_config_settings_views.xml new file mode 100644 index 00000000000..08e2c2521b2 --- /dev/null +++ b/sale_elaboration/views/res_config_settings_views.xml @@ -0,0 +1,25 @@ + + + + res.config.settings + + + + + + + + + + + + + diff --git a/sale_elaboration/views/sale_elaboration_profile_views.xml b/sale_elaboration/views/sale_elaboration_profile_views.xml new file mode 100644 index 00000000000..3f4d350c638 --- /dev/null +++ b/sale_elaboration/views/sale_elaboration_profile_views.xml @@ -0,0 +1,59 @@ + + + + + product.elaboration.profile.tree.view + product.elaboration.profile + + + + + + + + + + + product.elaboration.profile.form.view + product.elaboration.profile + +
+ + + + + + + + + + + +
+
+
+ + + Sale Elaboration Profiles + ir.actions.act_window + product.elaboration.profile + tree,form + + + +
diff --git a/sale_elaboration/views/sale_elaboration_report_views.xml b/sale_elaboration/views/sale_elaboration_report_views.xml new file mode 100644 index 00000000000..954578e89e5 --- /dev/null +++ b/sale_elaboration/views/sale_elaboration_report_views.xml @@ -0,0 +1,86 @@ + + + + + Elaborations + sale.order.line + + + + + + + + + + + + + + + + + sale.order.line + + + + + + + + + + + + + + + + + + + + Sale Elaboration Report + ir.actions.act_window + sale.order.line + tree,pivot + [('state', '=', 'sale')] + {'search_default_is_elaboration':1} + + + + + + diff --git a/sale_elaboration/views/sale_elaboration_views.xml b/sale_elaboration/views/sale_elaboration_views.xml new file mode 100644 index 00000000000..4c8fe3e2f99 --- /dev/null +++ b/sale_elaboration/views/sale_elaboration_views.xml @@ -0,0 +1,96 @@ + + + + + Elaborations + product.elaboration + +
+ + + + + + + + + + + + +
+
+
+ + Elaborations + product.elaboration + + + + + + + + + + + + + Elaborations + product.elaboration + + + + + + + + + + + + + + Sale Elaboration + ir.actions.act_window + product.elaboration + tree + + + +
diff --git a/sale_elaboration/views/sale_order_views.xml b/sale_elaboration/views/sale_order_views.xml new file mode 100644 index 00000000000..526dcd286ba --- /dev/null +++ b/sale_elaboration/views/sale_order_views.xml @@ -0,0 +1,94 @@ + + + + + Sale Elaboration + sale.order + + + + + + + + + + + + + + + + + + + + + + + +
+ Elaboration price: +
+
+
+ + +
+
+ +
+
+
+
+
+
+
diff --git a/sale_elaboration/views/stock_move_line_views.xml b/sale_elaboration/views/stock_move_line_views.xml new file mode 100644 index 00000000000..9045a4d2bda --- /dev/null +++ b/sale_elaboration/views/stock_move_line_views.xml @@ -0,0 +1,53 @@ + + + + + stock.move.line + + + + + + + + + + stock.move.line + + + + + + + + + + stock.move.line + + + + + + + + + diff --git a/sale_elaboration/views/stock_move_views.xml b/sale_elaboration/views/stock_move_views.xml new file mode 100644 index 00000000000..ab277a64163 --- /dev/null +++ b/sale_elaboration/views/stock_move_views.xml @@ -0,0 +1,25 @@ + + + + + stock.move.operation.sale + stock.move + + + + + + + + + + diff --git a/sale_elaboration/views/stock_picking_views.xml b/sale_elaboration/views/stock_picking_views.xml new file mode 100644 index 00000000000..4adb5a3f488 --- /dev/null +++ b/sale_elaboration/views/stock_picking_views.xml @@ -0,0 +1,29 @@ + + + + + stock.picking + + + + + + + + + +