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

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

View File

@@ -0,0 +1,178 @@
=================================
Sale Order Product Recommendation
=================================
..
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
!! This file is generated by oca-gen-addon-readme !!
!! changes will be overwritten. !!
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
!! source digest: sha256:430005bb553765cb590d6b599274c15a577afff56ab622c5fbdaf0bf14923b38
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
.. |badge1| image:: https://img.shields.io/badge/maturity-Beta-yellow.png
:target: https://odoo-community.org/page/development-status
:alt: Beta
.. |badge2| image:: https://img.shields.io/badge/licence-AGPL--3-blue.png
:target: http://www.gnu.org/licenses/agpl-3.0-standalone.html
:alt: License: AGPL-3
.. |badge3| image:: https://img.shields.io/badge/github-OCA%2Fsale--workflow-lightgray.png?logo=github
:target: https://github.com/OCA/sale-workflow/tree/18.0/sale_order_product_recommendation
:alt: OCA/sale-workflow
.. |badge4| image:: https://img.shields.io/badge/weblate-Translate%20me-F47D42.png
:target: https://translation.odoo-community.org/projects/sale-workflow-18-0/sale-workflow-18-0-sale_order_product_recommendation
:alt: Translate me on Weblate
.. |badge5| image:: https://img.shields.io/badge/runboat-Try%20me-875A7B.png
:target: https://runboat.odoo-community.org/builds?repo=OCA/sale-workflow&target_branch=18.0
:alt: Try me on Runboat
|badge1| |badge2| |badge3| |badge4| |badge5|
This module adds a recommended products wizard to current sale order.
It is based on recent delivered products, and allows the salesman to
quickly know the most sold products for current customer, which results
in an easy to use hint to improve sale.
If you want a better mobile usability, the module is ready to use with
the 'web_widget_numeric_step' module. Just install it and you will get a
better numeric input experience.
**Table of contents**
.. contents::
:local:
Configuration
=============
To configure this module you need to:
In sale order product recommendation you can display the product price
unit from list price or from last sale order price. To set the default
value follow the next steps
1. Go to *Sales > Configuration > Settings > Sale order
recommendations*.
2. Assign the desired value to *Product recommendation price origin*
field.
3. Press *Save* button to store the change.
In sale order product recommendation you can compute the recommendations
using the Delivery Address instead of the Customer. To set this option
by default follow the next steps
1. Go to *Sales > Configuration > Settings > Sale order
recommendations*.
2. Assign the desired value to *Use delivery address* field.
3. Press *Save* button to store the change.
You can define other default values like as:
- Months backwards to generate recommendations.
- Number of recommendations to display.
You can force the addition of all the products recommended in the sale
order. You can then edit the desired quantities directly in the sale
order.
1. Go to *Sales > Configuration > Settings > Sale order
recommendations*.
2. Select *Force zero units included*
You can add a filter domain to exclude or include additional recommended
products.
1. Go to *Sales > Configuration > Settings > Sale order
recommendations*.
2. Add a filter in section *Sale order product recommendation domain*
Example: ``[("product_type", "!=" "service")]``
Usage
=====
To use this module, you need to:
1. Create a new sale order.
2. Assign its customer.
3. Press *Recommended Products* button.
4. Configure the recommendations parameters.
5. Press *Get recommendations* button.
6. Add products into the opened wizard.
7. Press *Accept*.
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_order_product_recommendation%0Aversion:%2018.0%0A%0A**Steps%20to%20reproduce**%0A-%20...%0A%0A**Current%20behavior**%0A%0A**Expected%20behavior**>`_.
Do not contact contributors directly about support or help with technical issues.
Credits
=======
Authors
-------
* Tecnativa
Contributors
------------
- `Tecnativa <https://www.tecnativa.com>`__:
- Jairo Llopis
- David Vidal
- Alexandre Díaz
- Pedro M. Baeza
- Sergio Teruel
- Carlos Roca
- Víctor Martínez
- `Camptocamp SA <https://www.camptocamp.com>`__:
- Telmo Santos
- `Moduon <https://www.moduon.team>`__:
- Rafael Blasco
- Gelo Joga
- Jairo Llopis
- `Trobz <https://www.trobz.com>`__:
- Tris Doan
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-sergio-teruel| image:: https://github.com/sergio-teruel.png?size=40px
:target: https://github.com/sergio-teruel
:alt: sergio-teruel
.. |maintainer-rafaelbn| image:: https://github.com/rafaelbn.png?size=40px
:target: https://github.com/rafaelbn
:alt: rafaelbn
.. |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-sergio-teruel| |maintainer-rafaelbn| |maintainer-yajo|
This module is part of the `OCA/sale-workflow <https://github.com/OCA/sale-workflow/tree/18.0/sale_order_product_recommendation>`_ project on GitHub.
You are welcome to contribute. To learn how please visit https://odoo-community.org/page/Contribute.

View File

@@ -0,0 +1,4 @@
# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl).
from . import models
from . import wizards

View File

@@ -0,0 +1,24 @@
# Copyright 2017 Jairo Llopis <jairo.llopis@tecnativa.com>
# Copyright 2020 Tecnativa - Pedro M. Baeza
# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl).
{
"name": "Sale Order Product Recommendation",
"summary": "Recommend products to sell to customer based on history",
"version": "18.0.1.0.0",
"category": "Sales",
"website": "https://github.com/OCA/sale-workflow",
"author": "Tecnativa, Odoo Community Association (OCA)",
"license": "AGPL-3",
"application": False,
"installable": True,
"maintainers": ["sergio-teruel", "rafaelbn", "yajo"],
"depends": [
"sale_management",
],
"data": [
"security/ir.model.access.csv",
"wizards/sale_order_recommendation_view.xml",
"views/res_config_settings_views.xml",
"views/sale_order_view.xml",
],
}

View File

@@ -0,0 +1,436 @@
# Translation of Odoo Server.
# This file contains the translation of the following modules:
# * sale_order_product_recommendation
#
msgid ""
msgstr ""
"Project-Id-Version: Odoo Server 9.0c\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2021-11-29 17:05+0000\n"
"PO-Revision-Date: 2024-02-15 21:35+0000\n"
"Last-Translator: Ivorra78 <informatica@totmaterial.es>\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: Weblate 4.17\n"
#. module: sale_order_product_recommendation
#: model_terms:ir.ui.view,arch_db:sale_order_product_recommendation.res_config_settings_view_form_sale
msgid ""
"<span class=\"o_form_label\">Add recommended with zero units included</span>"
msgstr ""
"<span class=\"o_form_label\">Añadir recomendado con cero unidades incluidas</"
"span>"
#. module: sale_order_product_recommendation
#: model_terms:ir.ui.view,arch_db:sale_order_product_recommendation.res_config_settings_view_form_sale
msgid "<span class=\"o_form_label\">Default Number of recommendations</span>"
msgstr ""
"<span class=\"o_form_label\">Número de recomendaciones por defecto</span>"
#. module: sale_order_product_recommendation
#: model_terms:ir.ui.view,arch_db:sale_order_product_recommendation.res_config_settings_view_form_sale
msgid ""
"<span class=\"o_form_label\">Default months backwards to generate "
"recommendations</span>"
msgstr ""
"<span class=\"o_form_label\">Meses atrás por defecto para generar las "
"recomendaciones</span>"
#. module: sale_order_product_recommendation
#: model_terms:ir.ui.view,arch_db:sale_order_product_recommendation.res_config_settings_view_form_sale
msgid "<span class=\"o_form_label\">Product recommendation price origin</span>"
msgstr ""
"<span class=\"o_form_label\">Origen del precio para el recomendador de "
"productos</span>"
#. module: sale_order_product_recommendation
#: model_terms:ir.ui.view,arch_db:sale_order_product_recommendation.res_config_settings_view_form_sale
msgid ""
"<span class=\"o_form_label\">Sale order product recommendation domain</span>"
msgstr ""
"<span class=\"o_form_label\">Dominio de recomendación de productos de "
"pedidos de venta</span>"
#. module: sale_order_product_recommendation
#: model_terms:ir.ui.view,arch_db:sale_order_product_recommendation.res_config_settings_view_form_sale
msgid "<span class=\"o_form_label\">Use delivery address</span>"
msgstr "<span class=\"o_form_label\">Usar dirección de entrega</span>"
#. module: sale_order_product_recommendation
#: model_terms:ir.ui.view,arch_db:sale_order_product_recommendation.sale_order_recommendation_view_form
msgid "<span>To be included: </span>"
msgstr "<span>Para ser incluido: </span>"
#. module: sale_order_product_recommendation
#: model_terms:ir.ui.view,arch_db:sale_order_product_recommendation.sale_order_recommendation_view_form
msgid "Accept"
msgstr "Aceptar"
#. module: sale_order_product_recommendation
#: model:ir.model.fields,help:sale_order_product_recommendation.field_res_config_settings__force_zero_units_included
#: model_terms:ir.ui.view,arch_db:sale_order_product_recommendation.res_config_settings_view_form_sale
msgid "Add recomented products in so even if units included is zero."
msgstr ""
"Añada los productos recomendados aunque las unidades incluidas sean cero."
#. module: sale_order_product_recommendation
#: model_terms:ir.ui.view,arch_db:sale_order_product_recommendation.sale_order_recommendation_view_form
msgid "Cancel"
msgstr "Cancelar"
#. module: sale_order_product_recommendation
#: model:ir.model.fields,field_description:sale_order_product_recommendation.field_sale_order_recommendation_line__product_uom_category_id
msgid "Category"
msgstr "Categoría"
#. module: sale_order_product_recommendation
#: model_terms:ir.ui.view,arch_db:sale_order_product_recommendation.sale_order_recommendation_view_form
msgid "Change criteria"
msgstr "Cambiar criterios"
#. module: sale_order_product_recommendation
#: model:ir.model,name:sale_order_product_recommendation.model_res_company
msgid "Companies"
msgstr "Compañías"
#. module: sale_order_product_recommendation
#: model:ir.model,name:sale_order_product_recommendation.model_res_config_settings
msgid "Config Settings"
msgstr "Opciones de Configuración"
#. module: sale_order_product_recommendation
#: model:ir.model.fields,help:sale_order_product_recommendation.field_sale_order_recommendation__months
msgid "Consider these months backwards to generate recommendations."
msgstr "Considerar estos meses atrás para generar las recomendaciones."
#. module: sale_order_product_recommendation
#: model:ir.model.fields,help:sale_order_product_recommendation.field_sale_order_recommendation_line__product_uom_category_id
msgid ""
"Conversion between Units of Measure can only occur if they belong to the "
"same category. The conversion will be made based on the ratios."
msgstr ""
"La conversión entre Unidades de Medida sólo puede producirse si pertenecen a "
"la misma categoría. La conversión se realizará en función de las "
"proporciones."
#. module: sale_order_product_recommendation
#: model:ir.model.fields,field_description:sale_order_product_recommendation.field_sale_order_recommendation__create_uid
#: model:ir.model.fields,field_description:sale_order_product_recommendation.field_sale_order_recommendation_line__create_uid
msgid "Created by"
msgstr "Creado por"
#. module: sale_order_product_recommendation
#: model:ir.model.fields,field_description:sale_order_product_recommendation.field_sale_order_recommendation__create_date
#: model:ir.model.fields,field_description:sale_order_product_recommendation.field_sale_order_recommendation_line__create_date
msgid "Created on"
msgstr "Creado el"
#. module: sale_order_product_recommendation
#: model:ir.model.fields,field_description:sale_order_product_recommendation.field_sale_order_recommendation_line__currency_id
msgid "Currency"
msgstr "Moneda"
#. module: sale_order_product_recommendation
#: model:ir.model.fields,field_description:sale_order_product_recommendation.field_sale_order_recommendation_line__partner_id
msgid "Customer"
msgstr "Cliente"
#. module: sale_order_product_recommendation
#: model:ir.model.fields,field_description:sale_order_product_recommendation.field_res_config_settings__default_line_amount
msgid "Default sale number of recommendations"
msgstr "Número por defecto de recomendaciones"
#. module: sale_order_product_recommendation
#: model:ir.model.fields,field_description:sale_order_product_recommendation.field_res_config_settings__default_months
msgid "Default sale recommendation months"
msgstr "Número de meses por defecto para las recomendaciones"
#. module: sale_order_product_recommendation
#: model_terms:ir.ui.view,arch_db:sale_order_product_recommendation.sale_order_recommendation_view_form
msgid "Delivered:"
msgstr "Entregado:"
#. module: sale_order_product_recommendation
#: model:ir.model.fields,field_description:sale_order_product_recommendation.field_sale_order_recommendation__display_name
#: model:ir.model.fields,field_description:sale_order_product_recommendation.field_sale_order_recommendation_line__display_name
msgid "Display Name"
msgstr "Nombre a mostrar"
#. module: sale_order_product_recommendation
#: model_terms:ir.ui.view,arch_db:sale_order_product_recommendation.res_config_settings_view_form_sale
msgid "Domain applied on sale orders lines to recommend products for sales"
msgstr ""
"Dominio aplicado en las líneas de pedidos de venta para recomendar productos "
"para la venta"
#. module: sale_order_product_recommendation
#: model:ir.model.fields,help:sale_order_product_recommendation.field_res_config_settings__sale_line_recommendation_domain
msgid "Domain applied to find SO lines to propose as recommended products."
msgstr ""
"Dominio aplicado para encontrar líneas de SO que proponer como productos "
"recomendados."
#. module: sale_order_product_recommendation
#: model:ir.model.fields,field_description:sale_order_product_recommendation.field_sale_order_recommendation_line__product_is_favorite
msgid "Favorite"
msgstr "Favorito"
#. module: sale_order_product_recommendation
#: model:ir.model.fields,field_description:sale_order_product_recommendation.field_res_company__force_zero_units_included
#: model:ir.model.fields,field_description:sale_order_product_recommendation.field_res_config_settings__force_zero_units_included
msgid "Force Zero Units Included"
msgstr "Unidades Fuerza Cero Incluidas"
#. module: sale_order_product_recommendation
#: model_terms:ir.ui.view,arch_db:sale_order_product_recommendation.sale_order_recommendation_view_form
msgid "Get recommendations"
msgstr "Obtener recomendaciones"
#. module: sale_order_product_recommendation
#: model:ir.model.fields,field_description:sale_order_product_recommendation.field_sale_order_recommendation__id
#: model:ir.model.fields,field_description:sale_order_product_recommendation.field_sale_order_recommendation_line__id
msgid "ID"
msgstr "ID"
#. module: sale_order_product_recommendation
#: model_terms:ir.ui.view,arch_db:sale_order_product_recommendation.res_config_settings_view_form_sale
msgid ""
"If this is selected, it will take care by default on\n"
" Delivery Address instead of customer on sale "
"orders\n"
" recommendation"
msgstr ""
"Si se selecciona, se va a tener en cuenta por defecto la\n"
" Direccion de entrega en lugar del cliente en el\n"
" recomendador de productos"
#. module: sale_order_product_recommendation
#: model:ir.model.fields,help:sale_order_product_recommendation.field_sale_order_recommendation_line__pricelist_id
msgid "If you change the pricelist, only newly added lines will be affected."
msgstr ""
"Si cambia la lista de precios, solo se verán afectadas las líneas recién "
"agregadas."
#. module: sale_order_product_recommendation
#: model:ir.model.fields,field_description:sale_order_product_recommendation.field_sale_order_recommendation_line__product_default_code
msgid "Internal Reference"
msgstr "Referencia Interna"
#. module: sale_order_product_recommendation
#: model:ir.model.fields,field_description:sale_order_product_recommendation.field_sale_order_recommendation____last_update
#: model:ir.model.fields,field_description:sale_order_product_recommendation.field_sale_order_recommendation_line____last_update
msgid "Last Modified on"
msgstr "Última modificación en"
#. module: sale_order_product_recommendation
#: model:ir.model.fields,field_description:sale_order_product_recommendation.field_sale_order_recommendation__write_uid
#: model:ir.model.fields,field_description:sale_order_product_recommendation.field_sale_order_recommendation_line__write_uid
msgid "Last Updated by"
msgstr "Última modificación por"
#. module: sale_order_product_recommendation
#: model:ir.model.fields,field_description:sale_order_product_recommendation.field_sale_order_recommendation__write_date
#: model:ir.model.fields,field_description:sale_order_product_recommendation.field_sale_order_recommendation_line__write_date
msgid "Last Updated on"
msgstr "Última actualización en"
#. module: sale_order_product_recommendation
#: model:ir.model.fields.selection,name:sale_order_product_recommendation.selection__res_config_settings__default_sale_recommendation_price_origin__last_sale_price
#: model:ir.model.fields.selection,name:sale_order_product_recommendation.selection__sale_order_recommendation__sale_recommendation_price_origin__last_sale_price
msgid "Last sale price"
msgstr "Último precio de venta"
#. module: sale_order_product_recommendation
#: model:ir.model.fields,field_description:sale_order_product_recommendation.field_sale_order_recommendation__months
msgid "Months"
msgstr "Meses"
#. module: sale_order_product_recommendation
#: model:ir.model.fields,field_description:sale_order_product_recommendation.field_sale_order_recommendation_line__product_name
msgid "Name"
msgstr "Nombre"
#. module: sale_order_product_recommendation
#. odoo-python
#: code:addons/sale_order_product_recommendation/wizards/sale_order_recommendation.py:0
#, python-format
msgid "Nothing found! Modify your criteria or fill the order manually."
msgstr "Nothing found! Modify your criteria or fill the order manually."
#. module: sale_order_product_recommendation
#: model:ir.model.fields,field_description:sale_order_product_recommendation.field_sale_order_recommendation__line_amount
msgid "Number of recommendations"
msgstr "Número de recomendaciones"
#. module: sale_order_product_recommendation
#: model:ir.model.fields,field_description:sale_order_product_recommendation.field_sale_order_recommendation_line__price_unit
msgid "Price Unit"
msgstr "Precio unitario"
#. module: sale_order_product_recommendation
#: model:ir.model.fields,field_description:sale_order_product_recommendation.field_res_config_settings__default_sale_recommendation_price_origin
msgid "Price origin"
msgstr "Origen del precio"
#. module: sale_order_product_recommendation
#: model_terms:ir.ui.view,arch_db:sale_order_product_recommendation.sale_order_recommendation_view_form
msgid "Price:"
msgstr "Precio:"
#. module: sale_order_product_recommendation
#: model:ir.model.fields,field_description:sale_order_product_recommendation.field_sale_order_recommendation_line__pricelist_id
#: model:ir.model.fields.selection,name:sale_order_product_recommendation.selection__res_config_settings__default_sale_recommendation_price_origin__pricelist
#: model:ir.model.fields.selection,name:sale_order_product_recommendation.selection__sale_order_recommendation__sale_recommendation_price_origin__pricelist
msgid "Pricelist"
msgstr "Tarifa"
#. module: sale_order_product_recommendation
#: model:ir.model.fields,field_description:sale_order_product_recommendation.field_sale_order_recommendation_line__product_id
#: model_terms:ir.ui.view,arch_db:sale_order_product_recommendation.sale_order_recommendation_view_form
msgid "Product"
msgstr "Producto"
#. module: sale_order_product_recommendation
#: model:ir.model.fields,field_description:sale_order_product_recommendation.field_sale_order_recommendation_line__product_uom_readonly
msgid "Product Uom Readonly"
msgstr "Udm Producto Solo Lectura"
#. module: sale_order_product_recommendation
#: model:ir.model.fields,field_description:sale_order_product_recommendation.field_sale_order_recommendation_line__product_categ_complete_name
#: model:ir.model.fields.selection,name:sale_order_product_recommendation.selection__sale_order_recommendation__recommendations_order__product_categ_complete_name_asc
msgid "Product category"
msgstr "Categoría de producto"
#. module: sale_order_product_recommendation
#: model:ir.model.fields.selection,name:sale_order_product_recommendation.selection__sale_order_recommendation__recommendations_order__product_default_code_asc
msgid "Product code"
msgstr "Código de producto"
#. module: sale_order_product_recommendation
#: model:ir.model.fields.selection,name:sale_order_product_recommendation.selection__sale_order_recommendation__recommendations_order__product_name_asc
msgid "Product name"
msgstr "Nombre del producto"
#. module: sale_order_product_recommendation
#: model:ir.model.fields,field_description:sale_order_product_recommendation.field_sale_order_recommendation__sale_recommendation_price_origin
msgid "Product price origin"
msgstr "Origen del precio del producto"
#. module: sale_order_product_recommendation
#: model:ir.model.fields,field_description:sale_order_product_recommendation.field_sale_order_recommendation__line_ids
msgid "Products"
msgstr "Productos"
#. module: sale_order_product_recommendation
#: model:ir.model.fields,field_description:sale_order_product_recommendation.field_sale_order_recommendation__recommendations_order
msgid "Recommendations Order"
msgstr "Recomendaciones Pedido"
#. module: sale_order_product_recommendation
#: model_terms:ir.ui.view,arch_db:sale_order_product_recommendation.view_order_form
msgid "Recommended Products"
msgstr "Productos recomendados"
#. module: sale_order_product_recommendation
#: model:ir.actions.act_window,name:sale_order_product_recommendation.sale_order_recommendation_action
msgid "Recommended Products for this Customer"
msgstr "Productos recomendados para este cliente"
#. module: sale_order_product_recommendation
#: model:ir.model,name:sale_order_product_recommendation.model_sale_order_recommendation_line
msgid "Recommended product for current sale order"
msgstr "Producto recomendado para el pedido de venta actual"
#. module: sale_order_product_recommendation
#: model:ir.model,name:sale_order_product_recommendation.model_sale_order_recommendation
msgid "Recommended products for current sale order"
msgstr "Productos recomendados para el pedido de venta actual"
#. module: sale_order_product_recommendation
#: model:ir.model.fields,field_description:sale_order_product_recommendation.field_sale_order_recommendation_line__sale_line_id
msgid "Sale Line"
msgstr "Pedido de venta"
#. module: sale_order_product_recommendation
#: model:ir.model.fields,field_description:sale_order_product_recommendation.field_res_company__sale_line_recommendation_domain
#: model:ir.model.fields,field_description:sale_order_product_recommendation.field_res_config_settings__sale_line_recommendation_domain
msgid "Sale Line Recommendation Domain"
msgstr "Línea de venta Recomendación Dominio"
#. module: sale_order_product_recommendation
#: model:ir.model.fields,field_description:sale_order_product_recommendation.field_sale_order_recommendation__order_id
msgid "Sale Order"
msgstr "Pedido de venta"
#. module: sale_order_product_recommendation
#: model_terms:ir.ui.view,arch_db:sale_order_product_recommendation.res_config_settings_view_form_sale
msgid "Sale order recommendations"
msgstr "Recomendaciones de orden de venta"
#. module: sale_order_product_recommendation
#: model_terms:ir.ui.view,arch_db:sale_order_product_recommendation.res_config_settings_view_form_sale
msgid ""
"Select the origin for display product price in sale orders recommendation"
msgstr ""
"Seleccionar el origen del precio de los productos a mostrar en el "
"recomendador de productos"
#. module: sale_order_product_recommendation
#: model:ir.model.fields,help:sale_order_product_recommendation.field_sale_order_recommendation__line_amount
msgid "The less, the faster they will be found."
msgstr "Cuantos menos, más rápido se encontrarán."
#. module: sale_order_product_recommendation
#: model:ir.model.fields,field_description:sale_order_product_recommendation.field_sale_order_recommendation_line__times_delivered
msgid "Times Delivered"
msgstr "Veces entregado"
#. module: sale_order_product_recommendation
#: model:ir.model.fields.selection,name:sale_order_product_recommendation.selection__sale_order_recommendation__recommendations_order__times_delivered_desc
msgid "Times delivered"
msgstr "Veces entregado"
#. module: sale_order_product_recommendation
#: model:ir.model.fields,field_description:sale_order_product_recommendation.field_sale_order_recommendation_line__sale_uom_id
msgid "Unit of Measure"
msgstr "Unidad de medida"
#. module: sale_order_product_recommendation
#: model:ir.model.fields,field_description:sale_order_product_recommendation.field_sale_order_recommendation_line__units_delivered
msgid "Units Delivered"
msgstr "Unidades entregadas"
#. module: sale_order_product_recommendation
#: model:ir.model.fields,field_description:sale_order_product_recommendation.field_sale_order_recommendation_line__units_included
msgid "Units Included"
msgstr "Unidades incluidas"
#. module: sale_order_product_recommendation
#: model:ir.model.fields.selection,name:sale_order_product_recommendation.selection__sale_order_recommendation__recommendations_order__units_delivered_desc
msgid "Units delivered"
msgstr "Unidades entregadas"
#. module: sale_order_product_recommendation
#: model:ir.model.fields,field_description:sale_order_product_recommendation.field_res_config_settings__default_use_delivery_address
#: model:ir.model.fields,field_description:sale_order_product_recommendation.field_sale_order_recommendation__use_delivery_address
msgid "Use delivery address"
msgstr "Usar dirección de entrega"
#. module: sale_order_product_recommendation
#: model:ir.model.fields,field_description:sale_order_product_recommendation.field_sale_order_recommendation_line__wizard_id
msgid "Wizard"
msgstr "Asistente"
#. module: sale_order_product_recommendation
#: model_terms:ir.ui.view,arch_db:sale_order_product_recommendation.sale_order_recommendation_view_form
msgid "You will lose any changes you have made. Are you sure?"
msgstr "Perderás todos los cambios que hayas hecho. ¿Está seguro?"
#. module: sale_order_product_recommendation
#: model_terms:ir.ui.view,arch_db:sale_order_product_recommendation.sale_order_recommendation_view_form
msgid "times -"
msgstr "veces -"

