Initial commit: OCA Workflow Process packages (456 packages)

This commit is contained in:
Ernad Husremovic 2025-08-29 15:43:00 +02:00
commit d366e42934
18799 changed files with 1284507 additions and 0 deletions

View file

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

View file

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

View file

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

View file

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

View file

@ -0,0 +1,5 @@
# Dependencies
This addon depends on:
- [sale_stock](../../odoo-bringout-oca-ocb-sale_stock)

View file

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

View file

@ -0,0 +1,7 @@
# Install
```bash
pip install odoo-bringout-oca-sale-workflow-sale_elaboration"
# or
uv pip install odoo-bringout-oca-sale-workflow-sale_elaboration"
```

View file

@ -0,0 +1,24 @@
# Models
Detected core models and extensions in sale_elaboration.
```mermaid
classDiagram
class product_elaboration
class product_elaboration_mixin
class product_elaboration_profile
class sale_order_line
class stock_move
class product_category
class product_product
class product_template
class res_config_settings
class sale_order
class stock_move_line
class stock_picking
class stock_rule
```
Notes
- Classes show model technical names; fields omitted for brevity.
- Items listed under _inherit are extensions of existing models.

View file

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

View file

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

View file

@ -0,0 +1,42 @@
# Security
Access control and security definitions in sale_elaboration.
## Access Control Lists (ACLs)
Model access permissions defined in:
- **[ir.model.access.csv](../sale_elaboration/security/ir.model.access.csv)**
- 5 model access rules
## Record Rules
Row-level security rules defined in:
## Security Groups & Configuration
Security groups and permissions defined in:
- **[security.xml](../sale_elaboration/security/security.xml)**
- 2 security groups defined
```mermaid
graph TB
subgraph "Security Layers"
A[Users] --> B[Groups]
B --> C[Access Control Lists]
C --> D[Models]
B --> E[Record Rules]
E --> F[Individual Records]
end
```
Security files overview:
- **[ir.model.access.csv](../sale_elaboration/security/ir.model.access.csv)**
- Model access permissions (CRUD rights)
- **[security.xml](../sale_elaboration/security/security.xml)**
- Security groups, categories, and XML-based rules
Notes
- Access Control Lists define which groups can access which models
- Record Rules provide row-level security (filter records by user/group)
- Security groups organize users and define permission sets
- All security is enforced at the ORM level by Odoo

View file

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

View file

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

View file

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

View file

@ -0,0 +1,42 @@
[project]
name = "odoo-bringout-oca-sale-workflow-sale_elaboration"
version = "16.0.0"
description = "Sale Elaboration - Set an elaboration for any sale line"
authors = [
{ name = "Ernad Husremovic", email = "hernad@bring.out.ba" }
]
dependencies = [
"odoo-bringout-oca-sale-workflow-sale_stock>=16.0.0",
"requests>=2.25.1"
]
readme = "README.md"
requires-python = ">= 3.11"
classifiers = [
"Development Status :: 5 - Production/Stable",
"Intended Audience :: Developers",
"License :: OSI Approved :: GNU Lesser General Public License v3 (LGPLv3)",
"Programming Language :: Python :: 3",
"Programming Language :: Python :: 3.11",
"Programming Language :: Python :: 3.12",
"Topic :: Office/Business",
]
[project.urls]
homepage = "https://github.com/bringout/0"
repository = "https://github.com/bringout/0"
[build-system]
requires = ["hatchling"]
build-backend = "hatchling.build"
[tool.hatch.metadata]
allow-direct-references = true
[tool.hatch.build.targets.wheel]
packages = ["sale_elaboration"]
[tool.rye]
managed = true
dev-dependencies = [
"pytest>=8.4.1",
]

View file

@ -0,0 +1,153 @@
.. 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:608310180abd8511dca43e710cf0a9dd22ec1223c812347c69b53a89a13831c9
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
.. |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/16.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-16-0/sale-workflow-16-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=16.0
:alt: Try me on Runboat
|badge1| |badge2| |badge3| |badge4| |badge5|
This module extends the functionality of sales orders to allow to set an
elaboration on lines that will add an extra order line with an elaboration
product linked to it when the delivery order is validated.
An **elaboration** is a process that needs to be done over the product, usually
on picking/handling phase. It doesn't modify too much the product for needing
an specific product, but it adds a surcharge on the final price.
**Table of contents**
.. contents::
:local:
Configuration
=============
To configure this module you need to:
#. Go to *Sale > Configuration > Products > Sale Elaboration*.
#. Create a new record.
#. Set a product linked to the elaboration.
#. Also you can select a route to procure this elaboration.
#. 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 configure elaboration profiles as well. These profiles are a set of elaborations
that are available for chosen products or categories. When the salesman chooses the
elaboration in sales line, only those from the set for that product will be available.
To set the profile globally for a product category:
#. Go to *Inventory > Configuration > Product Categories* and choose one.
#. In the **Logistics** sections, you can set the desired **Elaboration profile**.
If you want to set an specific elaboration profile for a product:
#. Go to *Inventory > Products > Products* and choose one.
#. In the **Sales** tab, you'll find an **Elaboration** section where you can set the
**Elaboration profile** for that specific product.
Usage
=====
#. Go to *Sale > Quotations*.
#. Create a sales order.
#. Add a new line.
#. Select an elaboration in the line.
#. Confirm the sales order.
#. Go to the picking created by this sales order and validate it.
#. Print Delivery Slip and Picking Operations.
#. 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:%2016.0%0A%0A**Steps%20to%20reproduce**%0A-%20...%0A%0A**Current%20behavior**%0A%0A**Expected%20behavior**>`_.
Do not contact contributors directly about support or help with technical issues.
Credits
=======
Authors
~~~~~~~
* 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/16.0/sale_elaboration>`_ project on GitHub.
You are welcome to contribute. To learn how please visit https://odoo-community.org/page/Contribute.

View file

@ -0,0 +1,3 @@
# License 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,33 @@
# Copyright 2018 Tecnativa - Sergio Teruel
# License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl).
{
"name": "Sale Elaboration",
"summary": "Set an elaboration for any sale line",
"version": "16.0.1.8.0",
"development_status": "Production/Stable",
"category": "Sale",
"website": "https://github.com/OCA/sale-workflow",
"author": "Tecnativa, Odoo Community Association (OCA)",
"license": "AGPL-3",
"application": False,
"installable": True,
"depends": ["sale_stock"],
"data": [
"security/ir.model.access.csv",
"security/security.xml",
"views/product_views.xml",
"views/res_config_settings_views.xml",
"views/sale_elaboration_profile_views.xml",
"views/sale_elaboration_views.xml",
"views/sale_order_views.xml",
"views/sale_elaboration_report_views.xml",
"views/stock_move_line_views.xml",
"views/stock_picking_views.xml",
"reports/report_base.xml",
"reports/report_deliveryslip.xml",
"reports/report_picking_operations.xml",
"views/product_category_views.xml",
],
"pre_init_hook": "pre_init_hook",
"maintainers": ["CarlosRoca13", "rafaelbn", "sergio-teruel", "yajo"],
}

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(cr):
"""Create computed columns if not exists when the module is instelled"""
cr.execute(
"""
ALTER TABLE sale_order_line
ADD COLUMN IF NOT EXISTS is_elaboration BOOLEAN;
"""
)
cr.execute(
"""
ALTER TABLE sale_order_line ADD COLUMN IF NOT EXISTS elaboration_note VARCHAR;
"""
)

View file

@ -0,0 +1,342 @@
# Translation of Odoo Server.
# This file contains the translation of the following modules:
# * sale_elaboration
#
msgid ""
msgstr ""
"Project-Id-Version: Odoo Server 16.0\n"
"Report-Msgid-Bugs-To: \n"
"Last-Translator: \n"
"Language-Team: \n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: \n"
"Plural-Forms: \n"
#. module: sale_elaboration
#: model:ir.model.fields,field_description:sale_elaboration.field_product_elaboration__active
#: model:ir.model.fields,field_description:sale_elaboration.field_product_elaboration_profile__active
msgid "Active"
msgstr "Aktivan"
#. module: sale_elaboration
#: model_terms:ir.ui.view,arch_db:sale_elaboration.view_sales_order_line_filter
msgid "After Date"
msgstr "After Datum"
#. 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 "Arhivirano"
#. module: sale_elaboration
#: model:ir.model.constraint,message:sale_elaboration.constraint_product_elaboration_code_uniq
msgid "Code must be unique!"
msgstr "Code mora biti unique!"
#. module: sale_elaboration
#: model:ir.model,name:sale_elaboration.model_res_config_settings
msgid "Config Settings"
msgstr "Postavke"
#. 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 "Kreirao"
#. 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 "Kreirano"
#. 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 "Datum"
#. 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 "Display Elaboration notes on Isporuka Slips"
#. 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 "Display Elaboration notes on Preuzimanje Operations"
#. 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 "Prikazani naziv"
#. 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 "Dummy field to be able to find prepared lines"
#. module: sale_elaboration
#: model:ir.model.fields,field_description:sale_elaboration.field_sale_order_line__elaboration_price_unit
msgid "Elab. Price"
msgstr "Elab. Cijena"
#. module: sale_elaboration
#: model_terms:ir.ui.view,arch_db:sale_elaboration.elaboration_view_search
#: model_terms:ir.ui.view,arch_db:sale_elaboration.view_sales_order_line_filter
msgid "Elaboration"
msgstr "Elaboration"
#. 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 "Elaboration Note"
#. 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 "Elaboration Profile"
#. 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 "Elaboration notes will appear on the isporuka slip"
#. 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 "Elaboration notes will appear on the preuzimanje operations report"
#. module: sale_elaboration
#: model_terms:ir.ui.view,arch_db:sale_elaboration.view_order_form
msgid "Elaboration price:"
msgstr "Elaboration price:"
#. 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 "Elaborations"
#. module: sale_elaboration
#: model_terms:ir.ui.view,arch_db:sale_elaboration.elaboration_view_search
msgid "Elaborations Search"
msgstr "Elaborations Search"
#. module: sale_elaboration
#: model_terms:ir.ui.view,arch_db:sale_elaboration.elaboration_view_search
msgid "Group By"
msgstr "Grupiši po"
#. 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 "Include elaboration notes on isporuka slip"
#. module: sale_elaboration
#: model:res.groups,name:sale_elaboration.group_elaboration_note_on_picking_operations
msgid "Include elaboration notes on picking operations"
msgstr "Include elaboration notes on preuzimanje operations"
#. 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 "Is Elaboration"
#. module: sale_elaboration
#: model_terms:ir.ui.view,arch_db:sale_elaboration.view_sales_order_line_filter
msgid "Is Not Prepared"
msgstr "Is Not Prepared"
#. 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 "Is Prepared"
#. 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____last_update
#: model:ir.model.fields,field_description:sale_elaboration.field_product_elaboration_profile____last_update
msgid "Last Modified on"
msgstr "Zadnje mijenjano"
#. 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 "Zadnji ažurirao"
#. 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 "Zadnje ažurirano"
#. 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 "Naziv:"
#. module: sale_elaboration
#: model:ir.model.constraint,message:sale_elaboration.constraint_product_elaboration_name_uniq
msgid "Name must be unique!"
msgstr "Name mora biti unique!"
#. 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 "Artikal"
#. module: sale_elaboration
#: model:ir.model,name:sale_elaboration.model_product_category
msgid "Product Category"
msgstr "Kategorija proizvoda"
#. module: sale_elaboration
#: model:ir.model,name:sale_elaboration.model_product_elaboration_mixin
msgid "Product Elaboration Mixin"
msgstr "Proizvod Elaboration Mixin"
#. module: sale_elaboration
#: model:ir.model,name:sale_elaboration.model_stock_move_line
msgid "Product Moves (Stock Move Line)"
msgstr "Skladišna kretanja proizvoda(stavke)"
#. module: sale_elaboration
#: model:ir.model,name:sale_elaboration.model_product_product
msgid "Product Variant"
msgstr "Varijanta proizvoda"
#. module: sale_elaboration
#: model:ir.model,name:sale_elaboration.model_product_elaboration_profile
msgid "Product elaboration profiles"
msgstr "Proizvod elaboration profiles"
#. module: sale_elaboration
#: model:ir.model,name:sale_elaboration.model_product_elaboration
msgid "Product elaborations"
msgstr "Proizvod elaborations"
#. module: sale_elaboration
#: model:ir.model.fields,field_description:sale_elaboration.field_product_elaboration__profile_ids
msgid "Profile"
msgstr "Profil"
#. module: sale_elaboration
#: model:ir.model.fields,field_description:sale_elaboration.field_sale_order_line__route_id
msgid "Route"
msgstr "Smjer"
#. module: sale_elaboration
#: model:ir.model.fields,field_description:sale_elaboration.field_product_elaboration__route_ids
msgid "Routes"
msgstr "Rute"
#. 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 "Prodaja Elaboration"
#. 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 "Prodaja Elaboration Profiles"
#. 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 "Prodaja Elaboration Report"
#. module: sale_elaboration
#: model:ir.model,name:sale_elaboration.model_sale_order
msgid "Sales Order"
msgstr "Prodajni nalog"
#. module: sale_elaboration
#: model:ir.model,name:sale_elaboration.model_sale_order_line
msgid "Sales Order Line"
msgstr "Stavka prodajne narudžbe"
#. 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 "Kratka šifra"
#. module: sale_elaboration
#: model:ir.model,name:sale_elaboration.model_stock_move
msgid "Stock Move"
msgstr "Skladišno kretanje"
#. module: sale_elaboration
#: model:ir.model,name:sale_elaboration.model_stock_rule
msgid "Stock Rule"
msgstr "Skladišno pravilo"
#. module: sale_elaboration
#: model:ir.model,name:sale_elaboration.model_stock_picking
msgid "Transfer"
msgstr "Prijenos"
#. module: sale_elaboration
#. odoo-python
#: code:addons/sale_elaboration/models/sale_order.py:0
#, python-format
msgid "Unsupported operator %s for searching on is_prepared"
msgstr "Unsupported operator %s for searching on is_prepared"

View file

@ -0,0 +1,353 @@
# 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:ir.model.constraint,message:sale_elaboration.constraint_product_elaboration_code_uniq
msgid "Code must be unique!"
msgstr ""
#. module: sale_elaboration
#: model:ir.model,name:sale_elaboration.model_res_config_settings
msgid "Config Settings"
msgstr ""
#. module: sale_elaboration
#: model:ir.model.fields,field_description:sale_elaboration.field_product_elaboration__create_uid
#: model:ir.model.fields,field_description:sale_elaboration.field_product_elaboration_profile__create_uid
msgid "Created by"
msgstr "Erstellt von"
#. module: sale_elaboration
#: model:ir.model.fields,field_description:sale_elaboration.field_product_elaboration__create_date
#: model:ir.model.fields,field_description:sale_elaboration.field_product_elaboration_profile__create_date
msgid "Created on"
msgstr "Erstellt am"
#. module: sale_elaboration
#: model:ir.model.fields,help:sale_elaboration.field_sale_order_line__date_order
msgid ""
"Creation date of draft/sent orders,\n"
"Confirmation date of confirmed orders."
msgstr ""
#. module: sale_elaboration
#: model:ir.model.fields,field_description:sale_elaboration.field_sale_order_line__date_order
msgid "Date"
msgstr ""
#. module: sale_elaboration
#: model:ir.model.fields,field_description:sale_elaboration.field_res_config_settings__group_elaboration_note_on_delivery_slip
msgid "Display Elaboration notes on Delivery Slips"
msgstr ""
#. module: sale_elaboration
#: model:ir.model.fields,field_description:sale_elaboration.field_res_config_settings__group_elaboration_note_on_picking_operations
msgid "Display Elaboration notes on Picking Operations"
msgstr ""
#. module: sale_elaboration
#: model:ir.model.fields,field_description:sale_elaboration.field_product_elaboration__display_name
#: model:ir.model.fields,field_description:sale_elaboration.field_product_elaboration_profile__display_name
msgid "Display Name"
msgstr "Anzeigename"
#. module: sale_elaboration
#: model:ir.model.fields,help:sale_elaboration.field_sale_order_line__is_prepared
msgid "Dummy field to be able to find prepared lines"
msgstr ""
#. module: sale_elaboration
#: model:ir.model.fields,field_description:sale_elaboration.field_sale_order_line__elaboration_price_unit
msgid "Elab. Price"
msgstr ""
#. module: sale_elaboration
#: model_terms:ir.ui.view,arch_db:sale_elaboration.elaboration_view_search
#: model_terms:ir.ui.view,arch_db:sale_elaboration.view_sales_order_line_filter
msgid "Elaboration"
msgstr ""
#. module: sale_elaboration
#: model:ir.model.fields,field_description:sale_elaboration.field_product_elaboration_mixin__elaboration_note
#: model:ir.model.fields,field_description:sale_elaboration.field_sale_order_line__elaboration_note
#: model:ir.model.fields,field_description:sale_elaboration.field_stock_move__elaboration_note
#: model:ir.model.fields,field_description:sale_elaboration.field_stock_move_line__elaboration_note
msgid "Elaboration Note"
msgstr ""
#. module: sale_elaboration
#: model:ir.model.fields,field_description:sale_elaboration.field_product_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____last_update
#: model:ir.model.fields,field_description:sale_elaboration.field_product_elaboration_profile____last_update
msgid "Last Modified on"
msgstr "Zuletzt geändert am"
#. module: sale_elaboration
#: model:ir.model.fields,field_description:sale_elaboration.field_product_elaboration__write_uid
#: model:ir.model.fields,field_description:sale_elaboration.field_product_elaboration_profile__write_uid
msgid "Last Updated by"
msgstr "Zuletzt aktualisiert von"
#. module: sale_elaboration
#: model:ir.model.fields,field_description:sale_elaboration.field_product_elaboration__write_date
#: model:ir.model.fields,field_description:sale_elaboration.field_product_elaboration_profile__write_date
msgid "Last Updated on"
msgstr "Zuletzt aktualisiert am"
#. module: sale_elaboration
#: model:ir.model.fields,field_description:sale_elaboration.field_product_elaboration__name
#: model:ir.model.fields,field_description:sale_elaboration.field_product_elaboration_profile__name
msgid "Name"
msgstr "Bezeichnung"
#. module: sale_elaboration
#: model:ir.model.constraint,message:sale_elaboration.constraint_product_elaboration_name_uniq
msgid "Name must be unique!"
msgstr ""
#. module: sale_elaboration
#: model:ir.model,name:sale_elaboration.model_product_template
#: model:ir.model.fields,field_description:sale_elaboration.field_product_elaboration__product_id
#: model_terms:ir.ui.view,arch_db:sale_elaboration.elaboration_view_search
msgid "Product"
msgstr "Produkt"
#. module: sale_elaboration
#: model:ir.model,name:sale_elaboration.model_product_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
#, python-format
msgid "Unsupported operator %s for searching on is_prepared"
msgstr ""
#~ msgid "Product Template"
#~ msgstr "Produktvorlage"
#~ msgid "Quotation"
#~ msgstr "Angebot"

View file

@ -0,0 +1,358 @@
# 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:ir.model.constraint,message:sale_elaboration.constraint_product_elaboration_code_uniq
msgid "Code must be unique!"
msgstr "El código debe ser único!"
#. module: sale_elaboration
#: model:ir.model,name:sale_elaboration.model_res_config_settings
msgid "Config Settings"
msgstr "Ajustes de configuración"
#. module: sale_elaboration
#: model:ir.model.fields,field_description:sale_elaboration.field_product_elaboration__create_uid
#: model:ir.model.fields,field_description:sale_elaboration.field_product_elaboration_profile__create_uid
msgid "Created by"
msgstr "Creado por"
#. module: sale_elaboration
#: model:ir.model.fields,field_description:sale_elaboration.field_product_elaboration__create_date
#: model:ir.model.fields,field_description:sale_elaboration.field_product_elaboration_profile__create_date
msgid "Created on"
msgstr "Creado el"
#. module: sale_elaboration
#: model:ir.model.fields,help:sale_elaboration.field_sale_order_line__date_order
msgid ""
"Creation date of draft/sent orders,\n"
"Confirmation date of confirmed orders."
msgstr ""
"Fecha de creación de las órdenes giradas/enviadas,\n"
"Fecha de confirmación de las órdenes confirmadas."
#. module: sale_elaboration
#: model:ir.model.fields,field_description:sale_elaboration.field_sale_order_line__date_order
msgid "Date"
msgstr "Fecha"
#. module: sale_elaboration
#: model:ir.model.fields,field_description:sale_elaboration.field_res_config_settings__group_elaboration_note_on_delivery_slip
msgid "Display Elaboration notes on Delivery Slips"
msgstr "Mostrar notas de elaboración en los albaranes"
#. module: sale_elaboration
#: model:ir.model.fields,field_description:sale_elaboration.field_res_config_settings__group_elaboration_note_on_picking_operations
msgid "Display Elaboration notes on Picking Operations"
msgstr "Mostrar notas de elaboración en Operaciones de picking"
#. module: sale_elaboration
#: model:ir.model.fields,field_description:sale_elaboration.field_product_elaboration__display_name
#: model:ir.model.fields,field_description:sale_elaboration.field_product_elaboration_profile__display_name
msgid "Display Name"
msgstr "Nombre a mostrar"
#. module: sale_elaboration
#: model:ir.model.fields,help:sale_elaboration.field_sale_order_line__is_prepared
msgid "Dummy field to be able to find prepared lines"
msgstr "Campo ficticio para poder encontrar líneas preparadas"
#. module: sale_elaboration
#: model:ir.model.fields,field_description:sale_elaboration.field_sale_order_line__elaboration_price_unit
msgid "Elab. Price"
msgstr "Precio elab"
#. module: sale_elaboration
#: model_terms:ir.ui.view,arch_db:sale_elaboration.elaboration_view_search
#: model_terms:ir.ui.view,arch_db:sale_elaboration.view_sales_order_line_filter
msgid "Elaboration"
msgstr "Elaboración"
#. module: sale_elaboration
#: model:ir.model.fields,field_description:sale_elaboration.field_product_elaboration_mixin__elaboration_note
#: model:ir.model.fields,field_description:sale_elaboration.field_sale_order_line__elaboration_note
#: model:ir.model.fields,field_description:sale_elaboration.field_stock_move__elaboration_note
#: model:ir.model.fields,field_description:sale_elaboration.field_stock_move_line__elaboration_note
msgid "Elaboration Note"
msgstr "Nota de elaboración"
#. module: sale_elaboration
#: model:ir.model.fields,field_description:sale_elaboration.field_product_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____last_update
#: model:ir.model.fields,field_description:sale_elaboration.field_product_elaboration_profile____last_update
msgid "Last Modified on"
msgstr "Última modificación el"
#. module: sale_elaboration
#: model:ir.model.fields,field_description:sale_elaboration.field_product_elaboration__write_uid
#: model:ir.model.fields,field_description:sale_elaboration.field_product_elaboration_profile__write_uid
msgid "Last Updated by"
msgstr "Última modificación por"
#. module: sale_elaboration
#: model:ir.model.fields,field_description:sale_elaboration.field_product_elaboration__write_date
#: model:ir.model.fields,field_description:sale_elaboration.field_product_elaboration_profile__write_date
msgid "Last Updated on"
msgstr "Última actualización el"
#. module: sale_elaboration
#: model:ir.model.fields,field_description:sale_elaboration.field_product_elaboration__name
#: model:ir.model.fields,field_description:sale_elaboration.field_product_elaboration_profile__name
msgid "Name"
msgstr "Nombre"
#. module: sale_elaboration
#: model:ir.model.constraint,message:sale_elaboration.constraint_product_elaboration_name_uniq
msgid "Name must be unique!"
msgstr "¡El nombre debe ser único!"
#. module: sale_elaboration
#: model:ir.model,name:sale_elaboration.model_product_template
#: model:ir.model.fields,field_description:sale_elaboration.field_product_elaboration__product_id
#: model_terms:ir.ui.view,arch_db:sale_elaboration.elaboration_view_search
msgid "Product"
msgstr "Producto"
#. module: sale_elaboration
#: model:ir.model,name:sale_elaboration.model_product_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
#, python-format
msgid "Unsupported operator %s for searching on is_prepared"
msgstr "Operador %s no soportado para buscar en is_prepared"
#~ msgid "<strong>Elab.</strong>"
#~ msgstr "<strong>elab.</strong>"
#~ msgid "<strong>Elaboration</strong>"
#~ msgstr "<strong>Elaboración</strong>"
#~ msgid "Product Template"
#~ msgstr "Plantilla de producto"

View file

@ -0,0 +1,359 @@
# 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 14:25+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:ir.model.constraint,message:sale_elaboration.constraint_product_elaboration_code_uniq
msgid "Code must be unique!"
msgstr "Il codice deve essere univoco!"
#. module: sale_elaboration
#: model:ir.model,name:sale_elaboration.model_res_config_settings
msgid "Config Settings"
msgstr "Impostazioni configurazione"
#. module: sale_elaboration
#: model:ir.model.fields,field_description:sale_elaboration.field_product_elaboration__create_uid
#: model:ir.model.fields,field_description:sale_elaboration.field_product_elaboration_profile__create_uid
msgid "Created by"
msgstr "Creato da"
#. module: sale_elaboration
#: model:ir.model.fields,field_description:sale_elaboration.field_product_elaboration__create_date
#: model:ir.model.fields,field_description:sale_elaboration.field_product_elaboration_profile__create_date
msgid "Created on"
msgstr "Creato il"
#. module: sale_elaboration
#: model:ir.model.fields,help:sale_elaboration.field_sale_order_line__date_order
msgid ""
"Creation date of draft/sent orders,\n"
"Confirmation date of confirmed orders."
msgstr ""
"Data di creazione degli ordini in bozza/spediti,\n"
"data di conferma degli ordini confermati."
#. module: sale_elaboration
#: model:ir.model.fields,field_description:sale_elaboration.field_sale_order_line__date_order
msgid "Date"
msgstr "Data"
#. module: sale_elaboration
#: model:ir.model.fields,field_description:sale_elaboration.field_res_config_settings__group_elaboration_note_on_delivery_slip
msgid "Display Elaboration notes on Delivery Slips"
msgstr "Visualizza note elaborazione sulle bolle di consegna"
#. module: sale_elaboration
#: model:ir.model.fields,field_description:sale_elaboration.field_res_config_settings__group_elaboration_note_on_picking_operations
msgid "Display Elaboration notes on Picking Operations"
msgstr "Visualizza note elaborazione nell operazioni di prelievo"
#. module: sale_elaboration
#: model:ir.model.fields,field_description:sale_elaboration.field_product_elaboration__display_name
#: model:ir.model.fields,field_description:sale_elaboration.field_product_elaboration_profile__display_name
msgid "Display Name"
msgstr "Nome visualizzato"
#. module: sale_elaboration
#: model:ir.model.fields,help:sale_elaboration.field_sale_order_line__is_prepared
msgid "Dummy field to be able to find prepared lines"
msgstr "Campo di appoggio per poter trovare le righe preparate"
#. module: sale_elaboration
#: model:ir.model.fields,field_description:sale_elaboration.field_sale_order_line__elaboration_price_unit
msgid "Elab. Price"
msgstr "Elab. prezzo"
#. module: sale_elaboration
#: model_terms:ir.ui.view,arch_db:sale_elaboration.elaboration_view_search
#: model_terms:ir.ui.view,arch_db:sale_elaboration.view_sales_order_line_filter
msgid "Elaboration"
msgstr "Elaborazione"
#. module: sale_elaboration
#: model:ir.model.fields,field_description:sale_elaboration.field_product_elaboration_mixin__elaboration_note
#: model:ir.model.fields,field_description:sale_elaboration.field_sale_order_line__elaboration_note
#: model:ir.model.fields,field_description:sale_elaboration.field_stock_move__elaboration_note
#: model:ir.model.fields,field_description:sale_elaboration.field_stock_move_line__elaboration_note
msgid "Elaboration Note"
msgstr "Nota elaborazione"
#. module: sale_elaboration
#: model:ir.model.fields,field_description:sale_elaboration.field_product_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____last_update
#: model:ir.model.fields,field_description:sale_elaboration.field_product_elaboration_profile____last_update
msgid "Last Modified on"
msgstr "Ultima modifica il"
#. module: sale_elaboration
#: model:ir.model.fields,field_description:sale_elaboration.field_product_elaboration__write_uid
#: model:ir.model.fields,field_description:sale_elaboration.field_product_elaboration_profile__write_uid
msgid "Last Updated by"
msgstr "Ultimo aggiornamento di"
#. module: sale_elaboration
#: model:ir.model.fields,field_description:sale_elaboration.field_product_elaboration__write_date
#: model:ir.model.fields,field_description:sale_elaboration.field_product_elaboration_profile__write_date
msgid "Last Updated on"
msgstr "Ultimo aggiornamento il"
#. module: sale_elaboration
#: model:ir.model.fields,field_description:sale_elaboration.field_product_elaboration__name
#: model:ir.model.fields,field_description:sale_elaboration.field_product_elaboration_profile__name
msgid "Name"
msgstr "Nome"
#. module: sale_elaboration
#: model:ir.model.constraint,message:sale_elaboration.constraint_product_elaboration_name_uniq
msgid "Name must be unique!"
msgstr "Il nome deve essere univoco!"
#. module: sale_elaboration
#: model:ir.model,name:sale_elaboration.model_product_template
#: model:ir.model.fields,field_description:sale_elaboration.field_product_elaboration__product_id
#: model_terms:ir.ui.view,arch_db:sale_elaboration.elaboration_view_search
msgid "Product"
msgstr "Prodotto"
#. module: sale_elaboration
#: model:ir.model,name:sale_elaboration.model_product_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
#, python-format
msgid "Unsupported operator %s for searching on is_prepared"
msgstr "Operatore %s non supportato per la ricerca in is_prepared"
#~ msgid "<strong>Elab.</strong>"
#~ msgstr "<strong>Elab.</strong>"
#~ msgid "<strong>Elaboration</strong>"
#~ msgstr "<strong>Elaborazione</strong>"

View file

@ -0,0 +1,349 @@
# 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-04-18 21:45+0000\n"
"Last-Translator: Bosd <c5e2fd43-d292-4c90-9d1f-74ff3436329a@anonaddy.me>\n"
"Language-Team: none\n"
"Language: nl\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 "Actief"
#. module: sale_elaboration
#: model_terms:ir.ui.view,arch_db:sale_elaboration.view_sales_order_line_filter
msgid "After Date"
msgstr "Na Datum"
#. 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 "Gearchiveerd"
#. module: sale_elaboration
#: model:ir.model.constraint,message:sale_elaboration.constraint_product_elaboration_code_uniq
msgid "Code must be unique!"
msgstr "Code moet uniek zijn!"
#. module: sale_elaboration
#: model:ir.model,name:sale_elaboration.model_res_config_settings
msgid "Config Settings"
msgstr "Configuratie-instellingen"
#. 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 "Aangemaakt door"
#. 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 "Aangemaakt op"
#. 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 ""
"Aanmaakdatum van concept/verzonden orders,\n"
"Bevestigingsdatum van bevestigde orders."
#. module: sale_elaboration
#: model:ir.model.fields,field_description:sale_elaboration.field_sale_order_line__date_order
msgid "Date"
msgstr "Datum"
#. 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 "Toon bewerkingsnotities op pakbonnen"
#. 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 "Toon bewerkingsnotities op picklijsten"
#. 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 "Weergavenaam"
#. 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 "Dummy veld om voorbereide regels te kunnen vinden"
#. module: sale_elaboration
#: model:ir.model.fields,field_description:sale_elaboration.field_sale_order_line__elaboration_price_unit
msgid "Elab. Price"
msgstr "Bewerk. Prijs"
#. module: sale_elaboration
#: model_terms:ir.ui.view,arch_db:sale_elaboration.elaboration_view_search
#: model_terms:ir.ui.view,arch_db:sale_elaboration.view_sales_order_line_filter
msgid "Elaboration"
msgstr "Bewerking"
#. 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 "Bewerkingsnotitie"
#. 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 "Bewerkingsprofiel"
#. 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 "Bewerkingsnotities worden weergegeven op de pakbon"
#. 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 "Bewerkingsnotities worden weergegeven op het picklijstenrapport"
#. module: sale_elaboration
#: model_terms:ir.ui.view,arch_db:sale_elaboration.view_order_form
msgid "Elaboration price:"
msgstr "Bewerkingsprijs:"
#. 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 "Bewerkingen"
#. module: sale_elaboration
#: model_terms:ir.ui.view,arch_db:sale_elaboration.elaboration_view_search
msgid "Elaborations Search"
msgstr "Zoekopdracht Bewerkingen"
#. module: sale_elaboration
#: model_terms:ir.ui.view,arch_db:sale_elaboration.elaboration_view_search
msgid "Group By"
msgstr "Groeperen Op"
#. 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 ""
"Indien uitgeschakeld, kunt u de productbewerkingen verbergen zonder ze te "
"verwijderen."
#. module: sale_elaboration
#: model:res.groups,name:sale_elaboration.group_elaboration_note_on_delivery_slip
msgid "Include elaboration notes on delivery slip"
msgstr "Bewerkingsnotities opnemen op de pakbon"
#. module: sale_elaboration
#: model:res.groups,name:sale_elaboration.group_elaboration_note_on_picking_operations
msgid "Include elaboration notes on picking operations"
msgstr "Bewerkingsnotities opnemen op de picklijsten"
#. 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 "Is Bewerking"
#. module: sale_elaboration
#: model_terms:ir.ui.view,arch_db:sale_elaboration.view_sales_order_line_filter
msgid "Is Not Prepared"
msgstr "Is Niet Voorbereid"
#. 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 "Is Voorbereid"
#. 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____last_update
#: model:ir.model.fields,field_description:sale_elaboration.field_product_elaboration_profile____last_update
msgid "Last Modified on"
msgstr "Laatst Gewijzigd Op"
#. 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 "Laatst Bijgewerkt Door"
#. 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 "Laatst Bijgewerkt Op"
#. 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 "Naam"
#. module: sale_elaboration
#: model:ir.model.constraint,message:sale_elaboration.constraint_product_elaboration_name_uniq
msgid "Name must be unique!"
msgstr "Naam moet uniek zijn!"
#. 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 "Product"
#. 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 "Productbewerkingsmixin"
#. module: sale_elaboration
#: model:ir.model,name:sale_elaboration.model_stock_move_line
msgid "Product Moves (Stock Move Line)"
msgstr "Productbewegingen (Voorraadbewegingsregel)"
#. module: sale_elaboration
#: model:ir.model,name:sale_elaboration.model_product_product
msgid "Product Variant"
msgstr "Productvariant"
#. module: sale_elaboration
#: model:ir.model,name:sale_elaboration.model_product_elaboration_profile
msgid "Product elaboration profiles"
msgstr "Productbewerkingsprofielen"
#. module: sale_elaboration
#: model:ir.model,name:sale_elaboration.model_product_elaboration
msgid "Product elaborations"
msgstr "Productbewerkingen"
#. module: sale_elaboration
#: model:ir.model.fields,field_description:sale_elaboration.field_product_elaboration__profile_ids
msgid "Profile"
msgstr "Profiel"
#. module: sale_elaboration
#: model:ir.model.fields,field_description:sale_elaboration.field_sale_order_line__route_id
msgid "Route"
msgstr "Route"
#. module: sale_elaboration
#: model:ir.model.fields,field_description:sale_elaboration.field_product_elaboration__route_ids
msgid "Routes"
msgstr "Routes"
#. 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 "Verkoopbewerking"
#. 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 "Verkoopbewerkingsprofielen"
#. 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 "Verkoopbewerkingsrapport"
#. module: sale_elaboration
#: model:ir.model,name:sale_elaboration.model_sale_order
msgid "Sales Order"
msgstr "Verkooporder"
#. module: sale_elaboration
#: model:ir.model,name:sale_elaboration.model_sale_order_line
msgid "Sales Order Line"
msgstr "Verkooporderregel"
#. 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 "Korte Code"
#. module: sale_elaboration
#: model:ir.model,name:sale_elaboration.model_stock_move
msgid "Stock Move"
msgstr "Voorraadbeweging"
#. module: sale_elaboration
#: model:ir.model,name:sale_elaboration.model_stock_rule
msgid "Stock Rule"
msgstr "Voorraadregel"
#. module: sale_elaboration
#: model:ir.model,name:sale_elaboration.model_stock_picking
msgid "Transfer"
msgstr "Overdracht"
#. module: sale_elaboration
#. odoo-python
#: code:addons/sale_elaboration/models/sale_order.py:0
#, python-format
msgid "Unsupported operator %s for searching on is_prepared"
msgstr "Niet-ondersteunde operator %s voor het zoeken op is_prepared"

View file

@ -0,0 +1,342 @@
# Translation of Odoo Server.
# This file contains the translation of the following modules:
# * sale_elaboration
#
msgid ""
msgstr ""
"Project-Id-Version: Odoo Server 16.0\n"
"Report-Msgid-Bugs-To: \n"
"Last-Translator: \n"
"Language-Team: \n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: \n"
"Plural-Forms: \n"
#. module: sale_elaboration
#: model:ir.model.fields,field_description:sale_elaboration.field_product_elaboration__active
#: model:ir.model.fields,field_description:sale_elaboration.field_product_elaboration_profile__active
msgid "Active"
msgstr ""
#. module: sale_elaboration
#: model_terms:ir.ui.view,arch_db:sale_elaboration.view_sales_order_line_filter
msgid "After Date"
msgstr ""
#. module: sale_elaboration
#: model_terms:ir.ui.view,arch_db:sale_elaboration.elaboration_view_form
#: model_terms:ir.ui.view,arch_db:sale_elaboration.elaboration_view_search
#: model_terms:ir.ui.view,arch_db:sale_elaboration.product_elaboration_profile_form_view
msgid "Archived"
msgstr ""
#. module: sale_elaboration
#: model:ir.model.constraint,message:sale_elaboration.constraint_product_elaboration_code_uniq
msgid "Code must be unique!"
msgstr ""
#. module: sale_elaboration
#: model:ir.model,name:sale_elaboration.model_res_config_settings
msgid "Config Settings"
msgstr ""
#. module: sale_elaboration
#: model:ir.model.fields,field_description:sale_elaboration.field_product_elaboration__create_uid
#: model:ir.model.fields,field_description:sale_elaboration.field_product_elaboration_profile__create_uid
msgid "Created by"
msgstr ""
#. module: sale_elaboration
#: model:ir.model.fields,field_description:sale_elaboration.field_product_elaboration__create_date
#: model:ir.model.fields,field_description:sale_elaboration.field_product_elaboration_profile__create_date
msgid "Created on"
msgstr ""
#. module: sale_elaboration
#: model:ir.model.fields,help:sale_elaboration.field_sale_order_line__date_order
msgid ""
"Creation date of draft/sent orders,\n"
"Confirmation date of confirmed orders."
msgstr ""
#. module: sale_elaboration
#: model:ir.model.fields,field_description:sale_elaboration.field_sale_order_line__date_order
msgid "Date"
msgstr ""
#. module: sale_elaboration
#: model:ir.model.fields,field_description:sale_elaboration.field_res_config_settings__group_elaboration_note_on_delivery_slip
msgid "Display Elaboration notes on Delivery Slips"
msgstr ""
#. module: sale_elaboration
#: model:ir.model.fields,field_description:sale_elaboration.field_res_config_settings__group_elaboration_note_on_picking_operations
msgid "Display Elaboration notes on Picking Operations"
msgstr ""
#. module: sale_elaboration
#: model:ir.model.fields,field_description:sale_elaboration.field_product_elaboration__display_name
#: model:ir.model.fields,field_description:sale_elaboration.field_product_elaboration_profile__display_name
msgid "Display Name"
msgstr ""
#. module: sale_elaboration
#: model:ir.model.fields,help:sale_elaboration.field_sale_order_line__is_prepared
msgid "Dummy field to be able to find prepared lines"
msgstr ""
#. module: sale_elaboration
#: model:ir.model.fields,field_description:sale_elaboration.field_sale_order_line__elaboration_price_unit
msgid "Elab. Price"
msgstr ""
#. module: sale_elaboration
#: model_terms:ir.ui.view,arch_db:sale_elaboration.elaboration_view_search
#: model_terms:ir.ui.view,arch_db:sale_elaboration.view_sales_order_line_filter
msgid "Elaboration"
msgstr ""
#. module: sale_elaboration
#: model:ir.model.fields,field_description:sale_elaboration.field_product_elaboration_mixin__elaboration_note
#: model:ir.model.fields,field_description:sale_elaboration.field_sale_order_line__elaboration_note
#: model:ir.model.fields,field_description:sale_elaboration.field_stock_move__elaboration_note
#: model:ir.model.fields,field_description:sale_elaboration.field_stock_move_line__elaboration_note
msgid "Elaboration Note"
msgstr ""
#. module: sale_elaboration
#: model:ir.model.fields,field_description:sale_elaboration.field_product_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____last_update
#: model:ir.model.fields,field_description:sale_elaboration.field_product_elaboration_profile____last_update
msgid "Last Modified on"
msgstr ""
#. module: sale_elaboration
#: model:ir.model.fields,field_description:sale_elaboration.field_product_elaboration__write_uid
#: model:ir.model.fields,field_description:sale_elaboration.field_product_elaboration_profile__write_uid
msgid "Last Updated by"
msgstr ""
#. module: sale_elaboration
#: model:ir.model.fields,field_description:sale_elaboration.field_product_elaboration__write_date
#: model:ir.model.fields,field_description:sale_elaboration.field_product_elaboration_profile__write_date
msgid "Last Updated on"
msgstr ""
#. module: sale_elaboration
#: model:ir.model.fields,field_description:sale_elaboration.field_product_elaboration__name
#: model:ir.model.fields,field_description:sale_elaboration.field_product_elaboration_profile__name
msgid "Name"
msgstr ""
#. module: sale_elaboration
#: model:ir.model.constraint,message:sale_elaboration.constraint_product_elaboration_name_uniq
msgid "Name must be unique!"
msgstr ""
#. module: sale_elaboration
#: model:ir.model,name:sale_elaboration.model_product_template
#: model:ir.model.fields,field_description:sale_elaboration.field_product_elaboration__product_id
#: model_terms:ir.ui.view,arch_db:sale_elaboration.elaboration_view_search
msgid "Product"
msgstr ""
#. module: sale_elaboration
#: model:ir.model,name:sale_elaboration.model_product_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
#, python-format
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,13 @@
# 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,55 @@
# 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",
check_company=True,
)
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 recs.name_get()

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,44 @@
# 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(ProductTemplate, self).create(vals_list)
# This is needed to set given values to first variant after creation
for template, vals in zip(templates, vals_list):
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"] = "{} - {}".format(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_done
)
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,25 @@
To configure this module you need to:
#. Go to *Sale > Configuration > Products > Sale Elaboration*.
#. Create a new record.
#. Set a product linked to the elaboration.
#. Also you can select a route to procure this elaboration.
#. 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 configure elaboration profiles as well. These profiles are a set of elaborations
that are available for chosen products or categories. When the salesman chooses the
elaboration in sales line, only those from the set for that product will be available.
To set the profile globally for a product category:
#. Go to *Inventory > Configuration > Product Categories* and choose one.
#. In the **Logistics** sections, you can set the desired **Elaboration profile**.
If you want to set an specific elaboration profile for a product:
#. Go to *Inventory > Products > Products* and choose one.
#. In the **Sales** tab, you'll find an **Elaboration** section where you can set the
**Elaboration profile** for that specific product.

View file

@ -0,0 +1,9 @@
* `Tecnativa <https://www.tecnativa.com>`_:
* Sergio Teruel
* Pedro M. Baeza
* Carlos Roca
* Ernesto Tejeda
* Eduardo de Miguel (`Moduon <https://www.moduon.team/>`__)
* Jairo Llopis (`Moduon <https://www.moduon.team/>`__)

View file

@ -0,0 +1,7 @@
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.

View file

@ -0,0 +1,9 @@
#. Go to *Sale > Quotations*.
#. Create a sales order.
#. Add a new line.
#. Select an elaboration in the line.
#. Confirm the sales order.
#. Go to the picking created by this sales order and validate it.
#. Print Delivery Slip and Picking Operations.
#. 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,488 @@
<!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:608310180abd8511dca43e710cf0a9dd22ec1223c812347c69b53a89a13831c9
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! -->
<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/16.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-16-0/sale-workflow-16-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=16.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><strong>Table of contents</strong></p>
<div class="contents local topic" id="contents">
<ul class="simple">
<li><a class="reference internal" href="#configuration" id="toc-entry-1">Configuration</a></li>
<li><a class="reference internal" href="#usage" id="toc-entry-2">Usage</a></li>
<li><a class="reference internal" href="#bug-tracker" id="toc-entry-3">Bug Tracker</a></li>
<li><a class="reference internal" href="#credits" id="toc-entry-4">Credits</a><ul>
<li><a class="reference internal" href="#authors" id="toc-entry-5">Authors</a></li>
<li><a class="reference internal" href="#contributors" id="toc-entry-6">Contributors</a></li>
<li><a class="reference internal" href="#maintainers" id="toc-entry-7">Maintainers</a></li>
</ul>
</li>
</ul>
</div>
<div class="section" id="configuration">
<h2><a class="toc-backref" href="#toc-entry-1">Configuration</a></h2>
<p>To configure this module you need to:</p>
<ol class="arabic simple">
<li>Go to <em>Sale &gt; Configuration &gt; Products &gt; Sale Elaboration</em>.</li>
<li>Create a new record.</li>
<li>Set a product linked to the elaboration.</li>
<li>Also you can 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 configure elaboration profiles as well. These profiles are a set of elaborations
that are available for chosen products or categories. When the salesman chooses the
elaboration in sales line, only those from the set for that product will be available.</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>Inventory &gt; Products &gt; Products</em> and choose one.</li>
<li>In the <strong>Sales</strong> tab, youll find an <strong>Elaboration</strong> section where you can set the
<strong>Elaboration profile</strong> for that specific product.</li>
</ol>
</div>
<div class="section" id="usage">
<h2><a class="toc-backref" href="#toc-entry-2">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.</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-3">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:%2016.0%0A%0A**Steps%20to%20reproduce**%0A-%20...%0A%0A**Current%20behavior**%0A%0A**Expected%20behavior**">feedback</a>.</p>
<p>Do not contact contributors directly about support or help with technical issues.</p>
</div>
<div class="section" id="credits">
<h2><a class="toc-backref" href="#toc-entry-4">Credits</a></h2>
<div class="section" id="authors">
<h3><a class="toc-backref" href="#toc-entry-5">Authors</a></h3>
<ul class="simple">
<li>Tecnativa</li>
</ul>
</div>
<div class="section" id="contributors">
<h3><a class="toc-backref" href="#toc-entry-6">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-7">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/16.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_done = 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_done = 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 l: l.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,
"{} - {}".format(self.order.name, so_line_elaboration.name),
)
self.assertNotEqual(
inv_line_no_elaboration.name,
"{} - {}".format(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_done = 10.0
move_line_b = move_ids.filtered(lambda r: r.product_id == product2)
move_line_b.quantity_done = 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,33 @@
<?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"
attrs="{'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"
attrs="{'invisible':[('product_variant_count', '&gt;', 1), ('is_product_variant', '=', False)]}"
/>
</group>
</xpath>
</field>
</record>
</odoo>

View file

@ -0,0 +1,39 @@
<?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="//div[@id='group_lot_on_delivery_slip']" position="after">
<div
class="col-12 col-lg-6 o_setting_box"
id="group_elaboration_note_on_delivery_slip"
>
<div class="o_setting_left_pane">
<field name="group_elaboration_note_on_delivery_slip" />
</div>
<div class="o_setting_right_pane">
<label for="group_elaboration_note_on_delivery_slip" />
<div class="text-muted">
Elaboration notes will appear on the delivery slip
</div>
</div>
</div>
<div
class="col-12 col-lg-6 o_setting_box"
id="group_elaboration_note_on_picking_operations"
>
<div class="o_setting_left_pane">
<field name="group_elaboration_note_on_picking_operations" />
</div>
<div class="o_setting_right_pane">
<label for="group_elaboration_note_on_picking_operations" />
<div class="text-muted">
Elaboration notes will appear on the picking operations report
</div>
</div>
</div>
</xpath>
</field>
</record>
</odoo>

View file

@ -0,0 +1,59 @@
<?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">
<tree>
<field name="name" />
<field name="code" />
<field name="active" widget="boolean_toggle" />
</tree>
</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"
attrs="{'invisible': [('active', '=', True)]}"
/>
<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">tree,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">
<tree 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" />
</tree>
</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">tree,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"
attrs="{'invisible': [('active', '=', True)]}"
/>
<field name="active" invisible="1" />
<group>
<field name="code" />
<field name="name" />
<field
name="product_id"
context="{'default_is_elaboration': True, 'default_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">
<tree multi_edit="1" editable="top">
<field name="code" />
<field name="name" />
<field
name="product_id"
context="{'default_is_elaboration': True, 'default_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" />
</tree>
</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">tree</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,94 @@
<?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"
attrs="{'readonly': ['|', ('product_updatable', '=', False), ('parent.state', 'in', ('done', 'cancel'))]}"
domain="elaboration_profile_id and [('profile_ids', 'in', [elaboration_profile_id])] or []"
/>
<field
name="elaboration_note"
attrs="{'readonly': ['|', ('product_updatable', '=', False), ('parent.state', 'in', ('done', 'cancel'))]}"
/>
<field
name="elaboration_price_unit"
readonly="1"
widget="monetary"
attrs="{'invisible': [('elaboration_ids', '=', [])]}"
/>
</group>
</xpath>
<xpath
expr="//field[@name='order_line']/tree//field[@name='price_unit']"
position="after"
>
<field name="elaboration_profile_id" invisible="1" />
<field
name="elaboration_ids"
widget="many2many_tags"
attrs="{'readonly': ['|', ('product_updatable', '=', False), ('parent.state', 'in', ('done', 'cancel'))]}"
domain="elaboration_profile_id and [('profile_ids', 'in', [elaboration_profile_id])] or []"
optional="show"
/>
<field
name="elaboration_note"
attrs="{'readonly': ['|', ('product_updatable', '=', False), ('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='company_id']"
position="after"
>
<field name="elaboration_ids" invisible="1" />
<field name="elaboration_note" invisible="1" />
<field name="elaboration_price_unit" invisible="1" />
</xpath>
<xpath
expr="//field[@name='order_line']/kanban//t[@t-out='record.price_unit.value']"
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//t[@t-out='record.price_unit.value']/../.."
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,43 @@
<?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']/tree/field[@name='product_uom']"
position="after"
>
<field
name="elaboration_ids"
widget="many2many_tags"
options="{'no_create': True}"
attrs="{'column_invisible': [('parent.immediate_transfer', '=', True)], 'readonly': ['|', ('is_initial_demand_editable', '=', False), '&amp;', '&amp;', ('show_operations', '=', True), ('is_locked', '=', True), ('is_initial_demand_editable', '=', False)]}"
optional="show"
/>
<field
name="elaboration_note"
attrs="{'column_invisible': [('parent.immediate_transfer', '=', True)], 'readonly': ['|', ('is_initial_demand_editable', '=', False), '&amp;', '&amp;', ('show_operations', '=', True), ('is_locked', '=', True), ('is_initial_demand_editable', '=', False)]}"
optional="show"
/>
</xpath>
<xpath
expr="//field[@name='move_ids_without_package']/form//field[@name='product_uom']"
position="after"
>
<field
name="elaboration_ids"
widget="many2many_tags"
options="{'no_create': True}"
attrs="{'invisible': [('parent.immediate_transfer', '=', True)], 'readonly': [('is_initial_demand_editable', '=', False)]}"
/>
<field
name="elaboration_note"
attrs="{'invisible': [('parent.immediate_transfer', '=', True)], 'readonly': [('is_initial_demand_editable', '=', False)]}"
/>
</xpath>
</field>
</record>
</odoo>