diff --git a/sale_order_product_recommendation/README.rst b/sale_order_product_recommendation/README.rst new file mode 100644 index 00000000000..d7f32de73fa --- /dev/null +++ b/sale_order_product_recommendation/README.rst @@ -0,0 +1,178 @@ +================================= +Sale Order Product Recommendation +================================= + +.. + !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! + !! This file is generated by oca-gen-addon-readme !! + !! changes will be overwritten. !! + !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! + !! source digest: sha256:31f3f19baf679e3c4c2022eb21dce8110f453fc63b5a0beeaad609d41c911268 + !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! + +.. |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 `_. +In case of trouble, please check there if your issue has already been reported. +If you spotted it first, help us to smash it by providing a detailed and welcomed +`feedback `_. + +Do not contact contributors directly about support or help with technical issues. + +Credits +======= + +Authors +------- + +* Tecnativa + +Contributors +------------ + +- `Tecnativa `__: + + - Jairo Llopis + - David Vidal + - Alexandre Díaz + - Pedro M. Baeza + - Sergio Teruel + - Carlos Roca + - Víctor Martínez + +- `Camptocamp SA `__: + + - Telmo Santos + +- `Moduon `__: + + - Rafael Blasco + - Gelo Joga + - Jairo Llopis + +- `Trobz `__: + + - 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 `__: + +|maintainer-sergio-teruel| |maintainer-rafaelbn| |maintainer-yajo| + +This module is part of the `OCA/sale-workflow `_ project on GitHub. + +You are welcome to contribute. To learn how please visit https://odoo-community.org/page/Contribute. diff --git a/sale_order_product_recommendation/__init__.py b/sale_order_product_recommendation/__init__.py new file mode 100644 index 00000000000..7588e52c8cc --- /dev/null +++ b/sale_order_product_recommendation/__init__.py @@ -0,0 +1,4 @@ +# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl). + +from . import models +from . import wizards diff --git a/sale_order_product_recommendation/__manifest__.py b/sale_order_product_recommendation/__manifest__.py new file mode 100644 index 00000000000..f793bbd9d81 --- /dev/null +++ b/sale_order_product_recommendation/__manifest__.py @@ -0,0 +1,24 @@ +# Copyright 2017 Jairo Llopis +# 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", + ], +} diff --git a/sale_order_product_recommendation/i18n/es.po b/sale_order_product_recommendation/i18n/es.po new file mode 100644 index 00000000000..99d82978335 --- /dev/null +++ b/sale_order_product_recommendation/i18n/es.po @@ -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 \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 "" +"Add recommended with zero units included" +msgstr "" +"Añadir recomendado con cero unidades incluidas" + +#. 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 "" +"Número de recomendaciones por defecto" + +#. 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 "" +"Meses atrás por defecto para generar las " +"recomendaciones" + +#. 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 "" +"Origen del precio para el recomendador de " +"productos" + +#. 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 "" +"Dominio de recomendación de productos de " +"pedidos 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 "Use delivery address" +msgstr "Usar dirección de entrega" + +#. module: sale_order_product_recommendation +#: model_terms:ir.ui.view,arch_db:sale_order_product_recommendation.sale_order_recommendation_view_form +msgid "To be included: " +msgstr "Para ser incluido: " + +#. 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 -" \ No newline at end of file diff --git a/sale_order_product_recommendation/i18n/it.po b/sale_order_product_recommendation/i18n/it.po new file mode 100644 index 00000000000..02399a4a80e --- /dev/null +++ b/sale_order_product_recommendation/i18n/it.po @@ -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 \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 "" +"Add recommended with zero units included" +msgstr "" +"Aggiungi suggeriti con zero unità incluse" + +#. 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 "Numero suggerimenti prdefinito" + +#. 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 "" +"Mesi antecedenti predefiniti per generare " +"suggerimenti" + +#. 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 prezzo suggerimento prodotto" + +#. 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 "" +"Dominio suggerimento prodotto 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 "Use delivery address" +msgstr "Usa indirizzo consegna" + +#. module: sale_order_product_recommendation +#: model_terms:ir.ui.view,arch_db:sale_order_product_recommendation.sale_order_recommendation_view_form +msgid "To be included: " +msgstr "Da includere: " + +#. 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 -" diff --git a/sale_order_product_recommendation/i18n/pt_BR.po b/sale_order_product_recommendation/i18n/pt_BR.po new file mode 100644 index 00000000000..f7bc8b8bcda --- /dev/null +++ b/sale_order_product_recommendation/i18n/pt_BR.po @@ -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 \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 "" +"Add recommended with zero units included" +msgstr "" +"Adicionar recomendado com zero unidades " +"incluídas" + +#. 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 "Número padrão de recomendações" + +#. 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 "" +"Meses anteriores padrão para gerar " +"recomendações" + +#. 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 "" +"Origem do preço recomendado do produto" + +#. 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 "" +"Domínio de recomendação de produtos para " +"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 "Use delivery address" +msgstr "Usar endereço de entrega" + +#. module: sale_order_product_recommendation +#: model_terms:ir.ui.view,arch_db:sale_order_product_recommendation.sale_order_recommendation_view_form +msgid "To be included: " +msgstr "Para ser incluído: " + +#. 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 -" diff --git a/sale_order_product_recommendation/i18n/sale_order_product_recommendation.pot b/sale_order_product_recommendation/i18n/sale_order_product_recommendation.pot new file mode 100644 index 00000000000..01111c98a0d --- /dev/null +++ b/sale_order_product_recommendation/i18n/sale_order_product_recommendation.pot @@ -0,0 +1,393 @@ +# Translation of Odoo Server. +# This file contains the translation of the following modules: +# * sale_order_product_recommendation +# +msgid "" +msgstr "" +"Project-Id-Version: Odoo Server 17.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 "To be included: " +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 +#, python-format +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 "" diff --git a/sale_order_product_recommendation/models/__init__.py b/sale_order_product_recommendation/models/__init__.py new file mode 100644 index 00000000000..9f1b8534775 --- /dev/null +++ b/sale_order_product_recommendation/models/__init__.py @@ -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 diff --git a/sale_order_product_recommendation/models/res_company.py b/sale_order_product_recommendation/models/res_company.py new file mode 100644 index 00000000000..a9ffe8e65a5 --- /dev/null +++ b/sale_order_product_recommendation/models/res_company.py @@ -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="[]") diff --git a/sale_order_product_recommendation/models/res_config_settings.py b/sale_order_product_recommendation/models/res_config_settings.py new file mode 100644 index 00000000000..7a4ef210a62 --- /dev/null +++ b/sale_order_product_recommendation/models/res_config_settings.py @@ -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.", + ) diff --git a/sale_order_product_recommendation/pyproject.toml b/sale_order_product_recommendation/pyproject.toml new file mode 100644 index 00000000000..4231d0cccb3 --- /dev/null +++ b/sale_order_product_recommendation/pyproject.toml @@ -0,0 +1,3 @@ +[build-system] +requires = ["whool"] +build-backend = "whool.buildapi" diff --git a/sale_order_product_recommendation/readme/CONFIGURE.md b/sale_order_product_recommendation/readme/CONFIGURE.md new file mode 100644 index 00000000000..b8170bc5c19 --- /dev/null +++ b/sale_order_product_recommendation/readme/CONFIGURE.md @@ -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")]` diff --git a/sale_order_product_recommendation/readme/CONTRIBUTORS.md b/sale_order_product_recommendation/readme/CONTRIBUTORS.md new file mode 100644 index 00000000000..fbef03693a9 --- /dev/null +++ b/sale_order_product_recommendation/readme/CONTRIBUTORS.md @@ -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 diff --git a/sale_order_product_recommendation/readme/DESCRIPTION.md b/sale_order_product_recommendation/readme/DESCRIPTION.md new file mode 100644 index 00000000000..2fc59e57a9e --- /dev/null +++ b/sale_order_product_recommendation/readme/DESCRIPTION.md @@ -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. diff --git a/sale_order_product_recommendation/readme/USAGE.md b/sale_order_product_recommendation/readme/USAGE.md new file mode 100644 index 00000000000..5dc6694d224 --- /dev/null +++ b/sale_order_product_recommendation/readme/USAGE.md @@ -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*. diff --git a/sale_order_product_recommendation/security/ir.model.access.csv b/sale_order_product_recommendation/security/ir.model.access.csv new file mode 100644 index 00000000000..3f637b82f48 --- /dev/null +++ b/sale_order_product_recommendation/security/ir.model.access.csv @@ -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 diff --git a/sale_order_product_recommendation/static/description/icon.png b/sale_order_product_recommendation/static/description/icon.png new file mode 100644 index 00000000000..3a0328b516c Binary files /dev/null and b/sale_order_product_recommendation/static/description/icon.png differ diff --git a/sale_order_product_recommendation/static/description/index.html b/sale_order_product_recommendation/static/description/index.html new file mode 100644 index 00000000000..3d109d6e1e2 --- /dev/null +++ b/sale_order_product_recommendation/static/description/index.html @@ -0,0 +1,513 @@ + + + + + +Sale Order Product Recommendation + + + +
+

Sale Order Product Recommendation

+ + +

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

+

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

+ +
+

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. +
  3. Assign the desired value to Product recommendation price origin +field.
  4. +
  5. Press Save button to store the change.
  6. +
+

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. +
  3. Assign the desired value to Use delivery address field.
  4. +
  5. Press Save button to store the change.
  6. +
+

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. +
  3. Select Force zero units included
  4. +
+

You can add a filter domain to exclude or include additional recommended +products.

+
    +
  1. Go to Sales > Configuration > Settings > Sale order +recommendations.
  2. +
  3. Add a filter in section Sale order product recommendation domain +Example: [("product_type", "!=" "service")]
  4. +
+
+
+

Usage

+

To use this module, you need to:

+
    +
  1. Create a new sale order.
  2. +
  3. Assign its customer.
  4. +
  5. Press Recommended Products button.
  6. +
  7. Configure the recommendations parameters.
  8. +
  9. Press Get recommendations button.
  10. +
  11. Add products into the opened wizard.
  12. +
  13. Press Accept.
  14. +
+
+
+

Bug Tracker

+

Bugs are tracked on GitHub Issues. +In case of trouble, please check there if your issue has already been reported. +If you spotted it first, help us to smash it by providing a detailed and welcomed +feedback.

+

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

+
+
+

