From a33e049c5a79385c1ae37e83b9882a369b289ace Mon Sep 17 00:00:00 2001 From: Roberto Zanardo Date: Thu, 6 Nov 2025 01:01:50 +0100 Subject: [PATCH] Merge triple discount on fork --- purchase_discount/README.rst | 141 + purchase_discount/__init__.py | 2 + purchase_discount/__manifest__.py | 26 + purchase_discount/i18n/de.po | 103 + purchase_discount/i18n/el_GR.po | 95 + purchase_discount/i18n/es.po | 100 + purchase_discount/i18n/es_MX.po | 97 + purchase_discount/i18n/fr.po | 107 + purchase_discount/i18n/fr_CH.po | 99 + purchase_discount/i18n/fr_FR.po | 97 + purchase_discount/i18n/hr.po | 100 + purchase_discount/i18n/it.po | 103 + purchase_discount/i18n/nl.po | 90 + purchase_discount/i18n/pt_BR.po | 102 + purchase_discount/i18n/pt_PT.po | 99 + purchase_discount/i18n/purchase_discount.pot | 89 + purchase_discount/i18n/sl.po | 97 + purchase_discount/i18n/tr.po | 94 + purchase_discount/i18n/zh_CN.po | 101 + .../images/purchase_discount.png | Bin 0 -> 71496 bytes purchase_discount/models/__init__.py | 3 + .../models/product_supplierinfo.py | 52 + purchase_discount/models/purchase_order.py | 136 + purchase_discount/models/res_partner.py | 16 + purchase_discount/readme/CONTRIBUTORS.rst | 16 + purchase_discount/readme/DESCRIPTION.rst | 26 + purchase_discount/readme/ROADMAP.rst | 2 + purchase_discount/readme/USAGE.rst | 7 + purchase_discount/report/__init__.py | 1 + purchase_discount/report/purchase_report.py | 34 + purchase_discount/static/description/icon.png | Bin 0 -> 17935 bytes purchase_discount/static/description/icon.svg | 2997 +++++++++++++++++ .../static/description/index.html | 483 +++ .../description/product_supplierinfo_form.png | Bin 0 -> 23327 bytes .../description/res_partner_company_form.png | Bin 0 -> 23141 bytes .../res_partner_individual_form.png | Bin 0 -> 27942 bytes purchase_discount/tests/__init__.py | 4 + .../test_product_supplierinfo_discount.py | 171 + .../tests/test_purchase_discount.py | 210 ++ .../views/product_supplierinfo_view.xml | 20 + .../views/purchase_discount_view.xml | 45 + .../views/report_purchaseorder.xml | 18 + purchase_discount/views/res_partner_view.xml | 26 + purchase_triple_discount/README.rst | 113 + purchase_triple_discount/__init__.py | 3 + purchase_triple_discount/__manifest__.py | 23 + purchase_triple_discount/hooks.py | 26 + purchase_triple_discount/i18n/de.po | 121 + purchase_triple_discount/i18n/es.po | 135 + purchase_triple_discount/i18n/es_MX.po | 122 + purchase_triple_discount/i18n/es_PE.po | 125 + purchase_triple_discount/i18n/fi.po | 121 + purchase_triple_discount/i18n/fr.po | 138 + purchase_triple_discount/i18n/hr.po | 139 + purchase_triple_discount/i18n/it.po | 147 + purchase_triple_discount/i18n/nl_NL.po | 125 + purchase_triple_discount/i18n/pt_BR.po | 140 + purchase_triple_discount/i18n/pt_PT.po | 122 + .../i18n/purchase_triple_discount.pot | 115 + purchase_triple_discount/i18n/ro.po | 122 + purchase_triple_discount/i18n/sl.po | 142 + purchase_triple_discount/i18n/zh_CN.po | 136 + .../migrations/16.0.3.0.0/post-migrate.py | 74 + .../migrations/16.0.3.0.0/pre-migrate.py | 57 + purchase_triple_discount/models/__init__.py | 3 + .../models/product_supplierinfo.py | 34 + .../models/purchase_order.py | 131 + .../models/res_partner.py | 27 + .../readme/CONTRIBUTORS.rst | 8 + .../readme/DESCRIPTION.rst | 2 + purchase_triple_discount/readme/USAGE.rst | 24 + purchase_triple_discount/report/__init__.py | 1 + .../report/purchase_report.py | 53 + .../static/description/icon.png | Bin 0 -> 9455 bytes .../static/description/index.html | 474 +++ purchase_triple_discount/tests/__init__.py | 1 + .../tests/test_purchase_discount.py | 263 ++ .../views/product_supplierinfo_view.xml | 40 + .../views/purchase_order_report.xml | 34 + .../views/purchase_view.xml | 60 + .../views/res_partner_view.xml | 27 + 81 files changed, 9437 insertions(+) create mode 100644 purchase_discount/README.rst create mode 100644 purchase_discount/__init__.py create mode 100644 purchase_discount/__manifest__.py create mode 100644 purchase_discount/i18n/de.po create mode 100644 purchase_discount/i18n/el_GR.po create mode 100644 purchase_discount/i18n/es.po create mode 100644 purchase_discount/i18n/es_MX.po create mode 100644 purchase_discount/i18n/fr.po create mode 100644 purchase_discount/i18n/fr_CH.po create mode 100644 purchase_discount/i18n/fr_FR.po create mode 100644 purchase_discount/i18n/hr.po create mode 100644 purchase_discount/i18n/it.po create mode 100644 purchase_discount/i18n/nl.po create mode 100644 purchase_discount/i18n/pt_BR.po create mode 100644 purchase_discount/i18n/pt_PT.po create mode 100644 purchase_discount/i18n/purchase_discount.pot create mode 100644 purchase_discount/i18n/sl.po create mode 100644 purchase_discount/i18n/tr.po create mode 100644 purchase_discount/i18n/zh_CN.po create mode 100644 purchase_discount/images/purchase_discount.png create mode 100644 purchase_discount/models/__init__.py create mode 100644 purchase_discount/models/product_supplierinfo.py create mode 100644 purchase_discount/models/purchase_order.py create mode 100644 purchase_discount/models/res_partner.py create mode 100644 purchase_discount/readme/CONTRIBUTORS.rst create mode 100644 purchase_discount/readme/DESCRIPTION.rst create mode 100644 purchase_discount/readme/ROADMAP.rst create mode 100644 purchase_discount/readme/USAGE.rst create mode 100644 purchase_discount/report/__init__.py create mode 100644 purchase_discount/report/purchase_report.py create mode 100644 purchase_discount/static/description/icon.png create mode 100644 purchase_discount/static/description/icon.svg create mode 100644 purchase_discount/static/description/index.html create mode 100644 purchase_discount/static/description/product_supplierinfo_form.png create mode 100644 purchase_discount/static/description/res_partner_company_form.png create mode 100644 purchase_discount/static/description/res_partner_individual_form.png create mode 100644 purchase_discount/tests/__init__.py create mode 100644 purchase_discount/tests/test_product_supplierinfo_discount.py create mode 100644 purchase_discount/tests/test_purchase_discount.py create mode 100644 purchase_discount/views/product_supplierinfo_view.xml create mode 100644 purchase_discount/views/purchase_discount_view.xml create mode 100644 purchase_discount/views/report_purchaseorder.xml create mode 100644 purchase_discount/views/res_partner_view.xml create mode 100644 purchase_triple_discount/README.rst create mode 100644 purchase_triple_discount/__init__.py create mode 100644 purchase_triple_discount/__manifest__.py create mode 100644 purchase_triple_discount/hooks.py create mode 100644 purchase_triple_discount/i18n/de.po create mode 100644 purchase_triple_discount/i18n/es.po create mode 100644 purchase_triple_discount/i18n/es_MX.po create mode 100644 purchase_triple_discount/i18n/es_PE.po create mode 100644 purchase_triple_discount/i18n/fi.po create mode 100644 purchase_triple_discount/i18n/fr.po create mode 100644 purchase_triple_discount/i18n/hr.po create mode 100644 purchase_triple_discount/i18n/it.po create mode 100644 purchase_triple_discount/i18n/nl_NL.po create mode 100644 purchase_triple_discount/i18n/pt_BR.po create mode 100644 purchase_triple_discount/i18n/pt_PT.po create mode 100644 purchase_triple_discount/i18n/purchase_triple_discount.pot create mode 100644 purchase_triple_discount/i18n/ro.po create mode 100644 purchase_triple_discount/i18n/sl.po create mode 100644 purchase_triple_discount/i18n/zh_CN.po create mode 100644 purchase_triple_discount/migrations/16.0.3.0.0/post-migrate.py create mode 100644 purchase_triple_discount/migrations/16.0.3.0.0/pre-migrate.py create mode 100644 purchase_triple_discount/models/__init__.py create mode 100644 purchase_triple_discount/models/product_supplierinfo.py create mode 100644 purchase_triple_discount/models/purchase_order.py create mode 100644 purchase_triple_discount/models/res_partner.py create mode 100644 purchase_triple_discount/readme/CONTRIBUTORS.rst create mode 100644 purchase_triple_discount/readme/DESCRIPTION.rst create mode 100644 purchase_triple_discount/readme/USAGE.rst create mode 100644 purchase_triple_discount/report/__init__.py create mode 100644 purchase_triple_discount/report/purchase_report.py create mode 100644 purchase_triple_discount/static/description/icon.png create mode 100644 purchase_triple_discount/static/description/index.html create mode 100644 purchase_triple_discount/tests/__init__.py create mode 100644 purchase_triple_discount/tests/test_purchase_discount.py create mode 100644 purchase_triple_discount/views/product_supplierinfo_view.xml create mode 100644 purchase_triple_discount/views/purchase_order_report.xml create mode 100644 purchase_triple_discount/views/purchase_view.xml create mode 100644 purchase_triple_discount/views/res_partner_view.xml diff --git a/purchase_discount/README.rst b/purchase_discount/README.rst new file mode 100644 index 00000000000..194d63ca934 --- /dev/null +++ b/purchase_discount/README.rst @@ -0,0 +1,141 @@ +.. image:: https://odoo-community.org/readme-banner-image + :target: https://odoo-community.org/get-involved?utm_source=readme + :alt: Odoo Community Association + +=================================== +Purchase order lines with discounts +=================================== + +.. + !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! + !! This file is generated by oca-gen-addon-readme !! + !! changes will be overwritten. !! + !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! + !! source digest: sha256:c81456deae3988fb4a367ed008e8bf96d21bbbb562fc9c7bb226fa016426b2b9 + !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! + +.. |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/license-AGPL--3-blue.png + :target: http://www.gnu.org/licenses/agpl-3.0-standalone.html + :alt: License: AGPL-3 +.. |badge3| image:: https://img.shields.io/badge/github-OCA%2Fpurchase--workflow-lightgray.png?logo=github + :target: https://github.com/OCA/purchase-workflow/tree/16.0/purchase_discount + :alt: OCA/purchase-workflow +.. |badge4| image:: https://img.shields.io/badge/weblate-Translate%20me-F47D42.png + :target: https://translation.odoo-community.org/projects/purchase-workflow-16-0/purchase-workflow-16-0-purchase_discount + :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/purchase-workflow&target_branch=16.0 + :alt: Try me on Runboat + +|badge1| |badge2| |badge3| |badge4| |badge5| + +This module allows to define a discount per line in the purchase orders. This +discount can be also negative, interpreting it as an increment. + +It also modifies the purchase order report to include the discount field in it. + +This module allows to input a discount in the supplier info form, and propagate +it to purchase order lines: + +* The discount appears explicitly in purchase orders instead of being directly + discounted in price. +* You can set prices and discounts on the same screen. + +.. image:: https://raw.githubusercontent.com/OCA/purchase-workflow/16.0/purchase_discount/static/description/product_supplierinfo_form.png + + +* A new field default_supplierinfo_discount is added on res.partner model. + This value will be used as the default one, on each supplierinfo of that + supplier. + +.. image:: https://raw.githubusercontent.com/OCA/purchase-workflow/16.0/purchase_discount/static/description/res_partner_company_form.png + + +Note: this setting is a new 'company' setting, unavailable for related +partners, as accounting-related Settings. + +.. image:: https://raw.githubusercontent.com/OCA/purchase-workflow/16.0/purchase_discount/static/description/res_partner_individual_form.png + +**Table of contents** + +.. contents:: + :local: + +Usage +===== + +Go to **Purchase > Products**, open one product, and edit or add a record on +the **Vendors** section of the **Purchase** tab. You will see in the prices +section in the down part a new column called **Discount (%)**. You can enter +here the desired discount for that quantity. + +When you make a purchase order for that supplier and that product, discount +will be put automatically. + +Known issues / Roadmap +====================== + +With this module, the *price_unit* field of purchase order line stores the gross price instead of the net price, which is a change in the meaning of +this field. So this module breaks all the other modules that use the *price_unit* field with it's native meaning. + +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 +~~~~~~~ + +* Tiny +* Acysos S.L. +* Tecnativa +* ACSONE SA/NV +* GRAP + +Contributors +~~~~~~~~~~~~ + +* OpenERP S.A. +* Ignacio Ibeas +* Pedro M. Baeza +* Jonathan Nemry +* Sylvain LE GAL (https://twitter.com/legalsylvain) +* Stefan Rijnhart +* `Tecnativa `_: + + * Pedro M. Baeza + * Vicent Cubells + +* Sudhir Arya +* Lorenzo Battistini +* Luisa Miguéns +* Vishnu Vanneri +* Moaad Bourhim + +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. + +This module is part of the `OCA/purchase-workflow `_ project on GitHub. + +You are welcome to contribute. To learn how please visit https://odoo-community.org/page/Contribute. diff --git a/purchase_discount/__init__.py b/purchase_discount/__init__.py new file mode 100644 index 00000000000..bf588bc8b80 --- /dev/null +++ b/purchase_discount/__init__.py @@ -0,0 +1,2 @@ +from . import models +from . import report diff --git a/purchase_discount/__manifest__.py b/purchase_discount/__manifest__.py new file mode 100644 index 00000000000..469a033e4d2 --- /dev/null +++ b/purchase_discount/__manifest__.py @@ -0,0 +1,26 @@ +# © 2004-2009 Tiny SPRL (). +# © 2014-2017 Tecnativa - Pedro M. Baeza +# © 2016 ACSONE SA/NV () +# License AGPL-3 - See http://www.gnu.org/licenses/agpl-3.0.html +{ + "name": "Purchase order lines with discounts", + "author": "Tiny, " + "Acysos S.L., " + "Tecnativa, " + "ACSONE SA/NV," + "GRAP," + "Odoo Community Association (OCA)", + "version": "18.0.1.0.0", + "category": "Purchase Management", + "website": "https://github.com/OCA/purchase-workflow", + "depends": ["purchase_stock"], + "data": [ + "views/purchase_discount_view.xml", + "views/report_purchaseorder.xml", + "views/product_supplierinfo_view.xml", + "views/res_partner_view.xml", + ], + "license": "AGPL-3", + "installable": True, + "images": ["images/purchase_discount.png"], +} diff --git a/purchase_discount/i18n/de.po b/purchase_discount/i18n/de.po new file mode 100644 index 00000000000..1d0e67b4d99 --- /dev/null +++ b/purchase_discount/i18n/de.po @@ -0,0 +1,103 @@ +# Translation of Odoo Server. +# This file contains the translation of the following modules: +# * purchase_discount +# +# Translators: +# OCA Transbot , 2018 +msgid "" +msgstr "" +"Project-Id-Version: Odoo Server 11.0\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2018-02-23 17:50+0000\n" +"PO-Revision-Date: 2020-07-22 12:19+0000\n" +"Last-Translator: c2cdidier \n" +"Language-Team: German (https://www.transifex.com/oca/teams/23907/de/)\n" +"Language: de\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 3.10\n" + +#. module: purchase_discount +#: model_terms:ir.ui.view,arch_db:purchase_discount.report_purchaseorder_document +msgid "Disc. (%)" +msgstr "Rabatt (%)" + +#. module: purchase_discount +#: model:ir.model,name:purchase_discount.model_res_partner +msgid "Contact" +msgstr "Kontakt" + +#. module: purchase_discount +#: model:ir.model.fields,field_description:purchase_discount.field_res_partner__default_supplierinfo_discount +#: model:ir.model.fields,field_description:purchase_discount.field_res_users__default_supplierinfo_discount +msgid "Default Supplier Discount (%)" +msgstr "Standardlieferantenrabatt (%)" + +#. module: purchase_discount +#: model:ir.model.fields,field_description:purchase_discount.field_product_supplierinfo__discount +#: model:ir.model.fields,field_description:purchase_discount.field_purchase_order_line__discount +msgid "Discount (%)" +msgstr "Rabatt (%)" + +#. module: purchase_discount +#: model:ir.model.constraint,message:purchase_discount.constraint_purchase_order_line_discount_limit +msgid "Discount must be lower than 100%." +msgstr "Der Rabatt muss kleiner als 100% sein." + +#. module: purchase_discount +#: model_terms:ir.ui.view,arch_db:purchase_discount.res_partner_form_view +msgid "Discount-related settings are managed on" +msgstr "Rabatt-bezogene Einstellungen werden verwaltet auf" + +#. module: purchase_discount +#: model:ir.model,name:purchase_discount.model_purchase_order +msgid "Purchase Order" +msgstr "Bestellung" + +#. module: purchase_discount +#: model:ir.model,name:purchase_discount.model_purchase_order_line +msgid "Purchase Order Line" +msgstr "Bestellposition" + +#. module: purchase_discount +#: model:ir.model,name:purchase_discount.model_purchase_report +msgid "Purchase Report" +msgstr "Einkaufsbericht" + +#. module: purchase_discount +#: model:ir.model,name:purchase_discount.model_product_supplierinfo +msgid "Supplier Pricelist" +msgstr "Lieferanten Preisliste" + +#. module: purchase_discount +#: model:ir.model.constraint,message:purchase_discount.constraint_product_supplierinfo_discount_limit +msgid "Supplier discount must be lower than 100%." +msgstr "" + +#. module: purchase_discount +#: model:ir.model.fields,help:purchase_discount.field_res_partner__default_supplierinfo_discount +#: model:ir.model.fields,help:purchase_discount.field_res_users__default_supplierinfo_discount +msgid "" +"This value will be used as the default one, for each new supplierinfo line " +"depending on that supplier." +msgstr "" +"Dieser Wert wird als Standardwert für jede neue Lieferanten-Info-Zeile in " +"Zusammenhang mit diesem Lieferanten verwendet." + +#. module: purchase_discount +#: model:ir.model.fields,field_description:purchase_discount.field_purchase_report__discount +msgid "Total discount" +msgstr "" + +#. module: purchase_discount +#: model_terms:ir.ui.view,arch_db:purchase_discount.res_partner_form_view +msgid "the parent company" +msgstr "Die Muttergesellschaft" + +#~ msgid "Stock Move" +#~ msgstr "Lagerbewegung" + +#~ msgid "Stock Rule" +#~ msgstr "Lagerregel" diff --git a/purchase_discount/i18n/el_GR.po b/purchase_discount/i18n/el_GR.po new file mode 100644 index 00000000000..e7e96c31e90 --- /dev/null +++ b/purchase_discount/i18n/el_GR.po @@ -0,0 +1,95 @@ +# Translation of Odoo Server. +# This file contains the translation of the following modules: +# * purchase_discount +# +# Translators: +# OCA Transbot , 2018 +msgid "" +msgstr "" +"Project-Id-Version: Odoo Server 11.0\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2018-02-23 17:50+0000\n" +"PO-Revision-Date: 2018-02-23 17:50+0000\n" +"Last-Translator: OCA Transbot , 2018\n" +"Language-Team: Greek (Greece) (https://www.transifex.com/oca/teams/23907/" +"el_GR/)\n" +"Language: el_GR\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" + +#. module: purchase_discount +#: model_terms:ir.ui.view,arch_db:purchase_discount.report_purchaseorder_document +msgid "Disc. (%)" +msgstr "" + +#. module: purchase_discount +#: model:ir.model,name:purchase_discount.model_res_partner +msgid "Contact" +msgstr "" + +#. module: purchase_discount +#: model:ir.model.fields,field_description:purchase_discount.field_res_partner__default_supplierinfo_discount +#: model:ir.model.fields,field_description:purchase_discount.field_res_users__default_supplierinfo_discount +msgid "Default Supplier Discount (%)" +msgstr "" + +#. module: purchase_discount +#: model:ir.model.fields,field_description:purchase_discount.field_product_supplierinfo__discount +#: model:ir.model.fields,field_description:purchase_discount.field_purchase_order_line__discount +msgid "Discount (%)" +msgstr "Έκπτωση (%)" + +#. module: purchase_discount +#: model:ir.model.constraint,message:purchase_discount.constraint_purchase_order_line_discount_limit +msgid "Discount must be lower than 100%." +msgstr "" + +#. module: purchase_discount +#: model_terms:ir.ui.view,arch_db:purchase_discount.res_partner_form_view +msgid "Discount-related settings are managed on" +msgstr "" + +#. module: purchase_discount +#: model:ir.model,name:purchase_discount.model_purchase_order +msgid "Purchase Order" +msgstr "" + +#. module: purchase_discount +#: model:ir.model,name:purchase_discount.model_purchase_order_line +msgid "Purchase Order Line" +msgstr "" + +#. module: purchase_discount +#: model:ir.model,name:purchase_discount.model_purchase_report +msgid "Purchase Report" +msgstr "" + +#. module: purchase_discount +#: model:ir.model,name:purchase_discount.model_product_supplierinfo +msgid "Supplier Pricelist" +msgstr "" + +#. module: purchase_discount +#: model:ir.model.constraint,message:purchase_discount.constraint_product_supplierinfo_discount_limit +msgid "Supplier discount must be lower than 100%." +msgstr "" + +#. module: purchase_discount +#: model:ir.model.fields,help:purchase_discount.field_res_partner__default_supplierinfo_discount +#: model:ir.model.fields,help:purchase_discount.field_res_users__default_supplierinfo_discount +msgid "" +"This value will be used as the default one, for each new supplierinfo line " +"depending on that supplier." +msgstr "" + +#. module: purchase_discount +#: model:ir.model.fields,field_description:purchase_discount.field_purchase_report__discount +msgid "Total discount" +msgstr "" + +#. module: purchase_discount +#: model_terms:ir.ui.view,arch_db:purchase_discount.res_partner_form_view +msgid "the parent company" +msgstr "" diff --git a/purchase_discount/i18n/es.po b/purchase_discount/i18n/es.po new file mode 100644 index 00000000000..5311a650ff5 --- /dev/null +++ b/purchase_discount/i18n/es.po @@ -0,0 +1,100 @@ +# Translation of Odoo Server. +# This file contains the translation of the following modules: +# * purchase_discount +# +# Translators: +# OCA Transbot , 2018 +msgid "" +msgstr "" +"Project-Id-Version: Odoo Server 11.0\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2018-02-23 17:50+0000\n" +"PO-Revision-Date: 2023-07-20 18:09+0000\n" +"Last-Translator: Ivorra78 \n" +"Language-Team: Spanish (https://www.transifex.com/oca/teams/23907/es/)\n" +"Language: es\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: purchase_discount +#: model_terms:ir.ui.view,arch_db:purchase_discount.report_purchaseorder_document +msgid "Disc. (%)" +msgstr "Desc. (%)" + +#. module: purchase_discount +#: model:ir.model,name:purchase_discount.model_res_partner +msgid "Contact" +msgstr "Contacto" + +#. module: purchase_discount +#: model:ir.model.fields,field_description:purchase_discount.field_res_partner__default_supplierinfo_discount +#: model:ir.model.fields,field_description:purchase_discount.field_res_users__default_supplierinfo_discount +msgid "Default Supplier Discount (%)" +msgstr "Descuento por defecto del proveedor (%)" + +#. module: purchase_discount +#: model:ir.model.fields,field_description:purchase_discount.field_product_supplierinfo__discount +#: model:ir.model.fields,field_description:purchase_discount.field_purchase_order_line__discount +msgid "Discount (%)" +msgstr "(%) Descuento" + +#. module: purchase_discount +#: model:ir.model.constraint,message:purchase_discount.constraint_purchase_order_line_discount_limit +msgid "Discount must be lower than 100%." +msgstr "El descuento debe ser menor al 100%." + +#. module: purchase_discount +#: model_terms:ir.ui.view,arch_db:purchase_discount.res_partner_form_view +msgid "Discount-related settings are managed on" +msgstr "Los ajustes relacionados con los descuentos se gestionan en" + +#. module: purchase_discount +#: model:ir.model,name:purchase_discount.model_purchase_order +msgid "Purchase Order" +msgstr "Pedido de compra" + +#. module: purchase_discount +#: model:ir.model,name:purchase_discount.model_purchase_order_line +msgid "Purchase Order Line" +msgstr "Línea de pedido de compra" + +#. module: purchase_discount +#: model:ir.model,name:purchase_discount.model_purchase_report +msgid "Purchase Report" +msgstr "Informe de Compras" + +#. module: purchase_discount +#: model:ir.model,name:purchase_discount.model_product_supplierinfo +msgid "Supplier Pricelist" +msgstr "Lista de precios de proveedores" + +#. module: purchase_discount +#: model:ir.model.constraint,message:purchase_discount.constraint_product_supplierinfo_discount_limit +msgid "Supplier discount must be lower than 100%." +msgstr "" + +#. module: purchase_discount +#: model:ir.model.fields,help:purchase_discount.field_res_partner__default_supplierinfo_discount +#: model:ir.model.fields,help:purchase_discount.field_res_users__default_supplierinfo_discount +msgid "" +"This value will be used as the default one, for each new supplierinfo line " +"depending on that supplier." +msgstr "" +"Este valor se utilizará como valor por defecto, para cada nueva línea de " +"información del proveedor que dependa de ese proveedor." + +#. module: purchase_discount +#: model:ir.model.fields,field_description:purchase_discount.field_purchase_report__discount +msgid "Total discount" +msgstr "" + +#. module: purchase_discount +#: model_terms:ir.ui.view,arch_db:purchase_discount.res_partner_form_view +msgid "the parent company" +msgstr "la compañía parental" + +#~ msgid "Stock Move" +#~ msgstr "movimiento de existencias" diff --git a/purchase_discount/i18n/es_MX.po b/purchase_discount/i18n/es_MX.po new file mode 100644 index 00000000000..bc5595e9423 --- /dev/null +++ b/purchase_discount/i18n/es_MX.po @@ -0,0 +1,97 @@ +# Translation of Odoo Server. +# This file contains the translation of the following modules: +# * purchase_discount +# +# Translators: +# OCA Transbot , 2018 +msgid "" +msgstr "" +"Project-Id-Version: Odoo Server 11.0\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2018-02-23 17:50+0000\n" +"PO-Revision-Date: 2018-02-23 17:50+0000\n" +"Last-Translator: OCA Transbot , 2018\n" +"Language-Team: Spanish (Mexico) (https://www.transifex.com/oca/teams/23907/" +"es_MX/)\n" +"Language: es_MX\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" + +#. module: purchase_discount +#: model_terms:ir.ui.view,arch_db:purchase_discount.report_purchaseorder_document +msgid "Disc. (%)" +msgstr "" + +#. module: purchase_discount +#: model:ir.model,name:purchase_discount.model_res_partner +msgid "Contact" +msgstr "" + +#. module: purchase_discount +#: model:ir.model.fields,field_description:purchase_discount.field_res_partner__default_supplierinfo_discount +#: model:ir.model.fields,field_description:purchase_discount.field_res_users__default_supplierinfo_discount +msgid "Default Supplier Discount (%)" +msgstr "" + +#. module: purchase_discount +#: model:ir.model.fields,field_description:purchase_discount.field_product_supplierinfo__discount +#: model:ir.model.fields,field_description:purchase_discount.field_purchase_order_line__discount +msgid "Discount (%)" +msgstr "" + +#. module: purchase_discount +#: model:ir.model.constraint,message:purchase_discount.constraint_purchase_order_line_discount_limit +msgid "Discount must be lower than 100%." +msgstr "" + +#. module: purchase_discount +#: model_terms:ir.ui.view,arch_db:purchase_discount.res_partner_form_view +msgid "Discount-related settings are managed on" +msgstr "" + +#. module: purchase_discount +#: model:ir.model,name:purchase_discount.model_purchase_order +#, fuzzy +msgid "Purchase Order" +msgstr "Línea de orden de compra" + +#. module: purchase_discount +#: model:ir.model,name:purchase_discount.model_purchase_order_line +msgid "Purchase Order Line" +msgstr "Línea de orden de compra" + +#. module: purchase_discount +#: model:ir.model,name:purchase_discount.model_purchase_report +#, fuzzy +msgid "Purchase Report" +msgstr "Línea de orden de compra" + +#. module: purchase_discount +#: model:ir.model,name:purchase_discount.model_product_supplierinfo +msgid "Supplier Pricelist" +msgstr "" + +#. module: purchase_discount +#: model:ir.model.constraint,message:purchase_discount.constraint_product_supplierinfo_discount_limit +msgid "Supplier discount must be lower than 100%." +msgstr "" + +#. module: purchase_discount +#: model:ir.model.fields,help:purchase_discount.field_res_partner__default_supplierinfo_discount +#: model:ir.model.fields,help:purchase_discount.field_res_users__default_supplierinfo_discount +msgid "" +"This value will be used as the default one, for each new supplierinfo line " +"depending on that supplier." +msgstr "" + +#. module: purchase_discount +#: model:ir.model.fields,field_description:purchase_discount.field_purchase_report__discount +msgid "Total discount" +msgstr "" + +#. module: purchase_discount +#: model_terms:ir.ui.view,arch_db:purchase_discount.res_partner_form_view +msgid "the parent company" +msgstr "" diff --git a/purchase_discount/i18n/fr.po b/purchase_discount/i18n/fr.po new file mode 100644 index 00000000000..1222ecdff58 --- /dev/null +++ b/purchase_discount/i18n/fr.po @@ -0,0 +1,107 @@ +# Translation of Odoo Server. +# This file contains the translation of the following modules: +# * purchase_discount +# +# Translators: +# OCA Transbot , 2018 +# Quentin THEURET , 2018 +msgid "" +msgstr "" +"Project-Id-Version: Odoo Server 11.0\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2018-02-23 17:50+0000\n" +"PO-Revision-Date: 2023-11-02 12:36+0000\n" +"Last-Translator: Alexis de Lattre \n" +"Language-Team: French (https://www.transifex.com/oca/teams/23907/fr/)\n" +"Language: fr\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: \n" +"Plural-Forms: nplurals=2; plural=n > 1;\n" +"X-Generator: Weblate 4.17\n" + +#. module: purchase_discount +#: model_terms:ir.ui.view,arch_db:purchase_discount.report_purchaseorder_document +msgid "Disc. (%)" +msgstr "Rem. (%)" + +#. module: purchase_discount +#: model:ir.model,name:purchase_discount.model_res_partner +msgid "Contact" +msgstr "Contact" + +#. module: purchase_discount +#: model:ir.model.fields,field_description:purchase_discount.field_res_partner__default_supplierinfo_discount +#: model:ir.model.fields,field_description:purchase_discount.field_res_users__default_supplierinfo_discount +msgid "Default Supplier Discount (%)" +msgstr "Remise fournisseur par défaut (%)" + +#. module: purchase_discount +#: model:ir.model.fields,field_description:purchase_discount.field_product_supplierinfo__discount +#: model:ir.model.fields,field_description:purchase_discount.field_purchase_order_line__discount +msgid "Discount (%)" +msgstr "Remise (%)" + +#. module: purchase_discount +#: model:ir.model.constraint,message:purchase_discount.constraint_purchase_order_line_discount_limit +msgid "Discount must be lower than 100%." +msgstr "La remise doit être inférieure à 100%." + +#. module: purchase_discount +#: model_terms:ir.ui.view,arch_db:purchase_discount.res_partner_form_view +msgid "Discount-related settings are managed on" +msgstr "La configuration des remises se fait sur" + +#. module: purchase_discount +#: model:ir.model,name:purchase_discount.model_purchase_order +msgid "Purchase Order" +msgstr "Commandes fournisseur" + +#. module: purchase_discount +#: model:ir.model,name:purchase_discount.model_purchase_order_line +msgid "Purchase Order Line" +msgstr "Ligne de commande fournisseur" + +#. module: purchase_discount +#: model:ir.model,name:purchase_discount.model_purchase_report +msgid "Purchase Report" +msgstr "Rapport des commandes fournisseur" + +#. module: purchase_discount +#: model:ir.model,name:purchase_discount.model_product_supplierinfo +msgid "Supplier Pricelist" +msgstr "Liste de prix fournisseur" + +#. module: purchase_discount +#: model:ir.model.constraint,message:purchase_discount.constraint_product_supplierinfo_discount_limit +msgid "Supplier discount must be lower than 100%." +msgstr "" + +#. module: purchase_discount +#: model:ir.model.fields,help:purchase_discount.field_res_partner__default_supplierinfo_discount +#: model:ir.model.fields,help:purchase_discount.field_res_users__default_supplierinfo_discount +msgid "" +"This value will be used as the default one, for each new supplierinfo line " +"depending on that supplier." +msgstr "" +"Cette valeur sera utilisée comme valeur par défaut pour chaque nouvelle " +"information fournisseur de ce fournisseur." + +#. module: purchase_discount +#: model:ir.model.fields,field_description:purchase_discount.field_purchase_report__discount +msgid "Total discount" +msgstr "" + +#. module: purchase_discount +#: model_terms:ir.ui.view,arch_db:purchase_discount.res_partner_form_view +msgid "the parent company" +msgstr "la société parente" + +#~ msgid "Stock Move" +#~ msgstr "Mouvement de stock" + +#~ msgid "Stock Rule" +#~ msgstr "Règle de stock" + +#~ msgid "Invoice" +#~ msgstr "Facture" diff --git a/purchase_discount/i18n/fr_CH.po b/purchase_discount/i18n/fr_CH.po new file mode 100644 index 00000000000..24ccb3e8a09 --- /dev/null +++ b/purchase_discount/i18n/fr_CH.po @@ -0,0 +1,99 @@ +# Translation of Odoo Server. +# This file contains the translation of the following modules: +# * purchase_discount +# +# Translators: +# leemannd , 2016 +msgid "" +msgstr "" +"Project-Id-Version: Odoo Server 9.0c\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2016-11-29 16:07+0000\n" +"PO-Revision-Date: 2016-11-29 16:07+0000\n" +"Last-Translator: leemannd , 2016\n" +"Language-Team: French (Switzerland) (https://www.transifex.com/oca/" +"teams/23907/fr_CH/)\n" +"Language: fr_CH\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" + +#. module: purchase_discount +#: model_terms:ir.ui.view,arch_db:purchase_discount.report_purchaseorder_document +msgid "Disc. (%)" +msgstr "" + +#. module: purchase_discount +#: model:ir.model,name:purchase_discount.model_res_partner +msgid "Contact" +msgstr "" + +#. module: purchase_discount +#: model:ir.model.fields,field_description:purchase_discount.field_res_partner__default_supplierinfo_discount +#: model:ir.model.fields,field_description:purchase_discount.field_res_users__default_supplierinfo_discount +msgid "Default Supplier Discount (%)" +msgstr "" + +#. module: purchase_discount +#: model:ir.model.fields,field_description:purchase_discount.field_product_supplierinfo__discount +#: model:ir.model.fields,field_description:purchase_discount.field_purchase_order_line__discount +msgid "Discount (%)" +msgstr "" + +#. module: purchase_discount +#: model:ir.model.constraint,message:purchase_discount.constraint_purchase_order_line_discount_limit +msgid "Discount must be lower than 100%." +msgstr "" + +#. module: purchase_discount +#: model_terms:ir.ui.view,arch_db:purchase_discount.res_partner_form_view +msgid "Discount-related settings are managed on" +msgstr "" + +#. module: purchase_discount +#: model:ir.model,name:purchase_discount.model_purchase_order +msgid "Purchase Order" +msgstr "" + +#. module: purchase_discount +#: model:ir.model,name:purchase_discount.model_purchase_order_line +msgid "Purchase Order Line" +msgstr "" + +#. module: purchase_discount +#: model:ir.model,name:purchase_discount.model_purchase_report +msgid "Purchase Report" +msgstr "" + +#. module: purchase_discount +#: model:ir.model,name:purchase_discount.model_product_supplierinfo +msgid "Supplier Pricelist" +msgstr "" + +#. module: purchase_discount +#: model:ir.model.constraint,message:purchase_discount.constraint_product_supplierinfo_discount_limit +msgid "Supplier discount must be lower than 100%." +msgstr "" + +#. module: purchase_discount +#: model:ir.model.fields,help:purchase_discount.field_res_partner__default_supplierinfo_discount +#: model:ir.model.fields,help:purchase_discount.field_res_users__default_supplierinfo_discount +msgid "" +"This value will be used as the default one, for each new supplierinfo line " +"depending on that supplier." +msgstr "" + +#. module: purchase_discount +#: model:ir.model.fields,field_description:purchase_discount.field_purchase_report__discount +msgid "Total discount" +msgstr "" + +#. module: purchase_discount +#: model_terms:ir.ui.view,arch_db:purchase_discount.res_partner_form_view +msgid "the parent company" +msgstr "" + +#, fuzzy +#~ msgid "Invoice" +#~ msgstr "Ligne de facture" diff --git a/purchase_discount/i18n/fr_FR.po b/purchase_discount/i18n/fr_FR.po new file mode 100644 index 00000000000..82b799eac53 --- /dev/null +++ b/purchase_discount/i18n/fr_FR.po @@ -0,0 +1,97 @@ +# Translation of Odoo Server. +# This file contains the translation of the following modules: +# * purchase_discount +# +msgid "" +msgstr "" +"Project-Id-Version: Odoo Server 15.0\n" +"Report-Msgid-Bugs-To: \n" +"PO-Revision-Date: 2021-04-11 17:46+0000\n" +"Last-Translator: Yves Le Doeuff \n" +"Language-Team: none\n" +"Language: fr_FR\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: \n" +"Plural-Forms: nplurals=2; plural=n > 1;\n" +"X-Generator: Weblate 4.3.2\n" + +#. module: purchase_discount +#: model_terms:ir.ui.view,arch_db:purchase_discount.report_purchaseorder_document +msgid "Disc. (%)" +msgstr "Remise (%)" + +#. module: purchase_discount +#: model:ir.model,name:purchase_discount.model_res_partner +msgid "Contact" +msgstr "Contact" + +#. module: purchase_discount +#: model:ir.model.fields,field_description:purchase_discount.field_res_partner__default_supplierinfo_discount +#: model:ir.model.fields,field_description:purchase_discount.field_res_users__default_supplierinfo_discount +msgid "Default Supplier Discount (%)" +msgstr "Remise fournisseur par défaut (%)" + +#. module: purchase_discount +#: model:ir.model.fields,field_description:purchase_discount.field_product_supplierinfo__discount +#: model:ir.model.fields,field_description:purchase_discount.field_purchase_order_line__discount +msgid "Discount (%)" +msgstr "Remise (%)" + +#. module: purchase_discount +#: model:ir.model.constraint,message:purchase_discount.constraint_purchase_order_line_discount_limit +msgid "Discount must be lower than 100%." +msgstr "La remise doit être inférieure à 100%." + +#. module: purchase_discount +#: model_terms:ir.ui.view,arch_db:purchase_discount.res_partner_form_view +msgid "Discount-related settings are managed on" +msgstr "Paramètres des remises sont gérés sur" + +#. module: purchase_discount +#: model:ir.model,name:purchase_discount.model_purchase_order +msgid "Purchase Order" +msgstr "Commandes d'achat" + +#. module: purchase_discount +#: model:ir.model,name:purchase_discount.model_purchase_order_line +msgid "Purchase Order Line" +msgstr "Ligne de commande d'achat" + +#. module: purchase_discount +#: model:ir.model,name:purchase_discount.model_purchase_report +msgid "Purchase Report" +msgstr "Rapport des commandes" + +#. module: purchase_discount +#: model:ir.model,name:purchase_discount.model_product_supplierinfo +msgid "Supplier Pricelist" +msgstr "Liste de prix fournisseur" + +#. module: purchase_discount +#: model:ir.model.constraint,message:purchase_discount.constraint_product_supplierinfo_discount_limit +msgid "Supplier discount must be lower than 100%." +msgstr "" + +#. module: purchase_discount +#: model:ir.model.fields,help:purchase_discount.field_res_partner__default_supplierinfo_discount +#: model:ir.model.fields,help:purchase_discount.field_res_users__default_supplierinfo_discount +msgid "" +"This value will be used as the default one, for each new supplierinfo line " +"depending on that supplier." +msgstr "" +"Cette valeur sera utilisée comme valeur par défaut pour chaque nouvelle " +"information fournisseur de ce fournisseur." + +#. module: purchase_discount +#: model:ir.model.fields,field_description:purchase_discount.field_purchase_report__discount +msgid "Total discount" +msgstr "" + +#. module: purchase_discount +#: model_terms:ir.ui.view,arch_db:purchase_discount.res_partner_form_view +msgid "the parent company" +msgstr "Société parente" + +#~ msgid "Stock Move" +#~ msgstr "Mouvement de stock" diff --git a/purchase_discount/i18n/hr.po b/purchase_discount/i18n/hr.po new file mode 100644 index 00000000000..dc9224c304c --- /dev/null +++ b/purchase_discount/i18n/hr.po @@ -0,0 +1,100 @@ +# Translation of Odoo Server. +# This file contains the translation of the following modules: +# * purchase_discount +# +# Translators: +# Bole , 2016 +msgid "" +msgstr "" +"Project-Id-Version: Odoo Server 9.0c\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2016-11-25 03:39+0000\n" +"PO-Revision-Date: 2025-02-24 17:06+0000\n" +"Last-Translator: uvid-gordana \n" +"Language-Team: Croatian (https://www.transifex.com/oca/teams/23907/hr/)\n" +"Language: hr\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: \n" +"Plural-Forms: nplurals=3; plural=n%10==1 && n%100!=11 ? 0 : n%10>=2 && " +"n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2;\n" +"X-Generator: Weblate 5.6.2\n" + +#. module: purchase_discount +#: model_terms:ir.ui.view,arch_db:purchase_discount.report_purchaseorder_document +msgid "Disc. (%)" +msgstr "" + +#. module: purchase_discount +#: model:ir.model,name:purchase_discount.model_res_partner +msgid "Contact" +msgstr "Kontakt" + +#. module: purchase_discount +#: model:ir.model.fields,field_description:purchase_discount.field_res_partner__default_supplierinfo_discount +#: model:ir.model.fields,field_description:purchase_discount.field_res_users__default_supplierinfo_discount +msgid "Default Supplier Discount (%)" +msgstr "" + +#. module: purchase_discount +#: model:ir.model.fields,field_description:purchase_discount.field_product_supplierinfo__discount +#: model:ir.model.fields,field_description:purchase_discount.field_purchase_order_line__discount +msgid "Discount (%)" +msgstr "Popust (%)" + +#. module: purchase_discount +#: model:ir.model.constraint,message:purchase_discount.constraint_purchase_order_line_discount_limit +msgid "Discount must be lower than 100%." +msgstr "" + +#. module: purchase_discount +#: model_terms:ir.ui.view,arch_db:purchase_discount.res_partner_form_view +msgid "Discount-related settings are managed on" +msgstr "" + +#. module: purchase_discount +#: model:ir.model,name:purchase_discount.model_purchase_order +msgid "Purchase Order" +msgstr "" + +#. module: purchase_discount +#: model:ir.model,name:purchase_discount.model_purchase_order_line +msgid "Purchase Order Line" +msgstr "" + +#. module: purchase_discount +#: model:ir.model,name:purchase_discount.model_purchase_report +msgid "Purchase Report" +msgstr "" + +#. module: purchase_discount +#: model:ir.model,name:purchase_discount.model_product_supplierinfo +msgid "Supplier Pricelist" +msgstr "" + +#. module: purchase_discount +#: model:ir.model.constraint,message:purchase_discount.constraint_product_supplierinfo_discount_limit +msgid "Supplier discount must be lower than 100%." +msgstr "" + +#. module: purchase_discount +#: model:ir.model.fields,help:purchase_discount.field_res_partner__default_supplierinfo_discount +#: model:ir.model.fields,help:purchase_discount.field_res_users__default_supplierinfo_discount +msgid "" +"This value will be used as the default one, for each new supplierinfo line " +"depending on that supplier." +msgstr "" + +#. module: purchase_discount +#: model:ir.model.fields,field_description:purchase_discount.field_purchase_report__discount +msgid "Total discount" +msgstr "" + +#. module: purchase_discount +#: model_terms:ir.ui.view,arch_db:purchase_discount.res_partner_form_view +msgid "the parent company" +msgstr "" + +#, fuzzy +#~ msgid "Invoice" +#~ msgstr "Stavka računa" diff --git a/purchase_discount/i18n/it.po b/purchase_discount/i18n/it.po new file mode 100644 index 00000000000..906b1e3c9b8 --- /dev/null +++ b/purchase_discount/i18n/it.po @@ -0,0 +1,103 @@ +# Translation of Odoo Server. +# This file contains the translation of the following modules: +# * purchase_discount +# +# Translators: +# OCA Transbot , 2018 +msgid "" +msgstr "" +"Project-Id-Version: Odoo Server 11.0\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2018-02-23 17:50+0000\n" +"PO-Revision-Date: 2025-06-23 11:25+0000\n" +"Last-Translator: mymage \n" +"Language-Team: Italian (https://www.transifex.com/oca/teams/23907/it/)\n" +"Language: it\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: \n" +"Plural-Forms: nplurals=2; plural=n != 1;\n" +"X-Generator: Weblate 5.10.4\n" + +#. module: purchase_discount +#: model_terms:ir.ui.view,arch_db:purchase_discount.report_purchaseorder_document +msgid "Disc. (%)" +msgstr "Sc. (%)" + +#. module: purchase_discount +#: model:ir.model,name:purchase_discount.model_res_partner +msgid "Contact" +msgstr "Contatto" + +#. module: purchase_discount +#: model:ir.model.fields,field_description:purchase_discount.field_res_partner__default_supplierinfo_discount +#: model:ir.model.fields,field_description:purchase_discount.field_res_users__default_supplierinfo_discount +msgid "Default Supplier Discount (%)" +msgstr "Sconto Default Fornitore (%)" + +#. module: purchase_discount +#: model:ir.model.fields,field_description:purchase_discount.field_product_supplierinfo__discount +#: model:ir.model.fields,field_description:purchase_discount.field_purchase_order_line__discount +msgid "Discount (%)" +msgstr "Sconto (%)" + +#. module: purchase_discount +#: model:ir.model.constraint,message:purchase_discount.constraint_purchase_order_line_discount_limit +msgid "Discount must be lower than 100%." +msgstr "Lo sconto deve essere minore del 100%." + +#. module: purchase_discount +#: model_terms:ir.ui.view,arch_db:purchase_discount.res_partner_form_view +msgid "Discount-related settings are managed on" +msgstr "Le opzioni sugli sconti sono gestite su" + +#. module: purchase_discount +#: model:ir.model,name:purchase_discount.model_purchase_order +msgid "Purchase Order" +msgstr "Ordine di acquisto" + +#. module: purchase_discount +#: model:ir.model,name:purchase_discount.model_purchase_order_line +msgid "Purchase Order Line" +msgstr "Riga ordine di acquisto" + +#. module: purchase_discount +#: model:ir.model,name:purchase_discount.model_purchase_report +msgid "Purchase Report" +msgstr "Resoconto di acquisto" + +#. module: purchase_discount +#: model:ir.model,name:purchase_discount.model_product_supplierinfo +msgid "Supplier Pricelist" +msgstr "Listino prezzi fornitore" + +#. module: purchase_discount +#: model:ir.model.constraint,message:purchase_discount.constraint_product_supplierinfo_discount_limit +msgid "Supplier discount must be lower than 100%." +msgstr "Lo sconto fornitore deve essere inferiore al 100%." + +#. module: purchase_discount +#: model:ir.model.fields,help:purchase_discount.field_res_partner__default_supplierinfo_discount +#: model:ir.model.fields,help:purchase_discount.field_res_users__default_supplierinfo_discount +msgid "" +"This value will be used as the default one, for each new supplierinfo line " +"depending on that supplier." +msgstr "" +"Questo valore sarà usato come default, per ogni nuova riga fornitore " +"dipendente da quel fornitore." + +#. module: purchase_discount +#: model:ir.model.fields,field_description:purchase_discount.field_purchase_report__discount +msgid "Total discount" +msgstr "Sconto totale" + +#. module: purchase_discount +#: model_terms:ir.ui.view,arch_db:purchase_discount.res_partner_form_view +msgid "the parent company" +msgstr "l'azienda madre" + +#~ msgid "Stock Move" +#~ msgstr "Movimento di magazzino" + +#~ msgid "Stock Rule" +#~ msgstr "Regola Stock" diff --git a/purchase_discount/i18n/nl.po b/purchase_discount/i18n/nl.po new file mode 100644 index 00000000000..7ab4e913ad8 --- /dev/null +++ b/purchase_discount/i18n/nl.po @@ -0,0 +1,90 @@ +# Translation of Odoo Server. +# This file contains the translation of the following modules: +# * purchase_discount +# +msgid "" +msgstr "" +"Project-Id-Version: Odoo Server 11.0\n" +"Report-Msgid-Bugs-To: \n" +"Last-Translator: Automatically generated\n" +"Language-Team: none\n" +"Language: nl\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: \n" +"Plural-Forms: nplurals=2; plural=n != 1;\n" + +#. module: purchase_discount +#: model_terms:ir.ui.view,arch_db:purchase_discount.report_purchaseorder_document +msgid "Disc. (%)" +msgstr "" + +#. module: purchase_discount +#: model:ir.model,name:purchase_discount.model_res_partner +msgid "Contact" +msgstr "" + +#. module: purchase_discount +#: model:ir.model.fields,field_description:purchase_discount.field_res_partner__default_supplierinfo_discount +#: model:ir.model.fields,field_description:purchase_discount.field_res_users__default_supplierinfo_discount +msgid "Default Supplier Discount (%)" +msgstr "" + +#. module: purchase_discount +#: model:ir.model.fields,field_description:purchase_discount.field_product_supplierinfo__discount +#: model:ir.model.fields,field_description:purchase_discount.field_purchase_order_line__discount +msgid "Discount (%)" +msgstr "" + +#. module: purchase_discount +#: model:ir.model.constraint,message:purchase_discount.constraint_purchase_order_line_discount_limit +msgid "Discount must be lower than 100%." +msgstr "" + +#. module: purchase_discount +#: model_terms:ir.ui.view,arch_db:purchase_discount.res_partner_form_view +msgid "Discount-related settings are managed on" +msgstr "" + +#. module: purchase_discount +#: model:ir.model,name:purchase_discount.model_purchase_order +msgid "Purchase Order" +msgstr "" + +#. module: purchase_discount +#: model:ir.model,name:purchase_discount.model_purchase_order_line +msgid "Purchase Order Line" +msgstr "" + +#. module: purchase_discount +#: model:ir.model,name:purchase_discount.model_purchase_report +msgid "Purchase Report" +msgstr "" + +#. module: purchase_discount +#: model:ir.model,name:purchase_discount.model_product_supplierinfo +msgid "Supplier Pricelist" +msgstr "" + +#. module: purchase_discount +#: model:ir.model.constraint,message:purchase_discount.constraint_product_supplierinfo_discount_limit +msgid "Supplier discount must be lower than 100%." +msgstr "" + +#. module: purchase_discount +#: model:ir.model.fields,help:purchase_discount.field_res_partner__default_supplierinfo_discount +#: model:ir.model.fields,help:purchase_discount.field_res_users__default_supplierinfo_discount +msgid "" +"This value will be used as the default one, for each new supplierinfo line " +"depending on that supplier." +msgstr "" + +#. module: purchase_discount +#: model:ir.model.fields,field_description:purchase_discount.field_purchase_report__discount +msgid "Total discount" +msgstr "" + +#. module: purchase_discount +#: model_terms:ir.ui.view,arch_db:purchase_discount.res_partner_form_view +msgid "the parent company" +msgstr "" diff --git a/purchase_discount/i18n/pt_BR.po b/purchase_discount/i18n/pt_BR.po new file mode 100644 index 00000000000..393ab8bbc7b --- /dev/null +++ b/purchase_discount/i18n/pt_BR.po @@ -0,0 +1,102 @@ +# Translation of Odoo Server. +# This file contains the translation of the following modules: +# * purchase_discount +# +# Translators: +# OCA Transbot , 2018 +msgid "" +msgstr "" +"Project-Id-Version: Odoo Server 11.0\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2018-02-23 17:50+0000\n" +"PO-Revision-Date: 2024-05-29 18:36+0000\n" +"Last-Translator: Rodrigo Macedo \n" +"Language-Team: Portuguese (Brazil) (https://www.transifex.com/oca/" +"teams/23907/pt_BR/)\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: purchase_discount +#: model_terms:ir.ui.view,arch_db:purchase_discount.report_purchaseorder_document +msgid "Disc. (%)" +msgstr "Desc. (%)" + +#. module: purchase_discount +#: model:ir.model,name:purchase_discount.model_res_partner +msgid "Contact" +msgstr "Contato" + +#. module: purchase_discount +#: model:ir.model.fields,field_description:purchase_discount.field_res_partner__default_supplierinfo_discount +#: model:ir.model.fields,field_description:purchase_discount.field_res_users__default_supplierinfo_discount +msgid "Default Supplier Discount (%)" +msgstr "Desconto padrão do fornecedor (%)" + +#. module: purchase_discount +#: model:ir.model.fields,field_description:purchase_discount.field_product_supplierinfo__discount +#: model:ir.model.fields,field_description:purchase_discount.field_purchase_order_line__discount +msgid "Discount (%)" +msgstr "Desconto (%)" + +#. module: purchase_discount +#: model:ir.model.constraint,message:purchase_discount.constraint_purchase_order_line_discount_limit +msgid "Discount must be lower than 100%." +msgstr "O desconto deve ser inferior a 100%." + +#. module: purchase_discount +#: model_terms:ir.ui.view,arch_db:purchase_discount.res_partner_form_view +msgid "Discount-related settings are managed on" +msgstr "As configurações relacionadas a descontos são gerenciadas em" + +#. module: purchase_discount +#: model:ir.model,name:purchase_discount.model_purchase_order +msgid "Purchase Order" +msgstr "Pedido de Compra" + +#. module: purchase_discount +#: model:ir.model,name:purchase_discount.model_purchase_order_line +msgid "Purchase Order Line" +msgstr "Linha do Pedido de Compra" + +#. module: purchase_discount +#: model:ir.model,name:purchase_discount.model_purchase_report +msgid "Purchase Report" +msgstr "Relatório de Compra" + +#. module: purchase_discount +#: model:ir.model,name:purchase_discount.model_product_supplierinfo +msgid "Supplier Pricelist" +msgstr "Lista de preços do fornecedor" + +#. module: purchase_discount +#: model:ir.model.constraint,message:purchase_discount.constraint_product_supplierinfo_discount_limit +msgid "Supplier discount must be lower than 100%." +msgstr "" + +#. module: purchase_discount +#: model:ir.model.fields,help:purchase_discount.field_res_partner__default_supplierinfo_discount +#: model:ir.model.fields,help:purchase_discount.field_res_users__default_supplierinfo_discount +msgid "" +"This value will be used as the default one, for each new supplierinfo line " +"depending on that supplier." +msgstr "" +"Este valor será usado como padrão, para cada nova linha de informações do " +"fornecedor dependendo desse fornecedor." + +#. module: purchase_discount +#: model:ir.model.fields,field_description:purchase_discount.field_purchase_report__discount +msgid "Total discount" +msgstr "" + +#. module: purchase_discount +#: model_terms:ir.ui.view,arch_db:purchase_discount.res_partner_form_view +msgid "the parent company" +msgstr "A empresa matriz" + +#~ msgid "Stock Move" +#~ msgstr "Movimentação de estoque" diff --git a/purchase_discount/i18n/pt_PT.po b/purchase_discount/i18n/pt_PT.po new file mode 100644 index 00000000000..e3c86a18073 --- /dev/null +++ b/purchase_discount/i18n/pt_PT.po @@ -0,0 +1,99 @@ +# Translation of Odoo Server. +# This file contains the translation of the following modules: +# * purchase_discount +# +# Translators: +# Pedro Castro Silva , 2016 +msgid "" +msgstr "" +"Project-Id-Version: Odoo Server 9.0c\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2016-12-03 04:07+0000\n" +"PO-Revision-Date: 2016-12-03 04:07+0000\n" +"Last-Translator: Pedro Castro Silva , 2016\n" +"Language-Team: Portuguese (Portugal) (https://www.transifex.com/oca/" +"teams/23907/pt_PT/)\n" +"Language: pt_PT\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" + +#. module: purchase_discount +#: model_terms:ir.ui.view,arch_db:purchase_discount.report_purchaseorder_document +msgid "Disc. (%)" +msgstr "" + +#. module: purchase_discount +#: model:ir.model,name:purchase_discount.model_res_partner +msgid "Contact" +msgstr "" + +#. module: purchase_discount +#: model:ir.model.fields,field_description:purchase_discount.field_res_partner__default_supplierinfo_discount +#: model:ir.model.fields,field_description:purchase_discount.field_res_users__default_supplierinfo_discount +msgid "Default Supplier Discount (%)" +msgstr "" + +#. module: purchase_discount +#: model:ir.model.fields,field_description:purchase_discount.field_product_supplierinfo__discount +#: model:ir.model.fields,field_description:purchase_discount.field_purchase_order_line__discount +msgid "Discount (%)" +msgstr "" + +#. module: purchase_discount +#: model:ir.model.constraint,message:purchase_discount.constraint_purchase_order_line_discount_limit +msgid "Discount must be lower than 100%." +msgstr "" + +#. module: purchase_discount +#: model_terms:ir.ui.view,arch_db:purchase_discount.res_partner_form_view +msgid "Discount-related settings are managed on" +msgstr "" + +#. module: purchase_discount +#: model:ir.model,name:purchase_discount.model_purchase_order +msgid "Purchase Order" +msgstr "" + +#. module: purchase_discount +#: model:ir.model,name:purchase_discount.model_purchase_order_line +msgid "Purchase Order Line" +msgstr "" + +#. module: purchase_discount +#: model:ir.model,name:purchase_discount.model_purchase_report +msgid "Purchase Report" +msgstr "" + +#. module: purchase_discount +#: model:ir.model,name:purchase_discount.model_product_supplierinfo +msgid "Supplier Pricelist" +msgstr "" + +#. module: purchase_discount +#: model:ir.model.constraint,message:purchase_discount.constraint_product_supplierinfo_discount_limit +msgid "Supplier discount must be lower than 100%." +msgstr "" + +#. module: purchase_discount +#: model:ir.model.fields,help:purchase_discount.field_res_partner__default_supplierinfo_discount +#: model:ir.model.fields,help:purchase_discount.field_res_users__default_supplierinfo_discount +msgid "" +"This value will be used as the default one, for each new supplierinfo line " +"depending on that supplier." +msgstr "" + +#. module: purchase_discount +#: model:ir.model.fields,field_description:purchase_discount.field_purchase_report__discount +msgid "Total discount" +msgstr "" + +#. module: purchase_discount +#: model_terms:ir.ui.view,arch_db:purchase_discount.res_partner_form_view +msgid "the parent company" +msgstr "" + +#, fuzzy +#~ msgid "Invoice" +#~ msgstr "Linha da Fatura" diff --git a/purchase_discount/i18n/purchase_discount.pot b/purchase_discount/i18n/purchase_discount.pot new file mode 100644 index 00000000000..f579040dc70 --- /dev/null +++ b/purchase_discount/i18n/purchase_discount.pot @@ -0,0 +1,89 @@ +# Translation of Odoo Server. +# This file contains the translation of the following modules: +# * purchase_discount +# +msgid "" +msgstr "" +"Project-Id-Version: Odoo Server 16.0\n" +"Report-Msgid-Bugs-To: \n" +"Last-Translator: \n" +"Language-Team: \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: \n" +"Plural-Forms: \n" + +#. module: purchase_discount +#: model_terms:ir.ui.view,arch_db:purchase_discount.report_purchaseorder_document +msgid "Disc. (%)" +msgstr "" + +#. module: purchase_discount +#: model:ir.model,name:purchase_discount.model_res_partner +msgid "Contact" +msgstr "" + +#. module: purchase_discount +#: model:ir.model.fields,field_description:purchase_discount.field_res_partner__default_supplierinfo_discount +#: model:ir.model.fields,field_description:purchase_discount.field_res_users__default_supplierinfo_discount +msgid "Default Supplier Discount (%)" +msgstr "" + +#. module: purchase_discount +#: model:ir.model.fields,field_description:purchase_discount.field_product_supplierinfo__discount +#: model:ir.model.fields,field_description:purchase_discount.field_purchase_order_line__discount +msgid "Discount (%)" +msgstr "" + +#. module: purchase_discount +#: model:ir.model.constraint,message:purchase_discount.constraint_purchase_order_line_discount_limit +msgid "Discount must be lower than 100%." +msgstr "" + +#. module: purchase_discount +#: model_terms:ir.ui.view,arch_db:purchase_discount.res_partner_form_view +msgid "Discount-related settings are managed on" +msgstr "" + +#. module: purchase_discount +#: model:ir.model,name:purchase_discount.model_purchase_order +msgid "Purchase Order" +msgstr "" + +#. module: purchase_discount +#: model:ir.model,name:purchase_discount.model_purchase_order_line +msgid "Purchase Order Line" +msgstr "" + +#. module: purchase_discount +#: model:ir.model,name:purchase_discount.model_purchase_report +msgid "Purchase Report" +msgstr "" + +#. module: purchase_discount +#: model:ir.model,name:purchase_discount.model_product_supplierinfo +msgid "Supplier Pricelist" +msgstr "" + +#. module: purchase_discount +#: model:ir.model.constraint,message:purchase_discount.constraint_product_supplierinfo_discount_limit +msgid "Supplier discount must be lower than 100%." +msgstr "" + +#. module: purchase_discount +#: model:ir.model.fields,help:purchase_discount.field_res_partner__default_supplierinfo_discount +#: model:ir.model.fields,help:purchase_discount.field_res_users__default_supplierinfo_discount +msgid "" +"This value will be used as the default one, for each new supplierinfo line " +"depending on that supplier." +msgstr "" + +#. module: purchase_discount +#: model:ir.model.fields,field_description:purchase_discount.field_purchase_report__discount +msgid "Total discount" +msgstr "" + +#. module: purchase_discount +#: model_terms:ir.ui.view,arch_db:purchase_discount.res_partner_form_view +msgid "the parent company" +msgstr "" diff --git a/purchase_discount/i18n/sl.po b/purchase_discount/i18n/sl.po new file mode 100644 index 00000000000..e95863ac13c --- /dev/null +++ b/purchase_discount/i18n/sl.po @@ -0,0 +1,97 @@ +# Translation of Odoo Server. +# This file contains the translation of the following modules: +# * purchase_discount +# +# Translators: +# OCA Transbot , 2016 +msgid "" +msgstr "" +"Project-Id-Version: Odoo Server 9.0c\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2016-11-25 03:39+0000\n" +"PO-Revision-Date: 2016-11-25 03:39+0000\n" +"Last-Translator: OCA Transbot , 2016\n" +"Language-Team: Slovenian (https://www.transifex.com/oca/teams/23907/sl/)\n" +"Language: sl\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: \n" +"Plural-Forms: nplurals=4; plural=(n%100==1 ? 0 : n%100==2 ? 1 : n%100==3 || " +"n%100==4 ? 2 : 3);\n" + +#. module: purchase_discount +#: model_terms:ir.ui.view,arch_db:purchase_discount.report_purchaseorder_document +msgid "Disc. (%)" +msgstr "" + +#. module: purchase_discount +#: model:ir.model,name:purchase_discount.model_res_partner +msgid "Contact" +msgstr "" + +#. module: purchase_discount +#: model:ir.model.fields,field_description:purchase_discount.field_res_partner__default_supplierinfo_discount +#: model:ir.model.fields,field_description:purchase_discount.field_res_users__default_supplierinfo_discount +msgid "Default Supplier Discount (%)" +msgstr "" + +#. module: purchase_discount +#: model:ir.model.fields,field_description:purchase_discount.field_product_supplierinfo__discount +#: model:ir.model.fields,field_description:purchase_discount.field_purchase_order_line__discount +msgid "Discount (%)" +msgstr "" + +#. module: purchase_discount +#: model:ir.model.constraint,message:purchase_discount.constraint_purchase_order_line_discount_limit +msgid "Discount must be lower than 100%." +msgstr "" + +#. module: purchase_discount +#: model_terms:ir.ui.view,arch_db:purchase_discount.res_partner_form_view +msgid "Discount-related settings are managed on" +msgstr "" + +#. module: purchase_discount +#: model:ir.model,name:purchase_discount.model_purchase_order +#, fuzzy +msgid "Purchase Order" +msgstr "Postavka nabavnega naloga" + +#. module: purchase_discount +#: model:ir.model,name:purchase_discount.model_purchase_order_line +msgid "Purchase Order Line" +msgstr "Postavka nabavnega naloga" + +#. module: purchase_discount +#: model:ir.model,name:purchase_discount.model_purchase_report +#, fuzzy +msgid "Purchase Report" +msgstr "Postavka nabavnega naloga" + +#. module: purchase_discount +#: model:ir.model,name:purchase_discount.model_product_supplierinfo +msgid "Supplier Pricelist" +msgstr "" + +#. module: purchase_discount +#: model:ir.model.constraint,message:purchase_discount.constraint_product_supplierinfo_discount_limit +msgid "Supplier discount must be lower than 100%." +msgstr "" + +#. module: purchase_discount +#: model:ir.model.fields,help:purchase_discount.field_res_partner__default_supplierinfo_discount +#: model:ir.model.fields,help:purchase_discount.field_res_users__default_supplierinfo_discount +msgid "" +"This value will be used as the default one, for each new supplierinfo line " +"depending on that supplier." +msgstr "" + +#. module: purchase_discount +#: model:ir.model.fields,field_description:purchase_discount.field_purchase_report__discount +msgid "Total discount" +msgstr "" + +#. module: purchase_discount +#: model_terms:ir.ui.view,arch_db:purchase_discount.res_partner_form_view +msgid "the parent company" +msgstr "" diff --git a/purchase_discount/i18n/tr.po b/purchase_discount/i18n/tr.po new file mode 100644 index 00000000000..82992304277 --- /dev/null +++ b/purchase_discount/i18n/tr.po @@ -0,0 +1,94 @@ +# Translation of Odoo Server. +# This file contains the translation of the following modules: +# * purchase_discount +# +msgid "" +msgstr "" +"Project-Id-Version: Odoo Server 16.0\n" +"Report-Msgid-Bugs-To: \n" +"PO-Revision-Date: 2025-04-15 10:24+0000\n" +"Last-Translator: Betül Öğmen \n" +"Language-Team: none\n" +"Language: tr\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: \n" +"Plural-Forms: nplurals=2; plural=n != 1;\n" +"X-Generator: Weblate 5.10.4\n" + +#. module: purchase_discount +#: model_terms:ir.ui.view,arch_db:purchase_discount.report_purchaseorder_document +msgid "Disc. (%)" +msgstr "İnd. (%)" + +#. module: purchase_discount +#: model:ir.model,name:purchase_discount.model_res_partner +msgid "Contact" +msgstr "Kontak" + +#. module: purchase_discount +#: model:ir.model.fields,field_description:purchase_discount.field_res_partner__default_supplierinfo_discount +#: model:ir.model.fields,field_description:purchase_discount.field_res_users__default_supplierinfo_discount +msgid "Default Supplier Discount (%)" +msgstr "Varsayılan Tedarikçi İndirimi (%)" + +#. module: purchase_discount +#: model:ir.model.fields,field_description:purchase_discount.field_product_supplierinfo__discount +#: model:ir.model.fields,field_description:purchase_discount.field_purchase_order_line__discount +msgid "Discount (%)" +msgstr "İndirim (%)" + +#. module: purchase_discount +#: model:ir.model.constraint,message:purchase_discount.constraint_purchase_order_line_discount_limit +msgid "Discount must be lower than 100%." +msgstr "İndirim %100'den düşük olmalıdır." + +#. module: purchase_discount +#: model_terms:ir.ui.view,arch_db:purchase_discount.res_partner_form_view +msgid "Discount-related settings are managed on" +msgstr "İndirimle ilgili ayarlar bundan yönetilir" + +#. module: purchase_discount +#: model:ir.model,name:purchase_discount.model_purchase_order +msgid "Purchase Order" +msgstr "Satın Alma Siparişi" + +#. module: purchase_discount +#: model:ir.model,name:purchase_discount.model_purchase_order_line +msgid "Purchase Order Line" +msgstr "Satın Alma Sipariş Satırı" + +#. module: purchase_discount +#: model:ir.model,name:purchase_discount.model_purchase_report +msgid "Purchase Report" +msgstr "Satın Alma Raporu" + +#. module: purchase_discount +#: model:ir.model,name:purchase_discount.model_product_supplierinfo +msgid "Supplier Pricelist" +msgstr "Tedarikçi Fiyat Listesi" + +#. module: purchase_discount +#: model:ir.model.constraint,message:purchase_discount.constraint_product_supplierinfo_discount_limit +msgid "Supplier discount must be lower than 100%." +msgstr "" + +#. module: purchase_discount +#: model:ir.model.fields,help:purchase_discount.field_res_partner__default_supplierinfo_discount +#: model:ir.model.fields,help:purchase_discount.field_res_users__default_supplierinfo_discount +msgid "" +"This value will be used as the default one, for each new supplierinfo line " +"depending on that supplier." +msgstr "" +"Bu değer, bu tedarikçiye bağlı her yeni tedarikçi bilgisi satırı için " +"varsayılan olarak kullanılacaktır." + +#. module: purchase_discount +#: model:ir.model.fields,field_description:purchase_discount.field_purchase_report__discount +msgid "Total discount" +msgstr "Toplam indirim" + +#. module: purchase_discount +#: model_terms:ir.ui.view,arch_db:purchase_discount.res_partner_form_view +msgid "the parent company" +msgstr "ana şirket" diff --git a/purchase_discount/i18n/zh_CN.po b/purchase_discount/i18n/zh_CN.po new file mode 100644 index 00000000000..7d6ec45f4b4 --- /dev/null +++ b/purchase_discount/i18n/zh_CN.po @@ -0,0 +1,101 @@ +# Translation of Odoo Server. +# This file contains the translation of the following modules: +# * purchase_discount +# +msgid "" +msgstr "" +"Project-Id-Version: Odoo Server 12.0\n" +"Report-Msgid-Bugs-To: \n" +"PO-Revision-Date: 2019-09-01 16:00+0000\n" +"Last-Translator: 黎伟杰 <674416404@qq.com>\n" +"Language-Team: none\n" +"Language: zh_CN\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: \n" +"Plural-Forms: nplurals=1; plural=0;\n" +"X-Generator: Weblate 3.8\n" + +#. module: purchase_discount +#: model_terms:ir.ui.view,arch_db:purchase_discount.report_purchaseorder_document +msgid "Disc. (%)" +msgstr "折扣(%)" + +#. module: purchase_discount +#: model:ir.model,name:purchase_discount.model_res_partner +msgid "Contact" +msgstr "联系人" + +#. module: purchase_discount +#: model:ir.model.fields,field_description:purchase_discount.field_res_partner__default_supplierinfo_discount +#: model:ir.model.fields,field_description:purchase_discount.field_res_users__default_supplierinfo_discount +msgid "Default Supplier Discount (%)" +msgstr "默认供应商折扣 (%)" + +#. module: purchase_discount +#: model:ir.model.fields,field_description:purchase_discount.field_product_supplierinfo__discount +#: model:ir.model.fields,field_description:purchase_discount.field_purchase_order_line__discount +msgid "Discount (%)" +msgstr "折扣(%)" + +#. module: purchase_discount +#: model:ir.model.constraint,message:purchase_discount.constraint_purchase_order_line_discount_limit +msgid "Discount must be lower than 100%." +msgstr "折扣必须低于100%。" + +#. module: purchase_discount +#: model_terms:ir.ui.view,arch_db:purchase_discount.res_partner_form_view +msgid "Discount-related settings are managed on" +msgstr "与折扣相关的设置进行管理" + +#. module: purchase_discount +#: model:ir.model,name:purchase_discount.model_purchase_order +msgid "Purchase Order" +msgstr "采购订单" + +#. module: purchase_discount +#: model:ir.model,name:purchase_discount.model_purchase_order_line +msgid "Purchase Order Line" +msgstr "采购订单行" + +#. module: purchase_discount +#: model:ir.model,name:purchase_discount.model_purchase_report +msgid "Purchase Report" +msgstr "采购报告" + +#. module: purchase_discount +#: model:ir.model,name:purchase_discount.model_product_supplierinfo +msgid "Supplier Pricelist" +msgstr "供应商价格表" + +#. module: purchase_discount +#: model:ir.model.constraint,message:purchase_discount.constraint_product_supplierinfo_discount_limit +msgid "Supplier discount must be lower than 100%." +msgstr "" + +#. module: purchase_discount +#: model:ir.model.fields,help:purchase_discount.field_res_partner__default_supplierinfo_discount +#: model:ir.model.fields,help:purchase_discount.field_res_users__default_supplierinfo_discount +msgid "" +"This value will be used as the default one, for each new supplierinfo line " +"depending on that supplier." +msgstr "根据供应商的不同,此值将用作每个新供应商信息行的默认值。" + +#. module: purchase_discount +#: model:ir.model.fields,field_description:purchase_discount.field_purchase_report__discount +msgid "Total discount" +msgstr "" + +#. module: purchase_discount +#: model_terms:ir.ui.view,arch_db:purchase_discount.res_partner_form_view +msgid "the parent company" +msgstr "上级公司" + +#~ msgid "Stock Move" +#~ msgstr "库存移动" + +#~ msgid "Stock Rule" +#~ msgstr "库存规则" + +#~ msgid "Invoice" +#~ msgstr "发票" diff --git a/purchase_discount/images/purchase_discount.png b/purchase_discount/images/purchase_discount.png new file mode 100644 index 0000000000000000000000000000000000000000..ad1c81728300527cebb8ac9ac68f78bf53c9b868 GIT binary patch literal 71496 zcmbrlbyOYAvo<<71PuiDAi;NVw-DT2HX7XBH6(%HuyJ>HcS#7kad!>w!Tlre`#Wc? zZ{2(Dx@(>OXZF-gPw%eksd}F3nh+%gN%U7luK)l*mzMgd0s!#T003K$4ErLZf&y46lf||dAIfH-CvVQ~& zAb$AwcP#qf4lliEiT@Q)%5nWG_<;QX=i1nC!2Yvj9*%(z_w#%I^{`)KBAs9NC{aW& zL}sIz=T4Ww6-LCW9|DWXn`?Qjou8iATdfY?@tXij>|~oC;4+egY)TY6ow&^XMy{qE%(Ev zBHGyn($h!PgO$M`@p$u`O*?;6CTA)Qoef)-7{fXj@>sT1?sY6W z!>5O_8_HvXnIxWi#~*ihIiL}0{V3F{S>jo>=RZ5l%;BS%ke|kv#~Q&7@)4DG<)9T$ zAC~}nW&h1#X&gOLSdSZa-;!jjeku9M;-8fYkxA@>aQ>YCXnZUx!AAF&WG0r@vqWzB z3c`;#V_$_HNixw?e_N7*2Q`PXRi(4n`E46R(Ay_LT9?bO3EUkv{KW5_?k8b%qDR!Y z%O3BRR?J?D;JzU`eSo7>^&QciTyePq8F0Kw$AMAH?L~W@JnR}zcg2rPm@Z?s=AB`I z3+Oe#_dh8z@8;_xY~ng70Qu1sx$**W!$RjGW21cLg3`mB!fo|^HP0lYa25}))z^_8 zTtl^uj)X?f8SLm;q24Yohu;Vh1gRaQ(*)@|Jtt?&&!XJE|0LRXaxm&Qry=jmsME=EoCeOFFQf*nrhs< zK)@NfQOaw6_N8EKg=g>K;J%=T2TbX8nT$`&Pm&|tM?&s`vDoE>0HFKsxqjPVyDAUC z`GbQH-rp5HR&E4^-WpdP|hF$>l^le zJV7?Nx9gkVhrShB0A#B~&Ls^e66`#+iQ`|`26p)U*cfq*p?hoL@E!rU<8PmDUMwf) z{3?g03PE?9%EfsuYxDft7qXBmj^1E4h7OnAp^f{R8r7Q|5Ye z{8%r;7d@&Zp0S>!8|A+|b^KEM0|v*J#ZJe1~eOzx!#&8SlYL9CLbJ zF{x85t<2VwQu~phVIm^dH&*)xi-t{PU8X{2>IjN#8A2|HWzf7!z{0x7+{ohV>mBod zoi1O6pUD?v&(^ToR-V=`{KgI2kF6!&zkR3M+!g9=V6ZLo&gvS!vPHUyICYjhU#N1- z1f|`XY0Y*LW_nzw(tFh*cJ(YE09ge>@9l;+mnYyNdda(vv0wm#C_`M1ILw~}b(vbtcZo!coU5jqy}2o%B6~T*kx+kaL6nbSHp2Z-Grikf53SqX&^dEU zlzPwCvU;0WxtF~QcY@2v*webBdqs-`+%E_FKUeHXma)KG{Gj4=*ww1V%C;@7FmI>& z5QNz1iLcJdW60xtHK%==!KU)1)A653nPj7zyq|F|+3Q*^TR=$b@x9RhnM>koh#Y>8 z?c`Vx^EHVlII?55ti#-@|2$Xlf$-Jb40prSto!4Vu+7I2@}Sw-x;JEve%?Q88fI$f z>3H5zDiNBWw)*~tpbUKj(>^?cLPt1LC=eBNz$3^{?cs~aBlhJ$_$;0LiTnW#Z}aJ@ zW=SssxK%BTC1rz#FCF&%ldm3$-w)~R&hu>gU?G9iy<_^((WWByUST%#oa=Aixg1`v z=pLIWwnfD1)lY@NlOqJ(K6IHe5@rVV^FlqXEz%|uUvJj}|HTAyTz3!#ctYPo49fd9 zqk$29C;PfyRn)PiA?LLY!Z;K6)3ngD&O;Laiss@h!Ux)~%*ho84~F1_o>WXS){FVq zVwni*yZ%sBOs+C}lDp8xM7%6*!(PJn$_Fj1K}I1pbzRFxbNMlABf(WWd!E`-I1b~W zD?a~lGYjT`_T$O@7Qe%-oii$xk$N`}9VE^;=r0Z|>SE_O1mDuRwa+g;cI3@DZ}-So+r0u?e@4QGz>Q^O z=24R}^E*$ZBPI>|-?|U`&E8r?U`$$xxFKU(w4IzGN*>MU?)Wp1JQm!Ytk!W|&t!y5 z21^FCx$lHL6rkEo{?Z+HYSLMK2N>Qw&Jnyt(1Fy@KCg{TfSH|yJMT3 zqnF?C75c`{46^@L_|C(c^az2583XieE-?ut4k!m)T@x4995NRVTysk(Jyf6g^_%;i z7^Pfsr7v2W9hiR-nae@FV*z5YbSv`N2vQPJMqz(^)xh1^cKQ3{cmj!a zV_coh6b)8CU-nNDBbJ|Ex%4)X9 zBtbA)K?(^Y`Lx)Z;c4(yB2mdHIdKM@tNjsg z5)L6rKcto8X9%^z&{ojr_@B-6>#Ye>9Z*x-)D_&x$YBf39fB z{PEQl2i}y9PzeH{7?EEwse_=b^@ z@w)WLfb*gkT2};qaq`;97h@%rwreHM`5uj;c(ylGolm#V9ZTS|t;kn^k|%NZ$^F(B z_ZD+?%Rou1wE!_wG}VmXNO3}+zL&H~T!eHHEB_nioW3gx-P&x2w^mdAhbO>={bKnK z@i40S{IBq*3EV%oQ-1w#rt!bNcK5pfONveZ+>d|Egq;0DiVHcgOJD4t)7_b=N|&tX z$s!X%wI~q0s3%>ucAFil$Au2rgKOARS1v$Xalqdl8*Xw_2&=>gs53ZAB zL-9Xyq{f<3&yn8y))IG;BKw9`zon9Ut0c)2wAV=;#EoURHguzViTaOD=cBN;(3Mgt_aYqP{%Zk_wUm+c z+^PL)<30?17c~tHJVHX=xd90W2Zw7-5<=yeggryU`S@t9si+O9Y z@u9G7>*u2PgkOyG=*Wzk-E+y-v19>eKB#eCs4ho9xG-zUErkF3ME3YV$hf9ek7;rk zYI#gG?ef|VVf?)F4z5EBD?RZn4Z-JfJwXuf>d;4)g)~y@rn6Y|$M3Jh$S~5)vIy!! zZ7rGaN(9cMHzk^@OUrpYw||C?_*=kH<;LRY(ImM5h9mM)42qzkNE5^dLl%?ThWsd_ z(^SO2`r{^Y7F}pFZQW~9Cswsdb&|1d|2AImyYB0l^>-61XMC2GDGxty(>vGfWI_G; zcv4q%?;E4ViAIHCKfhz-;cu1J!FLU53yp&IliZ$td;Uz#izh^0C0xRS?3HJ1_H;EV zZhErRmZgJGdX#W3y|)%7jEyEc(~-@+#xUC(OG`N$Zx`!u=kJEXhc281hdC2;ay3n~ z63g`ylyMUw*w!RfRjybNbj)s9#mJeHdGgl6VGOk!waFGgqz5AZ(uZJ3A{%Xs_QV%O)>8KapZfG9U-pI`&u>YPx~sehCzt9<@EC=F+h=};)vEh-$lQh`9&HE z>RS#zz`DCQyqpuaLiGM^S6Dv{2BfrLk#TZPShm! z2D3E`G869c=0}i_5-i`!Xz!%*&~n%*Yk1XtF4tvsr^F}K(J+)BTE?~?QIH?4G=&u_ z6hGh{+teid`?lJBl>41imKdHdCnuAK(r~CX<~@`*yS#g}O9QS>EPq~%thK7oed|AI z%cx#FDPWs=@+ye*_s2Ar8b79~VFI ztKUZB+#K-M6tJQ5>a;AR5nxH1H*pLMcGrzoYpGWk_S~O%zf;qAh1<*#CFpw{dY`i6 zH^Wt=TJ<4!6V5rb#7263uyYt;p1Fn(r0%+ZwGMUv~NYFxZwK=gtPe3v?j>rXUAL5_G5m%Jpj&ot;WUF$K1+DjtIpIm0XNQNE(Yjh0N`MntE%vPn? zi02Qp`-E#{$I2j`N@K=XuVg-K=6={@uYt*Ob1k;@>E(a}!lhTVlKOWEq!u;$+0Xz2 zxp4__O#BxmAgdcE2MsV}W~}{IAVCOpy=SIW0SB!b{SECcl+~umsG7&yS^an|QyEtu zP9}@q*1DC4bp-uD*E1QM$RF2mKQ?;BIVPyjieZwgGq|FC*H{Ve8s7(o^*a5%2QISV za0~Fu!lp%S?NoyN)a}|}<{(pfIdRN{v_Z_HQiFt9hdDK6OEST!ey?_B*Onp%O&J;Z zbk*S3)(Jf&ZzgzE*>&7NWk#RKIs`qxzC#DdGQuA@fGPEKu2pUUmBl%pdGZn{6hS?( zaFA#7SWo%5Y>Ia`*X>G&c=zJiW&ta;exZZ!9lz%m>d;LS0%6!E8;!_ucbe|-NEo1@ zfsUWOa%yOT!@PX6*X5CRFaC^uWN_RoF8V4ejrSO4ib*YB&HgPoOgUyI8;qu+2g*mN)AqrYd{9wtx;MDLduaI( zs3xc|d^SCEzmT0KuTnt@Nml#np)NeflF%!q{OE4DHrZNRP%kb)JHE;hJVAgs1jgPz zKAuPMN@3jOF>Ohmw%T+U{wGmuC)ay(NIK3nwnq?97d|J7(x`QS5JTGMs5`2O=wQid zZ_jtL0`|PNlItAxa%}NE`e|ERlaPeCu>i6SSCEUG`OMonlOrn^IS!{eqot0QnMR`E ztj!!JsH6^P!7l-*B5Um9#(ldrSyo zc3bo{K{jGy`3%eFndiM?qM%O%uS6W;NL++`M|ZI-^p_}L9JaQ&9xt#apK?uEtbF3= zllfvg`na@0kgQptqjIB#I5Ry2z)*Vg@6cP`Y(j16>~KozC14BqJU*E;)%Mm|t*yfi z`tUm)rCFAkSBKon1Yn}^n{snyFElkx3M@ zwdC!dzfj-)++IE2^^RD#`)ukcTFBb!OqUa=VlMB=BpoW-Zc4z(cMo4|FsZAr=e;h) z*@}u9kg-r$u(B+(suLEF@UAM+1po^H4<2@lpMSn#zJF7dz-}!>^pz5$!fuO7RRb0n zyE_|Ktc1$5r9U4T{fx!AK;0SDHO{rvAy2M(+uQZNSet%t&p9{2(M3v5$4%Fwh?Cdp z>F1o5uc3vD)xxA{F?73Wi#G7%)xSUQV~<{=_k&~nV^3TnbXNh zLIg=P{ZX$at+Q8~_vag`@p+ePgpICnX?eo$;o%{=Ew)IK2N5lVi*8I=t`d4nkt6;m z-+%8~cd{orN_Bm zv%%k37<^@o?pzm1Lj)uLN1plLOzyvMJmm$BJeLn=IMXX`sUuV6(^)SU|8LorFN|rD z6tQq}V2mRp@^7FaLL(83Hli@QuCmLEy~!8B3Hg8R&mGU&{pE6- zBEGfDmzxbUn%yst@3%J#y7Xu-Z+~g&?VfBNK?N_reBaOigH|b`sf+iPnlTDh{|AzI zFVy77`QHRv?==h7KZ&gm$p34u{olHCf#v{)v&X)3um4W+CAa(H@i#WeD3CuSY;`0a zghtvi7B@8TS0hyt3#adZa(-rbpI(92wQlwVo>v8p&W(F7d9Io8!g@YAHtTu_U97FI z8@(sE@OqSAFitEHPSE<~X`B$ooftKa>S|l!h6f-6x9^nrY;1KUTN6jTr|tcNf}8UH zww}?y4byv*@4C6N@D1ldQ@$z{$NGxB+W zJglNO=$Y%vr^E4hiMMdll7mQ4K;YD8_s5n~x{$9=FCT`29 zOC5iv>R*3?nC;IK4s@uc5vA|;;()KAS9yZ2j6w{h75vU&?L^4rAR@lFPG>(9l-ugNtP0YO3S zgmzEw!;L%R5Sj#T8|hLJh>3EXpGrQ{7rAH-G4_@%Po$CqBKs{dCTI=z{oUPNLtUL= zhvVaYTYdfIJIF`99`muN0}XyWkK<)4!61L9s$YM4LCe+SiluR;+K3eD9JyCx%&RII zuBbc2HB5}N3!Fp|m6f1Kd);Rt_bB_N!%p4b(~qu_1oEF`tNY$hc40%otq%hcHc~Zo z(hzE>NVHYZpQ(=O=Cb{SOhs|5uM)XuXJ@O)Q0>aUnL}` z=%Maj{)0LLt|%6@^s7J$=pZaM0L0560Myb~b3y=eV3v<9gu1v*bzW!nV7?t=+2F*K z4NcmLg9xy&w2U#GA04eUXwRO~uuOEah+AoD((_$PQ90N5Hp?0;-8I_kXE-@LAp@=M zK&Wr;?yeXI6Ihmj9sdGd#5zzYiX#Hq)3hPO>x%*(%qC4WNcn42WQ9 zGHEMVST~~P z6ns@byxMX1J8t}k*!_yQz^F6HPGosJB!`X$)>vCZTD(Pah(jJVkODc7-%NcaOQTes zLH)W&XTF0j^w==qMf3mUfimo0^!0!#u8cqXyn#fE1;4(vMI#My%5FEf4WdA1Nt7LE zTEZ=$E0Juy%b=n!MwOrZ;sRmB>`=Pe5W-@J4=vb(UR2SAlJpf%TjjUj-CMi%2%XHH zb5lz@@ue@1isX;R$DXzbnj2S1a9vPIFnRH~qfGUn!-rynJ}j*v~?C*LoI%_uJuNh^?QyYu9F7_Ia8J{MrFMb|MZSUupfj#})-0YOasgSbJGh?D52~N#k zRWJE3{2J}WiN5!6c$Eg3WC!5Nt6W!t0i%#DdDa?AY3%G@5}FJ&3;wqU*WxAo{(Zcy zxiuwb-6IQL`0uS`V5RXy5w*p!MWQL7fe?ad>ioB+Kn9hZvtI*;%1#ka)f)RJuO{Q! z>oPek21vB2HpKK#gCjW&rZ71^^5I#HacL+~xxkNe*wLHeRQ~O!_x1*_MArO^ESK&w zL))2ag5Qb7{6e^lGlfOgPVkCLKj1d;oJT^^_hoZ($?W59YFVn&bgy^6_d6%yvb<6~ zC*!<@<>}CST52t1dAJL^>2BSN75rG;{s-#s`{(w@W&#Fq`ijJP=kWRZrtUp+F8uf7 zxn<7+YX9!5_QDaDm(799th4KPf;i@Xc>R5s1ruJ9oA&@czbxLi|{M_D8Gy9(R-l|NZ{X)nAL0 z^=lyd49goMVsV%)v5f8p&G?4>dW7Dcy%LD#Cf(hq6S29M-dBCcmbGxWLeq72BVS8` zd_5CBw_t-b>{cIt`zZ_vnh9{2_QbB6YD+Q#0q)x!i|qQCX&m(Kk>&&D!Pp)4ws|h& zlT>(ug6hvt9r5TtIj3_Pef7jmwCW38SdiV`qiJw>c4VaY;qzD_K`L0-D!8g8xFv za&>jM>QzwA+qNh)HoG@`3!*k%#7?LHlL<&vD{lGU5| zboyxV9r(7bz8p*soS#R~Gd7e(qUGCeiCeQx#9AfVK_fZ4)>@tfgQ$pK5K>sAjg%8; z6KId87B52CyBT?8v^M!r{))itdj!$-wc5!=y=0^_c3%iA=mmyol&ZbyaZIC-qJWA3 zVv}#mu}y~CjobEx9u4j&HOy1~{LYJQ9Xy21hsA|~rwn70e+@q;>{0pP&k~LD(|xzf zoIE{gW#%au`&}XF)j}YO@#wVwjlX&@^V_YR$J$oOJVEmOXUTy=Ti9$3JtZ)JVv^IS zf*6=bFeo;1bGoRRc{u6AU^?|RU>szl^~BB$19a6VJX_zU+Lw189n}@DP>TnSKH67! zx_w2GW?)UD3l$h`)UfqoJ_oN#W`?vN9y-v3uRLkj!`AAm zu#5M;0p2R-)R#Cg16O6gZZnI;B{`KKyeQ$B(i2wEwAEHmk{dDJnCcp7+qG^>H^7| zQa${j95(^4oj@PzBy0#S<`q|Fz*T}5#mb|WW*TMu%r8GF!@lg?9rv12JHa!1{oUhxtH?s*$3=b0STw-DHh9V`yWU?@qj`V*6R2wwUN`6Wh!SXc#?D zcV3C>(#uyVS!)YS3{KVtAf|U1wD; z4NP%E4eAFZFe8^RF>UzZC}ZX3F)_zcb!{)384qP0;*Ra>6u7>6iHM)bUnquLa^uG{ zEmrD|*fZW80tej2Jz`?#GwF71r*Hj+HkF~07HDy`4&L)MDU`$pXbd{4H3M&9qGO^) z`*Q|2xxp;tWRp~Ki`YdQh^{7Cy;Ai%K30U}oIY{^@0PXVTbi>K{vXM0a|)k3ju)1D zx-)>Rj->cTu9Khd``~26e1b@P!%gp=LgC@XPzEFO2;ZmH%AM-|*<_93F`}DduuE`k znz!=eH^X!P2~477^B=T-_?GC zIy()@%ev>$vkDrAj%pP`L9=iG7+l5VD<47_FfJj~{z-g-ptp_2QeRt+BrahlWmwl^ zfB%rjy7z%o-HnCH((e!B(0E&ZpfhF^FbF2qB(WweA}d{jWMrtC zAz*}$TWT|IL^wD`(R_uS8`J;|^@AFnT27n9wfDvmtKxSG%zvxTYmcR1vujYNS`2Z& zz6ljPSl-vdy^9pTBvElz9v{aVSB3TI850#~ATN(z<4Hs{ zfgPEdeqIe(oOp*eo-h;D?0;x-6^y$`T;f4UjWVJw1ahhAOiJTeym8f!Riy=y%r`B? zu@FkB3@bs>&VD>;`t#BVn9SkwhrZy%X!y^j@tOi}$$Z{BNcx$gx)zQg02H#vW2zyi z@auAWy~__5nh8R@`ZS?AQo9n%sWnrju1|}p9UV*lqQLGEp7(81~7o&B*a? zavO~EwLJD9?d>#lZ{hyi8-7O2HA0tBRr)AJwxXkZ{m1UBMSs?-;K#x;JlSBs-gD67 z&y%jz=a$6<7{;duu|E^SlDC&lgMP^>%`+<}K5!xlA2W8OA!>WQwA2zl9ZvpK_9cT} z>$z(*_D@bPUT^`^yyIqcO|u5l_S|?8l^Kz|SKHb2cuWJu=9Cojv3K4ZXuvpST^0t> zjQ^I#0zM2!c0L==I?5v9au`2_4d6VWSppFaTO(#WfJh{-R+lNVype6u5=jVB(%_VHI+Q<_fO+GAAY z(&Nv${rJx3E`GkeeQ0d%^G%{j<>N`^?QW}EeU#CmUI7N64f&{SQ#yC2e|)T}06P`5 zxEY(7&iP?DbE(Q9{ygK%yyIbH=k}1seZQh*^ghYH={}7jDPWvE!aDfByVT6~l}a31-^Sc|kt@te%0L)bomO+B3mQ z(}*u~OnX$5dEiNhq+QVOI6k`u!?Y2{w>KA!v(xbY$uAb`y;lJ~EE5Ln0bX;vxR|#Z zHp_zN5qhYl9L0+8-;}yqy0CtOZ}&QywG9fn_p!}ytOU_4F^R1jPcm+|XOkmV))W0< z+44g=-YKnG6+7v@y}P~)xo|iZSP(429lYXphUxw($l_BvB3!q9N@ed8e@ck|=-`o8 zO24{6C_EC22n=$Y!N(oi*BkI=;9CkCJYKH~-p;HH;XT&{w+pZ6vbhhR^=8GKAwsy| znL~5JR_^yR!j}nm9wy1SEGn<|LAqO{!BPN_U7PV4>3Z0wv_$9dl>mqjPs!J0UU{X> z-+y98)=ayulG3rHcV^72{g+4#%NUl0FnDUNydkhWD-<>SbQ;}3mKZu{vmPbxN-p?b z;@z*vaZy`+od#YzJtIe>vtDZNk)LTYfMJ)84qk`Fa>9e{d<-sc^A=WewVmj9H;JnT z*MUY?+s`oG;>C`ZMn-Pb-2v@6b4`ZJ34yL5Gi~2eFT!TF@P7AdpF2b6>|XomDd*ei z_;_6Bb@5P9PU)x^AsA*=PmwfMd&sI7Zta^Qw21SEqMq005JSsIfPj1lM=#~I9NTZ- zdQw$wN++GHyrTW>zfeHO*C39^e!qdm}eqZ`U2JziFjhVRJFaoys6vKTt#0q&2d&k)|*+{b^a9 zaS8AEL=i&9hDMry|74I~%&(KQ*!M^Yc^E~?r!Vc$*55lD8|_Q(j~sn=HK`Qid+KRK zJ&&^C89XyrXlvX1<(Pc9(7`l70q3BgY3(g(4VFxeh&3VnsKmOWoE@HDQ(W@JxtZr3 zlwYq6I_|dX&F>2~q?6ZGQ@q{qR=I2v#w|8evl`XpPMG1~xXcd&0(P_tC-)q9bQ{Pq zp1dX7HE-eqDy+Xj`df6S_J1sAg*{t9EI3E-VrVE92zK6rfGJ3|0v|D^9 z`12EOS4SskbY59SV|i+3d|hSFhx034i-PY(Bc?TN+r^bPF<05s(W#jA%KRh)G!BV5 zjdzUg{2KavcdcIeQM>bD*1aJcvyDSoj`XzOx)lFW&i`z(3}nDyjZ&v$tE#GMZEbC! zK)l7V#xt_zRLyh%F;T*ymM%dFq)^i<{rz%Kf74@Oxjy7RF{=6Gyw$cA`TS^nw7x!C zes|hk&gf6+cdKxGjRCAJc0BuO{TYlP_p93Q+d0O(PN$U4c7nEmel^=aoqxex@naNJk4?5*Vn%c*Dqu8RBN^g)A~C@%T@dZwNdhL*)GiT_?mo(qqmGqsjtU-yq3E1 zOZEF5EdniGB7y-JuDFwO1K-x8n*wE97j|Lrz_xQ4%l85}xS!dawJC4`B`3sI#u5f~ zaMLdzi;yNwy5crJxoii&D~XfRJW5XEV~lZE#NtcQ`YjD--u@nUUH8S9&^|cF z_yunv({F!D>7ce_2I+3Odd-+^ zTeN2YTDfSUb zfDs`tDHJmw%=GybF@P7H|PC-Z#K*HVJguJykpEuY{exd7w<#>DhkHWMrw z3KZ!#D1c^bL@?0%e}z-cn=GYkJ~t`2aS~vR%wXvqObuCdX)m5 z2M>*zibDt5?28Ls)=3Im7%bw-)X2((*BepuH+BY)oLyGa_5E3Q`{%No^Ci-Q1&_?E zkXkZtpDTEO=RNn4wRf8zELXNv#07X54bN6KZEI<Y zvZbI)Kas=pp@Rh0$LT78EmV{Dx_X-*+7b00=Ows^Rz(2MOByrVFgr* zG=;+BtKi(-GQs+ZDgLbc{YXZ++`u1A#PLuKHJ7F$T&IM+5KIxmKpJ4m! zpahGqKjthiD4;+9KK~1e0O+#lLtn$Uj@@n<;j^@xefi_L*HawRr-0k6NpU*zFpT6h zDt)Z}X;=pxscr=>3)~^WMk<|%D2i*UH~c%-RJ;ViZc6S}1!LuW z77UN5iiEP3{wMn4`>244Ujjbfe~=Z4009BQ`@Mr|*e39&t_2-;JHfVEToI(T4R7s2 z$Mx!_4L+;|tQtpA3vFpJam^ivky_}Apgv35=mEtC*g;iA(aqcC7%u}{9^U&dGmY?( zqOB69hI6A%{&tQ~sNRo3mg%L+K}r3|G( zbnq;yW*zUoRy17hvZfA81iN2mDD(l=wL0bb=bys(z=pHpi>!ZlH8QtT(09Qd+3D=f{JJBMrF}3GRP<{k`!wbjjsAf=fHVks;j1pI}5^c;ErdLd$&>A$z zud_6G6HPk`C>vJR<1!TUx#IjJG529?+%=fbMJqDAP~Billb3G#S%;B&-zIjQdl2lho3gu z+*e0x+OND!ypjB!eD|H3tpFh71jwBhAAG^?ln3rDbZn z&)>ITcO{w&r%u%C@R}@C>fa8-D;CG^h6kG#gHIXYirT}`==*Dy#%F$%`hMQ=)TTua zEI=`3{<@$_6Z#e;jh(M?E`kNW>h=)UX4@05K{nL|UNEdd>NNdeuFn#Vq;f)OdgY`6MQo6T{_nY3d!)>Jf< zP7Cw^imEr|`2akCDdC+Qt!c4%QA{IbWOMPOCa1!q*UXvAt#ddAseoE(uLE$VCZN);uj4ee_Ia99>oGg?5d`!ehk`%VK zLNrY>K8=hpli8cJx#xa*OK!I3zsLIa?KwR%vM6cWZrji<5;u9RQgSi&@wE>Ul-SZjXMelFDJcp$W z`2F+vT~zE+mikPL9cFAih*Yp?K`D8Y40|7c^?&@Lq~D#vJ3X~ajE(;hCP0YEXL?hV zvYiHdsoB{z&fbRrT_hrt=uJt-Vf&YoQYY}ELFi@YZ*_xgPWLG0iw^1Z%WQ!{`OGSg zz*TLR26JF%FBNND8jg_1&ZDWcxlSE+P3C$rT(uiVAjO?a*V{s2-)DNQW_p2U>`quv zy;})QOwY6fX7+@B9Q(*K*_a~ES6%%z4*7WDr%x`W+fro{0(77ML(L=Uz^@~itw#5to8XTD{Wv#H%^n70LPN# z7t5r0XIu_QMs}2$brH~#HC+##I_%x8`#pxbQox<;Qh(cn2mD(d_EOj7XgqX#yTt@l z)!!2C-PRvcWDqAFvW{56`FdnwbZKNfJL2{&cnNFCSqyo&x$7q*bZK;$={uPrye1+a zz}<&VTxcM($9`6x>6Q^~yA33&x#t^1x7S&Lh0ffQ}MEBF)DC$)dL zl;4!ER`@>-Kl9H!J{2x!_|fq$Ah-sMqwYqmXFAdN0+59nSb(pbxkwCJ)V2DAQJ zLx3N+n2?>R;GcfkpI6RC=}hj$H!Ej;Sh2x}|KZwjcd#^c8S%PPrfs=)(fAK_2$4|F zoMYK(k{-7BVhqR~8~^~7)z{zZ@t#``)1X_Qj;6oan?K&01h<|q8*6CJ?mRs`@ugQ_ z9&omp!H2vZb+6;}Y2{_yxexgIqCzO*WV!@2(O{%ryjsdie-m%@7F zn=6CWB+r);ozhz;TaDw_sW()W^J_$rg?7Og+NxnYB`^UmA2>W68k*I2{Rp{uJBq6~ zDusv*4<5hjc7^?VQPa^ze_z{G_Vxa1#8HEkAG}T?W8mg1^;Bq%ok^Bh)o7x6B8I7= zH}Lt^;XY@s_2r2`m)o(;)Apma)z=Kq#PVh?pNR%7MZq3C+mklW()xl1U4Gt|%A2+< z*@}7K{Ry)?L#Hl@y7%eFJ<`nvX2O@;z{unN$JRa9!E%>(xjp zWR2QR>pc8`lt@3?D5c-dI-dt8HKb4~pGltD4Qm`O164pnc#pX;*PHa)^}uC*KG}Je z!wFc3CPdLrRn2u7^EHGcm<$wW1(^sC#FG+`rDKt5^*91Sb6boIc!hlui$Ky?k~rfB z!YaLGLMM4aydi$Utz10KqM|OM<(*!yv)kAvS zRjaC2t@WFGGDY}d#l};qMkNi<}=FYs0S$3G=>8F?F%VK z4sQ8#mDXonH~#STb*1tm2?b!2*7H)YtlEp&A0;)#q_>Bs0(WIS5wwqngr*FU?y+(k zunB!->`BM93aaifsQ^~Dr8G@O6kk4pB;Bjm3I`+_*pIaXFKRcLx(D5r^5)+us^x9~BLvWs-gP8vFC2z=}YbE9>QYlcLG38KClx#ZtW1E#J8xnXY&y zIuNeAqM*FLgp)KGoVJF{F#4{y9l5%2w>Q>;PhbX$QZO_Y>h5Z}X{k_J6x=6=ZHctz!h2qi|p9hDA zhK7fix3;!+cIIM>Z3%{ibn~vzLE16u%qJTiDYYwzSxtlaKP$#@cIICuVjtVBUrFP? zjov$sRUy-8yvrWtr}P3D8D8!@W>cPGv)a>%%!rSR!!A86Br-fcIC!3NlfTfLbJyd) zN>zV-IFL=@4();p?00V$E;RCL6z*2UvI`RSwi3;It&S+TyF($WDP=eg9mlZ?@}%oM zb$89oI1P7V19zAE3-j(vLKR`uMyEH_n_}b)at|bQ_f=Ll&xqJIP*9u~^_9ela$F=R zeojzs8K-)BdS0EMADhNMMPXE(SYx?5L8~{uyzXU4M{f>X9_+XkZ8AN{lW6S3c}&5% zlq(@7ln{|bbj!9&PH{kd*PDtr?|C-1&i~-k^aqdQ`0x~mvyMu=v}V&oV zX^hY7Ep$7);l!+6x5#jBz-#OJL93&cV&x71SdLw9t>Bw z2++?o%f3W>#B)4-ko};_KWRCM*dx@AFv(bEyxXACG39I4qRn@vX@qj3v?51TB}h98 z0-lBoKI@3ELHLqj4+KBZZvXV_u6gasoofOy7$PO`s8{LCYyDOcIeB$`G%zwe{LE~8 zZmw|1!giK2vGneqotCbD`$x$q&&&FQUSr8xW{myz;n;H)IdZ zv}+EL?-fLJ4D$BaxjD(>wx#h%TtLa1VA9Ka42lMgNgs)o@mG6pXd(sVBJeQ-I8qv4 za>pl&ihx6o15$18a?j-@r~KV6Y~Kvcgr%SfJ1nyd?7Z}0;g(LUFS>?{!hUmxh=#XK zPHO4tk$2%u>T5mfJ@j3hoQ(4tuk$$B{PN{X4MXC}@-nC_MY^fG^(wjA&<}hjyNb9=fhpAW0fmm1dFd$H+b@ZcYaVy;-?KKK&sv)&XuDF&JpC zseWL{6Eq-#<1T$zmoE>w}P2siarejncrywEGu7pgLni~2b z6MKWDbtG!HhD3}zjEp&|yCq61x~@Aew(O8y)1dY7!}v_EES3RD22GK}m6nzk)it8j z8=50P&84MLUleFIk`2%D^Z^&b=ivrH>BLO5>ASz2VeI=dso?(lKiB#-?I7K6GY&Nb zp|!)ZyBIZ3LHfKl9Qv~@hvQktKd*ySFICy`X|`~ck=}1B38y;CCC=ndYu=>E$jHQ9 z73L#1S!%U{ZeRD9+8yuevtHUEzUU%tRmXu6qL||ed zLf{d!h)|h~bU{+g06Kdo3otn;Zb$p?^(u+`2^|`W(7)bXD%sZ(6cuGnCL_i9vXr(I zzO?jWJo)l^e{^*+hc>Wo9MBp%CiS{gavpPd?JbXGmj$x}ctnEneNNL(E?|#-j#$kr=+}72O%p6EBYXfgFB_*QUtuuq}&=I5? z4AXZfxH$HXNxfqAE_%e1{KX;}#V|O~UsaNx#BtECP>cDOkdvGt4C~3%u z?=6f(2NPomM3mnD_s80<809o9G@vV_rCZb9pF}!#Tk6ea(#mpePuvw9HlG>a7+YxG&m8!NNLPIjV-H?)hq4f|*U-~}c1q&)`*KfTyS70Q!5_Hvc& z-LwRcBLB))e?3!l>U4j9U*7oPgbkDIaE;?SJM^FO0Hx%Puw>0MWo5=lQdqu8?|2XW z05F4(#PEn;gaK(mzQ;~bRGi(g?~QTBaE>6i!)|X1gFsQ8ao-zfXCybVkW&4kdBcz~ zsg^;ixF#chzD8j}55k^k2bYFSFtHV=VA^mqt{f|ebqa=iR&b&v31&dcN=8NmFSjVS zli5HdmIYtca)H3%#iicbNb@1{sZfXg;h3tx@yxGI)PDK{*pP7!z~sQ~xnK)u+sC+3 z-a-eOdT>xOG^A{=MJ`;o-u1LRfv?<&BeL#;?NdE5=bNjf6+w4#1ldiYet&2CX7u*? zB%|V=qNalqWjdlNFpO};I75_($a|X$orjnAOUnm(Nl8icmf31CmxJ4TQhBh;MS#Tf zGYgG*2o2fFit%s`Ek^Kq|F-*~ud`hBFnm@(7W?r$!wX#}W340A}XTL;Zeh<8Xm4*3S4P=pfrZa|ygmelC z!P`0I_3qOw#ZxvQWMvO1&VW8ZnqM}u>)7{P4(}xd0%kC-gK`Anu@}d9vQ(WJm zXPYMSU(W92&xE!uV*b5d??umQ>7xpwX^RX5|G$5{oo9#v+76IDS@W0r_M-m#!rv?k zoshrRnlY%?3ajQ}$I3ib#VpWNVP~|PPybQINIA4-mGHQQpfWaNz7~DuZ*rh1eSBYR z;&#;Da;B)WK(Dch@d!PQRdGI_i|+x(|E&2=CTEtfeOOI7S1DIm?P)|byYT(1^%l)2 zMyin))bbKQwc1&2GF3=!&VdxQ9ugLoQT!jxgf6?t%lAfg7#kU-r{bZb4rzYrZI4E` z06UNl?EpP2w-ZbUbUZND?ky#SpCSEQ-SHR~;WDsC+M!cY{NJXkk#SN#*usp#?E+aL zp4i-E{~;j(V>23V7wRxeaJz7N2QOzMP?!1+-mDNaaH7hIQPjOcXa(jRuo+`btN);$ zou1yT`zt5$!YealN@LP+(e_-`Y~V(A+X1d7>WR9;)BotOA%n?Naz|1J5f6Eq;m{CY zd69A7BP)EeSa$yQj*ivfjHq{+J*%(3-b>?WD+#)AO-}V{jILSDPqg*1o>juymE|ji zE;{MsIDb6{$ZTAYA?Llo>9)=fQULwjW%|#v1uSYk)!9~ESTSQQ-!6E4Vy}Pk0LX{3 zsAu0D2>Q5&_`@38gE?xTx=Y7Lmq;B3WsL5YxILi7B>h{OVy>E0J1={`1NItGhbUQD zY##62PWJo4`M-NZ6*8b8 z%7ydI{9?P-zj=U8ux&UQpPZcRJogvP!XYCQF)gxxWA-SEO+7oRFh~1dA}=pl50=9* zlDHIsPEO(`GxR=*_EO5@Xc7(fyKmKpKvm}G!^y9rja;iKYMl^Zpv3Ce|CK{Oy1kho zQ75EVuuAIKI|pP#&UOD>Y;;tbv$TZM6ty_VNAZZ7n8Gi*|IB4YoOP^t1WAVgGO0bP z*MEUy@%w!hw3f5_AhRA@g?|NiUj)jcFff!hpM8&J$9nZI7fSe$$c2U%dS) zb@JxAQ*!7*Q0QIJ)0rUc*9m zg~OWat)aQD0JJ;a=H!8SnWTJ`Ne&Z|bxvbPmf6CCPa0up3Dlt)^V?LMv8PaI^wt-- zzWIoD7DoJi_uB2E%FVg!TTQlvtwyQ`=8}GF-^`PAAm~n2wbxPgD+urSSk;&4<$Lq< zgEZmYAG*gmAB2r8{Zy~@=sDf%j=NiXv+IXZnG&MrNIKB37V4I`WkWHI+(zfiA0$wV zdLl#-21Mim2`IldTk$aEk0P16FuU+`9byz$-rd-ve5TEdHZ(D2Q86V33yi8|Ya?ir zN?}BbYc*75GRSm~LS8_j4&QRu5V(jkC*3|I!+E;rp7AQCt=yb-n~uvg0^Zo~-%wf9 z_#OO1UU7hpi7R|3m%`>XsMKa)GlcXxu>~xvd0YwX?W|2Asu@592~+t z7Nw~dm-ex3{xZ8;n6aUGqr&;U!RV_uol}F8G|CRYZl}pH9g*u4ZJU3J9iH#7WoR>dq?1)BJj{_cAAdGm-hyjY zNwF7Ojbx)!Z3wd0AFcE%V6tZ+ehAGrvg)SF^Nw64-#?71-tMjy zd!hrCKG_|AfIEjV#wPY!-9!0piT(E}YHY4v*2EMS8r}~Jy5?t=4lGty%)w3%q>Uv# zUm52z%Fu%{a|_Hg+b^s`-A4MkBO~Auhs@UR(BF8PYLD3a9FCWE2Z3l#oJQ*hCs}Yy zSaF^tOJAxu1RtKvUQldoImv-@Yv}usGG9P#MzSE>+8uHGb_y)Pd^xghgZcW5Qip)R zvq`ddXTmih$!}5p;avDTxuq7J)-!X98>%*i1-X;IPlPsM!{Xm%*qG%sag`ljo7$wY z=Rr};=8lSJcB8J7-~M@*R@`E>MPRRXKhO14<#@}|)R_OICrKTz912R&-v29hO2P1v z(|+B9B$8M07%GBb1U68FzU1;3l}pe_8{pxq6P`{M*H4vu`Hqd1n~WfeS-5h{4L%uf zjj_i|M$*X@1PVtwo}F5TTt@haGaK@?Sqp-U_@?m{M%OP{i^nVl)4#vTkQ;i|CvkvH zw;GK!&k1x28PWdZQ0|T!C&^)qg`N=DGUtU>0-9K-#ma5Li9&#Dvk zadS)M(0D4q9z`9>W)kz$sw&aFW#CqZt#VO0c^CEMz*Rod6gR)pjF!FAU?GpfAUcpi z#zfxKd&3{&cIEw*>j^e(gfvQBjT!-k3tM=MU)xdvVW3o_`@VYB4@nYsW{#K=bly~> zEu&5qkg5uw`eZE|Z=hy@>|C&|IQiDEVln;`oQ{nR?^Lg0vp#f>=CcX_r3B^@3%;!3AyCj@*Ayy#%qlFFWIt(uHF`d-fv)7Bf0AKWK4wp4s(g z=kQD~a}5sHqO-c!4WG6?2Ac7k<#BMtPZ5)gy2gw3{lOq1u>vJ8vRZ6d=D3o&k`S~W zkcY?BW>mT@OSloJa?Xco^YjL?LvOVoM_`SHN#RkuQW# zy0K$l$;U60P@qq8#m(N3&B~E_a`iAOiyqex<_lL%mXK`PP}5J7RaFjKm|G<{iS&Cy zt&|-A=S9Vkd!SMD77WtBuaD$=p1mA+?c4ZCMpVv7rU>6{_w(g1{idoG$y||BP1C&k zafa^gWrA%XpfSzr_EYhQ%$U_zfWA{r3@TNpr6`6v1i;5^Wi=y^e>M)kK5Xp2oU5~* z_WB{KWD55nO%$$6E<8bmf5gy;E}%V}!K!i<(ItZzTtK`o5pe3NlPhiQfl=3s#~Qh7 zLLh%tPH-z17-pVb=GxBrRai_~dK6m5@9HcvLq-Y=FL}Zp*6eN4kxDiH&lF>0g|>z- z@%NntG$+Vo;c^RR$iP)+E6}FU?DqCrukvYBn9rZibMMgtc&RP2fm#qJ`QLsVU_vIkA+XPHceN$H}mr&ob8v5~G zwyEXZKX$xop6E3*@+q~LuR$P}O9Ya@9E-PdBFY&XCz~5m$jHSEcM{5?)eOisg+6M6 zrkY*q?&bAGdp@@IE-TE6fGd-fvIL=3u=a6hHJfXwokZ{1I`TzBp$P@&7*EvcEYU#A z2)ZZ!a|%Tdl0e$^^3(n4{umxId+|J|bs6)%}U*y;aZY6K8H5x)WD5 z@8LN@zcP#tH`IfGpSEfi8&ELu1HLsI5t*OgI=`)aLrOsDWZhXH_fwjMWtZ@~>A*(~ ziXGvoiE{4~n9rhrERB}}<=Np0!|EBh>@)QsN#fqZD*yU@?Dxwu7~|p~lK@-V%&$n& z%$VuJ7!yg%8|c+3VN=7e?jKtf?ZM{E_gz!HL|yi}6Vm*75UH^vqhxel6dKc_FaDh3 zUV;8JS>n!XgOLF53jmBn=IRiuU7L`9`51hF_rXnee}PltuW@yMi1PCj=Rmu2s`+1| z$JQ>+{6EZ@FaOv1zfHaR$3$9t8jldFj9t;H!33WvQL;#g3&r!7l`JFlrP@ZX$EJeW@neS z56+)}KvMAq0tr>C@v6v*N6DE=qwa7xvE(Y5x@F`Hx-+moAIN)!|FwZ4+Ypo1-s!#U z*f?}V4J891>G$GADH1o~FLE@aai7sh%gqdfKd!3~^7Lsu#T`Pta=m#GO>r}XCHqTU zQ`)b`b|8Pwc&M~>3n7dA!vN~qIt;c%bB{DKj6J)4CmtXWC8QnjShV5utP06-4)1;8 zfXFc3m>DZaxH%3HX3m~g@lHN9^QkR%J~PSuMVr08lao`x$ihj-0|rNQRM!2X0D~#-mYJ$e0{C<6Y@rgo1qV0@eo2BO@`uLr1-QyY z6M68XwX+bKoL<~=;DYuX^J#M2@WHL;@cKGkObD@x8)%p$GABFrv#skZq^LuTAF)2_ z!@u(~_CY+xZ&9+~rcVX$kI>{l&&xxcfhwpx9EKa{RGk(oYhIisSt`ae? zyo(LbX==qVHURe_1FD>_zmi;L=8Gr*|yh`I>l}XOw`V6zQ;!5WsqknN&!J`$K(U8rss$R2`q4@cXy zO5VpKo_m?u+a9^--W^xS=)epP53~N?6%0HxyJZ3&H@g=qzoooGR>4O|_yn*2R`&%^U3Y$4?1XKjNQZXlnwokX{rWkk zrKAp^aQ=BO!0DuJLIT95gW(-sbZ$B`L!QY8K9VlwEr-j|oT*>xxgNXMn$H66M^iIj zKyUj)Gk$vO$KD2MY5DDR3Rn8`TBS`)4GlGYyAEevnmSy15&agG5T5K@4pw6P+OA1d zeO?j4eAx-E(=MW+A2dJjt7TVn@4%6{X4Fz@-4vx#B(Gk1NsSF~n`!GO$EYU7@B|Po z_g#f1n4hPB3a!SI?I#eaZ+S-ZdE`tSJ<4*=2a$N$x|)g>>>UdR2T)lmom zPx>FEsrec>{cq6eA>iu%lRJ*eg#Xz;hbUUF?wykR%Ap+j^`cV$bBOW+xc+a)_rE?8 zSXS;c_hQ`-h`)y@tbjWI$1DDH@mFQvXF&P%in}Y}{*o z_^bcq#{avPj$eNnppg8pt@^}rxC*?C*ynwO{}92?oV#(3FwJ~CXr02>BA{!S|K*Sq zd}7JvZM^0#hfE2_Af%zq%ly}?v4+?Y0jDrgtyskDa`88&Hz5|@m6=}s2QUjItOi&kKI(MGdPF$!$GiN<+e-Hohm+= zokFr87pI^bu3v+|WX@X4sQj9J730#U#NxubLQB`|q;x}Y4qS;)Fr)6ABE5;QM;B^G>(l? zMaBI$uMaS+gC#zl(&M-7#c_ZtWVQ3UFTy`>iu@gLh z>hIs8pYk0Xq7oaft7bA@inNBA)%8IcIbT#(K2W{K2neM`P(w*$x3NGm@t#eh^|$d{bz36}7pguV>0tJ4(U$+rrEJY_sv> z>I;h-Kd0rPQTscdTjV!M)X?m=W7cKD^a7N28nOJ`Ap0r=xyx`^ewpM6yYdk~ev5z%<_HSEbINR! z>I9ID`W7Xtro4v3sWX)TG3Nd;^hsDnmAy!;w>vxP}>z*y0@Ue*@)m zU=Jwk(afPU&rXd)OyvfBD(jQ{QHnInvXF_)-^#JCJPi~P0)d7hES1FW?@lX(AvXr8 z*!xpgaJ4MaU}ZUfP?)#0?l(B&qOFVUk8XCR-cj5?HI&lvH*VHSoxq|CW>)P|d|?}a ziK2?$c(&VErPQ&I)o8uLo7v)EdhGx*E8Oj(k}00>*{-WC7W+`Vw~tp&(d_v@_LugYo^<4 z1?nDf+-1vgnIsD}Y0}8ad=GU*oczo;1gUIR;>Qw@<(~Xk>}R!RW7UrMmxAIkrB_k8 zuGRF*xoAjoCPO{CChCi-84@8E;;lvMvmSHXsOd2H;3?*>uA!!Pu44C%(5xAAE=dMKitCTG5 z2aVJ4vXu;Wh_I@6Zou76!MJs%{n|de*2HNwFKVd-Cc$gf`6N)Ypc5I3yBsrOdq&^^F zqmRz$TiBswRJ$N!wqfV0_@Kl-VW2;uY%|t$pwiwC(zNsoMt`gBE`=D>h8^_$QMPUF zV?o+NcO9nvE=$Gy+lMRtPGEd;=>tshE-@Htx?#KysK%H@TwjC$YqGYt?3Y#9Nc3r_ zqNm7=Qa2l*j^U~f;2+)ds(kKB%>Jr*T@pK}NQM`UC^$++&17+2dTn?YkGvm*yT!DA z@rta->*ChxhJ8IwWayWE*yrim)E`@aA=NG%!-y19Q@uSl=qont zPP(awWL3bfr-!KUa4t?Ij%Jm6tfA)pe>iSGRGpNd-mOG?zPDtx$rxVbEWGe{IDKcl z@4fC@>H86sF8BoTrD!<##cSo;4cbd$wLCXa)8dQ3!-;TZZNoAinW!XP3&j=Lf!gg= zOi=o(Ggg|Gy!ukyBf4VIbv|;O=P+OVt{Trx)`EBW%J8V^MZsOir>*D;+yl5csRbj4 zZ`PeSvL{w1p4kEfQEN%Sz~sWlk-c4^u)%A}2dsR*qENzEnjFsz6WK86UrT|NzF<5l zZPUWqnnuMev4R!nz;a4B??`aQ6ERg^+&8|hZj(P9&DGM>78OFfxdnwn#&x51X+jr~ zD*yzM>r$a@)8+2rKw18xHB(oGfcECs4xw-t}vqM9QBpPiS-=k80YEG^O@%b?UHxZBc}F|@WNZ`Ckb+?j3;2Iu;taQX6gjEFq*!8#KOCzp@TvBjf01*>`gtjqZnD&ctg=GgKznF=o#Dz!3Iq7iH8gxgL8Vy3tk0= z#7hzUHcSP5N^-R657vXn+s(r6LRt%FEOOaOAn$vZDzbJ4tY6{N)$GUWMQ0Yh=r5k> zW}z8~u=~=Y_p;2Mf}0Es{=t{1Zo@B;E588P+aJ-PHdRNb?@Ty14#2bS=y&MsrkD`

