Initial commit: Odoo 18.0-20251222 extra-addons
Some checks failed
pre-commit / pre-commit (push) Has been cancelled
tests / Detect unreleased dependencies (push) Has been cancelled
tests / test with OCB (push) Has been cancelled
tests / test with Odoo (push) Has been cancelled

This commit is contained in:
tocmo0nlord
2026-03-13 20:43:25 +00:00
parent 36e847a7df
commit adbe430761
9472 changed files with 1265727 additions and 0 deletions

171
sale_elaboration/README.rst Executable file
View File

@@ -0,0 +1,171 @@
.. image:: https://odoo-community.org/readme-banner-image
:target: https://odoo-community.org/get-involved?utm_source=readme
:alt: Odoo Community Association
================
Sale Elaboration
================
..
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
!! This file is generated by oca-gen-addon-readme !!
!! changes will be overwritten. !!
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
!! source digest: sha256:3869fbd7c7f1ad4b8660b3cf768511622163800c2b4c42e019e7175a4abf1048
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
.. |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/license-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/18.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-18-0/sale-workflow-18-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=18.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.
If the elaboration has a defined route, selecting the elaboration, it is
set on the order line, which will result in the generation of multiple
delivery notes depending on the established route.
**Table of contents**
.. contents::
:local:
Use Cases / Context
===================
This module was created to meet the need of providing the customer with
products that are not transformed into something new, but rather require
a simple preparation process. Example: Scaling a fish
Configuration
=============
To configure this module you need to:
1. Go to *Sale > Configuration > Elaborations > Sale Elaboration*.
2. Create a new record.
3. Set a product linked to the elaboration.
4. If you use Multi-Step Routes, you can also select a route to procure
this elaboration.
5. Go to *Settings > Inventory > Traceability* and select *Display
Elaboration notes on Delivery Slips* if you want to show elaborations
on Delivery Slips or *Display Elaboration notes on Picking
Operations* if you want to show elaborations on Picking Operations.
You can define elaboration profiles to limit the elaborations that can
be selected for each product.
To set the profile globally for a product category:
1. Go to *Inventory > Configuration > Product Categories* and choose
one.
2. In the **Logistics** sections, you can set the desired **Elaboration
profile**.
If you want to set an specific elaboration profile for a product:
1. Go to *Sale > Configuration > Elaborations > Sale Elaboration
Profile*.
2. Create a new record.
3. Select the elaborations included to the profile.
4. Set the elaboration to the related products.
Usage
=====
1. Go to *Sale > Quotations*.
2. Create a sales order.
3. Add a new line.
4. Select an elaboration in the line. If the product has an elaboration
profile selected, you will just be able to select the elaborations
set on the profile.
5. Confirm the sales order.
6. Go to the picking created by this sales order and validate it.
7. Print Delivery Slip and Picking Operations.
8. 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 <https://github.com/OCA/sale-workflow/issues>`_.
In case of trouble, please check there if your issue has already been reported.
If you spotted it first, help us to smash it by providing a detailed and welcomed
`feedback <https://github.com/OCA/sale-workflow/issues/new?body=module:%20sale_elaboration%0Aversion:%2018.0%0A%0A**Steps%20to%20reproduce**%0A-%20...%0A%0A**Current%20behavior**%0A%0A**Expected%20behavior**>`_.
Do not contact contributors directly about support or help with technical issues.
Credits
=======
Authors
-------
* Tecnativa
Contributors
------------
- `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/>`__)
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 <https://odoo-community.org/page/maintainer-role>`__:
|maintainer-CarlosRoca13| |maintainer-rafaelbn| |maintainer-sergio-teruel| |maintainer-yajo|
This module is part of the `OCA/sale-workflow <https://github.com/OCA/sale-workflow/tree/18.0/sale_elaboration>`_ project on GitHub.
You are welcome to contribute. To learn how please visit https://odoo-community.org/page/Contribute.

3
sale_elaboration/__init__.py Executable file
View File

@@ -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

View File

@@ -0,0 +1,34 @@
# 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": "18.0.1.0.2",
"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",
"reports/report_base.xml",
"reports/report_deliveryslip.xml",
"reports/report_picking_operations.xml",
"views/product_category_views.xml",
],
"demo": ["demo/sale_elaboration_demo.xml"],
"pre_init_hook": "pre_init_hook",
"maintainers": ["CarlosRoca13", "rafaelbn", "sergio-teruel", "yajo"],
}

View File

@@ -0,0 +1,14 @@
<?xml version="1.0" encoding="utf-8" ?>
<odoo noupdate="1">
<record id="product_product_elaboration" model="product.product">
<field name="name">Elaboration</field>
<field name="categ_id" ref="product.product_category_all" />
<field name="type">service</field>
<field name="default_code">ELAB</field>
</record>
<record id="product_elaboration_assembly" model="product.elaboration">
<field name="code">AMB</field>
<field name="name">Assembly</field>
<field name="product_id" ref="product_product_elaboration" />
</record>
</odoo>

17
sale_elaboration/hooks.py Executable file
View File

@@ -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 installed"""
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;
"""
)

355
sale_elaboration/i18n/de.po Executable file
View File

@@ -0,0 +1,355 @@
# 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 <maria.sparenberg@gmx.net>\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:product.elaboration,name:sale_elaboration.product_elaboration_assembly
msgid "Assembly"
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:product.template,name:sale_elaboration.product_product_elaboration_product_template
#: 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_category__elaboration_profile_id
#: 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,help:sale_elaboration.field_product_product__elaboration_profile_id
#: model:ir.model.fields,help:sale_elaboration.field_product_template__elaboration_profile_id
msgid ""
"Keep this field empty to use the default value from the product category."
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 "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_category
msgid "Product Category"
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
#, 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
msgid "Unsupported operator %s for searching on is_prepared"
msgstr ""
#~ msgid "Last Modified on"
#~ msgstr "Zuletzt geändert am"
#~ msgid "Product Template"
#~ msgstr "Produktvorlage"
#~ msgid "Quotation"
#~ msgstr "Angebot"

360
sale_elaboration/i18n/es.po Executable file
View File

