diff --git a/agreement_rebate/README.rst b/agreement_rebate/README.rst new file mode 100644 index 000000000..4fd862c63 --- /dev/null +++ b/agreement_rebate/README.rst @@ -0,0 +1,132 @@ +================ +Agreement Rebate +================ + +.. !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! + !! This file is generated by oca-gen-addon-readme !! + !! changes will be overwritten. !! + !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! + +.. |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%2Fcontract-lightgray.png?logo=github + :target: https://github.com/OCA/contract/tree/13.0/agreement_rebate + :alt: OCA/contract +.. |badge4| image:: https://img.shields.io/badge/weblate-Translate%20me-F47D42.png + :target: https://translation.odoo-community.org/projects/contract-13-0/contract-13-0-agreement_rebate + :alt: Translate me on Weblate +.. |badge5| image:: https://img.shields.io/badge/runbot-Try%20me-875A7B.png + :target: https://runbot.odoo-community.org/runbot/110/13.0 + :alt: Try me on Runbot + +|badge1| |badge2| |badge3| |badge4| |badge5| + +This module extends the functionality of agreement module to allow define +rebate conditions. + +**Table of contents** + +.. contents:: + :local: + +Usage +===== + +To use this module you need to: + +#. Go to a *Agreements > agreement*. +#. Create an agreement of type *Rebate agreement for sale*. +#. Set a rappel type. + + Basic global rappel discount + + .. image:: https://raw.githubusercontent.com/OCA/contract/13.0/agreement_rebate/static/img/agreement_discount_global.png + :width: 80 % + :align: center + + Basic rappel discount by line items + + .. image:: https://raw.githubusercontent.com/OCA/contract/13.0/agreement_rebate/static/img/agreement_discount_line.png + :width: 80 % + :align: center + + Section rappel discount rule match + + .. image:: https://raw.githubusercontent.com/OCA/contract/13.0/agreement_rebate/static/img/agreement_discount_section_rule_match.png + :width: 80 % + :align: center + + Calculate the discount in each amount section + + .. image:: https://raw.githubusercontent.com/OCA/contract/13.0/agreement_rebate/static/img/agreement_discount_section.png + :width: 80 % + :align: center + +#. Create any rebate lines to apply this agreement. + + Add a product template filter to apply this agreement + + .. image:: https://raw.githubusercontent.com/OCA/contract/13.0/agreement_rebate/static/img/agreement_rebate_lines_filter.png + :width: 80 % + :align: center + +#. Do some invoices of products included in any rebate agreement +#. Create rebate settlements from *Agreements > Settlements > Create Settlements* + wizard + + .. image:: https://raw.githubusercontent.com/OCA/contract/13.0/agreement_rebate/static/img/create_settlements_wizard.png + :width: 80 % + :align: center + +#. Create rappel invoices from *Agreements > Settlements > Create Invoices* wizard + + .. image:: https://raw.githubusercontent.com/OCA/contract/13.0/agreement_rebate/static/img/create_settlement_invoices.png + :width: 80 % + :align: center + +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 smashing it by providing a detailed and welcomed +`feedback `_. + +Do not contact contributors directly about support or help with technical issues. + +Credits +======= + +Authors +~~~~~~~ + +* Tecnativa + +Contributors +~~~~~~~~~~~~ + +* `Tecnativa `_: + + * Carlos Dauden + * Sergio Teruel + +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/contract `_ project on GitHub. + +You are welcome to contribute. To learn how please visit https://odoo-community.org/page/Contribute. diff --git a/agreement_rebate/__init__.py b/agreement_rebate/__init__.py new file mode 100644 index 000000000..9b2246d7e --- /dev/null +++ b/agreement_rebate/__init__.py @@ -0,0 +1,3 @@ +# License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl). +from . import models +from . import wizards diff --git a/agreement_rebate/__manifest__.py b/agreement_rebate/__manifest__.py new file mode 100644 index 000000000..3d9079fe5 --- /dev/null +++ b/agreement_rebate/__manifest__.py @@ -0,0 +1,28 @@ +# Copyright 2020 Tecnativa - Carlos Dauden +# Copyright 2020 Tecnativa - Sergio Teruel +# License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl). +{ + "name": "Agreement Rebate", + "summary": "Rebate in agreements", + "version": "13.0.1.0.0", + "development_status": "Beta", + "category": "Contract", + "website": "https://github.com/OCA/contract", + "author": "Tecnativa, Odoo Community Association (OCA)", + "license": "AGPL-3", + "application": False, + "installable": True, + "depends": ["account", "account_invoice_refund_link", "agreement"], + "data": [ + "data/agreement_rebate_data.xml", + "security/agreement_rebate_security.xml", + "security/ir.model.access.csv", + "views/agreement_condition_view.xml", + "views/agreement_view.xml", + "views/agreement_rebate_settlement_view.xml", + "views/agreement_type.xml", + "wizards/invoice_create_views.xml", + "wizards/settlement_create_views.xml", + "views/agreement_menu_view.xml", + ], +} diff --git a/agreement_rebate/data/agreement_rebate_data.xml b/agreement_rebate/data/agreement_rebate_data.xml new file mode 100644 index 000000000..c4476a3cd --- /dev/null +++ b/agreement_rebate/data/agreement_rebate_data.xml @@ -0,0 +1,19 @@ + + + + Agreement rebate settlement + agreement.rebate.settlement + + ARS + + + Rebate agreements for sales + True + sale + + + Rebate agreements for purchases + True + purchase + + diff --git a/agreement_rebate/i18n/agreement_rebate.pot b/agreement_rebate/i18n/agreement_rebate.pot new file mode 100644 index 000000000..3ebb50606 --- /dev/null +++ b/agreement_rebate/i18n/agreement_rebate.pot @@ -0,0 +1,697 @@ +# Translation of Odoo Server. +# This file contains the translation of the following modules: +# * agreement_rebate +# +msgid "" +msgstr "" +"Project-Id-Version: Odoo Server 13.0\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2022-02-18 18:50+0000\n" +"PO-Revision-Date: 2022-02-18 18:50+0000\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: agreement_rebate +#: model:ir.model.fields,field_description:agreement_rebate.field_agreement_rebate_section__rebate_discount +msgid "% Dto" +msgstr "" + +#. module: agreement_rebate +#: model_terms:ir.ui.view,arch_db:agreement_rebate.agreement_form +msgid "" +"\n" +" You can create a filter to apply the rebate.\n" +" Categories, products, variants, generic conditions to reuse or a custom filter" +msgstr "" + +#. module: agreement_rebate +#: model_terms:ir.ui.view,arch_db:agreement_rebate.agreement_rebate_settlement_form +msgid "Agreement" +msgstr "" + +#. module: agreement_rebate +#: model_terms:ir.ui.view,arch_db:agreement_rebate.agreement_rebate_settlement_form +msgid "Details" +msgstr "" + +#. module: agreement_rebate +#: model:ir.model.fields,field_description:agreement_rebate.field_agreement__additional_consumption +msgid "Additional consumption" +msgstr "" + +#. module: agreement_rebate +#: model:ir.model,name:agreement_rebate.model_agreement +#: model:ir.model.fields,field_description:agreement_rebate.field_agreement_rebate_line__agreement_id +#: model:ir.model.fields,field_description:agreement_rebate.field_agreement_rebate_section__agreement_id +#: model:ir.model.fields,field_description:agreement_rebate.field_agreement_rebate_settlement_line__agreement_id +#: model_terms:ir.ui.view,arch_db:agreement_rebate.agreement_rebate_settlement_line_search +msgid "Agreement" +msgstr "" + +#. module: agreement_rebate +#: model:ir.model,name:agreement_rebate.model_agreement_rebate_condition +msgid "Agreement Rebate Condition" +msgstr "" + +#. module: agreement_rebate +#: model:ir.model,name:agreement_rebate.model_agreement_rebate_line +msgid "Agreement Rebate Lines" +msgstr "" + +#. module: agreement_rebate +#: model:ir.model,name:agreement_rebate.model_agreement_rebate_section +msgid "Agreement Rebate Section" +msgstr "" + +#. module: agreement_rebate +#: model:ir.model,name:agreement_rebate.model_agreement_rebate_settlement +msgid "Agreement Rebate Settlement" +msgstr "" + +#. module: agreement_rebate +#: model:ir.model,name:agreement_rebate.model_agreement_rebate_settlement_line +msgid "Agreement Rebate Settlement Lines" +msgstr "" + +#. module: agreement_rebate +#: model:ir.model,name:agreement_rebate.model_agreement_type +msgid "Agreement Types" +msgstr "" + +#. module: agreement_rebate +#: model:ir.model,name:agreement_rebate.model_agreement_invoice_create_wiz +msgid "Agreement invoice create wizard" +msgstr "" + +#. module: agreement_rebate +#: model:ir.actions.act_window,name:agreement_rebate.agreement_rebate_condition_action +msgid "Agreement rebate conditions" +msgstr "" + +#. module: agreement_rebate +#: model:ir.model.fields,field_description:agreement_rebate.field_agreement__rebate_line_ids +msgid "Agreement rebate lines" +msgstr "" + +#. module: agreement_rebate +#: model:ir.model.fields,field_description:agreement_rebate.field_agreement__rebate_section_ids +msgid "Agreement rebate sections" +msgstr "" + +#. module: agreement_rebate +#: model:ir.model,name:agreement_rebate.model_agreement_settlement_create_wiz +msgid "Agreement settlement create wizard" +msgstr "" + +#. module: agreement_rebate +#: model:ir.actions.act_window,name:agreement_rebate.agreement_rebate_settlement_line_action +msgid "Agreement settlement lines" +msgstr "" + +#. module: agreement_rebate +#: model:ir.actions.act_window,name:agreement_rebate.agreement_rebate_settlement_action +msgid "Agreement settlements" +msgstr "" + +#. module: agreement_rebate +#: model:ir.model.fields,field_description:agreement_rebate.field_agreement_invoice_create_wiz__agreement_type_ids +#: model:ir.model.fields,field_description:agreement_rebate.field_agreement_settlement_create_wiz__agreement_type_ids +#: model_terms:ir.ui.view,arch_db:agreement_rebate.view_invoice_create_wiz +#: model_terms:ir.ui.view,arch_db:agreement_rebate.view_settlement_create_wiz +msgid "Agreement types" +msgstr "" + +#. module: agreement_rebate +#: model:ir.model.fields,field_description:agreement_rebate.field_agreement_invoice_create_wiz__agreement_ids +#: model:ir.model.fields,field_description:agreement_rebate.field_agreement_settlement_create_wiz__agreement_ids +#: model_terms:ir.ui.view,arch_db:agreement_rebate.view_invoice_create_wiz +#: model_terms:ir.ui.view,arch_db:agreement_rebate.view_settlement_create_wiz +msgid "Agreements" +msgstr "" + +#. module: agreement_rebate +#: model:ir.model.fields,field_description:agreement_rebate.field_agreement_rebate_settlement_line__amount_gross +msgid "Amount gross" +msgstr "" + +#. module: agreement_rebate +#: model:ir.model.fields,field_description:agreement_rebate.field_agreement_rebate_settlement__amount_invoiced +#: model:ir.model.fields,field_description:agreement_rebate.field_agreement_rebate_settlement_line__amount_invoiced +msgid "Amount invoiced" +msgstr "" + +#. module: agreement_rebate +#: model:ir.model.fields,field_description:agreement_rebate.field_agreement_rebate_settlement__amount_rebate +#: model:ir.model.fields,field_description:agreement_rebate.field_agreement_rebate_settlement_line__amount_rebate +msgid "Amount rebate" +msgstr "" + +#. module: agreement_rebate +#: model:ir.model.fields.selection,name:agreement_rebate.selection__agreement__rebate_type__section_prorated +msgid "Calculate the discount in each amount section" +msgstr "" + +#. module: agreement_rebate +#: model_terms:ir.ui.view,arch_db:agreement_rebate.view_invoice_create_wiz +#: model_terms:ir.ui.view,arch_db:agreement_rebate.view_settlement_create_wiz +msgid "Cancel" +msgstr "" + +#. module: agreement_rebate +#: model:ir.model.fields.selection,name:agreement_rebate.selection__agreement_invoice_create_wiz__invoice_group__commercial_partner +msgid "Commercial partner" +msgstr "" + +#. module: agreement_rebate +#: model:ir.model.fields,field_description:agreement_rebate.field_agreement_rebate_settlement__company_id +#: model:ir.model.fields,field_description:agreement_rebate.field_agreement_rebate_settlement_line__company_id +msgid "Company" +msgstr "" + +#. module: agreement_rebate +#: model:ir.model.fields.selection,name:agreement_rebate.selection__agreement__rebate_type__section_total +msgid "Compute total and apply discount rule match" +msgstr "" + +#. module: agreement_rebate +#: model:ir.ui.menu,name:agreement_rebate.agreement_invoice_create_menu +#: model_terms:ir.ui.view,arch_db:agreement_rebate.view_invoice_create_wiz +msgid "Create invoices" +msgstr "" + +#. module: agreement_rebate +#: model:ir.ui.menu,name:agreement_rebate.agreement_settlement_create_menu +#: model_terms:ir.ui.view,arch_db:agreement_rebate.view_settlement_create_wiz +msgid "Create settlements" +msgstr "" + +#. module: agreement_rebate +#: model:ir.model.fields,field_description:agreement_rebate.field_agreement_invoice_create_wiz__create_uid +#: model:ir.model.fields,field_description:agreement_rebate.field_agreement_rebate_condition__create_uid +#: model:ir.model.fields,field_description:agreement_rebate.field_agreement_rebate_line__create_uid +#: model:ir.model.fields,field_description:agreement_rebate.field_agreement_rebate_section__create_uid +#: model:ir.model.fields,field_description:agreement_rebate.field_agreement_rebate_settlement__create_uid +#: model:ir.model.fields,field_description:agreement_rebate.field_agreement_rebate_settlement_line__create_uid +#: model:ir.model.fields,field_description:agreement_rebate.field_agreement_settlement_create_wiz__create_uid +msgid "Created by" +msgstr "" + +#. module: agreement_rebate +#: model:ir.model.fields,field_description:agreement_rebate.field_agreement_invoice_create_wiz__create_date +#: model:ir.model.fields,field_description:agreement_rebate.field_agreement_rebate_condition__create_date +#: model:ir.model.fields,field_description:agreement_rebate.field_agreement_rebate_line__create_date +#: model:ir.model.fields,field_description:agreement_rebate.field_agreement_rebate_section__create_date +#: model:ir.model.fields,field_description:agreement_rebate.field_agreement_rebate_settlement__create_date +#: model:ir.model.fields,field_description:agreement_rebate.field_agreement_rebate_settlement_line__create_date +#: model:ir.model.fields,field_description:agreement_rebate.field_agreement_settlement_create_wiz__create_date +msgid "Created on" +msgstr "" + +#. module: agreement_rebate +#: model:ir.model.fields.selection,name:agreement_rebate.selection__agreement_invoice_create_wiz__invoice_type__out_refund +msgid "Customer Credit Note" +msgstr "" + +#. module: agreement_rebate +#: model:ir.model.fields.selection,name:agreement_rebate.selection__agreement_invoice_create_wiz__invoice_type__out_invoice +msgid "Customer Invoice" +msgstr "" + +#. module: agreement_rebate +#: model:ir.model.fields,field_description:agreement_rebate.field_agreement_rebate_settlement__date +#: model:ir.model.fields,field_description:agreement_rebate.field_agreement_rebate_settlement_line__date +#: model:ir.model.fields,field_description:agreement_rebate.field_agreement_settlement_create_wiz__date +#: model_terms:ir.ui.view,arch_db:agreement_rebate.agreement_rebate_settlement_line_search +msgid "Date" +msgstr "" + +#. module: agreement_rebate +#: model:ir.model.fields,field_description:agreement_rebate.field_agreement_rebate_settlement__date_from +msgid "Date From" +msgstr "" + +#. module: agreement_rebate +#: model:ir.model.fields,field_description:agreement_rebate.field_agreement_rebate_settlement__date_to +msgid "Date To" +msgstr "" + +#. module: agreement_rebate +#: model_terms:ir.ui.view,arch_db:agreement_rebate.view_invoice_create_wiz +#: model_terms:ir.ui.view,arch_db:agreement_rebate.view_settlement_create_wiz +msgid "Dates filter" +msgstr "" + +#. module: agreement_rebate +#: code:addons/agreement_rebate/models/agreement_rebate_settlement.py:0 +#: code:addons/agreement_rebate/models/agreement_rebate_settlement.py:0 +#, python-format +msgid "Details" +msgstr "" + +#. module: agreement_rebate +#: model:ir.model.fields,field_description:agreement_rebate.field_agreement_settlement_create_wiz__discard_settled_agreement +msgid "Discard settled agreements" +msgstr "" + +#. module: agreement_rebate +#: model:ir.model.fields,field_description:agreement_rebate.field_agreement_invoice_create_wiz__display_name +#: model:ir.model.fields,field_description:agreement_rebate.field_agreement_rebate_condition__display_name +#: model:ir.model.fields,field_description:agreement_rebate.field_agreement_rebate_line__display_name +#: model:ir.model.fields,field_description:agreement_rebate.field_agreement_rebate_section__display_name +#: model:ir.model.fields,field_description:agreement_rebate.field_agreement_rebate_settlement__display_name +#: model:ir.model.fields,field_description:agreement_rebate.field_agreement_rebate_settlement_line__display_name +#: model:ir.model.fields,field_description:agreement_rebate.field_agreement_settlement_create_wiz__display_name +msgid "Display Name" +msgstr "" + +#. module: agreement_rebate +#: model:ir.model.fields,field_description:agreement_rebate.field_agreement_invoice_create_wiz__domain +#: model:ir.model.fields,field_description:agreement_rebate.field_agreement_rebate_condition__rebate_domain +#: model:ir.model.fields,field_description:agreement_rebate.field_agreement_settlement_create_wiz__domain +msgid "Domain" +msgstr "" + +#. module: agreement_rebate +#: model:ir.model.fields,field_description:agreement_rebate.field_agreement_invoice_create_wiz__invoice_partner_id +msgid "Force invoice to" +msgstr "" + +#. module: agreement_rebate +#: model:ir.model.fields,field_description:agreement_rebate.field_agreement_invoice_create_wiz__date_from +#: model:ir.model.fields,field_description:agreement_rebate.field_agreement_rebate_section__amount_from +#: model:ir.model.fields,field_description:agreement_rebate.field_agreement_rebate_settlement_line__amount_from +#: model:ir.model.fields,field_description:agreement_rebate.field_agreement_settlement_create_wiz__date_from +msgid "From" +msgstr "" + +#. module: agreement_rebate +#: model:ir.model.fields.selection,name:agreement_rebate.selection__agreement_rebate_settlement_line__invoice_status__invoiced +msgid "Fully Invoiced" +msgstr "" + +#. module: agreement_rebate +#: model:ir.model.fields.selection,name:agreement_rebate.selection__agreement__rebate_type__global +msgid "Global (A discount global for all lines)" +msgstr "" + +#. module: agreement_rebate +#: model_terms:ir.ui.view,arch_db:agreement_rebate.agreement_rebate_settlement_line_search +msgid "Group By" +msgstr "" + +#. module: agreement_rebate +#: model:ir.model.fields,field_description:agreement_rebate.field_agreement_invoice_create_wiz__invoice_group +msgid "Group invoice by" +msgstr "" + +#. module: agreement_rebate +#: model:ir.model.fields,field_description:agreement_rebate.field_agreement_invoice_create_wiz__id +#: model:ir.model.fields,field_description:agreement_rebate.field_agreement_rebate_condition__id +#: model:ir.model.fields,field_description:agreement_rebate.field_agreement_rebate_line__id +#: model:ir.model.fields,field_description:agreement_rebate.field_agreement_rebate_section__id +#: model:ir.model.fields,field_description:agreement_rebate.field_agreement_rebate_settlement__id +#: model:ir.model.fields,field_description:agreement_rebate.field_agreement_rebate_settlement_line__id +#: model:ir.model.fields,field_description:agreement_rebate.field_agreement_settlement_create_wiz__id +msgid "ID" +msgstr "" + +#. module: agreement_rebate +#: model:ir.model.fields,help:agreement_rebate.field_agreement_settlement_create_wiz__discard_settled_agreement +msgid "" +"If checked, the agreements with settlements in selected period will be " +"discard" +msgstr "" + +#. module: agreement_rebate +#: model:ir.model.fields,field_description:agreement_rebate.field_agreement_rebate_settlement__invoice_id +msgid "Invoice" +msgstr "" + +#. module: agreement_rebate +#: model:ir.model.fields,field_description:agreement_rebate.field_agreement_rebate_settlement_line__invoice_status +msgid "Invoice Status" +msgstr "" + +#. module: agreement_rebate +#: model:ir.model.fields,field_description:agreement_rebate.field_agreement_invoice_create_wiz__invoice_type +msgid "Invoice Type" +msgstr "" + +#. module: agreement_rebate +#: model:ir.actions.act_window,name:agreement_rebate.agreement_invoice_create_action +msgid "Invoice create" +msgstr "" + +#. module: agreement_rebate +#: model_terms:ir.ui.view,arch_db:agreement_rebate.view_invoice_create_wiz +msgid "Invoice data" +msgstr "" + +#. module: agreement_rebate +#: model:ir.model.fields,field_description:agreement_rebate.field_agreement_rebate_settlement_line__invoice_line_ids +msgid "Invoice lines" +msgstr "" + +#. module: agreement_rebate +#: model_terms:ir.ui.view,arch_db:agreement_rebate.agreement_rebate_settlement_line_search +#: model_terms:ir.ui.view,arch_db:agreement_rebate.agreement_rebate_settlement_search +msgid "Invoiced" +msgstr "" + +#. module: agreement_rebate +#: model:ir.model.fields,field_description:agreement_rebate.field_agreement__is_rebate +#: model:ir.model.fields,field_description:agreement_rebate.field_agreement_type__is_rebate +msgid "Is rebate agreement type" +msgstr "" + +#. module: agreement_rebate +#: model:ir.model.fields,field_description:agreement_rebate.field_agreement_invoice_create_wiz__journal_id +msgid "Journal" +msgstr "" + +#. module: agreement_rebate +#: model:ir.model,name:agreement_rebate.model_account_move_line +msgid "Journal Item" +msgstr "" + +#. module: agreement_rebate +#: model:ir.model.fields,field_description:agreement_rebate.field_agreement_settlement_create_wiz__journal_ids +#: model_terms:ir.ui.view,arch_db:agreement_rebate.view_settlement_create_wiz +msgid "Journals" +msgstr "" + +#. module: agreement_rebate +#: model:ir.model.fields,field_description:agreement_rebate.field_agreement_invoice_create_wiz____last_update +#: model:ir.model.fields,field_description:agreement_rebate.field_agreement_rebate_condition____last_update +#: model:ir.model.fields,field_description:agreement_rebate.field_agreement_rebate_line____last_update +#: model:ir.model.fields,field_description:agreement_rebate.field_agreement_rebate_section____last_update +#: model:ir.model.fields,field_description:agreement_rebate.field_agreement_rebate_settlement____last_update +#: model:ir.model.fields,field_description:agreement_rebate.field_agreement_rebate_settlement_line____last_update +#: model:ir.model.fields,field_description:agreement_rebate.field_agreement_settlement_create_wiz____last_update +msgid "Last Modified on" +msgstr "" + +#. module: agreement_rebate +#: model:ir.model.fields,field_description:agreement_rebate.field_agreement_invoice_create_wiz__write_uid +#: model:ir.model.fields,field_description:agreement_rebate.field_agreement_rebate_condition__write_uid +#: model:ir.model.fields,field_description:agreement_rebate.field_agreement_rebate_line__write_uid +#: model:ir.model.fields,field_description:agreement_rebate.field_agreement_rebate_section__write_uid +#: model:ir.model.fields,field_description:agreement_rebate.field_agreement_rebate_settlement__write_uid +#: model:ir.model.fields,field_description:agreement_rebate.field_agreement_rebate_settlement_line__write_uid +#: model:ir.model.fields,field_description:agreement_rebate.field_agreement_settlement_create_wiz__write_uid +msgid "Last Updated by" +msgstr "" + +#. module: agreement_rebate +#: model:ir.model.fields,field_description:agreement_rebate.field_agreement_invoice_create_wiz__write_date +#: model:ir.model.fields,field_description:agreement_rebate.field_agreement_rebate_condition__write_date +#: model:ir.model.fields,field_description:agreement_rebate.field_agreement_rebate_line__write_date +#: model:ir.model.fields,field_description:agreement_rebate.field_agreement_rebate_section__write_date +#: model:ir.model.fields,field_description:agreement_rebate.field_agreement_rebate_settlement__write_date +#: model:ir.model.fields,field_description:agreement_rebate.field_agreement_rebate_settlement_line__write_date +#: model:ir.model.fields,field_description:agreement_rebate.field_agreement_settlement_create_wiz__write_date +msgid "Last Updated on" +msgstr "" + +#. module: agreement_rebate +#: model:ir.model.fields.selection,name:agreement_rebate.selection__agreement__rebate_type__line +msgid "Line (A discount for every line)" +msgstr "" + +#. module: agreement_rebate +#: model_terms:ir.ui.view,arch_db:agreement_rebate.agreement_form +#: model_terms:ir.ui.view,arch_db:agreement_rebate.agreement_rebate_settlement_form +msgid "Lines" +msgstr "" + +#. module: agreement_rebate +#: model:ir.model.fields,field_description:agreement_rebate.field_agreement_rebate_settlement__name +msgid "Name" +msgstr "" + +#. module: agreement_rebate +#: model_terms:ir.ui.view,arch_db:agreement_rebate.agreement_rebate_settlement_search +msgid "Name or agreement code" +msgstr "" + +#. module: agreement_rebate +#: model_terms:ir.ui.view,arch_db:agreement_rebate.agreement_rebate_settlement_line_search +#: model_terms:ir.ui.view,arch_db:agreement_rebate.agreement_rebate_settlement_search +msgid "Not invoiced" +msgstr "" + +#. module: agreement_rebate +#: model:ir.model.fields.selection,name:agreement_rebate.selection__agreement_rebate_settlement_line__invoice_status__no +msgid "Nothing to Invoice" +msgstr "" + +#. module: agreement_rebate +#: model:ir.model.fields,field_description:agreement_rebate.field_agreement_rebate_settlement__partner_id +#: model:ir.model.fields,field_description:agreement_rebate.field_agreement_rebate_settlement_line__partner_id +#: model:ir.model.fields.selection,name:agreement_rebate.selection__agreement_invoice_create_wiz__invoice_group__partner +#: model_terms:ir.ui.view,arch_db:agreement_rebate.agreement_rebate_settlement_line_search +#: model_terms:ir.ui.view,arch_db:agreement_rebate.agreement_rebate_settlement_search +msgid "Partner" +msgstr "" + +#. module: agreement_rebate +#: model:ir.model.fields,field_description:agreement_rebate.field_agreement_rebate_settlement_line__percent +msgid "Percent" +msgstr "" + +#. module: agreement_rebate +#: model_terms:ir.ui.view,arch_db:agreement_rebate.agreement_rebate_settlement_line_search +msgid "Period" +msgstr "" + +#. module: agreement_rebate +#: code:addons/agreement_rebate/models/agreement_rebate_settlement.py:0 +#, python-format +msgid "Please define an accounting sales journal for this company." +msgstr "" + +#. module: agreement_rebate +#: model:ir.model.fields,field_description:agreement_rebate.field_agreement_invoice_create_wiz__product_id +msgid "Product" +msgstr "" + +#. module: agreement_rebate +#: model:ir.model.fields,field_description:agreement_rebate.field_agreement_rebate_line__rebate_category_ids +#: model:ir.model.fields.selection,name:agreement_rebate.selection__agreement_rebate_line__rebate_target__category +msgid "Product categories" +msgstr "" + +#. module: agreement_rebate +#: model:ir.model.fields,field_description:agreement_rebate.field_agreement_rebate_line__rebate_product_tmpl_ids +#: model:ir.model.fields.selection,name:agreement_rebate.selection__agreement_rebate_line__rebate_target__product_tmpl +msgid "Product templates" +msgstr "" + +#. module: agreement_rebate +#: model:ir.model.fields.selection,name:agreement_rebate.selection__agreement_rebate_line__rebate_target__product +msgid "Product variant" +msgstr "" + +#. module: agreement_rebate +#: model:ir.model.fields,field_description:agreement_rebate.field_agreement_rebate_line__rebate_product_ids +msgid "Products" +msgstr "" + +#. module: agreement_rebate +#: model_terms:ir.ui.view,arch_db:agreement_rebate.agreement_form +#: model_terms:ir.ui.view,arch_db:agreement_rebate.agreement_search +#: model_terms:ir.ui.view,arch_db:agreement_rebate.agreement_type_search +msgid "Rebate" +msgstr "" + +#. module: agreement_rebate +#: model:ir.model.fields,field_description:agreement_rebate.field_agreement_rebate_settlement_line__rebate_line_id +msgid "Rebate Line" +msgstr "" + +#. module: agreement_rebate +#: model_terms:ir.ui.view,arch_db:agreement_rebate.agreement_form +#: model_terms:ir.ui.view,arch_db:agreement_rebate.agreement_rebate_line_form +#: model_terms:ir.ui.view,arch_db:agreement_rebate.agreement_rebate_line_tree +msgid "Rebate Lines" +msgstr "" + +#. module: agreement_rebate +#: model_terms:ir.ui.view,arch_db:agreement_rebate.agreement_rebate_section_tree +msgid "Rebate Sections" +msgstr "" + +#. module: agreement_rebate +#: model_terms:ir.ui.view,arch_db:agreement_rebate.agreement_rebate_settlement_form +#: model_terms:ir.ui.view,arch_db:agreement_rebate.agreement_rebate_settlement_line_tree +msgid "Rebate Settlement lines" +msgstr "" + +#. module: agreement_rebate +#: model_terms:ir.ui.view,arch_db:agreement_rebate.agreement_rebate_settlement_form +#: model_terms:ir.ui.view,arch_db:agreement_rebate.agreement_rebate_settlement_tree +msgid "Rebate Settlements" +msgstr "" + +#. module: agreement_rebate +#: model:ir.model.fields,field_description:agreement_rebate.field_agreement_rebate_line__rebate_target +msgid "Rebate Target" +msgstr "" + +#. module: agreement_rebate +#: model:ir.model.fields,field_description:agreement_rebate.field_agreement_rebate_condition__name +#: model:ir.model.fields,field_description:agreement_rebate.field_agreement_rebate_line__rebate_condition_id +#: model:ir.model.fields.selection,name:agreement_rebate.selection__agreement_rebate_line__rebate_target__condition +#: model_terms:ir.ui.view,arch_db:agreement_rebate.agreement_rebate_condition_form +#: model_terms:ir.ui.view,arch_db:agreement_rebate.agreement_rebate_condition_tree +msgid "Rebate condition" +msgstr "" + +#. module: agreement_rebate +#: model:ir.ui.menu,name:agreement_rebate.agreement_rebate_condition_menu +msgid "Rebate conditions" +msgstr "" + +#. module: agreement_rebate +#: model:ir.model.fields,field_description:agreement_rebate.field_agreement__rebate_discount +#: model:ir.model.fields,field_description:agreement_rebate.field_agreement_rebate_line__rebate_discount +msgid "Rebate discount" +msgstr "" + +#. module: agreement_rebate +#: model:ir.model.fields,field_description:agreement_rebate.field_agreement_rebate_line__rebate_domain +#: model:ir.model.fields.selection,name:agreement_rebate.selection__agreement_rebate_line__rebate_target__domain +msgid "Rebate domain" +msgstr "" + +#. module: agreement_rebate +#: model:ir.model.fields,field_description:agreement_rebate.field_agreement_rebate_settlement_line__rebate_section_id +msgid "Rebate section" +msgstr "" + +#. module: agreement_rebate +#: model:ir.model.fields,field_description:agreement_rebate.field_agreement_rebate_settlement_line__settlement_id +msgid "Rebate settlement" +msgstr "" + +#. module: agreement_rebate +#: model:ir.model.fields,field_description:agreement_rebate.field_agreement_invoice_create_wiz__settlements_ids +msgid "Rebate settlements" +msgstr "" + +#. module: agreement_rebate +#: model:ir.model.fields,field_description:agreement_rebate.field_agreement_rebate_settlement_line__rebate_type +msgid "Rebate type" +msgstr "" + +#. module: agreement_rebate +#: model_terms:ir.ui.view,arch_db:agreement_rebate.agreement_rebate_settlement_search +msgid "Search agreement settlements" +msgstr "" + +#. module: agreement_rebate +#: model_terms:ir.ui.view,arch_db:agreement_rebate.agreement_rebate_settlement_line_search +msgid "Search settlement lines" +msgstr "" + +#. module: agreement_rebate +#: model_terms:ir.ui.view,arch_db:agreement_rebate.agreement_form +msgid "Sections" +msgstr "" + +#. module: agreement_rebate +#: model_terms:ir.ui.view,arch_db:agreement_rebate.agreement_rebate_line_form +msgid "Select items" +msgstr "" + +#. module: agreement_rebate +#: model:ir.ui.menu,name:agreement_rebate.agreement_rebate_setting_menu_root +msgid "Settings" +msgstr "" + +#. module: agreement_rebate +#: model:ir.model.fields.selection,name:agreement_rebate.selection__agreement_invoice_create_wiz__invoice_group__settlement +msgid "Settlement" +msgstr "" + +#. module: agreement_rebate +#: model:ir.model.fields,field_description:agreement_rebate.field_agreement_rebate_settlement__line_ids +#: model:ir.ui.menu,name:agreement_rebate.agreement_rebate_settlement_line_menu +msgid "Settlement Lines" +msgstr "" + +#. module: agreement_rebate +#: model:ir.actions.act_window,name:agreement_rebate.agreement_settlement_create_action +msgid "Settlement create" +msgstr "" + +#. module: agreement_rebate +#: model:ir.model.fields,field_description:agreement_rebate.field_account_move_line__agreement_rebate_settlement_line_ids +msgid "Settlement lines" +msgstr "" + +#. module: agreement_rebate +#: model:ir.ui.menu,name:agreement_rebate.agreement_rebate_settlement_menu +#: model:ir.ui.menu,name:agreement_rebate.agreement_rebate_settlement_menu_root +#: model_terms:ir.ui.view,arch_db:agreement_rebate.view_invoice_create_wiz +msgid "Settlements" +msgstr "" + +#. module: agreement_rebate +#: model_terms:ir.ui.view,arch_db:agreement_rebate.agreement_rebate_settlement_form +#: model_terms:ir.ui.view,arch_db:agreement_rebate.agreement_rebate_settlement_line_tree +msgid "Show details" +msgstr "" + +#. module: agreement_rebate +#: model:ir.model.fields,field_description:agreement_rebate.field_agreement_rebate_settlement_line__target_domain +msgid "Target Domain" +msgstr "" + +#. module: agreement_rebate +#: model:ir.model.fields,field_description:agreement_rebate.field_agreement_invoice_create_wiz__date_to +#: model:ir.model.fields,field_description:agreement_rebate.field_agreement_rebate_section__amount_to +#: model:ir.model.fields,field_description:agreement_rebate.field_agreement_rebate_settlement_line__amount_to +#: model:ir.model.fields,field_description:agreement_rebate.field_agreement_settlement_create_wiz__date_to +msgid "To" +msgstr "" + +#. module: agreement_rebate +#: model:ir.model.fields.selection,name:agreement_rebate.selection__agreement_rebate_settlement_line__invoice_status__to_invoice +msgid "To Invoice" +msgstr "" + +#. module: agreement_rebate +#: model_terms:ir.ui.view,arch_db:agreement_rebate.agreement_rebate_settlement_line_tree +msgid "Total" +msgstr "" + +#. module: agreement_rebate +#: model:res.groups,name:agreement_rebate.group_use_agreement_rebate +msgid "Use agreement rebate" +msgstr "" + +#. module: agreement_rebate +#: model:ir.model.fields.selection,name:agreement_rebate.selection__agreement_invoice_create_wiz__invoice_type__in_invoice +msgid "Vendor Bill" +msgstr "" + +#. module: agreement_rebate +#: model:ir.model.fields.selection,name:agreement_rebate.selection__agreement_invoice_create_wiz__invoice_type__in_refund +msgid "Vendor Credit Note" +msgstr "" + +#. module: agreement_rebate +#: model:ir.model.fields,field_description:agreement_rebate.field_agreement__rebate_type +msgid "rebate type" +msgstr "" + +#. module: agreement_rebate +#: code:addons/agreement_rebate/models/agreement_rebate_settlement.py:0 +#, python-format +msgid "{} - Period: {} - {}" +msgstr "" diff --git a/agreement_rebate/i18n/es.po b/agreement_rebate/i18n/es.po new file mode 100644 index 000000000..8c7140712 --- /dev/null +++ b/agreement_rebate/i18n/es.po @@ -0,0 +1,714 @@ +# Translation of Odoo Server. +# This file contains the translation of the following modules: +# * agreement_rebate +# +msgid "" +msgstr "" +"Project-Id-Version: Odoo Server 12.0\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2022-02-18 18:50+0000\n" +"PO-Revision-Date: 2022-02-18 19:52+0100\n" +"Last-Translator: Sergio Teruel \n" +"Language-Team: \n" +"Language: es_ES\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" +"X-Generator: Poedit 2.3\n" + +#. module: agreement_rebate +#: model:ir.model.fields,field_description:agreement_rebate.field_agreement_rebate_section__rebate_discount +msgid "% Dto" +msgstr "% Dto" + +#. module: agreement_rebate +#: model_terms:ir.ui.view,arch_db:agreement_rebate.agreement_form +msgid "" +"\n" +" You can create a filter to apply the rebate.\n" +" Categories, products, variants, generic " +"conditions to reuse or a custom filter" +msgstr "" +"\n" +" Puede crear un filtro para aplicar el rápel.\n" +" Categorías, productos, variantes, condiciones " +"genéricas para reutilizar o un filtro personalizado" + +#. module: agreement_rebate +#: model_terms:ir.ui.view,arch_db:agreement_rebate.agreement_rebate_settlement_form +msgid "Agreement" +msgstr "Acuerdo" + +#. module: agreement_rebate +#: model_terms:ir.ui.view,arch_db:agreement_rebate.agreement_rebate_settlement_form +msgid "Details" +msgstr "Detalles" + +#. module: agreement_rebate +#: model:ir.model.fields,field_description:agreement_rebate.field_agreement__additional_consumption +msgid "Additional consumption" +msgstr "Consumo adicional" + +#. module: agreement_rebate +#: model:ir.model,name:agreement_rebate.model_agreement +#: model:ir.model.fields,field_description:agreement_rebate.field_agreement_rebate_line__agreement_id +#: model:ir.model.fields,field_description:agreement_rebate.field_agreement_rebate_section__agreement_id +#: model:ir.model.fields,field_description:agreement_rebate.field_agreement_rebate_settlement_line__agreement_id +#: model_terms:ir.ui.view,arch_db:agreement_rebate.agreement_rebate_settlement_line_search +msgid "Agreement" +msgstr "Acuerdo" + +#. module: agreement_rebate +#: model:ir.model,name:agreement_rebate.model_agreement_rebate_condition +msgid "Agreement Rebate Condition" +msgstr "Condición rappel" + +#. module: agreement_rebate +#: model:ir.model,name:agreement_rebate.model_agreement_rebate_line +msgid "Agreement Rebate Lines" +msgstr "Líneas de rappel" + +#. module: agreement_rebate +#: model:ir.model,name:agreement_rebate.model_agreement_rebate_section +msgid "Agreement Rebate Section" +msgstr "Tramos de rappel" + +#. module: agreement_rebate +#: model:ir.model,name:agreement_rebate.model_agreement_rebate_settlement +msgid "Agreement Rebate Settlement" +msgstr "Liquidación del rappel" + +#. module: agreement_rebate +#: model:ir.model,name:agreement_rebate.model_agreement_rebate_settlement_line +msgid "Agreement Rebate Settlement Lines" +msgstr "Líneas de liquidaciones de rappel" + +#. module: agreement_rebate +#: model:ir.model,name:agreement_rebate.model_agreement_type +msgid "Agreement Types" +msgstr "Tipos de Acuerdo" + +#. module: agreement_rebate +#: model:ir.model,name:agreement_rebate.model_agreement_invoice_create_wiz +#, fuzzy +#| msgid "Agreement rebate lines" +msgid "Agreement invoice create wizard" +msgstr "Líneas de rappel" + +#. module: agreement_rebate +#: model:ir.actions.act_window,name:agreement_rebate.agreement_rebate_condition_action +msgid "Agreement rebate conditions" +msgstr "Condiciones de rappel" + +#. module: agreement_rebate +#: model:ir.model.fields,field_description:agreement_rebate.field_agreement__rebate_line_ids +msgid "Agreement rebate lines" +msgstr "Líneas de rappel" + +#. module: agreement_rebate +#: model:ir.model.fields,field_description:agreement_rebate.field_agreement__rebate_section_ids +msgid "Agreement rebate sections" +msgstr "Tramos de rappel" + +#. module: agreement_rebate +#: model:ir.model,name:agreement_rebate.model_agreement_settlement_create_wiz +#, fuzzy +#| msgid "Agreement settlement lines" +msgid "Agreement settlement create wizard" +msgstr "Líneas de liquidaciones del acuerdo" + +#. module: agreement_rebate +#: model:ir.actions.act_window,name:agreement_rebate.agreement_rebate_settlement_line_action +msgid "Agreement settlement lines" +msgstr "Líneas de liquidaciones del acuerdo" + +#. module: agreement_rebate +#: model:ir.actions.act_window,name:agreement_rebate.agreement_rebate_settlement_action +msgid "Agreement settlements" +msgstr "Liquidaciones de acuerdos" + +#. module: agreement_rebate +#: model:ir.model.fields,field_description:agreement_rebate.field_agreement_invoice_create_wiz__agreement_type_ids +#: model:ir.model.fields,field_description:agreement_rebate.field_agreement_settlement_create_wiz__agreement_type_ids +#: model_terms:ir.ui.view,arch_db:agreement_rebate.view_invoice_create_wiz +#: model_terms:ir.ui.view,arch_db:agreement_rebate.view_settlement_create_wiz +msgid "Agreement types" +msgstr "Tipos de Acuerdo" + +#. module: agreement_rebate +#: model:ir.model.fields,field_description:agreement_rebate.field_agreement_invoice_create_wiz__agreement_ids +#: model:ir.model.fields,field_description:agreement_rebate.field_agreement_settlement_create_wiz__agreement_ids +#: model_terms:ir.ui.view,arch_db:agreement_rebate.view_invoice_create_wiz +#: model_terms:ir.ui.view,arch_db:agreement_rebate.view_settlement_create_wiz +msgid "Agreements" +msgstr "Acuerdos" + +#. module: agreement_rebate +#: model:ir.model.fields,field_description:agreement_rebate.field_agreement_rebate_settlement_line__amount_gross +msgid "Amount gross" +msgstr "Importe bruto" + +#. module: agreement_rebate +#: model:ir.model.fields,field_description:agreement_rebate.field_agreement_rebate_settlement__amount_invoiced +#: model:ir.model.fields,field_description:agreement_rebate.field_agreement_rebate_settlement_line__amount_invoiced +msgid "Amount invoiced" +msgstr "Total facturado" + +#. module: agreement_rebate +#: model:ir.model.fields,field_description:agreement_rebate.field_agreement_rebate_settlement__amount_rebate +#: model:ir.model.fields,field_description:agreement_rebate.field_agreement_rebate_settlement_line__amount_rebate +msgid "Amount rebate" +msgstr "Importe rappel" + +#. module: agreement_rebate +#: model:ir.model.fields.selection,name:agreement_rebate.selection__agreement__rebate_type__section_prorated +msgid "Calculate the discount in each amount section" +msgstr "Calcular el descuento en cada tramo" + +#. module: agreement_rebate +#: model_terms:ir.ui.view,arch_db:agreement_rebate.view_invoice_create_wiz +#: model_terms:ir.ui.view,arch_db:agreement_rebate.view_settlement_create_wiz +msgid "Cancel" +msgstr "Cancelar" + +#. module: agreement_rebate +#: model:ir.model.fields.selection,name:agreement_rebate.selection__agreement_invoice_create_wiz__invoice_group__commercial_partner +msgid "Commercial partner" +msgstr "Entidad comercial" + +#. module: agreement_rebate +#: model:ir.model.fields,field_description:agreement_rebate.field_agreement_rebate_settlement__company_id +#: model:ir.model.fields,field_description:agreement_rebate.field_agreement_rebate_settlement_line__company_id +msgid "Company" +msgstr "Compañía" + +#. module: agreement_rebate +#: model:ir.model.fields.selection,name:agreement_rebate.selection__agreement__rebate_type__section_total +msgid "Compute total and apply discount rule match" +msgstr "Calcular el total y aplicar el descuento del tramo que coincida" + +#. module: agreement_rebate +#: model:ir.ui.menu,name:agreement_rebate.agreement_invoice_create_menu +#: model_terms:ir.ui.view,arch_db:agreement_rebate.view_invoice_create_wiz +msgid "Create invoices" +msgstr "Crear facturas" + +#. module: agreement_rebate +#: model:ir.ui.menu,name:agreement_rebate.agreement_settlement_create_menu +#: model_terms:ir.ui.view,arch_db:agreement_rebate.view_settlement_create_wiz +msgid "Create settlements" +msgstr "Crear liquidaciones" + +#. module: agreement_rebate +#: model:ir.model.fields,field_description:agreement_rebate.field_agreement_invoice_create_wiz__create_uid +#: model:ir.model.fields,field_description:agreement_rebate.field_agreement_rebate_condition__create_uid +#: model:ir.model.fields,field_description:agreement_rebate.field_agreement_rebate_line__create_uid +#: model:ir.model.fields,field_description:agreement_rebate.field_agreement_rebate_section__create_uid +#: model:ir.model.fields,field_description:agreement_rebate.field_agreement_rebate_settlement__create_uid +#: model:ir.model.fields,field_description:agreement_rebate.field_agreement_rebate_settlement_line__create_uid +#: model:ir.model.fields,field_description:agreement_rebate.field_agreement_settlement_create_wiz__create_uid +msgid "Created by" +msgstr "Creado por" + +#. module: agreement_rebate +#: model:ir.model.fields,field_description:agreement_rebate.field_agreement_invoice_create_wiz__create_date +#: model:ir.model.fields,field_description:agreement_rebate.field_agreement_rebate_condition__create_date +#: model:ir.model.fields,field_description:agreement_rebate.field_agreement_rebate_line__create_date +#: model:ir.model.fields,field_description:agreement_rebate.field_agreement_rebate_section__create_date +#: model:ir.model.fields,field_description:agreement_rebate.field_agreement_rebate_settlement__create_date +#: model:ir.model.fields,field_description:agreement_rebate.field_agreement_rebate_settlement_line__create_date +#: model:ir.model.fields,field_description:agreement_rebate.field_agreement_settlement_create_wiz__create_date +msgid "Created on" +msgstr "Creado por" + +#. module: agreement_rebate +#: model:ir.model.fields.selection,name:agreement_rebate.selection__agreement_invoice_create_wiz__invoice_type__out_refund +msgid "Customer Credit Note" +msgstr "Factura rectificativa de cliente" + +#. module: agreement_rebate +#: model:ir.model.fields.selection,name:agreement_rebate.selection__agreement_invoice_create_wiz__invoice_type__out_invoice +msgid "Customer Invoice" +msgstr "Factura de cliente" + +#. module: agreement_rebate +#: model:ir.model.fields,field_description:agreement_rebate.field_agreement_rebate_settlement__date +#: model:ir.model.fields,field_description:agreement_rebate.field_agreement_rebate_settlement_line__date +#: model:ir.model.fields,field_description:agreement_rebate.field_agreement_settlement_create_wiz__date +#: model_terms:ir.ui.view,arch_db:agreement_rebate.agreement_rebate_settlement_line_search +msgid "Date" +msgstr "Fecha" + +#. module: agreement_rebate +#: model:ir.model.fields,field_description:agreement_rebate.field_agreement_rebate_settlement__date_from +msgid "Date From" +msgstr "Fecha desde" + +#. module: agreement_rebate +#: model:ir.model.fields,field_description:agreement_rebate.field_agreement_rebate_settlement__date_to +msgid "Date To" +msgstr "Fecha hasta" + +#. module: agreement_rebate +#: model_terms:ir.ui.view,arch_db:agreement_rebate.view_invoice_create_wiz +#: model_terms:ir.ui.view,arch_db:agreement_rebate.view_settlement_create_wiz +msgid "Dates filter" +msgstr "Filtrar por fechas" + +#. module: agreement_rebate +#: code:addons/agreement_rebate/models/agreement_rebate_settlement.py:0 +#, python-format +msgid "Details" +msgstr "Detalles" + +#. module: agreement_rebate +#: model:ir.model.fields,field_description:agreement_rebate.field_agreement_settlement_create_wiz__discard_settled_agreement +msgid "Discard settled agreements" +msgstr "Descartar acuerdos liquidados" + +#. module: agreement_rebate +#: model:ir.model.fields,field_description:agreement_rebate.field_agreement_invoice_create_wiz__display_name +#: model:ir.model.fields,field_description:agreement_rebate.field_agreement_rebate_condition__display_name +#: model:ir.model.fields,field_description:agreement_rebate.field_agreement_rebate_line__display_name +#: model:ir.model.fields,field_description:agreement_rebate.field_agreement_rebate_section__display_name +#: model:ir.model.fields,field_description:agreement_rebate.field_agreement_rebate_settlement__display_name +#: model:ir.model.fields,field_description:agreement_rebate.field_agreement_rebate_settlement_line__display_name +#: model:ir.model.fields,field_description:agreement_rebate.field_agreement_settlement_create_wiz__display_name +msgid "Display Name" +msgstr "Nombre a mostrar" + +#. module: agreement_rebate +#: model:ir.model.fields,field_description:agreement_rebate.field_agreement_invoice_create_wiz__domain +#: model:ir.model.fields,field_description:agreement_rebate.field_agreement_rebate_condition__rebate_domain +#: model:ir.model.fields,field_description:agreement_rebate.field_agreement_settlement_create_wiz__domain +msgid "Domain" +msgstr "Dominio" + +#. module: agreement_rebate +#: model:ir.model.fields,field_description:agreement_rebate.field_agreement_invoice_create_wiz__invoice_partner_id +msgid "Force invoice to" +msgstr "Forzar factura a" + +#. module: agreement_rebate +#: model:ir.model.fields,field_description:agreement_rebate.field_agreement_invoice_create_wiz__date_from +#: model:ir.model.fields,field_description:agreement_rebate.field_agreement_rebate_section__amount_from +#: model:ir.model.fields,field_description:agreement_rebate.field_agreement_rebate_settlement_line__amount_from +#: model:ir.model.fields,field_description:agreement_rebate.field_agreement_settlement_create_wiz__date_from +msgid "From" +msgstr "Desde" + +#. module: agreement_rebate +#: model:ir.model.fields.selection,name:agreement_rebate.selection__agreement_rebate_settlement_line__invoice_status__invoiced +msgid "Fully Invoiced" +msgstr "Facturado" + +#. module: agreement_rebate +#: model:ir.model.fields.selection,name:agreement_rebate.selection__agreement__rebate_type__global +msgid "Global (A discount global for all lines)" +msgstr "Global (Un descuento para todas las líneas)" + +#. module: agreement_rebate +#: model_terms:ir.ui.view,arch_db:agreement_rebate.agreement_rebate_settlement_line_search +msgid "Group By" +msgstr "Agrupado por" + +#. module: agreement_rebate +#: model:ir.model.fields,field_description:agreement_rebate.field_agreement_invoice_create_wiz__invoice_group +msgid "Group invoice by" +msgstr "Agrupar facturas por" + +#. module: agreement_rebate +#: model:ir.model.fields,field_description:agreement_rebate.field_agreement_invoice_create_wiz__id +#: model:ir.model.fields,field_description:agreement_rebate.field_agreement_rebate_condition__id +#: model:ir.model.fields,field_description:agreement_rebate.field_agreement_rebate_line__id +#: model:ir.model.fields,field_description:agreement_rebate.field_agreement_rebate_section__id +#: model:ir.model.fields,field_description:agreement_rebate.field_agreement_rebate_settlement__id +#: model:ir.model.fields,field_description:agreement_rebate.field_agreement_rebate_settlement_line__id +#: model:ir.model.fields,field_description:agreement_rebate.field_agreement_settlement_create_wiz__id +msgid "ID" +msgstr "ID (identificación)" + +#. module: agreement_rebate +#: model:ir.model.fields,help:agreement_rebate.field_agreement_settlement_create_wiz__discard_settled_agreement +msgid "" +"If checked, the agreements with settlements in selected period will be " +"discard" +msgstr "" +"Si está marcado, los acuerdos con liquidaciones en el periodo seleccionada " +"serán descartados" + +#. module: agreement_rebate +#: model:ir.model.fields,field_description:agreement_rebate.field_agreement_rebate_settlement__invoice_id +msgid "Invoice" +msgstr "Factura" + +#. module: agreement_rebate +#: model:ir.model.fields,field_description:agreement_rebate.field_agreement_rebate_settlement_line__invoice_status +msgid "Invoice Status" +msgstr "Estado factura" + +#. module: agreement_rebate +#: model:ir.model.fields,field_description:agreement_rebate.field_agreement_invoice_create_wiz__invoice_type +msgid "Invoice Type" +msgstr "Tipo de factura" + +#. module: agreement_rebate +#: model:ir.actions.act_window,name:agreement_rebate.agreement_invoice_create_action +msgid "Invoice create" +msgstr "Crear factura" + +#. module: agreement_rebate +#: model_terms:ir.ui.view,arch_db:agreement_rebate.view_invoice_create_wiz +msgid "Invoice data" +msgstr "Datos de factura" + +#. module: agreement_rebate +#: model:ir.model.fields,field_description:agreement_rebate.field_agreement_rebate_settlement_line__invoice_line_ids +msgid "Invoice lines" +msgstr "Líneas de factura" + +#. module: agreement_rebate +#: model_terms:ir.ui.view,arch_db:agreement_rebate.agreement_rebate_settlement_line_search +#: model_terms:ir.ui.view,arch_db:agreement_rebate.agreement_rebate_settlement_search +msgid "Invoiced" +msgstr "Facturado" + +#. module: agreement_rebate +#: model:ir.model.fields,field_description:agreement_rebate.field_agreement__is_rebate +#: model:ir.model.fields,field_description:agreement_rebate.field_agreement_type__is_rebate +msgid "Is rebate agreement type" +msgstr "Es un acuerdo de rappel" + +#. module: agreement_rebate +#: model:ir.model.fields,field_description:agreement_rebate.field_agreement_invoice_create_wiz__journal_id +msgid "Journal" +msgstr "Diario" + +#. module: agreement_rebate +#: model:ir.model,name:agreement_rebate.model_account_move_line +#, fuzzy +#| msgid "Journal" +msgid "Journal Item" +msgstr "Diario" + +#. module: agreement_rebate +#: model:ir.model.fields,field_description:agreement_rebate.field_agreement_settlement_create_wiz__journal_ids +#: model_terms:ir.ui.view,arch_db:agreement_rebate.view_settlement_create_wiz +msgid "Journals" +msgstr "Diarios" + +#. module: agreement_rebate +#: model:ir.model.fields,field_description:agreement_rebate.field_agreement_invoice_create_wiz____last_update +#: model:ir.model.fields,field_description:agreement_rebate.field_agreement_rebate_condition____last_update +#: model:ir.model.fields,field_description:agreement_rebate.field_agreement_rebate_line____last_update +#: model:ir.model.fields,field_description:agreement_rebate.field_agreement_rebate_section____last_update +#: model:ir.model.fields,field_description:agreement_rebate.field_agreement_rebate_settlement____last_update +#: model:ir.model.fields,field_description:agreement_rebate.field_agreement_rebate_settlement_line____last_update +#: model:ir.model.fields,field_description:agreement_rebate.field_agreement_settlement_create_wiz____last_update +msgid "Last Modified on" +msgstr "Última modificación el" + +#. module: agreement_rebate +#: model:ir.model.fields,field_description:agreement_rebate.field_agreement_invoice_create_wiz__write_uid +#: model:ir.model.fields,field_description:agreement_rebate.field_agreement_rebate_condition__write_uid +#: model:ir.model.fields,field_description:agreement_rebate.field_agreement_rebate_line__write_uid +#: model:ir.model.fields,field_description:agreement_rebate.field_agreement_rebate_section__write_uid +#: model:ir.model.fields,field_description:agreement_rebate.field_agreement_rebate_settlement__write_uid +#: model:ir.model.fields,field_description:agreement_rebate.field_agreement_rebate_settlement_line__write_uid +#: model:ir.model.fields,field_description:agreement_rebate.field_agreement_settlement_create_wiz__write_uid +msgid "Last Updated by" +msgstr "Última actualización por" + +#. module: agreement_rebate +#: model:ir.model.fields,field_description:agreement_rebate.field_agreement_invoice_create_wiz__write_date +#: model:ir.model.fields,field_description:agreement_rebate.field_agreement_rebate_condition__write_date +#: model:ir.model.fields,field_description:agreement_rebate.field_agreement_rebate_line__write_date +#: model:ir.model.fields,field_description:agreement_rebate.field_agreement_rebate_section__write_date +#: model:ir.model.fields,field_description:agreement_rebate.field_agreement_rebate_settlement__write_date +#: model:ir.model.fields,field_description:agreement_rebate.field_agreement_rebate_settlement_line__write_date +#: model:ir.model.fields,field_description:agreement_rebate.field_agreement_settlement_create_wiz__write_date +msgid "Last Updated on" +msgstr "Última actualización en" + +#. module: agreement_rebate +#: model:ir.model.fields.selection,name:agreement_rebate.selection__agreement__rebate_type__line +msgid "Line (A discount for every line)" +msgstr "Por línea (Un descuento para cada línea)" + +#. module: agreement_rebate +#: model_terms:ir.ui.view,arch_db:agreement_rebate.agreement_form +#: model_terms:ir.ui.view,arch_db:agreement_rebate.agreement_rebate_settlement_form +msgid "Lines" +msgstr "Líneas" + +#. module: agreement_rebate +#: model:ir.model.fields,field_description:agreement_rebate.field_agreement_rebate_settlement__name +msgid "Name" +msgstr "Nombre" + +#. module: agreement_rebate +#: model_terms:ir.ui.view,arch_db:agreement_rebate.agreement_rebate_settlement_search +msgid "Name or agreement code" +msgstr "Nombre o código" + +#. module: agreement_rebate +#: model_terms:ir.ui.view,arch_db:agreement_rebate.agreement_rebate_settlement_line_search +#: model_terms:ir.ui.view,arch_db:agreement_rebate.agreement_rebate_settlement_search +msgid "Not invoiced" +msgstr "No facturado" + +#. module: agreement_rebate +#: model:ir.model.fields.selection,name:agreement_rebate.selection__agreement_rebate_settlement_line__invoice_status__no +msgid "Nothing to Invoice" +msgstr "Nada que Facturar" + +#. module: agreement_rebate +#: model:ir.model.fields,field_description:agreement_rebate.field_agreement_rebate_settlement__partner_id +#: model:ir.model.fields,field_description:agreement_rebate.field_agreement_rebate_settlement_line__partner_id +#: model:ir.model.fields.selection,name:agreement_rebate.selection__agreement_invoice_create_wiz__invoice_group__partner +#: model_terms:ir.ui.view,arch_db:agreement_rebate.agreement_rebate_settlement_line_search +#: model_terms:ir.ui.view,arch_db:agreement_rebate.agreement_rebate_settlement_search +msgid "Partner" +msgstr "Empresa" + +#. module: agreement_rebate +#: model:ir.model.fields,field_description:agreement_rebate.field_agreement_rebate_settlement_line__percent +msgid "Percent" +msgstr "Porcentaje" + +#. module: agreement_rebate +#: model_terms:ir.ui.view,arch_db:agreement_rebate.agreement_rebate_settlement_line_search +msgid "Period" +msgstr "Período" + +#. module: agreement_rebate +#: code:addons/agreement_rebate/models/agreement_rebate_settlement.py:0 +#, python-format +msgid "Please define an accounting sales journal for this company." +msgstr "Defina un diario de ventas de contabilidad para esta empresa." + +#. module: agreement_rebate +#: model:ir.model.fields,field_description:agreement_rebate.field_agreement_invoice_create_wiz__product_id +msgid "Product" +msgstr "Producto" + +#. module: agreement_rebate +#: model:ir.model.fields,field_description:agreement_rebate.field_agreement_rebate_line__rebate_category_ids +#: model:ir.model.fields.selection,name:agreement_rebate.selection__agreement_rebate_line__rebate_target__category +msgid "Product categories" +msgstr "Categorías de producto" + +#. module: agreement_rebate +#: model:ir.model.fields,field_description:agreement_rebate.field_agreement_rebate_line__rebate_product_tmpl_ids +#: model:ir.model.fields.selection,name:agreement_rebate.selection__agreement_rebate_line__rebate_target__product_tmpl +msgid "Product templates" +msgstr "Plantilla de producto" + +#. module: agreement_rebate +#: model:ir.model.fields.selection,name:agreement_rebate.selection__agreement_rebate_line__rebate_target__product +msgid "Product variant" +msgstr "Variante de producto" + +#. module: agreement_rebate +#: model:ir.model.fields,field_description:agreement_rebate.field_agreement_rebate_line__rebate_product_ids +msgid "Products" +msgstr "Productos" + +#. module: agreement_rebate +#: model_terms:ir.ui.view,arch_db:agreement_rebate.agreement_form +#: model_terms:ir.ui.view,arch_db:agreement_rebate.agreement_search +#: model_terms:ir.ui.view,arch_db:agreement_rebate.agreement_type_search +msgid "Rebate" +msgstr "Rappel" + +#. module: agreement_rebate +#: model:ir.model.fields,field_description:agreement_rebate.field_agreement_rebate_settlement_line__rebate_line_id +msgid "Rebate Line" +msgstr "Línea de rappel" + +#. module: agreement_rebate +#: model_terms:ir.ui.view,arch_db:agreement_rebate.agreement_form +#: model_terms:ir.ui.view,arch_db:agreement_rebate.agreement_rebate_line_form +#: model_terms:ir.ui.view,arch_db:agreement_rebate.agreement_rebate_line_tree +msgid "Rebate Lines" +msgstr "Líneas de rappel" + +#. module: agreement_rebate +#: model_terms:ir.ui.view,arch_db:agreement_rebate.agreement_rebate_section_tree +msgid "Rebate Sections" +msgstr "Tramos de rappel" + +#. module: agreement_rebate +#: model_terms:ir.ui.view,arch_db:agreement_rebate.agreement_rebate_settlement_form +#: model_terms:ir.ui.view,arch_db:agreement_rebate.agreement_rebate_settlement_line_tree +msgid "Rebate Settlement lines" +msgstr "Líneas de liquidaciones de rappels" + +#. module: agreement_rebate +#: model_terms:ir.ui.view,arch_db:agreement_rebate.agreement_rebate_settlement_form +#: model_terms:ir.ui.view,arch_db:agreement_rebate.agreement_rebate_settlement_tree +msgid "Rebate Settlements" +msgstr "Liquidaciónes de rappel" + +#. module: agreement_rebate +#: model:ir.model.fields,field_description:agreement_rebate.field_agreement_rebate_line__rebate_target +msgid "Rebate Target" +msgstr "Origen del rappel" + +#. module: agreement_rebate +#: model:ir.model.fields,field_description:agreement_rebate.field_agreement_rebate_condition__name +#: model:ir.model.fields,field_description:agreement_rebate.field_agreement_rebate_line__rebate_condition_id +#: model:ir.model.fields.selection,name:agreement_rebate.selection__agreement_rebate_line__rebate_target__condition +#: model_terms:ir.ui.view,arch_db:agreement_rebate.agreement_rebate_condition_form +#: model_terms:ir.ui.view,arch_db:agreement_rebate.agreement_rebate_condition_tree +msgid "Rebate condition" +msgstr "Condición de rappel" + +#. module: agreement_rebate +#: model:ir.ui.menu,name:agreement_rebate.agreement_rebate_condition_menu +msgid "Rebate conditions" +msgstr "Condiciones de rappel" + +#. module: agreement_rebate +#: model:ir.model.fields,field_description:agreement_rebate.field_agreement__rebate_discount +#: model:ir.model.fields,field_description:agreement_rebate.field_agreement_rebate_line__rebate_discount +msgid "Rebate discount" +msgstr "(%) Descuento de rappel" + +#. module: agreement_rebate +#: model:ir.model.fields,field_description:agreement_rebate.field_agreement_rebate_line__rebate_domain +#: model:ir.model.fields.selection,name:agreement_rebate.selection__agreement_rebate_line__rebate_target__domain +msgid "Rebate domain" +msgstr "Filtro de rappel" + +#. module: agreement_rebate +#: model:ir.model.fields,field_description:agreement_rebate.field_agreement_rebate_settlement_line__rebate_section_id +msgid "Rebate section" +msgstr "Tramos de rappel" + +#. module: agreement_rebate +#: model:ir.model.fields,field_description:agreement_rebate.field_agreement_rebate_settlement_line__settlement_id +msgid "Rebate settlement" +msgstr "Liquidación rappel" + +#. module: agreement_rebate +#: model:ir.model.fields,field_description:agreement_rebate.field_agreement_invoice_create_wiz__settlements_ids +msgid "Rebate settlements" +msgstr "Liquidaciónes rappel" + +#. module: agreement_rebate +#: model:ir.model.fields,field_description:agreement_rebate.field_agreement_rebate_settlement_line__rebate_type +msgid "Rebate type" +msgstr "Tipo rappel" + +#. module: agreement_rebate +#: model_terms:ir.ui.view,arch_db:agreement_rebate.agreement_rebate_settlement_search +msgid "Search agreement settlements" +msgstr "Búsqueda de liquidaciones" + +#. module: agreement_rebate +#: model_terms:ir.ui.view,arch_db:agreement_rebate.agreement_rebate_settlement_line_search +msgid "Search settlement lines" +msgstr "Búsqueda de líneas de liquidaciones" + +#. module: agreement_rebate +#: model_terms:ir.ui.view,arch_db:agreement_rebate.agreement_form +msgid "Sections" +msgstr "Tramos" + +#. module: agreement_rebate +#: model_terms:ir.ui.view,arch_db:agreement_rebate.agreement_rebate_line_form +msgid "Select items" +msgstr "Seleccione elementos" + +#. module: agreement_rebate +#: model:ir.ui.menu,name:agreement_rebate.agreement_rebate_setting_menu_root +msgid "Settings" +msgstr "Ajustes" + +#. module: agreement_rebate +#: model:ir.model.fields.selection,name:agreement_rebate.selection__agreement_invoice_create_wiz__invoice_group__settlement +msgid "Settlement" +msgstr "Liquidación" + +#. module: agreement_rebate +#: model:ir.model.fields,field_description:agreement_rebate.field_agreement_rebate_settlement__line_ids +#: model:ir.ui.menu,name:agreement_rebate.agreement_rebate_settlement_line_menu +msgid "Settlement Lines" +msgstr "Líneas de liquidaciones" + +#. module: agreement_rebate +#: model:ir.actions.act_window,name:agreement_rebate.agreement_settlement_create_action +msgid "Settlement create" +msgstr "Crear liquidación" + +#. module: agreement_rebate +#: model:ir.model.fields,field_description:agreement_rebate.field_account_move_line__agreement_rebate_settlement_line_ids +msgid "Settlement lines" +msgstr "Líneas de liquidaciones" + +#. module: agreement_rebate +#: model:ir.ui.menu,name:agreement_rebate.agreement_rebate_settlement_menu +#: model:ir.ui.menu,name:agreement_rebate.agreement_rebate_settlement_menu_root +#: model_terms:ir.ui.view,arch_db:agreement_rebate.view_invoice_create_wiz +msgid "Settlements" +msgstr "Liquidaciones" + +#. module: agreement_rebate +#: model_terms:ir.ui.view,arch_db:agreement_rebate.agreement_rebate_settlement_form +#: model_terms:ir.ui.view,arch_db:agreement_rebate.agreement_rebate_settlement_line_tree +msgid "Show details" +msgstr "Mostrar detalles" + +#. module: agreement_rebate +#: model:ir.model.fields,field_description:agreement_rebate.field_agreement_rebate_settlement_line__target_domain +msgid "Target Domain" +msgstr "Dominio origen" + +#. module: agreement_rebate +#: model:ir.model.fields,field_description:agreement_rebate.field_agreement_invoice_create_wiz__date_to +#: model:ir.model.fields,field_description:agreement_rebate.field_agreement_rebate_section__amount_to +#: model:ir.model.fields,field_description:agreement_rebate.field_agreement_rebate_settlement_line__amount_to +#: model:ir.model.fields,field_description:agreement_rebate.field_agreement_settlement_create_wiz__date_to +msgid "To" +msgstr "Hasta" + +#. module: agreement_rebate +#: model:ir.model.fields.selection,name:agreement_rebate.selection__agreement_rebate_settlement_line__invoice_status__to_invoice +msgid "To Invoice" +msgstr "A facturar" + +#. module: agreement_rebate +#: model_terms:ir.ui.view,arch_db:agreement_rebate.agreement_rebate_settlement_line_tree +msgid "Total" +msgstr "Total" + +#. module: agreement_rebate +#: model:res.groups,name:agreement_rebate.group_use_agreement_rebate +msgid "Use agreement rebate" +msgstr "Usar acuerdo rappel" + +#. module: agreement_rebate +#: model:ir.model.fields.selection,name:agreement_rebate.selection__agreement_invoice_create_wiz__invoice_type__in_invoice +msgid "Vendor Bill" +msgstr "Factura de proveedor" + +#. module: agreement_rebate +#: model:ir.model.fields.selection,name:agreement_rebate.selection__agreement_invoice_create_wiz__invoice_type__in_refund +msgid "Vendor Credit Note" +msgstr "Factura rectificativa de proveedor" + +#. module: agreement_rebate +#: model:ir.model.fields,field_description:agreement_rebate.field_agreement__rebate_type +msgid "rebate type" +msgstr "Tipo rappel" + +#. module: agreement_rebate +#: code:addons/agreement_rebate/models/agreement_rebate_settlement.py:0 +#, python-format +msgid "{} - Period: {} - {}" +msgstr "{} - Periodo: {} - {}" + +#~ msgid "Invoice Line" +#~ msgstr "Línea de factura" diff --git a/agreement_rebate/migrations/13.0.1.0.0/post-migration.py b/agreement_rebate/migrations/13.0.1.0.0/post-migration.py new file mode 100644 index 000000000..addd0e067 --- /dev/null +++ b/agreement_rebate/migrations/13.0.1.0.0/post-migration.py @@ -0,0 +1,34 @@ +# Copyright 2021 Tecnativa - Sergio Teruel +# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl.html) +from openupgradelib import openupgrade +from psycopg2 import sql + + +def update_sale_order_line_invoice_rel(cr): + openupgrade.logged_query( + cr, + """INSERT INTO agreement_rebate_settlement_line_account_invoice_line_rel + (invoice_line_id, settlement_line_id) + SELECT aml.id, settlement_line_id + FROM account_move_line aml + JOIN ou_agreement_rebate_settlement_line_account_move_line_rel rel + ON rel.invoice_line_id = aml.old_invoice_line_id""", + ) + + +def update_agreement_rebate_settlement_invoice(cr): + openupgrade.logged_query( + cr, + sql.SQL( + """UPDATE agreement_rebate_settlement ars + SET invoice_id = ai.move_id + FROM account_invoice ai + WHERE ai.id = ars.{}""" + ).format(sql.Identifier(openupgrade.get_legacy_name("invoice_id"))), + ) + + +@openupgrade.migrate() +def migrate(env, version): + update_sale_order_line_invoice_rel(env.cr) + update_agreement_rebate_settlement_invoice(env.cr) diff --git a/agreement_rebate/migrations/13.0.1.0.0/pre-migration.py b/agreement_rebate/migrations/13.0.1.0.0/pre-migration.py new file mode 100644 index 000000000..c3b9b796e --- /dev/null +++ b/agreement_rebate/migrations/13.0.1.0.0/pre-migration.py @@ -0,0 +1,19 @@ +# Copyright 2021 Tecnativa - Sergio Teruel +# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl.html) +from openupgradelib import openupgrade + +tables_to_rename = [ + ( + "agreement_rebate_settlement_line_account_invoice_line_rel", + "ou_agreement_rebate_settlement_line_account_move_line_rel", + ), +] + + +@openupgrade.migrate() +def migrate(env, version): + openupgrade.rename_tables(env.cr, tables_to_rename) + openupgrade.remove_tables_fks(env.cr, [tables_to_rename[0][1]]) + openupgrade.rename_columns( + env.cr, {"agreement_rebate_settlement": [("invoice_id", None)]} + ) diff --git a/agreement_rebate/models/__init__.py b/agreement_rebate/models/__init__.py new file mode 100644 index 000000000..7f059e781 --- /dev/null +++ b/agreement_rebate/models/__init__.py @@ -0,0 +1,5 @@ +# License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl). +from . import account_invoice +from . import agreement +from . import agreement_rebate_settlement +from . import agreement_type diff --git a/agreement_rebate/models/account_invoice.py b/agreement_rebate/models/account_invoice.py new file mode 100644 index 000000000..b23b12ddf --- /dev/null +++ b/agreement_rebate/models/account_invoice.py @@ -0,0 +1,16 @@ +# Copyright 2020 Tecnativa - Carlos Dauden +# Copyright 2020 Tecnativa - Sergio Teruel +# License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl). +from odoo import fields, models + + +class AccountMoveLine(models.Model): + _inherit = "account.move.line" + + agreement_rebate_settlement_line_ids = fields.Many2many( + comodel_name="agreement.rebate.settlement.line", + relation="agreement_rebate_settlement_line_account_invoice_line_rel", + column1="invoice_line_id", + column2="settlement_line_id", + string="Settlement lines", + ) diff --git a/agreement_rebate/models/agreement.py b/agreement_rebate/models/agreement.py new file mode 100644 index 000000000..d50c05b2d --- /dev/null +++ b/agreement_rebate/models/agreement.py @@ -0,0 +1,116 @@ +# Copyright 2020 Tecnativa - Carlos Dauden +# Copyright 2020 Tecnativa - Sergio Teruel +# License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl). +from odoo import api, fields, models + + +class Agreement(models.Model): + _inherit = "agreement" + + rebate_type = fields.Selection( + selection=[ + ("global", "Global (A discount global for all lines)"), + ("line", "Line (A discount for every line)"), + ("section_total", "Compute total and apply discount rule match"), + ("section_prorated", "Calculate the discount in each amount section"), + ], + string="rebate type", + ) + rebate_line_ids = fields.One2many( + comodel_name="agreement.rebate.line", + string="Agreement rebate lines", + inverse_name="agreement_id", + copy=True, + ) + rebate_section_ids = fields.One2many( + comodel_name="agreement.rebate.section", + string="Agreement rebate sections", + inverse_name="agreement_id", + copy=True, + ) + rebate_discount = fields.Float(string="Rebate discount") + is_rebate = fields.Boolean( + related="agreement_type_id.is_rebate", string="Is rebate agreement type" + ) + additional_consumption = fields.Float(string="Additional consumption", default=0.0) + + +class AgreementRebateLine(models.Model): + _name = "agreement.rebate.line" + _description = "Agreement Rebate Lines" + + agreement_id = fields.Many2one(comodel_name="agreement", string="Agreement") + rebate_target = fields.Selection( + [ + ("product", "Product variant"), + ("product_tmpl", "Product templates"), + ("category", "Product categories"), + ("condition", "Rebate condition"), + ("domain", "Rebate domain"), + ] + ) + rebate_product_ids = fields.Many2many( + comodel_name="product.product", string="Products", + ) + rebate_product_tmpl_ids = fields.Many2many( + comodel_name="product.template", string="Product templates", + ) + rebate_category_ids = fields.Many2many( + comodel_name="product.category", string="Product categories", + ) + rebate_condition_id = fields.Many2one( + comodel_name="agreement.rebate.condition", string="Rebate condition", + ) + rebate_domain = fields.Char( + compute="_compute_rebate_domain", + string="Rebate domain", + store=True, + readonly=False, + ) + rebate_discount = fields.Float(string="Rebate discount") + + @api.depends( + "rebate_target", + "rebate_product_ids", + "rebate_product_tmpl_ids", + "rebate_category_ids", + "rebate_condition_id", + ) + def _compute_rebate_domain(self): + for line in self: + rebate_domain = [] + if line.rebate_target == "product": + rebate_domain = [("product_id", "in", line.rebate_product_ids.ids)] + elif line.rebate_target == "product_tmpl": + rebate_domain = [ + ( + "product_id.product_tmpl_id", + "in", + line.rebate_product_tmpl_ids.ids, + ) + ] + elif line.rebate_target == "category": + rebate_domain = [ + ("product_id.categ_id", "in", line.rebate_category_ids.ids) + ] + elif line.rebate_target == "condition": + rebate_domain = line.rebate_condition_id.rebate_domain or [] + line.rebate_domain = str(rebate_domain) + + +class AgreementRebateCondition(models.Model): + _name = "agreement.rebate.condition" + _description = "Agreement Rebate Condition" + + name = fields.Char(string="Rebate condition") + rebate_domain = fields.Char(string="Domain") + + +class AgreementRebateSection(models.Model): + _name = "agreement.rebate.section" + _description = "Agreement Rebate Section" + + agreement_id = fields.Many2one(comodel_name="agreement", string="Agreement") + amount_from = fields.Float(string="From") + amount_to = fields.Float(string="To") + rebate_discount = fields.Float(string="% Dto") diff --git a/agreement_rebate/models/agreement_rebate_settlement.py b/agreement_rebate/models/agreement_rebate_settlement.py new file mode 100644 index 000000000..29f5077a4 --- /dev/null +++ b/agreement_rebate/models/agreement_rebate_settlement.py @@ -0,0 +1,346 @@ +# Copyright 2020 Tecnativa - Carlos Dauden +# Copyright 2020 Tecnativa - Sergio Teruel +# License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl). +from odoo import _, api, fields, models +from odoo.exceptions import UserError +from odoo.osv import expression +from odoo.tools import safe_eval + + +class AgreementRebateSettlement(models.Model): + _name = "agreement.rebate.settlement" + _description = "Agreement Rebate Settlement" + _order = "date DESC" + + name = fields.Char(required=True, default="/") + company_id = fields.Many2one( + comodel_name="res.company", + string="Company", + required=True, + index=True, + default=lambda self: self.env.company, + ) + date = fields.Date(default=fields.Date.today) + date_from = fields.Date() + date_to = fields.Date() + partner_id = fields.Many2one(comodel_name="res.partner", string="Partner",) + line_ids = fields.One2many( + comodel_name="agreement.rebate.settlement.line", + inverse_name="settlement_id", + string="Settlement Lines", + ) + amount_invoiced = fields.Float(string="Amount invoiced") + amount_rebate = fields.Float(string="Amount rebate") + invoice_id = fields.Many2one(comodel_name="account.move", string="Invoice") + active = fields.Boolean(default=True) + + @api.model_create_multi + def create(self, vals_list): + for vals in vals_list: + if vals.get("name", "/") != "/": + continue + vals["name"] = self.env["ir.sequence"].next_by_code( + "agreement.rebate.settlement" + ) + return super(AgreementRebateSettlement, self).create(vals_list) + + def write(self, vals): + res = super().write(vals) + if "active" in vals and not self.env.context.get( + "skip_active_field_update", False + ): + lines = self.with_context(active_test=False).line_ids.filtered( + lambda ln: ln.active != vals["active"] + ) + lines.with_context(skip_active_field_update=True).active = vals["active"] + return res + + def _reverse_type_map(self, inv_type): + return { + "out_invoice": "out_refund", + "out_refund": "out_invoice", + "in_invoice": "in_refund", + "in_refund": "in_invoice", + }.get(inv_type) + + def create_invoice(self): + invoice_dic = {} + for line in self.mapped("line_ids"): + key = line._get_invoice_key() + if key not in invoice_dic: + invoice_dic[key] = line._prepare_invoice() + invoice_dic[key]["processed_settlements"] = line.settlement_id + invoice_dic[key]["check_amount"] = 0.0 + elif line.settlement_id not in invoice_dic[key]["processed_settlements"]: + invoice_dic[key]["invoice_origin"] = "{}, {}".format( + invoice_dic[key]["invoice_origin"], line.settlement_id.name + ) + invoice_dic[key]["processed_settlements"] |= line.settlement_id + inv_line_vals = line._prepare_invoice_line(invoice_dic[key]) + invoice_dic[key]["invoice_line_ids"].append((0, 0, inv_line_vals)) + invoice_dic[key]["check_amount"] += line.amount_invoiced + for values in invoice_dic.values(): + values.pop("processed_settlements", None) + values.pop("line_ids", None) + if values.pop("check_amount", 0.0) < 0.0: + for line_vals in values["invoice_line_ids"]: + line_vals[2]["price_unit"] *= -1 + values["type"] = self._reverse_type_map(values["type"]) + invoices = self.env["account.move"].create(invoice_dic.values()) + return invoices + + def action_show_detail(self): + target_domains = self.line_ids.mapped("target_domain") + domain = expression.OR([safe_eval(d) for d in set(target_domains)]) + return { + "name": _("Details"), + "type": "ir.actions.act_window", + "res_model": "account.invoice.report", + "view_mode": "pivot,tree", + "domain": domain, + "context": self.env.context, + } + + def action_show_settlement(self): + action = self.env.ref( + "agreement_rebate.agreement_rebate_settlement_action" + ).read()[0] + if len(self) == 1: + form = self.env.ref("agreement_rebate.agreement_rebate_settlement_form") + action["views"] = [(form.id, "form")] + action["res_id"] = self.id + else: + action["domain"] = [("id", "in", self.ids)] + return action + + def action_show_settlement_lines(self): + action = self.env.ref( + "agreement_rebate.agreement_rebate_settlement_line_action" + ).read()[0] + action["domain"] = [("settlement_id", "in", self.ids)] + return action + + def action_show_agreement(self): + agreements = self.line_ids.mapped("agreement_id") + action = self.env.ref("agreement.agreement_action").read()[0] + if len(agreements) == 1: + form = self.env.ref("agreement.agreement_form") + action["views"] = [(form.id, "form")] + action["res_id"] = agreements.id + else: + action["domain"] = [("id", "in", agreements.ids)] + return action + + +class AgreementRebateSettlementLine(models.Model): + _name = "agreement.rebate.settlement.line" + _description = "Agreement Rebate Settlement Lines" + _order = "date DESC" + + company_id = fields.Many2one( + comodel_name="res.company", + string="Company", + related="settlement_id.company_id", + ) + settlement_id = fields.Many2one( + comodel_name="agreement.rebate.settlement", + string="Rebate settlement", + ondelete="cascade", + ) + date = fields.Date(related="settlement_id.date", store=True,) + partner_id = fields.Many2one(comodel_name="res.partner", string="Partner",) + rebate_line_id = fields.Many2one( + comodel_name="agreement.rebate.line", string="Rebate Line", + ) + rebate_section_id = fields.Many2one( + comodel_name="agreement.rebate.section", string="Rebate section", + ) + target_domain = fields.Char() + amount_from = fields.Float(string="From", readonly=True) + amount_to = fields.Float(string="To", readonly=True) + percent = fields.Float(string="Percent", readonly=True) + amount_gross = fields.Float(string="Amount gross") + amount_invoiced = fields.Float(string="Amount invoiced") + amount_rebate = fields.Float(string="Amount rebate") + agreement_id = fields.Many2one( + comodel_name="agreement", string="Agreement", required=True, + ) + rebate_type = fields.Selection( + related="agreement_id.rebate_type", string="Rebate type", + ) + invoice_line_ids = fields.Many2many( + comodel_name="account.move.line", + relation="agreement_rebate_settlement_line_account_invoice_line_rel", + column1="settlement_line_id", + column2="invoice_line_id", + string="Invoice lines", + ) + invoice_status = fields.Selection( + [ + ("invoiced", "Fully Invoiced"), + ("to_invoice", "To Invoice"), + ("no", "Nothing to Invoice"), + ], + string="Invoice Status", + compute="_compute_invoice_status", + store=True, + readonly=False, + ) + active = fields.Boolean(default=True) + + @api.depends( + "invoice_line_ids", + "invoice_line_ids.parent_state", + "invoice_line_ids.refund_line_ids", + ) + def _compute_invoice_status(self): + for line in self: + if line.invoice_status == "no": + continue + invoice_lines = line.invoice_line_ids.filtered( + lambda ln: ln.parent_state != "cancel" + ) + refund_lines = invoice_lines.refund_line_ids.filtered( + lambda ln: ln.parent_state != "cancel" + ) + if invoice_lines and not refund_lines: + line.invoice_status = "invoiced" + else: + line.invoice_status = "to_invoice" + + def write(self, vals): + res = super().write(vals) + if "active" in vals and not self.env.context.get( + "skip_active_field_update", False + ): + if vals["active"]: + # If one line is active settlement must be active + settlements = self.mapped("settlement_id").filtered( + lambda s: not s.active + ) + else: + # If lines are archived and the settlement has not active lines, the + # settlement must be archived + settlements = self.mapped("settlement_id").filtered( + lambda s: s.active and not s.line_ids + ) + settlements.with_context(skip_active_field_update=True).active = vals[ + "active" + ] + return res + + def _prepare_invoice(self): + """ + Prepare the dict of values to create the new invoice for a sales order. + This method may be overridden to implement custom invoice generation + (making sure to call super() to establish a clean extension chain). + """ + self.ensure_one() + company_id = self.company_id.id or self.env.user.company_id.id + partner = self.env.context.get("partner_invoice", False) + if not partner: + invoice_group = self.env.context.get("invoice_group", "settlement") + if invoice_group == "settlement": + partner = self.settlement_id.partner_id + elif invoice_group == "partner": + partner = self.partner_id + elif invoice_group == "commercial_partner": + partner = self.partner_id.commercial_partner_id + invoice_type = self.env.context.get("invoice_type", "out_invoice") + journal_id = ( + self.env.context.get("journal_id") + or self.env["account.move"] + .with_context(force_company=company_id) + .default_get(["journal_id"])["journal_id"] + ) + if not journal_id: + raise UserError( + _("Please define an accounting sales journal for" " this company.") + ) + vinvoice = self.env["account.move"].new( + { + "company_id": company_id, + "partner_id": partner.id, + "type": invoice_type, + "journal_id": journal_id, + } + ) + # Get partner extra fields + vinvoice._onchange_partner_id() + invoice_vals = vinvoice._convert_to_write(vinvoice._cache) + invoice_vals.update( + { + "ref": (self.agreement_id.name or ""), + "invoice_origin": self.settlement_id.name, + "invoice_line_ids": [], + "currency_id": partner.currency_id.id, + # 'comment': self.note, + # 'user_id': self.user_id and self.user_id.id, + # 'team_id': self.team_id.id, + } + ) + return invoice_vals + + def _prepare_invoice_line(self, invoice_vals): + self.ensure_one() + company_id = self.company_id.id or self.env.user.company_id.id + product = self.env.context.get("product", False) + invoice_line_vals = { + "product_id": product.id, + "quantity": 1.0, + "product_uom_id": product.uom_id.id, + "agreement_rebate_settlement_line_ids": [(4, self.id)], + } + invoice_line = ( + self.env["account.move.line"] + .with_context(force_company=company_id,) + .new(invoice_line_vals) + ) + invoice_vals_new = invoice_vals.copy() + invoice_vals_new.pop("processed_settlements", None) + invoice_vals_new.pop("check_amount", None) + invoice = ( + self.env["account.move"] + .with_context(force_company=company_id,) + .new(invoice_vals_new) + ) + invoice_line.move_id = invoice + # Get other invoice line values from product onchange + invoice_line._onchange_product_id() + invoice_line_vals = invoice_line._convert_to_write(invoice_line._cache) + invoice_line_vals.update( + { + "name": _( + "{} - Period: {} - {}".format( + invoice_line_vals["name"], + self.settlement_id.date_from, + self.settlement_id.date_to, + ) + ), + # 'account_analytic_id': self.analytic_account_id.id, + # 'analytic_tag_ids': [(6, 0, self.analytic_tag_ids.ids)], + "price_unit": self.amount_rebate, + } + ) + return invoice_line_vals + + def _get_invoice_key(self): + invoice_group = self.env.context.get("invoice_group", "settlement") + if invoice_group == "settlement": + return self.settlement_id.id + if invoice_group == "partner": + return self.env.context.get("partner_id", self.partner_id.id) + if invoice_group == "commercial_partner": + return self.env.context.get( + "partner_id", self.partner_id.commercial_partner_id.id + ) + + def action_show_detail(self): + return { + "name": _("Details"), + "type": "ir.actions.act_window", + "res_model": "account.invoice.report", + "view_mode": "pivot,tree", + "domain": self.target_domain, + "context": self.env.context, + } diff --git a/agreement_rebate/models/agreement_type.py b/agreement_rebate/models/agreement_type.py new file mode 100644 index 000000000..e9c66e846 --- /dev/null +++ b/agreement_rebate/models/agreement_type.py @@ -0,0 +1,11 @@ +# Copyright 2020 Tecnativa - Carlos Dauden +# Copyright 2020 Tecnativa - Sergio Teruel +# License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl). + +from odoo import fields, models + + +class AgreementType(models.Model): + _inherit = "agreement.type" + + is_rebate = fields.Boolean(string="Is rebate agreement type",) diff --git a/agreement_rebate/readme/CONTRIBUTORS.rst b/agreement_rebate/readme/CONTRIBUTORS.rst new file mode 100644 index 000000000..22e2c9556 --- /dev/null +++ b/agreement_rebate/readme/CONTRIBUTORS.rst @@ -0,0 +1,4 @@ +* `Tecnativa `_: + + * Carlos Dauden + * Sergio Teruel diff --git a/agreement_rebate/readme/DESCRIPTION.rst b/agreement_rebate/readme/DESCRIPTION.rst new file mode 100644 index 000000000..216a6b999 --- /dev/null +++ b/agreement_rebate/readme/DESCRIPTION.rst @@ -0,0 +1,2 @@ +This module extends the functionality of agreement module to allow define +rebate conditions. diff --git a/agreement_rebate/readme/USAGE.rst b/agreement_rebate/readme/USAGE.rst new file mode 100644 index 000000000..ccb997032 --- /dev/null +++ b/agreement_rebate/readme/USAGE.rst @@ -0,0 +1,51 @@ +To use this module you need to: + +#. Go to a *Agreements > agreement*. +#. Create an agreement of type *Rebate agreement for sale*. +#. Set a rappel type. + + Basic global rappel discount + + .. image:: ../static/img/agreement_discount_global.png + :width: 80 % + :align: center + + Basic rappel discount by line items + + .. image:: ../static/img/agreement_discount_line.png + :width: 80 % + :align: center + + Section rappel discount rule match + + .. image:: ../static/img/agreement_discount_section_rule_match.png + :width: 80 % + :align: center + + Calculate the discount in each amount section + + .. image:: ../static/img/agreement_discount_section.png + :width: 80 % + :align: center + +#. Create any rebate lines to apply this agreement. + + Add a product template filter to apply this agreement + + .. image:: ../static/img/agreement_rebate_lines_filter.png + :width: 80 % + :align: center + +#. Do some invoices of products included in any rebate agreement +#. Create rebate settlements from *Agreements > Settlements > Create Settlements* + wizard + + .. image:: ../static/img/create_settlements_wizard.png + :width: 80 % + :align: center + +#. Create rappel invoices from *Agreements > Settlements > Create Invoices* wizard + + .. image:: ../static/img/create_settlement_invoices.png + :width: 80 % + :align: center diff --git a/agreement_rebate/security/agreement_rebate_security.xml b/agreement_rebate/security/agreement_rebate_security.xml new file mode 100644 index 000000000..2500c6249 --- /dev/null +++ b/agreement_rebate/security/agreement_rebate_security.xml @@ -0,0 +1,7 @@ + + + + Use agreement rebate + + + diff --git a/agreement_rebate/security/ir.model.access.csv b/agreement_rebate/security/ir.model.access.csv new file mode 100644 index 000000000..3cc0e90b0 --- /dev/null +++ b/agreement_rebate/security/ir.model.access.csv @@ -0,0 +1,13 @@ +id,name,model_id:id,group_id:id,perm_read,perm_write,perm_create,perm_unlink +access_agreement_full,Full access on agreement grp,model_agreement,agreement_rebate.group_use_agreement_rebate,1,1,1,1 +access_agreement_type_full,Full access on agreement type grp,agreement.model_agreement_type,account.group_account_manager,1,1,1,1 +access_agreement_rebate_line_read,Read access on rebate lines to Employees,model_agreement_rebate_line,base.group_user,1,0,0,0 +access_agreement_rebate_line_full,Full access on rebate lines grp,model_agreement_rebate_line,agreement_rebate.group_use_agreement_rebate,1,1,1,1 +access_agreement_rebate_section_read,Read access on rebate sections to Employees,model_agreement_rebate_section,base.group_user,1,0,0,0 +access_agreement_rebate_section_full,Full access on rebate sections grp,model_agreement_rebate_section,agreement_rebate.group_use_agreement_rebate,1,1,1,1 +access_agreement_rebate_condition_read,Read access on rebate conditions to Employees,model_agreement_rebate_condition,base.group_user,1,0,0,0 +access_agreement_rebate_condition_full,Full access on rebate conditions grp,model_agreement_rebate_condition,agreement_rebate.group_use_agreement_rebate,1,1,1,1 +access_agreement_rebate_settlement_read,Read access on rebate settlements to Employees,model_agreement_rebate_settlement,base.group_user,1,0,0,0 +access_agreement_rebate_settlement_full,Full access on rebate settlements grp,model_agreement_rebate_settlement,agreement_rebate.group_use_agreement_rebate,1,1,1,1 +access_agreement_rebate_settlement_line_read,Read access on rebate settlement lines to Employees,model_agreement_rebate_settlement_line,base.group_user,1,0,0,0 +access_agreement_rebate_settlement_line_full,Full access on rebate settlement lines grp,model_agreement_rebate_settlement_line,agreement_rebate.group_use_agreement_rebate,1,1,1,1 diff --git a/agreement_rebate/static/description/icon.png b/agreement_rebate/static/description/icon.png new file mode 100644 index 000000000..3a0328b51 Binary files /dev/null and b/agreement_rebate/static/description/icon.png differ diff --git a/agreement_rebate/static/description/index.html b/agreement_rebate/static/description/index.html new file mode 100644 index 000000000..e59545b39 --- /dev/null +++ b/agreement_rebate/static/description/index.html @@ -0,0 +1,469 @@ + + + + + + +Agreement Rebate + + + +
+