<)+=6!6aZ@pGd4Xv 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 literal 0 HcmV?d00001 diff --git a/purchase_discount/models/__init__.py b/purchase_discount/models/__init__.py new file mode 100644 index 00000000000..b6ce0249f05 --- /dev/null +++ b/purchase_discount/models/__init__.py @@ -0,0 +1,3 @@ +from . import purchase_order +from . import product_supplierinfo +from . import res_partner diff --git a/purchase_discount/models/product_supplierinfo.py b/purchase_discount/models/product_supplierinfo.py new file mode 100644 index 00000000000..659047d9be2 --- /dev/null +++ b/purchase_discount/models/product_supplierinfo.py @@ -0,0 +1,52 @@ +# Copyright 2016 ACSONE SA/NV () +# Copyright 2014-2019 Tecnativa - Pedro M. Baeza +# License AGPL-3 - See http://www.gnu.org/licenses/agpl-3.0.html + +from odoo import api, fields, models + + +class ProductSupplierInfo(models.Model): + _inherit = "product.supplierinfo" + + discount = fields.Float( + string="Discount (%)", + digits="Discount", + compute="_compute_discount", + store=True, + readonly=False, + ) + + @api.depends("partner_id") + def _compute_discount(self): + """Apply the default supplier discount of the selected supplier""" + for record in self: + record.discount = record.partner_id.default_supplierinfo_discount + + _sql_constraints = [ + ( + "discount_limit", + "CHECK (discount <= 100.0)", + "Supplier discount must be lower than 100%.", + ) + ] + + @api.model + def _get_po_to_supplierinfo_synced_fields(self): + """Overwrite this method for adding other fields to be synchronized + with product.supplierinfo. + """ + return ["discount"] + + @api.model_create_multi + def create(self, vals_list): + """Insert discount (or others) from context from purchase.order's + _add_supplier_to_product method""" + for vals in vals_list: + product_tmpl_id = vals.get("product_tmpl_id") + po_line_map = self.env.context.get("po_line_map", {}) + if product_tmpl_id in po_line_map: + po_line = po_line_map[product_tmpl_id] + for field in self._get_po_to_supplierinfo_synced_fields(): + if not vals.get(field): + vals[field] = po_line[field] + return super().create(vals_list) diff --git a/purchase_discount/models/purchase_order.py b/purchase_discount/models/purchase_order.py new file mode 100644 index 00000000000..be1abcba13c --- /dev/null +++ b/purchase_discount/models/purchase_order.py @@ -0,0 +1,136 @@ +# Copyright 2004-2009 Tiny SPRL (). +# Copyright 2016 ACSONE SA/NV () +# Copyright 2015-2019 Tecnativa - Pedro M. Baeza +# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl). + + +from odoo import api, fields, models + + +class PurchaseOrder(models.Model): + _inherit = "purchase.order" + + def _add_supplier_to_product(self): + """Insert a mapping of products to PO lines to be picked up + in supplierinfo's create()""" + self.ensure_one() + po_line_map = { + line.product_id.product_tmpl_id.id: line for line in self.order_line + } + return super( + PurchaseOrder, self.with_context(po_line_map=po_line_map) + )._add_supplier_to_product() + + +class PurchaseOrderLine(models.Model): + _inherit = "purchase.order.line" + + # adding discount to depends + @api.depends("discount") + def _compute_amount(self): + return super()._compute_amount() + + def _convert_to_tax_base_line_dict(self): + # Inject the new price_unit with discount if there's any. There's an specific + # value in the dictionary for the discount, but we need to include it in the + # price unit for the stock move price unit valuation to be correct + vals = super()._convert_to_tax_base_line_dict() + vals["price_unit"] = self._get_discounted_price_unit() + return vals + + discount = fields.Float(string="Discount (%)", digits="Discount") + + _sql_constraints = [ + ( + "discount_limit", + "CHECK (discount <= 100.0)", + "Discount must be lower than 100%.", + ) + ] + + def _get_discounted_price_unit(self): + """Inheritable method for getting the unit price after applying + discount(s). + + :rtype: float + :return: Unit price after discount(s). + """ + self.ensure_one() + if self.discount: + return self.price_unit * (1 - self.discount / 100) + return self.price_unit + + def _compute_price_unit_and_date_planned_and_name(self): + """Get also the discount from the seller. Unfortunately, this requires to + select again the seller to be used, as there isn't any hook to use the already + selected one. + """ + res = super()._compute_price_unit_and_date_planned_and_name() + for line in self.filtered("product_id"): + seller = line.product_id._select_seller( + partner_id=line.partner_id, + quantity=line.product_qty, + date=line.order_id.date_order + and line.order_id.date_order.date() + or fields.Date.context_today(line), + uom_id=line.product_uom, + params={"order_id": line.order_id}, + ) + line._apply_value_from_seller(seller) + return res + + @api.model + def _apply_value_from_seller(self, seller): + """Overload this function to prepare other data from seller, + like in purchase_triple_discount module""" + if not seller: + return + self.discount = seller.discount + + def _prepare_account_move_line(self, move=False): + vals = super()._prepare_account_move_line(move) + if self.env["account.move.line"]._fields.get("discount1", False): + # OCA/account_invoice_triple_discount is installed + vals["discount1"] = self.discount + else: + vals["discount"] = self.discount + return vals + + @api.model + def _prepare_purchase_order_line( + self, product_id, product_qty, product_uom, company_id, supplier, po + ): + """Apply the discount to the created purchase order""" + res = super()._prepare_purchase_order_line( + product_id, product_qty, product_uom, company_id, supplier, po + ) + partner = supplier.partner_id + uom_po_qty = product_uom._compute_quantity(product_qty, product_id.uom_po_id) + seller = product_id.with_company(company_id)._select_seller( + partner_id=partner, + quantity=uom_po_qty, + date=po.date_order and po.date_order.date(), + uom_id=product_id.uom_po_id, + ) + res.update(self._prepare_purchase_order_line_from_seller(seller)) + return res + + @api.model + def _prepare_purchase_order_line_from_seller(self, seller): + """Overload this function to prepare other data from seller, + like in purchase_triple_discount module""" + if not seller: + return {} + return {"discount": seller.discount} + + def write(self, vals): + res = super().write(vals) + if "discount" in vals or "price_unit" in vals: + for line in self.filtered(lambda l: l.order_id.state == "purchase"): + # Avoid updating kit components' stock.move + moves = line.move_ids.filtered( + lambda s: s.state not in ("cancel", "done") + and s.product_id == line.product_id + ) + moves.write({"price_unit": line._get_discounted_price_unit()}) + return res diff --git a/purchase_discount/models/res_partner.py b/purchase_discount/models/res_partner.py new file mode 100644 index 00000000000..1c916abc9fb --- /dev/null +++ b/purchase_discount/models/res_partner.py @@ -0,0 +1,16 @@ +# Copyright 2016 GRAP (http://www.grap.coop) +# Sylvain LE GAL (https://twitter.com/legalsylvain) +# License AGPL-3 - See http://www.gnu.org/licenses/agpl-3.0.html + +from odoo import fields, models + + +class ResPartner(models.Model): + _inherit = "res.partner" + + default_supplierinfo_discount = fields.Float( + string="Default Supplier Discount (%)", + digits="Discount", + help="This value will be used as the default one, for each new" + " supplierinfo line depending on that supplier.", + ) diff --git a/purchase_discount/readme/CONTRIBUTORS.rst b/purchase_discount/readme/CONTRIBUTORS.rst new file mode 100644 index 00000000000..15204ad5066 --- /dev/null +++ b/purchase_discount/readme/CONTRIBUTORS.rst @@ -0,0 +1,16 @@ +* OpenERP S.A. +* Ignacio Ibeas +* Pedro M. Baeza +* Jonathan Nemry +* Sylvain LE GAL (https://twitter.com/legalsylvain) +* Stefan Rijnhart +* `Tecnativa `_: + + * Pedro M. Baeza + * Vicent Cubells + +* Sudhir Arya +* Lorenzo Battistini +* Luisa Miguéns +* Vishnu Vanneri +* Moaad Bourhim diff --git a/purchase_discount/readme/DESCRIPTION.rst b/purchase_discount/readme/DESCRIPTION.rst new file mode 100644 index 00000000000..d3b4685d1a7 --- /dev/null +++ b/purchase_discount/readme/DESCRIPTION.rst @@ -0,0 +1,26 @@ +This module allows to define a discount per line in the purchase orders. This +discount can be also negative, interpreting it as an increment. + +It also modifies the purchase order report to include the discount field in it. + +This module allows to input a discount in the supplier info form, and propagate +it to purchase order lines: + +* The discount appears explicitly in purchase orders instead of being directly + discounted in price. +* You can set prices and discounts on the same screen. + +.. image:: ../static/description/product_supplierinfo_form.png + + +* A new field default_supplierinfo_discount is added on res.partner model. + This value will be used as the default one, on each supplierinfo of that + supplier. + +.. image:: ../static/description/res_partner_company_form.png + + +Note: this setting is a new 'company' setting, unavailable for related +partners, as accounting-related Settings. + +.. image:: ../static/description/res_partner_individual_form.png diff --git a/purchase_discount/readme/ROADMAP.rst b/purchase_discount/readme/ROADMAP.rst new file mode 100644 index 00000000000..4a3497faea1 --- /dev/null +++ b/purchase_discount/readme/ROADMAP.rst @@ -0,0 +1,2 @@ +With this module, the *price_unit* field of purchase order line stores the gross price instead of the net price, which is a change in the meaning of +this field. So this module breaks all the other modules that use the *price_unit* field with it's native meaning. diff --git a/purchase_discount/readme/USAGE.rst b/purchase_discount/readme/USAGE.rst new file mode 100644 index 00000000000..1cd0d0b8278 --- /dev/null +++ b/purchase_discount/readme/USAGE.rst @@ -0,0 +1,7 @@ +Go to **Purchase > Products**, open one product, and edit or add a record on +the **Vendors** section of the **Purchase** tab. You will see in the prices +section in the down part a new column called **Discount (%)**. You can enter +here the desired discount for that quantity. + +When you make a purchase order for that supplier and that product, discount +will be put automatically. diff --git a/purchase_discount/report/__init__.py b/purchase_discount/report/__init__.py new file mode 100644 index 00000000000..84b6eef84ac --- /dev/null +++ b/purchase_discount/report/__init__.py @@ -0,0 +1 @@ +from . import purchase_report diff --git a/purchase_discount/report/purchase_report.py b/purchase_discount/report/purchase_report.py new file mode 100644 index 00000000000..11d021fa1ef --- /dev/null +++ b/purchase_discount/report/purchase_report.py @@ -0,0 +1,34 @@ +# Copyright 2017 Akretion (Alexis de Lattre ) +# Copyright 2017-2019 Tecnativa - Pedro M. Baeza +# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl). + +from odoo import fields, models + + +class PurchaseReport(models.Model): + _inherit = "purchase.report" + + discount = fields.Float( + string="Discount (%)", digits="Discount", group_operator="avg" + ) + + def _select(self): + res = super()._select() + # There are 3 matches + res = res.replace("l.price_unit", self._get_discounted_price_unit_exp()) + res += ", l.discount AS discount" + return res + + def _group_by(self): + res = super()._group_by() + res += ", l.discount" + return res + + def _get_discounted_price_unit_exp(self): + """Inheritable method for getting the SQL expression used for + calculating the unit price with discount(s). + + :rtype: str + :return: SQL expression for discounted unit price. + """ + return "(1.0 - COALESCE(l.discount, 0.0) / 100.0) * l.price_unit" diff --git a/purchase_discount/static/description/icon.png b/purchase_discount/static/description/icon.png new file mode 100644 index 0000000000000000000000000000000000000000..f2d227392def5f44d3d31e0c4adca851c7ead2d9 GIT binary patch literal 17935 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 KMNUMnLSTaHDY?l2 literal 0 HcmV?d00001 diff --git a/purchase_discount/static/description/icon.svg b/purchase_discount/static/description/icon.svg new file mode 100644 index 00000000000..2c20b1ac2c7 --- /dev/null +++ b/purchase_discount/static/description/icon.svg @@ -0,0 +1,2997 @@ + + + + + + image/svg+xml + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/purchase_discount/static/description/index.html b/purchase_discount/static/description/index.html new file mode 100644 index 00000000000..635b5a67b07 --- /dev/null +++ b/purchase_discount/static/description/index.html @@ -0,0 +1,483 @@ + + + + + +README.rst + + + +
+ + + +Odoo Community Association + +
+

Purchase order lines with discounts

+ +

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

+

This module allows to define a discount per line in the purchase orders. This +discount can be also negative, interpreting it as an increment.

+

It also modifies the purchase order report to include the discount field in it.

+

This module allows to input a discount in the supplier info form, and propagate +it to purchase order lines:

+
    +
  • The discount appears explicitly in purchase orders instead of being directly +discounted in price.
  • +
  • You can set prices and discounts on the same screen.
  • +
+https://raw.githubusercontent.com/OCA/purchase-workflow/16.0/purchase_discount/static/description/product_supplierinfo_form.png +
    +
  • A new field default_supplierinfo_discount is added on res.partner model. +This value will be used as the default one, on each supplierinfo of that +supplier.
  • +
+https://raw.githubusercontent.com/OCA/purchase-workflow/16.0/purchase_discount/static/description/res_partner_company_form.png +

Note: this setting is a new ‘company’ setting, unavailable for related +partners, as accounting-related Settings.

+https://raw.githubusercontent.com/OCA/purchase-workflow/16.0/purchase_discount/static/description/res_partner_individual_form.png +

Table of contents

+ +
+

Usage

+

Go to Purchase > Products, open one product, and edit or add a record on +the Vendors section of the Purchase tab. You will see in the prices +section in the down part a new column called Discount (%). You can enter +here the desired discount for that quantity.

+

When you make a purchase order for that supplier and that product, discount +will be put automatically.

+
+
+

Known issues / Roadmap

+

With this module, the price_unit field of purchase order line stores the gross price instead of the net price, which is a change in the meaning of +this field. So this module breaks all the other modules that use the price_unit field with it’s native meaning.

+
+
+

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

+
    +
  • Tiny
  • +
  • Acysos S.L.
  • +
  • Tecnativa
  • +
  • ACSONE SA/NV
  • +
  • GRAP
  • +
+
+
+

Contributors

+ +
+
+

Maintainers

+

This module is maintained by the OCA.

+ +Odoo Community Association + +

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

+

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

+

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

+
+
+
+
+ + diff --git a/purchase_discount/static/description/product_supplierinfo_form.png b/purchase_discount/static/description/product_supplierinfo_form.png new file mode 100644 index 0000000000000000000000000000000000000000..c115a32625873ecea53256b080c52d62edaa5dc5 GIT binary patch literal 23327 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 Pp$XJgw3W*qn}_@xsc1XA literal 0 HcmV?d00001 diff --git a/purchase_discount/static/description/res_partner_individual_form.png b/purchase_discount/static/description/res_partner_individual_form.png new file mode 100644 index 0000000000000000000000000000000000000000..84bd73d9c5d7d1016deb093bc4ff0c39707aeacb GIT binary patch literal 27942 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 ONk&3J{HLg4(EkBn&9A8d literal 0 HcmV?d00001 diff --git a/purchase_discount/tests/__init__.py b/purchase_discount/tests/__init__.py new file mode 100644 index 00000000000..e69f898f76c --- /dev/null +++ b/purchase_discount/tests/__init__.py @@ -0,0 +1,4 @@ +# License AGPL-3 - See http://www.gnu.org/licenses/agpl-3.0.html + +from . import test_product_supplierinfo_discount +from . import test_purchase_discount diff --git a/purchase_discount/tests/test_product_supplierinfo_discount.py b/purchase_discount/tests/test_product_supplierinfo_discount.py new file mode 100644 index 00000000000..fd1b2a234af --- /dev/null +++ b/purchase_discount/tests/test_product_supplierinfo_discount.py @@ -0,0 +1,171 @@ +# Copyright 2018 GRAP - Sylvain Legal +# Copyright 2019 Tecnativa - Pedro M. Baeza +# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl). + +from odoo import fields +from odoo.tests.common import Form, TransactionCase + +from odoo.addons.base.tests.common import DISABLED_MAIL_CONTEXT + + +class TestProductSupplierinfoDiscount(TransactionCase): + @classmethod + def setUpClass(cls): + super().setUpClass() + cls.env = cls.env(context=dict(cls.env.context, **DISABLED_MAIL_CONTEXT)) + cls.supplierinfo_model = cls.env["product.supplierinfo"] + cls.purchase_order_line_model = cls.env["purchase.order.line"] + cls.partner_1 = cls.env.ref("base.res_partner_1") + cls.partner_3 = cls.env.ref("base.res_partner_3") + cls.product = cls.env.ref("product.product_product_6") + cls.supplierinfo = cls.supplierinfo_model.create( + { + "min_qty": 0.0, + "partner_id": cls.partner_3.id, + "product_tmpl_id": cls.product.product_tmpl_id.id, + "discount": 10, + } + ) + cls.supplierinfo2 = cls.supplierinfo_model.create( + { + "min_qty": 10.0, + "partner_id": cls.partner_3.id, + "product_tmpl_id": cls.product.product_tmpl_id.id, + "discount": 20, + } + ) + cls.purchase_order = cls.env["purchase.order"].create( + {"partner_id": cls.partner_3.id} + ) + cls.po_line_1 = cls.purchase_order_line_model.create( + { + "order_id": cls.purchase_order.id, + "product_id": cls.product.id, + "date_planned": fields.Datetime.now(), + "name": "Test", + "product_qty": 1.0, + "product_uom": cls.env.ref("uom.product_uom_categ_unit").id, + "price_unit": 10.0, + } + ) + + def test_001_purchase_order_partner_3_qty_1(self): + purchase_form = Form(self.purchase_order) + with purchase_form.order_line.edit(0) as line: + line.product_qty = 1.0 + self.assertEqual( + line.discount, + 10, + "Incorrect discount for product 6 with partner 3 and qty 1: " + "Should be 10%", + ) + + def test_002_purchase_order_partner_3_qty_10(self): + purchase_form = Form(self.purchase_order) + with purchase_form.order_line.edit(0) as line: + line.product_qty = 10.0 + self.assertEqual( + line.discount, + 20.0, + "Incorrect discount for product 6 with partner 3 and qty 10: " + "Should be 20%", + ) + + def test_003_purchase_order_partner_1_qty_1(self): + purchase_form = Form(self.purchase_order) + purchase_form.partner_id = self.partner_1 + with purchase_form.order_line.edit(0) as line: + line.product_qty = 1 + self.assertEqual( + line.discount, + 0.0, + "Incorrect discount for product 6 with partner 1 and qty 1", + ) + + def test_004_prepare_purchase_order_line(self): + res = self.purchase_order_line_model._prepare_purchase_order_line( + self.product, + 50, + self.env.ref("uom.product_uom_unit"), + self.env.ref("base.main_company"), + self.supplierinfo, + self.purchase_order, + ) + self.assertTrue(res.get("discount"), "Should have a discount key") + + def test_005_default_supplierinfo_discount(self): + # Create an original supplierinfo + supplierinfo = self.supplierinfo_model.create( + { + "min_qty": 0.0, + "partner_id": self.partner_3.id, + "product_tmpl_id": self.product.product_tmpl_id.id, + "discount": 10, + } + ) + # Change the partner and raise onchange function + self.partner_1.default_supplierinfo_discount = 15 + with Form(supplierinfo) as supplierinfo_form: + supplierinfo_form.partner_id = self.partner_1 + self.assertEqual( + supplierinfo_form.discount, + 15, + "Incorrect discount for supplierinfo " + " after changing partner that has default discount defined.", + ) + + def test_006_supplierinfo_from_purchaseorder(self): + """Include discount when creating new sellers for a product""" + partner = self.env.ref("base.res_partner_3") + product = self.env.ref("product.product_product_8") + self.assertFalse( + self.supplierinfo_model.search( + [ + ("partner_id", "=", partner.id), + ("product_tmpl_id", "=", product.product_tmpl_id.id), + ] + ) + ) + order = self.env["purchase.order"].create({"partner_id": partner.id}) + self.purchase_order_line_model.create( + { + "date_planned": fields.Datetime.now(), + "discount": 40, + "name": product.name, + "price_unit": 10.0, + "product_id": product.id, + "product_qty": 1.0, + "product_uom": product.uom_po_id.id, + "order_id": order.id, + } + ) + order.button_confirm() + seller = self.supplierinfo_model.search( + [ + ("partner_id", "=", partner.id), + ("product_tmpl_id", "=", product.product_tmpl_id.id), + ] + ) + self.assertTrue(seller) + self.assertEqual(seller.discount, 40) + + def test_007_change_price_unit_autoupdate_stock_move(self): + partner = self.env.ref("base.res_partner_3") + product = self.env.ref("product.product_product_8") + order = self.env["purchase.order"].create({"partner_id": partner.id}) + self.purchase_order_line_model.create( + { + "date_planned": fields.Datetime.now(), + "discount": 40, + "name": product.name, + "price_unit": 10.0, + "product_id": product.id, + "product_qty": 1.0, + "product_uom": product.uom_po_id.id, + "order_id": order.id, + } + ) + order.button_confirm() + self.assertEqual(order.order_line.move_ids.price_unit, 6) + order.order_line.price_unit = 100 + self.assertEqual(order.order_line.move_ids.price_unit, 60) diff --git a/purchase_discount/tests/test_purchase_discount.py b/purchase_discount/tests/test_purchase_discount.py new file mode 100644 index 00000000000..3fb50857a77 --- /dev/null +++ b/purchase_discount/tests/test_purchase_discount.py @@ -0,0 +1,210 @@ +# Copyright 2016 ACSONE SA/NV () +# Copyright 2015-2019 Tecnativa - Pedro M. Baeza +# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl). + +from odoo import fields +from odoo.tests.common import Form, TransactionCase + +from odoo.addons.base.tests.common import DISABLED_MAIL_CONTEXT + + +class TestPurchaseOrder(TransactionCase): + @classmethod + def setUpClass(cls): + super(TestPurchaseOrder, cls).setUpClass() + cls.env = cls.env(context=dict(cls.env.context, **DISABLED_MAIL_CONTEXT)) + cls.categ_cost_average = cls.env["product.category"].create( + {"name": "Average cost method category", "property_cost_method": "average"} + ) + product_obj = cls.env["product.product"] + cls.product_1 = product_obj.create( + {"name": "Test product 1", "categ_id": cls.categ_cost_average.id} + ) + cls.product_2 = product_obj.create({"name": "Test product 2"}) + po_model = cls.env["purchase.order.line"] + currency_rate_model = cls.env["res.currency.rate"] + # Set the Exchange rate for the currency of the company to 1 + # to avoid issues with rates + latest_currency_rate_line = currency_rate_model.search( + [ + ("currency_id", "=", cls.env.user.company_id.currency_id.id), + ("name", "=", fields.Date.today()), + ], + limit=1, + ) + if latest_currency_rate_line and latest_currency_rate_line.rate != 1.0: + latest_currency_rate_line.rate = 1.0 + elif not latest_currency_rate_line: + currency_rate_model.create( + { + "currency_id": cls.env.user.company_id.currency_id.id, + "rate": 1.00, + "name": fields.Date.today(), + } + ) + cls.purchase_order = cls.env["purchase.order"].create( + {"partner_id": cls.env.ref("base.res_partner_3").id} + ) + cls.po_line_1 = po_model.create( + { + "order_id": cls.purchase_order.id, + "product_id": cls.product_1.id, + "date_planned": fields.Datetime.now(), + "name": "Test", + "product_qty": 1.0, + "product_uom": cls.product_1.uom_id.id, + "discount": 50.0, + "price_unit": 10.0, + "taxes_id": [], + } + ) + cls.account = cls.env["account.account"].create( + { + "name": "Test account", + "code": "TEST", + "account_type": "expense", + } + ) + cls.tax = cls.env["account.tax"].create( + { + "name": "Sample tax 15%", + "amount_type": "percent", + "type_tax_use": "purchase", + "amount": 15.0, + "invoice_repartition_line_ids": [ + (0, 0, {"factor_percent": 100, "repartition_type": "base"}), + ( + 0, + 0, + { + "factor_percent": 100, + "repartition_type": "tax", + "account_id": cls.account.id, + }, + ), + ], + } + ) + cls.po_line_2 = po_model.create( + { + "order_id": cls.purchase_order.id, + "product_id": cls.product_2.id, + "date_planned": fields.Datetime.now(), + "name": "Test", + "product_qty": 10.0, + "product_uom": cls.product_2.uom_id.id, + "discount": 30, + "taxes_id": [(6, 0, [cls.tax.id])], + "price_unit": 230.0, + } + ) + cls.po_line_3 = po_model.create( + { + "order_id": cls.purchase_order.id, + "product_id": cls.product_2.id, + "date_planned": fields.Datetime.now(), + "name": "Test", + "product_qty": 1.0, + "product_uom": cls.product_2.uom_id.id, + "discount": 0, + "taxes_id": [(6, 0, [cls.tax.id])], + "price_unit": 10.0, + } + ) + cls.po_line_4 = po_model.create( + { + "order_id": cls.purchase_order.id, + "display_type": "line_section", + "name": "Test Section", + "product_qty": 0.0, + "product_uom_qty": 0.0, + } + ) + + def test_purchase_order_vals(self): + self.assertEqual(self.po_line_1.price_subtotal, 5.0) + self.assertEqual(self.po_line_2.price_subtotal, 1610.0) + self.assertEqual(self.po_line_3.price_subtotal, 10.0) + self.assertEqual(self.purchase_order.amount_untaxed, 1625.0) + self.assertEqual(self.purchase_order.amount_tax, 243) + # Change price to launch a recalculation of totals + self.po_line_1.discount = 60 + self.assertEqual(self.po_line_1.price_subtotal, 4.0) + self.assertEqual(self.purchase_order.amount_untaxed, 1624.0) + self.assertEqual(self.purchase_order.amount_tax, 243) + + def test_move_price_unit(self): + self.purchase_order.button_confirm() + picking = self.purchase_order.picking_ids + moves = picking.move_ids + move1 = moves.filtered(lambda x: x.purchase_line_id == self.po_line_1) + self.assertEqual(move1.price_unit, 5) + move2 = moves.filtered(lambda x: x.purchase_line_id == self.po_line_2) + self.assertEqual(move2.price_unit, 161) + move3 = moves.filtered(lambda x: x.purchase_line_id == self.po_line_3) + self.assertEqual(move3.price_unit, 10) + # Confirm the picking to see the cost price + move1.move_line_ids.qty_done = 1 + picking._action_done() + self.assertAlmostEqual(self.product_1.standard_price, 5.0) + # Check data in PO remains the same - This is due to the hack + self.assertAlmostEqual(self.po_line_1.price_unit, 10.0) + self.assertAlmostEqual(self.po_line_1.discount, 50.0) + + def test_move_price_unit_discount_sync(self): + self.purchase_order.button_confirm() + picking = self.purchase_order.picking_ids + moves = picking.move_ids + self.po_line_1.discount = 25 + self.po_line_2.discount = 50 + self.po_line_3.discount = 10 + move1 = moves.filtered(lambda x: x.purchase_line_id == self.po_line_1) + self.assertEqual(move1.price_unit, 7.5) + move2 = moves.filtered(lambda x: x.purchase_line_id == self.po_line_2) + self.assertEqual(move2.price_unit, 115.0) + move3 = moves.filtered(lambda x: x.purchase_line_id == self.po_line_3) + self.assertEqual(move3.price_unit, 9.0) + self.po_line_1.price_unit = 1000 + self.po_line_2.price_unit = 500 + self.po_line_3.price_unit = 250 + move1 = moves.filtered(lambda x: x.purchase_line_id == self.po_line_1) + self.assertEqual(move1.price_unit, 750.0) + move2 = moves.filtered(lambda x: x.purchase_line_id == self.po_line_2) + self.assertEqual(move2.price_unit, 250.0) + move3 = moves.filtered(lambda x: x.purchase_line_id == self.po_line_3) + self.assertEqual(move3.price_unit, 225.0) + + def test_report_price_unit(self): + rec = self.env["purchase.report"].search( + [("product_id", "=", self.product_1.id)] + ) + self.assertEqual(rec.price_total, 5) + self.assertEqual(rec.discount, 50) + + def test_no_product(self): + purchase_form = Form(self.purchase_order) + with purchase_form.order_line.edit(3) as line: + line.product_qty = 0.0 + self.assertEqual(self.po_line_4.discount, 0.0) + + def test_invoice(self): + invoice = self.env["account.move"].new( + { + "move_type": "out_invoice", + "partner_id": self.env.ref("base.res_partner_3").id, + "purchase_id": self.purchase_order.id, + } + ) + invoice._onchange_purchase_auto_complete() + line = invoice.invoice_line_ids.filtered( + lambda x: x.purchase_line_id == self.po_line_1 + ) + self.assertAlmostEqual(line.discount, 50) + line = invoice.invoice_line_ids.filtered( + lambda x: x.purchase_line_id == self.po_line_2 + ) + self.assertAlmostEqual(line.discount, 30) + line = invoice.invoice_line_ids.filtered( + lambda x: x.purchase_line_id == self.po_line_3 + ) + self.assertAlmostEqual(line.discount, 0) diff --git a/purchase_discount/views/product_supplierinfo_view.xml b/purchase_discount/views/product_supplierinfo_view.xml new file mode 100644 index 00000000000..2f92c9a5e8a --- /dev/null +++ b/purchase_discount/views/product_supplierinfo_view.xml @@ -0,0 +1,20 @@ + + + product.supplierinfo + + + + + + + + + product.supplierinfo + + + + + + + + diff --git a/purchase_discount/views/purchase_discount_view.xml b/purchase_discount/views/purchase_discount_view.xml new file mode 100644 index 00000000000..ed30966ac1d --- /dev/null +++ b/purchase_discount/views/purchase_discount_view.xml @@ -0,0 +1,45 @@ + + + + purchase_discount.order.line.form2 + purchase.order.line + + 99 + + + + + + + + purchase_discount.order.line.tree + purchase.order.line + + 99 + + + + + + + + purchase_discount.purchase.order.form + purchase.order + + + + + + + + + purchase_discount.history.tree + purchase.order.line + + + + + + + + diff --git a/purchase_discount/views/report_purchaseorder.xml b/purchase_discount/views/report_purchaseorder.xml new file mode 100644 index 00000000000..5373bf5f507 --- /dev/null +++ b/purchase_discount/views/report_purchaseorder.xml @@ -0,0 +1,18 @@ + + + + diff --git a/purchase_discount/views/res_partner_view.xml b/purchase_discount/views/res_partner_view.xml new file mode 100644 index 00000000000..3b78e7b227b --- /dev/null +++ b/purchase_discount/views/res_partner_view.xml @@ -0,0 +1,26 @@ + + + res.partner + + + + +
+

Discount-related settings are managed on

+
+
+
+
diff --git a/purchase_triple_discount/README.rst b/purchase_triple_discount/README.rst new file mode 100644 index 00000000000..717f6e122d7 --- /dev/null +++ b/purchase_triple_discount/README.rst @@ -0,0 +1,113 @@ +============================== +Purchase Order Triple Discount +============================== + +.. + !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! + !! This file is generated by oca-gen-addon-readme !! + !! changes will be overwritten. !! + !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! + !! source digest: sha256:a7600cd86ba72c2ffbc98012b8a6606ea99fbbbee0cf586e9734c5c276d85fb8 + !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! + +.. |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%2Fpurchase--workflow-lightgray.png?logo=github + :target: https://github.com/OCA/purchase-workflow/tree/16.0/purchase_triple_discount + :alt: OCA/purchase-workflow +.. |badge4| image:: https://img.shields.io/badge/weblate-Translate%20me-F47D42.png + :target: https://translation.odoo-community.org/projects/purchase-workflow-16-0/purchase-workflow-16-0-purchase_triple_discount + :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/purchase-workflow&target_branch=16.0 + :alt: Try me on Runboat + +|badge1| |badge2| |badge3| |badge4| |badge5| + +This module allows to have three successive discounts on every purchase order +line. + +**Table of contents** + +.. contents:: + :local: + +Usage +===== + +Create a new purchase order and add discounts in any of the three discount +fields given. They go in order of precedence so discount 2 will be calculated +over discount 1 and discount 3 over the result of discount 2. For example, +let's divide by two on every discount: + +Unit price: 600.00 -> + + - Disc. 1 = 50% -> Amount = 300.00 + - Disc. 2 = 50% -> Amount = 150.00 + - Disc. 3 = 50% -> Amount = 75.00 + +You can also use negative values to charge instead of discount: + +Unit price: 600.00 -> + + - Disc. 1 = 50% -> Amount = 300.00 + - Disc. 2 = -5% -> Amount = 315.00 + +* When the purchase order is validated, the discounts will be added to the + corresponding vendor pricelist. +* Vendor pricelists can be edited as well with their corresponding new second + and third discounts. +* A default second or third discount can be set in every vendor + *Sale & Purchases* tab. + +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 +* GRAP + +Contributors +~~~~~~~~~~~~ + +* `Tecnativa `_: + + * David Vidal + * Pedro M. Baeza + +* Sylvain LE GAL (https://twitter.com/legalsylvain) +* `ForgeFlow S.L. `_: + * Christopher Ormaza + +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. + +This module is part of the `OCA/purchase-workflow `_ project on GitHub. + +You are welcome to contribute. To learn how please visit https://odoo-community.org/page/Contribute. diff --git a/purchase_triple_discount/__init__.py b/purchase_triple_discount/__init__.py new file mode 100644 index 00000000000..6fe184a1484 --- /dev/null +++ b/purchase_triple_discount/__init__.py @@ -0,0 +1,3 @@ +from . import models +from . import report +from .hooks import post_init_hook diff --git a/purchase_triple_discount/__manifest__.py b/purchase_triple_discount/__manifest__.py new file mode 100644 index 00000000000..9b1ef29a953 --- /dev/null +++ b/purchase_triple_discount/__manifest__.py @@ -0,0 +1,23 @@ +# Copyright 2017 Tecnativa - David Vidal +# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl). +{ + "name": "Purchase Order Triple Discount", + "version": "18.0.1.0.0", + "category": "Purchase Management", + "author": "Tecnativa," "GRAP," "Odoo Community Association (OCA)","Roberto Zanardo" + "website": "https://github.com/OCA/purchase-workflow", + "license": "AGPL-3", + "summary": "Manage triple discount on purchase order lines", + "depends": [ + "purchase_discount", + "account_invoice_triple_discount", + ], + "data": [ + "views/purchase_order_report.xml", + "views/product_supplierinfo_view.xml", + "views/purchase_view.xml", + "views/res_partner_view.xml", + ], + "installable": True, + "post_init_hook": "post_init_hook", +} diff --git a/purchase_triple_discount/hooks.py b/purchase_triple_discount/hooks.py new file mode 100644 index 00000000000..e9c9f6bcd28 --- /dev/null +++ b/purchase_triple_discount/hooks.py @@ -0,0 +1,26 @@ +# Copyright 2024-Today - Sylvain Le GAL (GRAP) +# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl). + +import logging + +_logger = logging.getLogger(__name__) + + +def post_init_hook(env): + cr = env.cr + _logger.info("Initializing column discount1 on table purchase_order_line") + cr.execute( + """ + UPDATE purchase_order_line + SET discount1 = discount + WHERE discount != 0 + """ + ) + _logger.info("Initializing column discount1 on table product_supplierinfo") + cr.execute( + """ + UPDATE product_supplierinfo + SET discount1 = discount + WHERE discount != 0 + """ + ) diff --git a/purchase_triple_discount/i18n/de.po b/purchase_triple_discount/i18n/de.po new file mode 100644 index 00000000000..7f61b316e64 --- /dev/null +++ b/purchase_triple_discount/i18n/de.po @@ -0,0 +1,121 @@ +# Translation of Odoo Server. +# This file contains the translation of the following modules: +# * purchase_triple_discount +# +# Translators: +# OCA Transbot , 2017 +msgid "" +msgstr "" +"Project-Id-Version: Odoo Server 10.0\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2017-11-24 07:53+0000\n" +"PO-Revision-Date: 2017-11-24 07:53+0000\n" +"Last-Translator: OCA Transbot , 2017\n" +"Language-Team: German (https://www.transifex.com/oca/teams/23907/de/)\n" +"Language: de\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" + +#. module: purchase_triple_discount +#: model_terms:ir.ui.view,arch_db:purchase_triple_discount.report_purchaseorder_document_triple_discount +msgid "Disc. 1 (%)" +msgstr "" + +#. module: purchase_triple_discount +#: model_terms:ir.ui.view,arch_db:purchase_triple_discount.report_purchaseorder_document_triple_discount +msgid "Disc. 2 (%)" +msgstr "" + +#. module: purchase_triple_discount +#: model_terms:ir.ui.view,arch_db:purchase_triple_discount.report_purchaseorder_document_triple_discount +msgid "Disc. 3 (%)" +msgstr "" + +#. module: purchase_triple_discount +#: model:ir.model,name:purchase_triple_discount.model_res_partner +msgid "Contact" +msgstr "" + +#. module: purchase_triple_discount +#: model:ir.model.fields,field_description:purchase_triple_discount.field_res_partner__default_supplierinfo_discount1 +#: model:ir.model.fields,field_description:purchase_triple_discount.field_res_users__default_supplierinfo_discount1 +msgid "Default Supplier Discount 1 (%)" +msgstr "" + +#. module: purchase_triple_discount +#: model:ir.model.fields,field_description:purchase_triple_discount.field_res_partner__default_supplierinfo_discount2 +#: model:ir.model.fields,field_description:purchase_triple_discount.field_res_users__default_supplierinfo_discount2 +msgid "Default Supplier Discount 2 (%)" +msgstr "" + +#. module: purchase_triple_discount +#: model:ir.model.fields,field_description:purchase_triple_discount.field_res_partner__default_supplierinfo_discount3 +#: model:ir.model.fields,field_description:purchase_triple_discount.field_res_users__default_supplierinfo_discount3 +msgid "Default Supplier Discount 3 (%)" +msgstr "" + +#. module: purchase_triple_discount +#: model:ir.model.fields,field_description:purchase_triple_discount.field_product_supplierinfo__discount +#: model:ir.model.fields,field_description:purchase_triple_discount.field_purchase_order_line__discount +msgid "Discount (%)" +msgstr "" + +#. module: purchase_triple_discount +#: model:ir.model.fields,field_description:purchase_triple_discount.field_product_supplierinfo__discount1 +#: model:ir.model.fields,field_description:purchase_triple_discount.field_purchase_order_line__discount1 +#: model:ir.model.fields,field_description:purchase_triple_discount.field_purchase_report__discount1 +msgid "Discount 1 (%)" +msgstr "" + +#. module: purchase_triple_discount +#: model:ir.model.fields,field_description:purchase_triple_discount.field_product_supplierinfo__discount2 +#: model:ir.model.fields,field_description:purchase_triple_discount.field_purchase_order_line__discount2 +#: model:ir.model.fields,field_description:purchase_triple_discount.field_purchase_report__discount2 +msgid "Discount 2 (%)" +msgstr "" + +#. module: purchase_triple_discount +#: model:ir.model.fields,field_description:purchase_triple_discount.field_product_supplierinfo__discount3 +#: model:ir.model.fields,field_description:purchase_triple_discount.field_purchase_order_line__discount3 +#: model:ir.model.fields,field_description:purchase_triple_discount.field_purchase_report__discount3 +msgid "Discount 3 (%)" +msgstr "" + +#. module: purchase_triple_discount +#: model:ir.model,name:purchase_triple_discount.model_purchase_order_line +msgid "Purchase Order Line" +msgstr "Bestellposition" + +#. module: purchase_triple_discount +#: model:ir.model,name:purchase_triple_discount.model_purchase_report +#, fuzzy +msgid "Purchase Report" +msgstr "Bestellposition" + +#. module: purchase_triple_discount +#: model:ir.model,name:purchase_triple_discount.model_product_supplierinfo +msgid "Supplier Pricelist" +msgstr "" + +#. module: purchase_triple_discount +#: model:ir.model.fields,help:purchase_triple_discount.field_res_partner__default_supplierinfo_discount1 +#: model:ir.model.fields,help:purchase_triple_discount.field_res_partner__default_supplierinfo_discount2 +#: model:ir.model.fields,help:purchase_triple_discount.field_res_partner__default_supplierinfo_discount3 +#: model:ir.model.fields,help:purchase_triple_discount.field_res_users__default_supplierinfo_discount1 +#: model:ir.model.fields,help:purchase_triple_discount.field_res_users__default_supplierinfo_discount2 +#: model:ir.model.fields,help:purchase_triple_discount.field_res_users__default_supplierinfo_discount3 +msgid "" +"This value will be used as the default one, for each new supplierinfo line " +"depending on that supplier." +msgstr "" + +#. module: purchase_triple_discount +#: model:ir.model.fields,field_description:purchase_triple_discount.field_purchase_report__discount +#: model_terms:ir.ui.view,arch_db:purchase_triple_discount.product_supplierinfo_form_view +#: model_terms:ir.ui.view,arch_db:purchase_triple_discount.product_supplierinfo_tree_view +#: model_terms:ir.ui.view,arch_db:purchase_triple_discount.purchase_order_triple_discount_form_view +#: model_terms:ir.ui.view,arch_db:purchase_triple_discount.res_partner_form_view +msgid "Total discount" +msgstr "" diff --git a/purchase_triple_discount/i18n/es.po b/purchase_triple_discount/i18n/es.po new file mode 100644 index 00000000000..03fa6e10f5c --- /dev/null +++ b/purchase_triple_discount/i18n/es.po @@ -0,0 +1,135 @@ +# Translation of Odoo Server. +# This file contains the translation of the following modules: +# * purchase_triple_discount +# +# Translators: +# OCA Transbot , 2017 +msgid "" +msgstr "" +"Project-Id-Version: Odoo Server 10.0\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2017-11-24 07:53+0000\n" +"PO-Revision-Date: 2023-07-17 20:10+0000\n" +"Last-Translator: Ivorra78 \n" +"Language-Team: Spanish (https://www.transifex.com/oca/teams/23907/es/)\n" +"Language: es\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: purchase_triple_discount +#: model_terms:ir.ui.view,arch_db:purchase_triple_discount.report_purchaseorder_document_triple_discount +msgid "Disc. 1 (%)" +msgstr "" + +#. module: purchase_triple_discount +#: model_terms:ir.ui.view,arch_db:purchase_triple_discount.report_purchaseorder_document_triple_discount +msgid "Disc. 2 (%)" +msgstr "Descuento. 2 (%)" + +#. module: purchase_triple_discount +#: model_terms:ir.ui.view,arch_db:purchase_triple_discount.report_purchaseorder_document_triple_discount +msgid "Disc. 3 (%)" +msgstr "Descuento. 3 (%)" + +#. module: purchase_triple_discount +#: model:ir.model,name:purchase_triple_discount.model_res_partner +msgid "Contact" +msgstr "Contacto" + +#. module: purchase_triple_discount +#: model:ir.model.fields,field_description:purchase_triple_discount.field_res_partner__default_supplierinfo_discount1 +#: model:ir.model.fields,field_description:purchase_triple_discount.field_res_users__default_supplierinfo_discount1 +msgid "Default Supplier Discount 1 (%)" +msgstr "" + +#. module: purchase_triple_discount +#: model:ir.model.fields,field_description:purchase_triple_discount.field_res_partner__default_supplierinfo_discount2 +#: model:ir.model.fields,field_description:purchase_triple_discount.field_res_users__default_supplierinfo_discount2 +msgid "Default Supplier Discount 2 (%)" +msgstr "Descuento por defecto al proveedor 2 (%)" + +#. module: purchase_triple_discount +#: model:ir.model.fields,field_description:purchase_triple_discount.field_res_partner__default_supplierinfo_discount3 +#: model:ir.model.fields,field_description:purchase_triple_discount.field_res_users__default_supplierinfo_discount3 +msgid "Default Supplier Discount 3 (%)" +msgstr "Descuento por defecto al proveedor 3 (%)" + +#. module: purchase_triple_discount +#: model:ir.model.fields,field_description:purchase_triple_discount.field_product_supplierinfo__discount +#: model:ir.model.fields,field_description:purchase_triple_discount.field_purchase_order_line__discount +msgid "Discount (%)" +msgstr "" + +#. module: purchase_triple_discount +#: model:ir.model.fields,field_description:purchase_triple_discount.field_product_supplierinfo__discount1 +#: model:ir.model.fields,field_description:purchase_triple_discount.field_purchase_order_line__discount1 +#: model:ir.model.fields,field_description:purchase_triple_discount.field_purchase_report__discount1 +msgid "Discount 1 (%)" +msgstr "" + +#. module: purchase_triple_discount +#: model:ir.model.fields,field_description:purchase_triple_discount.field_product_supplierinfo__discount2 +#: model:ir.model.fields,field_description:purchase_triple_discount.field_purchase_order_line__discount2 +#: model:ir.model.fields,field_description:purchase_triple_discount.field_purchase_report__discount2 +msgid "Discount 2 (%)" +msgstr "Descuento 2 (%)" + +#. module: purchase_triple_discount +#: model:ir.model.fields,field_description:purchase_triple_discount.field_product_supplierinfo__discount3 +#: model:ir.model.fields,field_description:purchase_triple_discount.field_purchase_order_line__discount3 +#: model:ir.model.fields,field_description:purchase_triple_discount.field_purchase_report__discount3 +msgid "Discount 3 (%)" +msgstr "Descuento 3 (%)" + +#. module: purchase_triple_discount +#: model:ir.model,name:purchase_triple_discount.model_purchase_order_line +msgid "Purchase Order Line" +msgstr "Línea orden de compra" + +#. module: purchase_triple_discount +#: model:ir.model,name:purchase_triple_discount.model_purchase_report +msgid "Purchase Report" +msgstr "Informe de compra" + +#. module: purchase_triple_discount +#: model:ir.model,name:purchase_triple_discount.model_product_supplierinfo +msgid "Supplier Pricelist" +msgstr "Lista de precios para proveedores" + +#. module: purchase_triple_discount +#: model:ir.model.fields,help:purchase_triple_discount.field_res_partner__default_supplierinfo_discount1 +#: model:ir.model.fields,help:purchase_triple_discount.field_res_partner__default_supplierinfo_discount2 +#: model:ir.model.fields,help:purchase_triple_discount.field_res_partner__default_supplierinfo_discount3 +#: model:ir.model.fields,help:purchase_triple_discount.field_res_users__default_supplierinfo_discount1 +#: model:ir.model.fields,help:purchase_triple_discount.field_res_users__default_supplierinfo_discount2 +#: model:ir.model.fields,help:purchase_triple_discount.field_res_users__default_supplierinfo_discount3 +msgid "" +"This value will be used as the default one, for each new supplierinfo line " +"depending on that supplier." +msgstr "" +"Este valor se utilizará como valor por defecto, para cada nueva línea de " +"información del proveedor que dependa de ese proveedor." + +#. module: purchase_triple_discount +#: model:ir.model.fields,field_description:purchase_triple_discount.field_purchase_report__discount +#: model_terms:ir.ui.view,arch_db:purchase_triple_discount.product_supplierinfo_form_view +#: model_terms:ir.ui.view,arch_db:purchase_triple_discount.product_supplierinfo_tree_view +#: model_terms:ir.ui.view,arch_db:purchase_triple_discount.purchase_order_triple_discount_form_view +#: model_terms:ir.ui.view,arch_db:purchase_triple_discount.res_partner_form_view +msgid "Total discount" +msgstr "" + +#~ msgid "Discount 2 must be lower than 100%." +#~ msgstr "El descuento 2 debe ser inferior al 100%." + +#~ msgid "Discount 3 must be lower than 100%." +#~ msgstr "El descuento 3 debe ser inferior al 100%." + +#~ msgid "Disc. 2 (%)" +#~ msgstr "Descuento. 2 (%)" + +#~ msgid "Disc. 3 (%)" +#~ msgstr "Descuento. 3 (%)" diff --git a/purchase_triple_discount/i18n/es_MX.po b/purchase_triple_discount/i18n/es_MX.po new file mode 100644 index 00000000000..10e7b32c289 --- /dev/null +++ b/purchase_triple_discount/i18n/es_MX.po @@ -0,0 +1,122 @@ +# Translation of Odoo Server. +# This file contains the translation of the following modules: +# * purchase_triple_discount +# +# Translators: +# OCA Transbot , 2017 +msgid "" +msgstr "" +"Project-Id-Version: Odoo Server 10.0\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2017-11-24 07:53+0000\n" +"PO-Revision-Date: 2017-11-24 07:53+0000\n" +"Last-Translator: OCA Transbot , 2017\n" +"Language-Team: Spanish (Mexico) (https://www.transifex.com/oca/teams/23907/" +"es_MX/)\n" +"Language: es_MX\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" + +#. module: purchase_triple_discount +#: model_terms:ir.ui.view,arch_db:purchase_triple_discount.report_purchaseorder_document_triple_discount +msgid "Disc. 1 (%)" +msgstr "" + +#. module: purchase_triple_discount +#: model_terms:ir.ui.view,arch_db:purchase_triple_discount.report_purchaseorder_document_triple_discount +msgid "Disc. 2 (%)" +msgstr "" + +#. module: purchase_triple_discount +#: model_terms:ir.ui.view,arch_db:purchase_triple_discount.report_purchaseorder_document_triple_discount +msgid "Disc. 3 (%)" +msgstr "" + +#. module: purchase_triple_discount +#: model:ir.model,name:purchase_triple_discount.model_res_partner +msgid "Contact" +msgstr "" + +#. module: purchase_triple_discount +#: model:ir.model.fields,field_description:purchase_triple_discount.field_res_partner__default_supplierinfo_discount1 +#: model:ir.model.fields,field_description:purchase_triple_discount.field_res_users__default_supplierinfo_discount1 +msgid "Default Supplier Discount 1 (%)" +msgstr "" + +#. module: purchase_triple_discount +#: model:ir.model.fields,field_description:purchase_triple_discount.field_res_partner__default_supplierinfo_discount2 +#: model:ir.model.fields,field_description:purchase_triple_discount.field_res_users__default_supplierinfo_discount2 +msgid "Default Supplier Discount 2 (%)" +msgstr "" + +#. module: purchase_triple_discount +#: model:ir.model.fields,field_description:purchase_triple_discount.field_res_partner__default_supplierinfo_discount3 +#: model:ir.model.fields,field_description:purchase_triple_discount.field_res_users__default_supplierinfo_discount3 +msgid "Default Supplier Discount 3 (%)" +msgstr "" + +#. module: purchase_triple_discount +#: model:ir.model.fields,field_description:purchase_triple_discount.field_product_supplierinfo__discount +#: model:ir.model.fields,field_description:purchase_triple_discount.field_purchase_order_line__discount +msgid "Discount (%)" +msgstr "" + +#. module: purchase_triple_discount +#: model:ir.model.fields,field_description:purchase_triple_discount.field_product_supplierinfo__discount1 +#: model:ir.model.fields,field_description:purchase_triple_discount.field_purchase_order_line__discount1 +#: model:ir.model.fields,field_description:purchase_triple_discount.field_purchase_report__discount1 +msgid "Discount 1 (%)" +msgstr "" + +#. module: purchase_triple_discount +#: model:ir.model.fields,field_description:purchase_triple_discount.field_product_supplierinfo__discount2 +#: model:ir.model.fields,field_description:purchase_triple_discount.field_purchase_order_line__discount2 +#: model:ir.model.fields,field_description:purchase_triple_discount.field_purchase_report__discount2 +msgid "Discount 2 (%)" +msgstr "" + +#. module: purchase_triple_discount +#: model:ir.model.fields,field_description:purchase_triple_discount.field_product_supplierinfo__discount3 +#: model:ir.model.fields,field_description:purchase_triple_discount.field_purchase_order_line__discount3 +#: model:ir.model.fields,field_description:purchase_triple_discount.field_purchase_report__discount3 +msgid "Discount 3 (%)" +msgstr "" + +#. module: purchase_triple_discount +#: model:ir.model,name:purchase_triple_discount.model_purchase_order_line +msgid "Purchase Order Line" +msgstr "Línea de orden de compra" + +#. module: purchase_triple_discount +#: model:ir.model,name:purchase_triple_discount.model_purchase_report +#, fuzzy +msgid "Purchase Report" +msgstr "Línea de orden de compra" + +#. module: purchase_triple_discount +#: model:ir.model,name:purchase_triple_discount.model_product_supplierinfo +msgid "Supplier Pricelist" +msgstr "" + +#. module: purchase_triple_discount +#: model:ir.model.fields,help:purchase_triple_discount.field_res_partner__default_supplierinfo_discount1 +#: model:ir.model.fields,help:purchase_triple_discount.field_res_partner__default_supplierinfo_discount2 +#: model:ir.model.fields,help:purchase_triple_discount.field_res_partner__default_supplierinfo_discount3 +#: model:ir.model.fields,help:purchase_triple_discount.field_res_users__default_supplierinfo_discount1 +#: model:ir.model.fields,help:purchase_triple_discount.field_res_users__default_supplierinfo_discount2 +#: model:ir.model.fields,help:purchase_triple_discount.field_res_users__default_supplierinfo_discount3 +msgid "" +"This value will be used as the default one, for each new supplierinfo line " +"depending on that supplier." +msgstr "" + +#. module: purchase_triple_discount +#: model:ir.model.fields,field_description:purchase_triple_discount.field_purchase_report__discount +#: model_terms:ir.ui.view,arch_db:purchase_triple_discount.product_supplierinfo_form_view +#: model_terms:ir.ui.view,arch_db:purchase_triple_discount.product_supplierinfo_tree_view +#: model_terms:ir.ui.view,arch_db:purchase_triple_discount.purchase_order_triple_discount_form_view +#: model_terms:ir.ui.view,arch_db:purchase_triple_discount.res_partner_form_view +msgid "Total discount" +msgstr "" diff --git a/purchase_triple_discount/i18n/es_PE.po b/purchase_triple_discount/i18n/es_PE.po new file mode 100644 index 00000000000..75583bf0eba --- /dev/null +++ b/purchase_triple_discount/i18n/es_PE.po @@ -0,0 +1,125 @@ +# Translation of Odoo Server. +# This file contains the translation of the following modules: +# * purchase_triple_discount +# +# Translators: +# Henry Garcia , 2017 +msgid "" +msgstr "" +"Project-Id-Version: Odoo Server 10.0\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2017-11-24 07:53+0000\n" +"PO-Revision-Date: 2017-11-24 07:53+0000\n" +"Last-Translator: Henry Garcia , 2017\n" +"Language-Team: Spanish (Peru) (https://www.transifex.com/oca/teams/23907/" +"es_PE/)\n" +"Language: es_PE\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" + +#. module: purchase_triple_discount +#: model_terms:ir.ui.view,arch_db:purchase_triple_discount.report_purchaseorder_document_triple_discount +msgid "Disc. 1 (%)" +msgstr "" + +#. module: purchase_triple_discount +#: model_terms:ir.ui.view,arch_db:purchase_triple_discount.report_purchaseorder_document_triple_discount +msgid "Disc. 2 (%)" +msgstr "" + +#. module: purchase_triple_discount +#: model_terms:ir.ui.view,arch_db:purchase_triple_discount.report_purchaseorder_document_triple_discount +msgid "Disc. 3 (%)" +msgstr "" + +#. module: purchase_triple_discount +#: model:ir.model,name:purchase_triple_discount.model_res_partner +msgid "Contact" +msgstr "" + +#. module: purchase_triple_discount +#: model:ir.model.fields,field_description:purchase_triple_discount.field_res_partner__default_supplierinfo_discount1 +#: model:ir.model.fields,field_description:purchase_triple_discount.field_res_users__default_supplierinfo_discount1 +msgid "Default Supplier Discount 1 (%)" +msgstr "" + +#. module: purchase_triple_discount +#: model:ir.model.fields,field_description:purchase_triple_discount.field_res_partner__default_supplierinfo_discount2 +#: model:ir.model.fields,field_description:purchase_triple_discount.field_res_users__default_supplierinfo_discount2 +msgid "Default Supplier Discount 2 (%)" +msgstr "" + +#. module: purchase_triple_discount +#: model:ir.model.fields,field_description:purchase_triple_discount.field_res_partner__default_supplierinfo_discount3 +#: model:ir.model.fields,field_description:purchase_triple_discount.field_res_users__default_supplierinfo_discount3 +msgid "Default Supplier Discount 3 (%)" +msgstr "" + +#. module: purchase_triple_discount +#: model:ir.model.fields,field_description:purchase_triple_discount.field_product_supplierinfo__discount +#: model:ir.model.fields,field_description:purchase_triple_discount.field_purchase_order_line__discount +msgid "Discount (%)" +msgstr "" + +#. module: purchase_triple_discount +#: model:ir.model.fields,field_description:purchase_triple_discount.field_product_supplierinfo__discount1 +#: model:ir.model.fields,field_description:purchase_triple_discount.field_purchase_order_line__discount1 +#: model:ir.model.fields,field_description:purchase_triple_discount.field_purchase_report__discount1 +msgid "Discount 1 (%)" +msgstr "" + +#. module: purchase_triple_discount +#: model:ir.model.fields,field_description:purchase_triple_discount.field_product_supplierinfo__discount2 +#: model:ir.model.fields,field_description:purchase_triple_discount.field_purchase_order_line__discount2 +#: model:ir.model.fields,field_description:purchase_triple_discount.field_purchase_report__discount2 +msgid "Discount 2 (%)" +msgstr "" + +#. module: purchase_triple_discount +#: model:ir.model.fields,field_description:purchase_triple_discount.field_product_supplierinfo__discount3 +#: model:ir.model.fields,field_description:purchase_triple_discount.field_purchase_order_line__discount3 +#: model:ir.model.fields,field_description:purchase_triple_discount.field_purchase_report__discount3 +msgid "Discount 3 (%)" +msgstr "" + +#. module: purchase_triple_discount +#: model:ir.model,name:purchase_triple_discount.model_purchase_order_line +msgid "Purchase Order Line" +msgstr "Linea de orden de compra" + +#. module: purchase_triple_discount +#: model:ir.model,name:purchase_triple_discount.model_purchase_report +#, fuzzy +msgid "Purchase Report" +msgstr "Linea de orden de compra" + +#. module: purchase_triple_discount +#: model:ir.model,name:purchase_triple_discount.model_product_supplierinfo +msgid "Supplier Pricelist" +msgstr "" + +#. module: purchase_triple_discount +#: model:ir.model.fields,help:purchase_triple_discount.field_res_partner__default_supplierinfo_discount1 +#: model:ir.model.fields,help:purchase_triple_discount.field_res_partner__default_supplierinfo_discount2 +#: model:ir.model.fields,help:purchase_triple_discount.field_res_partner__default_supplierinfo_discount3 +#: model:ir.model.fields,help:purchase_triple_discount.field_res_users__default_supplierinfo_discount1 +#: model:ir.model.fields,help:purchase_triple_discount.field_res_users__default_supplierinfo_discount2 +#: model:ir.model.fields,help:purchase_triple_discount.field_res_users__default_supplierinfo_discount3 +msgid "" +"This value will be used as the default one, for each new supplierinfo line " +"depending on that supplier." +msgstr "" + +#. module: purchase_triple_discount +#: model:ir.model.fields,field_description:purchase_triple_discount.field_purchase_report__discount +#: model_terms:ir.ui.view,arch_db:purchase_triple_discount.product_supplierinfo_form_view +#: model_terms:ir.ui.view,arch_db:purchase_triple_discount.product_supplierinfo_tree_view +#: model_terms:ir.ui.view,arch_db:purchase_triple_discount.purchase_order_triple_discount_form_view +#: model_terms:ir.ui.view,arch_db:purchase_triple_discount.res_partner_form_view +msgid "Total discount" +msgstr "" + +#~ msgid "Invoice" +#~ msgstr "Factura" diff --git a/purchase_triple_discount/i18n/fi.po b/purchase_triple_discount/i18n/fi.po new file mode 100644 index 00000000000..cad98dea128 --- /dev/null +++ b/purchase_triple_discount/i18n/fi.po @@ -0,0 +1,121 @@ +# Translation of Odoo Server. +# This file contains the translation of the following modules: +# * purchase_triple_discount +# +# Translators: +# OCA Transbot , 2017 +msgid "" +msgstr "" +"Project-Id-Version: Odoo Server 10.0\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2017-11-24 07:53+0000\n" +"PO-Revision-Date: 2017-11-24 07:53+0000\n" +"Last-Translator: OCA Transbot , 2017\n" +"Language-Team: Finnish (https://www.transifex.com/oca/teams/23907/fi/)\n" +"Language: fi\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" + +#. module: purchase_triple_discount +#: model_terms:ir.ui.view,arch_db:purchase_triple_discount.report_purchaseorder_document_triple_discount +msgid "Disc. 1 (%)" +msgstr "" + +#. module: purchase_triple_discount +#: model_terms:ir.ui.view,arch_db:purchase_triple_discount.report_purchaseorder_document_triple_discount +msgid "Disc. 2 (%)" +msgstr "" + +#. module: purchase_triple_discount +#: model_terms:ir.ui.view,arch_db:purchase_triple_discount.report_purchaseorder_document_triple_discount +msgid "Disc. 3 (%)" +msgstr "" + +#. module: purchase_triple_discount +#: model:ir.model,name:purchase_triple_discount.model_res_partner +msgid "Contact" +msgstr "" + +#. module: purchase_triple_discount +#: model:ir.model.fields,field_description:purchase_triple_discount.field_res_partner__default_supplierinfo_discount1 +#: model:ir.model.fields,field_description:purchase_triple_discount.field_res_users__default_supplierinfo_discount1 +msgid "Default Supplier Discount 1 (%)" +msgstr "" + +#. module: purchase_triple_discount +#: model:ir.model.fields,field_description:purchase_triple_discount.field_res_partner__default_supplierinfo_discount2 +#: model:ir.model.fields,field_description:purchase_triple_discount.field_res_users__default_supplierinfo_discount2 +msgid "Default Supplier Discount 2 (%)" +msgstr "" + +#. module: purchase_triple_discount +#: model:ir.model.fields,field_description:purchase_triple_discount.field_res_partner__default_supplierinfo_discount3 +#: model:ir.model.fields,field_description:purchase_triple_discount.field_res_users__default_supplierinfo_discount3 +msgid "Default Supplier Discount 3 (%)" +msgstr "" + +#. module: purchase_triple_discount +#: model:ir.model.fields,field_description:purchase_triple_discount.field_product_supplierinfo__discount +#: model:ir.model.fields,field_description:purchase_triple_discount.field_purchase_order_line__discount +msgid "Discount (%)" +msgstr "" + +#. module: purchase_triple_discount +#: model:ir.model.fields,field_description:purchase_triple_discount.field_product_supplierinfo__discount1 +#: model:ir.model.fields,field_description:purchase_triple_discount.field_purchase_order_line__discount1 +#: model:ir.model.fields,field_description:purchase_triple_discount.field_purchase_report__discount1 +msgid "Discount 1 (%)" +msgstr "" + +#. module: purchase_triple_discount +#: model:ir.model.fields,field_description:purchase_triple_discount.field_product_supplierinfo__discount2 +#: model:ir.model.fields,field_description:purchase_triple_discount.field_purchase_order_line__discount2 +#: model:ir.model.fields,field_description:purchase_triple_discount.field_purchase_report__discount2 +msgid "Discount 2 (%)" +msgstr "" + +#. module: purchase_triple_discount +#: model:ir.model.fields,field_description:purchase_triple_discount.field_product_supplierinfo__discount3 +#: model:ir.model.fields,field_description:purchase_triple_discount.field_purchase_order_line__discount3 +#: model:ir.model.fields,field_description:purchase_triple_discount.field_purchase_report__discount3 +msgid "Discount 3 (%)" +msgstr "" + +#. module: purchase_triple_discount +#: model:ir.model,name:purchase_triple_discount.model_purchase_order_line +msgid "Purchase Order Line" +msgstr "Ostotilausrivi" + +#. module: purchase_triple_discount +#: model:ir.model,name:purchase_triple_discount.model_purchase_report +#, fuzzy +msgid "Purchase Report" +msgstr "Ostotilausrivi" + +#. module: purchase_triple_discount +#: model:ir.model,name:purchase_triple_discount.model_product_supplierinfo +msgid "Supplier Pricelist" +msgstr "" + +#. module: purchase_triple_discount +#: model:ir.model.fields,help:purchase_triple_discount.field_res_partner__default_supplierinfo_discount1 +#: model:ir.model.fields,help:purchase_triple_discount.field_res_partner__default_supplierinfo_discount2 +#: model:ir.model.fields,help:purchase_triple_discount.field_res_partner__default_supplierinfo_discount3 +#: model:ir.model.fields,help:purchase_triple_discount.field_res_users__default_supplierinfo_discount1 +#: model:ir.model.fields,help:purchase_triple_discount.field_res_users__default_supplierinfo_discount2 +#: model:ir.model.fields,help:purchase_triple_discount.field_res_users__default_supplierinfo_discount3 +msgid "" +"This value will be used as the default one, for each new supplierinfo line " +"depending on that supplier." +msgstr "" + +#. module: purchase_triple_discount +#: model:ir.model.fields,field_description:purchase_triple_discount.field_purchase_report__discount +#: model_terms:ir.ui.view,arch_db:purchase_triple_discount.product_supplierinfo_form_view +#: model_terms:ir.ui.view,arch_db:purchase_triple_discount.product_supplierinfo_tree_view +#: model_terms:ir.ui.view,arch_db:purchase_triple_discount.purchase_order_triple_discount_form_view +#: model_terms:ir.ui.view,arch_db:purchase_triple_discount.res_partner_form_view +msgid "Total discount" +msgstr "" diff --git a/purchase_triple_discount/i18n/fr.po b/purchase_triple_discount/i18n/fr.po new file mode 100644 index 00000000000..56c368de959 --- /dev/null +++ b/purchase_triple_discount/i18n/fr.po @@ -0,0 +1,138 @@ +# Translation of Odoo Server. +# This file contains the translation of the following modules: +# * purchase_triple_discount +# +msgid "" +msgstr "" +"Project-Id-Version: Odoo Server 12.0\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2019-08-08 08:11+0000\n" +"PO-Revision-Date: 2025-05-27 09:26+0000\n" +"Last-Translator: MDgrap \n" +"Language-Team: \n" +"Language: fr\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: \n" +"Plural-Forms: nplurals=2; plural=n > 1;\n" +"X-Generator: Weblate 5.10.4\n" + +#. module: purchase_triple_discount +#: model_terms:ir.ui.view,arch_db:purchase_triple_discount.report_purchaseorder_document_triple_discount +msgid "Disc. 1 (%)" +msgstr "" + +#. module: purchase_triple_discount +#: model_terms:ir.ui.view,arch_db:purchase_triple_discount.report_purchaseorder_document_triple_discount +msgid "Disc. 2 (%)" +msgstr "Remise 2 (%)" + +#. module: purchase_triple_discount +#: model_terms:ir.ui.view,arch_db:purchase_triple_discount.report_purchaseorder_document_triple_discount +msgid "Disc. 3 (%)" +msgstr "" + +#. module: purchase_triple_discount +#: model:ir.model,name:purchase_triple_discount.model_res_partner +msgid "Contact" +msgstr "" + +#. module: purchase_triple_discount +#: model:ir.model.fields,field_description:purchase_triple_discount.field_res_partner__default_supplierinfo_discount1 +#: model:ir.model.fields,field_description:purchase_triple_discount.field_res_users__default_supplierinfo_discount1 +msgid "Default Supplier Discount 1 (%)" +msgstr "" + +#. module: purchase_triple_discount +#: model:ir.model.fields,field_description:purchase_triple_discount.field_res_partner__default_supplierinfo_discount2 +#: model:ir.model.fields,field_description:purchase_triple_discount.field_res_users__default_supplierinfo_discount2 +msgid "Default Supplier Discount 2 (%)" +msgstr "Remise par défaut n°2 (%)" + +#. module: purchase_triple_discount +#: model:ir.model.fields,field_description:purchase_triple_discount.field_res_partner__default_supplierinfo_discount3 +#: model:ir.model.fields,field_description:purchase_triple_discount.field_res_users__default_supplierinfo_discount3 +msgid "Default Supplier Discount 3 (%)" +msgstr "Remise par défaut n°3 (%)" + +#. module: purchase_triple_discount +#: model:ir.model.fields,field_description:purchase_triple_discount.field_product_supplierinfo__discount +#: model:ir.model.fields,field_description:purchase_triple_discount.field_purchase_order_line__discount +msgid "Discount (%)" +msgstr "" + +#. module: purchase_triple_discount +#: model:ir.model.fields,field_description:purchase_triple_discount.field_product_supplierinfo__discount1 +#: model:ir.model.fields,field_description:purchase_triple_discount.field_purchase_order_line__discount1 +#: model:ir.model.fields,field_description:purchase_triple_discount.field_purchase_report__discount1 +msgid "Discount 1 (%)" +msgstr "" + +#. module: purchase_triple_discount +#: model:ir.model.fields,field_description:purchase_triple_discount.field_product_supplierinfo__discount2 +#: model:ir.model.fields,field_description:purchase_triple_discount.field_purchase_order_line__discount2 +#: model:ir.model.fields,field_description:purchase_triple_discount.field_purchase_report__discount2 +msgid "Discount 2 (%)" +msgstr "Remise 2 (%)" + +#. module: purchase_triple_discount +#: model:ir.model.fields,field_description:purchase_triple_discount.field_product_supplierinfo__discount3 +#: model:ir.model.fields,field_description:purchase_triple_discount.field_purchase_order_line__discount3 +#: model:ir.model.fields,field_description:purchase_triple_discount.field_purchase_report__discount3 +msgid "Discount 3 (%)" +msgstr "Remise 3 (%)" + +#. module: purchase_triple_discount +#: model:ir.model,name:purchase_triple_discount.model_purchase_order_line +msgid "Purchase Order Line" +msgstr "Ligne de commande d'achat" + +#. module: purchase_triple_discount +#: model:ir.model,name:purchase_triple_discount.model_purchase_report +#, fuzzy +msgid "Purchase Report" +msgstr "Commande fournisseur" + +#. module: purchase_triple_discount +#: model:ir.model,name:purchase_triple_discount.model_product_supplierinfo +msgid "Supplier Pricelist" +msgstr "Liste de prix du fournisseur" + +#. module: purchase_triple_discount +#: model:ir.model.fields,help:purchase_triple_discount.field_res_partner__default_supplierinfo_discount1 +#: model:ir.model.fields,help:purchase_triple_discount.field_res_partner__default_supplierinfo_discount2 +#: model:ir.model.fields,help:purchase_triple_discount.field_res_partner__default_supplierinfo_discount3 +#: model:ir.model.fields,help:purchase_triple_discount.field_res_users__default_supplierinfo_discount1 +#: model:ir.model.fields,help:purchase_triple_discount.field_res_users__default_supplierinfo_discount2 +#: model:ir.model.fields,help:purchase_triple_discount.field_res_users__default_supplierinfo_discount3 +msgid "" +"This value will be used as the default one, for each new supplierinfo line " +"depending on that supplier." +msgstr "" + +#. module: purchase_triple_discount +#: model:ir.model.fields,field_description:purchase_triple_discount.field_purchase_report__discount +#: model_terms:ir.ui.view,arch_db:purchase_triple_discount.product_supplierinfo_form_view +#: model_terms:ir.ui.view,arch_db:purchase_triple_discount.product_supplierinfo_tree_view +#: model_terms:ir.ui.view,arch_db:purchase_triple_discount.purchase_order_triple_discount_form_view +#: model_terms:ir.ui.view,arch_db:purchase_triple_discount.res_partner_form_view +msgid "Total discount" +msgstr "" + +#~ msgid "Discount 2 must be lower than 100%." +#~ msgstr "La remise 2 doit être inférieure à 100%." + +#~ msgid "Discount 3 must be lower than 100%." +#~ msgstr "La remise 3 doit être inférieure à 100%." + +#~ msgid "Disc. 2 (%)" +#~ msgstr "Rem. 2 (%)" + +#~ msgid "Disc. 3 (%)" +#~ msgstr "Rem. 3 (%)" + +#~ msgid "Invoice" +#~ msgstr "Facture" + +#~ msgid "Stock Rule" +#~ msgstr "Règle de stock minimum" diff --git a/purchase_triple_discount/i18n/hr.po b/purchase_triple_discount/i18n/hr.po new file mode 100644 index 00000000000..18c39d8322c --- /dev/null +++ b/purchase_triple_discount/i18n/hr.po @@ -0,0 +1,139 @@ +# Translation of Odoo Server. +# This file contains the translation of the following modules: +# * purchase_triple_discount +# +# Translators: +# Bole , 2017 +msgid "" +msgstr "" +"Project-Id-Version: Odoo Server 10.0\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2018-03-03 03:48+0000\n" +"PO-Revision-Date: 2018-03-03 03:48+0000\n" +"Last-Translator: Bole , 2017\n" +"Language-Team: Croatian (https://www.transifex.com/oca/teams/23907/hr/)\n" +"Language: hr\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: \n" +"Plural-Forms: nplurals=3; plural=n%10==1 && n%100!=11 ? 0 : n%10>=2 && " +"n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2;\n" + +#. module: purchase_triple_discount +#: model_terms:ir.ui.view,arch_db:purchase_triple_discount.report_purchaseorder_document_triple_discount +msgid "Disc. 1 (%)" +msgstr "" + +#. module: purchase_triple_discount +#: model_terms:ir.ui.view,arch_db:purchase_triple_discount.report_purchaseorder_document_triple_discount +msgid "Disc. 2 (%)" +msgstr "" + +#. module: purchase_triple_discount +#: model_terms:ir.ui.view,arch_db:purchase_triple_discount.report_purchaseorder_document_triple_discount +msgid "Disc. 3 (%)" +msgstr "" + +#. module: purchase_triple_discount +#: model:ir.model,name:purchase_triple_discount.model_res_partner +msgid "Contact" +msgstr "" + +#. module: purchase_triple_discount +#: model:ir.model.fields,field_description:purchase_triple_discount.field_res_partner__default_supplierinfo_discount1 +#: model:ir.model.fields,field_description:purchase_triple_discount.field_res_users__default_supplierinfo_discount1 +msgid "Default Supplier Discount 1 (%)" +msgstr "" + +#. module: purchase_triple_discount +#: model:ir.model.fields,field_description:purchase_triple_discount.field_res_partner__default_supplierinfo_discount2 +#: model:ir.model.fields,field_description:purchase_triple_discount.field_res_users__default_supplierinfo_discount2 +msgid "Default Supplier Discount 2 (%)" +msgstr "" + +#. module: purchase_triple_discount +#: model:ir.model.fields,field_description:purchase_triple_discount.field_res_partner__default_supplierinfo_discount3 +#: model:ir.model.fields,field_description:purchase_triple_discount.field_res_users__default_supplierinfo_discount3 +msgid "Default Supplier Discount 3 (%)" +msgstr "" + +#. module: purchase_triple_discount +#: model:ir.model.fields,field_description:purchase_triple_discount.field_product_supplierinfo__discount +#: model:ir.model.fields,field_description:purchase_triple_discount.field_purchase_order_line__discount +msgid "Discount (%)" +msgstr "" + +#. module: purchase_triple_discount +#: model:ir.model.fields,field_description:purchase_triple_discount.field_product_supplierinfo__discount1 +#: model:ir.model.fields,field_description:purchase_triple_discount.field_purchase_order_line__discount1 +#: model:ir.model.fields,field_description:purchase_triple_discount.field_purchase_report__discount1 +msgid "Discount 1 (%)" +msgstr "" + +#. module: purchase_triple_discount +#: model:ir.model.fields,field_description:purchase_triple_discount.field_product_supplierinfo__discount2 +#: model:ir.model.fields,field_description:purchase_triple_discount.field_purchase_order_line__discount2 +#: model:ir.model.fields,field_description:purchase_triple_discount.field_purchase_report__discount2 +#, fuzzy +msgid "Discount 2 (%)" +msgstr "Pop. 2 (%)" + +#. module: purchase_triple_discount +#: model:ir.model.fields,field_description:purchase_triple_discount.field_product_supplierinfo__discount3 +#: model:ir.model.fields,field_description:purchase_triple_discount.field_purchase_order_line__discount3 +#: model:ir.model.fields,field_description:purchase_triple_discount.field_purchase_report__discount3 +#, fuzzy +msgid "Discount 3 (%)" +msgstr "Pop. 3(%)" + +#. module: purchase_triple_discount +#: model:ir.model,name:purchase_triple_discount.model_purchase_order_line +msgid "Purchase Order Line" +msgstr "Stavka naloga za nabavu" + +#. module: purchase_triple_discount +#: model:ir.model,name:purchase_triple_discount.model_purchase_report +#, fuzzy +msgid "Purchase Report" +msgstr "Stavka naloga za nabavu" + +#. module: purchase_triple_discount +#: model:ir.model,name:purchase_triple_discount.model_product_supplierinfo +msgid "Supplier Pricelist" +msgstr "" + +#. module: purchase_triple_discount +#: model:ir.model.fields,help:purchase_triple_discount.field_res_partner__default_supplierinfo_discount1 +#: model:ir.model.fields,help:purchase_triple_discount.field_res_partner__default_supplierinfo_discount2 +#: model:ir.model.fields,help:purchase_triple_discount.field_res_partner__default_supplierinfo_discount3 +#: model:ir.model.fields,help:purchase_triple_discount.field_res_users__default_supplierinfo_discount1 +#: model:ir.model.fields,help:purchase_triple_discount.field_res_users__default_supplierinfo_discount2 +#: model:ir.model.fields,help:purchase_triple_discount.field_res_users__default_supplierinfo_discount3 +msgid "" +"This value will be used as the default one, for each new supplierinfo line " +"depending on that supplier." +msgstr "" + +#. module: purchase_triple_discount +#: model:ir.model.fields,field_description:purchase_triple_discount.field_purchase_report__discount +#: model_terms:ir.ui.view,arch_db:purchase_triple_discount.product_supplierinfo_form_view +#: model_terms:ir.ui.view,arch_db:purchase_triple_discount.product_supplierinfo_tree_view +#: model_terms:ir.ui.view,arch_db:purchase_triple_discount.purchase_order_triple_discount_form_view +#: model_terms:ir.ui.view,arch_db:purchase_triple_discount.res_partner_form_view +msgid "Total discount" +msgstr "" + +#~ msgid "Discount 2 must be lower than 100%." +#~ msgstr "Popust 2 mora biti manje od 100%." + +#~ msgid "Discount 3 must be lower than 100%." +#~ msgstr "Popust 3 mora biti manje od 100%." + +#~ msgid "Disc. 2 (%)" +#~ msgstr "Pop. 2 (%)" + +#~ msgid "Disc. 3 (%)" +#~ msgstr "Pop. 3(%)" + +#~ msgid "Invoice" +#~ msgstr "Račun" diff --git a/purchase_triple_discount/i18n/it.po b/purchase_triple_discount/i18n/it.po new file mode 100644 index 00000000000..fa66b5aef01 --- /dev/null +++ b/purchase_triple_discount/i18n/it.po @@ -0,0 +1,147 @@ +# Translation of Odoo Server. +# This file contains the translation of the following modules: +# * purchase_triple_discount +# +# Translators: +# OCA Transbot , 2017 +msgid "" +msgstr "" +"Project-Id-Version: Odoo Server 10.0\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2017-11-24 07:53+0000\n" +"PO-Revision-Date: 2025-10-15 11:43+0000\n" +"Last-Translator: mymage \n" +"Language-Team: Italian (https://www.transifex.com/oca/teams/23907/it/)\n" +"Language: it\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: \n" +"Plural-Forms: nplurals=2; plural=n != 1;\n" +"X-Generator: Weblate 5.10.4\n" + +#. module: purchase_triple_discount +#: model_terms:ir.ui.view,arch_db:purchase_triple_discount.report_purchaseorder_document_triple_discount +msgid "Disc. 1 (%)" +msgstr "Sc. 1 (%)" + +#. module: purchase_triple_discount +#: model_terms:ir.ui.view,arch_db:purchase_triple_discount.report_purchaseorder_document_triple_discount +msgid "Disc. 2 (%)" +msgstr "Sc. 2 (%)" + +#. module: purchase_triple_discount +#: model_terms:ir.ui.view,arch_db:purchase_triple_discount.report_purchaseorder_document_triple_discount +msgid "Disc. 3 (%)" +msgstr "Sc. 3 (%)" + +#. module: purchase_triple_discount +#: model:ir.model,name:purchase_triple_discount.model_res_partner +msgid "Contact" +msgstr "Contatto" + +#. module: purchase_triple_discount +#: model:ir.model.fields,field_description:purchase_triple_discount.field_res_partner__default_supplierinfo_discount1 +#: model:ir.model.fields,field_description:purchase_triple_discount.field_res_users__default_supplierinfo_discount1 +msgid "Default Supplier Discount 1 (%)" +msgstr "Sconto 1 fornitore predefinito (%)" + +#. module: purchase_triple_discount +#: model:ir.model.fields,field_description:purchase_triple_discount.field_res_partner__default_supplierinfo_discount2 +#: model:ir.model.fields,field_description:purchase_triple_discount.field_res_users__default_supplierinfo_discount2 +msgid "Default Supplier Discount 2 (%)" +msgstr "Sconto Fornitore Predefinito 2 (%)" + +#. module: purchase_triple_discount +#: model:ir.model.fields,field_description:purchase_triple_discount.field_res_partner__default_supplierinfo_discount3 +#: model:ir.model.fields,field_description:purchase_triple_discount.field_res_users__default_supplierinfo_discount3 +msgid "Default Supplier Discount 3 (%)" +msgstr "Sconto Fornitore Predefinito 3 (%)" + +#. module: purchase_triple_discount +#: model:ir.model.fields,field_description:purchase_triple_discount.field_product_supplierinfo__discount +#: model:ir.model.fields,field_description:purchase_triple_discount.field_purchase_order_line__discount +msgid "Discount (%)" +msgstr "Sconto (%)" + +#. module: purchase_triple_discount +#: model:ir.model.fields,field_description:purchase_triple_discount.field_product_supplierinfo__discount1 +#: model:ir.model.fields,field_description:purchase_triple_discount.field_purchase_order_line__discount1 +#: model:ir.model.fields,field_description:purchase_triple_discount.field_purchase_report__discount1 +msgid "Discount 1 (%)" +msgstr "Sconto 1%" + +#. module: purchase_triple_discount +#: model:ir.model.fields,field_description:purchase_triple_discount.field_product_supplierinfo__discount2 +#: model:ir.model.fields,field_description:purchase_triple_discount.field_purchase_order_line__discount2 +#: model:ir.model.fields,field_description:purchase_triple_discount.field_purchase_report__discount2 +msgid "Discount 2 (%)" +msgstr "Sconto 2 (%)" + +#. module: purchase_triple_discount +#: model:ir.model.fields,field_description:purchase_triple_discount.field_product_supplierinfo__discount3 +#: model:ir.model.fields,field_description:purchase_triple_discount.field_purchase_order_line__discount3 +#: model:ir.model.fields,field_description:purchase_triple_discount.field_purchase_report__discount3 +msgid "Discount 3 (%)" +msgstr "Sconto 3 (%)" + +#. module: purchase_triple_discount +#: model:ir.model,name:purchase_triple_discount.model_purchase_order_line +msgid "Purchase Order Line" +msgstr "Riga ordine di acquisto" + +#. module: purchase_triple_discount +#: model:ir.model,name:purchase_triple_discount.model_purchase_report +msgid "Purchase Report" +msgstr "Resoconto di acquisto" + +#. module: purchase_triple_discount +#: model:ir.model,name:purchase_triple_discount.model_product_supplierinfo +msgid "Supplier Pricelist" +msgstr "Listino prezzi fornitore" + +#. module: purchase_triple_discount +#: model:ir.model.fields,help:purchase_triple_discount.field_res_partner__default_supplierinfo_discount1 +#: model:ir.model.fields,help:purchase_triple_discount.field_res_partner__default_supplierinfo_discount2 +#: model:ir.model.fields,help:purchase_triple_discount.field_res_partner__default_supplierinfo_discount3 +#: model:ir.model.fields,help:purchase_triple_discount.field_res_users__default_supplierinfo_discount1 +#: model:ir.model.fields,help:purchase_triple_discount.field_res_users__default_supplierinfo_discount2 +#: model:ir.model.fields,help:purchase_triple_discount.field_res_users__default_supplierinfo_discount3 +msgid "" +"This value will be used as the default one, for each new supplierinfo line " +"depending on that supplier." +msgstr "" +"Questo valore verrà usato come predefinito per ogni nuova riga d'ordine di " +"acquisto che dipende da questo fornitore." + +#. module: purchase_triple_discount +#: model:ir.model.fields,field_description:purchase_triple_discount.field_purchase_report__discount +#: model_terms:ir.ui.view,arch_db:purchase_triple_discount.product_supplierinfo_form_view +#: model_terms:ir.ui.view,arch_db:purchase_triple_discount.product_supplierinfo_tree_view +#: model_terms:ir.ui.view,arch_db:purchase_triple_discount.purchase_order_triple_discount_form_view +#: model_terms:ir.ui.view,arch_db:purchase_triple_discount.res_partner_form_view +msgid "Total discount" +msgstr "Sconto totale" + +#~ msgid "Discount 1 must be lower than 100%." +#~ msgstr "Lo sconto 1 deve essere minore del 100%." + +#~ msgid "Discount 2 must be lower than 100%." +#~ msgstr "Sconto 2 deve essere inferiore di 100%." + +#~ msgid "Discount 3 must be lower than 100%." +#~ msgstr "Sconto 3 deve essere inferiore di 100%." + +#~ msgid "Triple discount mixin" +#~ msgstr "Mixin sconto triplo" + +#~ msgid "Disc. 2 (%)" +#~ msgstr "Sconto 2 (%)" + +#~ msgid "Disc. 3 (%)" +#~ msgstr "Sconto 3 (%)" + +#~ msgid "Invoice" +#~ msgstr "Fattura" + +#~ msgid "Stock Rule" +#~ msgstr "Regola Stock" diff --git a/purchase_triple_discount/i18n/nl_NL.po b/purchase_triple_discount/i18n/nl_NL.po new file mode 100644 index 00000000000..908074595ce --- /dev/null +++ b/purchase_triple_discount/i18n/nl_NL.po @@ -0,0 +1,125 @@ +# Translation of Odoo Server. +# This file contains the translation of the following modules: +# * purchase_triple_discount +# +# Translators: +# Peter Hageman , 2017 +msgid "" +msgstr "" +"Project-Id-Version: Odoo Server 10.0\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2017-11-24 07:53+0000\n" +"PO-Revision-Date: 2017-11-24 07:53+0000\n" +"Last-Translator: Peter Hageman , 2017\n" +"Language-Team: Dutch (Netherlands) (https://www.transifex.com/oca/" +"teams/23907/nl_NL/)\n" +"Language: nl_NL\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: \n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" + +#. module: purchase_triple_discount +#: model_terms:ir.ui.view,arch_db:purchase_triple_discount.report_purchaseorder_document_triple_discount +msgid "Disc. 1 (%)" +msgstr "" + +#. module: purchase_triple_discount +#: model_terms:ir.ui.view,arch_db:purchase_triple_discount.report_purchaseorder_document_triple_discount +msgid "Disc. 2 (%)" +msgstr "" + +#. module: purchase_triple_discount +#: model_terms:ir.ui.view,arch_db:purchase_triple_discount.report_purchaseorder_document_triple_discount +msgid "Disc. 3 (%)" +msgstr "" + +#. module: purchase_triple_discount +#: model:ir.model,name:purchase_triple_discount.model_res_partner +msgid "Contact" +msgstr "" + +#. module: purchase_triple_discount +#: model:ir.model.fields,field_description:purchase_triple_discount.field_res_partner__default_supplierinfo_discount1 +#: model:ir.model.fields,field_description:purchase_triple_discount.field_res_users__default_supplierinfo_discount1 +msgid "Default Supplier Discount 1 (%)" +msgstr "" + +#. module: purchase_triple_discount +#: model:ir.model.fields,field_description:purchase_triple_discount.field_res_partner__default_supplierinfo_discount2 +#: model:ir.model.fields,field_description:purchase_triple_discount.field_res_users__default_supplierinfo_discount2 +msgid "Default Supplier Discount 2 (%)" +msgstr "" + +#. module: purchase_triple_discount +#: model:ir.model.fields,field_description:purchase_triple_discount.field_res_partner__default_supplierinfo_discount3 +#: model:ir.model.fields,field_description:purchase_triple_discount.field_res_users__default_supplierinfo_discount3 +msgid "Default Supplier Discount 3 (%)" +msgstr "" + +#. module: purchase_triple_discount +#: model:ir.model.fields,field_description:purchase_triple_discount.field_product_supplierinfo__discount +#: model:ir.model.fields,field_description:purchase_triple_discount.field_purchase_order_line__discount +msgid "Discount (%)" +msgstr "" + +#. module: purchase_triple_discount +#: model:ir.model.fields,field_description:purchase_triple_discount.field_product_supplierinfo__discount1 +#: model:ir.model.fields,field_description:purchase_triple_discount.field_purchase_order_line__discount1 +#: model:ir.model.fields,field_description:purchase_triple_discount.field_purchase_report__discount1 +msgid "Discount 1 (%)" +msgstr "" + +#. module: purchase_triple_discount +#: model:ir.model.fields,field_description:purchase_triple_discount.field_product_supplierinfo__discount2 +#: model:ir.model.fields,field_description:purchase_triple_discount.field_purchase_order_line__discount2 +#: model:ir.model.fields,field_description:purchase_triple_discount.field_purchase_report__discount2 +msgid "Discount 2 (%)" +msgstr "" + +#. module: purchase_triple_discount +#: model:ir.model.fields,field_description:purchase_triple_discount.field_product_supplierinfo__discount3 +#: model:ir.model.fields,field_description:purchase_triple_discount.field_purchase_order_line__discount3 +#: model:ir.model.fields,field_description:purchase_triple_discount.field_purchase_report__discount3 +msgid "Discount 3 (%)" +msgstr "" + +#. module: purchase_triple_discount +#: model:ir.model,name:purchase_triple_discount.model_purchase_order_line +msgid "Purchase Order Line" +msgstr "Inkooporderregel" + +#. module: purchase_triple_discount +#: model:ir.model,name:purchase_triple_discount.model_purchase_report +#, fuzzy +msgid "Purchase Report" +msgstr "Inkooporderregel" + +#. module: purchase_triple_discount +#: model:ir.model,name:purchase_triple_discount.model_product_supplierinfo +msgid "Supplier Pricelist" +msgstr "" + +#. module: purchase_triple_discount +#: model:ir.model.fields,help:purchase_triple_discount.field_res_partner__default_supplierinfo_discount1 +#: model:ir.model.fields,help:purchase_triple_discount.field_res_partner__default_supplierinfo_discount2 +#: model:ir.model.fields,help:purchase_triple_discount.field_res_partner__default_supplierinfo_discount3 +#: model:ir.model.fields,help:purchase_triple_discount.field_res_users__default_supplierinfo_discount1 +#: model:ir.model.fields,help:purchase_triple_discount.field_res_users__default_supplierinfo_discount2 +#: model:ir.model.fields,help:purchase_triple_discount.field_res_users__default_supplierinfo_discount3 +msgid "" +"This value will be used as the default one, for each new supplierinfo line " +"depending on that supplier." +msgstr "" + +#. module: purchase_triple_discount +#: model:ir.model.fields,field_description:purchase_triple_discount.field_purchase_report__discount +#: model_terms:ir.ui.view,arch_db:purchase_triple_discount.product_supplierinfo_form_view +#: model_terms:ir.ui.view,arch_db:purchase_triple_discount.product_supplierinfo_tree_view +#: model_terms:ir.ui.view,arch_db:purchase_triple_discount.purchase_order_triple_discount_form_view +#: model_terms:ir.ui.view,arch_db:purchase_triple_discount.res_partner_form_view +msgid "Total discount" +msgstr "" + +#~ msgid "Invoice" +#~ msgstr "Factuur" diff --git a/purchase_triple_discount/i18n/pt_BR.po b/purchase_triple_discount/i18n/pt_BR.po new file mode 100644 index 00000000000..cf0b02518cb --- /dev/null +++ b/purchase_triple_discount/i18n/pt_BR.po @@ -0,0 +1,140 @@ +# Translation of Odoo Server. +# This file contains the translation of the following modules: +# * purchase_triple_discount +# +# Translators: +# OCA Transbot , 2017 +msgid "" +msgstr "" +"Project-Id-Version: Odoo Server 10.0\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2017-11-24 07:53+0000\n" +"PO-Revision-Date: 2024-05-29 18:36+0000\n" +"Last-Translator: Rodrigo Macedo \n" +"Language-Team: Portuguese (Brazil) (https://www.transifex.com/oca/" +"teams/23907/pt_BR/)\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: purchase_triple_discount +#: model_terms:ir.ui.view,arch_db:purchase_triple_discount.report_purchaseorder_document_triple_discount +msgid "Disc. 1 (%)" +msgstr "" + +#. module: purchase_triple_discount +#: model_terms:ir.ui.view,arch_db:purchase_triple_discount.report_purchaseorder_document_triple_discount +msgid "Disc. 2 (%)" +msgstr "Desc. 2 (%)" + +#. module: purchase_triple_discount +#: model_terms:ir.ui.view,arch_db:purchase_triple_discount.report_purchaseorder_document_triple_discount +msgid "Disc. 3 (%)" +msgstr "Desc. 3 (%)" + +#. module: purchase_triple_discount +#: model:ir.model,name:purchase_triple_discount.model_res_partner +msgid "Contact" +msgstr "Contato" + +#. module: purchase_triple_discount +#: model:ir.model.fields,field_description:purchase_triple_discount.field_res_partner__default_supplierinfo_discount1 +#: model:ir.model.fields,field_description:purchase_triple_discount.field_res_users__default_supplierinfo_discount1 +msgid "Default Supplier Discount 1 (%)" +msgstr "" + +#. module: purchase_triple_discount +#: model:ir.model.fields,field_description:purchase_triple_discount.field_res_partner__default_supplierinfo_discount2 +#: model:ir.model.fields,field_description:purchase_triple_discount.field_res_users__default_supplierinfo_discount2 +msgid "Default Supplier Discount 2 (%)" +msgstr "Desconto padrão do fornecedor 2 (%)" + +#. module: purchase_triple_discount +#: model:ir.model.fields,field_description:purchase_triple_discount.field_res_partner__default_supplierinfo_discount3 +#: model:ir.model.fields,field_description:purchase_triple_discount.field_res_users__default_supplierinfo_discount3 +msgid "Default Supplier Discount 3 (%)" +msgstr "Desconto padrão do fornecedor 3 (%)" + +#. module: purchase_triple_discount +#: model:ir.model.fields,field_description:purchase_triple_discount.field_product_supplierinfo__discount +#: model:ir.model.fields,field_description:purchase_triple_discount.field_purchase_order_line__discount +msgid "Discount (%)" +msgstr "" + +#. module: purchase_triple_discount +#: model:ir.model.fields,field_description:purchase_triple_discount.field_product_supplierinfo__discount1 +#: model:ir.model.fields,field_description:purchase_triple_discount.field_purchase_order_line__discount1 +#: model:ir.model.fields,field_description:purchase_triple_discount.field_purchase_report__discount1 +msgid "Discount 1 (%)" +msgstr "" + +#. module: purchase_triple_discount +#: model:ir.model.fields,field_description:purchase_triple_discount.field_product_supplierinfo__discount2 +#: model:ir.model.fields,field_description:purchase_triple_discount.field_purchase_order_line__discount2 +#: model:ir.model.fields,field_description:purchase_triple_discount.field_purchase_report__discount2 +msgid "Discount 2 (%)" +msgstr "Desconto 2 (%)" + +#. module: purchase_triple_discount +#: model:ir.model.fields,field_description:purchase_triple_discount.field_product_supplierinfo__discount3 +#: model:ir.model.fields,field_description:purchase_triple_discount.field_purchase_order_line__discount3 +#: model:ir.model.fields,field_description:purchase_triple_discount.field_purchase_report__discount3 +msgid "Discount 3 (%)" +msgstr "Desconto 3 (%)" + +#. module: purchase_triple_discount +#: model:ir.model,name:purchase_triple_discount.model_purchase_order_line +msgid "Purchase Order Line" +msgstr "Linha da Ordem de Compra" + +#. module: purchase_triple_discount +#: model:ir.model,name:purchase_triple_discount.model_purchase_report +msgid "Purchase Report" +msgstr "Relatório de Compra" + +#. module: purchase_triple_discount +#: model:ir.model,name:purchase_triple_discount.model_product_supplierinfo +msgid "Supplier Pricelist" +msgstr "Lista de preços do fornecedor" + +#. module: purchase_triple_discount +#: model:ir.model.fields,help:purchase_triple_discount.field_res_partner__default_supplierinfo_discount1 +#: model:ir.model.fields,help:purchase_triple_discount.field_res_partner__default_supplierinfo_discount2 +#: model:ir.model.fields,help:purchase_triple_discount.field_res_partner__default_supplierinfo_discount3 +#: model:ir.model.fields,help:purchase_triple_discount.field_res_users__default_supplierinfo_discount1 +#: model:ir.model.fields,help:purchase_triple_discount.field_res_users__default_supplierinfo_discount2 +#: model:ir.model.fields,help:purchase_triple_discount.field_res_users__default_supplierinfo_discount3 +msgid "" +"This value will be used as the default one, for each new supplierinfo line " +"depending on that supplier." +msgstr "" +"Este valor será usado como padrão, para cada nova linha de informações do " +"fornecedor dependendo desse fornecedor." + +#. module: purchase_triple_discount +#: model:ir.model.fields,field_description:purchase_triple_discount.field_purchase_report__discount +#: model_terms:ir.ui.view,arch_db:purchase_triple_discount.product_supplierinfo_form_view +#: model_terms:ir.ui.view,arch_db:purchase_triple_discount.product_supplierinfo_tree_view +#: model_terms:ir.ui.view,arch_db:purchase_triple_discount.purchase_order_triple_discount_form_view +#: model_terms:ir.ui.view,arch_db:purchase_triple_discount.res_partner_form_view +msgid "Total discount" +msgstr "" + +#~ msgid "Discount 2 must be lower than 100%." +#~ msgstr "O desconto 2 deve ser inferior a 100%." + +#~ msgid "Discount 3 must be lower than 100%." +#~ msgstr "O desconto 3 deve ser inferior a 100%." + +#~ msgid "Disc. 2 (%)" +#~ msgstr "Desc. 2 (%)" + +#~ msgid "Disc. 3 (%)" +#~ msgstr "Desc. 3 (%)" + +#~ msgid "Invoice" +#~ msgstr "Fatura" diff --git a/purchase_triple_discount/i18n/pt_PT.po b/purchase_triple_discount/i18n/pt_PT.po new file mode 100644 index 00000000000..3c2d7260dbf --- /dev/null +++ b/purchase_triple_discount/i18n/pt_PT.po @@ -0,0 +1,122 @@ +# Translation of Odoo Server. +# This file contains the translation of the following modules: +# * purchase_triple_discount +# +# Translators: +# OCA Transbot , 2017 +msgid "" +msgstr "" +"Project-Id-Version: Odoo Server 10.0\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2017-11-24 07:53+0000\n" +"PO-Revision-Date: 2017-11-24 07:53+0000\n" +"Last-Translator: OCA Transbot , 2017\n" +"Language-Team: Portuguese (Portugal) (https://www.transifex.com/oca/" +"teams/23907/pt_PT/)\n" +"Language: pt_PT\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" + +#. module: purchase_triple_discount +#: model_terms:ir.ui.view,arch_db:purchase_triple_discount.report_purchaseorder_document_triple_discount +msgid "Disc. 1 (%)" +msgstr "" + +#. module: purchase_triple_discount +#: model_terms:ir.ui.view,arch_db:purchase_triple_discount.report_purchaseorder_document_triple_discount +msgid "Disc. 2 (%)" +msgstr "" + +#. module: purchase_triple_discount +#: model_terms:ir.ui.view,arch_db:purchase_triple_discount.report_purchaseorder_document_triple_discount +msgid "Disc. 3 (%)" +msgstr "" + +#. module: purchase_triple_discount +#: model:ir.model,name:purchase_triple_discount.model_res_partner +msgid "Contact" +msgstr "" + +#. module: purchase_triple_discount +#: model:ir.model.fields,field_description:purchase_triple_discount.field_res_partner__default_supplierinfo_discount1 +#: model:ir.model.fields,field_description:purchase_triple_discount.field_res_users__default_supplierinfo_discount1 +msgid "Default Supplier Discount 1 (%)" +msgstr "" + +#. module: purchase_triple_discount +#: model:ir.model.fields,field_description:purchase_triple_discount.field_res_partner__default_supplierinfo_discount2 +#: model:ir.model.fields,field_description:purchase_triple_discount.field_res_users__default_supplierinfo_discount2 +msgid "Default Supplier Discount 2 (%)" +msgstr "" + +#. module: purchase_triple_discount +#: model:ir.model.fields,field_description:purchase_triple_discount.field_res_partner__default_supplierinfo_discount3 +#: model:ir.model.fields,field_description:purchase_triple_discount.field_res_users__default_supplierinfo_discount3 +msgid "Default Supplier Discount 3 (%)" +msgstr "" + +#. module: purchase_triple_discount +#: model:ir.model.fields,field_description:purchase_triple_discount.field_product_supplierinfo__discount +#: model:ir.model.fields,field_description:purchase_triple_discount.field_purchase_order_line__discount +msgid "Discount (%)" +msgstr "" + +#. module: purchase_triple_discount +#: model:ir.model.fields,field_description:purchase_triple_discount.field_product_supplierinfo__discount1 +#: model:ir.model.fields,field_description:purchase_triple_discount.field_purchase_order_line__discount1 +#: model:ir.model.fields,field_description:purchase_triple_discount.field_purchase_report__discount1 +msgid "Discount 1 (%)" +msgstr "" + +#. module: purchase_triple_discount +#: model:ir.model.fields,field_description:purchase_triple_discount.field_product_supplierinfo__discount2 +#: model:ir.model.fields,field_description:purchase_triple_discount.field_purchase_order_line__discount2 +#: model:ir.model.fields,field_description:purchase_triple_discount.field_purchase_report__discount2 +msgid "Discount 2 (%)" +msgstr "" + +#. module: purchase_triple_discount +#: model:ir.model.fields,field_description:purchase_triple_discount.field_product_supplierinfo__discount3 +#: model:ir.model.fields,field_description:purchase_triple_discount.field_purchase_order_line__discount3 +#: model:ir.model.fields,field_description:purchase_triple_discount.field_purchase_report__discount3 +msgid "Discount 3 (%)" +msgstr "" + +#. module: purchase_triple_discount +#: model:ir.model,name:purchase_triple_discount.model_purchase_order_line +msgid "Purchase Order Line" +msgstr "Linha de Encomenda de Compra" + +#. module: purchase_triple_discount +#: model:ir.model,name:purchase_triple_discount.model_purchase_report +#, fuzzy +msgid "Purchase Report" +msgstr "Linha de Encomenda de Compra" + +#. module: purchase_triple_discount +#: model:ir.model,name:purchase_triple_discount.model_product_supplierinfo +msgid "Supplier Pricelist" +msgstr "" + +#. module: purchase_triple_discount +#: model:ir.model.fields,help:purchase_triple_discount.field_res_partner__default_supplierinfo_discount1 +#: model:ir.model.fields,help:purchase_triple_discount.field_res_partner__default_supplierinfo_discount2 +#: model:ir.model.fields,help:purchase_triple_discount.field_res_partner__default_supplierinfo_discount3 +#: model:ir.model.fields,help:purchase_triple_discount.field_res_users__default_supplierinfo_discount1 +#: model:ir.model.fields,help:purchase_triple_discount.field_res_users__default_supplierinfo_discount2 +#: model:ir.model.fields,help:purchase_triple_discount.field_res_users__default_supplierinfo_discount3 +msgid "" +"This value will be used as the default one, for each new supplierinfo line " +"depending on that supplier." +msgstr "" + +#. module: purchase_triple_discount +#: model:ir.model.fields,field_description:purchase_triple_discount.field_purchase_report__discount +#: model_terms:ir.ui.view,arch_db:purchase_triple_discount.product_supplierinfo_form_view +#: model_terms:ir.ui.view,arch_db:purchase_triple_discount.product_supplierinfo_tree_view +#: model_terms:ir.ui.view,arch_db:purchase_triple_discount.purchase_order_triple_discount_form_view +#: model_terms:ir.ui.view,arch_db:purchase_triple_discount.res_partner_form_view +msgid "Total discount" +msgstr "" diff --git a/purchase_triple_discount/i18n/purchase_triple_discount.pot b/purchase_triple_discount/i18n/purchase_triple_discount.pot new file mode 100644 index 00000000000..bb92a87bf8d --- /dev/null +++ b/purchase_triple_discount/i18n/purchase_triple_discount.pot @@ -0,0 +1,115 @@ +# Translation of Odoo Server. +# This file contains the translation of the following modules: +# * purchase_triple_discount +# +msgid "" +msgstr "" +"Project-Id-Version: Odoo Server 16.0\n" +"Report-Msgid-Bugs-To: \n" +"Last-Translator: \n" +"Language-Team: \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: \n" +"Plural-Forms: \n" + +#. module: purchase_triple_discount +#: model_terms:ir.ui.view,arch_db:purchase_triple_discount.report_purchaseorder_document_triple_discount +msgid "Disc. 1 (%)" +msgstr "" + +#. module: purchase_triple_discount +#: model_terms:ir.ui.view,arch_db:purchase_triple_discount.report_purchaseorder_document_triple_discount +msgid "Disc. 2 (%)" +msgstr "" + +#. module: purchase_triple_discount +#: model_terms:ir.ui.view,arch_db:purchase_triple_discount.report_purchaseorder_document_triple_discount +msgid "Disc. 3 (%)" +msgstr "" + +#. module: purchase_triple_discount +#: model:ir.model,name:purchase_triple_discount.model_res_partner +msgid "Contact" +msgstr "" + +#. module: purchase_triple_discount +#: model:ir.model.fields,field_description:purchase_triple_discount.field_res_partner__default_supplierinfo_discount1 +#: model:ir.model.fields,field_description:purchase_triple_discount.field_res_users__default_supplierinfo_discount1 +msgid "Default Supplier Discount 1 (%)" +msgstr "" + +#. module: purchase_triple_discount +#: model:ir.model.fields,field_description:purchase_triple_discount.field_res_partner__default_supplierinfo_discount2 +#: model:ir.model.fields,field_description:purchase_triple_discount.field_res_users__default_supplierinfo_discount2 +msgid "Default Supplier Discount 2 (%)" +msgstr "" + +#. module: purchase_triple_discount +#: model:ir.model.fields,field_description:purchase_triple_discount.field_res_partner__default_supplierinfo_discount3 +#: model:ir.model.fields,field_description:purchase_triple_discount.field_res_users__default_supplierinfo_discount3 +msgid "Default Supplier Discount 3 (%)" +msgstr "" + +#. module: purchase_triple_discount +#: model:ir.model.fields,field_description:purchase_triple_discount.field_product_supplierinfo__discount +#: model:ir.model.fields,field_description:purchase_triple_discount.field_purchase_order_line__discount +msgid "Discount (%)" +msgstr "" + +#. module: purchase_triple_discount +#: model:ir.model.fields,field_description:purchase_triple_discount.field_product_supplierinfo__discount1 +#: model:ir.model.fields,field_description:purchase_triple_discount.field_purchase_order_line__discount1 +#: model:ir.model.fields,field_description:purchase_triple_discount.field_purchase_report__discount1 +msgid "Discount 1 (%)" +msgstr "" + +#. module: purchase_triple_discount +#: model:ir.model.fields,field_description:purchase_triple_discount.field_product_supplierinfo__discount2 +#: model:ir.model.fields,field_description:purchase_triple_discount.field_purchase_order_line__discount2 +#: model:ir.model.fields,field_description:purchase_triple_discount.field_purchase_report__discount2 +msgid "Discount 2 (%)" +msgstr "" + +#. module: purchase_triple_discount +#: model:ir.model.fields,field_description:purchase_triple_discount.field_product_supplierinfo__discount3 +#: model:ir.model.fields,field_description:purchase_triple_discount.field_purchase_order_line__discount3 +#: model:ir.model.fields,field_description:purchase_triple_discount.field_purchase_report__discount3 +msgid "Discount 3 (%)" +msgstr "" + +#. module: purchase_triple_discount +#: model:ir.model,name:purchase_triple_discount.model_purchase_order_line +msgid "Purchase Order Line" +msgstr "" + +#. module: purchase_triple_discount +#: model:ir.model,name:purchase_triple_discount.model_purchase_report +msgid "Purchase Report" +msgstr "" + +#. module: purchase_triple_discount +#: model:ir.model,name:purchase_triple_discount.model_product_supplierinfo +msgid "Supplier Pricelist" +msgstr "" + +#. module: purchase_triple_discount +#: model:ir.model.fields,help:purchase_triple_discount.field_res_partner__default_supplierinfo_discount1 +#: model:ir.model.fields,help:purchase_triple_discount.field_res_partner__default_supplierinfo_discount2 +#: model:ir.model.fields,help:purchase_triple_discount.field_res_partner__default_supplierinfo_discount3 +#: model:ir.model.fields,help:purchase_triple_discount.field_res_users__default_supplierinfo_discount1 +#: model:ir.model.fields,help:purchase_triple_discount.field_res_users__default_supplierinfo_discount2 +#: model:ir.model.fields,help:purchase_triple_discount.field_res_users__default_supplierinfo_discount3 +msgid "" +"This value will be used as the default one, for each new supplierinfo line " +"depending on that supplier." +msgstr "" + +#. module: purchase_triple_discount +#: model:ir.model.fields,field_description:purchase_triple_discount.field_purchase_report__discount +#: model_terms:ir.ui.view,arch_db:purchase_triple_discount.product_supplierinfo_form_view +#: model_terms:ir.ui.view,arch_db:purchase_triple_discount.product_supplierinfo_tree_view +#: model_terms:ir.ui.view,arch_db:purchase_triple_discount.purchase_order_triple_discount_form_view +#: model_terms:ir.ui.view,arch_db:purchase_triple_discount.res_partner_form_view +msgid "Total discount" +msgstr "" diff --git a/purchase_triple_discount/i18n/ro.po b/purchase_triple_discount/i18n/ro.po new file mode 100644 index 00000000000..38d1642ef13 --- /dev/null +++ b/purchase_triple_discount/i18n/ro.po @@ -0,0 +1,122 @@ +# Translation of Odoo Server. +# This file contains the translation of the following modules: +# * purchase_triple_discount +# +# Translators: +# OCA Transbot , 2017 +msgid "" +msgstr "" +"Project-Id-Version: Odoo Server 10.0\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2017-11-24 07:53+0000\n" +"PO-Revision-Date: 2017-11-24 07:53+0000\n" +"Last-Translator: OCA Transbot , 2017\n" +"Language-Team: Romanian (https://www.transifex.com/oca/teams/23907/ro/)\n" +"Language: ro\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: \n" +"Plural-Forms: nplurals=3; plural=(n==1?0:(((n%100>19)||((n%100==0)&&(n!=0)))?" +"2:1));\n" + +#. module: purchase_triple_discount +#: model_terms:ir.ui.view,arch_db:purchase_triple_discount.report_purchaseorder_document_triple_discount +msgid "Disc. 1 (%)" +msgstr "" + +#. module: purchase_triple_discount +#: model_terms:ir.ui.view,arch_db:purchase_triple_discount.report_purchaseorder_document_triple_discount +msgid "Disc. 2 (%)" +msgstr "" + +#. module: purchase_triple_discount +#: model_terms:ir.ui.view,arch_db:purchase_triple_discount.report_purchaseorder_document_triple_discount +msgid "Disc. 3 (%)" +msgstr "" + +#. module: purchase_triple_discount +#: model:ir.model,name:purchase_triple_discount.model_res_partner +msgid "Contact" +msgstr "" + +#. module: purchase_triple_discount +#: model:ir.model.fields,field_description:purchase_triple_discount.field_res_partner__default_supplierinfo_discount1 +#: model:ir.model.fields,field_description:purchase_triple_discount.field_res_users__default_supplierinfo_discount1 +msgid "Default Supplier Discount 1 (%)" +msgstr "" + +#. module: purchase_triple_discount +#: model:ir.model.fields,field_description:purchase_triple_discount.field_res_partner__default_supplierinfo_discount2 +#: model:ir.model.fields,field_description:purchase_triple_discount.field_res_users__default_supplierinfo_discount2 +msgid "Default Supplier Discount 2 (%)" +msgstr "" + +#. module: purchase_triple_discount +#: model:ir.model.fields,field_description:purchase_triple_discount.field_res_partner__default_supplierinfo_discount3 +#: model:ir.model.fields,field_description:purchase_triple_discount.field_res_users__default_supplierinfo_discount3 +msgid "Default Supplier Discount 3 (%)" +msgstr "" + +#. module: purchase_triple_discount +#: model:ir.model.fields,field_description:purchase_triple_discount.field_product_supplierinfo__discount +#: model:ir.model.fields,field_description:purchase_triple_discount.field_purchase_order_line__discount +msgid "Discount (%)" +msgstr "" + +#. module: purchase_triple_discount +#: model:ir.model.fields,field_description:purchase_triple_discount.field_product_supplierinfo__discount1 +#: model:ir.model.fields,field_description:purchase_triple_discount.field_purchase_order_line__discount1 +#: model:ir.model.fields,field_description:purchase_triple_discount.field_purchase_report__discount1 +msgid "Discount 1 (%)" +msgstr "" + +#. module: purchase_triple_discount +#: model:ir.model.fields,field_description:purchase_triple_discount.field_product_supplierinfo__discount2 +#: model:ir.model.fields,field_description:purchase_triple_discount.field_purchase_order_line__discount2 +#: model:ir.model.fields,field_description:purchase_triple_discount.field_purchase_report__discount2 +msgid "Discount 2 (%)" +msgstr "" + +#. module: purchase_triple_discount +#: model:ir.model.fields,field_description:purchase_triple_discount.field_product_supplierinfo__discount3 +#: model:ir.model.fields,field_description:purchase_triple_discount.field_purchase_order_line__discount3 +#: model:ir.model.fields,field_description:purchase_triple_discount.field_purchase_report__discount3 +msgid "Discount 3 (%)" +msgstr "" + +#. module: purchase_triple_discount +#: model:ir.model,name:purchase_triple_discount.model_purchase_order_line +msgid "Purchase Order Line" +msgstr "Linie comandă achiziție" + +#. module: purchase_triple_discount +#: model:ir.model,name:purchase_triple_discount.model_purchase_report +#, fuzzy +msgid "Purchase Report" +msgstr "Linie comandă achiziție" + +#. module: purchase_triple_discount +#: model:ir.model,name:purchase_triple_discount.model_product_supplierinfo +msgid "Supplier Pricelist" +msgstr "" + +#. module: purchase_triple_discount +#: model:ir.model.fields,help:purchase_triple_discount.field_res_partner__default_supplierinfo_discount1 +#: model:ir.model.fields,help:purchase_triple_discount.field_res_partner__default_supplierinfo_discount2 +#: model:ir.model.fields,help:purchase_triple_discount.field_res_partner__default_supplierinfo_discount3 +#: model:ir.model.fields,help:purchase_triple_discount.field_res_users__default_supplierinfo_discount1 +#: model:ir.model.fields,help:purchase_triple_discount.field_res_users__default_supplierinfo_discount2 +#: model:ir.model.fields,help:purchase_triple_discount.field_res_users__default_supplierinfo_discount3 +msgid "" +"This value will be used as the default one, for each new supplierinfo line " +"depending on that supplier." +msgstr "" + +#. module: purchase_triple_discount +#: model:ir.model.fields,field_description:purchase_triple_discount.field_purchase_report__discount +#: model_terms:ir.ui.view,arch_db:purchase_triple_discount.product_supplierinfo_form_view +#: model_terms:ir.ui.view,arch_db:purchase_triple_discount.product_supplierinfo_tree_view +#: model_terms:ir.ui.view,arch_db:purchase_triple_discount.purchase_order_triple_discount_form_view +#: model_terms:ir.ui.view,arch_db:purchase_triple_discount.res_partner_form_view +msgid "Total discount" +msgstr "" diff --git a/purchase_triple_discount/i18n/sl.po b/purchase_triple_discount/i18n/sl.po new file mode 100644 index 00000000000..b8a4aef066a --- /dev/null +++ b/purchase_triple_discount/i18n/sl.po @@ -0,0 +1,142 @@ +# Translation of Odoo Server. +# This file contains the translation of the following modules: +# * purchase_triple_discount +# +# Translators: +# OCA Transbot , 2017 +msgid "" +msgstr "" +"Project-Id-Version: Odoo Server 10.0\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2017-11-24 07:53+0000\n" +"PO-Revision-Date: 2021-02-24 11:45+0000\n" +"Last-Translator: Matjaz Mozetic \n" +"Language-Team: Slovenian (https://www.transifex.com/oca/teams/23907/sl/)\n" +"Language: sl\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: \n" +"Plural-Forms: nplurals=4; plural=n%100==1 ? 0 : n%100==2 ? 1 : n%100==3 || " +"n%100==4 ? 2 : 3;\n" +"X-Generator: Weblate 4.3.2\n" + +#. module: purchase_triple_discount +#: model_terms:ir.ui.view,arch_db:purchase_triple_discount.report_purchaseorder_document_triple_discount +msgid "Disc. 1 (%)" +msgstr "" + +#. module: purchase_triple_discount +#: model_terms:ir.ui.view,arch_db:purchase_triple_discount.report_purchaseorder_document_triple_discount +msgid "Disc. 2 (%)" +msgstr "" + +#. module: purchase_triple_discount +#: model_terms:ir.ui.view,arch_db:purchase_triple_discount.report_purchaseorder_document_triple_discount +msgid "Disc. 3 (%)" +msgstr "" + +#. module: purchase_triple_discount +#: model:ir.model,name:purchase_triple_discount.model_res_partner +msgid "Contact" +msgstr "Stik" + +#. module: purchase_triple_discount +#: model:ir.model.fields,field_description:purchase_triple_discount.field_res_partner__default_supplierinfo_discount1 +#: model:ir.model.fields,field_description:purchase_triple_discount.field_res_users__default_supplierinfo_discount1 +msgid "Default Supplier Discount 1 (%)" +msgstr "" + +#. module: purchase_triple_discount +#: model:ir.model.fields,field_description:purchase_triple_discount.field_res_partner__default_supplierinfo_discount2 +#: model:ir.model.fields,field_description:purchase_triple_discount.field_res_users__default_supplierinfo_discount2 +msgid "Default Supplier Discount 2 (%)" +msgstr "Privzeti popust dobavitelja 2 (%)" + +#. module: purchase_triple_discount +#: model:ir.model.fields,field_description:purchase_triple_discount.field_res_partner__default_supplierinfo_discount3 +#: model:ir.model.fields,field_description:purchase_triple_discount.field_res_users__default_supplierinfo_discount3 +msgid "Default Supplier Discount 3 (%)" +msgstr "Privzeti popust dobavitelja 3 (%)" + +#. module: purchase_triple_discount +#: model:ir.model.fields,field_description:purchase_triple_discount.field_product_supplierinfo__discount +#: model:ir.model.fields,field_description:purchase_triple_discount.field_purchase_order_line__discount +msgid "Discount (%)" +msgstr "" + +#. module: purchase_triple_discount +#: model:ir.model.fields,field_description:purchase_triple_discount.field_product_supplierinfo__discount1 +#: model:ir.model.fields,field_description:purchase_triple_discount.field_purchase_order_line__discount1 +#: model:ir.model.fields,field_description:purchase_triple_discount.field_purchase_report__discount1 +msgid "Discount 1 (%)" +msgstr "" + +#. module: purchase_triple_discount +#: model:ir.model.fields,field_description:purchase_triple_discount.field_product_supplierinfo__discount2 +#: model:ir.model.fields,field_description:purchase_triple_discount.field_purchase_order_line__discount2 +#: model:ir.model.fields,field_description:purchase_triple_discount.field_purchase_report__discount2 +msgid "Discount 2 (%)" +msgstr "Popust 2 (%)" + +#. module: purchase_triple_discount +#: model:ir.model.fields,field_description:purchase_triple_discount.field_product_supplierinfo__discount3 +#: model:ir.model.fields,field_description:purchase_triple_discount.field_purchase_order_line__discount3 +#: model:ir.model.fields,field_description:purchase_triple_discount.field_purchase_report__discount3 +msgid "Discount 3 (%)" +msgstr "Popust 3 (%)" + +#. module: purchase_triple_discount +#: model:ir.model,name:purchase_triple_discount.model_purchase_order_line +msgid "Purchase Order Line" +msgstr "Postavka nabavnega naloga" + +#. module: purchase_triple_discount +#: model:ir.model,name:purchase_triple_discount.model_purchase_report +msgid "Purchase Report" +msgstr "Poročilo o nabavi" + +#. module: purchase_triple_discount +#: model:ir.model,name:purchase_triple_discount.model_product_supplierinfo +msgid "Supplier Pricelist" +msgstr "Cenik dobavitelja" + +#. module: purchase_triple_discount +#: model:ir.model.fields,help:purchase_triple_discount.field_res_partner__default_supplierinfo_discount1 +#: model:ir.model.fields,help:purchase_triple_discount.field_res_partner__default_supplierinfo_discount2 +#: model:ir.model.fields,help:purchase_triple_discount.field_res_partner__default_supplierinfo_discount3 +#: model:ir.model.fields,help:purchase_triple_discount.field_res_users__default_supplierinfo_discount1 +#: model:ir.model.fields,help:purchase_triple_discount.field_res_users__default_supplierinfo_discount2 +#: model:ir.model.fields,help:purchase_triple_discount.field_res_users__default_supplierinfo_discount3 +msgid "" +"This value will be used as the default one, for each new supplierinfo line " +"depending on that supplier." +msgstr "" +"Ta vrednost se bo uporabljala kot privzeta za vsako novo postavko " +"\"supplierinfo\" vezano na tega dobavitelja." + +#. module: purchase_triple_discount +#: model:ir.model.fields,field_description:purchase_triple_discount.field_purchase_report__discount +#: model_terms:ir.ui.view,arch_db:purchase_triple_discount.product_supplierinfo_form_view +#: model_terms:ir.ui.view,arch_db:purchase_triple_discount.product_supplierinfo_tree_view +#: model_terms:ir.ui.view,arch_db:purchase_triple_discount.purchase_order_triple_discount_form_view +#: model_terms:ir.ui.view,arch_db:purchase_triple_discount.res_partner_form_view +msgid "Total discount" +msgstr "" + +#~ msgid "Discount 2 must be lower than 100%." +#~ msgstr "Popust 2 ne sme presegati 100%." + +#~ msgid "Discount 3 must be lower than 100%." +#~ msgstr "Popust 3 ne sme presegati 100%." + +#~ msgid "Disc. 2 (%)" +#~ msgstr "Pop. 2(%)" + +#~ msgid "Disc. 3 (%)" +#~ msgstr "Pop. 3(%)" + +#~ msgid "Invoice" +#~ msgstr "Račun" + +#~ msgid "Stock Rule" +#~ msgstr "Pravilo zaloge" diff --git a/purchase_triple_discount/i18n/zh_CN.po b/purchase_triple_discount/i18n/zh_CN.po new file mode 100644 index 00000000000..1f719e8e4b3 --- /dev/null +++ b/purchase_triple_discount/i18n/zh_CN.po @@ -0,0 +1,136 @@ +# Translation of Odoo Server. +# This file contains the translation of the following modules: +# * purchase_triple_discount +# +msgid "" +msgstr "" +"Project-Id-Version: Odoo Server 12.0\n" +"Report-Msgid-Bugs-To: \n" +"PO-Revision-Date: 2019-09-02 14:40+0000\n" +"Last-Translator: 黎伟杰 <674416404@qq.com>\n" +"Language-Team: none\n" +"Language: zh_CN\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: \n" +"Plural-Forms: nplurals=1; plural=0;\n" +"X-Generator: Weblate 3.8\n" + +#. module: purchase_triple_discount +#: model_terms:ir.ui.view,arch_db:purchase_triple_discount.report_purchaseorder_document_triple_discount +msgid "Disc. 1 (%)" +msgstr "" + +#. module: purchase_triple_discount +#: model_terms:ir.ui.view,arch_db:purchase_triple_discount.report_purchaseorder_document_triple_discount +msgid "Disc. 2 (%)" +msgstr "" + +#. module: purchase_triple_discount +#: model_terms:ir.ui.view,arch_db:purchase_triple_discount.report_purchaseorder_document_triple_discount +msgid "Disc. 3 (%)" +msgstr "" + +#. module: purchase_triple_discount +#: model:ir.model,name:purchase_triple_discount.model_res_partner +msgid "Contact" +msgstr "联系人" + +#. module: purchase_triple_discount +#: model:ir.model.fields,field_description:purchase_triple_discount.field_res_partner__default_supplierinfo_discount1 +#: model:ir.model.fields,field_description:purchase_triple_discount.field_res_users__default_supplierinfo_discount1 +msgid "Default Supplier Discount 1 (%)" +msgstr "" + +#. module: purchase_triple_discount +#: model:ir.model.fields,field_description:purchase_triple_discount.field_res_partner__default_supplierinfo_discount2 +#: model:ir.model.fields,field_description:purchase_triple_discount.field_res_users__default_supplierinfo_discount2 +msgid "Default Supplier Discount 2 (%)" +msgstr "默认供应商折扣2 (%)" + +#. module: purchase_triple_discount +#: model:ir.model.fields,field_description:purchase_triple_discount.field_res_partner__default_supplierinfo_discount3 +#: model:ir.model.fields,field_description:purchase_triple_discount.field_res_users__default_supplierinfo_discount3 +msgid "Default Supplier Discount 3 (%)" +msgstr "默认供应商折扣3(%)" + +#. module: purchase_triple_discount +#: model:ir.model.fields,field_description:purchase_triple_discount.field_product_supplierinfo__discount +#: model:ir.model.fields,field_description:purchase_triple_discount.field_purchase_order_line__discount +msgid "Discount (%)" +msgstr "" + +#. module: purchase_triple_discount +#: model:ir.model.fields,field_description:purchase_triple_discount.field_product_supplierinfo__discount1 +#: model:ir.model.fields,field_description:purchase_triple_discount.field_purchase_order_line__discount1 +#: model:ir.model.fields,field_description:purchase_triple_discount.field_purchase_report__discount1 +msgid "Discount 1 (%)" +msgstr "" + +#. module: purchase_triple_discount +#: model:ir.model.fields,field_description:purchase_triple_discount.field_product_supplierinfo__discount2 +#: model:ir.model.fields,field_description:purchase_triple_discount.field_purchase_order_line__discount2 +#: model:ir.model.fields,field_description:purchase_triple_discount.field_purchase_report__discount2 +msgid "Discount 2 (%)" +msgstr "折扣2(%)" + +#. module: purchase_triple_discount +#: model:ir.model.fields,field_description:purchase_triple_discount.field_product_supplierinfo__discount3 +#: model:ir.model.fields,field_description:purchase_triple_discount.field_purchase_order_line__discount3 +#: model:ir.model.fields,field_description:purchase_triple_discount.field_purchase_report__discount3 +msgid "Discount 3 (%)" +msgstr "折扣3(%)" + +#. module: purchase_triple_discount +#: model:ir.model,name:purchase_triple_discount.model_purchase_order_line +msgid "Purchase Order Line" +msgstr "采购订单行" + +#. module: purchase_triple_discount +#: model:ir.model,name:purchase_triple_discount.model_purchase_report +msgid "Purchase Report" +msgstr "采购报告" + +#. module: purchase_triple_discount +#: model:ir.model,name:purchase_triple_discount.model_product_supplierinfo +msgid "Supplier Pricelist" +msgstr "供应商价格表" + +#. module: purchase_triple_discount +#: model:ir.model.fields,help:purchase_triple_discount.field_res_partner__default_supplierinfo_discount1 +#: model:ir.model.fields,help:purchase_triple_discount.field_res_partner__default_supplierinfo_discount2 +#: model:ir.model.fields,help:purchase_triple_discount.field_res_partner__default_supplierinfo_discount3 +#: model:ir.model.fields,help:purchase_triple_discount.field_res_users__default_supplierinfo_discount1 +#: model:ir.model.fields,help:purchase_triple_discount.field_res_users__default_supplierinfo_discount2 +#: model:ir.model.fields,help:purchase_triple_discount.field_res_users__default_supplierinfo_discount3 +msgid "" +"This value will be used as the default one, for each new supplierinfo line " +"depending on that supplier." +msgstr "根据供应商的不同,此值将用作每个新供应商信息行的默认值。" + +#. module: purchase_triple_discount +#: model:ir.model.fields,field_description:purchase_triple_discount.field_purchase_report__discount +#: model_terms:ir.ui.view,arch_db:purchase_triple_discount.product_supplierinfo_form_view +#: model_terms:ir.ui.view,arch_db:purchase_triple_discount.product_supplierinfo_tree_view +#: model_terms:ir.ui.view,arch_db:purchase_triple_discount.purchase_order_triple_discount_form_view +#: model_terms:ir.ui.view,arch_db:purchase_triple_discount.res_partner_form_view +msgid "Total discount" +msgstr "" + +#~ msgid "Discount 2 must be lower than 100%." +#~ msgstr "折扣2必须低于100%。" + +#~ msgid "Discount 3 must be lower than 100%." +#~ msgstr "折扣3必须低于100%。" + +#~ msgid "Disc. 2 (%)" +#~ msgstr "折扣2(%)" + +#~ msgid "Disc. 3 (%)" +#~ msgstr "折扣3 (%)" + +#~ msgid "Invoice" +#~ msgstr "发票" + +#~ msgid "Stock Rule" +#~ msgstr "库存规则" diff --git a/purchase_triple_discount/migrations/16.0.3.0.0/post-migrate.py b/purchase_triple_discount/migrations/16.0.3.0.0/post-migrate.py new file mode 100644 index 00000000000..08b7ae95cd7 --- /dev/null +++ b/purchase_triple_discount/migrations/16.0.3.0.0/post-migrate.py @@ -0,0 +1,74 @@ +# Copyright 2024 Camptocamp SA +# License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl) + +from openupgradelib import openupgrade + + +@openupgrade.logging() +def compute_purchase_line_discount(env): + purchase_lines_to_compute = env["purchase.order.line"].search( + [ + "|", + "|", + ("discount1", "!=", 0), + ("discount2", "!=", 0), + ("discount3", "!=", 0), + ] + ) + for line in purchase_lines_to_compute: + discount = line._get_aggregated_multiple_discounts( + [line[x] for x in ["discount1", "discount2", "discount3"]] + ) + rounded_discount = line._fields["discount"].convert_to_column(discount, line) + openupgrade.logged_query( + env.cr, + """ + UPDATE purchase_order_line + SET discount = %s + WHERE id = %s; + """, + tuple( + [ + rounded_discount, + line.id, + ] + ), + ) + + +@openupgrade.logging() +def compute_supplierinfo_line_discount(env): + supplierinfo_lines_to_compute = env["product.supplierinfo"].search( + [ + "|", + "|", + ("discount1", "!=", 0), + ("discount2", "!=", 0), + ("discount3", "!=", 0), + ] + ) + for line in supplierinfo_lines_to_compute: + discount = line._get_aggregated_multiple_discounts( + [line[x] for x in ["discount1", "discount2", "discount3"]] + ) + rounded_discount = line._fields["discount"].convert_to_column(discount, line) + openupgrade.logged_query( + env.cr, + """ + UPDATE product_supplierinfo + SET discount = %s + WHERE id = %s; + """, + tuple( + [ + rounded_discount, + line.id, + ] + ), + ) + + +@openupgrade.migrate() +def migrate(env, version): + compute_purchase_line_discount(env) + compute_supplierinfo_line_discount(env) diff --git a/purchase_triple_discount/migrations/16.0.3.0.0/pre-migrate.py b/purchase_triple_discount/migrations/16.0.3.0.0/pre-migrate.py new file mode 100644 index 00000000000..8c826c6c08b --- /dev/null +++ b/purchase_triple_discount/migrations/16.0.3.0.0/pre-migrate.py @@ -0,0 +1,57 @@ +# Copyright 2024 Camptocamp SA +# License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl) +from openupgradelib import openupgrade + + +def migrate_order_discount_to_discount1(env): + openupgrade.add_fields( + env, + [ + ( + "discount1", + "purchase.order.line", + "purchase_order_line", + "float", + "numeric", + "purchase_triple_discount", + 0.0, + ) + ], + ) + openupgrade.logged_query( + env.cr, + """ + UPDATE purchase_order_line + SET discount1 = discount; + """, + ) + + +def migrate_supplierinfo_discount_to_discount1(env): + openupgrade.add_fields( + env, + [ + ( + "discount1", + "product.supplierinfo", + "product_supplierinfo", + "float", + "numeric", + "purchase_triple_discount", + 0.0, + ) + ], + ) + openupgrade.logged_query( + env.cr, + """ + UPDATE product_supplierinfo + SET discount1 = discount; + """, + ) + + +@openupgrade.migrate() +def migrate(env, version): + migrate_order_discount_to_discount1(env) + migrate_supplierinfo_discount_to_discount1(env) diff --git a/purchase_triple_discount/models/__init__.py b/purchase_triple_discount/models/__init__.py new file mode 100644 index 00000000000..b319f21164c --- /dev/null +++ b/purchase_triple_discount/models/__init__.py @@ -0,0 +1,3 @@ +from . import product_supplierinfo +from . import purchase_order +from . import res_partner diff --git a/purchase_triple_discount/models/product_supplierinfo.py b/purchase_triple_discount/models/product_supplierinfo.py new file mode 100644 index 00000000000..c92ff7f2870 --- /dev/null +++ b/purchase_triple_discount/models/product_supplierinfo.py @@ -0,0 +1,34 @@ +# Copyright 2019 Tecnativa - David Vidal +# Copyright 2019 Tecnativa - Pedro M. Baeza +# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl). +from odoo import api, models + + +class ProductSupplierInfo(models.Model): + _name = "product.supplierinfo" + _inherit = ["product.supplierinfo", "triple.discount.mixin"] + + @api.onchange("partner_id") + def _onchange_partner_id(self): + self.update( + { + field: self.partner_id[f"default_supplierinfo_{field}"] + for field in self._get_multiple_discount_field_names() + } + ) + + def default_get(self, fields_list): + res = super().default_get(fields_list) + res.update( + { + field: self.partner_id[f"default_supplierinfo_{field}"] + for field in self._get_multiple_discount_field_names() + } + ) + return res + + @api.model + def _get_po_to_supplierinfo_synced_fields(self): + res = super()._get_po_to_supplierinfo_synced_fields() + res += self._get_multiple_discount_field_names() + return res diff --git a/purchase_triple_discount/models/purchase_order.py b/purchase_triple_discount/models/purchase_order.py new file mode 100644 index 00000000000..0ca5816d00f --- /dev/null +++ b/purchase_triple_discount/models/purchase_order.py @@ -0,0 +1,131 @@ + +# Copyright 2017-19 Tecnativa - David Vidal +# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl). + +from odoo import api, fields, models + + +class PurchaseOrderLine(models.Model): + _name = "purchase.order.line" + _inherit = ["purchase.order.line", "triple.discount.mixin"] + + # Redefine discount as computed to show aggregated discount + discount = fields.Float( + compute="_compute_discount", + store=True, + readonly=True, + ) + + discounted_unit_price = fields.Monetary( + string="Discounted Unit Price", + compute="_compute_discounted_unit_price", + store=True, + help="Final unit price after applying all three discounts in cascade", + ) + + @api.depends("discount1", "discount2", "discount3") + def _compute_discount(self): + """Compute the equivalent single discount from the three cascading discounts.""" + for line in self: + factor = 1.0 + for discount in [line.discount1, line.discount2, line.discount3]: + if discount: + factor *= (1 - discount / 100.0) + line.discount = (1 - factor) * 100.0 + + # Override to add triple discount dependencies + @api.depends("discount1", "discount2", "discount3") + def _compute_amount(self): + """Override to ensure amount is recalculated when triple discounts change.""" + return super()._compute_amount() + + @api.depends("price_unit", "discount1", "discount2", "discount3") + def _compute_discounted_unit_price(self): + """ + Compute the final discounted unit price by applying three discounts in cascade. + Formula: + - discounted_price_1 = price_unit * (1 - discount1/100) + - discounted_price_2 = discounted_price_1 * (1 - discount2/100) + - discounted_price_3 = discounted_price_2 * (1 - discount3/100) + """ + for line in self: + price = line.price_unit + # Apply first discount + if line.discount1: + price = price * (1 - line.discount1 / 100) + # Apply second discount on the already discounted price + if line.discount2: + price = price * (1 - line.discount2 / 100) + # Apply third discount on the already discounted price + if line.discount3: + price = price * (1 - line.discount3 / 100) + line.discounted_unit_price = price + + def _convert_to_tax_base_line_dict(self): + """ + Override to ensure the cascading discounted price is used in tax calculation. + This directly affects the price_subtotal computation. + """ + vals = super()._convert_to_tax_base_line_dict() + vals["price_unit"] = self._get_discounted_price_unit() + return vals + + def _get_discounted_price_unit(self): + """ + Override to implement cascading triple discount calculation. + Applies discount1, then discount2, then discount3 in sequence. + """ + self.ensure_one() + price = self.price_unit + # Apply first discount + if self.discount1: + price = price * (1 - self.discount1 / 100) + # Apply second discount on the already discounted price + if self.discount2: + price = price * (1 - self.discount2 / 100) + # Apply third discount on the already discounted price + if self.discount3: + price = price * (1 - self.discount3 / 100) + return price + + @api.model + def _apply_value_from_seller(self, seller): + super()._apply_value_from_seller(seller) + if not seller: + return + self.update( + { + field: seller[field] + for field in self._get_multiple_discount_field_names() + } + ) + + def _prepare_account_move_line(self, move=False): + self.ensure_one() + res = super()._prepare_account_move_line(move) + res.update( + {field: self[field] for field in self._get_multiple_discount_field_names()} + ) + return res + + def write(self, vals): + # Prevent the mixin from converting discount back to discount1. + # In triple discount mode, 'discount' is a computed field from discount1/2/3, + # so we should never allow it to be written and converted back. + # Remove 'discount' from vals to prevent mixin's conversion logic. + if "discount" in vals: + vals = vals.copy() + vals.pop("discount") + + res = super().write(vals) + + discount_fields = ["discount1", "discount2", "discount3"] + if any(field in vals for field in discount_fields) or "price_unit" in vals: + for line in self.filtered(lambda l: l.order_id.state == "purchase"): + # Avoid updating kit components' stock.move + moves = line.move_ids.filtered( + lambda s: s.state not in ("cancel", "done") + and s.product_id == line.product_id + ) + moves.write({"price_unit": line._get_discounted_price_unit()}) + return res diff --git a/purchase_triple_discount/models/res_partner.py b/purchase_triple_discount/models/res_partner.py new file mode 100644 index 00000000000..98d7588500f --- /dev/null +++ b/purchase_triple_discount/models/res_partner.py @@ -0,0 +1,27 @@ +# Copyright 2019 Tecnativa - David Vidal +# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl). +from odoo import fields, models + + +class ResPartner(models.Model): + _inherit = "res.partner" + + default_supplierinfo_discount1 = fields.Float( + string="Default Supplier Discount 1 (%)", + digits="Discount", + help="This value will be used as the default one, for each new " + "supplierinfo line depending on that supplier.", + ) + + default_supplierinfo_discount2 = fields.Float( + string="Default Supplier Discount 2 (%)", + digits="Discount", + help="This value will be used as the default one, for each new " + "supplierinfo line depending on that supplier.", + ) + default_supplierinfo_discount3 = fields.Float( + string="Default Supplier Discount 3 (%)", + digits="Discount", + help="This value will be used as the default one, for each new " + "supplierinfo line depending on that supplier.", + ) diff --git a/purchase_triple_discount/readme/CONTRIBUTORS.rst b/purchase_triple_discount/readme/CONTRIBUTORS.rst new file mode 100644 index 00000000000..317ac0d16cb --- /dev/null +++ b/purchase_triple_discount/readme/CONTRIBUTORS.rst @@ -0,0 +1,8 @@ +* `Tecnativa `_: + + * David Vidal + * Pedro M. Baeza + +* Sylvain LE GAL (https://twitter.com/legalsylvain) +* `ForgeFlow S.L. `_: + * Christopher Ormaza diff --git a/purchase_triple_discount/readme/DESCRIPTION.rst b/purchase_triple_discount/readme/DESCRIPTION.rst new file mode 100644 index 00000000000..1e65e34ddb3 --- /dev/null +++ b/purchase_triple_discount/readme/DESCRIPTION.rst @@ -0,0 +1,2 @@ +This module allows to have three successive discounts on every purchase order +line. diff --git a/purchase_triple_discount/readme/USAGE.rst b/purchase_triple_discount/readme/USAGE.rst new file mode 100644 index 00000000000..00e0f487d7f --- /dev/null +++ b/purchase_triple_discount/readme/USAGE.rst @@ -0,0 +1,24 @@ +Create a new purchase order and add discounts in any of the three discount +fields given. They go in order of precedence so discount 2 will be calculated +over discount 1 and discount 3 over the result of discount 2. For example, +let's divide by two on every discount: + +Unit price: 600.00 -> + + - Disc. 1 = 50% -> Amount = 300.00 + - Disc. 2 = 50% -> Amount = 150.00 + - Disc. 3 = 50% -> Amount = 75.00 + +You can also use negative values to charge instead of discount: + +Unit price: 600.00 -> + + - Disc. 1 = 50% -> Amount = 300.00 + - Disc. 2 = -5% -> Amount = 315.00 + +* When the purchase order is validated, the discounts will be added to the + corresponding vendor pricelist. +* Vendor pricelists can be edited as well with their corresponding new second + and third discounts. +* A default second or third discount can be set in every vendor + *Sale & Purchases* tab. diff --git a/purchase_triple_discount/report/__init__.py b/purchase_triple_discount/report/__init__.py new file mode 100644 index 00000000000..84b6eef84ac --- /dev/null +++ b/purchase_triple_discount/report/__init__.py @@ -0,0 +1 @@ +from . import purchase_report diff --git a/purchase_triple_discount/report/purchase_report.py b/purchase_triple_discount/report/purchase_report.py new file mode 100644 index 00000000000..35b8b72d1ef --- /dev/null +++ b/purchase_triple_discount/report/purchase_report.py @@ -0,0 +1,53 @@ +# Copyright 2019 GRAP (http://www.grap.coop) +# Sylvain LE GAL (https://twitter.com/legalsylvain) +# Copyright 2019 Tecnativa - Pedro M. Baeza +# License AGPL-3 - See http://www.gnu.org/licenses/agpl-3.0.html + +from odoo import fields, models + + +class PurchaseReport(models.Model): + _inherit = "purchase.report" + + discount = fields.Float( + string="Total discount", + ) + + discount1 = fields.Float( + string="Discount 1 (%)", + digits="Discount", + group_operator="avg", + ) + + discount2 = fields.Float( + string="Discount 2 (%)", + digits="Discount", + group_operator="avg", + ) + discount3 = fields.Float( + string="Discount 3 (%)", + digits="Discount", + group_operator="avg", + ) + + def _select(self): + res = super()._select() + res += ", l.discount1 AS discount1, l.discount2 AS discount2, l.discount3 AS discount3" + return res + + def _group_by(self): + res = super()._group_by() + res += ", l.discount1, l.discount2, l.discount3" + return res + + def _get_discounted_price_unit_exp(self): + """Inheritable method for getting the SQL expression used for + calculating the unit price with discount(s). + + :rtype: str + :return: SQL expression for discounted unit price. + """ + return """ + ((100 - COALESCE(l.discount1, 0.0)) * + (100 - COALESCE(l.discount2, 0.0)) * + (100 - COALESCE(l.discount3, 0.0))) / 1000000 * l.price_unit""" diff --git a/purchase_triple_discount/static/description/icon.png b/purchase_triple_discount/static/description/icon.png new file mode 100644 index 0000000000000000000000000000000000000000..3a0328b516c4980e8e44cdb63fd945757ddd132d GIT binary patch literal 9455 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 z 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 Xviia!U7SGha1wx#SCgwmn*{w2TRX*I literal 0 HcmV?d00001 diff --git a/purchase_triple_discount/static/description/index.html b/purchase_triple_discount/static/description/index.html new file mode 100644 index 00000000000..f654b3bf31c --- /dev/null +++ b/purchase_triple_discount/static/description/index.html @@ -0,0 +1,474 @@ + + + + + +Purchase Order Triple Discount + + + +
+

Purchase Order Triple Discount

+ + +

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

+

This module allows to have three successive discounts on every purchase order +line.

+

Table of contents

+ +
+

Usage

+

Create a new purchase order and add discounts in any of the three discount +fields given. They go in order of precedence so discount 2 will be calculated +over discount 1 and discount 3 over the result of discount 2. For example, +let’s divide by two on every discount:

+

Unit price: 600.00 ->

+
+
    +
  • Disc. 1 = 50% -> Amount = 300.00
  • +
  • Disc. 2 = 50% -> Amount = 150.00
  • +
  • Disc. 3 = 50% -> Amount = 75.00
  • +
+
+

You can also use negative values to charge instead of discount:

+

Unit price: 600.00 ->

+
+
    +
  • Disc. 1 = 50% -> Amount = 300.00
  • +
  • Disc. 2 = -5% -> Amount = 315.00
  • +
+
+
    +
  • When the purchase order is validated, the discounts will be added to the +corresponding vendor pricelist.
  • +
  • Vendor pricelists can be edited as well with their corresponding new second +and third discounts.
  • +
  • A default second or third discount can be set in every vendor +Sale & Purchases tab.
  • +
+
+
+

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
  • +
  • GRAP
  • +
+
+
+

Contributors

+ +
+
+

Maintainers

+

This module is maintained by the OCA.

+ +Odoo Community Association + +

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

+

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

+

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

+
+
+
+ + diff --git a/purchase_triple_discount/tests/__init__.py b/purchase_triple_discount/tests/__init__.py new file mode 100644 index 00000000000..19588b827ca --- /dev/null +++ b/purchase_triple_discount/tests/__init__.py @@ -0,0 +1 @@ +from . import test_purchase_discount diff --git a/purchase_triple_discount/tests/test_purchase_discount.py b/purchase_triple_discount/tests/test_purchase_discount.py new file mode 100644 index 00000000000..57fe633e41f --- /dev/null +++ b/purchase_triple_discount/tests/test_purchase_discount.py @@ -0,0 +1,263 @@ +# Copyright 2017-19 Tecnativa - David Vidal +# Copyright 2019 Tecnativa - Pedro M. Baeza +# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl). + +from odoo.tests import common +from odoo.tests.common import Form + + +class TestPurchaseOrder(common.TransactionCase): + @classmethod + def setUpClass(cls): + super(TestPurchaseOrder, cls).setUpClass() + cls.supplierinfo_obj = cls.env["product.supplierinfo"] + cls.account_move_model = cls.env["account.move"] + cls.partner = cls.env["res.partner"].create( + { + "name": "Mr. Odoo", + } + ) + cls.partner2 = cls.env["res.partner"].create( + { + "name": "Mrs. Odoo", + } + ) + cls.product1 = cls.env["product.product"].create( + { + "name": "Test Product 1", + "purchase_method": "purchase", + } + ) + cls.product2 = cls.env["product.product"].create( + { + "name": "Test Product 2", + "purchase_method": "purchase", + } + ) + cls.supplierinfo = cls.supplierinfo_obj.create( + { + "min_qty": 0.0, + "partner_id": cls.partner2.id, + "product_tmpl_id": cls.product1.product_tmpl_id.id, + "discount1": 10, + "discount2": 20, + "discount3": 30, + } + ) + cls.supplierinfo2 = cls.supplierinfo_obj.create( + { + "min_qty": 10.0, + "partner_id": cls.partner2.id, + "product_tmpl_id": cls.product1.product_tmpl_id.id, + "discount3": 50, + } + ) + cls.tax = cls.env["account.tax"].create( + { + "name": "TAX 15%", + "amount_type": "percent", + "type_tax_use": "purchase", + "amount": 15.0, + } + ) + cls.order = cls.env["purchase.order"].create( + { + "partner_id": cls.partner.id, + } + ) + cls.order2 = cls.env["purchase.order"].create( + { + "partner_id": cls.partner2.id, + } + ) + po_line = cls.env["purchase.order.line"] + cls.po_line1 = po_line.create( + { + "order_id": cls.order.id, + "product_id": cls.product1.id, + "date_planned": "2018-01-19 00:00:00", + "name": "Line 1", + "product_qty": 1.0, + "product_uom": cls.product1.uom_id.id, + "taxes_id": [(6, 0, [cls.tax.id])], + "price_unit": 600.0, + } + ) + cls.po_line2 = po_line.create( + { + "order_id": cls.order.id, + "product_id": cls.product2.id, + "date_planned": "2018-01-19 00:00:00", + "name": "Line 2", + "product_qty": 10.0, + "product_uom": cls.product2.uom_id.id, + "taxes_id": [(6, 0, [cls.tax.id])], + "price_unit": 60.0, + } + ) + cls.po_line3 = po_line.create( + { + "order_id": cls.order2.id, + "product_id": cls.product1.id, + "date_planned": "2020-01-01 00:00:00", + "name": "Line 1", + "product_qty": 1.0, + "product_uom": cls.product1.uom_id.id, + "taxes_id": [(6, 0, [cls.tax.id])], + "price_unit": 600.0, + } + ) + + def test_01_purchase_order_classic_discount(self): + """Tests with single discount1""" + self.po_line1.discount1 = 50.0 + self.po_line2.discount1 = 75.0 + self.assertEqual(self.po_line1.price_subtotal, 300.0) + self.assertEqual(self.po_line2.price_subtotal, 150.0) + self.assertEqual(self.order.amount_untaxed, 450.0) + self.assertEqual(self.order.amount_tax, 67.5) + # Mix taxed and untaxed: + self.po_line1.taxes_id = False + self.assertEqual(self.order.amount_tax, 22.5) + + def test_02_purchase_order_simple_triple_discount(self): + """Tests on a single line""" + self.po_line2.unlink() + # Divide by two on every discount1: + self.po_line1.discount1 = 50.0 + self.po_line1.discount2 = 50.0 + self.po_line1.discount3 = 50.0 + self.assertEqual(self.po_line1.price_subtotal, 75.0) + self.assertEqual(self.order.amount_untaxed, 75.0) + self.assertEqual(self.order.amount_tax, 11.25) + # Unset first discount1: + self.po_line1.discount1 = 0.0 + self.assertEqual(self.po_line1.price_subtotal, 150.0) + self.assertEqual(self.order.amount_untaxed, 150.0) + self.assertEqual(self.order.amount_tax, 22.5) + # Set a charge instead: + self.po_line1.discount2 = -50.0 + self.assertEqual(self.po_line1.price_subtotal, 450.0) + self.assertEqual(self.order.amount_untaxed, 450.0) + self.assertEqual(self.order.amount_tax, 67.5) + + def test_03_purchase_order_complex_triple_discount(self): + """Tests on multiple lines""" + self.po_line1.discount1 = 50.0 + self.po_line1.discount2 = 50.0 + self.po_line1.discount3 = 50.0 + self.assertEqual(self.po_line1.price_subtotal, 75.0) + self.assertEqual(self.order.amount_untaxed, 675.0) + self.assertEqual(self.order.amount_tax, 101.25) + self.po_line2.discount3 = 50.0 + self.assertEqual(self.po_line2.price_subtotal, 300.0) + self.assertEqual(self.order.amount_untaxed, 375.0) + self.assertEqual(self.order.amount_tax, 56.25) + + def test_04_purchase_order_triple_discount_invoicing(self): + """When a confirmed order is invoiced, the resultant invoice + should inherit the discounts""" + self.po_line1.discount1 = 50.0 + self.po_line1.discount2 = 50.0 + self.po_line1.discount3 = 50.0 + self.po_line2.discount3 = 50.0 + self.order.button_confirm() + invoice_form = Form( + self.account_move_model.with_context(default_move_type="in_invoice") + ) + invoice_form.partner_id = self.order.partner_id + + self.invoice = invoice_form.save() + self.invoice.purchase_id = self.order.id + self.invoice._onchange_purchase_auto_complete() + + self.assertEqual( + self.po_line1.discount1, self.invoice.invoice_line_ids[0].discount1 + ) + self.assertEqual( + self.po_line1.discount2, self.invoice.invoice_line_ids[0].discount2 + ) + self.assertEqual( + self.po_line1.discount3, self.invoice.invoice_line_ids[0].discount3 + ) + self.assertEqual( + self.po_line2.discount3, self.invoice.invoice_line_ids[1].discount3 + ) + self.assertEqual(self.order.amount_total, self.invoice.amount_total) + + def test_05_purchase_order_default_discounts(self): + with Form(self.order2).order_line.edit(0) as line: + line.product_qty = 1.0 + self.assertEqual(line.discount1, 10) + self.assertEqual(line.discount2, 20) + self.assertEqual(line.discount3, 30) + line.product_qty = 10 + self.assertFalse(line.discount1) + self.assertFalse(line.discount2) + self.assertEqual(line.discount3, 50) + + def test_06_default_supplier_discounts(self): + self.partner2.default_supplierinfo_discount1 = 11 + self.partner2.default_supplierinfo_discount2 = 22 + self.partner2.default_supplierinfo_discount3 = 33 + supplierinfo = self.supplierinfo_obj.new( + { + "min_qty": 0.0, + "partner_id": self.partner2.id, + "product_tmpl_id": self.product1.product_tmpl_id.id, + "discount1": 10, + } + ) + self.assertEqual(supplierinfo.discount1, 10) + self.assertEqual(supplierinfo.discount2, 22) + self.assertEqual(supplierinfo.discount3, 33) + + def test_07_supplierinfo_from_purchaseorder(self): + self.order2.order_line.create( + { + "order_id": self.order2.id, + "product_id": self.product2.id, + "date_planned": "2020-01-01 00:00:00", + "name": "Line 2", + "product_qty": 1.0, + "product_uom": self.product2.uom_id.id, + "taxes_id": [(6, 0, [self.tax.id])], + "price_unit": 999.0, + "discount1": 11.11, + "discount2": 22.22, + "discount3": 33.33, + } + ) + self.order2.button_confirm() + seller = self.supplierinfo_obj.search( + [ + ("partner_id", "=", self.partner2.id), + ("product_tmpl_id", "=", self.product2.product_tmpl_id.id), + ] + ) + self.assertTrue(seller) + self.assertEqual(seller.discount1, 11.11) + self.assertEqual(seller.discount2, 22.22) + self.assertEqual(seller.discount3, 33.33) + + def test_08_purchase_report(self): + self.po_line2.write( + { + "discount2": 50, + "discount3": 20, + } + ) + self.order.currency_id.rate_ids.unlink() # for avoiding rate convers. + rec = self.env["purchase.report"].search( + [ + ("product_id", "=", self.product2.id), + ] + ) + self.assertEqual(rec.discount2, 50) + self.assertEqual(rec.discount3, 20) + # Changes value of comparison, + # because currently include taxes on field price_total + # https://bit.ly/3Hv2bEX + # https://bit.ly/3ESkdiO + self.assertEqual(self.po_line2.price_tax, 36) + self.assertEqual(rec.price_total, 276) diff --git a/purchase_triple_discount/views/product_supplierinfo_view.xml b/purchase_triple_discount/views/product_supplierinfo_view.xml new file mode 100644 index 00000000000..db392e996a3 --- /dev/null +++ b/purchase_triple_discount/views/product_supplierinfo_view.xml @@ -0,0 +1,40 @@ + + + + product.supplierinfo + + + + Total discount + + + + + + + + + + + product.supplierinfo + + + + hide + Total discount + + + + + + + + + + diff --git a/purchase_triple_discount/views/purchase_order_report.xml b/purchase_triple_discount/views/purchase_order_report.xml new file mode 100644 index 00000000000..9767a400de0 --- /dev/null +++ b/purchase_triple_discount/views/purchase_order_report.xml @@ -0,0 +1,34 @@ + + + + diff --git a/purchase_triple_discount/views/purchase_view.xml b/purchase_triple_discount/views/purchase_view.xml new file mode 100644 index 00000000000..36e6abb07fb --- /dev/null +++ b/purchase_triple_discount/views/purchase_view.xml @@ -0,0 +1,60 @@ + + + + + purchase.order.line.form2.triple.discount + purchase.order.line + + 98 + + + Total discount + hide + + + + + + + + + + + + purchase.order.line.tree.triple.discount + purchase.order.line + + 98 + + + Total discount + hide + + + + + + + + + + + + purchase.order.form.triple.discount + purchase.order + + + + Total discount + hide + + + + + + + + + + + diff --git a/purchase_triple_discount/views/res_partner_view.xml b/purchase_triple_discount/views/res_partner_view.xml new file mode 100644 index 00000000000..3db43518507 --- /dev/null +++ b/purchase_triple_discount/views/res_partner_view.xml @@ -0,0 +1,27 @@ + + + + res.partner + + + + Total discount + + + + + + + + + +