@@ -0,0 +1,360 @@
# 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 <gelo@moduon.team>\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:product.elaboration,name:sale_elaboration.product_elaboration_assembly
msgid "Assembly"
msgstr ""
#. 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:product.template,name:sale_elaboration.product_product_elaboration_product_template
#: 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_category__elaboration_profile_id
#: 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,help:sale_elaboration.field_product_product__elaboration_profile_id
#: model:ir.model.fields,help:sale_elaboration.field_product_template__elaboration_profile_id
msgid ""
"Keep this field empty to use the default value from the product category."
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 "Ú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_category
msgid "Product Category"
msgstr ""
#. 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
msgid "Unsupported operator %s for searching on is_prepared"
msgstr "Operador %s no soportado para buscar en is_prepared"
#~ msgid "Last Modified on"
#~ msgstr "Última modificación el"
#~ msgid "<strong>Elab.</strong>"
#~ msgstr "<strong>elab.</strong>"
#~ msgid "<strong>Elaboration</strong>"
#~ msgstr "<strong>Elaboración</strong>"
#~ msgid "Product Template"
#~ msgstr "Plantilla de producto"

361
sale_elaboration/i18n/it.po Executable file
View File

@@ -0,0 +1,361 @@
# 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: 2025-08-16 11:54+0000\n"
"Last-Translator: mymage <stefano.consolaro@mymage.it>\n"
"Language-Team: none\n"
"Language: it\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: \n"
"Plural-Forms: nplurals=2; plural=n != 1;\n"
"X-Generator: Weblate 5.10.4\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:product.elaboration,name:sale_elaboration.product_elaboration_assembly
msgid "Assembly"
msgstr "Assembla"
#. 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:product.template,name:sale_elaboration.product_product_elaboration_product_template
#: 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_category__elaboration_profile_id
#: 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,help:sale_elaboration.field_product_product__elaboration_profile_id
#: model:ir.model.fields,help:sale_elaboration.field_product_template__elaboration_profile_id
msgid ""
"Keep this field empty to use the default value from the product category."
msgstr ""
"Lasciare il campo vuoto per utilizzare il valore predefinito della categoria "
"prodotto."
#. 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_category
msgid "Product Category"
msgstr "Categoria 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
msgid "Unsupported operator %s for searching on is_prepared"
msgstr "Operatore %s non supportato per la ricerca in is_prepared"
#~ msgid "Last Modified on"
#~ msgstr "Ultima modifica il"
#~ msgid "<strong>Elab.</strong>"
#~ msgstr "<strong>Elab.</strong>"
#~ msgid "<strong>Elaboration</strong>"
#~ msgstr "<strong>Elaborazione</strong>"

View File

@@ -0,0 +1,341 @@
# Translation of Odoo Server.
# This file contains the translation of the following modules:
# * sale_elaboration
#
msgid ""
msgstr ""
"Project-Id-Version: Odoo Server 18.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:product.elaboration,name:sale_elaboration.product_elaboration_assembly
msgid "Assembly"
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:product.template,name:sale_elaboration.product_product_elaboration_product_template
#: 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_category__elaboration_profile_id
#: 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,help:sale_elaboration.field_product_product__elaboration_profile_id
#: model:ir.model.fields,help:sale_elaboration.field_product_template__elaboration_profile_id
msgid ""
"Keep this field empty to use the default value from the product category."
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_category
msgid "Product Category"
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
msgid "Unsupported operator %s for searching on is_prepared"
msgstr ""

View File

@@ -0,0 +1,12 @@
# License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl).
from . import product
from . import product_category
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

View File

@@ -0,0 +1,14 @@
# 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",
help="Keep this field empty to use the default value from the product "
"category.",
)

View File

@@ -0,0 +1,11 @@
# Copyright 2025 Moduon Team S.L. <info@moduon.team>
# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl).
from odoo import fields, models
class ProductCategory(models.Model):
_inherit = "product.category"
elaboration_profile_id = fields.Many2one(
comodel_name="product.elaboration.profile", string="Elaboration Profile"
)

View File

@@ -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()]

View File

@@ -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

View File

@@ -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",
)

View File

@@ -0,0 +1,45 @@
# 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,
help="Keep this field empty to use the default value from the product "
"category.",
)
@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=False):
if vals.get("elaboration_profile_id"):
template.write(
{"elaboration_profile_id": vals["elaboration_profile_id"]}
)
return templates

View File

@@ -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",
)

View File

@@ -0,0 +1,128 @@
# 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(
comodel_name="product.elaboration.profile",
compute="_compute_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"),
)
@api.depends("product_id")
def _compute_elaboration_profile_id(self):
"""Order of applicability: product profile > category profile > no profile"""
self.elaboration_profile_id = False
for line in self.filtered("product_id"):
line.elaboration_profile_id = (
line.product_id.elaboration_profile_id
or line.product_id.categ_id.elaboration_profile_id
)
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)]

View File

@@ -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")

View File

@@ -0,0 +1,20 @@
# 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:
line.sale_line_id.order_id._create_elaboration_line(
product, line.quantity
)
return res

View File

@@ -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

View File

@@ -0,0 +1,3 @@
[build-system]
requires = ["whool"]
build-backend = "whool.buildapi"

View File

@@ -0,0 +1,27 @@
To configure this module you need to:
1. Go to *Sale \> Configuration \> Elaborations \> Sale Elaboration*.
2. Create a new record.
3. Set a product linked to the elaboration.
4. If you use Multi-Step Routes, you can also select a route to procure
this elaboration.
5. Go to *Settings \> Inventory \> Traceability* and select *Display
Elaboration notes on Delivery Slips* if you want to show
elaborations on Delivery Slips or *Display Elaboration notes on
Picking Operations* if you want to show elaborations on Picking
Operations.
You can define elaboration profiles to limit the elaborations that can be
selected for each product.
To set the profile globally for a product category:
1. Go to *Inventory > Configuration > Product Categories* and choose one.
2. In the **Logistics** sections, you can set the desired **Elaboration profile**.
If you want to set an specific elaboration profile for a product:
1. Go to *Sale \> Configuration \> Elaborations \> Sale Elaboration Profile*.
2. Create a new record.
3. Select the elaborations included to the profile.
4. Set the elaboration to the related products.

View File

@@ -0,0 +1,4 @@
This module was created to meet the need of providing
the customer with products that are not transformed
into something new, but rather require a simple
preparation process. Example: Scaling a fish

View File

@@ -0,0 +1,7 @@
- [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/))

View File

@@ -0,0 +1,12 @@
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.
If the elaboration has a defined route, selecting the elaboration,
it is set on the order line, which will result in the generation of
multiple delivery notes depending on the established route.

View File

@@ -0,0 +1,11 @@
1. Go to *Sale \> Quotations*.
2. Create a sales order.
3. Add a new line.
4. Select an elaboration in the line. If the product has an elaboration
profile selected, you will just be able to select the elaborations set
on the profile.
5. Confirm the sales order.
6. Go to the picking created by this sales order and validate it.
7. Print Delivery Slip and Picking Operations.
8. Go back to the sales order. A new line is created with the product
linked to the elaboration.

View File

@@ -0,0 +1,18 @@
<?xml version="1.0" encoding="utf-8" ?>
<!-- Copyright 2024 Moduon Team S.L. <info@moduon.team>
License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl). -->
<data>
<!-- Reusable template for printing elaborations and notes -->
<template id="elaboration_notes">
<!-- `record` can be stock.move or stock.move.line -->
<div
class="fst-italic"
t-if="record.elaboration_ids or record.elaboration_note"
>
<i class="fa fa-comment-o " />
<span t-field="record.elaboration_ids" />
<t t-if="record.elaboration_ids and record.elaboration_note">.</t>
<span t-field="record.elaboration_note" />
</div>
</template>
</data>

View File

@@ -0,0 +1,57 @@
<?xml version="1.0" encoding="utf-8" ?>
<!-- Copyright 2018 Tecnativa - Sergio Teruel
Copyright 2024 Moduon Team S.L. <info@moduon.team>
License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl). -->
<odoo>
<template
id="report_delivery_document"
inherit_id="stock.report_delivery_document"
priority="20"
>
<!--
Force to print lines from sml instead of aggregate data to display
elaboration notes.
Odoo has a bad design to do aggregate lines, see here
https://github.com/odoo/odoo/blob/15.0/addons/stock/models/stock_move_line.py#L738
-->
<xpath
expr="//t[@t-value=&quot;o.move_line_ids.mapped(&apos;lot_id&apos;)&quot;]"
position="attributes"
>
<attribute
name="t-value"
add="or (o.move_ids.filtered('elaboration_ids') | o.move_ids.filtered('elaboration_note'))"
separator=" "
/>
<attribute
name="groups"
add="sale_elaboration.group_elaboration_note_on_delivery_slip"
separator=", "
/>
</xpath>
<xpath expr="//p[span[@t-field='move.description_picking']]" position="after">
<t
t-if="move.picking_code != 'incoming'"
t-call="sale_elaboration.elaboration_notes"
groups="sale_elaboration.group_elaboration_note_on_delivery_slip"
>
<t t-set="record" t-value="move" />
</t>
</xpath>
</template>
<template
id="stock_report_delivery_has_serial_move_line"
inherit_id="stock.stock_report_delivery_has_serial_move_line"
>
<xpath expr="//span[@t-field='move_line.product_id']" position="after">
<t
t-if="move_line.picking_code != 'incoming'"
t-call="sale_elaboration.elaboration_notes"
groups="sale_elaboration.group_elaboration_note_on_delivery_slip"
>
<t t-set="record" t-value="move_line" />
</t>
</xpath>
</template>
</odoo>

View File

@@ -0,0 +1,19 @@
<?xml version="1.0" encoding="utf-8" ?>
<!-- Copyright 2024 Moduon Team S.L.
License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl-3.0) -->
<data>
<template id="report_picking" inherit_id="stock.report_picking">
<xpath
expr="//td[span[@t-field='ml.product_id.display_name']]"
position="inside"
>
<t
t-if="ml.picking_code != 'incoming'"
t-call="sale_elaboration.elaboration_notes"
groups="sale_elaboration.group_elaboration_note_on_picking_operations"
>
<t t-set="record" t-value="ml" />
</t>
</xpath>
</template>
</data>

View File

@@ -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
1 id name model_id:id group_id:id perm_read perm_write perm_create perm_unlink
2 access_elaboration_user access_elaboration_user model_product_elaboration base.group_user 1 0 0 0
3 access_elaboration_manager access_elaboration_manager model_product_elaboration sales_team.group_sale_manager 1 1 1 1
4 access_elaboration_portal product.elaboration.portal model_product_elaboration base.group_portal 1 0 0 0
5 access_elaboration_profile_user product_elaboration_profile_user sale_elaboration.model_product_elaboration_profile base.group_user 1 0 0 0
6 access_elaboration_profile_manager product_elaboration_profile_manager sale_elaboration.model_product_elaboration_profile sales_team.group_sale_manager 1 1 1 1

View File

@@ -0,0 +1,12 @@
<?xml version="1.0" encoding="utf-8" ?>
<odoo>
<record id="group_elaboration_note_on_delivery_slip" model="res.groups">
<field name="name">Include elaboration notes on delivery slip</field>
<field name="category_id" ref="base.module_category_hidden" />
</record>
<record id="group_elaboration_note_on_picking_operations" model="res.groups">
<field name="name">Include elaboration notes on picking operations</field>
<field name="category_id" ref="base.module_category_hidden" />
</record>
</odoo>

Binary file not shown.

After

Width:  |  Height:  |  Size: 9.2 KiB

View File

@@ -0,0 +1,505 @@
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<meta name="generator" content="Docutils: https://docutils.sourceforge.io/" />
<title>README.rst</title>
<style type="text/css">
/*
:Author: David Goodger (goodger@python.org)
:Id: $Id: html4css1.css 9511 2024-01-13 09:50:07Z milde $
:Copyright: This stylesheet has been placed in the public domain.
Default cascading style sheet for the HTML output of Docutils.
Despite the name, some widely supported CSS2 features are used.
See https://docutils.sourceforge.io/docs/howto/html-stylesheets.html for how to
customize this style sheet.
*/
/* used to remove borders from tables and images */
.borderless, table.borderless td, table.borderless th {
border: 0 }
table.borderless td, table.borderless th {
/* Override padding for "table.docutils td" with "! important".
The right padding separates the table cells. */
padding: 0 0.5em 0 0 ! important }
.first {
/* Override more specific margin styles with "! important". */
margin-top: 0 ! important }
.last, .with-subtitle {
margin-bottom: 0 ! important }
.hidden {
display: none }
.subscript {
vertical-align: sub;
font-size: smaller }
.superscript {
vertical-align: super;
font-size: smaller }
a.toc-backref {
text-decoration: none ;
color: black }
blockquote.epigraph {
margin: 2em 5em ; }
dl.docutils dd {
margin-bottom: 0.5em }
object[type="image/svg+xml"], object[type="application/x-shockwave-flash"] {
overflow: hidden;
}
/* Uncomment (and remove this text!) to get bold-faced definition list terms
dl.docutils dt {
font-weight: bold }
*/
div.abstract {
margin: 2em 5em }
div.abstract p.topic-title {
font-weight: bold ;
text-align: center }
div.admonition, div.attention, div.caution, div.danger, div.error,
div.hint, div.important, div.note, div.tip, div.warning {
margin: 2em ;
border: medium outset ;
padding: 1em }
div.admonition p.admonition-title, div.hint p.admonition-title,
div.important p.admonition-title, div.note p.admonition-title,
div.tip p.admonition-title {
font-weight: bold ;
font-family: sans-serif }
div.attention p.admonition-title, div.caution p.admonition-title,
div.danger p.admonition-title, div.error p.admonition-title,
div.warning p.admonition-title, .code .error {
color: red ;
font-weight: bold ;
font-family: sans-serif }
/* Uncomment (and remove this text!) to get reduced vertical space in
compound paragraphs.
div.compound .compound-first, div.compound .compound-middle {
margin-bottom: 0.5em }
div.compound .compound-last, div.compound .compound-middle {
margin-top: 0.5em }
*/
div.dedication {
margin: 2em 5em ;
text-align: center ;
font-style: italic }
div.dedication p.topic-title {
font-weight: bold ;
font-style: normal }
div.figure {
margin-left: 2em ;
margin-right: 2em }
div.footer, div.header {
clear: both;
font-size: smaller }
div.line-block {
display: block ;
margin-top: 1em ;
margin-bottom: 1em }
div.line-block div.line-block {
margin-top: 0 ;
margin-bottom: 0 ;
margin-left: 1.5em }
div.sidebar {
margin: 0 0 0.5em 1em ;
border: medium outset ;
padding: 1em ;
background-color: #ffffee ;
width: 40% ;
float: right ;
clear: right }
div.sidebar p.rubric {
font-family: sans-serif ;
font-size: medium }
div.system-messages {
margin: 5em }
div.system-messages h1 {
color: red }
div.system-message {
border: medium outset ;
padding: 1em }
div.system-message p.system-message-title {
color: red ;
font-weight: bold }
div.topic {
margin: 2em }
h1.section-subtitle, h2.section-subtitle, h3.section-subtitle,
h4.section-subtitle, h5.section-subtitle, h6.section-subtitle {
margin-top: 0.4em }
h1.title {
text-align: center }
h2.subtitle {
text-align: center }
hr.docutils {
width: 75% }
img.align-left, .figure.align-left, object.align-left, table.align-left {
clear: left ;
float: left ;
margin-right: 1em }
img.align-right, .figure.align-right, object.align-right, table.align-right {
clear: right ;
float: right ;
margin-left: 1em }
img.align-center, .figure.align-center, object.align-center {
display: block;
margin-left: auto;
margin-right: auto;
}
table.align-center {
margin-left: auto;
margin-right: auto;
}
.align-left {
text-align: left }
.align-center {
clear: both ;
text-align: center }
.align-right {
text-align: right }
/* reset inner alignment in figures */
div.align-right {
text-align: inherit }
/* div.align-center * { */
/* text-align: left } */
.align-top {
vertical-align: top }
.align-middle {
vertical-align: middle }
.align-bottom {
vertical-align: bottom }
ol.simple, ul.simple {
margin-bottom: 1em }
ol.arabic {
list-style: decimal }
ol.loweralpha {
list-style: lower-alpha }
ol.upperalpha {
list-style: upper-alpha }
ol.lowerroman {
list-style: lower-roman }
ol.upperroman {
list-style: upper-roman }
p.attribution {
text-align: right ;
margin-left: 50% }
p.caption {
font-style: italic }
p.credits {
font-style: italic ;
font-size: smaller }
p.label {
white-space: nowrap }
p.rubric {
font-weight: bold ;
font-size: larger ;
color: maroon ;
text-align: center }
p.sidebar-title {
font-family: sans-serif ;
font-weight: bold ;
font-size: larger }
p.sidebar-subtitle {
font-family: sans-serif ;
font-weight: bold }
p.topic-title {
font-weight: bold }
pre.address {
margin-bottom: 0 ;
margin-top: 0 ;
font: inherit }
pre.literal-block, pre.doctest-block, pre.math, pre.code {
margin-left: 2em ;
margin-right: 2em }
pre.code .ln { color: gray; } /* line numbers */
pre.code, code { background-color: #eeeeee }
pre.code .comment, code .comment { color: #5C6576 }
pre.code .keyword, code .keyword { color: #3B0D06; font-weight: bold }
pre.code .literal.string, code .literal.string { color: #0C5404 }
pre.code .name.builtin, code .name.builtin { color: #352B84 }
pre.code .deleted, code .deleted { background-color: #DEB0A1}
pre.code .inserted, code .inserted { background-color: #A3D289}
span.classifier {
font-family: sans-serif ;
font-style: oblique }
span.classifier-delimiter {
font-family: sans-serif ;
font-weight: bold }
span.interpreted {
font-family: sans-serif }
span.option {
white-space: nowrap }
span.pre {
white-space: pre }
span.problematic, pre.problematic {
color: red }
span.section-subtitle {
/* font-size relative to parent (h1..h6 element) */
font-size: 80% }
table.citation {
border-left: solid 1px gray;
margin-left: 1px }
table.docinfo {
margin: 2em 4em }
table.docutils {
margin-top: 0.5em ;
margin-bottom: 0.5em }
table.footnote {
border-left: solid 1px black;
margin-left: 1px }
table.docutils td, table.docutils th,
table.docinfo td, table.docinfo th {
padding-left: 0.5em ;
padding-right: 0.5em ;
vertical-align: top }
table.docutils th.field-name, table.docinfo th.docinfo-name {
font-weight: bold ;
text-align: left ;
white-space: nowrap ;
padding-left: 0 }
/* "booktabs" style (no vertical lines) */
table.docutils.booktabs {
border: 0px;
border-top: 2px solid;
border-bottom: 2px solid;
border-collapse: collapse;
}
table.docutils.booktabs * {
border: 0px;
}
table.docutils.booktabs th {
border-bottom: thin solid;
text-align: left;
}
h1 tt.docutils, h2 tt.docutils, h3 tt.docutils,
h4 tt.docutils, h5 tt.docutils, h6 tt.docutils {
font-size: 100% }
ul.auto-toc {
list-style-type: none }
</style>
</head>
<body>
<div class="document">
<a class="reference external image-reference" href="https://odoo-community.org/get-involved?utm_source=readme">
<img alt="Odoo Community Association" src="https://odoo-community.org/readme-banner-image" />
</a>
<div class="section" id="sale-elaboration">
<h1>Sale Elaboration</h1>
<!-- !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
!! This file is generated by oca-gen-addon-readme !!
!! changes will be overwritten. !!
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
!! source digest: sha256:3869fbd7c7f1ad4b8660b3cf768511622163800c2b4c42e019e7175a4abf1048
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! -->
<p><a class="reference external image-reference" href="https://odoo-community.org/page/development-status"><img alt="Production/Stable" src="https://img.shields.io/badge/maturity-Production%2FStable-green.png" /></a> <a class="reference external image-reference" href="http://www.gnu.org/licenses/agpl-3.0-standalone.html"><img alt="License: AGPL-3" src="https://img.shields.io/badge/license-AGPL--3-blue.png" /></a> <a class="reference external image-reference" href="https://github.com/OCA/sale-workflow/tree/18.0/sale_elaboration"><img alt="OCA/sale-workflow" src="https://img.shields.io/badge/github-OCA%2Fsale--workflow-lightgray.png?logo=github" /></a> <a class="reference external image-reference" href="https://translation.odoo-community.org/projects/sale-workflow-18-0/sale-workflow-18-0-sale_elaboration"><img alt="Translate me on Weblate" src="https://img.shields.io/badge/weblate-Translate%20me-F47D42.png" /></a> <a class="reference external image-reference" href="https://runboat.odoo-community.org/builds?repo=OCA/sale-workflow&amp;target_branch=18.0"><img alt="Try me on Runboat" src="https://img.shields.io/badge/runboat-Try%20me-875A7B.png" /></a></p>
<p>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.</p>
<p>An <strong>elaboration</strong> is a process that needs to be done over the product,
usually on picking/handling phase. It doesnt modify too much the
product for needing an specific product, but it adds a surcharge on the
final price.</p>
<p>If the elaboration has a defined route, selecting the elaboration, it is
set on the order line, which will result in the generation of multiple
delivery notes depending on the established route.</p>
<p><strong>Table of contents</strong></p>
<div class="contents local topic" id="contents">
<ul class="simple">
<li><a class="reference internal" href="#use-cases-context" id="toc-entry-1">Use Cases / Context</a></li>
<li><a class="reference internal" href="#configuration" id="toc-entry-2">Configuration</a></li>
<li><a class="reference internal" href="#usage" id="toc-entry-3">Usage</a></li>
<li><a class="reference internal" href="#bug-tracker" id="toc-entry-4">Bug Tracker</a></li>
<li><a class="reference internal" href="#credits" id="toc-entry-5">Credits</a><ul>
<li><a class="reference internal" href="#authors" id="toc-entry-6">Authors</a></li>
<li><a class="reference internal" href="#contributors" id="toc-entry-7">Contributors</a></li>
<li><a class="reference internal" href="#maintainers" id="toc-entry-8">Maintainers</a></li>
</ul>
</li>
</ul>
</div>
<div class="section" id="use-cases-context">
<h2><a class="toc-backref" href="#toc-entry-1">Use Cases / Context</a></h2>
<p>This module was created to meet the need of providing the customer with
products that are not transformed into something new, but rather require
a simple preparation process. Example: Scaling a fish</p>
</div>
<div class="section" id="configuration">
<h2><a class="toc-backref" href="#toc-entry-2">Configuration</a></h2>
<p>To configure this module you need to:</p>
<ol class="arabic simple">
<li>Go to <em>Sale &gt; Configuration &gt; Elaborations &gt; Sale Elaboration</em>.</li>
<li>Create a new record.</li>
<li>Set a product linked to the elaboration.</li>
<li>If you use Multi-Step Routes, you can also select a route to procure
this elaboration.</li>
<li>Go to <em>Settings &gt; Inventory &gt; Traceability</em> and select <em>Display
Elaboration notes on Delivery Slips</em> if you want to show elaborations
on Delivery Slips or <em>Display Elaboration notes on Picking
Operations</em> if you want to show elaborations on Picking Operations.</li>
</ol>
<p>You can define elaboration profiles to limit the elaborations that can
be selected for each product.</p>
<p>To set the profile globally for a product category:</p>
<ol class="arabic simple">
<li>Go to <em>Inventory &gt; Configuration &gt; Product Categories</em> and choose
one.</li>
<li>In the <strong>Logistics</strong> sections, you can set the desired <strong>Elaboration
profile</strong>.</li>
</ol>
<p>If you want to set an specific elaboration profile for a product:</p>
<ol class="arabic simple">
<li>Go to <em>Sale &gt; Configuration &gt; Elaborations &gt; Sale Elaboration
Profile</em>.</li>
<li>Create a new record.</li>
<li>Select the elaborations included to the profile.</li>
<li>Set the elaboration to the related products.</li>
</ol>
</div>
<div class="section" id="usage">
<h2><a class="toc-backref" href="#toc-entry-3">Usage</a></h2>
<ol class="arabic simple">
<li>Go to <em>Sale &gt; Quotations</em>.</li>
<li>Create a sales order.</li>
<li>Add a new line.</li>
<li>Select an elaboration in the line. If the product has an elaboration
profile selected, you will just be able to select the elaborations
set on the profile.</li>
<li>Confirm the sales order.</li>
<li>Go to the picking created by this sales order and validate it.</li>
<li>Print Delivery Slip and Picking Operations.</li>
<li>Go back to the sales order. A new line is created with the product
linked to the elaboration.</li>
</ol>
</div>
<div class="section" id="bug-tracker">
<h2><a class="toc-backref" href="#toc-entry-4">Bug Tracker</a></h2>
<p>Bugs are tracked on <a class="reference external" href="https://github.com/OCA/sale-workflow/issues">GitHub Issues</a>.
In case of trouble, please check there if your issue has already been reported.
If you spotted it first, help us to smash it by providing a detailed and welcomed
<a class="reference external" href="https://github.com/OCA/sale-workflow/issues/new?body=module:%20sale_elaboration%0Aversion:%2018.0%0A%0A**Steps%20to%20reproduce**%0A-%20...%0A%0A**Current%20behavior**%0A%0A**Expected%20behavior**">feedback</a>.</p>
<p>Do not contact contributors directly about support or help with technical issues.</p>
</div>
<div class="section" id="credits">
<h2><a class="toc-backref" href="#toc-entry-5">Credits</a></h2>
<div class="section" id="authors">
<h3><a class="toc-backref" href="#toc-entry-6">Authors</a></h3>
<ul class="simple">
<li>Tecnativa</li>
</ul>
</div>
<div class="section" id="contributors">
<h3><a class="toc-backref" href="#toc-entry-7">Contributors</a></h3>
<ul class="simple">
<li><a class="reference external" href="https://www.tecnativa.com">Tecnativa</a>:<ul>
<li>Sergio Teruel</li>
<li>Pedro M. Baeza</li>
<li>Carlos Roca</li>
<li>Ernesto Tejeda</li>
</ul>
</li>
<li>Eduardo de Miguel (<a class="reference external" href="https://www.moduon.team/">Moduon</a>)</li>
<li>Jairo Llopis (<a class="reference external" href="https://www.moduon.team/">Moduon</a>)</li>
</ul>
</div>
<div class="section" id="maintainers">
<h3><a class="toc-backref" href="#toc-entry-8">Maintainers</a></h3>
<p>This module is maintained by the OCA.</p>
<a class="reference external image-reference" href="https://odoo-community.org">
<img alt="Odoo Community Association" src="https://odoo-community.org/logo.png" />
</a>
<p>OCA, or the Odoo Community Association, is a nonprofit organization whose
mission is to support the collaborative development of Odoo features and
promote its widespread use.</p>
<p>Current <a class="reference external" href="https://odoo-community.org/page/maintainer-role">maintainers</a>:</p>
<p><a class="reference external image-reference" href="https://github.com/CarlosRoca13"><img alt="CarlosRoca13" src="https://github.com/CarlosRoca13.png?size=40px" /></a> <a class="reference external image-reference" href="https://github.com/rafaelbn"><img alt="rafaelbn" src="https://github.com/rafaelbn.png?size=40px" /></a> <a class="reference external image-reference" href="https://github.com/sergio-teruel"><img alt="sergio-teruel" src="https://github.com/sergio-teruel.png?size=40px" /></a> <a class="reference external image-reference" href="https://github.com/yajo"><img alt="yajo" src="https://github.com/yajo.png?size=40px" /></a></p>
<p>This module is part of the <a class="reference external" href="https://github.com/OCA/sale-workflow/tree/18.0/sale_elaboration">OCA/sale-workflow</a> project on GitHub.</p>
<p>You are welcome to contribute. To learn how please visit <a class="reference external" href="https://odoo-community.org/page/Contribute">https://odoo-community.org/page/Contribute</a>.</p>
</div>
</div>
</div>
</div>
</body>
</html>

View File

@@ -0,0 +1,2 @@
# License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl).
from . import test_sale_elaboration

View File

@@ -0,0 +1,228 @@
# Copyright 2018 Tecnativa - Sergio Teruel
# License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl).
from odoo import Command
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.ElaborationProfile = cls.env["product.elaboration.profile"]
cls.category_1 = cls.env["product.category"].create({"name": "Meat"})
cls.category_2 = cls.env["product.category"].create({"name": "Fish"})
cls.product = cls.env["product.product"].create(
{"name": "test", "tracking": "none", "list_price": 1000}
)
cls.product_2 = cls.env["product.product"].create(
{"name": "test 2", "tracking": "none", "list_price": 1000}
)
cls.product_3 = cls.env["product.product"].create(
{"name": "test 2", "tracking": "none", "list_price": 1000}
)
cls.product.categ_id = cls.category_1
cls.product_2.categ_id = cls.category_2
cls.product_3.categ_id = cls.category_1
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.elaboration_profile_a = cls.ElaborationProfile.create(
{
"name": "Elaboration Profile A",
"elaboration_ids": [
Command.set([cls.elaboration_a.id, cls.elaboration_b.id])
],
}
)
cls.elaboration_profile_b = cls.ElaborationProfile.create(
{
"name": "Elaboration Profile B",
"elaboration_ids": [Command.set(cls.elaboration_a.ids)],
}
)
cls.product.elaboration_profile_id = cls.elaboration_profile_a
cls.order = cls._create_sale_order(
cls, [(cls.product, 10, [cls.elaboration_a])]
)
cls.category_1.elaboration_profile_id = cls.elaboration_profile_b
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.quantity = 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.quantity = 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 line: line.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.quantity = 10.0
move_line_b = move_ids.filtered(lambda r: r.product_id == product2)
move_line_b.quantity = 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",
},
],
)

View File

@@ -0,0 +1,16 @@
<?xml version="1.0" encoding="utf-8" ?>
<odoo>
<record
model="ir.ui.view"
id="sale_elaboration_product_category_view_form_inherit_elaboration_id"
>
<field name="name">product.category.view.form.sale.elaboration</field>
<field name="model">product.category</field>
<field name="inherit_id" ref="product.product_category_form_view" />
<field name="arch" type="xml">
<xpath expr="//group[@name='logistics']" position="inside">
<field name="elaboration_profile_id" />
</xpath>
</field>
</record>
</odoo>

View File

@@ -0,0 +1,29 @@
<?xml version="1.0" encoding="utf-8" ?>
<!-- Copyright 2019 Tecnativa - Sergio Teruel
License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl). -->
<odoo>
<record id="product_template_only_form_view" model="ir.ui.view">
<field name="model">product.template</field>
<field name="inherit_id" ref="product.product_template_only_form_view" />
<field name="arch" type="xml">
<field name='default_code' position="after">
<field name="is_elaboration" invisible="type != 'service'" />
</field>
</field>
</record>
<record id="product_template_form_view" model="ir.ui.view">
<field name="model">product.template</field>
<field name="inherit_id" ref="product.product_template_form_view" />
<field name="arch" type="xml">
<xpath expr="//group[@name='description']/.." position="after">
<group name="elboration" string="Elaborations">
<field
name="elaboration_profile_id"
invisible="product_variant_count > 1 and not is_product_variant"
/>
</group>
</xpath>
</field>
</record>
</odoo>

View File

@@ -0,0 +1,23 @@
<?xml version="1.0" encoding="utf-8" ?>
<odoo>
<record id="res_config_settings_view" model="ir.ui.view">
<field name="model">res.config.settings</field>
<field name="inherit_id" ref="stock.res_config_settings_view_form" />
<field name="arch" type="xml">
<xpath expr="//setting[@id='group_lot_on_delivery_slip']" position="after">
<setting
help="Elaboration notes will appear on the delivery slip"
id="group_elaboration_note_on_delivery_slip"
>
<field name="group_elaboration_note_on_delivery_slip" />
</setting>
<setting
help="Elaboration notes will appear on the picking operations report"
id="group_elaboration_note_on_picking_operations"
>
<field name="group_elaboration_note_on_picking_operations" />
</setting>
</xpath>
</field>
</record>
</odoo>

View File

@@ -0,0 +1,58 @@
<?xml version="1.0" encoding="utf-8" ?>
<odoo>
<record id="product_elaboration_profile_tree_view" model="ir.ui.view">
<field name="name">product.elaboration.profile.tree.view</field>
<field name="model">product.elaboration.profile</field>
<field name="arch" type="xml">
<list>
<field name="name" />
<field name="code" />
<field name="active" widget="boolean_toggle" />
</list>
</field>
</record>
<record id="product_elaboration_profile_form_view" model="ir.ui.view">
<field name="name">product.elaboration.profile.form.view</field>
<field name="model">product.elaboration.profile</field>
<field name="arch" type="xml">
<form>
<sheet>
<widget
name="web_ribbon"
title="Archived"
bg_color="bg-danger"
invisible="active"
/>
<field name="active" invisible="1" />
<group>
<field name="name" />
<field name="code" />
</group>
<group string="Elaborations">
<field name="elaboration_ids" nolabel="1" colspan="2" />
</group>
</sheet>
</form>
</field>
</record>
<record id="sale_elaboration_profile_action" model="ir.actions.act_window">
<field name="name">Sale Elaboration Profiles</field>
<field name="type">ir.actions.act_window</field>
<field name="res_model">product.elaboration.profile</field>
<field name="view_mode">list,form</field>
</record>
<menuitem
id="menu_sale_elaboration_root"
name="Elaborations"
parent="sale.menu_sale_config"
sequence="60"
/>
<menuitem
id="menu_sale_elaboration_profile"
action="sale_elaboration_profile_action"
parent="menu_sale_elaboration_root"
sequence="10"
/>
</odoo>

View File

@@ -0,0 +1,86 @@
<?xml version="1.0" encoding="utf-8" ?>
<!-- Copyright 2018 Tecnativa - Sergio Teruel
Copyright 2019 Tecnativa - Pedro M. Baeza
License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl). -->
<odoo>
<record id="report_elaboration_view_tree" model="ir.ui.view">
<field name="name">Elaborations</field>
<field name="model">sale.order.line</field>
<field name="arch" type="xml">
<list create="false">
<field name="date_order" />
<field name="scheduled_date" />
<field name="order_id" />
<field name="salesman_id" />
<field name="order_partner_id" />
<field name="product_id" />
<field name="elaboration_ids" widget="many2many_tags" />
<field name="elaboration_note" />
<field name="product_uom_qty" />
<field name="product_uom" />
</list>
</field>
</record>
<record id="view_sales_order_line_filter" model="ir.ui.view">
<field name="model">sale.order.line</field>
<field name="inherit_id" ref="sale.view_sales_order_line_filter" />
<field name="arch" type="xml">
<field name="product_id" position="after">
<separator />
<field
name="date_order"
filter_domain="[('date_order','&gt;=', self)]"
string="After Date"
/>
<field name="elaboration_ids" />
<field name="elaboration_note" />
<filter
string="Is Elaboration"
domain="['|', ('elaboration_ids', '!=', False), ('elaboration_note', '!=', '')]"
name="is_elaboration"
/>
<separator />
<filter
string="Is Prepared"
domain="[('is_prepared', '=', True)]"
name="is_prepared"
/>
<filter
string="Is Not Prepared"
domain="[('is_prepared', '=', False)]"
name="is_not_prepared"
/>
<separator />
</field>
<group position="inside">
<filter
string="Elaboration"
context="{'group_by':'elaboration_ids'}"
name="elaboration_grouped"
/>
</group>
</field>
</record>
<record id="sale_elaboration_report_action" model="ir.actions.act_window">
<field name="name">Sale Elaboration Report</field>
<field name="type">ir.actions.act_window</field>
<field name="res_model">sale.order.line</field>
<field name="view_mode">list,pivot</field>
<field name="domain">[('state', '=', 'sale')]</field>
<field name="context">{'search_default_is_elaboration':1}</field>
<field name="search_view_id" ref="view_sales_order_line_filter" />
</record>
<menuitem
id="menu_sale_elaboration_report"
action="sale_elaboration_report_action"
parent="sale.menu_sale_report"
sequence="60"
/>
<!-- Allow inventory users to access to elaboration report -->
<menuitem
id="menu_stock_sale_elaboration_report"
action="sale_elaboration_report_action"
parent="stock.menu_warehouse_report"
sequence="160"
/>
</odoo>

View File

@@ -0,0 +1,96 @@
<?xml version="1.0" encoding="utf-8" ?>
<!-- Copyright 2018 Tecnativa - Sergio Teruel
License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl). -->
<odoo>
<record id="elaboration_view_form" model="ir.ui.view">
<field name="name">Elaborations</field>
<field name="model">product.elaboration</field>
<field name="arch" type="xml">
<form string="Elaborations">
<sheet>
<widget
name="web_ribbon"
title="Archived"
bg_color="bg-danger"
invisible="active"
/>
<field name="active" invisible="1" />
<group>
<field name="code" />
<field name="name" />
<field
name="product_id"
context="{'default_is_elaboration': True, 'default_detailed_type': 'service'}"
/>
</group>
<group>
<field
name="route_ids"
widget="many2many_tags"
groups="stock.group_adv_location"
options="{'no_create': True}"
/>
</group>
</sheet>
</form>
</field>
</record>
<record id="elaboration_view_tree" model="ir.ui.view">
<field name="name">Elaborations</field>
<field name="model">product.elaboration</field>
<field name="arch" type="xml">
<list multi_edit="1" editable="top">
<field name="code" />
<field name="name" />
<field
name="product_id"
context="{'default_is_elaboration': True, 'default_detailed_type': 'service'}"
/>
<field
name="route_ids"
widget="many2many_tags"
groups="stock.group_adv_location"
options="{'no_create': True}"
/>
<field name="profile_ids" widget="many2many_tags" optional="hide" />
<field name="active" widget="boolean_toggle" />
</list>
</field>
</record>
<record id="elaboration_view_search" model="ir.ui.view">
<field name="name">Elaborations</field>
<field name="model">product.elaboration</field>
<field name="arch" type="xml">
<search string="Elaborations Search">
<field name="name" string="Elaboration" />
<field name="product_id" />
<separator />
<filter
name="archived"
string="Archived"
domain="[('active', '=', False)]"
/>
<group expand="0" string="Group By">
<filter
string="Product"
name="product_id"
context="{'group_by': 'product_id'}"
/>
</group>
</search>
</field>
</record>
<record id="sale_elaboration_action" model="ir.actions.act_window">
<field name="name">Sale Elaboration</field>
<field name="type">ir.actions.act_window</field>
<field name="res_model">product.elaboration</field>
<field name="view_mode">list</field>
<field name="search_view_id" ref="elaboration_view_search" />
</record>
<menuitem
id="menu_sale_elaboration"
action="sale_elaboration_action"
parent="menu_sale_elaboration_root"
sequence="20"
/>
</odoo>

View File

@@ -0,0 +1,93 @@
<?xml version="1.0" encoding="utf-8" ?>
<!-- Copyright 2018 Tecnativa - Sergio Teruel
Copyright 2019 Tecnativa - Pedro M. Baeza
License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl). -->
<odoo>
<record id="view_order_form" model="ir.ui.view">
<field name="name">Sale Elaboration</field>
<field name="model">sale.order</field>
<field name="inherit_id" ref="sale.view_order_form" />
<field name="arch" type="xml">
<xpath expr="//field[@name='order_line']/form/group" position="inside">
<group string="Elaborations" name="elaboration">
<field name="elaboration_profile_id" invisible="1" />
<field
name="elaboration_ids"
widget="many2many_tags"
readonly="not product_updatable or parent.state in ('done', 'cancel')"
domain="elaboration_profile_id and [('profile_ids', 'in', [elaboration_profile_id])] or []"
/>
<field
name="elaboration_note"
readonly="not product_updatable or parent.state in ('done', 'cancel')"
/>
<field
name="elaboration_price_unit"
readonly="1"
widget="monetary"
invisible="not elaboration_ids"
/>
</group>
</xpath>
<xpath
expr="//field[@name='order_line']/list//field[@name='price_unit']"
position="after"
>
<field name="elaboration_profile_id" column_invisible="1" />
<field
name="elaboration_ids"
widget="many2many_tags"
readonly="not product_updatable or parent.state in ('done', 'cancel')"
domain="elaboration_profile_id and [('profile_ids', 'in', [elaboration_profile_id])] or []"
optional="show"
/>
<field
name="elaboration_note"
readonly="not product_updatable or parent.state in ('done', 'cancel')"
optional="show"
/>
<field
name="elaboration_price_unit"
readonly="1"
widget="monetary"
optional="hide"
/>
</xpath>
<xpath
expr="//field[@name='order_line']/kanban//field[@name='currency_id']"
position="after"
>
<field name="elaboration_ids" />
<field name="elaboration_note" />
<field name="elaboration_price_unit" />
</xpath>
<xpath
expr="//field[@name='order_line']/kanban//field[@name='price_unit']/.."
position="after"
>
<t t-if="record.elaboration_ids.raw_value.length gt 0">
<div>
Elaboration price: <field
name="elaboration_price_unit"
widget="monetary"
/>
</div>
</t>
</xpath>
<xpath
expr="//field[@name='order_line']/kanban//field[@name='discount']/../.."
position="after"
>
<t t-if="record.elaboration_ids.raw_value.length gt 0">
<div class="row mt8">
<div class="col-12">
<strong>
<field name="elaboration_ids" widget="many2many_tags" />
</strong>
</div>
</div>
</t>
</xpath>
</field>
</record>
</odoo>