Agreement Rebate

+ + +

Beta License: AGPL-3 OCA/contract Translate me on Weblate Try me on Runbot

+

This module extends the functionality of agreement module to allow define +rebate conditions.

+

Table of contents

+ +
+

Usage

+

To use this module you need to:

+
    +
  1. Go to a Agreements > agreement.

    +
  2. +
  3. Create an agreement of type Rebate agreement for sale.

    +
  4. +
  5. Set a rappel type.

    +
    +

    Basic global rappel discount

    +https://raw.githubusercontent.com/OCA/contract/13.0/agreement_rebate/static/img/agreement_discount_global.png +

    Basic rappel discount by line items

    +https://raw.githubusercontent.com/OCA/contract/13.0/agreement_rebate/static/img/agreement_discount_line.png +

    Section rappel discount rule match

    +https://raw.githubusercontent.com/OCA/contract/13.0/agreement_rebate/static/img/agreement_discount_section_rule_match.png +

    Calculate the discount in each amount section

    +https://raw.githubusercontent.com/OCA/contract/13.0/agreement_rebate/static/img/agreement_discount_section.png +
    +
  6. +
  7. Create any rebate lines to apply this agreement.

    +
    +

    Add a product template filter to apply this agreement

    +https://raw.githubusercontent.com/OCA/contract/13.0/agreement_rebate/static/img/agreement_rebate_lines_filter.png +
    +
  8. +
  9. Do some invoices of products included in any rebate agreement

    +
  10. +
  11. Create rebate settlements from Agreements > Settlements > Create Settlements +wizard

    +
    +https://raw.githubusercontent.com/OCA/contract/13.0/agreement_rebate/static/img/create_settlements_wizard.png +
    +
  12. +
  13. Create rappel invoices from Agreements > Settlements > Create Invoices wizard

    +
    +https://raw.githubusercontent.com/OCA/contract/13.0/agreement_rebate/static/img/create_settlement_invoices.png +
    +
  14. +