View File

@@ -0,0 +1,414 @@
# Translation of Odoo Server.
# This file contains the translation of the following modules:
# * sale_order_product_recommendation
#
msgid ""
msgstr ""
"Project-Id-Version: Odoo Server 18.0\n"
"Report-Msgid-Bugs-To: \n"
"PO-Revision-Date: 2025-07-30 15:21+0000\n"
"Last-Translator: Sabrina MANOU <sabrina.manou@xcg-consulting.fr>\n"
"Language-Team: none\n"
"Language: fr\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_order_product_recommendation
#: model_terms:ir.ui.view,arch_db:sale_order_product_recommendation.sale_order_recommendation_view_form
msgid "<span>To be included: </span>"
msgstr "<span>À inclure : </span>"
#. module: sale_order_product_recommendation
#: model_terms:ir.ui.view,arch_db:sale_order_product_recommendation.sale_order_recommendation_view_form
msgid "Accept"
msgstr "Accepter"
#. module: sale_order_product_recommendation
#: model:ir.model.fields,help:sale_order_product_recommendation.field_res_config_settings__force_zero_units_included
#: model_terms:ir.ui.view,arch_db:sale_order_product_recommendation.res_config_settings_view_form_sale
msgid "Add recomented products in so even if units included is zero."
msgstr ""
"Ajouter les produits recommandés même si les unités incluses sont nulles."
#. module: sale_order_product_recommendation
#: model_terms:ir.ui.view,arch_db:sale_order_product_recommendation.res_config_settings_view_form_sale
msgid "Add recommended with zero units included"
msgstr "Ajouter les recommandations avec zéro unités incluses"
#. module: sale_order_product_recommendation
#: model_terms:ir.ui.view,arch_db:sale_order_product_recommendation.sale_order_recommendation_view_form
msgid "Cancel"
msgstr "Annuler"
#. module: sale_order_product_recommendation
#: model:ir.model.fields,field_description:sale_order_product_recommendation.field_sale_order_recommendation_line__product_uom_category_id
msgid "Category"
msgstr "Catégorie"
#. module: sale_order_product_recommendation
#: model_terms:ir.ui.view,arch_db:sale_order_product_recommendation.sale_order_recommendation_view_form
msgid "Change criteria"
msgstr "Modifier les critères"
#. module: sale_order_product_recommendation
#: model:ir.model,name:sale_order_product_recommendation.model_res_company
msgid "Companies"
msgstr "Sociétés"
#. module: sale_order_product_recommendation
#: model:ir.model,name:sale_order_product_recommendation.model_res_config_settings
msgid "Config Settings"
msgstr "Paramètres de configuration"
#. module: sale_order_product_recommendation
#: model:ir.model.fields,help:sale_order_product_recommendation.field_sale_order_recommendation__months
msgid "Consider these months backwards to generate recommendations."
msgstr "Nombre de mois d'antériorité utilisé pour générer les recommandations."
#. module: sale_order_product_recommendation
#: model:ir.model.fields,help:sale_order_product_recommendation.field_sale_order_recommendation_line__product_uom_category_id
msgid ""
"Conversion between Units of Measure can only occur if they belong to the "
"same category. The conversion will be made based on the ratios."
msgstr ""
"Il est possible de convertir deux unités de mesures si elles appartiennent à "
"la même catégorie. Cette conversion utilise les facteurs définis pour ces "
"unités."
#. module: sale_order_product_recommendation
#: model:ir.model.fields,field_description:sale_order_product_recommendation.field_sale_order_recommendation__create_uid
#: model:ir.model.fields,field_description:sale_order_product_recommendation.field_sale_order_recommendation_line__create_uid
msgid "Created by"
msgstr "Créé par"
#. module: sale_order_product_recommendation
#: model:ir.model.fields,field_description:sale_order_product_recommendation.field_sale_order_recommendation__create_date
#: model:ir.model.fields,field_description:sale_order_product_recommendation.field_sale_order_recommendation_line__create_date
msgid "Created on"
msgstr "Créé le"
#. module: sale_order_product_recommendation
#: model:ir.model.fields,field_description:sale_order_product_recommendation.field_sale_order_recommendation_line__currency_id
msgid "Currency"
msgstr "Devise"
#. module: sale_order_product_recommendation
#: model:ir.model.fields,field_description:sale_order_product_recommendation.field_sale_order_recommendation_line__partner_id
msgid "Customer"
msgstr "Client"
#. module: sale_order_product_recommendation
#: model_terms:ir.ui.view,arch_db:sale_order_product_recommendation.res_config_settings_view_form_sale
msgid "Default Number of recommendations"
msgstr "Nombre de recommandations par défaut"
#. module: sale_order_product_recommendation
#: model_terms:ir.ui.view,arch_db:sale_order_product_recommendation.res_config_settings_view_form_sale
msgid "Default months backwards to generate recommendations"
msgstr ""
"Nombre de mois d'antériorité par défaut pour générer les recommandations"
#. module: sale_order_product_recommendation
#: model:ir.model.fields,field_description:sale_order_product_recommendation.field_res_config_settings__default_line_amount
msgid "Default sale number of recommendations"
msgstr "Nombre de ventes recommandées par défaut"
#. module: sale_order_product_recommendation
#: model:ir.model.fields,field_description:sale_order_product_recommendation.field_res_config_settings__default_months
msgid "Default sale recommendation months"
msgstr "Nombre de mois de vente recommandés par défaut"
#. module: sale_order_product_recommendation
#: model_terms:ir.ui.view,arch_db:sale_order_product_recommendation.sale_order_recommendation_view_form
msgid "Delivered:"
msgstr "Livré :"
#. module: sale_order_product_recommendation
#: model:ir.model.fields,field_description:sale_order_product_recommendation.field_sale_order_recommendation__display_name
#: model:ir.model.fields,field_description:sale_order_product_recommendation.field_sale_order_recommendation_line__display_name
msgid "Display Name"
msgstr "Nom d'affichage"
#. module: sale_order_product_recommendation
#: model_terms:ir.ui.view,arch_db:sale_order_product_recommendation.res_config_settings_view_form_sale
msgid "Domain applied on sale orders lines to recommend products for sales"
msgstr ""
"Domaine appliqué sur les lignes de commande pour recommander des produits à "
"vendre"
#. module: sale_order_product_recommendation
#: model:ir.model.fields,help:sale_order_product_recommendation.field_res_config_settings__sale_line_recommendation_domain
msgid "Domain applied to find SO lines to propose as recommended products."
msgstr ""
"Domaine appliqué pour trouver des lignes de commande de vente à proposer "
"comme produits recommandés."
#. module: sale_order_product_recommendation
#: model:ir.model.fields,field_description:sale_order_product_recommendation.field_sale_order_recommendation_line__product_is_favorite
msgid "Favorite"
msgstr "Favori"
#. module: sale_order_product_recommendation
#: model:ir.model.fields,field_description:sale_order_product_recommendation.field_res_company__force_zero_units_included
#: model:ir.model.fields,field_description:sale_order_product_recommendation.field_res_config_settings__force_zero_units_included
msgid "Force Zero Units Included"
msgstr "Forcer les unités incluses à zéro"
#. module: sale_order_product_recommendation
#: model_terms:ir.ui.view,arch_db:sale_order_product_recommendation.sale_order_recommendation_view_form
msgid "Get recommendations"
msgstr "Obtenir des recommandations"
#. module: sale_order_product_recommendation
#: model:ir.model.fields,field_description:sale_order_product_recommendation.field_sale_order_recommendation__id
#: model:ir.model.fields,field_description:sale_order_product_recommendation.field_sale_order_recommendation_line__id
msgid "ID"
msgstr "ID"
#. module: sale_order_product_recommendation
#: model_terms:ir.ui.view,arch_db:sale_order_product_recommendation.res_config_settings_view_form_sale
msgid ""
"If this is selected, it will take care by default on"
" Delivery Address instead of customer on "
"sale orders recommendation"
msgstr ""
"Lorsque cette case est cochée, la recommandation s'appliquera par défaut à "
"l'adresse de livraison au lieu du client des commandes de vente"
#. module: sale_order_product_recommendation
#: model:ir.model.fields,help:sale_order_product_recommendation.field_sale_order_recommendation_line__pricelist_id
msgid "If you change the pricelist, only newly added lines will be affected."
msgstr ""
"Si vous modifiez la liste de prix, seules les lignes ajoutées après cette "
"modification seront affectées."
#. module: sale_order_product_recommendation
#: model:ir.model.fields,field_description:sale_order_product_recommendation.field_sale_order_recommendation_line__product_default_code
msgid "Internal Reference"
msgstr "Référence interne"
#. module: sale_order_product_recommendation
#: model:ir.model.fields,field_description:sale_order_product_recommendation.field_sale_order_recommendation__write_uid
#: model:ir.model.fields,field_description:sale_order_product_recommendation.field_sale_order_recommendation_line__write_uid
msgid "Last Updated by"
msgstr "Mis à jour par"
#. module: sale_order_product_recommendation
#: model:ir.model.fields,field_description:sale_order_product_recommendation.field_sale_order_recommendation__write_date
#: model:ir.model.fields,field_description:sale_order_product_recommendation.field_sale_order_recommendation_line__write_date
msgid "Last Updated on"
msgstr "Mis à jour le"
#. module: sale_order_product_recommendation
#: model:ir.model.fields.selection,name:sale_order_product_recommendation.selection__res_config_settings__default_sale_recommendation_price_origin__last_sale_price
#: model:ir.model.fields.selection,name:sale_order_product_recommendation.selection__sale_order_recommendation__sale_recommendation_price_origin__last_sale_price
msgid "Last sale price"
msgstr "Dernier prix de vente"
#. module: sale_order_product_recommendation
#: model:ir.model.fields,field_description:sale_order_product_recommendation.field_sale_order_recommendation__months
msgid "Months"
msgstr "Mois"
#. module: sale_order_product_recommendation
#: model:ir.model.fields,field_description:sale_order_product_recommendation.field_sale_order_recommendation_line__product_name
msgid "Name"
msgstr "Nom du produit"
#. module: sale_order_product_recommendation
#. odoo-python
#: code:addons/sale_order_product_recommendation/wizards/sale_order_recommendation.py:0
msgid "Nothing found! Modify your criteria or fill the order manually."
msgstr ""
"Aucun résultat trouvé ! Modifiez vos critères ou renseignez manuellement la "
"commande."
#. module: sale_order_product_recommendation
#: model:ir.model.fields,field_description:sale_order_product_recommendation.field_sale_order_recommendation__line_amount
msgid "Number of recommendations"
msgstr "Nombre de recommandations"
#. module: sale_order_product_recommendation
#: model:ir.model.fields,field_description:sale_order_product_recommendation.field_sale_order_recommendation_line__price_unit
msgid "Price Unit"
msgstr "Prix unitaire"
#. module: sale_order_product_recommendation
#: model:ir.model.fields,field_description:sale_order_product_recommendation.field_res_config_settings__default_sale_recommendation_price_origin
msgid "Price origin"
msgstr "Origine du prix"
#. module: sale_order_product_recommendation
#: model_terms:ir.ui.view,arch_db:sale_order_product_recommendation.sale_order_recommendation_view_form
msgid "Price:"
msgstr "Prix :"
#. module: sale_order_product_recommendation
#: model:ir.model.fields,field_description:sale_order_product_recommendation.field_sale_order_recommendation_line__pricelist_id
#: model:ir.model.fields.selection,name:sale_order_product_recommendation.selection__res_config_settings__default_sale_recommendation_price_origin__pricelist
#: model:ir.model.fields.selection,name:sale_order_product_recommendation.selection__sale_order_recommendation__sale_recommendation_price_origin__pricelist
msgid "Pricelist"
msgstr "Liste de prix"
#. module: sale_order_product_recommendation
#: model:ir.model.fields,field_description:sale_order_product_recommendation.field_sale_order_recommendation_line__product_id
#: model_terms:ir.ui.view,arch_db:sale_order_product_recommendation.sale_order_recommendation_view_form
msgid "Product"
msgstr "Produit"
#. module: sale_order_product_recommendation
#: model:ir.model.fields,field_description:sale_order_product_recommendation.field_sale_order_recommendation_line__product_uom_readonly
msgid "Product Uom Readonly"
msgstr "UdM du produit en lecture seule"
#. module: sale_order_product_recommendation
#: model:ir.model.fields,field_description:sale_order_product_recommendation.field_sale_order_recommendation_line__product_categ_complete_name
#: model:ir.model.fields.selection,name:sale_order_product_recommendation.selection__sale_order_recommendation__recommendations_order__product_categ_complete_name_asc
msgid "Product category"
msgstr "Catégorie de produits"
#. module: sale_order_product_recommendation
#: model:ir.model.fields.selection,name:sale_order_product_recommendation.selection__sale_order_recommendation__recommendations_order__product_default_code_asc
msgid "Product code"
msgstr "Référence interne du produit"
#. module: sale_order_product_recommendation
#: model:ir.model.fields.selection,name:sale_order_product_recommendation.selection__sale_order_recommendation__recommendations_order__product_name_asc
msgid "Product name"
msgstr "Nom du produit"
#. module: sale_order_product_recommendation
#: model:ir.model.fields,field_description:sale_order_product_recommendation.field_sale_order_recommendation__sale_recommendation_price_origin
msgid "Product price origin"
msgstr "Origine du prix du produit"
#. module: sale_order_product_recommendation
#: model_terms:ir.ui.view,arch_db:sale_order_product_recommendation.res_config_settings_view_form_sale
msgid "Product recommendation price origin"
msgstr "Origine du prix de la recommandation de produit"
#. module: sale_order_product_recommendation
#: model:ir.model.fields,field_description:sale_order_product_recommendation.field_sale_order_recommendation__line_ids
msgid "Products"
msgstr "Lignes de recommandation produits"
#. module: sale_order_product_recommendation
#: model:ir.model.fields,field_description:sale_order_product_recommendation.field_sale_order_recommendation__recommendations_order
msgid "Recommendations Order"
msgstr "Ordre des recommandations"
#. module: sale_order_product_recommendation
#: model_terms:ir.ui.view,arch_db:sale_order_product_recommendation.view_order_form
msgid "Recommended Products"
msgstr "Produits recommandés"
#. module: sale_order_product_recommendation
#: model:ir.actions.act_window,name:sale_order_product_recommendation.sale_order_recommendation_action
msgid "Recommended Products for this Customer"
msgstr "Produits recommandés pour ce client"
#. module: sale_order_product_recommendation
#: model:ir.model,name:sale_order_product_recommendation.model_sale_order_recommendation_line
msgid "Recommended product for current sale order"
msgstr "Produit recommandé pour la commande en cours"
#. module: sale_order_product_recommendation
#: model:ir.model,name:sale_order_product_recommendation.model_sale_order_recommendation
msgid "Recommended products for current sale order"
msgstr "Produits recommandés pour la commande en cours"
#. module: sale_order_product_recommendation
#: model:ir.model.fields,field_description:sale_order_product_recommendation.field_sale_order_recommendation_line__sale_line_id
msgid "Sale Line"
msgstr "Ligne de vente"
#. module: sale_order_product_recommendation
#: model:ir.model.fields,field_description:sale_order_product_recommendation.field_res_company__sale_line_recommendation_domain
#: model:ir.model.fields,field_description:sale_order_product_recommendation.field_res_config_settings__sale_line_recommendation_domain
msgid "Sale Line Recommendation Domain"
msgstr "Domaine de la ligne de recommandation de vente"
#. module: sale_order_product_recommendation
#: model:ir.model.fields,field_description:sale_order_product_recommendation.field_sale_order_recommendation__order_id
msgid "Sale Order"
msgstr "Référence de commande"
#. module: sale_order_product_recommendation
#: model_terms:ir.ui.view,arch_db:sale_order_product_recommendation.res_config_settings_view_form_sale
msgid "Sale order product recommendation domain"
msgstr "Domaine de recommandation de produit des commandes de vente"
#. module: sale_order_product_recommendation
#: model_terms:ir.ui.view,arch_db:sale_order_product_recommendation.res_config_settings_view_form_sale
msgid "Sale order recommendations"
msgstr "Recommandations de commande de vente"
#. module: sale_order_product_recommendation
#: model_terms:ir.ui.view,arch_db:sale_order_product_recommendation.res_config_settings_view_form_sale
msgid ""
"Select the origin for display product price in sale orders recommendation"
msgstr ""
"Sélectionner l'origine du prix du produit affiché dans les recommandations "
"de vente"
#. module: sale_order_product_recommendation
#: model:ir.model.fields,help:sale_order_product_recommendation.field_sale_order_recommendation__line_amount
msgid "The less, the faster they will be found."
msgstr "Moins il y en a, plus vite elles seront trouvées."
#. module: sale_order_product_recommendation
#: model:ir.model.fields,field_description:sale_order_product_recommendation.field_sale_order_recommendation_line__times_delivered
msgid "Times Delivered"
msgstr "Nombre de livraisons"
#. module: sale_order_product_recommendation
#: model:ir.model.fields.selection,name:sale_order_product_recommendation.selection__sale_order_recommendation__recommendations_order__times_delivered_desc
msgid "Times delivered"
msgstr "Nombre de livraisons"
#. module: sale_order_product_recommendation
#: model:ir.model.fields,field_description:sale_order_product_recommendation.field_sale_order_recommendation_line__sale_uom_id
msgid "Unit of Measure"
msgstr "Unité de mesure"
#. module: sale_order_product_recommendation
#: model:ir.model.fields,field_description:sale_order_product_recommendation.field_sale_order_recommendation_line__units_delivered
msgid "Units Delivered"
msgstr "Unités livrées"
#. module: sale_order_product_recommendation
#: model:ir.model.fields,field_description:sale_order_product_recommendation.field_sale_order_recommendation_line__units_included
msgid "Units Included"
msgstr "Unités incluses"
#. module: sale_order_product_recommendation
#: model:ir.model.fields.selection,name:sale_order_product_recommendation.selection__sale_order_recommendation__recommendations_order__units_delivered_desc
msgid "Units delivered"
msgstr "Unités livrées"
#. module: sale_order_product_recommendation
#: model:ir.model.fields,field_description:sale_order_product_recommendation.field_res_config_settings__default_use_delivery_address
#: model:ir.model.fields,field_description:sale_order_product_recommendation.field_sale_order_recommendation__use_delivery_address
#: model_terms:ir.ui.view,arch_db:sale_order_product_recommendation.res_config_settings_view_form_sale
msgid "Use delivery address"
msgstr "Utiliser l'adresse de livraison"
#. module: sale_order_product_recommendation
#: model:ir.model.fields,field_description:sale_order_product_recommendation.field_sale_order_recommendation_line__wizard_id
msgid "Wizard"
msgstr "Assistant"
#. module: sale_order_product_recommendation
#: model_terms:ir.ui.view,arch_db:sale_order_product_recommendation.sale_order_recommendation_view_form
msgid "You will lose any changes you have made. Are you sure?"
msgstr ""
"Vous perdrez toutes les modifications que vous avez apportées. Êtes-vous sûr "
"?"
#. module: sale_order_product_recommendation
#: model_terms:ir.ui.view,arch_db:sale_order_product_recommendation.sale_order_recommendation_view_form
msgid "times -"
msgstr "fois -"

View File

@@ -0,0 +1,432 @@
# Translation of Odoo Server.
# This file contains the translation of the following modules:
# * sale_order_product_recommendation
#
msgid ""
msgstr ""
"Project-Id-Version: Odoo Server 16.0\n"
"Report-Msgid-Bugs-To: \n"
"PO-Revision-Date: 2024-02-16 16:37+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 4.17\n"
#. module: sale_order_product_recommendation
#: model_terms:ir.ui.view,arch_db:sale_order_product_recommendation.res_config_settings_view_form_sale
msgid ""
"<span class=\"o_form_label\">Add recommended with zero units included</span>"
msgstr ""
"<span class=\"o_form_label\">Aggiungi suggeriti con zero unità incluse</span>"
#. module: sale_order_product_recommendation
#: model_terms:ir.ui.view,arch_db:sale_order_product_recommendation.res_config_settings_view_form_sale
msgid "<span class=\"o_form_label\">Default Number of recommendations</span>"
msgstr "<span class=\"o_form_label\">Numero suggerimenti prdefinito</span>"
#. module: sale_order_product_recommendation
#: model_terms:ir.ui.view,arch_db:sale_order_product_recommendation.res_config_settings_view_form_sale
msgid ""
"<span class=\"o_form_label\">Default months backwards to generate "
"recommendations</span>"
msgstr ""
"<span class=\"o_form_label\">Mesi antecedenti predefiniti per generare "
"suggerimenti</span>"
#. module: sale_order_product_recommendation
#: model_terms:ir.ui.view,arch_db:sale_order_product_recommendation.res_config_settings_view_form_sale
msgid "<span class=\"o_form_label\">Product recommendation price origin</span>"
msgstr ""
"<span class=\"o_form_label\">Origine prezzo suggerimento prodotto</span>"
#. module: sale_order_product_recommendation
#: model_terms:ir.ui.view,arch_db:sale_order_product_recommendation.res_config_settings_view_form_sale
msgid ""
"<span class=\"o_form_label\">Sale order product recommendation domain</span>"
msgstr ""
"<span class=\"o_form_label\">Dominio suggerimento prodotto ordine di "
"vendita</span>"
#. module: sale_order_product_recommendation
#: model_terms:ir.ui.view,arch_db:sale_order_product_recommendation.res_config_settings_view_form_sale
msgid "<span class=\"o_form_label\">Use delivery address</span>"
msgstr "<span class=\"o_form_label\">Usa indirizzo consegna</span>"
#. module: sale_order_product_recommendation
#: model_terms:ir.ui.view,arch_db:sale_order_product_recommendation.sale_order_recommendation_view_form
msgid "<span>To be included: </span>"
msgstr "<span>Da includere: </span>"
#. module: sale_order_product_recommendation
#: model_terms:ir.ui.view,arch_db:sale_order_product_recommendation.sale_order_recommendation_view_form
msgid "Accept"
msgstr "Accetta"
#. module: sale_order_product_recommendation
#: model:ir.model.fields,help:sale_order_product_recommendation.field_res_config_settings__force_zero_units_included
#: model_terms:ir.ui.view,arch_db:sale_order_product_recommendation.res_config_settings_view_form_sale
msgid "Add recomented products in so even if units included is zero."
msgstr ""
"Aggiungere prodotti suggeriti in OV anche se le unità incluse sono zero."
#. module: sale_order_product_recommendation
#: model_terms:ir.ui.view,arch_db:sale_order_product_recommendation.sale_order_recommendation_view_form
msgid "Cancel"
msgstr "Annulla"
#. module: sale_order_product_recommendation
#: model:ir.model.fields,field_description:sale_order_product_recommendation.field_sale_order_recommendation_line__product_uom_category_id
msgid "Category"
msgstr "Categoria"
#. module: sale_order_product_recommendation
#: model_terms:ir.ui.view,arch_db:sale_order_product_recommendation.sale_order_recommendation_view_form
msgid "Change criteria"
msgstr "Modifica criterio"
#. module: sale_order_product_recommendation
#: model:ir.model,name:sale_order_product_recommendation.model_res_company
msgid "Companies"
msgstr "Aziende"
#. module: sale_order_product_recommendation
#: model:ir.model,name:sale_order_product_recommendation.model_res_config_settings
msgid "Config Settings"
msgstr "Impostazioni configurazione"
#. module: sale_order_product_recommendation
#: model:ir.model.fields,help:sale_order_product_recommendation.field_sale_order_recommendation__months
msgid "Consider these months backwards to generate recommendations."
msgstr "Considerare questi mesi precedenti per generare suggerimenti."
#. module: sale_order_product_recommendation
#: model:ir.model.fields,help:sale_order_product_recommendation.field_sale_order_recommendation_line__product_uom_category_id
msgid ""
"Conversion between Units of Measure can only occur if they belong to the "
"same category. The conversion will be made based on the ratios."
msgstr ""
"Le conversioni tra unità di misura possono avvenire solo se appartengono "
"alla stessa categoria. La conversione verrà effettuata in base alle "
"proporzioni."
#. module: sale_order_product_recommendation
#: model:ir.model.fields,field_description:sale_order_product_recommendation.field_sale_order_recommendation__create_uid
#: model:ir.model.fields,field_description:sale_order_product_recommendation.field_sale_order_recommendation_line__create_uid
msgid "Created by"
msgstr "Creato da"
#. module: sale_order_product_recommendation
#: model:ir.model.fields,field_description:sale_order_product_recommendation.field_sale_order_recommendation__create_date
#: model:ir.model.fields,field_description:sale_order_product_recommendation.field_sale_order_recommendation_line__create_date
msgid "Created on"
msgstr "Creato il"
#. module: sale_order_product_recommendation
#: model:ir.model.fields,field_description:sale_order_product_recommendation.field_sale_order_recommendation_line__currency_id
msgid "Currency"
msgstr "Valuta"
#. module: sale_order_product_recommendation
#: model:ir.model.fields,field_description:sale_order_product_recommendation.field_sale_order_recommendation_line__partner_id
msgid "Customer"
msgstr "Cliente"
#. module: sale_order_product_recommendation
#: model:ir.model.fields,field_description:sale_order_product_recommendation.field_res_config_settings__default_line_amount
msgid "Default sale number of recommendations"
msgstr "Numero predefinito numero suggeimenti vendita"
#. module: sale_order_product_recommendation
#: model:ir.model.fields,field_description:sale_order_product_recommendation.field_res_config_settings__default_months
msgid "Default sale recommendation months"
msgstr "Mesi suggerimenti vendita predefiniti"
#. module: sale_order_product_recommendation
#: model_terms:ir.ui.view,arch_db:sale_order_product_recommendation.sale_order_recommendation_view_form
msgid "Delivered:"
msgstr "Consegnato:"
#. module: sale_order_product_recommendation
#: model:ir.model.fields,field_description:sale_order_product_recommendation.field_sale_order_recommendation__display_name
#: model:ir.model.fields,field_description:sale_order_product_recommendation.field_sale_order_recommendation_line__display_name
msgid "Display Name"
msgstr "Nome visualizzato"
#. module: sale_order_product_recommendation
#: model_terms:ir.ui.view,arch_db:sale_order_product_recommendation.res_config_settings_view_form_sale
msgid "Domain applied on sale orders lines to recommend products for sales"
msgstr ""
"Dominio applicato alle righe ordini di vendita per prodotti suggeriti per le "
"vendite"
#. module: sale_order_product_recommendation
#: model:ir.model.fields,help:sale_order_product_recommendation.field_res_config_settings__sale_line_recommendation_domain
msgid "Domain applied to find SO lines to propose as recommended products."
msgstr ""
"Dominio applicato per trovare righe OV da proporre come prodotti suggeriti."
#. module: sale_order_product_recommendation
#: model:ir.model.fields,field_description:sale_order_product_recommendation.field_sale_order_recommendation_line__product_is_favorite
msgid "Favorite"
msgstr "Favorito"
#. module: sale_order_product_recommendation
#: model:ir.model.fields,field_description:sale_order_product_recommendation.field_res_company__force_zero_units_included
#: model:ir.model.fields,field_description:sale_order_product_recommendation.field_res_config_settings__force_zero_units_included
msgid "Force Zero Units Included"
msgstr "Forza zero unità inclusi"
#. module: sale_order_product_recommendation
#: model_terms:ir.ui.view,arch_db:sale_order_product_recommendation.sale_order_recommendation_view_form
msgid "Get recommendations"
msgstr "Ottieni suggerimenti"
#. module: sale_order_product_recommendation
#: model:ir.model.fields,field_description:sale_order_product_recommendation.field_sale_order_recommendation__id
#: model:ir.model.fields,field_description:sale_order_product_recommendation.field_sale_order_recommendation_line__id
msgid "ID"
msgstr "ID"
#. module: sale_order_product_recommendation
#: model_terms:ir.ui.view,arch_db:sale_order_product_recommendation.res_config_settings_view_form_sale
msgid ""
"If this is selected, it will take care by default on\n"
" Delivery Address instead of customer on sale "
"orders\n"
" recommendation"
msgstr ""
"Se selezionata, terrà in considerazione in modo predefinito gli\n"
" indirizzi di consegna invece dei clienti nei "
"suggerimenti negli\n"
" ordini di vendita"
#. module: sale_order_product_recommendation
#: model:ir.model.fields,help:sale_order_product_recommendation.field_sale_order_recommendation_line__pricelist_id
msgid "If you change the pricelist, only newly added lines will be affected."
msgstr ""
"Se si modifica il listino, solo le nuove righe aggiunte verranno interessate."
#. module: sale_order_product_recommendation
#: model:ir.model.fields,field_description:sale_order_product_recommendation.field_sale_order_recommendation_line__product_default_code
msgid "Internal Reference"
msgstr "Riferimento interno"
#. module: sale_order_product_recommendation
#: model:ir.model.fields,field_description:sale_order_product_recommendation.field_sale_order_recommendation____last_update
#: model:ir.model.fields,field_description:sale_order_product_recommendation.field_sale_order_recommendation_line____last_update
msgid "Last Modified on"
msgstr "Ultima modifica il"
#. module: sale_order_product_recommendation
#: model:ir.model.fields,field_description:sale_order_product_recommendation.field_sale_order_recommendation__write_uid
#: model:ir.model.fields,field_description:sale_order_product_recommendation.field_sale_order_recommendation_line__write_uid
msgid "Last Updated by"
msgstr "Ultimo aggiornamento di"
#. module: sale_order_product_recommendation
#: model:ir.model.fields,field_description:sale_order_product_recommendation.field_sale_order_recommendation__write_date
#: model:ir.model.fields,field_description:sale_order_product_recommendation.field_sale_order_recommendation_line__write_date
msgid "Last Updated on"
msgstr "Ultimo aggiornamento il"
#. module: sale_order_product_recommendation
#: model:ir.model.fields.selection,name:sale_order_product_recommendation.selection__res_config_settings__default_sale_recommendation_price_origin__last_sale_price
#: model:ir.model.fields.selection,name:sale_order_product_recommendation.selection__sale_order_recommendation__sale_recommendation_price_origin__last_sale_price
msgid "Last sale price"
msgstr "Ultimo prezzo di vendita"
#. module: sale_order_product_recommendation
#: model:ir.model.fields,field_description:sale_order_product_recommendation.field_sale_order_recommendation__months
msgid "Months"
msgstr "Mesi"
#. module: sale_order_product_recommendation
#: model:ir.model.fields,field_description:sale_order_product_recommendation.field_sale_order_recommendation_line__product_name
msgid "Name"
msgstr "Nome"
#. module: sale_order_product_recommendation
#. odoo-python
#: code:addons/sale_order_product_recommendation/wizards/sale_order_recommendation.py:0
#, python-format
msgid "Nothing found! Modify your criteria or fill the order manually."
msgstr ""
"Nessun risultato! Modificare i criteri o compilare manualmente l'ordine."
#. module: sale_order_product_recommendation
#: model:ir.model.fields,field_description:sale_order_product_recommendation.field_sale_order_recommendation__line_amount
msgid "Number of recommendations"
msgstr "Numero di suggerimenti"
#. module: sale_order_product_recommendation
#: model:ir.model.fields,field_description:sale_order_product_recommendation.field_sale_order_recommendation_line__price_unit
msgid "Price Unit"
msgstr "Prezzo unitario"
#. module: sale_order_product_recommendation
#: model:ir.model.fields,field_description:sale_order_product_recommendation.field_res_config_settings__default_sale_recommendation_price_origin
msgid "Price origin"
msgstr "Origine prezzo"
#. module: sale_order_product_recommendation
#: model_terms:ir.ui.view,arch_db:sale_order_product_recommendation.sale_order_recommendation_view_form
msgid "Price:"
msgstr "Prezzo:"
#. module: sale_order_product_recommendation
#: model:ir.model.fields,field_description:sale_order_product_recommendation.field_sale_order_recommendation_line__pricelist_id
#: model:ir.model.fields.selection,name:sale_order_product_recommendation.selection__res_config_settings__default_sale_recommendation_price_origin__pricelist
#: model:ir.model.fields.selection,name:sale_order_product_recommendation.selection__sale_order_recommendation__sale_recommendation_price_origin__pricelist
msgid "Pricelist"
msgstr "Listino prezzi"
#. module: sale_order_product_recommendation
#: model:ir.model.fields,field_description:sale_order_product_recommendation.field_sale_order_recommendation_line__product_id
#: model_terms:ir.ui.view,arch_db:sale_order_product_recommendation.sale_order_recommendation_view_form
msgid "Product"
msgstr "Prodotto"
#. module: sale_order_product_recommendation
#: model:ir.model.fields,field_description:sale_order_product_recommendation.field_sale_order_recommendation_line__product_uom_readonly
msgid "Product Uom Readonly"
msgstr "UdM prodotto solo lettura"
#. module: sale_order_product_recommendation
#: model:ir.model.fields,field_description:sale_order_product_recommendation.field_sale_order_recommendation_line__product_categ_complete_name
#: model:ir.model.fields.selection,name:sale_order_product_recommendation.selection__sale_order_recommendation__recommendations_order__product_categ_complete_name_asc
msgid "Product category"
msgstr "Categoria prodotto"
#. module: sale_order_product_recommendation
#: model:ir.model.fields.selection,name:sale_order_product_recommendation.selection__sale_order_recommendation__recommendations_order__product_default_code_asc
msgid "Product code"
msgstr "Codice prodotto"
#. module: sale_order_product_recommendation
#: model:ir.model.fields.selection,name:sale_order_product_recommendation.selection__sale_order_recommendation__recommendations_order__product_name_asc
msgid "Product name"
msgstr "Nome prodotto"
#. module: sale_order_product_recommendation
#: model:ir.model.fields,field_description:sale_order_product_recommendation.field_sale_order_recommendation__sale_recommendation_price_origin
msgid "Product price origin"
msgstr "Origine prezzo prdotto"
#. module: sale_order_product_recommendation
#: model:ir.model.fields,field_description:sale_order_product_recommendation.field_sale_order_recommendation__line_ids
msgid "Products"
msgstr "Prodotti"
#. module: sale_order_product_recommendation
#: model:ir.model.fields,field_description:sale_order_product_recommendation.field_sale_order_recommendation__recommendations_order
msgid "Recommendations Order"
msgstr "Suggerimenti ordine"
#. module: sale_order_product_recommendation
#: model_terms:ir.ui.view,arch_db:sale_order_product_recommendation.view_order_form
msgid "Recommended Products"
msgstr "Prodotti suggeriti"
#. module: sale_order_product_recommendation
#: model:ir.actions.act_window,name:sale_order_product_recommendation.sale_order_recommendation_action
msgid "Recommended Products for this Customer"
msgstr "Prodtti suggeriti per questo cliente"
#. module: sale_order_product_recommendation
#: model:ir.model,name:sale_order_product_recommendation.model_sale_order_recommendation_line
msgid "Recommended product for current sale order"
msgstr "Prodotto consigliato per questo ordine di vendita"
#. module: sale_order_product_recommendation
#: model:ir.model,name:sale_order_product_recommendation.model_sale_order_recommendation
msgid "Recommended products for current sale order"
msgstr "Prodotto suggerito per questo ordine di vendita"
#. module: sale_order_product_recommendation
#: model:ir.model.fields,field_description:sale_order_product_recommendation.field_sale_order_recommendation_line__sale_line_id
msgid "Sale Line"
msgstr "Riga di vendita"
#. module: sale_order_product_recommendation
#: model:ir.model.fields,field_description:sale_order_product_recommendation.field_res_company__sale_line_recommendation_domain
#: model:ir.model.fields,field_description:sale_order_product_recommendation.field_res_config_settings__sale_line_recommendation_domain
msgid "Sale Line Recommendation Domain"
msgstr "Domnio suggerimenti riga vendita"
#. module: sale_order_product_recommendation
#: model:ir.model.fields,field_description:sale_order_product_recommendation.field_sale_order_recommendation__order_id
msgid "Sale Order"
msgstr "Ordine di vendita"
#. module: sale_order_product_recommendation
#: model_terms:ir.ui.view,arch_db:sale_order_product_recommendation.res_config_settings_view_form_sale
msgid "Sale order recommendations"
msgstr "Suggerimenti ordine di vendita"
#. module: sale_order_product_recommendation
#: model_terms:ir.ui.view,arch_db:sale_order_product_recommendation.res_config_settings_view_form_sale
msgid ""
"Select the origin for display product price in sale orders recommendation"
msgstr ""
"Selezionare l'origine per vsualizzare il prezzo del prodotto nei "
"suggerimenti degli ordini di vendita"
#. module: sale_order_product_recommendation
#: model:ir.model.fields,help:sale_order_product_recommendation.field_sale_order_recommendation__line_amount
msgid "The less, the faster they will be found."
msgstr "Meno sono, più velocemente verranno trovati."
#. module: sale_order_product_recommendation
#: model:ir.model.fields,field_description:sale_order_product_recommendation.field_sale_order_recommendation_line__times_delivered
msgid "Times Delivered"
msgstr "Numero consegne"
#. module: sale_order_product_recommendation
#: model:ir.model.fields.selection,name:sale_order_product_recommendation.selection__sale_order_recommendation__recommendations_order__times_delivered_desc
msgid "Times delivered"
msgstr "Numero consegne"
#. module: sale_order_product_recommendation
#: model:ir.model.fields,field_description:sale_order_product_recommendation.field_sale_order_recommendation_line__sale_uom_id
msgid "Unit of Measure"
msgstr "Unità di misura"
#. module: sale_order_product_recommendation
#: model:ir.model.fields,field_description:sale_order_product_recommendation.field_sale_order_recommendation_line__units_delivered
msgid "Units Delivered"
msgstr "Unità consegnate"
#. module: sale_order_product_recommendation
#: model:ir.model.fields,field_description:sale_order_product_recommendation.field_sale_order_recommendation_line__units_included
msgid "Units Included"
msgstr "Unità incluse"
#. module: sale_order_product_recommendation
#: model:ir.model.fields.selection,name:sale_order_product_recommendation.selection__sale_order_recommendation__recommendations_order__units_delivered_desc
msgid "Units delivered"
msgstr "Unità consegnate"
#. module: sale_order_product_recommendation
#: model:ir.model.fields,field_description:sale_order_product_recommendation.field_res_config_settings__default_use_delivery_address
#: model:ir.model.fields,field_description:sale_order_product_recommendation.field_sale_order_recommendation__use_delivery_address
msgid "Use delivery address"
msgstr "Usa indirizzo consegna"
#. module: sale_order_product_recommendation
#: model:ir.model.fields,field_description:sale_order_product_recommendation.field_sale_order_recommendation_line__wizard_id
msgid "Wizard"
msgstr "Procedura guidata"
#. module: sale_order_product_recommendation
#: model_terms:ir.ui.view,arch_db:sale_order_product_recommendation.sale_order_recommendation_view_form
msgid "You will lose any changes you have made. Are you sure?"
msgstr "Verranno perse tutte le modifiche fatte. Sicuri di procedere?"
#. module: sale_order_product_recommendation
#: model_terms:ir.ui.view,arch_db:sale_order_product_recommendation.sale_order_recommendation_view_form
msgid "times -"
msgstr "numero -"