View File

@@ -0,0 +1,53 @@
<?xml version="1.0" encoding="utf-8" ?>
<!-- Copyright 2023 Tecnativa - Sergio Teruel
License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl). -->
<odoo>
<record id="view_stock_move_line_operation_tree" model="ir.ui.view">
<field name="model">stock.move.line</field>
<field name="inherit_id" ref="stock.view_stock_move_line_operation_tree" />
<field name="arch" type="xml">
<field name="product_uom_id" position="after">
<field
name="elaboration_ids"
widget="many2many_tags"
options="{'no_create': True}"
optional="hide"
/>
<field name="elaboration_note" optional="hide" />
</field>
</field>
</record>
<record id="view_stock_move_line_detailed_operation_tree" model="ir.ui.view">
<field name="model">stock.move.line</field>
<field
name="inherit_id"
ref="stock.view_stock_move_line_detailed_operation_tree"
/>
<field name="arch" type="xml">
<field name="product_uom_id" position="after">
<field
name="elaboration_ids"
widget="many2many_tags"
options="{'no_create': True}"
optional="hide"
/>
<field name="elaboration_note" optional="hide" />
</field>
</field>
</record>
<record id="view_move_line_tree_detailed" model="ir.ui.view">
<field name="model">stock.move.line</field>
<field name="inherit_id" ref="stock.view_move_line_tree_detailed" />
<field name="arch" type="xml">
<field name="product_uom_id" position="after">
<field
name="elaboration_ids"
widget="many2many_tags"
options="{'no_create': True}"
optional="hide"
/>
<field name="elaboration_note" optional="hide" />
</field>
</field>
</record>
</odoo>

View File

@@ -0,0 +1,28 @@
<?xml version="1.0" encoding="utf-8" ?>
<!-- Copyright 2023 Tecnativa - Sergio Teruel
License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl). -->
<odoo>
<record id="view_picking_form" model="ir.ui.view">
<field name="model">stock.picking</field>
<field name="inherit_id" ref="stock.view_picking_form" />
<field name="arch" type="xml">
<xpath
expr="//field[@name='move_ids_without_package']/list/field[@name='picked']"
position="before"
>
<field
name="elaboration_ids"
widget="many2many_tags"
options="{'no_create': True}"
readonly="not is_initial_demand_editable"
optional="show"
/>
<field
name="elaboration_note"
readonly="not is_initial_demand_editable"
optional="show"
/>
</xpath>
</field>
</record>
</odoo>