+
+
+

Bug Tracker

+

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

+

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

+
+
+

Credits

+
+

Authors

+
    +
  • Tecnativa
  • +
+
+
+

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/contract project on GitHub.

+

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

+
+
+
+ + diff --git a/agreement_rebate/static/img/agreement_discount_global.png b/agreement_rebate/static/img/agreement_discount_global.png new file mode 100644 index 000000000..9fce55a4b Binary files /dev/null and b/agreement_rebate/static/img/agreement_discount_global.png differ diff --git a/agreement_rebate/static/img/agreement_discount_line.png b/agreement_rebate/static/img/agreement_discount_line.png new file mode 100644 index 000000000..9ca879710 Binary files /dev/null and b/agreement_rebate/static/img/agreement_discount_line.png differ diff --git a/agreement_rebate/static/img/agreement_discount_section.png b/agreement_rebate/static/img/agreement_discount_section.png new file mode 100644 index 000000000..fa18379e4 Binary files /dev/null and b/agreement_rebate/static/img/agreement_discount_section.png differ diff --git a/agreement_rebate/static/img/agreement_discount_section_rule_match.png b/agreement_rebate/static/img/agreement_discount_section_rule_match.png new file mode 100644 index 000000000..9738734ff Binary files /dev/null and b/agreement_rebate/static/img/agreement_discount_section_rule_match.png differ diff --git a/agreement_rebate/static/img/agreement_rebate_lines_filter.png b/agreement_rebate/static/img/agreement_rebate_lines_filter.png new file mode 100644 index 000000000..fbca7bc7f Binary files /dev/null and b/agreement_rebate/static/img/agreement_rebate_lines_filter.png differ diff --git a/agreement_rebate/static/img/create_settlement_invoices.png b/agreement_rebate/static/img/create_settlement_invoices.png new file mode 100644 index 000000000..31aea756f Binary files /dev/null and b/agreement_rebate/static/img/create_settlement_invoices.png differ diff --git a/agreement_rebate/static/img/create_settlements_wizard.png b/agreement_rebate/static/img/create_settlements_wizard.png new file mode 100644 index 000000000..3cb30f609 Binary files /dev/null and b/agreement_rebate/static/img/create_settlements_wizard.png differ diff --git a/agreement_rebate/tests/__init__.py b/agreement_rebate/tests/__init__.py new file mode 100644 index 000000000..ffd17a4bc --- /dev/null +++ b/agreement_rebate/tests/__init__.py @@ -0,0 +1,3 @@ +# License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl). + +from . import test_agreement_rebate diff --git a/agreement_rebate/tests/test_agreement_rebate.py b/agreement_rebate/tests/test_agreement_rebate.py new file mode 100644 index 000000000..93ead3944 --- /dev/null +++ b/agreement_rebate/tests/test_agreement_rebate.py @@ -0,0 +1,380 @@ +# Copyright 2020 Tecnativa - Carlos Dauden +# Copyright 2020 Tecnativa - Sergio Teruel +# License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl). + +from freezegun import freeze_time + +from odoo import fields +from odoo.tests.common import Form, TransactionCase, tagged + + +@freeze_time("2022-02-01 09:30:00") +@tagged("-at_install", "post_install") +class TestAgreementRebate(TransactionCase): + def setUp(self): + super().setUp() + self.Partner = self.env["res.partner"] + self.ProductTemplate = self.env["product.template"] + self.Product = self.env["product.product"] + self.ProductCategory = self.env["product.category"] + self.AccountInvoice = self.env["account.move"] + self.AccountInvoiceLine = self.env["account.move.line"] + self.AccountJournal = self.env["account.journal"] + self.Agreement = self.env["agreement"] + self.AgreementType = self.env["agreement.type"] + self.ProductAttribute = self.env["product.attribute"] + self.ProductAttributeValue = self.env["product.attribute.value"] + self.ProductTmplAttributeValue = self.env["product.template.attribute.value"] + self.AgreementSettlement = self.env["agreement.rebate.settlement"] + self.AgreementSettlementCreateWiz = self.env["agreement.settlement.create.wiz"] + self.rebate_type = [ + "global", + "line", + "section_total", + "section_prorated", + ] + self.category_all = self.env.ref("product.product_category_all") + self.categ_1 = self.ProductCategory.create( + {"parent_id": self.category_all.id, "name": "Category 1"} + ) + self.categ_2 = self.ProductCategory.create( + {"parent_id": self.category_all.id, "name": "Category 2"} + ) + self.product_1 = self.Product.create( + { + "name": "Product test 1", + "categ_id": self.categ_1.id, + "list_price": 1000.00, + } + ) + self.product_2 = self.Product.create( + { + "name": "Product test 2", + "categ_id": self.categ_2.id, + "list_price": 2000.00, + } + ) + # Create a product with variants + self.product_attribute = self.ProductAttribute.create( + {"name": "Test", "create_variant": "always"} + ) + self.product_attribute_value_test_1 = self.ProductAttributeValue.create( + {"name": "Test v1", "attribute_id": self.product_attribute.id} + ) + self.product_attribute_value_test_2 = self.ProductAttributeValue.create( + {"name": "Test v2", "attribute_id": self.product_attribute.id} + ) + self.product_template = self.ProductTemplate.create( + { + "name": "Product template with variant test", + "type": "consu", + "list_price": 100.0, + "attribute_line_ids": [ + ( + 0, + 0, + { + "attribute_id": self.product_attribute.id, + "value_ids": [ + (4, self.product_attribute_value_test_1.id), + (4, self.product_attribute_value_test_2.id), + ], + }, + ), + ], + } + ) + self.partner_1 = self.Partner.create( + {"name": "partner test rebate 1", "ref": "TST-001"} + ) + self.partner_2 = self.Partner.create( + {"name": "partner test rebate 2", "ref": "TST-002"} + ) + self.invoice_partner_1 = self.create_invoice(self.partner_1) + self.invoice_partner_2 = self.create_invoice(self.partner_2) + self.agreement_type = self.AgreementType.create( + {"name": "Rebate", "domain": "sale", "is_rebate": True} + ) + # Product to use when we create invoices from settlements + self.product_rappel = self.Product.create( + {"name": "Rappel sales", "categ_id": self.categ_1.id, "list_price": 1.00} + ) + + # Create some invoices for partner + def create_invoice(self, partner): + move_form = Form( + self.env["account.move"].with_context(default_type="out_invoice") + ) + move_form.invoice_date = fields.Date.from_string( + "{}-01-01".format(fields.Date.today().year) + ) + move_form.ref = "Test Customer Invoice" + move_form.partner_id = partner + products = ( + self.product_template.product_variant_ids + self.product_1 + self.product_2 + ) + self.create_invoice_line(move_form, products) + invoice = move_form.save() + invoice.action_post() + return invoice + + def create_invoice_line(self, invoice_form, products): + for product in products: + with invoice_form.invoice_line_ids.new() as line_form: + line_form.product_id = product + # Assign distinct prices for product with variants + if product == self.product_template.product_variant_ids[0]: + line_form.price_unit = 300.00 + if product == self.product_template.product_variant_ids[1]: + line_form.price_unit = 500.00 + + # Create Agreements rebates for customers for all available types + def create_agreements_rebate(self, rebate_type, partner): + agreement = self.Agreement.create( + { + "domain": "sale", + "start_date": "{}-01-01".format(fields.Date.today().year), + "rebate_type": rebate_type, + "name": "A discount {} for all lines for {}".format( + rebate_type, partner.name + ), + "code": "R-{}-{}".format(rebate_type, partner.ref), + "partner_id": partner.id, + "agreement_type_id": self.agreement_type.id, + "rebate_discount": 10, + "rebate_line_ids": [ + ( + 0, + 0, + { + "rebate_target": "product", + "rebate_product_ids": [(6, 0, self.product_1.ids)], + "rebate_discount": 20, + }, + ), + ( + 0, + 0, + { + "rebate_target": "product", + "rebate_product_ids": [ + (6, 0, self.product_template.product_variant_ids[0].ids) + ], + "rebate_discount": 30, + }, + ), + ( + 0, + 0, + { + "rebate_target": "product_tmpl", + "rebate_product_tmpl_ids": [ + (6, 0, self.product_2.product_tmpl_id.ids) + ], + "rebate_discount": 40, + }, + ), + ( + 0, + 0, + { + "rebate_target": "category", + "rebate_category_ids": [(6, 0, self.category_all.ids)], + "rebate_discount": 40, + }, + ), + ], + "rebate_section_ids": [ + ( + 0, + 0, + { + "amount_from": 0.00, + "amount_to": 100.00, + "rebate_discount": 10, + }, + ), + ( + 0, + 0, + { + "amount_from": 100.01, + "amount_to": 300.00, + "rebate_discount": 20, + }, + ), + ( + 0, + 0, + { + "amount_from": 300.01, + "amount_to": 6000.00, + "rebate_discount": 30, + }, + ), + ], + } + ) + return agreement + + def get_settlements_from_action(self, action): + if action.get("res_id", False): + return self.AgreementSettlement.browse(action["res_id"]) + else: + return self.AgreementSettlement.search(action["domain"]) + + def create_settlement_wizard(self, agreements=False): + vals = { + "date_to": "{}-12-31".format(fields.Date.today().year), + } + if agreements: + vals["agreement_ids"] = [(6, 0, agreements.ids)] + settlement_wiz = self.AgreementSettlementCreateWiz.create(vals) + return settlement_wiz + + def test_create_settlement_wo_filters_global(self): + # Invoice Lines: + # Product template variants: 300, 500 + # Product 1: 1000 + # Product 2: 2000 + # Total by invoice: 3800 amount invoiced + + # Global rebate without filters + agreement_global = self.create_agreements_rebate("global", self.partner_1) + agreement_global.rebate_line_ids = False + settlement_wiz = self.create_settlement_wizard(agreement_global) + settlements = self.get_settlements_from_action( + settlement_wiz.action_create_settlement() + ) + self.assertEqual(len(settlements), 1) + self.assertEqual(settlements.amount_invoiced, 3800) + self.assertEqual(settlements.amount_rebate, 380) + + def test_create_settlement_wo_filters_line(self): + # Line rebate without filters + agreement = self.create_agreements_rebate("line", self.partner_1) + agreement.rebate_line_ids = False + settlement_wiz = self.create_settlement_wizard(agreement) + settlements = self.get_settlements_from_action( + settlement_wiz.action_create_settlement() + ) + self.assertEqual(len(settlements), 0) + + def test_create_settlement_wo_filters_section_total(self): + # section_total rebate without filters + agreement = self.create_agreements_rebate("section_total", self.partner_1) + agreement.rebate_line_ids = False + settlement_wiz = self.create_settlement_wizard(agreement) + settlements = self.get_settlements_from_action( + settlement_wiz.action_create_settlement() + ) + self.assertEqual(len(settlements), 1) + self.assertEqual(settlements.amount_invoiced, 3800) + self.assertEqual(settlements.amount_rebate, 1140) + + def test_create_settlement_wo_filters_section_prorated(self): + # section_prorated rebate without filters + agreement = self.create_agreements_rebate("section_prorated", self.partner_1) + agreement.rebate_line_ids = False + settlement_wiz = self.create_settlement_wizard(agreement) + settlements = self.get_settlements_from_action( + settlement_wiz.action_create_settlement() + ) + self.assertEqual(len(settlements), 1) + self.assertEqual(settlements.amount_invoiced, 3800) + self.assertAlmostEqual(settlements.amount_rebate, 1120.00, 2) + + def _create_agreement_product_filter(self, agreement_type): + agreement = self.create_agreements_rebate(agreement_type, self.partner_1) + agreement.rebate_line_ids = [ + (5, 0), + ( + 0, + 0, + { + "rebate_target": "product", + "rebate_product_ids": [(6, 0, self.product_1.ids)], + "rebate_discount": 20, + }, + ), + ] + return agreement + + def test_create_settlement_products_filters_global(self): + # Invoice Lines: + # Product template variants: 300, 500 + # Product 1: 1000 + # Product 2: 2000 + # Total by invoice: 3800 amount invoiced + agreement = self._create_agreement_product_filter("global") + settlement_wiz = self.create_settlement_wizard(agreement) + settlements = self.get_settlements_from_action( + settlement_wiz.action_create_settlement() + ) + self.assertEqual(len(settlements), 1) + self.assertEqual(settlements.amount_invoiced, 1000) + self.assertEqual(settlements.amount_rebate, 100) + + def test_create_settlement_products_filters_line(self): + agreement = self._create_agreement_product_filter("line") + settlement_wiz = self.create_settlement_wizard(agreement) + settlements = self.get_settlements_from_action( + settlement_wiz.action_create_settlement() + ) + self.assertEqual(len(settlements), 1) + self.assertEqual(settlements.amount_invoiced, 1000) + self.assertEqual(settlements.amount_rebate, 200) + + def test_create_settlement_products_filters_section_total(self): + agreement = self._create_agreement_product_filter("section_total") + settlement_wiz = self.create_settlement_wizard(agreement) + settlements = self.get_settlements_from_action( + settlement_wiz.action_create_settlement() + ) + self.assertEqual(len(settlements), 1) + self.assertEqual(settlements.amount_invoiced, 1000) + self.assertEqual(settlements.amount_rebate, 300) + + def test_create_settlement_products_filters_section_prorated(self): + agreement = self._create_agreement_product_filter("section_prorated") + settlement_wiz = self.create_settlement_wizard(agreement) + settlements = self.get_settlements_from_action( + settlement_wiz.action_create_settlement() + ) + self.assertEqual(len(settlements), 1) + self.assertEqual(settlements.amount_invoiced, 1000) + self.assertAlmostEqual(settlements.amount_rebate, 280, 2) + + def _create_invoice_wizard(self): + sale_journal = self.env["account.journal"].search( + [("type", "=", "sale")], limit=1 + ) + wiz_create_invoice_form = Form(self.env["agreement.invoice.create.wiz"]) + wiz_create_invoice_form.date_from = "2022-01-01" + wiz_create_invoice_form.date_to = "2022-12-31" + wiz_create_invoice_form.invoice_type = "out_invoice" + wiz_create_invoice_form.journal_id = sale_journal + wiz_create_invoice_form.product_id = self.product_rappel + wiz_create_invoice_form.agreement_type_ids.add(self.agreement_type) + return wiz_create_invoice_form.save() + + def test_invoice_agreements(self): + # Create some rebate settlements + agreement = self._create_agreement_product_filter("section_total") + settlement_wiz = self.create_settlement_wizard(agreement) + settlements = self.get_settlements_from_action( + settlement_wiz.action_create_settlement() + ) + wiz_create_invoice = self._create_invoice_wizard() + wiz_create_invoice.agreement_ids = [(6, 0, agreement.ids)] + wiz_create_invoice.settlements_ids = [(6, 0, settlements.ids)] + action = wiz_create_invoice.action_create_invoice() + invoices = self.env["account.move"].search(action["domain"]) + self.assertTrue(invoices) + + # Force invoice to partner + invoices.unlink() + wiz_create_invoice.invoice_partner_id = self.partner_2 + action = wiz_create_invoice.action_create_invoice() + invoices = self.env["account.move"].search(action["domain"]) + self.assertEqual(invoices.partner_id, self.partner_2) diff --git a/agreement_rebate/views/agreement_condition_view.xml b/agreement_rebate/views/agreement_condition_view.xml new file mode 100644 index 000000000..1ca803aca --- /dev/null +++ b/agreement_rebate/views/agreement_condition_view.xml @@ -0,0 +1,38 @@ + + + + agreement.rebate.condition.form + agreement.rebate.condition + +
+ + + + + + + + +
+
+
+ + agreement.rebate.condition.tree + agreement.rebate.condition + + + + + + + + + Agreement rebate conditions + agreement.rebate.condition + tree,form + +
diff --git a/agreement_rebate/views/agreement_menu_view.xml b/agreement_rebate/views/agreement_menu_view.xml new file mode 100644 index 000000000..55e894bc9 --- /dev/null +++ b/agreement_rebate/views/agreement_menu_view.xml @@ -0,0 +1,52 @@ + + + + + + + + + + diff --git a/agreement_rebate/views/agreement_rebate_settlement_view.xml b/agreement_rebate/views/agreement_rebate_settlement_view.xml new file mode 100644 index 000000000..1e0295f3b --- /dev/null +++ b/agreement_rebate/views/agreement_rebate_settlement_view.xml @@ -0,0 +1,240 @@ + + + + agreement.rebate.settlement.search + agreement.rebate.settlement + + + + + + + + + + + + + + + + + + + + + agreement.rebate.settlement + agreement.rebate.settlement + + + + + + + + + + + + + + agreement.rebate.settlement + agreement.rebate.settlement + +
+ +
+ + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +