diff --git a/account_brand/README.rst b/account_brand/README.rst new file mode 100644 index 000000000..be97b3cdb --- /dev/null +++ b/account_brand/README.rst @@ -0,0 +1,124 @@ +============= +Account Brand +============= + +.. + !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! + !! This file is generated by oca-gen-addon-readme !! + !! changes will be overwritten. !! + !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! + !! source digest: sha256:6dbc0d8cfac63a97b25a76fe68e37d6fb3505a5d38929edbfbab7bd6bf6bf5ff + !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! + +.. |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%2Fbrand-lightgray.png?logo=github + :target: https://github.com/OCA/brand/tree/17.0/account_brand + :alt: OCA/brand +.. |badge4| image:: https://img.shields.io/badge/weblate-Translate%20me-F47D42.png + :target: https://translation.odoo-community.org/projects/brand-17-0/brand-17-0-account_brand + :alt: Translate me on Weblate +.. |badge5| image:: https://img.shields.io/badge/runboat-Try%20me-875A7B.png + :target: https://runboat.odoo-community.org/builds?repo=OCA/brand&target_branch=17.0 + :alt: Try me on Runboat + +|badge1| |badge2| |badge3| |badge4| |badge5| + +This module allows you to send branded invoices to your customers. It +adds a brand field on the invoice and the brand information to the PDF +report. + +**Table of contents** + +.. contents:: + :local: + +Configuration +============= + +To configure this module, please refer to the documentation of +`brand `__. It +is important to note that if the brand type is not configured in the +Users & Companies settings, the field will not be visible in the invoice +view. + +Usage +===== + +To use this module, you need to: + +1. Go to Accounting > Customers > Invoices +2. Select or create an invoice +3. Enter the information and select the brand +4. Print the PDF report. It includes the information of the brand. + +To do point 4, the Brand External Report Layout OCA module must be +installed. + +Bug Tracker +=========== + +Bugs are tracked on `GitHub Issues `_. +In case of trouble, please check there if your issue has already been reported. +If you spotted it first, help us to smash it by providing a detailed and welcomed +`feedback `_. + +Do not contact contributors directly about support or help with technical issues. + +Credits +======= + +Authors +------- + +* Open Source Integrators +* ACSONE SA/NV + +Contributors +------------ + +- Raphael Lee +- Steve Campbell +- Maxime Chambreuil +- `Obertix `__: + + - Vicent Cubells + +- Ammar Officewala + +Other credits +------------- + +- Open Source Integrators + +Maintainers +----------- + +This module is maintained by the OCA. + +.. image:: https://odoo-community.org/logo.png + :alt: Odoo Community Association + :target: https://odoo-community.org + +OCA, or the Odoo Community Association, is a nonprofit organization whose +mission is to support the collaborative development of Odoo features and +promote its widespread use. + +.. |maintainer-osi-scampbell| image:: https://github.com/osi-scampbell.png?size=40px + :target: https://github.com/osi-scampbell + :alt: osi-scampbell +.. |maintainer-sbejaoui| image:: https://github.com/sbejaoui.png?size=40px + :target: https://github.com/sbejaoui + :alt: sbejaoui + +Current `maintainers `__: + +|maintainer-osi-scampbell| |maintainer-sbejaoui| + +This module is part of the `OCA/brand `_ project on GitHub. + +You are welcome to contribute. To learn how please visit https://odoo-community.org/page/Contribute. diff --git a/account_brand/__init__.py b/account_brand/__init__.py new file mode 100644 index 000000000..887d8d15b --- /dev/null +++ b/account_brand/__init__.py @@ -0,0 +1,5 @@ +# Copyright (C) 2019 Open Source Integrators +# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl). + +from . import models +from . import wizards diff --git a/account_brand/__manifest__.py b/account_brand/__manifest__.py new file mode 100644 index 000000000..6725d75f2 --- /dev/null +++ b/account_brand/__manifest__.py @@ -0,0 +1,24 @@ +# Copyright (C) 2019 Open Source Integrators +# Copyright 2019 ACSONE SA/NV +# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl). + +{ + "name": "Account Brand", + "summary": "Send branded invoices and refunds", + "version": "17.0.1.0.0", + "category": "Accounting Management", + "website": "https://github.com/OCA/brand", + "author": "Open Source Integrators," + "ACSONE SA/NV," + "Odoo Community Association (OCA)", + "license": "AGPL-3", + "depends": ["account", "brand"], + "data": [ + "views/account_move_views.xml", + "views/res_partner_account_brand.xml", + "security/res_partner_account_brand.xml", + ], + "installable": True, + "development_status": "Beta", + "maintainers": ["osi-scampbell", "sbejaoui"], +} diff --git a/account_brand/i18n/account_brand.pot b/account_brand/i18n/account_brand.pot new file mode 100644 index 000000000..d92368954 --- /dev/null +++ b/account_brand/i18n/account_brand.pot @@ -0,0 +1,135 @@ +# Translation of Odoo Server. +# This file contains the translation of the following modules: +# * account_brand +# +msgid "" +msgstr "" +"Project-Id-Version: Odoo Server 16.0\n" +"Report-Msgid-Bugs-To: \n" +"Last-Translator: \n" +"Language-Team: \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: \n" +"Plural-Forms: \n" + +#. module: account_brand +#: model:ir.model.fields,field_description:account_brand.field_res_partner_account_brand__account_id +msgid "Account" +msgstr "" + +#. module: account_brand +#: model:ir.model,name:account_brand.model_account_move_reversal +msgid "Account Move Reversal" +msgstr "" + +#. module: account_brand +#: model:ir.model.fields,field_description:account_brand.field_account_bank_statement_line__brand_id +#: model:ir.model.fields,field_description:account_brand.field_account_move__brand_id +#: model:ir.model.fields,field_description:account_brand.field_account_payment__brand_id +#: model:ir.model.fields,field_description:account_brand.field_res_partner_account_brand__brand_id +msgid "Brand" +msgstr "" + +#. module: account_brand +#: model:ir.model.fields,field_description:account_brand.field_account_move__brand_use_level +msgid "Brand Use Level" +msgstr "" + +#. module: account_brand +#: model:ir.model.fields,help:account_brand.field_account_bank_statement_line__brand_id +#: model:ir.model.fields,help:account_brand.field_account_move__brand_id +#: model:ir.model.fields,help:account_brand.field_account_payment__brand_id +msgid "Brand to use for this sale" +msgstr "" + +#. module: account_brand +#: model:ir.model.fields,field_description:account_brand.field_account_move__company_id +msgid "Company" +msgstr "" + +#. module: account_brand +#: model:ir.model.fields,field_description:account_brand.field_res_partner_account_brand__create_uid +msgid "Created by" +msgstr "" + +#. module: account_brand +#: model:ir.model.fields,field_description:account_brand.field_res_partner_account_brand__create_date +msgid "Created on" +msgstr "" + +#. module: account_brand +#: model:ir.model.fields,field_description:account_brand.field_res_partner_account_brand__display_name +msgid "Display Name" +msgstr "" + +#. module: account_brand +#: model:ir.model.fields,field_description:account_brand.field_res_partner_account_brand__id +msgid "ID" +msgstr "" + +#. module: account_brand +#: model:ir.model,name:account_brand.model_account_move +msgid "Journal Entry" +msgstr "" + +#. module: account_brand +#: model:ir.model.fields,field_description:account_brand.field_res_partner_account_brand____last_update +msgid "Last Modified on" +msgstr "" + +#. module: account_brand +#: model:ir.model.fields,field_description:account_brand.field_res_partner_account_brand__write_uid +msgid "Last Updated by" +msgstr "" + +#. module: account_brand +#: model:ir.model.fields,field_description:account_brand.field_res_partner_account_brand__write_date +msgid "Last Updated on" +msgstr "" + +#. module: account_brand +#: model:ir.model.fields,field_description:account_brand.field_res_partner_account_brand__partner_id +msgid "Partner" +msgstr "" + +#. module: account_brand +#: model:ir.actions.act_window,name:account_brand.res_partner_account_brand_act_window +#: model:ir.ui.menu,name:account_brand.res_partner_account_brand_menu +msgid "Partner Accounts by Brand" +msgstr "" + +#. module: account_brand +#. odoo-python +#: code:addons/account_brand/models/res_partner_account_brand.py:0 +#: model:ir.model.constraint,message:account_brand.constraint_res_partner_account_brand_unique_account_by_partner +#, python-format +msgid "Partner has already an account set for this brand!" +msgstr "" + +#. module: account_brand +#: model:ir.model.fields.selection,name:account_brand.selection__res_partner_account_brand__account_type__liability_payable +msgid "Payable" +msgstr "" + +#. module: account_brand +#. odoo-python +#: code:addons/account_brand/models/res_partner_account_brand.py:0 +#, python-format +msgid "Please select an account of type %s" +msgstr "" + +#. module: account_brand +#: model:ir.model.fields.selection,name:account_brand.selection__res_partner_account_brand__account_type__asset_receivable +msgid "Receivable" +msgstr "" + +#. module: account_brand +#: model:ir.model,name:account_brand.model_res_partner_account_brand +msgid "Receivable/Payable Partner Account By Brand" +msgstr "" + +#. module: account_brand +#: model:ir.model.fields,field_description:account_brand.field_res_partner_account_brand__account_type +msgid "Type" +msgstr "" diff --git a/account_brand/i18n/de.po b/account_brand/i18n/de.po new file mode 100644 index 000000000..9c3643b12 --- /dev/null +++ b/account_brand/i18n/de.po @@ -0,0 +1,141 @@ +# Translation of Odoo Server. +# This file contains the translation of the following modules: +# * account_brand +# +msgid "" +msgstr "" +"Project-Id-Version: Odoo Server 12.0\n" +"Report-Msgid-Bugs-To: \n" +"PO-Revision-Date: 2022-11-04 13:45+0000\n" +"Last-Translator: Maria Sparenberg \n" +"Language-Team: none\n" +"Language: de\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: \n" +"Plural-Forms: nplurals=2; plural=n != 1;\n" +"X-Generator: Weblate 4.14.1\n" + +#. module: account_brand +#: model:ir.model.fields,field_description:account_brand.field_res_partner_account_brand__account_id +msgid "Account" +msgstr "Konto" + +#. module: account_brand +#: model:ir.model,name:account_brand.model_account_move_reversal +msgid "Account Move Reversal" +msgstr "" + +#. module: account_brand +#: model:ir.model.fields,field_description:account_brand.field_account_bank_statement_line__brand_id +#: model:ir.model.fields,field_description:account_brand.field_account_move__brand_id +#: model:ir.model.fields,field_description:account_brand.field_account_payment__brand_id +#: model:ir.model.fields,field_description:account_brand.field_res_partner_account_brand__brand_id +msgid "Brand" +msgstr "Marke" + +#. module: account_brand +#: model:ir.model.fields,field_description:account_brand.field_account_move__brand_use_level +msgid "Brand Use Level" +msgstr "" + +#. module: account_brand +#: model:ir.model.fields,help:account_brand.field_account_bank_statement_line__brand_id +#: model:ir.model.fields,help:account_brand.field_account_move__brand_id +#: model:ir.model.fields,help:account_brand.field_account_payment__brand_id +msgid "Brand to use for this sale" +msgstr "zu verwendende Marke für diesen Verkauf" + +#. module: account_brand +#: model:ir.model.fields,field_description:account_brand.field_account_move__company_id +msgid "Company" +msgstr "Unternehmen" + +#. module: account_brand +#: model:ir.model.fields,field_description:account_brand.field_res_partner_account_brand__create_uid +msgid "Created by" +msgstr "Erstellt von" + +#. module: account_brand +#: model:ir.model.fields,field_description:account_brand.field_res_partner_account_brand__create_date +msgid "Created on" +msgstr "Erstellt am" + +#. module: account_brand +#: model:ir.model.fields,field_description:account_brand.field_res_partner_account_brand__display_name +msgid "Display Name" +msgstr "Anzeigename" + +#. module: account_brand +#: model:ir.model.fields,field_description:account_brand.field_res_partner_account_brand__id +msgid "ID" +msgstr "ID" + +#. module: account_brand +#: model:ir.model,name:account_brand.model_account_move +msgid "Journal Entry" +msgstr "Buchungssatz" + +#. module: account_brand +#: model:ir.model.fields,field_description:account_brand.field_res_partner_account_brand____last_update +msgid "Last Modified on" +msgstr "Zuletzt geändert am" + +#. module: account_brand +#: model:ir.model.fields,field_description:account_brand.field_res_partner_account_brand__write_uid +msgid "Last Updated by" +msgstr "Zuletzt aktualisiert von" + +#. module: account_brand +#: model:ir.model.fields,field_description:account_brand.field_res_partner_account_brand__write_date +msgid "Last Updated on" +msgstr "Zuletzt aktualisiert am" + +#. module: account_brand +#: model:ir.model.fields,field_description:account_brand.field_res_partner_account_brand__partner_id +msgid "Partner" +msgstr "Partner" + +#. module: account_brand +#: model:ir.actions.act_window,name:account_brand.res_partner_account_brand_act_window +#: model:ir.ui.menu,name:account_brand.res_partner_account_brand_menu +msgid "Partner Accounts by Brand" +msgstr "" + +#. module: account_brand +#. odoo-python +#: code:addons/account_brand/models/res_partner_account_brand.py:0 +#: model:ir.model.constraint,message:account_brand.constraint_res_partner_account_brand_unique_account_by_partner +#, python-format +msgid "Partner has already an account set for this brand!" +msgstr "Der Partner hat für diese Marke bereits ein Konto!" + +#. module: account_brand +#: model:ir.model.fields.selection,name:account_brand.selection__res_partner_account_brand__account_type__liability_payable +msgid "Payable" +msgstr "Kreditor" + +#. module: account_brand +#. odoo-python +#: code:addons/account_brand/models/res_partner_account_brand.py:0 +#, python-format +msgid "Please select an account of type %s" +msgstr "Bitte ein Konto vom Typ %s wählen." + +#. module: account_brand +#: model:ir.model.fields.selection,name:account_brand.selection__res_partner_account_brand__account_type__asset_receivable +msgid "Receivable" +msgstr "Debitor" + +#. module: account_brand +#: model:ir.model,name:account_brand.model_res_partner_account_brand +msgid "Receivable/Payable Partner Account By Brand" +msgstr "Debitoren-/Kreditorenkonto nach Marke" + +#. module: account_brand +#: model:ir.model.fields,field_description:account_brand.field_res_partner_account_brand__account_type +msgid "Type" +msgstr "Typ" + +#~ msgid "Invoice" +#~ msgstr "Rechnung" diff --git a/account_brand/i18n/es.po b/account_brand/i18n/es.po new file mode 100644 index 000000000..cffde24a8 --- /dev/null +++ b/account_brand/i18n/es.po @@ -0,0 +1,141 @@ +# Translation of Odoo Server. +# This file contains the translation of the following modules: +# * account_brand +# +msgid "" +msgstr "" +"Project-Id-Version: Odoo Server 12.0\n" +"Report-Msgid-Bugs-To: \n" +"PO-Revision-Date: 2023-05-04 12:19+0000\n" +"Last-Translator: gelo joga Rodríguez \n" +"Language-Team: none\n" +"Language: es\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: \n" +"Plural-Forms: nplurals=2; plural=n != 1;\n" +"X-Generator: Weblate 4.14.1\n" + +#. module: account_brand +#: model:ir.model.fields,field_description:account_brand.field_res_partner_account_brand__account_id +msgid "Account" +msgstr "Cuenta" + +#. module: account_brand +#: model:ir.model,name:account_brand.model_account_move_reversal +msgid "Account Move Reversal" +msgstr "Asiento de reversión" + +#. module: account_brand +#: model:ir.model.fields,field_description:account_brand.field_account_bank_statement_line__brand_id +#: model:ir.model.fields,field_description:account_brand.field_account_move__brand_id +#: model:ir.model.fields,field_description:account_brand.field_account_payment__brand_id +#: model:ir.model.fields,field_description:account_brand.field_res_partner_account_brand__brand_id +msgid "Brand" +msgstr "Marca" + +#. module: account_brand +#: model:ir.model.fields,field_description:account_brand.field_account_move__brand_use_level +msgid "Brand Use Level" +msgstr "Uso del campo Marca" + +#. module: account_brand +#: model:ir.model.fields,help:account_brand.field_account_bank_statement_line__brand_id +#: model:ir.model.fields,help:account_brand.field_account_move__brand_id +#: model:ir.model.fields,help:account_brand.field_account_payment__brand_id +msgid "Brand to use for this sale" +msgstr "Marca a usar en esta venta" + +#. module: account_brand +#: model:ir.model.fields,field_description:account_brand.field_account_move__company_id +msgid "Company" +msgstr "Compañía" + +#. module: account_brand +#: model:ir.model.fields,field_description:account_brand.field_res_partner_account_brand__create_uid +msgid "Created by" +msgstr "Creado por" + +#. module: account_brand +#: model:ir.model.fields,field_description:account_brand.field_res_partner_account_brand__create_date +msgid "Created on" +msgstr "Creado el" + +#. module: account_brand +#: model:ir.model.fields,field_description:account_brand.field_res_partner_account_brand__display_name +msgid "Display Name" +msgstr "Nombre mostrado" + +#. module: account_brand +#: model:ir.model.fields,field_description:account_brand.field_res_partner_account_brand__id +msgid "ID" +msgstr "ID" + +#. module: account_brand +#: model:ir.model,name:account_brand.model_account_move +msgid "Journal Entry" +msgstr "Asiento contable" + +#. module: account_brand +#: model:ir.model.fields,field_description:account_brand.field_res_partner_account_brand____last_update +msgid "Last Modified on" +msgstr "Última modificación el" + +#. module: account_brand +#: model:ir.model.fields,field_description:account_brand.field_res_partner_account_brand__write_uid +msgid "Last Updated by" +msgstr "Última actualización por" + +#. module: account_brand +#: model:ir.model.fields,field_description:account_brand.field_res_partner_account_brand__write_date +msgid "Last Updated on" +msgstr "Última actualización el" + +#. module: account_brand +#: model:ir.model.fields,field_description:account_brand.field_res_partner_account_brand__partner_id +msgid "Partner" +msgstr "Partner" + +#. module: account_brand +#: model:ir.actions.act_window,name:account_brand.res_partner_account_brand_act_window +#: model:ir.ui.menu,name:account_brand.res_partner_account_brand_menu +msgid "Partner Accounts by Brand" +msgstr "Cuentas de clientes/proveedores por marca" + +#. module: account_brand +#. odoo-python +#: code:addons/account_brand/models/res_partner_account_brand.py:0 +#: model:ir.model.constraint,message:account_brand.constraint_res_partner_account_brand_unique_account_by_partner +#, python-format +msgid "Partner has already an account set for this brand!" +msgstr "¡El cliente/proveedor ya tiene establecida una cuenta para esta marca!" + +#. module: account_brand +#: model:ir.model.fields.selection,name:account_brand.selection__res_partner_account_brand__account_type__liability_payable +msgid "Payable" +msgstr "A pagar" + +#. module: account_brand +#. odoo-python +#: code:addons/account_brand/models/res_partner_account_brand.py:0 +#, python-format +msgid "Please select an account of type %s" +msgstr "Por favor selecciona una cuenta de tipo %s" + +#. module: account_brand +#: model:ir.model.fields.selection,name:account_brand.selection__res_partner_account_brand__account_type__asset_receivable +msgid "Receivable" +msgstr "Por cobrar" + +#. module: account_brand +#: model:ir.model,name:account_brand.model_res_partner_account_brand +msgid "Receivable/Payable Partner Account By Brand" +msgstr "Cuentas Por Cobrar/A Pagar de clientes y proveedores por marca" + +#. module: account_brand +#: model:ir.model.fields,field_description:account_brand.field_res_partner_account_brand__account_type +msgid "Type" +msgstr "Tipo" + +#~ msgid "Invoice" +#~ msgstr "Factura" diff --git a/account_brand/i18n/es_AR.po b/account_brand/i18n/es_AR.po new file mode 100644 index 000000000..dd8da324c --- /dev/null +++ b/account_brand/i18n/es_AR.po @@ -0,0 +1,138 @@ +# Translation of Odoo Server. +# This file contains the translation of the following modules: +# * account_brand +# +msgid "" +msgstr "" +"Project-Id-Version: Odoo Server 16.0\n" +"Report-Msgid-Bugs-To: \n" +"PO-Revision-Date: 2023-06-25 15:26+0000\n" +"Last-Translator: Ignacio Buioli \n" +"Language-Team: none\n" +"Language: es_AR\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: \n" +"Plural-Forms: nplurals=2; plural=n != 1;\n" +"X-Generator: Weblate 4.17\n" + +#. module: account_brand +#: model:ir.model.fields,field_description:account_brand.field_res_partner_account_brand__account_id +msgid "Account" +msgstr "Cuenta" + +#. module: account_brand +#: model:ir.model,name:account_brand.model_account_move_reversal +msgid "Account Move Reversal" +msgstr "Reversión de Movimiento de Cuenta" + +#. module: account_brand +#: model:ir.model.fields,field_description:account_brand.field_account_bank_statement_line__brand_id +#: model:ir.model.fields,field_description:account_brand.field_account_move__brand_id +#: model:ir.model.fields,field_description:account_brand.field_account_payment__brand_id +#: model:ir.model.fields,field_description:account_brand.field_res_partner_account_brand__brand_id +msgid "Brand" +msgstr "Marca" + +#. module: account_brand +#: model:ir.model.fields,field_description:account_brand.field_account_move__brand_use_level +msgid "Brand Use Level" +msgstr "Nivel de Uso de Marca" + +#. module: account_brand +#: model:ir.model.fields,help:account_brand.field_account_bank_statement_line__brand_id +#: model:ir.model.fields,help:account_brand.field_account_move__brand_id +#: model:ir.model.fields,help:account_brand.field_account_payment__brand_id +msgid "Brand to use for this sale" +msgstr "Marca a utilizar para este venta" + +#. module: account_brand +#: model:ir.model.fields,field_description:account_brand.field_account_move__company_id +msgid "Company" +msgstr "Compañía" + +#. module: account_brand +#: model:ir.model.fields,field_description:account_brand.field_res_partner_account_brand__create_uid +msgid "Created by" +msgstr "Creado por" + +#. module: account_brand +#: model:ir.model.fields,field_description:account_brand.field_res_partner_account_brand__create_date +msgid "Created on" +msgstr "Creado el" + +#. module: account_brand +#: model:ir.model.fields,field_description:account_brand.field_res_partner_account_brand__display_name +msgid "Display Name" +msgstr "Nombre Mostrado" + +#. module: account_brand +#: model:ir.model.fields,field_description:account_brand.field_res_partner_account_brand__id +msgid "ID" +msgstr "ID" + +#. module: account_brand +#: model:ir.model,name:account_brand.model_account_move +msgid "Journal Entry" +msgstr "Asiento Contable" + +#. module: account_brand +#: model:ir.model.fields,field_description:account_brand.field_res_partner_account_brand____last_update +msgid "Last Modified on" +msgstr "Última modificación el" + +#. module: account_brand +#: model:ir.model.fields,field_description:account_brand.field_res_partner_account_brand__write_uid +msgid "Last Updated by" +msgstr "Última actualización por" + +#. module: account_brand +#: model:ir.model.fields,field_description:account_brand.field_res_partner_account_brand__write_date +msgid "Last Updated on" +msgstr "Última modificación el" + +#. module: account_brand +#: model:ir.model.fields,field_description:account_brand.field_res_partner_account_brand__partner_id +msgid "Partner" +msgstr "Contacto" + +#. module: account_brand +#: model:ir.actions.act_window,name:account_brand.res_partner_account_brand_act_window +#: model:ir.ui.menu,name:account_brand.res_partner_account_brand_menu +msgid "Partner Accounts by Brand" +msgstr "Cuentas de Contacto por Marca" + +#. module: account_brand +#. odoo-python +#: code:addons/account_brand/models/res_partner_account_brand.py:0 +#: model:ir.model.constraint,message:account_brand.constraint_res_partner_account_brand_unique_account_by_partner +#, python-format +msgid "Partner has already an account set for this brand!" +msgstr "¡El contacto ya tiene una cuenta configurada para esta marca!" + +#. module: account_brand +#: model:ir.model.fields.selection,name:account_brand.selection__res_partner_account_brand__account_type__liability_payable +msgid "Payable" +msgstr "A Pagar" + +#. module: account_brand +#. odoo-python +#: code:addons/account_brand/models/res_partner_account_brand.py:0 +#, python-format +msgid "Please select an account of type %s" +msgstr "Por favor, selecciones una cuenta de tipo %s" + +#. module: account_brand +#: model:ir.model.fields.selection,name:account_brand.selection__res_partner_account_brand__account_type__asset_receivable +msgid "Receivable" +msgstr "A Cobrar" + +#. module: account_brand +#: model:ir.model,name:account_brand.model_res_partner_account_brand +msgid "Receivable/Payable Partner Account By Brand" +msgstr "Cuenta de contacto a Cobrar/Pagar por Marca" + +#. module: account_brand +#: model:ir.model.fields,field_description:account_brand.field_res_partner_account_brand__account_type +msgid "Type" +msgstr "Tipo" diff --git a/account_brand/i18n/hr.po b/account_brand/i18n/hr.po new file mode 100644 index 000000000..7308ce362 --- /dev/null +++ b/account_brand/i18n/hr.po @@ -0,0 +1,142 @@ +# Translation of Odoo Server. +# This file contains the translation of the following modules: +# * account_brand +# +msgid "" +msgstr "" +"Project-Id-Version: Odoo Server 12.0\n" +"Report-Msgid-Bugs-To: \n" +"PO-Revision-Date: 2023-02-16 14:23+0000\n" +"Last-Translator: Bole \n" +"Language-Team: none\n" +"Language: hr\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: \n" +"Plural-Forms: nplurals=3; plural=n%10==1 && n%100!=11 ? 0 : n%10>=2 && n" +"%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2;\n" +"X-Generator: Weblate 4.14.1\n" + +#. module: account_brand +#: model:ir.model.fields,field_description:account_brand.field_res_partner_account_brand__account_id +msgid "Account" +msgstr "Konto" + +#. module: account_brand +#: model:ir.model,name:account_brand.model_account_move_reversal +msgid "Account Move Reversal" +msgstr "Storno temeljnice" + +#. module: account_brand +#: model:ir.model.fields,field_description:account_brand.field_account_bank_statement_line__brand_id +#: model:ir.model.fields,field_description:account_brand.field_account_move__brand_id +#: model:ir.model.fields,field_description:account_brand.field_account_payment__brand_id +#: model:ir.model.fields,field_description:account_brand.field_res_partner_account_brand__brand_id +msgid "Brand" +msgstr "Brand" + +#. module: account_brand +#: model:ir.model.fields,field_description:account_brand.field_account_move__brand_use_level +msgid "Brand Use Level" +msgstr "Razina uporabe brenda" + +#. module: account_brand +#: model:ir.model.fields,help:account_brand.field_account_bank_statement_line__brand_id +#: model:ir.model.fields,help:account_brand.field_account_move__brand_id +#: model:ir.model.fields,help:account_brand.field_account_payment__brand_id +msgid "Brand to use for this sale" +msgstr "Brand za ovu prodaju" + +#. module: account_brand +#: model:ir.model.fields,field_description:account_brand.field_account_move__company_id +msgid "Company" +msgstr "Tvrtka" + +#. module: account_brand +#: model:ir.model.fields,field_description:account_brand.field_res_partner_account_brand__create_uid +msgid "Created by" +msgstr "Kreirao" + +#. module: account_brand +#: model:ir.model.fields,field_description:account_brand.field_res_partner_account_brand__create_date +msgid "Created on" +msgstr "Kreirano" + +#. module: account_brand +#: model:ir.model.fields,field_description:account_brand.field_res_partner_account_brand__display_name +msgid "Display Name" +msgstr "Naziv za prikaz" + +#. module: account_brand +#: model:ir.model.fields,field_description:account_brand.field_res_partner_account_brand__id +msgid "ID" +msgstr "ID" + +#. module: account_brand +#: model:ir.model,name:account_brand.model_account_move +msgid "Journal Entry" +msgstr "Stavka dnevnika" + +#. module: account_brand +#: model:ir.model.fields,field_description:account_brand.field_res_partner_account_brand____last_update +msgid "Last Modified on" +msgstr "Zadnje modificirano" + +#. module: account_brand +#: model:ir.model.fields,field_description:account_brand.field_res_partner_account_brand__write_uid +msgid "Last Updated by" +msgstr "Zadnje ažurirano" + +#. module: account_brand +#: model:ir.model.fields,field_description:account_brand.field_res_partner_account_brand__write_date +msgid "Last Updated on" +msgstr "Zadnje ažurirano" + +#. module: account_brand +#: model:ir.model.fields,field_description:account_brand.field_res_partner_account_brand__partner_id +msgid "Partner" +msgstr "Partner" + +#. module: account_brand +#: model:ir.actions.act_window,name:account_brand.res_partner_account_brand_act_window +#: model:ir.ui.menu,name:account_brand.res_partner_account_brand_menu +msgid "Partner Accounts by Brand" +msgstr "Konta partnera po brendu" + +#. module: account_brand +#. odoo-python +#: code:addons/account_brand/models/res_partner_account_brand.py:0 +#: model:ir.model.constraint,message:account_brand.constraint_res_partner_account_brand_unique_account_by_partner +#, python-format +msgid "Partner has already an account set for this brand!" +msgstr "Partner već ima postavljen konto za ovaj brand!" + +#. module: account_brand +#: model:ir.model.fields.selection,name:account_brand.selection__res_partner_account_brand__account_type__liability_payable +msgid "Payable" +msgstr "Dugovno" + +#. module: account_brand +#. odoo-python +#: code:addons/account_brand/models/res_partner_account_brand.py:0 +#, python-format +msgid "Please select an account of type %s" +msgstr "Molimo odaberite konto tipa %s" + +#. module: account_brand +#: model:ir.model.fields.selection,name:account_brand.selection__res_partner_account_brand__account_type__asset_receivable +msgid "Receivable" +msgstr "Potražno" + +#. module: account_brand +#: model:ir.model,name:account_brand.model_res_partner_account_brand +msgid "Receivable/Payable Partner Account By Brand" +msgstr "Potražna/Dugovna konta partnera po brendu" + +#. module: account_brand +#: model:ir.model.fields,field_description:account_brand.field_res_partner_account_brand__account_type +msgid "Type" +msgstr "Tip" + +#~ msgid "Invoice" +#~ msgstr "Račun" diff --git a/account_brand/i18n/nl.po b/account_brand/i18n/nl.po new file mode 100644 index 000000000..77e5aa9fa --- /dev/null +++ b/account_brand/i18n/nl.po @@ -0,0 +1,141 @@ +# Translation of Odoo Server. +# This file contains the translation of the following modules: +# * account_brand +# +msgid "" +msgstr "" +"Project-Id-Version: Odoo Server 13.0\n" +"Report-Msgid-Bugs-To: \n" +"PO-Revision-Date: 2020-12-13 23:19+0000\n" +"Last-Translator: Bosd \n" +"Language-Team: none\n" +"Language: nl\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: \n" +"Plural-Forms: nplurals=2; plural=n != 1;\n" +"X-Generator: Weblate 4.3.2\n" + +#. module: account_brand +#: model:ir.model.fields,field_description:account_brand.field_res_partner_account_brand__account_id +msgid "Account" +msgstr "" + +#. module: account_brand +#: model:ir.model,name:account_brand.model_account_move_reversal +msgid "Account Move Reversal" +msgstr "" + +#. module: account_brand +#: model:ir.model.fields,field_description:account_brand.field_account_bank_statement_line__brand_id +#: model:ir.model.fields,field_description:account_brand.field_account_move__brand_id +#: model:ir.model.fields,field_description:account_brand.field_account_payment__brand_id +#: model:ir.model.fields,field_description:account_brand.field_res_partner_account_brand__brand_id +msgid "Brand" +msgstr "Merk" + +#. module: account_brand +#: model:ir.model.fields,field_description:account_brand.field_account_move__brand_use_level +msgid "Brand Use Level" +msgstr "" + +#. module: account_brand +#: model:ir.model.fields,help:account_brand.field_account_bank_statement_line__brand_id +#: model:ir.model.fields,help:account_brand.field_account_move__brand_id +#: model:ir.model.fields,help:account_brand.field_account_payment__brand_id +msgid "Brand to use for this sale" +msgstr "Merk voor deze verkoop" + +#. module: account_brand +#: model:ir.model.fields,field_description:account_brand.field_account_move__company_id +msgid "Company" +msgstr "" + +#. module: account_brand +#: model:ir.model.fields,field_description:account_brand.field_res_partner_account_brand__create_uid +msgid "Created by" +msgstr "Aangemaakt door" + +#. module: account_brand +#: model:ir.model.fields,field_description:account_brand.field_res_partner_account_brand__create_date +msgid "Created on" +msgstr "Aangemaakt op" + +#. module: account_brand +#: model:ir.model.fields,field_description:account_brand.field_res_partner_account_brand__display_name +msgid "Display Name" +msgstr "Weergavenaam" + +#. module: account_brand +#: model:ir.model.fields,field_description:account_brand.field_res_partner_account_brand__id +msgid "ID" +msgstr "ID" + +#. module: account_brand +#: model:ir.model,name:account_brand.model_account_move +msgid "Journal Entry" +msgstr "" + +#. module: account_brand +#: model:ir.model.fields,field_description:account_brand.field_res_partner_account_brand____last_update +msgid "Last Modified on" +msgstr "Laatst gewijzigt op" + +#. module: account_brand +#: model:ir.model.fields,field_description:account_brand.field_res_partner_account_brand__write_uid +msgid "Last Updated by" +msgstr "Laatste wijziging door" + +#. module: account_brand +#: model:ir.model.fields,field_description:account_brand.field_res_partner_account_brand__write_date +msgid "Last Updated on" +msgstr "Laatste wijziging op" + +#. module: account_brand +#: model:ir.model.fields,field_description:account_brand.field_res_partner_account_brand__partner_id +msgid "Partner" +msgstr "Partner" + +#. module: account_brand +#: model:ir.actions.act_window,name:account_brand.res_partner_account_brand_act_window +#: model:ir.ui.menu,name:account_brand.res_partner_account_brand_menu +msgid "Partner Accounts by Brand" +msgstr "" + +#. module: account_brand +#. odoo-python +#: code:addons/account_brand/models/res_partner_account_brand.py:0 +#: model:ir.model.constraint,message:account_brand.constraint_res_partner_account_brand_unique_account_by_partner +#, python-format +msgid "Partner has already an account set for this brand!" +msgstr "" + +#. module: account_brand +#: model:ir.model.fields.selection,name:account_brand.selection__res_partner_account_brand__account_type__liability_payable +msgid "Payable" +msgstr "Te betalen" + +#. module: account_brand +#. odoo-python +#: code:addons/account_brand/models/res_partner_account_brand.py:0 +#, python-format +msgid "Please select an account of type %s" +msgstr "" + +#. module: account_brand +#: model:ir.model.fields.selection,name:account_brand.selection__res_partner_account_brand__account_type__asset_receivable +msgid "Receivable" +msgstr "" + +#. module: account_brand +#: model:ir.model,name:account_brand.model_res_partner_account_brand +msgid "Receivable/Payable Partner Account By Brand" +msgstr "" + +#. module: account_brand +#: model:ir.model.fields,field_description:account_brand.field_res_partner_account_brand__account_type +msgid "Type" +msgstr "Type" + +#~ msgid "Journal Entries" +#~ msgstr "Journaal ingave" diff --git a/account_brand/i18n/zh_CN.po b/account_brand/i18n/zh_CN.po new file mode 100644 index 000000000..85f3be330 --- /dev/null +++ b/account_brand/i18n/zh_CN.po @@ -0,0 +1,141 @@ +# Translation of Odoo Server. +# This file contains the translation of the following modules: +# * account_brand +# +msgid "" +msgstr "" +"Project-Id-Version: Odoo Server 12.0\n" +"Report-Msgid-Bugs-To: \n" +"PO-Revision-Date: 2019-09-17 16:24+0000\n" +"Last-Translator: 黎伟杰 <674416404@qq.com>\n" +"Language-Team: none\n" +"Language: zh_CN\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: \n" +"Plural-Forms: nplurals=1; plural=0;\n" +"X-Generator: Weblate 3.8\n" + +#. module: account_brand +#: model:ir.model.fields,field_description:account_brand.field_res_partner_account_brand__account_id +msgid "Account" +msgstr "" + +#. module: account_brand +#: model:ir.model,name:account_brand.model_account_move_reversal +msgid "Account Move Reversal" +msgstr "" + +#. module: account_brand +#: model:ir.model.fields,field_description:account_brand.field_account_bank_statement_line__brand_id +#: model:ir.model.fields,field_description:account_brand.field_account_move__brand_id +#: model:ir.model.fields,field_description:account_brand.field_account_payment__brand_id +#: model:ir.model.fields,field_description:account_brand.field_res_partner_account_brand__brand_id +msgid "Brand" +msgstr "品牌" + +#. module: account_brand +#: model:ir.model.fields,field_description:account_brand.field_account_move__brand_use_level +msgid "Brand Use Level" +msgstr "" + +#. module: account_brand +#: model:ir.model.fields,help:account_brand.field_account_bank_statement_line__brand_id +#: model:ir.model.fields,help:account_brand.field_account_move__brand_id +#: model:ir.model.fields,help:account_brand.field_account_payment__brand_id +msgid "Brand to use for this sale" +msgstr "" + +#. module: account_brand +#: model:ir.model.fields,field_description:account_brand.field_account_move__company_id +msgid "Company" +msgstr "" + +#. module: account_brand +#: model:ir.model.fields,field_description:account_brand.field_res_partner_account_brand__create_uid +msgid "Created by" +msgstr "" + +#. module: account_brand +#: model:ir.model.fields,field_description:account_brand.field_res_partner_account_brand__create_date +msgid "Created on" +msgstr "" + +#. module: account_brand +#: model:ir.model.fields,field_description:account_brand.field_res_partner_account_brand__display_name +msgid "Display Name" +msgstr "" + +#. module: account_brand +#: model:ir.model.fields,field_description:account_brand.field_res_partner_account_brand__id +msgid "ID" +msgstr "" + +#. module: account_brand +#: model:ir.model,name:account_brand.model_account_move +msgid "Journal Entry" +msgstr "" + +#. module: account_brand +#: model:ir.model.fields,field_description:account_brand.field_res_partner_account_brand____last_update +msgid "Last Modified on" +msgstr "" + +#. module: account_brand +#: model:ir.model.fields,field_description:account_brand.field_res_partner_account_brand__write_uid +msgid "Last Updated by" +msgstr "" + +#. module: account_brand +#: model:ir.model.fields,field_description:account_brand.field_res_partner_account_brand__write_date +msgid "Last Updated on" +msgstr "" + +#. module: account_brand +#: model:ir.model.fields,field_description:account_brand.field_res_partner_account_brand__partner_id +msgid "Partner" +msgstr "" + +#. module: account_brand +#: model:ir.actions.act_window,name:account_brand.res_partner_account_brand_act_window +#: model:ir.ui.menu,name:account_brand.res_partner_account_brand_menu +msgid "Partner Accounts by Brand" +msgstr "" + +#. module: account_brand +#. odoo-python +#: code:addons/account_brand/models/res_partner_account_brand.py:0 +#: model:ir.model.constraint,message:account_brand.constraint_res_partner_account_brand_unique_account_by_partner +#, python-format +msgid "Partner has already an account set for this brand!" +msgstr "" + +#. module: account_brand +#: model:ir.model.fields.selection,name:account_brand.selection__res_partner_account_brand__account_type__liability_payable +msgid "Payable" +msgstr "" + +#. module: account_brand +#. odoo-python +#: code:addons/account_brand/models/res_partner_account_brand.py:0 +#, python-format +msgid "Please select an account of type %s" +msgstr "" + +#. module: account_brand +#: model:ir.model.fields.selection,name:account_brand.selection__res_partner_account_brand__account_type__asset_receivable +msgid "Receivable" +msgstr "" + +#. module: account_brand +#: model:ir.model,name:account_brand.model_res_partner_account_brand +msgid "Receivable/Payable Partner Account By Brand" +msgstr "" + +#. module: account_brand +#: model:ir.model.fields,field_description:account_brand.field_res_partner_account_brand__account_type +msgid "Type" +msgstr "" + +#~ msgid "Invoice" +#~ msgstr "发票" diff --git a/account_brand/models/__init__.py b/account_brand/models/__init__.py new file mode 100644 index 000000000..a438e0dec --- /dev/null +++ b/account_brand/models/__init__.py @@ -0,0 +1,5 @@ +# Copyright (C) 2019 Open Source Integrators +# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl). + +from . import account_move +from . import res_partner_account_brand diff --git a/account_brand/models/account_move.py b/account_brand/models/account_move.py new file mode 100644 index 000000000..ad0223704 --- /dev/null +++ b/account_brand/models/account_move.py @@ -0,0 +1,58 @@ +# Copyright (C) 2019 Open Source Integrators +# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl). + + +from odoo import api, fields, models + + +class AccountMove(models.Model): + _name = "account.move" + _inherit = ["account.move", "res.brand.mixin"] + + brand_id = fields.Many2one() + + def _is_brand_required(self): + self.ensure_one() + if self.move_type in ("in_invoice", "in_refund"): + return False + return super()._is_brand_required() + + @api.onchange("partner_id") + def _onchange_partner_id(self): + res = super()._onchange_partner_id() + if self.brand_id: + pab_model = self.env["res.partner.account.brand"] + company_id = self.company_id.id + partner = ( + self.partner_id + if not company_id + else self.partner_id.with_company(company_id) + ) + invoice_type = self.move_type or self.env.context.get( + "move_type", "out_invoice" + ) + if partner: + rec_account = pab_model._get_partner_account_by_brand( + "asset_receivable", self.brand_id, partner + ) + rec_account = ( + rec_account + if rec_account + else partner.property_account_receivable_id + ) + pay_account = pab_model._get_partner_account_by_brand( + "liability_payable", self.brand_id, partner + ) + pay_account = ( + pay_account if pay_account else partner.property_account_payable_id + ) + if invoice_type in ("in_invoice", "in_refund"): + account_id = pay_account + else: + account_id = rec_account + if account_id: + self.line_ids.filtered( + lambda line, a=account_id: line.account_id.account_type + == a.account_type + ).update({"account_id": account_id.id}) + return res diff --git a/account_brand/models/res_partner_account_brand.py b/account_brand/models/res_partner_account_brand.py new file mode 100644 index 000000000..6a5fdb42a --- /dev/null +++ b/account_brand/models/res_partner_account_brand.py @@ -0,0 +1,81 @@ +# Copyright 2019 ACSONE SA/NV +# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl). + +from odoo import _, api, fields, models +from odoo.exceptions import ValidationError + + +class ResPartnerAccountBrand(models.Model): + """This model is meant to be used in case we need to define different + receivable/payable accounts for partners""" + + _name = "res.partner.account.brand" + _description = "Receivable/Payable Partner Account By Brand" + + partner_id = fields.Many2one( + comodel_name="res.partner", string="Partner", required=False + ) + account_id = fields.Many2one( + comodel_name="account.account", + string="Account", + required=True, + domain="[('account_type', 'in', ('liability_payable', 'asset_receivable'))]", + ) + brand_id = fields.Many2one(comodel_name="res.brand", string="Brand", required=True) + account_type = fields.Selection( + string="Type", + selection=[ + ("liability_payable", "Payable"), + ("asset_receivable", "Receivable"), + ], + required=True, + ) + + _sql_constraints = [ + ( + "unique_account_by_partner", + "unique(partner_id, account_id, brand_id, account_type)", + _("Partner has already an account set for this brand!"), + ) + ] + + @api.constrains("account_id", "account_type") + def _check_account_type(self): + for rec in self: + if ( + rec.account_id + and rec.account_type + and rec.account_id.account_type != rec.account_type + ): + raise ValidationError( + _("Please select an account of type %s") % rec.account_type + ) + + @api.onchange("account_type") + def _onchange_account_type(self): + self.ensure_one() + self.update({"account_id": False}) + domain = [("id", "=", False)] + if self.account_type == "payable": + domain = [ + ("internal_type", "=", "payable"), + ("deprecated", "=", False), + ] + elif self.account_type == "receivable": + domain = [ + ("internal_type", "=", "receivable"), + ("deprecated", "=", False), + ] + return {"domain": {"account_id": domain}} + + @api.model + def _get_partner_account_by_brand(self, account_type, brand, partner): + domain = [ + ("brand_id", "=", brand.id), + ("account_type", "=", account_type), + ] + default_rule = self.search(domain + [("partner_id", "=", False)], limit=1) + partner_rule = False + if partner: + partner_rule = self.search(domain + [("partner_id", "=", partner.id)]) + return partner_rule.account_id if partner_rule else default_rule.account_id diff --git a/account_brand/pyproject.toml b/account_brand/pyproject.toml new file mode 100644 index 000000000..4231d0ccc --- /dev/null +++ b/account_brand/pyproject.toml @@ -0,0 +1,3 @@ +[build-system] +requires = ["whool"] +build-backend = "whool.buildapi" diff --git a/account_brand/readme/CONFIGURE.md b/account_brand/readme/CONFIGURE.md new file mode 100644 index 000000000..7c89d7f2e --- /dev/null +++ b/account_brand/readme/CONFIGURE.md @@ -0,0 +1,3 @@ +To configure this module, please refer to the documentation of +[brand](https://github.com/OCA/brand/blob/12.0/brand/README.rst). +It is important to note that if the brand type is not configured in the Users & Companies settings, the field will not be visible in the invoice view. diff --git a/account_brand/readme/CONTRIBUTORS.md b/account_brand/readme/CONTRIBUTORS.md new file mode 100644 index 000000000..5b60ad651 --- /dev/null +++ b/account_brand/readme/CONTRIBUTORS.md @@ -0,0 +1,6 @@ +- Raphael Lee \<\> +- Steve Campbell \<\> +- Maxime Chambreuil \<\> +- [Obertix](https://www.obertix.net): + - Vicent Cubells +- Ammar Officewala \<\> diff --git a/account_brand/readme/CREDITS.md b/account_brand/readme/CREDITS.md new file mode 100644 index 000000000..f9890b5be --- /dev/null +++ b/account_brand/readme/CREDITS.md @@ -0,0 +1 @@ +- Open Source Integrators \<\> diff --git a/account_brand/readme/DESCRIPTION.md b/account_brand/readme/DESCRIPTION.md new file mode 100644 index 000000000..794832469 --- /dev/null +++ b/account_brand/readme/DESCRIPTION.md @@ -0,0 +1,3 @@ +This module allows you to send branded invoices to your customers. It +adds a brand field on the invoice and the brand information to the PDF +report. diff --git a/account_brand/readme/USAGE.md b/account_brand/readme/USAGE.md new file mode 100644 index 000000000..3e0706d71 --- /dev/null +++ b/account_brand/readme/USAGE.md @@ -0,0 +1,8 @@ +To use this module, you need to: + +1. Go to Accounting \> Customers \> Invoices +2. Select or create an invoice +3. Enter the information and select the brand +4. Print the PDF report. It includes the information of the brand. + +To do point 4, the Brand External Report Layout OCA module must be installed. diff --git a/account_brand/security/res_partner_account_brand.xml b/account_brand/security/res_partner_account_brand.xml new file mode 100644 index 000000000..50961bfd2 --- /dev/null +++ b/account_brand/security/res_partner_account_brand.xml @@ -0,0 +1,25 @@ + + + + + res.partner.account.brand access + + + + + + + + res.partner.account.brand invoice user access + + + + + + + + diff --git a/account_brand/static/description/icon.png b/account_brand/static/description/icon.png new file mode 100644 index 000000000..3a0328b51 Binary files /dev/null and b/account_brand/static/description/icon.png differ diff --git a/account_brand/static/description/index.html b/account_brand/static/description/index.html new file mode 100644 index 000000000..26b689c22 --- /dev/null +++ b/account_brand/static/description/index.html @@ -0,0 +1,464 @@ + + + + + +Account Brand + + + +
+

Account Brand

+ + +

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

+

This module allows you to send branded invoices to your customers. It +adds a brand field on the invoice and the brand information to the PDF +report.

+

Table of contents

+ +
+

Configuration

+

To configure this module, please refer to the documentation of +brand. It +is important to note that if the brand type is not configured in the +Users & Companies settings, the field will not be visible in the invoice +view.

+
+
+

Usage

+

To use this module, you need to:

+
    +
  1. Go to Accounting > Customers > Invoices
  2. +
  3. Select or create an invoice
  4. +
  5. Enter the information and select the brand
  6. +
  7. Print the PDF report. It includes the information of the brand.
  8. +
+

To do point 4, the Brand External Report Layout OCA module must be +installed.

+
+
+

Bug Tracker

+

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

+

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

+
+
+

Credits

+
+

Authors

+
    +
  • Open Source Integrators
  • +
  • ACSONE SA/NV
  • +
+
+
+

Contributors

+ +
+
+

Other credits

+ +
+
+

Maintainers

+

This module is maintained by the OCA.

+ +Odoo Community Association + +

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

+

Current maintainers:

+

osi-scampbell sbejaoui

+

This module is part of the OCA/brand project on GitHub.

+

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

+
+
+
+ + diff --git a/account_brand/tests/__init__.py b/account_brand/tests/__init__.py new file mode 100644 index 000000000..66f862e41 --- /dev/null +++ b/account_brand/tests/__init__.py @@ -0,0 +1,2 @@ +from . import test_brand_mixin +from . import test_account_move diff --git a/account_brand/tests/test_account_move.py b/account_brand/tests/test_account_move.py new file mode 100644 index 000000000..7c3835e42 --- /dev/null +++ b/account_brand/tests/test_account_move.py @@ -0,0 +1,110 @@ +# Copyright 2019 ACSONE SA/NV +# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl). + +from odoo.tests.common import TransactionCase + + +class TestAccountMove(TransactionCase): + def setUp(self): + super().setUp() + self.product = self.env.ref("product.product_product_4") + self.account_receivable = self.env["account.account"].create( + { + "name": "Partner Receivable", + "code": "RCV00", + "account_type": "asset_receivable", + "reconcile": True, + } + ) + self.account_receivable_brand_default = self.env["account.account"].create( + { + "name": "Receivable Brand Default", + "code": "RCV01", + "account_type": "asset_receivable", + "reconcile": True, + } + ) + self.account_receivable_partner_brand_default = self.env[ + "account.account" + ].create( + { + "name": "Receivable Partner Brand Default", + "code": "RCV02", + "account_type": "asset_receivable", + "reconcile": True, + } + ) + self.partner_id = self.env.ref("base.res_partner_12") + self.partner_id.property_account_receivable_id = self.account_receivable + self.account_revenue = self.env["account.account"].create( + {"name": "Test sale", "code": "XX.700", "account_type": "income"} + ) + self.move = self.env["account.move"].create( + { + "partner_id": self.partner_id.id, + "move_type": "out_invoice", + "invoice_line_ids": [ + ( + 0, + 0, + { + "product_id": self.product.id, + "quantity": 1, + "price_unit": 42, + "name": "something", + "account_id": self.account_revenue.id, + }, + ) + ], + } + ) + + self.brand_id = self.env["res.brand"].create({"name": "Brand"}) + + def _get_receivable_account(self, move): + return self.move.line_ids.filtered( + lambda line: line.account_id.account_type == "asset_receivable" + ).account_id + + def test_on_change_partner_id(self): + account = self._get_receivable_account(self.move) + self.assertEqual(account, self.account_receivable) + partner_account_brand = self.env["res.partner.account.brand"].create( + { + "partner_id": False, + "account_id": self.account_receivable_brand_default.id, + "brand_id": self.brand_id.id, + "account_type": "asset_receivable", + } + ) + self.move._onchange_partner_id() + account = self._get_receivable_account(self.move) + self.assertEqual(account, self.account_receivable) + self.move.brand_id = self.brand_id + self.move._onchange_partner_id() + account = self._get_receivable_account(self.move) + self.assertEqual(account, self.account_receivable_brand_default) + partner_account_brand.update( + { + "partner_id": self.partner_id.id, + "account_id": self.account_receivable_partner_brand_default.id, + } + ) + self.move._onchange_partner_id() + account = self._get_receivable_account(self.move) + self.assertEqual( + account, + self.account_receivable_partner_brand_default, + ) + move = self.env["account.move"].create( + { + "partner_id": self.partner_id.id, + "brand_id": self.brand_id.id, + "move_type": "out_invoice", + } + ) + account = self._get_receivable_account(move) + self.assertEqual( + account, + self.account_receivable_partner_brand_default, + ) diff --git a/account_brand/tests/test_brand_mixin.py b/account_brand/tests/test_brand_mixin.py new file mode 100644 index 000000000..b87635ad7 --- /dev/null +++ b/account_brand/tests/test_brand_mixin.py @@ -0,0 +1,140 @@ +# Copyright 2019 ACSONE SA/NV +# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl). + +from lxml import etree + +from odoo.exceptions import ValidationError +from odoo.tests.common import Form, TransactionCase + +from odoo.addons.brand.models.res_company import BRAND_USE_LEVEL_REQUIRED_LEVEL + + +class TestBrandMixin(TransactionCase): + def setUp(self): + super().setUp() + self.partner = self.env.user.partner_id + self.company = self.env.user.company_id + self.other_company = self.env["res.company"].create( + {"name": "other company", "parent_id": self.company.id} + ) + self.journal = self.env["account.journal"].create( + {"type": "sale", "code": "SALE", "name": "Sale journal"} + ) + self.invoice = self.env["account.move"].create( + { + "name": "Sample invoice", + "company_id": self.company.id, + "journal_id": self.journal.id, + "partner_id": self.partner.id, + } + ) + self.brand = self.env["res.brand"].create({"name": "brand"}) + self.other_company_brand = self.env["res.brand"].create( + {"name": "brand", "company_id": self.other_company.id} + ) + + def test_is_brand_required(self): + self.assertFalse(self.invoice._is_brand_required()) + self.company.brand_use_level = BRAND_USE_LEVEL_REQUIRED_LEVEL + self.assertTrue(self.invoice._is_brand_required()) + + def test_check_brand_requirement(self): + self.env["account.move"].create( + { + "name": "Sample invoice", + "company_id": self.company.id, + "journal_id": self.journal.id, + "partner_id": self.partner.id, + } + ) + self.company.brand_use_level = BRAND_USE_LEVEL_REQUIRED_LEVEL + with self.assertRaises(ValidationError): + self.env["account.move"].create( + { + "name": "Sample invoice", + "company_id": self.company.id, + "journal_id": self.journal.id, + "partner_id": self.partner.id, + } + ) + self.env["account.move"].create( + { + "name": "Sample invoice", + "company_id": self.company.id, + "journal_id": self.journal.id, + "partner_id": self.partner.id, + "brand_id": self.brand.id, + } + ) + + def test_check_brand_company_id(self): + invoice = self.env["account.move"].create( + { + "name": "Sample invoice", + "company_id": self.company.id, + "journal_id": self.journal.id, + "partner_id": self.partner.id, + "brand_id": self.brand.id, + } + ) + with self.assertRaises(ValidationError): + invoice.brand_id = self.other_company_brand + + def test_onchange_brand_id(self): + new_invoice = self.env["account.move"].new( + { + "name": "Sample invoice", + "company_id": self.company.id, + "journal_id": self.journal.id, + "partner_id": self.partner.id, + "brand_id": self.brand.id, + } + ) + self.assertEqual(new_invoice.company_id, self.company) + new_invoice.brand_id = self.other_company_brand + new_invoice._onchange_brand_id() + self.assertEqual(new_invoice.company_id, self.other_company) + + def test_get_view(self): + view = self.env["account.move"].get_view( + view_id=self.env.ref("account.view_move_form").id, + view_type="form", + ) + doc = etree.XML(view["arch"]) + self.assertTrue(doc.xpath("//field[@name='brand_use_level']")) + + def test_reverse_move(self): + move = self.env["account.move"].create( + { + "name": "Sample invoice", + "move_type": "out_invoice", + "company_id": self.company.id, + "journal_id": self.journal.id, + "partner_id": self.partner.id, + "brand_id": self.brand.id, + "invoice_line_ids": [ + ( + 0, + 0, + { + "product_id": self.env.ref("product.product_product_1").id, + "quantity": 40.0, + "name": "product test 1", + "discount": 10.00, + "price_unit": 2.27, + }, + ) + ], + } + ) + move.action_post() + reverse_wizard = Form( + self.env["account.move.reversal"].with_context( + active_ids=move.ids, active_model="account.move" + ) + ) + reverse_wizard.reason = "modify" + reverse = reverse_wizard.save() + action = reverse.reverse_moves() + credit_note = self.env["account.move"].browse(action.get("res_id")) + self.assertEqual(credit_note.brand_id, self.brand) diff --git a/account_brand/views/account_move_views.xml b/account_brand/views/account_move_views.xml new file mode 100644 index 000000000..bc402fe57 --- /dev/null +++ b/account_brand/views/account_move_views.xml @@ -0,0 +1,18 @@ + + + + account.move.form - account_brand + account.move + + + + + + + + diff --git a/account_brand/views/res_partner_account_brand.xml b/account_brand/views/res_partner_account_brand.xml new file mode 100644 index 000000000..2e739df02 --- /dev/null +++ b/account_brand/views/res_partner_account_brand.xml @@ -0,0 +1,27 @@ + + + + + res.partner.account.brand.tree (in account_brand) + res.partner.account.brand + + + + + + + + + + + Partner Accounts by Brand + res.partner.account.brand + tree + + + Partner Accounts by Brand + + + + diff --git a/account_brand/wizards/__init__.py b/account_brand/wizards/__init__.py new file mode 100644 index 000000000..715d1bd6d --- /dev/null +++ b/account_brand/wizards/__init__.py @@ -0,0 +1 @@ +from . import account_move_reversal diff --git a/account_brand/wizards/account_move_reversal.py b/account_brand/wizards/account_move_reversal.py new file mode 100644 index 000000000..41b491659 --- /dev/null +++ b/account_brand/wizards/account_move_reversal.py @@ -0,0 +1,13 @@ +# Copyright 2020 ACSONE SA/NV +# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl). + +from odoo import models + + +class AccountMoveReversal(models.TransientModel): + _inherit = "account.move.reversal" + + def _prepare_default_reversal(self, move): + res = super()._prepare_default_reversal(move) + res["brand_id"] = move.brand_id.id + return res