View File

@@ -0,0 +1,435 @@
# Translation of Odoo Server.
# This file contains the translation of the following modules:
# * sale_order_product_recommendation
#
msgid ""
msgstr ""
"Project-Id-Version: Odoo Server 12.0\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2022-06-28 21:18+0000\n"
"PO-Revision-Date: 2024-05-29 19:38+0000\n"
"Last-Translator: Rodrigo Macedo <sottomaiormacedotec@users.noreply."
"translation.odoo-community.org>\n"
"Language-Team: \n"
"Language: pt_BR\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: \n"
"Plural-Forms: nplurals=2; plural=n > 1;\n"
"X-Generator: Weblate 4.17\n"
#. module: sale_order_product_recommendation
#: model_terms:ir.ui.view,arch_db:sale_order_product_recommendation.res_config_settings_view_form_sale
msgid ""
"<span class=\"o_form_label\">Add recommended with zero units included</span>"
msgstr ""
"<span class=\"o_form_label\">Adicionar recomendado com zero unidades "
"incluídas</span>"
#. module: sale_order_product_recommendation
#: model_terms:ir.ui.view,arch_db:sale_order_product_recommendation.res_config_settings_view_form_sale
msgid "<span class=\"o_form_label\">Default Number of recommendations</span>"
msgstr "<span class=\"o_form_label\">Número padrão de recomendações</span>"
#. module: sale_order_product_recommendation
#: model_terms:ir.ui.view,arch_db:sale_order_product_recommendation.res_config_settings_view_form_sale
msgid ""
"<span class=\"o_form_label\">Default months backwards to generate "
"recommendations</span>"
msgstr ""
"<span class=\"o_form_label\">Meses anteriores padrão para gerar "
"recomendações</span>"
#. module: sale_order_product_recommendation
#: model_terms:ir.ui.view,arch_db:sale_order_product_recommendation.res_config_settings_view_form_sale
msgid "<span class=\"o_form_label\">Product recommendation price origin</span>"
msgstr ""
"<span class=\"o_form_label\">Origem do preço recomendado do produto</span>"
#. module: sale_order_product_recommendation
#: model_terms:ir.ui.view,arch_db:sale_order_product_recommendation.res_config_settings_view_form_sale
msgid ""
"<span class=\"o_form_label\">Sale order product recommendation domain</span>"
msgstr ""
"<span class=\"o_form_label\">Domínio de recomendação de produtos para "
"pedidos de venda</span>"
#. module: sale_order_product_recommendation
#: model_terms:ir.ui.view,arch_db:sale_order_product_recommendation.res_config_settings_view_form_sale
msgid "<span class=\"o_form_label\">Use delivery address</span>"
msgstr "<span class=\"o_form_label\">Usar endereço de entrega</span>"
#. module: sale_order_product_recommendation
#: model_terms:ir.ui.view,arch_db:sale_order_product_recommendation.sale_order_recommendation_view_form
msgid "<span>To be included: </span>"
msgstr "<span>Para ser incluído: </span>"
#. module: sale_order_product_recommendation
#: model_terms:ir.ui.view,arch_db:sale_order_product_recommendation.sale_order_recommendation_view_form
msgid "Accept"
msgstr "Aceitar"
#. module: sale_order_product_recommendation
#: model:ir.model.fields,help:sale_order_product_recommendation.field_res_config_settings__force_zero_units_included
#: model_terms:ir.ui.view,arch_db:sale_order_product_recommendation.res_config_settings_view_form_sale
msgid "Add recomented products in so even if units included is zero."
msgstr ""
"Adicione produtos recomendados mesmo que as unidades incluídas sejam zero."
#. module: sale_order_product_recommendation
#: model_terms:ir.ui.view,arch_db:sale_order_product_recommendation.sale_order_recommendation_view_form
msgid "Cancel"
msgstr "Cancelar"
#. module: sale_order_product_recommendation
#: model:ir.model.fields,field_description:sale_order_product_recommendation.field_sale_order_recommendation_line__product_uom_category_id
msgid "Category"
msgstr "Categoria"
#. module: sale_order_product_recommendation
#: model_terms:ir.ui.view,arch_db:sale_order_product_recommendation.sale_order_recommendation_view_form
msgid "Change criteria"
msgstr "Alterar critérios"
#. module: sale_order_product_recommendation
#: model:ir.model,name:sale_order_product_recommendation.model_res_company
msgid "Companies"
msgstr "Empresas"
#. module: sale_order_product_recommendation
#: model:ir.model,name:sale_order_product_recommendation.model_res_config_settings
msgid "Config Settings"
msgstr "Configurações"
#. module: sale_order_product_recommendation
#: model:ir.model.fields,help:sale_order_product_recommendation.field_sale_order_recommendation__months
msgid "Consider these months backwards to generate recommendations."
msgstr "Considere esses meses retroativos para gerar recomendações."
#. module: sale_order_product_recommendation
#: model:ir.model.fields,help:sale_order_product_recommendation.field_sale_order_recommendation_line__product_uom_category_id
msgid ""
"Conversion between Units of Measure can only occur if they belong to the "
"same category. The conversion will be made based on the ratios."
msgstr ""
"A conversão entre Unidades de Medida só poderá ocorrer se pertencerem à "
"mesma categoria. A conversão será feita com base nos índices."
#. module: sale_order_product_recommendation
#: model:ir.model.fields,field_description:sale_order_product_recommendation.field_sale_order_recommendation__create_uid
#: model:ir.model.fields,field_description:sale_order_product_recommendation.field_sale_order_recommendation_line__create_uid
msgid "Created by"
msgstr "Criado por"
#. module: sale_order_product_recommendation
#: model:ir.model.fields,field_description:sale_order_product_recommendation.field_sale_order_recommendation__create_date
#: model:ir.model.fields,field_description:sale_order_product_recommendation.field_sale_order_recommendation_line__create_date
msgid "Created on"
msgstr "Criado em"
#. module: sale_order_product_recommendation
#: model:ir.model.fields,field_description:sale_order_product_recommendation.field_sale_order_recommendation_line__currency_id
msgid "Currency"
msgstr "Moeda"
#. module: sale_order_product_recommendation
#: model:ir.model.fields,field_description:sale_order_product_recommendation.field_sale_order_recommendation_line__partner_id
msgid "Customer"
msgstr "Cliente"
#. module: sale_order_product_recommendation
#: model:ir.model.fields,field_description:sale_order_product_recommendation.field_res_config_settings__default_line_amount
msgid "Default sale number of recommendations"
msgstr "Número de recomendações de venda padrão"
#. module: sale_order_product_recommendation
#: model:ir.model.fields,field_description:sale_order_product_recommendation.field_res_config_settings__default_months
msgid "Default sale recommendation months"
msgstr "Meses de recomendação de venda padrão"
#. module: sale_order_product_recommendation
#: model_terms:ir.ui.view,arch_db:sale_order_product_recommendation.sale_order_recommendation_view_form
msgid "Delivered:"
msgstr "Entregue:"
#. module: sale_order_product_recommendation
#: model:ir.model.fields,field_description:sale_order_product_recommendation.field_sale_order_recommendation__display_name
#: model:ir.model.fields,field_description:sale_order_product_recommendation.field_sale_order_recommendation_line__display_name
msgid "Display Name"
msgstr "Nome Exibição"
#. module: sale_order_product_recommendation
#: model_terms:ir.ui.view,arch_db:sale_order_product_recommendation.res_config_settings_view_form_sale
msgid "Domain applied on sale orders lines to recommend products for sales"
msgstr ""
"Domínio aplicado em linhas de pedidos de venda para recomendar produtos para "
"vendas"
#. module: sale_order_product_recommendation
#: model:ir.model.fields,help:sale_order_product_recommendation.field_res_config_settings__sale_line_recommendation_domain
msgid "Domain applied to find SO lines to propose as recommended products."
msgstr ""
"Domínio aplicado para encontrar linhas PV para propor como produtos "
"recomendados."
#. module: sale_order_product_recommendation
#: model:ir.model.fields,field_description:sale_order_product_recommendation.field_sale_order_recommendation_line__product_is_favorite
msgid "Favorite"
msgstr "Favorito"
#. module: sale_order_product_recommendation
#: model:ir.model.fields,field_description:sale_order_product_recommendation.field_res_company__force_zero_units_included
#: model:ir.model.fields,field_description:sale_order_product_recommendation.field_res_config_settings__force_zero_units_included
msgid "Force Zero Units Included"
msgstr "Força Zero Unidades Incluídas"
#. module: sale_order_product_recommendation
#: model_terms:ir.ui.view,arch_db:sale_order_product_recommendation.sale_order_recommendation_view_form
msgid "Get recommendations"
msgstr "Obtenha recomendações"
#. module: sale_order_product_recommendation
#: model:ir.model.fields,field_description:sale_order_product_recommendation.field_sale_order_recommendation__id
#: model:ir.model.fields,field_description:sale_order_product_recommendation.field_sale_order_recommendation_line__id
msgid "ID"
msgstr "ID"
#. module: sale_order_product_recommendation
#: model_terms:ir.ui.view,arch_db:sale_order_product_recommendation.res_config_settings_view_form_sale
msgid ""
"If this is selected, it will take care by default on\n"
" Delivery Address instead of customer on sale "
"orders\n"
" recommendation"
msgstr ""
"Se esta opção for selecionada, cuidado por padrão a recomendação no\n"
" Endereço de entrega em vez do cliente no\n"
" pedidos de venda"
#. module: sale_order_product_recommendation
#: model:ir.model.fields,help:sale_order_product_recommendation.field_sale_order_recommendation_line__pricelist_id
msgid "If you change the pricelist, only newly added lines will be affected."
msgstr ""
"Se você alterar a lista de preços, apenas as linhas recém-adicionadas serão "
"afetadas."
#. module: sale_order_product_recommendation
#: model:ir.model.fields,field_description:sale_order_product_recommendation.field_sale_order_recommendation_line__product_default_code
msgid "Internal Reference"
msgstr "Referência interna"
#. module: sale_order_product_recommendation
#: model:ir.model.fields,field_description:sale_order_product_recommendation.field_sale_order_recommendation____last_update
#: model:ir.model.fields,field_description:sale_order_product_recommendation.field_sale_order_recommendation_line____last_update
msgid "Last Modified on"
msgstr "Última modificação em"
#. module: sale_order_product_recommendation
#: model:ir.model.fields,field_description:sale_order_product_recommendation.field_sale_order_recommendation__write_uid
#: model:ir.model.fields,field_description:sale_order_product_recommendation.field_sale_order_recommendation_line__write_uid
msgid "Last Updated by"
msgstr "Última atualização por"
#. module: sale_order_product_recommendation
#: model:ir.model.fields,field_description:sale_order_product_recommendation.field_sale_order_recommendation__write_date
#: model:ir.model.fields,field_description:sale_order_product_recommendation.field_sale_order_recommendation_line__write_date
msgid "Last Updated on"
msgstr "Última atualização em"
#. module: sale_order_product_recommendation
#: model:ir.model.fields.selection,name:sale_order_product_recommendation.selection__res_config_settings__default_sale_recommendation_price_origin__last_sale_price
#: model:ir.model.fields.selection,name:sale_order_product_recommendation.selection__sale_order_recommendation__sale_recommendation_price_origin__last_sale_price
msgid "Last sale price"
msgstr "Último Preço de Venda"
#. module: sale_order_product_recommendation
#: model:ir.model.fields,field_description:sale_order_product_recommendation.field_sale_order_recommendation__months
msgid "Months"
msgstr "Meses"
#. module: sale_order_product_recommendation
#: model:ir.model.fields,field_description:sale_order_product_recommendation.field_sale_order_recommendation_line__product_name
msgid "Name"
msgstr "Nome"
#. module: sale_order_product_recommendation
#. odoo-python
#: code:addons/sale_order_product_recommendation/wizards/sale_order_recommendation.py:0
#, python-format
msgid "Nothing found! Modify your criteria or fill the order manually."
msgstr ""
"Nada encontrado! Modifique seus critérios ou preencha o pedido manualmente."
#. module: sale_order_product_recommendation
#: model:ir.model.fields,field_description:sale_order_product_recommendation.field_sale_order_recommendation__line_amount
msgid "Number of recommendations"
msgstr "Número de recomendações"
#. module: sale_order_product_recommendation
#: model:ir.model.fields,field_description:sale_order_product_recommendation.field_sale_order_recommendation_line__price_unit
msgid "Price Unit"
msgstr "Preço Unitário"
#. module: sale_order_product_recommendation
#: model:ir.model.fields,field_description:sale_order_product_recommendation.field_res_config_settings__default_sale_recommendation_price_origin
msgid "Price origin"
msgstr "Origem do preço"
#. module: sale_order_product_recommendation
#: model_terms:ir.ui.view,arch_db:sale_order_product_recommendation.sale_order_recommendation_view_form
msgid "Price:"
msgstr "Preço:"
#. module: sale_order_product_recommendation
#: model:ir.model.fields,field_description:sale_order_product_recommendation.field_sale_order_recommendation_line__pricelist_id
#: model:ir.model.fields.selection,name:sale_order_product_recommendation.selection__res_config_settings__default_sale_recommendation_price_origin__pricelist
#: model:ir.model.fields.selection,name:sale_order_product_recommendation.selection__sale_order_recommendation__sale_recommendation_price_origin__pricelist
msgid "Pricelist"
msgstr "Lista de Preço"
#. module: sale_order_product_recommendation
#: model:ir.model.fields,field_description:sale_order_product_recommendation.field_sale_order_recommendation_line__product_id
#: model_terms:ir.ui.view,arch_db:sale_order_product_recommendation.sale_order_recommendation_view_form
msgid "Product"
msgstr "Produto"
#. module: sale_order_product_recommendation
#: model:ir.model.fields,field_description:sale_order_product_recommendation.field_sale_order_recommendation_line__product_uom_readonly
msgid "Product Uom Readonly"
msgstr "Uom do produto somente leitura"
#. module: sale_order_product_recommendation
#: model:ir.model.fields,field_description:sale_order_product_recommendation.field_sale_order_recommendation_line__product_categ_complete_name
#: model:ir.model.fields.selection,name:sale_order_product_recommendation.selection__sale_order_recommendation__recommendations_order__product_categ_complete_name_asc
msgid "Product category"
msgstr "Categoria de Produto"
#. module: sale_order_product_recommendation
#: model:ir.model.fields.selection,name:sale_order_product_recommendation.selection__sale_order_recommendation__recommendations_order__product_default_code_asc
msgid "Product code"
msgstr "Código de Produto"
#. module: sale_order_product_recommendation
#: model:ir.model.fields.selection,name:sale_order_product_recommendation.selection__sale_order_recommendation__recommendations_order__product_name_asc
msgid "Product name"
msgstr "Nome de Produto"
#. module: sale_order_product_recommendation
#: model:ir.model.fields,field_description:sale_order_product_recommendation.field_sale_order_recommendation__sale_recommendation_price_origin
msgid "Product price origin"
msgstr "Origem do preço do produto"
#. module: sale_order_product_recommendation
#: model:ir.model.fields,field_description:sale_order_product_recommendation.field_sale_order_recommendation__line_ids
msgid "Products"
msgstr "Produtos"
#. module: sale_order_product_recommendation
#: model:ir.model.fields,field_description:sale_order_product_recommendation.field_sale_order_recommendation__recommendations_order
msgid "Recommendations Order"
msgstr "Ordem de recomendações"
#. module: sale_order_product_recommendation
#: model_terms:ir.ui.view,arch_db:sale_order_product_recommendation.view_order_form
msgid "Recommended Products"
msgstr "Produtos Recomendados"
#. module: sale_order_product_recommendation
#: model:ir.actions.act_window,name:sale_order_product_recommendation.sale_order_recommendation_action
msgid "Recommended Products for this Customer"
msgstr "Produtos Recomendados para este Cliente"
#. module: sale_order_product_recommendation
#: model:ir.model,name:sale_order_product_recommendation.model_sale_order_recommendation_line
msgid "Recommended product for current sale order"
msgstr "Produto recomendado para o pedido de venda atual"
#. module: sale_order_product_recommendation
#: model:ir.model,name:sale_order_product_recommendation.model_sale_order_recommendation
msgid "Recommended products for current sale order"
msgstr "Produtos recomendados para o pedido de venda atual"
#. module: sale_order_product_recommendation
#: model:ir.model.fields,field_description:sale_order_product_recommendation.field_sale_order_recommendation_line__sale_line_id
msgid "Sale Line"
msgstr "Item de Venda"
#. module: sale_order_product_recommendation
#: model:ir.model.fields,field_description:sale_order_product_recommendation.field_res_company__sale_line_recommendation_domain
#: model:ir.model.fields,field_description:sale_order_product_recommendation.field_res_config_settings__sale_line_recommendation_domain
msgid "Sale Line Recommendation Domain"
msgstr "Domínio de Recomendação da Linha de Venda"
#. module: sale_order_product_recommendation
#: model:ir.model.fields,field_description:sale_order_product_recommendation.field_sale_order_recommendation__order_id
msgid "Sale Order"
msgstr "Pedido de Venda"
#. module: sale_order_product_recommendation
#: model_terms:ir.ui.view,arch_db:sale_order_product_recommendation.res_config_settings_view_form_sale
msgid "Sale order recommendations"
msgstr "Recomendações de pedidos de venda"
#. module: sale_order_product_recommendation
#: model_terms:ir.ui.view,arch_db:sale_order_product_recommendation.res_config_settings_view_form_sale
msgid ""
"Select the origin for display product price in sale orders recommendation"
msgstr ""
"Selecione a origem para exibir o preço do produto na recomendação de pedidos "
"de venda"
#. module: sale_order_product_recommendation
#: model:ir.model.fields,help:sale_order_product_recommendation.field_sale_order_recommendation__line_amount
msgid "The less, the faster they will be found."
msgstr "Quanto menos, mais rápido eles serão encontrados."
#. module: sale_order_product_recommendation
#: model:ir.model.fields,field_description:sale_order_product_recommendation.field_sale_order_recommendation_line__times_delivered
msgid "Times Delivered"
msgstr "Tempos de Entregas"
#. module: sale_order_product_recommendation
#: model:ir.model.fields.selection,name:sale_order_product_recommendation.selection__sale_order_recommendation__recommendations_order__times_delivered_desc
msgid "Times delivered"
msgstr "Tempos de entregas"
#. module: sale_order_product_recommendation
#: model:ir.model.fields,field_description:sale_order_product_recommendation.field_sale_order_recommendation_line__sale_uom_id
msgid "Unit of Measure"
msgstr "Unidade de Medida"
#. module: sale_order_product_recommendation
#: model:ir.model.fields,field_description:sale_order_product_recommendation.field_sale_order_recommendation_line__units_delivered
msgid "Units Delivered"
msgstr "Unidades Entregues"
#. module: sale_order_product_recommendation
#: model:ir.model.fields,field_description:sale_order_product_recommendation.field_sale_order_recommendation_line__units_included
msgid "Units Included"
msgstr "Unidades Incluídas"
#. module: sale_order_product_recommendation
#: model:ir.model.fields.selection,name:sale_order_product_recommendation.selection__sale_order_recommendation__recommendations_order__units_delivered_desc
msgid "Units delivered"
msgstr "Unidades Entregues"
#. module: sale_order_product_recommendation
#: model:ir.model.fields,field_description:sale_order_product_recommendation.field_res_config_settings__default_use_delivery_address
#: model:ir.model.fields,field_description:sale_order_product_recommendation.field_sale_order_recommendation__use_delivery_address
msgid "Use delivery address"
msgstr "Usar Endereço Entrega"
#. module: sale_order_product_recommendation
#: model:ir.model.fields,field_description:sale_order_product_recommendation.field_sale_order_recommendation_line__wizard_id
msgid "Wizard"
msgstr "Assistente"
#. module: sale_order_product_recommendation
#: model_terms:ir.ui.view,arch_db:sale_order_product_recommendation.sale_order_recommendation_view_form
msgid "You will lose any changes you have made. Are you sure?"
msgstr "Você perderá todas as alterações feitas. Tem certeza?"
#. module: sale_order_product_recommendation
#: model_terms:ir.ui.view,arch_db:sale_order_product_recommendation.sale_order_recommendation_view_form
msgid "times -"
msgstr "vezes -"