Credits

+
+

Authors

+
    +
  • Tecnativa
  • +
+
+
+

Contributors

+
    +
  • Tecnativa:
      +
    • Jairo Llopis
    • +
    • David Vidal
    • +
    • Alexandre Díaz
    • +
    • Pedro M. Baeza
    • +
    • Sergio Teruel
    • +
    • Carlos Roca
    • +
    • Víctor Martínez
    • +
    +
  • +
  • Camptocamp SA:
      +
    • Telmo Santos
    • +
    +
  • +
  • Moduon:
      +
    • Rafael Blasco
    • +
    • Gelo Joga
    • +
    • Jairo Llopis
    • +
    +
  • +
  • Trobz:
      +
    • Tris Doan
    • +
    +
  • +
+
+
+

Maintainers

+

This module is maintained by the OCA.

+ +Odoo Community Association + +

OCA, or the Odoo Community Association, is a nonprofit organization whose +mission is to support the collaborative development of Odoo features and +promote its widespread use.

+

Current maintainers:

+

sergio-teruel rafaelbn yajo

+

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

+

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

+
+
+
+ + diff --git a/sale_order_product_recommendation/tests/__init__.py b/sale_order_product_recommendation/tests/__init__.py new file mode 100644 index 00000000000..53c120f4157 --- /dev/null +++ b/sale_order_product_recommendation/tests/__init__.py @@ -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 diff --git a/sale_order_product_recommendation/tests/test_recommendation.py b/sale_order_product_recommendation/tests/test_recommendation.py new file mode 100644 index 00000000000..4d6bdd694d9 --- /dev/null +++ b/sale_order_product_recommendation/tests/test_recommendation.py @@ -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() diff --git a/sale_order_product_recommendation/tests/test_recommendation_common.py b/sale_order_product_recommendation/tests/test_recommendation_common.py new file mode 100644 index 00000000000..5914886980f --- /dev/null +++ b/sale_order_product_recommendation/tests/test_recommendation_common.py @@ -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() diff --git a/sale_order_product_recommendation/views/res_config_settings_views.xml b/sale_order_product_recommendation/views/res_config_settings_views.xml new file mode 100644 index 00000000000..528cc089125 --- /dev/null +++ b/sale_order_product_recommendation/views/res_config_settings_views.xml @@ -0,0 +1,61 @@ + + + + res.config.settings + + + + + +
+ +
+
+ + + + + + + + + + + + + +
+ +
+
+
+
+
+
+
diff --git a/sale_order_product_recommendation/views/sale_order_view.xml b/sale_order_product_recommendation/views/sale_order_view.xml new file mode 100644 index 00000000000..413bd40731f --- /dev/null +++ b/sale_order_product_recommendation/views/sale_order_view.xml @@ -0,0 +1,20 @@ + + + + + Recommended products button + sale.order + + + +