View File

@@ -0,0 +1,392 @@
# Translation of Odoo Server.
# This file contains the translation of the following modules:
# * sale_order_product_recommendation
#
msgid ""
msgstr ""
"Project-Id-Version: Odoo Server 18.0\n"
"Report-Msgid-Bugs-To: \n"
"Last-Translator: \n"
"Language-Team: \n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: \n"
"Plural-Forms: \n"
#. module: sale_order_product_recommendation
#: model_terms:ir.ui.view,arch_db:sale_order_product_recommendation.sale_order_recommendation_view_form
msgid "<span>To be included: </span>"
msgstr ""
#. module: sale_order_product_recommendation
#: model_terms:ir.ui.view,arch_db:sale_order_product_recommendation.sale_order_recommendation_view_form
msgid "Accept"
msgstr ""
#. module: sale_order_product_recommendation
#: model:ir.model.fields,help:sale_order_product_recommendation.field_res_config_settings__force_zero_units_included
#: model_terms:ir.ui.view,arch_db:sale_order_product_recommendation.res_config_settings_view_form_sale
msgid "Add recomented products in so even if units included is zero."
msgstr ""
#. module: sale_order_product_recommendation
#: model_terms:ir.ui.view,arch_db:sale_order_product_recommendation.res_config_settings_view_form_sale
msgid "Add recommended with zero units included"
msgstr ""
#. module: sale_order_product_recommendation
#: model_terms:ir.ui.view,arch_db:sale_order_product_recommendation.sale_order_recommendation_view_form
msgid "Cancel"
msgstr ""
#. module: sale_order_product_recommendation
#: model:ir.model.fields,field_description:sale_order_product_recommendation.field_sale_order_recommendation_line__product_uom_category_id
msgid "Category"
msgstr ""
#. module: sale_order_product_recommendation
#: model_terms:ir.ui.view,arch_db:sale_order_product_recommendation.sale_order_recommendation_view_form
msgid "Change criteria"
msgstr ""
#. module: sale_order_product_recommendation
#: model:ir.model,name:sale_order_product_recommendation.model_res_company
msgid "Companies"
msgstr ""
#. module: sale_order_product_recommendation
#: model:ir.model,name:sale_order_product_recommendation.model_res_config_settings
msgid "Config Settings"
msgstr ""
#. module: sale_order_product_recommendation
#: model:ir.model.fields,help:sale_order_product_recommendation.field_sale_order_recommendation__months
msgid "Consider these months backwards to generate recommendations."
msgstr ""
#. module: sale_order_product_recommendation
#: model:ir.model.fields,help:sale_order_product_recommendation.field_sale_order_recommendation_line__product_uom_category_id
msgid ""
"Conversion between Units of Measure can only occur if they belong to the "
"same category. The conversion will be made based on the ratios."
msgstr ""
#. module: sale_order_product_recommendation
#: model:ir.model.fields,field_description:sale_order_product_recommendation.field_sale_order_recommendation__create_uid
#: model:ir.model.fields,field_description:sale_order_product_recommendation.field_sale_order_recommendation_line__create_uid
msgid "Created by"
msgstr ""
#. module: sale_order_product_recommendation
#: model:ir.model.fields,field_description:sale_order_product_recommendation.field_sale_order_recommendation__create_date
#: model:ir.model.fields,field_description:sale_order_product_recommendation.field_sale_order_recommendation_line__create_date
msgid "Created on"
msgstr ""
#. module: sale_order_product_recommendation
#: model:ir.model.fields,field_description:sale_order_product_recommendation.field_sale_order_recommendation_line__currency_id
msgid "Currency"
msgstr ""
#. module: sale_order_product_recommendation
#: model:ir.model.fields,field_description:sale_order_product_recommendation.field_sale_order_recommendation_line__partner_id
msgid "Customer"
msgstr ""
#. module: sale_order_product_recommendation
#: model_terms:ir.ui.view,arch_db:sale_order_product_recommendation.res_config_settings_view_form_sale
msgid "Default Number of recommendations"
msgstr ""
#. module: sale_order_product_recommendation
#: model_terms:ir.ui.view,arch_db:sale_order_product_recommendation.res_config_settings_view_form_sale
msgid "Default months backwards to generate recommendations"
msgstr ""
#. module: sale_order_product_recommendation
#: model:ir.model.fields,field_description:sale_order_product_recommendation.field_res_config_settings__default_line_amount
msgid "Default sale number of recommendations"
msgstr ""
#. module: sale_order_product_recommendation
#: model:ir.model.fields,field_description:sale_order_product_recommendation.field_res_config_settings__default_months
msgid "Default sale recommendation months"
msgstr ""
#. module: sale_order_product_recommendation
#: model_terms:ir.ui.view,arch_db:sale_order_product_recommendation.sale_order_recommendation_view_form
msgid "Delivered:"
msgstr ""
#. module: sale_order_product_recommendation
#: model:ir.model.fields,field_description:sale_order_product_recommendation.field_sale_order_recommendation__display_name
#: model:ir.model.fields,field_description:sale_order_product_recommendation.field_sale_order_recommendation_line__display_name
msgid "Display Name"
msgstr ""
#. module: sale_order_product_recommendation
#: model_terms:ir.ui.view,arch_db:sale_order_product_recommendation.res_config_settings_view_form_sale
msgid "Domain applied on sale orders lines to recommend products for sales"
msgstr ""
#. module: sale_order_product_recommendation
#: model:ir.model.fields,help:sale_order_product_recommendation.field_res_config_settings__sale_line_recommendation_domain
msgid "Domain applied to find SO lines to propose as recommended products."
msgstr ""
#. module: sale_order_product_recommendation
#: model:ir.model.fields,field_description:sale_order_product_recommendation.field_sale_order_recommendation_line__product_is_favorite
msgid "Favorite"
msgstr ""
#. module: sale_order_product_recommendation
#: model:ir.model.fields,field_description:sale_order_product_recommendation.field_res_company__force_zero_units_included
#: model:ir.model.fields,field_description:sale_order_product_recommendation.field_res_config_settings__force_zero_units_included
msgid "Force Zero Units Included"
msgstr ""
#. module: sale_order_product_recommendation
#: model_terms:ir.ui.view,arch_db:sale_order_product_recommendation.sale_order_recommendation_view_form
msgid "Get recommendations"
msgstr ""
#. module: sale_order_product_recommendation
#: model:ir.model.fields,field_description:sale_order_product_recommendation.field_sale_order_recommendation__id
#: model:ir.model.fields,field_description:sale_order_product_recommendation.field_sale_order_recommendation_line__id
msgid "ID"
msgstr ""
#. module: sale_order_product_recommendation
#: model_terms:ir.ui.view,arch_db:sale_order_product_recommendation.res_config_settings_view_form_sale
msgid ""
"If this is selected, it will take care by default on"
" Delivery Address instead of customer on "
"sale orders recommendation"
msgstr ""
#. module: sale_order_product_recommendation
#: model:ir.model.fields,help:sale_order_product_recommendation.field_sale_order_recommendation_line__pricelist_id
msgid "If you change the pricelist, only newly added lines will be affected."
msgstr ""
#. module: sale_order_product_recommendation
#: model:ir.model.fields,field_description:sale_order_product_recommendation.field_sale_order_recommendation_line__product_default_code
msgid "Internal Reference"
msgstr ""
#. module: sale_order_product_recommendation
#: model:ir.model.fields,field_description:sale_order_product_recommendation.field_sale_order_recommendation__write_uid
#: model:ir.model.fields,field_description:sale_order_product_recommendation.field_sale_order_recommendation_line__write_uid
msgid "Last Updated by"
msgstr ""
#. module: sale_order_product_recommendation
#: model:ir.model.fields,field_description:sale_order_product_recommendation.field_sale_order_recommendation__write_date
#: model:ir.model.fields,field_description:sale_order_product_recommendation.field_sale_order_recommendation_line__write_date
msgid "Last Updated on"
msgstr ""
#. module: sale_order_product_recommendation
#: model:ir.model.fields.selection,name:sale_order_product_recommendation.selection__res_config_settings__default_sale_recommendation_price_origin__last_sale_price
#: model:ir.model.fields.selection,name:sale_order_product_recommendation.selection__sale_order_recommendation__sale_recommendation_price_origin__last_sale_price
msgid "Last sale price"
msgstr ""
#. module: sale_order_product_recommendation
#: model:ir.model.fields,field_description:sale_order_product_recommendation.field_sale_order_recommendation__months
msgid "Months"
msgstr ""
#. module: sale_order_product_recommendation
#: model:ir.model.fields,field_description:sale_order_product_recommendation.field_sale_order_recommendation_line__product_name
msgid "Name"
msgstr ""
#. module: sale_order_product_recommendation
#. odoo-python
#: code:addons/sale_order_product_recommendation/wizards/sale_order_recommendation.py:0
msgid "Nothing found! Modify your criteria or fill the order manually."
msgstr ""
#. module: sale_order_product_recommendation
#: model:ir.model.fields,field_description:sale_order_product_recommendation.field_sale_order_recommendation__line_amount
msgid "Number of recommendations"
msgstr ""
#. module: sale_order_product_recommendation
#: model:ir.model.fields,field_description:sale_order_product_recommendation.field_sale_order_recommendation_line__price_unit
msgid "Price Unit"
msgstr ""
#. module: sale_order_product_recommendation
#: model:ir.model.fields,field_description:sale_order_product_recommendation.field_res_config_settings__default_sale_recommendation_price_origin
msgid "Price origin"
msgstr ""
#. module: sale_order_product_recommendation
#: model_terms:ir.ui.view,arch_db:sale_order_product_recommendation.sale_order_recommendation_view_form
msgid "Price:"
msgstr ""
#. module: sale_order_product_recommendation
#: model:ir.model.fields,field_description:sale_order_product_recommendation.field_sale_order_recommendation_line__pricelist_id
#: model:ir.model.fields.selection,name:sale_order_product_recommendation.selection__res_config_settings__default_sale_recommendation_price_origin__pricelist
#: model:ir.model.fields.selection,name:sale_order_product_recommendation.selection__sale_order_recommendation__sale_recommendation_price_origin__pricelist
msgid "Pricelist"
msgstr ""
#. module: sale_order_product_recommendation
#: model:ir.model.fields,field_description:sale_order_product_recommendation.field_sale_order_recommendation_line__product_id
#: model_terms:ir.ui.view,arch_db:sale_order_product_recommendation.sale_order_recommendation_view_form
msgid "Product"
msgstr ""
#. module: sale_order_product_recommendation
#: model:ir.model.fields,field_description:sale_order_product_recommendation.field_sale_order_recommendation_line__product_uom_readonly
msgid "Product Uom Readonly"
msgstr ""
#. module: sale_order_product_recommendation
#: model:ir.model.fields,field_description:sale_order_product_recommendation.field_sale_order_recommendation_line__product_categ_complete_name
#: model:ir.model.fields.selection,name:sale_order_product_recommendation.selection__sale_order_recommendation__recommendations_order__product_categ_complete_name_asc
msgid "Product category"
msgstr ""
#. module: sale_order_product_recommendation
#: model:ir.model.fields.selection,name:sale_order_product_recommendation.selection__sale_order_recommendation__recommendations_order__product_default_code_asc
msgid "Product code"
msgstr ""
#. module: sale_order_product_recommendation
#: model:ir.model.fields.selection,name:sale_order_product_recommendation.selection__sale_order_recommendation__recommendations_order__product_name_asc
msgid "Product name"
msgstr ""
#. module: sale_order_product_recommendation
#: model:ir.model.fields,field_description:sale_order_product_recommendation.field_sale_order_recommendation__sale_recommendation_price_origin
msgid "Product price origin"
msgstr ""
#. module: sale_order_product_recommendation
#: model_terms:ir.ui.view,arch_db:sale_order_product_recommendation.res_config_settings_view_form_sale
msgid "Product recommendation price origin"
msgstr ""
#. module: sale_order_product_recommendation
#: model:ir.model.fields,field_description:sale_order_product_recommendation.field_sale_order_recommendation__line_ids
msgid "Products"
msgstr ""
#. module: sale_order_product_recommendation
#: model:ir.model.fields,field_description:sale_order_product_recommendation.field_sale_order_recommendation__recommendations_order
msgid "Recommendations Order"
msgstr ""
#. module: sale_order_product_recommendation
#: model_terms:ir.ui.view,arch_db:sale_order_product_recommendation.view_order_form
msgid "Recommended Products"
msgstr ""
#. module: sale_order_product_recommendation
#: model:ir.actions.act_window,name:sale_order_product_recommendation.sale_order_recommendation_action
msgid "Recommended Products for this Customer"
msgstr ""
#. module: sale_order_product_recommendation
#: model:ir.model,name:sale_order_product_recommendation.model_sale_order_recommendation_line
msgid "Recommended product for current sale order"
msgstr ""
#. module: sale_order_product_recommendation
#: model:ir.model,name:sale_order_product_recommendation.model_sale_order_recommendation
msgid "Recommended products for current sale order"
msgstr ""
#. module: sale_order_product_recommendation
#: model:ir.model.fields,field_description:sale_order_product_recommendation.field_sale_order_recommendation_line__sale_line_id
msgid "Sale Line"
msgstr ""
#. module: sale_order_product_recommendation
#: model:ir.model.fields,field_description:sale_order_product_recommendation.field_res_company__sale_line_recommendation_domain
#: model:ir.model.fields,field_description:sale_order_product_recommendation.field_res_config_settings__sale_line_recommendation_domain
msgid "Sale Line Recommendation Domain"
msgstr ""
#. module: sale_order_product_recommendation
#: model:ir.model.fields,field_description:sale_order_product_recommendation.field_sale_order_recommendation__order_id
msgid "Sale Order"
msgstr ""
#. module: sale_order_product_recommendation
#: model_terms:ir.ui.view,arch_db:sale_order_product_recommendation.res_config_settings_view_form_sale
msgid "Sale order product recommendation domain"
msgstr ""
#. module: sale_order_product_recommendation
#: model_terms:ir.ui.view,arch_db:sale_order_product_recommendation.res_config_settings_view_form_sale
msgid "Sale order recommendations"
msgstr ""
#. module: sale_order_product_recommendation
#: model_terms:ir.ui.view,arch_db:sale_order_product_recommendation.res_config_settings_view_form_sale
msgid ""
"Select the origin for display product price in sale orders recommendation"
msgstr ""
#. module: sale_order_product_recommendation
#: model:ir.model.fields,help:sale_order_product_recommendation.field_sale_order_recommendation__line_amount
msgid "The less, the faster they will be found."
msgstr ""
#. module: sale_order_product_recommendation
#: model:ir.model.fields,field_description:sale_order_product_recommendation.field_sale_order_recommendation_line__times_delivered
msgid "Times Delivered"
msgstr ""
#. module: sale_order_product_recommendation
#: model:ir.model.fields.selection,name:sale_order_product_recommendation.selection__sale_order_recommendation__recommendations_order__times_delivered_desc
msgid "Times delivered"
msgstr ""
#. module: sale_order_product_recommendation
#: model:ir.model.fields,field_description:sale_order_product_recommendation.field_sale_order_recommendation_line__sale_uom_id
msgid "Unit of Measure"
msgstr ""
#. module: sale_order_product_recommendation
#: model:ir.model.fields,field_description:sale_order_product_recommendation.field_sale_order_recommendation_line__units_delivered
msgid "Units Delivered"
msgstr ""
#. module: sale_order_product_recommendation
#: model:ir.model.fields,field_description:sale_order_product_recommendation.field_sale_order_recommendation_line__units_included
msgid "Units Included"
msgstr ""
#. module: sale_order_product_recommendation
#: model:ir.model.fields.selection,name:sale_order_product_recommendation.selection__sale_order_recommendation__recommendations_order__units_delivered_desc
msgid "Units delivered"
msgstr ""
#. module: sale_order_product_recommendation
#: model:ir.model.fields,field_description:sale_order_product_recommendation.field_res_config_settings__default_use_delivery_address
#: model:ir.model.fields,field_description:sale_order_product_recommendation.field_sale_order_recommendation__use_delivery_address
#: model_terms:ir.ui.view,arch_db:sale_order_product_recommendation.res_config_settings_view_form_sale
msgid "Use delivery address"
msgstr ""
#. module: sale_order_product_recommendation
#: model:ir.model.fields,field_description:sale_order_product_recommendation.field_sale_order_recommendation_line__wizard_id
msgid "Wizard"
msgstr ""
#. module: sale_order_product_recommendation
#: model_terms:ir.ui.view,arch_db:sale_order_product_recommendation.sale_order_recommendation_view_form
msgid "You will lose any changes you have made. Are you sure?"
msgstr ""
#. module: sale_order_product_recommendation
#: model_terms:ir.ui.view,arch_db:sale_order_product_recommendation.sale_order_recommendation_view_form
msgid "times -"
msgstr ""

View File

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

View File

@@ -0,0 +1,11 @@
# Copyright 2023 Camptocamp SA
# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl).
from odoo import fields, models
class ResCompany(models.Model):
_inherit = "res.company"
force_zero_units_included = fields.Boolean()
sale_line_recommendation_domain = fields.Char(default="[]")

View File

@@ -0,0 +1,39 @@
# Copyright 2020 Tecnativa - Sergio Teruel
from odoo import fields, models
class ResConfigSettings(models.TransientModel):
_inherit = "res.config.settings"
default_sale_recommendation_price_origin = fields.Selection(
[("pricelist", "Pricelist"), ("last_sale_price", "Last sale price")],
string="Price origin",
default="pricelist",
default_model="sale.order.recommendation",
required=True,
)
default_use_delivery_address = fields.Boolean(
string="Use delivery address", default_model="sale.order.recommendation"
)
default_months = fields.Float(
string="Default sale recommendation months",
default_model="sale.order.recommendation",
default=6,
)
default_line_amount = fields.Integer(
string="Default sale number of recommendations",
default_model="sale.order.recommendation",
default=15,
)
force_zero_units_included = fields.Boolean(
related="company_id.force_zero_units_included",
readonly=False,
help="Add recomented products in so even if units included is zero.",
)
sale_line_recommendation_domain = fields.Char(
related="company_id.sale_line_recommendation_domain",
readonly=False,
help="Domain applied to find SO lines to propose as recommended products.",
)

View File

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

View File

@@ -0,0 +1,41 @@
To configure this module you need to:
In sale order product recommendation you can display the product price
unit from list price or from last sale order price. To set the default
value follow the next steps
1. Go to *Sales \> Configuration \> Settings \> Sale order
recommendations*.
2. Assign the desired value to *Product recommendation price origin*
field.
3. Press *Save* button to store the change.
In sale order product recommendation you can compute the recommendations
using the Delivery Address instead of the Customer. To set this option
by default follow the next steps
1. Go to *Sales \> Configuration \> Settings \> Sale order
recommendations*.
2. Assign the desired value to *Use delivery address* field.
3. Press *Save* button to store the change.
You can define other default values like as:
- Months backwards to generate recommendations.
- Number of recommendations to display.
You can force the addition of all the products recommended in the sale
order. You can then edit the desired quantities directly in the sale
order.
1. Go to *Sales \> Configuration \> Settings \> Sale order
recommendations*.
2. Select *Force zero units included*
You can add a filter domain to exclude or include additional recommended
products.
1. Go to *Sales \> Configuration \> Settings \> Sale order
recommendations*.
2. Add a filter in section *Sale order product recommendation domain*
Example: `[("product_type", "!=" "service")]`

View File

@@ -0,0 +1,16 @@
- [Tecnativa](https://www.tecnativa.com):
- Jairo Llopis
- David Vidal
- Alexandre Díaz
- Pedro M. Baeza
- Sergio Teruel
- Carlos Roca
- Víctor Martínez
- [Camptocamp SA](https://www.camptocamp.com):
- Telmo Santos
- [Moduon](https://www.moduon.team):
- Rafael Blasco
- Gelo Joga
- Jairo Llopis
- [Trobz](https://www.trobz.com):
- Tris Doan

View File

@@ -0,0 +1,9 @@
This module adds a recommended products wizard to current sale order.
It is based on recent delivered products, and allows the salesman to
quickly know the most sold products for current customer, which results
in an easy to use hint to improve sale.
If you want a better mobile usability, the module is ready to use with
the 'web_widget_numeric_step' module. Just install it and you will get a
better numeric input experience.

View File

@@ -0,0 +1,9 @@
To use this module, you need to:
1. Create a new sale order.
2. Assign its customer.
3. Press *Recommended Products* button.
4. Configure the recommendations parameters.
5. Press *Get recommendations* button.
6. Add products into the opened wizard.
7. Press *Accept*.

View File

@@ -0,0 +1,3 @@
id,name,model_id:id,group_id:id,perm_read,perm_write,perm_create,perm_unlink
sale_order_product_recommendation.access_sale_order_recommendation,access_sale_order_recommendation,sale_order_product_recommendation.model_sale_order_recommendation,sales_team.group_sale_salesman,1,1,1,1
sale_order_product_recommendation.access_sale_order_recommendation_line,access_sale_order_recommendation_line,sale_order_product_recommendation.model_sale_order_recommendation_line,sales_team.group_sale_salesman,1,1,1,1
1 id name model_id:id group_id:id perm_read perm_write perm_create perm_unlink
2 sale_order_product_recommendation.access_sale_order_recommendation access_sale_order_recommendation sale_order_product_recommendation.model_sale_order_recommendation sales_team.group_sale_salesman 1 1 1 1
3 sale_order_product_recommendation.access_sale_order_recommendation_line access_sale_order_recommendation_line sale_order_product_recommendation.model_sale_order_recommendation_line sales_team.group_sale_salesman 1 1 1 1

Binary file not shown.

After

Width:  |  Height:  |  Size: 9.2 KiB

View File

@@ -0,0 +1,513 @@
<!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>Sale Order Product Recommendation</title>
<style type="text/css">
/*
:Author: David Goodger (goodger@python.org)
:Id: $Id: html4css1.css 9511 2024-01-13 09:50:07Z milde $
:Copyright: This stylesheet has been placed in the public domain.
Default cascading style sheet for the HTML output of Docutils.
Despite the name, some widely supported CSS2 features are used.
See https://docutils.sourceforge.io/docs/howto/html-stylesheets.html for how to
customize this style sheet.
*/
/* used to remove borders from tables and images */
.borderless, table.borderless td, table.borderless th {
border: 0 }
table.borderless td, table.borderless th {
/* Override padding for "table.docutils td" with "! important".
The right padding separates the table cells. */
padding: 0 0.5em 0 0 ! important }
.first {
/* Override more specific margin styles with "! important". */
margin-top: 0 ! important }
.last, .with-subtitle {
margin-bottom: 0 ! important }
.hidden {
display: none }
.subscript {
vertical-align: sub;
font-size: smaller }
.superscript {
vertical-align: super;
font-size: smaller }
a.toc-backref {
text-decoration: none ;
color: black }
blockquote.epigraph {
margin: 2em 5em ; }
dl.docutils dd {
margin-bottom: 0.5em }
object[type="image/svg+xml"], object[type="application/x-shockwave-flash"] {
overflow: hidden;
}
/* Uncomment (and remove this text!) to get bold-faced definition list terms
dl.docutils dt {
font-weight: bold }
*/
div.abstract {
margin: 2em 5em }
div.abstract p.topic-title {
font-weight: bold ;
text-align: center }
div.admonition, div.attention, div.caution, div.danger, div.error,
div.hint, div.important, div.note, div.tip, div.warning {
margin: 2em ;
border: medium outset ;
padding: 1em }
div.admonition p.admonition-title, div.hint p.admonition-title,
div.important p.admonition-title, div.note p.admonition-title,
div.tip p.admonition-title {
font-weight: bold ;
font-family: sans-serif }
div.attention p.admonition-title, div.caution p.admonition-title,
div.danger p.admonition-title, div.error p.admonition-title,
div.warning p.admonition-title, .code .error {
color: red ;
font-weight: bold ;
font-family: sans-serif }
/* Uncomment (and remove this text!) to get reduced vertical space in
compound paragraphs.
div.compound .compound-first, div.compound .compound-middle {
margin-bottom: 0.5em }
div.compound .compound-last, div.compound .compound-middle {
margin-top: 0.5em }
*/
div.dedication {
margin: 2em 5em ;
text-align: center ;
font-style: italic }
div.dedication p.topic-title {
font-weight: bold ;
font-style: normal }
div.figure {
margin-left: 2em ;
margin-right: 2em }
div.footer, div.header {
clear: both;
font-size: smaller }
div.line-block {
display: block ;
margin-top: 1em ;
margin-bottom: 1em }
div.line-block div.line-block {
margin-top: 0 ;
margin-bottom: 0 ;
margin-left: 1.5em }
div.sidebar {
margin: 0 0 0.5em 1em ;
border: medium outset ;
padding: 1em ;
background-color: #ffffee ;
width: 40% ;
float: right ;
clear: right }
div.sidebar p.rubric {
font-family: sans-serif ;
font-size: medium }
div.system-messages {
margin: 5em }
div.system-messages h1 {
color: red }
div.system-message {
border: medium outset ;
padding: 1em }
div.system-message p.system-message-title {
color: red ;
font-weight: bold }
div.topic {
margin: 2em }
h1.section-subtitle, h2.section-subtitle, h3.section-subtitle,
h4.section-subtitle, h5.section-subtitle, h6.section-subtitle {
margin-top: 0.4em }
h1.title {
text-align: center }
h2.subtitle {
text-align: center }
hr.docutils {
width: 75% }
img.align-left, .figure.align-left, object.align-left, table.align-left {
clear: left ;
float: left ;
margin-right: 1em }
img.align-right, .figure.align-right, object.align-right, table.align-right {
clear: right ;
float: right ;
margin-left: 1em }
img.align-center, .figure.align-center, object.align-center {
display: block;
margin-left: auto;
margin-right: auto;
}
table.align-center {
margin-left: auto;
margin-right: auto;
}
.align-left {
text-align: left }
.align-center {
clear: both ;
text-align: center }
.align-right {
text-align: right }
/* reset inner alignment in figures */
div.align-right {
text-align: inherit }
/* div.align-center * { */
/* text-align: left } */
.align-top {
vertical-align: top }
.align-middle {
vertical-align: middle }
.align-bottom {
vertical-align: bottom }
ol.simple, ul.simple {
margin-bottom: 1em }
ol.arabic {
list-style: decimal }
ol.loweralpha {
list-style: lower-alpha }
ol.upperalpha {
list-style: upper-alpha }
ol.lowerroman {
list-style: lower-roman }
ol.upperroman {
list-style: upper-roman }
p.attribution {
text-align: right ;
margin-left: 50% }
p.caption {
font-style: italic }
p.credits {
font-style: italic ;
font-size: smaller }
p.label {
white-space: nowrap }
p.rubric {
font-weight: bold ;
font-size: larger ;
color: maroon ;
text-align: center }
p.sidebar-title {
font-family: sans-serif ;
font-weight: bold ;
font-size: larger }
p.sidebar-subtitle {
font-family: sans-serif ;
font-weight: bold }
p.topic-title {
font-weight: bold }
pre.address {
margin-bottom: 0 ;
margin-top: 0 ;
font: inherit }
pre.literal-block, pre.doctest-block, pre.math, pre.code {
margin-left: 2em ;
margin-right: 2em }
pre.code .ln { color: gray; } /* line numbers */
pre.code, code { background-color: #eeeeee }
pre.code .comment, code .comment { color: #5C6576 }
pre.code .keyword, code .keyword { color: #3B0D06; font-weight: bold }
pre.code .literal.string, code .literal.string { color: #0C5404 }
pre.code .name.builtin, code .name.builtin { color: #352B84 }
pre.code .deleted, code .deleted { background-color: #DEB0A1}
pre.code .inserted, code .inserted { background-color: #A3D289}
span.classifier {
font-family: sans-serif ;
font-style: oblique }
span.classifier-delimiter {
font-family: sans-serif ;
font-weight: bold }
span.interpreted {
font-family: sans-serif }
span.option {
white-space: nowrap }
span.pre {
white-space: pre }
span.problematic, pre.problematic {
color: red }
span.section-subtitle {
/* font-size relative to parent (h1..h6 element) */
font-size: 80% }
table.citation {
border-left: solid 1px gray;
margin-left: 1px }
table.docinfo {
margin: 2em 4em }
table.docutils {
margin-top: 0.5em ;
margin-bottom: 0.5em }
table.footnote {
border-left: solid 1px black;
margin-left: 1px }
table.docutils td, table.docutils th,
table.docinfo td, table.docinfo th {
padding-left: 0.5em ;
padding-right: 0.5em ;
vertical-align: top }
table.docutils th.field-name, table.docinfo th.docinfo-name {
font-weight: bold ;
text-align: left ;
white-space: nowrap ;
padding-left: 0 }
/* "booktabs" style (no vertical lines) */
table.docutils.booktabs {
border: 0px;
border-top: 2px solid;
border-bottom: 2px solid;
border-collapse: collapse;
}
table.docutils.booktabs * {
border: 0px;
}
table.docutils.booktabs th {
border-bottom: thin solid;
text-align: left;
}
h1 tt.docutils, h2 tt.docutils, h3 tt.docutils,
h4 tt.docutils, h5 tt.docutils, h6 tt.docutils {
font-size: 100% }
ul.auto-toc {
list-style-type: none }
</style>
</head>
<body>
<div class="document" id="sale-order-product-recommendation">
<h1 class="title">Sale Order Product Recommendation</h1>
<!-- !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
!! This file is generated by oca-gen-addon-readme !!
!! changes will be overwritten. !!
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
!! source digest: sha256:430005bb553765cb590d6b599274c15a577afff56ab622c5fbdaf0bf14923b38
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! -->
<p><a class="reference external image-reference" href="https://odoo-community.org/page/development-status"><img alt="Beta" src="https://img.shields.io/badge/maturity-Beta-yellow.png" /></a> <a class="reference external image-reference" href="http://www.gnu.org/licenses/agpl-3.0-standalone.html"><img alt="License: AGPL-3" src="https://img.shields.io/badge/licence-AGPL--3-blue.png" /></a> <a class="reference external image-reference" href="https://github.com/OCA/sale-workflow/tree/18.0/sale_order_product_recommendation"><img alt="OCA/sale-workflow" src="https://img.shields.io/badge/github-OCA%2Fsale--workflow-lightgray.png?logo=github" /></a> <a class="reference external image-reference" href="https://translation.odoo-community.org/projects/sale-workflow-18-0/sale-workflow-18-0-sale_order_product_recommendation"><img alt="Translate me on Weblate" src="https://img.shields.io/badge/weblate-Translate%20me-F47D42.png" /></a> <a class="reference external image-reference" href="https://runboat.odoo-community.org/builds?repo=OCA/sale-workflow&amp;target_branch=18.0"><img alt="Try me on Runboat" src="https://img.shields.io/badge/runboat-Try%20me-875A7B.png" /></a></p>
<p>This module adds a recommended products wizard to current sale order.</p>
<p>It is based on recent delivered products, and allows the salesman to
quickly know the most sold products for current customer, which results
in an easy to use hint to improve sale.</p>
<p>If you want a better mobile usability, the module is ready to use with
the web_widget_numeric_step module. Just install it and you will get a
better numeric input experience.</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">
<h1><a class="toc-backref" href="#toc-entry-1">Configuration</a></h1>
<p>To configure this module you need to:</p>
<p>In sale order product recommendation you can display the product price
unit from list price or from last sale order price. To set the default
value follow the next steps</p>
<ol class="arabic simple">
<li>Go to <em>Sales &gt; Configuration &gt; Settings &gt; Sale order
recommendations</em>.</li>
<li>Assign the desired value to <em>Product recommendation price origin</em>
field.</li>
<li>Press <em>Save</em> button to store the change.</li>
</ol>
<p>In sale order product recommendation you can compute the recommendations
using the Delivery Address instead of the Customer. To set this option
by default follow the next steps</p>
<ol class="arabic simple">
<li>Go to <em>Sales &gt; Configuration &gt; Settings &gt; Sale order
recommendations</em>.</li>
<li>Assign the desired value to <em>Use delivery address</em> field.</li>
<li>Press <em>Save</em> button to store the change.</li>
</ol>
<p>You can define other default values like as:</p>
<ul class="simple">
<li>Months backwards to generate recommendations.</li>
<li>Number of recommendations to display.</li>
</ul>
<p>You can force the addition of all the products recommended in the sale
order. You can then edit the desired quantities directly in the sale
order.</p>
<ol class="arabic simple">
<li>Go to <em>Sales &gt; Configuration &gt; Settings &gt; Sale order
recommendations</em>.</li>
<li>Select <em>Force zero units included</em></li>
</ol>
<p>You can add a filter domain to exclude or include additional recommended
products.</p>
<ol class="arabic simple">
<li>Go to <em>Sales &gt; Configuration &gt; Settings &gt; Sale order
recommendations</em>.</li>
<li>Add a filter in section <em>Sale order product recommendation domain</em>
Example: <tt class="docutils literal"><span class="pre">[(&quot;product_type&quot;,</span> <span class="pre">&quot;!=&quot;</span> <span class="pre">&quot;service&quot;)]</span></tt></li>
</ol>
</div>
<div class="section" id="usage">
<h1><a class="toc-backref" href="#toc-entry-2">Usage</a></h1>
<p>To use this module, you need to:</p>
<ol class="arabic simple">
<li>Create a new sale order.</li>
<li>Assign its customer.</li>
<li>Press <em>Recommended Products</em> button.</li>
<li>Configure the recommendations parameters.</li>
<li>Press <em>Get recommendations</em> button.</li>
<li>Add products into the opened wizard.</li>
<li>Press <em>Accept</em>.</li>
</ol>
</div>
<div class="section" id="bug-tracker">
<h1><a class="toc-backref" href="#toc-entry-3">Bug Tracker</a></h1>
<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_order_product_recommendation%0Aversion:%2018.0%0A%0A**Steps%20to%20reproduce**%0A-%20...%0A%0A**Current%20behavior**%0A%0A**Expected%20behavior**">feedback</a>.</p>
<p>Do not contact contributors directly about support or help with technical issues.</p>
</div>
<div class="section" id="credits">
<h1><a class="toc-backref" href="#toc-entry-4">Credits</a></h1>
<div class="section" id="authors">
<h2><a class="toc-backref" href="#toc-entry-5">Authors</a></h2>
<ul class="simple">
<li>Tecnativa</li>
</ul>
</div>
<div class="section" id="contributors">
<h2><a class="toc-backref" href="#toc-entry-6">Contributors</a></h2>
<ul class="simple">
<li><a class="reference external" href="https://www.tecnativa.com">Tecnativa</a>:<ul>
<li>Jairo Llopis</li>
<li>David Vidal</li>
<li>Alexandre Díaz</li>
<li>Pedro M. Baeza</li>
<li>Sergio Teruel</li>
<li>Carlos Roca</li>
<li>Víctor Martínez</li>
</ul>
</li>
<li><a class="reference external" href="https://www.camptocamp.com">Camptocamp SA</a>:<ul>
<li>Telmo Santos</li>
</ul>
</li>
<li><a class="reference external" href="https://www.moduon.team">Moduon</a>:<ul>
<li>Rafael Blasco</li>
<li>Gelo Joga</li>
<li>Jairo Llopis</li>
</ul>
</li>
<li><a class="reference external" href="https://www.trobz.com">Trobz</a>:<ul>
<li>Tris Doan</li>
</ul>
</li>
</ul>
</div>
<div class="section" id="maintainers">
<h2><a class="toc-backref" href="#toc-entry-7">Maintainers</a></h2>
<p>This module is maintained by the OCA.</p>
<a class="reference external image-reference" href="https://odoo-community.org">
<img alt="Odoo Community Association" src="https://odoo-community.org/logo.png" />
</a>
<p>OCA, or the Odoo Community Association, is a nonprofit organization whose
mission is to support the collaborative development of Odoo features and
promote its widespread use.</p>
<p>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/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/rafaelbn"><img alt="rafaelbn" src="https://github.com/rafaelbn.png?size=40px" /></a> <a class="reference external image-reference" href="https://github.com/yajo"><img alt="yajo" src="https://github.com/yajo.png?size=40px" /></a></p>
<p>This module is part of the <a class="reference external" href="https://github.com/OCA/sale-workflow/tree/18.0/sale_order_product_recommendation">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>
</body>
</html>

View File

@@ -0,0 +1,3 @@
# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl).
from . import test_recommendation_common
from . import test_recommendation

View File

@@ -0,0 +1,351 @@
# Copyright 2017 Tecnativa - Jairo Llopis
# Copyright 2020 Tecnativa - Pedro M. Baeza
# Copyright 2021 Tecnativa - Víctor Martínez
# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl).
from freezegun import freeze_time
from odoo.exceptions import UserError
from odoo.tests import Form
from .test_recommendation_common import RecommendationCase
@freeze_time("2021-10-02 15:30:00")
class RecommendationCaseTests(RecommendationCase):
def test_recommendations(self):
"""Recommendations are OK."""
self.new_so.order_line = [
(
0,
0,
{
"product_id": self.prod_1.id,
"product_uom_qty": 3,
"qty_delivered_method": "manual",
},
)
]
self.new_so.order_line._onchange_product_id_warning()
wizard = self.wizard()
# Order came in from context
self.assertEqual(wizard.order_id, self.new_so)
self.assertEqual(len(wizard.line_ids), 3)
self.assertEqual(wizard.line_ids[0].product_id, self.prod_2)
self.assertEqual(wizard.line_ids[1].product_id, self.prod_1)
self.assertEqual(wizard.line_ids[2].product_id, self.prod_3)
# Product 2 is first
wiz_line_prod2 = wizard.line_ids.filtered(lambda x: x.product_id == self.prod_2)
self.assertEqual(wiz_line_prod2.times_delivered, 2)
self.assertEqual(wiz_line_prod2.units_delivered, 100)
self.assertEqual(wiz_line_prod2.units_included, 0)
# Product 1 appears second
wiz_line_prod1 = wizard.line_ids.filtered(lambda x: x.product_id == self.prod_1)
self.assertEqual(wiz_line_prod1.times_delivered, 1)
self.assertEqual(wiz_line_prod1.units_delivered, 25)
self.assertEqual(wiz_line_prod1.units_included, 3)
# Product 3 appears third
wiz_line_prod3 = wizard.line_ids.filtered(lambda x: x.product_id == self.prod_3)
self.assertEqual(wiz_line_prod3.times_delivered, 1)
self.assertEqual(wiz_line_prod3.units_delivered, 100)
self.assertEqual(wiz_line_prod3.units_included, 0)
# Only 1 product if limited as such
wizard.line_amount = 1
wizard.generate_recommendations()
self.assertEqual(len(wizard.line_ids), 2)
def test_recommendations_ordered_by_category(self):
wiz_f = Form(
self.env["sale.order.recommendation"].with_context(active_id=self.new_so.id)
)
wiz_f.recommendations_order = "product_categ_complete_name asc"
wizard = wiz_f.save()
wizard.generate_recommendations()
# Prod 3 is 1st because its category is named "A"
self.assertRecordValues(
wizard.line_ids,
[
{
"product_id": self.prod_3.id,
"product_categ_complete_name": "A",
"times_delivered": 1,
"units_delivered": 100,
"units_included": 0,
},
{
"product_id": self.prod_2.id,
"product_categ_complete_name": "B",
"times_delivered": 2,
"units_delivered": 100,
"units_included": 0,
},
{
"product_id": self.prod_1.id,
"product_categ_complete_name": "B",
"times_delivered": 1,
"units_delivered": 25,
"units_included": 0,
},
],
)
def test_recommendations_ordered_by_code(self):
wiz_f = Form(
self.env["sale.order.recommendation"].with_context(active_id=self.new_so.id)
)
wiz_f.recommendations_order = "product_default_code asc"
wizard = wiz_f.save()
wizard.generate_recommendations()
# Prod 3 is 1st because its code is "A"
self.assertRecordValues(
wizard.line_ids,
[
{
"product_id": self.prod_2.id,
"product_default_code": False,
"times_delivered": 2,
"units_delivered": 100,
"units_included": 0,
"sale_uom_id": self.prod_2.uom_id.id,
},
{
"product_id": self.prod_1.id,
"product_default_code": False,
"times_delivered": 1,
"units_delivered": 25,
"units_included": 0,
"sale_uom_id": self.prod_1.uom_id.id,
},
{
"product_id": self.prod_3.id,
"product_default_code": "TEST-PROD-3",
"times_delivered": 1,
"units_delivered": 100,
"units_included": 0,
"sale_uom_id": self.prod_3.uom_id.id,
},
],
)
def test_change_uom(self):
"""Change UoM and units included."""
unit, dozen = map(
self.browse_ref, ["uom.product_uom_unit", "uom.product_uom_dozen"]
)
# Salesperson needs uom access
self.env.user.groups_id |= self.env.ref("uom.group_uom")
# Add 2 dozens of product 2
wizard = self.wizard()
with Form(wizard) as wizard_f:
with wizard_f.line_ids.edit(0) as line_f:
self.assertEqual(line_f.product_id, self.prod_2)
self.assertEqual(line_f.sale_uom_id, unit)
line_f.sale_uom_id = dozen
line_f.units_included = 2
wizard.action_accept()
# Check it's properly added
self.assertRecordValues(
self.new_so.order_line,
[
{
"product_id": self.prod_2.id,
"product_uom": dozen.id,
"product_uom_qty": 2,
}
],
)
# Use a new wizard to change product 2 to 10 units
wizard = self.wizard()
with Form(wizard) as wizard_f:
with wizard_f.line_ids.edit(0) as line_f:
self.assertEqual(line_f.product_id, self.prod_2)
self.assertEqual(line_f.sale_uom_id, dozen)
line_f.sale_uom_id = unit
line_f.units_included = 10
wizard.action_accept()
# Check it's properly changed
self.assertRecordValues(
self.new_so.order_line,
[
{
"product_id": self.prod_2.id,
"product_uom": unit.id,
"product_uom_qty": 10,
}
],
)
def test_recommendations_archived_product(self):
self.env["sale.order"].create(
{
"partner_id": self.partner.id,
}
)
self.prod_1.active = False
self.prod_2.sale_ok = False
wizard = self.wizard()
wizard.generate_recommendations()
self.assertNotIn(self.prod_1, wizard.line_ids.mapped("product_id"))
self.assertNotIn(self.prod_2, wizard.line_ids.mapped("product_id"))
def test_transfer(self):
"""Products get transferred to SO."""
qty = 10
wizard = self.wizard()
wiz_line_prod1 = wizard.line_ids.filtered(lambda x: x.product_id == self.prod_1)
wiz_line_prod1.units_included = qty
wizard.action_accept()
self.assertEqual(len(self.new_so.order_line), 1)
self.assertEqual(self.new_so.order_line.product_id, self.prod_1)
self.assertEqual(self.new_so.order_line.product_uom, self.prod_1.uom_id)
self.assertEqual(self.new_so.order_line.product_uom_qty, qty)
# No we confirm the SO
self.new_so.action_confirm()
wizard = self.wizard()
wiz_line = wizard.line_ids.filtered(lambda x: x.product_id == self.prod_1)
wiz_line.units_included = 0
# The confirmed line can't be deleted
with self.assertRaises(UserError):
wizard.action_accept()
# Deliver items and invoice the order
self.new_so.order_line.qty_delivered = qty
adv_wiz = (
self.env["sale.advance.payment.inv"]
.with_context(active_ids=[self.new_so.id])
.create(
{
"advance_payment_method": "delivered",
}
)
)
adv_wiz.with_context(open_invoices=True).create_invoices()
self.new_so.invoice_ids.with_user(self.user_invoice).action_post()
# Open the wizard and add more product qty
wizard = self.wizard()
wiz_line = wizard.line_ids.filtered(lambda x: x.product_id == self.prod_1)
wiz_line.units_included = qty + 2
wizard.action_accept()
# Deliver extra qty and make a new invoice
self.new_so.order_line.qty_delivered = qty + 2
adv_wiz = (
self.env["sale.advance.payment.inv"]
.with_context(active_ids=[self.new_so.id])
.create(
{
"advance_payment_method": "delivered",
}
)
)
adv_wiz.with_context(open_invoices=True).create_invoices()
self.assertEqual(2, len(self.new_so.invoice_ids))
self.assertEqual(2, self.new_so.invoice_ids[-1].invoice_line_ids.quantity)
def test_recommendations_price_origin(self):
# Display product price from pricelist
wizard = self.wizard()
wizard.sale_recommendation_price_origin = "pricelist"
wiz_line_prod1 = wizard.line_ids.filtered(lambda x: x.product_id == self.prod_1)
self.assertEqual(wiz_line_prod1.price_unit, 25.00)
wiz_line_prod2 = wizard.line_ids.filtered(lambda x: x.product_id == self.prod_2)
self.assertEqual(wiz_line_prod2.price_unit, 50.00)
wiz_line_prod3 = wizard.line_ids.filtered(lambda x: x.product_id == self.prod_3)
self.assertEqual(wiz_line_prod3.price_unit, 75.00)
# Display product price from last sale order price
wizard.sale_recommendation_price_origin = "last_sale_price"
wiz_line_prod1 = wizard.line_ids.filtered(lambda x: x.product_id == self.prod_1)
self.assertEqual(wiz_line_prod1.price_unit, 24.50)
wiz_line_prod2 = wizard.line_ids.filtered(lambda x: x.product_id == self.prod_2)
self.assertEqual(wiz_line_prod2.price_unit, 49.50)
wiz_line_prod3 = wizard.line_ids.filtered(lambda x: x.product_id == self.prod_3)
self.assertEqual(wiz_line_prod3.price_unit, 74.50)
# Change confirmation date in order2
self.order2.date_order = "2021-05-07"
wizard.sale_recommendation_price_origin = "pricelist"
wizard.sale_recommendation_price_origin = "last_sale_price"
wiz_line_prod2 = wizard.line_ids.filtered(lambda x: x.product_id == self.prod_2)
self.assertEqual(wiz_line_prod2.price_unit, 89.00)
def test_recommendations_last_sale_price_to_sale_order(self):
# Display product price from last sale order price
wizard = self.wizard()
wizard.sale_recommendation_price_origin = "last_sale_price"
wiz_line_prod1 = wizard.line_ids.filtered(lambda x: x.product_id == self.prod_1)
wiz_line_prod1.units_included = 1.0
wizard.action_accept()
so_line_prod1 = wizard.order_id.order_line.filtered(
lambda x: x.product_id == self.prod_1
)
self.assertEqual(so_line_prod1.price_unit, 24.50)
# If I update sale order line price unit this price can not bw updated
# by wizard
so_line_prod1.price_unit = 60.0
wiz_line_prod1.units_included = 3
wizard.action_accept()
self.assertEqual(so_line_prod1.price_unit, 60.0)
def test_recommendation_delivery_address(self):
self.new_so.partner_shipping_id = self.partner_delivery
wizard = self.wizard()
wizard.use_delivery_address = True
wizard.generate_recommendations()
self.assertEqual(len(wizard.line_ids), 1)
self.assertEqual(wizard.line_ids[0].product_id, self.prod_2)
@freeze_time("2021-10-02 15:30:00")
def test_sale_product_recommendation_add_zero_units_included(self):
so = self.env["sale.order"].create({"partner_id": self.partner.id})
wizard = (
self.env["sale.order.recommendation"]
.with_context(active_id=so.id)
.create({})
)
wizard.generate_recommendations()
wiz_line_prod1 = wizard.line_ids.filtered(lambda x: x.product_id == self.prod_1)
self.assertEqual(wiz_line_prod1.units_included, 0.0)
wizard.action_accept()
order_line = so.order_line.filtered(lambda ol: ol.product_id == self.prod_1)
self.assertEqual(len(order_line), 0)
self.enable_force_zero_units_included()
order_line.product_uom_qty = 1
wizard.generate_recommendations()
wiz_line_prod1 = wizard.line_ids.filtered(lambda x: x.product_id == self.prod_1)
self.assertEqual(wiz_line_prod1.units_included, 0.0)
wiz_line_prod1.units_included = 0
wizard.action_accept()
order_line = so.order_line.filtered(lambda ol: ol.product_id == self.prod_1)
self.assertEqual(len(order_line), 1)
self.assertEqual(order_line.product_uom_qty, 0.0)
def test_sale_product_recommendation_with_extended_domain(self):
self.prod_1.type = "consu"
so = self.env["sale.order"].create({"partner_id": self.partner.id})
wizard = (
self.env["sale.order.recommendation"]
.with_context(active_id=so.id)
.create({})
)
wizard.generate_recommendations()
self.assertIn("service", wizard.line_ids.mapped("product_id.type"))
# Add extended domain to exclude services
self.settings = self.env["res.config.settings"].sudo().create({})
self.settings.sale_line_recommendation_domain = (
"[('product_id.type', '!=', 'service')]"
)
self.settings.set_values()
wizard = (
self.env["sale.order.recommendation"]
.with_context(active_id=so.id)
.create({})
)
wizard.generate_recommendations()
self.assertNotIn("service", wizard.line_ids.mapped("product_id.type"))
def test_no_recommendations_found(self):
new_partner = self.partner.copy()
self.new_so.partner_id = new_partner
with self.assertRaisesRegex(UserError, "Nothing found!"):
self.wizard()

View File

@@ -0,0 +1,162 @@
# Copyright 2017 Tecnativa - Jairo Llopis
# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl).
from odoo.tests import TransactionCase, new_test_user
from odoo.addons.base.tests.common import DISABLED_MAIL_CONTEXT
class RecommendationCase(TransactionCase):
@classmethod
def setUpClass(cls):
super().setUpClass()
# Make sure user has UoM activated for Forms to work
cls.user_salesman = new_test_user(
cls.env,
"test_recommendation",
"sales_team.group_sale_salesman",
DISABLED_MAIL_CONTEXT,
)
cls.user_invoice = new_test_user(
cls.env,
"test_recommendation_invoice",
"account.group_account_invoice",
DISABLED_MAIL_CONTEXT,
)
cls.env = cls.user_salesman.env
cls.pricelist = cls.env["product.pricelist"].create(
{
"name": "Pricelist for test",
}
)
cls.partner = cls.env["res.partner"].create(
{"name": "Mr. Odoo", "property_product_pricelist": cls.pricelist.id}
)
cls.partner_delivery = cls.env["res.partner"].create(
{
"name": "Mr. Odoo Delivery",
"property_product_pricelist": cls.pricelist.id,
}
)
cls.cat_a, cls.cat_b = cls.env["product.category"].create(
[{"name": "A"}, {"name": "B"}]
)
cls.product_obj = cls.env["product.product"]
cls.prod_1 = cls.product_obj.create(
{
"name": "Test Product 1",
"type": "service",
"list_price": 25.00,
"categ_id": cls.cat_b.id,
}
)
cls.prod_2 = cls.product_obj.create(
{
"name": "Test Product 2",
"type": "service",
"list_price": 50.00,
"categ_id": cls.cat_b.id,
}
)
cls.prod_3 = cls.product_obj.create(
{
"name": "Test Product 3",
"type": "service",
"list_price": 75.00,
"categ_id": cls.cat_a.id,
"default_code": "TEST-PROD-3",
}
)
# Create old sale orders to have searchable history
# (Remember to change the dates if the tests fail)
cls.env = cls.env(user=cls.user_salesman)
cls.order1 = cls.env["sale.order"].create(
{
"partner_id": cls.partner.id,
"state": "sale",
"locked": "True",
"date_order": "2021-05-05",
"order_line": [
(
0,
0,
{
"product_id": cls.prod_1.id,
"name": cls.prod_1.name,
"product_uom_qty": 25,
"qty_delivered_method": "manual",
"qty_delivered": 25,
"price_unit": 24.50,
},
),
(
0,
0,
{
"product_id": cls.prod_2.id,
"name": cls.prod_2.name,
"product_uom_qty": 50,
"qty_delivered_method": "manual",
"qty_delivered": 50,
"price_unit": 49.50,
},
),
(
0,
0,
{
"product_id": cls.prod_3.id,
"name": cls.prod_3.name,
"product_uom_qty": 100,
"qty_delivered_method": "manual",
"qty_delivered": 100,
"price_unit": 74.50,
},
),
],
}
)
cls.order2 = cls.env["sale.order"].create(
{
"partner_id": cls.partner.id,
"partner_shipping_id": cls.partner_delivery.id,
"state": "sale",
"locked": "True",
"date_order": "2021-05-03",
"order_line": [
(
0,
0,
{
"product_id": cls.prod_2.id,
"name": cls.prod_2.name,
"product_uom_qty": 50,
"qty_delivered_method": "manual",
"qty_delivered": 50,
"price_unit": 89.00,
},
),
],
}
)
# Create a new sale order for the same customer
cls.new_so = cls.env["sale.order"].create(
{
"partner_id": cls.partner.id,
}
)
def wizard(self):
"""Get a wizard."""
wizard = (
self.env["sale.order.recommendation"]
.with_context(active_id=self.new_so.id)
.create({})
)
wizard.generate_recommendations()
return wizard
def enable_force_zero_units_included(self):
self.settings = self.env["res.config.settings"].sudo().create({})
self.settings.force_zero_units_included = True
self.settings.set_values()

View File

@@ -0,0 +1,61 @@
<?xml version="1.0" encoding="utf-8" ?>
<odoo>
<record id="res_config_settings_view_form_sale" model="ir.ui.view">
<field name="model">res.config.settings</field>
<field name="inherit_id" ref="sale.res_config_settings_view_form" />
<field name="arch" type="xml">
<xpath expr="//setting[@id='quotation_validity_days']/.." position="after">
<block
title="Sale order recommendations"
id="sale_order_recommendation"
>
<setting
string="Product recommendation price origin"
help="Select the origin for display product price in sale orders recommendation"
>
<div class="text-muted">
<field name="default_sale_recommendation_price_origin" />
</div>
</setting>
<setting
string="Use delivery address"
help="If this is selected, it will take care by default on
Delivery Address instead of customer on sale orders
recommendation"
>
<field name="default_use_delivery_address" />
</setting>
<setting
string="Default months backwards to generate recommendations"
help="If this is selected, it will take care by default on
Delivery Address instead of customer on sale orders
recommendation"
>
<field name="default_months" />
</setting>
<setting string="Default Number of recommendations">
<field name="default_line_amount" />
</setting>
<setting
string="Add recommended with zero units included"
help="Add recomented products in so even if units included is zero."
>
<field name="force_zero_units_included" />
</setting>
<setting
string="Sale order product recommendation domain"
help="Domain applied on sale orders lines to recommend products for sales"
>
<div class="text-muted">
<field
name="sale_line_recommendation_domain"
widget="domain"
options="{'model': 'sale.order.line'}"
/>
</div>
</setting>
</block>
</xpath>
</field>
</record>
</odoo>

View File

@@ -0,0 +1,20 @@
<?xml version="1.0" encoding="utf-8" ?>
<!-- Copyright 2017 Jairo Llopis <jairo.llopis@tecnativa.com>
License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl). -->
<odoo>
<record id="view_order_form" model="ir.ui.view">
<field name="name">Recommended products button</field>
<field name="model">sale.order</field>
<field name="inherit_id" ref="sale.view_order_form" />
<field name="arch" type="xml">
<xpath expr="//form//header//button[@name='action_draft']" position="after">
<button
name="%(sale_order_recommendation_action)d"
invisible="locked or state == 'cancel'"
string="Recommended Products"
type="action"
/>
</xpath>
</field>
</record>
</odoo>

View File

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

View File

@@ -0,0 +1,375 @@
# Copyright 2017 Jairo Llopis <jairo.llopis@tecnativa.com>
# Copyright 2018 Carlos Dauden <carlos.dauden@tecnativa.com>
# Copyright 2020 Tecnativa - Pedro M. Baeza
# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl).
import logging
from datetime import datetime, timedelta
from odoo import _, api, fields, models
from odoo.exceptions import UserError
from odoo.osv import expression
from odoo.tools.safe_eval import safe_eval
_logger = logging.getLogger(__name__)
class SaleOrderRecommendation(models.TransientModel):
_name = "sale.order.recommendation"
_description = "Recommended products for current sale order"
order_id = fields.Many2one(
"sale.order",
"Sale Order",
default=lambda self: self._default_order_id(),
required=True,
readonly=True,
ondelete="cascade",
)
line_ids = fields.One2many(
"sale.order.recommendation.line", "wizard_id", "Products"
)
recommendations_order = fields.Selection(
[
("times_delivered desc", "Times delivered"),
("units_delivered desc", "Units delivered"),
("product_categ_complete_name asc", "Product category"),
("product_default_code asc", "Product code"),
("product_name asc", "Product name"),
],
required=True,
default="times_delivered desc",
)
# Get default value from config settings
use_delivery_address = fields.Boolean(string="Use delivery address")
sale_recommendation_price_origin = fields.Selection(
[("pricelist", "Pricelist"), ("last_sale_price", "Last sale price")],
string="Product price origin",
default="pricelist",
)
line_amount = fields.Integer(
"Number of recommendations",
default=15,
required=True,
help="The less, the faster they will be found.",
)
months = fields.Float(
default=6,
required=True,
help="Consider these months backwards to generate recommendations.",
)
@api.model
def _default_order_id(self):
return self.env.context.get("active_id", False)
def _extended_recommendable_sale_order_lines_domain(self):
"""Extra domain to include or exclude SO lines"""
return safe_eval(self.env.user.company_id.sale_line_recommendation_domain)
def _recommendable_sale_order_lines_domain(self):
"""Domain to find recent SO lines."""
start = datetime.now() - timedelta(days=self.months * 30)
start = fields.Datetime.to_string(start)
partner = (
self.order_id.partner_shipping_id
if self.use_delivery_address
else self.order_id.partner_id.commercial_partner_id
)
sale_order_partner_field = (
"partner_shipping_id" if self.use_delivery_address else "partner_id"
)
# Search with sudo for get sale order from other commercials users
other_sales = (
self.env["sale.order"]
.sudo()
.search(
[
("company_id", "=", self.order_id.company_id.id),
(sale_order_partner_field, "child_of", partner.id),
("date_order", ">=", start),
]
)
)
domain = [
("order_id", "in", (other_sales - self.order_id).ids),
("product_id.active", "=", True),
("product_id.sale_ok", "=", True),
("qty_delivered", "!=", 0.0),
]
# Exclude delivery products
# We can not use the method _is_delivery() from sale module because we are
# doing a domain for a readgroup query
if "is_delivery" in self.env["sale.order.line"]._fields:
domain.append(("is_delivery", "=", False))
extended_domain = self._extended_recommendable_sale_order_lines_domain()
domain = expression.AND([domain, extended_domain])
return domain
def _prepare_recommendation_line_vals(self, group_line, so_line=False):
"""Return the vals dictionary for creating a new recommendation line.
@param group_line: Dictionary returned by the read_group operation.
@param so_line: Optional sales order line
"""
vals = {
"product_id": group_line[0].id if group_line else so_line.product_id.id,
"times_delivered": group_line[1] if group_line else 0.0,
"units_delivered": group_line[2] if group_line else 0.0,
}
if so_line:
vals["units_included"] = so_line.product_uom_qty
vals["sale_line_id"] = so_line.id
return vals
def _reopen_wizard(self):
"""Tell the client to close the wizard and open it again."""
return {
"type": "ir.actions.act_window",
"res_model": self._name,
"res_id": self.id,
"view_mode": "form",
"target": "new",
}
def action_reset(self):
"""Empty the list of recommendations."""
self.line_ids = False
return self._reopen_wizard()
def generate_recommendations(self):
"""Generate lines according to context sale order."""
# Search delivered products in previous months
# Search with sudo for get sale order from other commercials users
found_lines = (
self.env["sale.order.line"]
.sudo()
._read_group(
self._recommendable_sale_order_lines_domain(),
["product_id"],
["__count", "qty_delivered:sum"],
limit=self.line_amount,
order="__count desc, qty_delivered:sum desc",
)
)
found_dict = {data[0]: data for data in found_lines}
recommendation_lines = self.env["sale.order.recommendation.line"]
existing_product_ids = set()
# Always recommend all products already present in the linked SO except delivery
# carrier products
for line in self.order_id.order_line.filtered(lambda ln: not ln._is_delivery()):
found_line = found_dict.get(
line.product_id,
False,
)
new_line = recommendation_lines.new(
self._prepare_recommendation_line_vals(found_line, line)
)
recommendation_lines += new_line
existing_product_ids.add(line.product_id.id)
# Add recent SO recommendations too
for found_line in found_lines:
if found_line[0].id in existing_product_ids:
continue
new_line = recommendation_lines.new(
self._prepare_recommendation_line_vals(found_line)
)
recommendation_lines += new_line
# Sort recommendations by user choice
order_field, order_dir = map(str.lower, self.recommendations_order.split())
# Priority order (which can have an str value "0" or "1") must always
# default to DESC, no matter the order_dir; so we inverse it if it's ASC
priority_multiplier = 1 if order_dir == "desc" else -1
self.line_ids = recommendation_lines.sorted(
key=lambda line: (
"" if line[order_field] is False else line[order_field],
int(line.product_id.sequence) * priority_multiplier,
),
reverse=order_dir == "desc",
)
if not self.line_ids:
raise UserError(
_("Nothing found! Modify your criteria or fill the order manually.")
)
# Reopen wizard
return self._reopen_wizard()
def action_accept(self):
"""Propagate recommendations to sale order."""
sequence = max(self.order_id.mapped("order_line.sequence") or [0])
to_remove = []
sale_order_line_obj = self.env["sale.order.line"].sudo()
new_line_vals = []
force_zero_units_included = self.env.user.company_id.force_zero_units_included
for wiz_line in self.line_ids:
if (
not wiz_line.sale_line_id
and not wiz_line.units_included
and not force_zero_units_included
):
continue
if wiz_line.sale_line_id:
if wiz_line.units_included or force_zero_units_included:
wiz_line.sale_line_id.update(
wiz_line._prepare_update_so_line_vals()
)
else:
to_remove.append(wiz_line.sale_line_id.id)
else:
sequence += 1
vals = wiz_line._prepare_new_so_line_vals(sequence)
new_line_vals.append(vals)
# Remove at the end and in reverse order for not having problems
to_remove.reverse()
sale_order_line_obj.browse(to_remove).unlink()
if new_line_vals:
sale_order_line_obj.create(new_line_vals)
class SaleOrderRecommendationLine(models.TransientModel):
_name = "sale.order.recommendation.line"
_description = "Recommended product for current sale order"
_order = "product_is_favorite desc, id"
currency_id = fields.Many2one(related="product_id.currency_id")
partner_id = fields.Many2one(related="wizard_id.order_id.partner_id")
product_id = fields.Many2one("product.product")
product_name = fields.Char(related="product_id.name", readonly=True)
product_categ_complete_name = fields.Char(
string="Product category",
related="product_id.categ_id.complete_name",
readonly=True,
store=True,
)
product_default_code = fields.Char(
related="product_id.default_code", readonly=True, store=True
)
product_is_favorite = fields.Boolean(
related="product_id.is_favorite", store=True, readonly=False
)
product_uom_readonly = fields.Boolean(related="sale_line_id.product_uom_readonly")
product_uom_category_id = fields.Many2one(
related="product_id.uom_id.category_id", depends=["product_id"]
)
price_unit = fields.Monetary(compute="_compute_price_unit")
pricelist_id = fields.Many2one(related="wizard_id.order_id.pricelist_id")
times_delivered = fields.Integer(readonly=True)
units_delivered = fields.Float(readonly=True)
units_included = fields.Float()
wizard_id = fields.Many2one(
"sale.order.recommendation",
"Wizard",
ondelete="cascade",
required=True,
readonly=True,
)
sale_line_id = fields.Many2one(comodel_name="sale.order.line")
sale_uom_id = fields.Many2one(
comodel_name="uom.uom",
string="Unit of Measure",
compute="_compute_sale_uom_id",
store=True,
readonly=False,
domain="[('category_id', '=', product_uom_category_id)]",
)
@api.depends("sale_line_id", "product_id")
def _compute_sale_uom_id(self):
for line in self:
line.sale_uom_id = line.sale_line_id.product_uom or line.product_id.uom_id
@api.depends(
"partner_id",
"product_id",
"pricelist_id",
"units_included",
"wizard_id.sale_recommendation_price_origin",
)
def _compute_price_unit(self):
"""
Get product price unit from product list price or from last sale price
"""
price_origin = (
fields.first(self).wizard_id.sale_recommendation_price_origin or "pricelist"
)
for line in self:
if price_origin == "pricelist":
line.price_unit = line._get_unit_price_from_pricelist()
else:
line.price_unit = line._get_last_sale_price_product()
def _prepare_update_so_line_vals(self):
vals = {"product_uom_qty": self.units_included}
if not self.product_uom_readonly:
vals["product_uom"] = self.sale_uom_id.id
return vals
def _prepare_new_so_line_vals(self, sequence):
vals = {
"product_id": self.product_id.id,
"sequence": sequence,
"product_uom_qty": self.units_included,
"order_id": self.wizard_id.order_id.id,
}
if not self.product_uom_readonly:
vals["product_uom"] = self.sale_uom_id.id
if self.wizard_id.sale_recommendation_price_origin == "last_sale_price":
vals["price_unit"] = self.price_unit
return vals
def _get_last_sale_price_product(self):
"""
Get last price from last order.
Use sudo to read sale order from other users like as other commercials.
"""
self.ensure_one()
so = (
self.env["sale.order"]
.sudo()
.search(
[
("company_id", "=", self.wizard_id.order_id.company_id.id),
("partner_id", "=", self.partner_id.id),
("date_order", "!=", False),
("state", "not in", ("draft", "sent", "cancel")),
("order_line.product_id", "=", self.product_id.id),
],
limit=1,
order="date_order DESC, id DESC",
)
)
so_line = (
self.env["sale.order.line"]
.sudo()
.search(
[("order_id", "=", so.id), ("product_id", "=", self.product_id.id)],
limit=1,
order="id DESC",
)
.with_context(prefetch_fields=False)
)
return so_line.price_unit or 0.0
def _get_unit_price_from_pricelist(self):
pricelist_rule_id = self.pricelist_id._get_product_rule(
self.product_id,
self.units_included or 1.0,
uom=self.sale_uom_id or self.product_id.uom_id,
date=self.wizard_id.order_id.date_order,
)
pricelist_rule = self.env["product.pricelist.item"].browse(pricelist_rule_id)
price_rule = pricelist_rule._compute_price(
self.product_id,
self.units_included,
self.sale_uom_id or self.product_id.uom_id,
self.wizard_id.order_id.date_order,
currency=self.currency_id,
)
price_unit = self.product_id._get_tax_included_unit_price(
self.wizard_id.order_id.company_id,
self.currency_id,
self.wizard_id.order_id.date_order,
"sale",
fiscal_position=self.wizard_id.order_id.fiscal_position_id,
product_price_unit=price_rule,
product_currency=self.currency_id,
)
return price_unit

View File

@@ -0,0 +1,193 @@
<?xml version="1.0" encoding="utf-8" ?>
<!-- Copyright 2017 Jairo Llopis <jairo.llopis@tecnativa.com>
Copyright 2020 Tecnativa - Pedro M. Baeza
License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl). -->
<odoo>
<record id="sale_order_recommendation_view_form" model="ir.ui.view">
<field name="name">Recommended Products for this Customer</field>
<field name="model">sale.order.recommendation</field>
<field name="arch" type="xml">
<form>
<sheet>
<group invisible="line_ids">
<group>
<field name="order_id" invisible="1" />
<field name="months" widget="numeric_step" />
<field name="line_amount" widget="numeric_step" />
</group>
<group>
<field name="sale_recommendation_price_origin" />
<field name="use_delivery_address" />
<field name="recommendations_order" />
</group>
</group>
<group col="2">
<field
name="line_ids"
nolabel="1"
mode="list,kanban"
colspan="2"
invisible="not line_ids"
>
<list create="0" delete="0" editable="top">
<field
name="product_is_favorite"
widget="boolean_favorite"
optional="show"
nolabel="1"
/>
<field name="currency_id" column_invisible="1" />
<field name="sale_line_id" column_invisible="1" />
<field
name="product_categ_complete_name"
optional="show"
/>
<field
name="product_id"
readonly="1"
force_save="1"
optional="hide"
/>
<field name="product_default_code" optional="show" />
<field name="product_name" optional="show" />
<field name="price_unit" optional="show" />
<field name="times_delivered" optional="show" />
<field name="units_delivered" optional="show" />
<field name="units_included" widget="numeric_step" />
<field
name="product_uom_category_id"
column_invisible="1"
/>
<field
name="product_uom_readonly"
column_invisible="1"
/>
<field
name="sale_uom_id"
optional="show"
groups="uom.group_uom"
readonly="product_uom_readonly"
/>
</list>
<kanban
class="o_kanban_mobile"
quick_create="0"
create="0"
delete="0"
>
<field name="id" />
<field name="product_id" />
<field name="sale_line_id" />
<field name="price_unit" />
<field name="sale_uom_id" />
<field name="times_delivered" />
<field name="units_delivered" />
<field name="units_included" />
<field name="currency_id" />
<templates>
<t t-name="card">
<div class="oe_kanban_global_click">
<div class="o_kanban_image me-1">
<img
t-att-src="kanban_image('product.product', 'image_128', record.product_id.raw_value)"
alt="Product"
class="o_image_64_contain"
/>
</div>
<div class="oe_kanban_details">
<div class="o_kanban_record_top mb-0">
<div
class="o_kanban_record_headings"
>
<field
name="product_id"
class="o_kanban_record_title"
/>
</div>
<field
class="w-auto mb-0"
name="product_is_favorite"
widget="priority"
/>
</div>
<div>Price: <field
name="price_unit"
widget="monetary"
options="{'currency_field': 'currency_id', 'field_digits': True}"
class="oe_inline mt-0 mb-0"
/></div>
<div>Delivered: <field
name="times_delivered"
/> times - <field
name="units_delivered"
/> <field name="sale_uom_id" /></div>
<div>
<strong>
<span>To be included: </span>
<field name="units_included" />
<span />
<field
name="sale_uom_id"
groups="uom.group_uom"
/>
</strong>
</div>
</div>
</div>
</t>
</templates>
</kanban>
<form>
<group>
<field name="wizard_id" invisible="1" />
<field
name="product_id"
readonly="1"
force_save="1"
/>
<field name="price_unit" />
<field
name="units_included"
widget="numeric_step"
/>
</group>
</form>
</field>
</group>
</sheet>
<footer>
<button
invisible="line_ids"
class="btn-primary"
icon="fa-refresh"
name="generate_recommendations"
string="Get recommendations"
type="object"
/>
<button
invisible="not line_ids"
name="action_accept"
type="object"
string="Accept"
class="oe_highlight"
/>
<button
invisible="not line_ids"
confirm="You will lose any changes you have made. Are you sure?"
name="action_reset"
string="Change criteria"
type="object"
/>
<button special="cancel" string="Cancel" />
</footer>
</form>
</field>
</record>
<record id="sale_order_recommendation_action" model="ir.actions.act_window">
<field name="name">Recommended Products for this Customer</field>
<field name="res_model">sale.order.recommendation</field>
<field name="view_mode">form</field>
<field name="target">new</field>
</record>
</odoo>