From 5f7c7b0ee43e759cc335382cad9ed4600f536dfa Mon Sep 17 00:00:00 2001 From: SyncMasta Date: Sun, 3 May 2026 16:39:30 +0200 Subject: [PATCH 1/4] [19.0][MIG] agreement_account: init migration Initial migration commit: copy agreement_account from 18.0 with manifest bumped to 19.0.1.0.0 and an empty migrations/19.0.1.0.0/pre-migration.py to mark the version step explicitly. This commit is intentionally functionality-equivalent to the 18.0 state. The follow-up commit applies the 19.0 API breaking changes (read_group to _read_group on the agreement._compute_invoice_count compute method). Co-Authored-By: Claude Opus 4.7 (1M context) --- agreement_account/README.rst | 95 ++++ agreement_account/__init__.py | 1 + agreement_account/__manifest__.py | 28 ++ agreement_account/i18n/agreement_account.pot | 54 +++ agreement_account/i18n/es.po | 67 +++ agreement_account/i18n/es_AR.po | 67 +++ agreement_account/i18n/it.po | 58 +++ agreement_account/i18n/sv.po | 57 +++ .../migrations/19.0.1.0.0/pre-migration.py | 8 + agreement_account/models/__init__.py | 2 + agreement_account/models/account_move.py | 18 + agreement_account/models/agreement.py | 39 ++ agreement_account/pyproject.toml | 3 + agreement_account/readme/CONTRIBUTORS.md | 4 + agreement_account/readme/DESCRIPTION.md | 1 + .../security/ir.model.access.csv | 3 + agreement_account/static/description/icon.png | Bin 0 -> 30051 bytes .../static/description/index.html | 436 ++++++++++++++++++ agreement_account/tests/__init__.py | 1 + agreement_account/tests/test_agreement.py | 32 ++ agreement_account/views/account_move.xml | 57 +++ agreement_account/views/agreement.xml | 84 ++++ 22 files changed, 1115 insertions(+) create mode 100644 agreement_account/README.rst create mode 100644 agreement_account/__init__.py create mode 100644 agreement_account/__manifest__.py create mode 100644 agreement_account/i18n/agreement_account.pot create mode 100644 agreement_account/i18n/es.po create mode 100644 agreement_account/i18n/es_AR.po create mode 100644 agreement_account/i18n/it.po create mode 100644 agreement_account/i18n/sv.po create mode 100644 agreement_account/migrations/19.0.1.0.0/pre-migration.py create mode 100644 agreement_account/models/__init__.py create mode 100644 agreement_account/models/account_move.py create mode 100644 agreement_account/models/agreement.py create mode 100644 agreement_account/pyproject.toml create mode 100644 agreement_account/readme/CONTRIBUTORS.md create mode 100644 agreement_account/readme/DESCRIPTION.md create mode 100644 agreement_account/security/ir.model.access.csv create mode 100644 agreement_account/static/description/icon.png create mode 100644 agreement_account/static/description/index.html create mode 100644 agreement_account/tests/__init__.py create mode 100644 agreement_account/tests/test_agreement.py create mode 100644 agreement_account/views/account_move.xml create mode 100644 agreement_account/views/agreement.xml diff --git a/agreement_account/README.rst b/agreement_account/README.rst new file mode 100644 index 000000000..501a3ec57 --- /dev/null +++ b/agreement_account/README.rst @@ -0,0 +1,95 @@ +.. image:: https://odoo-community.org/readme-banner-image + :target: https://odoo-community.org/get-involved?utm_source=readme + :alt: Odoo Community Association + +================= +Agreement Account +================= + +.. + !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! + !! This file is generated by oca-gen-addon-readme !! + !! changes will be overwritten. !! + !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! + !! source digest: sha256:404e1e4edd2425847d9b4c0a8308bd2b3a1bd4f69a330acc05cb03811c03095d + !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! + +.. |badge1| image:: https://img.shields.io/badge/maturity-Beta-yellow.png + :target: https://odoo-community.org/page/development-status + :alt: Beta +.. |badge2| image:: https://img.shields.io/badge/license-AGPL--3-blue.png + :target: http://www.gnu.org/licenses/agpl-3.0-standalone.html + :alt: License: AGPL-3 +.. |badge3| image:: https://img.shields.io/badge/github-OCA%2Fagreement-lightgray.png?logo=github + :target: https://github.com/OCA/agreement/tree/18.0/agreement_account + :alt: OCA/agreement +.. |badge4| image:: https://img.shields.io/badge/weblate-Translate%20me-F47D42.png + :target: https://translation.odoo-community.org/projects/agreement-18-0/agreement-18-0-agreement_account + :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/agreement&target_branch=18.0 + :alt: Try me on Runboat + +|badge1| |badge2| |badge3| |badge4| |badge5| + +This module adds *Agreement* field on invoices. + +**Table of contents** + +.. contents:: + :local: + +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 +------- + +* Akretion + +Contributors +------------ + +- Alexis de Lattre +- Italo LOPES +- `Heliconia Solutions Pvt. Ltd. `__ + + - Bhavesh Heliconia + +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-alexis-via| image:: https://github.com/alexis-via.png?size=40px + :target: https://github.com/alexis-via + :alt: alexis-via +.. |maintainer-bealdav| image:: https://github.com/bealdav.png?size=40px + :target: https://github.com/bealdav + :alt: bealdav + +Current `maintainers `__: + +|maintainer-alexis-via| |maintainer-bealdav| + +This module is part of the `OCA/agreement `_ project on GitHub. + +You are welcome to contribute. To learn how please visit https://odoo-community.org/page/Contribute. diff --git a/agreement_account/__init__.py b/agreement_account/__init__.py new file mode 100644 index 000000000..0650744f6 --- /dev/null +++ b/agreement_account/__init__.py @@ -0,0 +1 @@ +from . import models diff --git a/agreement_account/__manifest__.py b/agreement_account/__manifest__.py new file mode 100644 index 000000000..4a9f28cf2 --- /dev/null +++ b/agreement_account/__manifest__.py @@ -0,0 +1,28 @@ +# Copyright 2017-2020 Akretion France (http://www.akretion.com/) +# @author: Alexis de Lattre +# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl). + +{ + "name": "Agreement Account", + "summary": "Agreement on invoices", + "version": "19.0.1.0.0", + "category": "Contract", + "author": "Akretion, Odoo Community Association (OCA)", + "website": "https://github.com/OCA/agreement", + "license": "AGPL-3", + "depends": [ + "agreement", + "account", + ], + "data": [ + "security/ir.model.access.csv", + "views/agreement.xml", + "views/account_move.xml", + ], + "development_status": "Beta", + "maintainers": [ + "alexis-via", + "bealdav", + ], + "installable": True, +} diff --git a/agreement_account/i18n/agreement_account.pot b/agreement_account/i18n/agreement_account.pot new file mode 100644 index 000000000..d72f01a44 --- /dev/null +++ b/agreement_account/i18n/agreement_account.pot @@ -0,0 +1,54 @@ +# Translation of Odoo Server. +# This file contains the translation of the following modules: +# * agreement_account +# +msgid "" +msgstr "" +"Project-Id-Version: Odoo Server 18.0\n" +"Report-Msgid-Bugs-To: \n" +"Last-Translator: \n" +"Language-Team: \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: \n" +"Plural-Forms: \n" + +#. module: agreement_account +#: model:ir.model.fields,field_description:agreement_account.field_agreement__out_invoice_count +msgid "# of Customer Invoices" +msgstr "" + +#. module: agreement_account +#: model:ir.model.fields,field_description:agreement_account.field_agreement__in_invoice_count +msgid "# of Vendor Bills" +msgstr "" + +#. module: agreement_account +#: model:ir.model,name:agreement_account.model_agreement +#: model:ir.model.fields,field_description:agreement_account.field_account_bank_statement_line__agreement_id +#: model:ir.model.fields,field_description:agreement_account.field_account_move__agreement_id +#: model_terms:ir.ui.view,arch_db:agreement_account.view_account_invoice_filter +msgid "Agreement" +msgstr "" + +#. module: agreement_account +#: model:ir.ui.menu,name:agreement_account.agreement_type_menu +msgid "Agreement Types" +msgstr "" + +#. module: agreement_account +#: model:ir.model.fields,field_description:agreement_account.field_agreement__invoice_ids +#: model_terms:ir.ui.view,arch_db:agreement_account.agreement_form +msgid "Invoices" +msgstr "" + +#. module: agreement_account +#: model:ir.model,name:agreement_account.model_account_move +msgid "Journal Entry" +msgstr "" + +#. module: agreement_account +#: model:ir.actions.act_window,name:agreement_account.account_invoice_in_invoice_refund_action +#: model_terms:ir.ui.view,arch_db:agreement_account.agreement_form +msgid "Vendor Bills" +msgstr "" diff --git a/agreement_account/i18n/es.po b/agreement_account/i18n/es.po new file mode 100644 index 000000000..638e646ce --- /dev/null +++ b/agreement_account/i18n/es.po @@ -0,0 +1,67 @@ +# Translation of Odoo Server. +# This file contains the translation of the following modules: +# * agreement_account +# +msgid "" +msgstr "" +"Project-Id-Version: Odoo Server 14.0\n" +"Report-Msgid-Bugs-To: \n" +"PO-Revision-Date: 2023-12-19 13:33+0000\n" +"Last-Translator: Ivorra78 \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.17\n" + +#. module: agreement_account +#: model:ir.model.fields,field_description:agreement_account.field_agreement__out_invoice_count +msgid "# of Customer Invoices" +msgstr "# de Facturas de Cliente" + +#. module: agreement_account +#: model:ir.model.fields,field_description:agreement_account.field_agreement__in_invoice_count +msgid "# of Vendor Bills" +msgstr "# de Facturas de Proveedores" + +#. module: agreement_account +#: model:ir.model,name:agreement_account.model_agreement +#: model:ir.model.fields,field_description:agreement_account.field_account_bank_statement_line__agreement_id +#: model:ir.model.fields,field_description:agreement_account.field_account_move__agreement_id +#: model:ir.model.fields,field_description:agreement_account.field_account_payment__agreement_id +#: model_terms:ir.ui.view,arch_db:agreement_account.view_account_invoice_filter +msgid "Agreement" +msgstr "Acuerdo" + +#. module: agreement_account +#: model:ir.ui.menu,name:agreement_account.agreement_type_menu +msgid "Agreement Types" +msgstr "Tipos de Acuerdo" + +#. module: agreement_account +#: model:ir.model.fields,field_description:agreement_account.field_agreement__invoice_ids +#: model_terms:ir.ui.view,arch_db:agreement_account.agreement_form +msgid "Invoices" +msgstr "Facturas" + +#. module: agreement_account +#: model:ir.model,name:agreement_account.model_account_move +msgid "Journal Entry" +msgstr "Entrada en Diario" + +#. module: agreement_account +#: model:ir.actions.act_window,name:agreement_account.account_invoice_in_invoice_refund_action +#: model_terms:ir.ui.view,arch_db:agreement_account.agreement_form +msgid "Vendor Bills" +msgstr "Facturas de Vendedor" + +#~ msgid "Display Name" +#~ msgstr "Mostrar Nombre" + +#~ msgid "ID" +#~ msgstr "ID (identificación)" + +#~ msgid "Last Modified on" +#~ msgstr "Última Modificación el" diff --git a/agreement_account/i18n/es_AR.po b/agreement_account/i18n/es_AR.po new file mode 100644 index 000000000..c737b2e5b --- /dev/null +++ b/agreement_account/i18n/es_AR.po @@ -0,0 +1,67 @@ +# Translation of Odoo Server. +# This file contains the translation of the following modules: +# * agreement_account +# +msgid "" +msgstr "" +"Project-Id-Version: Odoo Server 14.0\n" +"Report-Msgid-Bugs-To: \n" +"PO-Revision-Date: 2022-02-06 20:59+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.3.2\n" + +#. module: agreement_account +#: model:ir.model.fields,field_description:agreement_account.field_agreement__out_invoice_count +msgid "# of Customer Invoices" +msgstr "# de Facturas de Cliente" + +#. module: agreement_account +#: model:ir.model.fields,field_description:agreement_account.field_agreement__in_invoice_count +msgid "# of Vendor Bills" +msgstr "# de Facturas de Proveedores" + +#. module: agreement_account +#: model:ir.model,name:agreement_account.model_agreement +#: model:ir.model.fields,field_description:agreement_account.field_account_bank_statement_line__agreement_id +#: model:ir.model.fields,field_description:agreement_account.field_account_move__agreement_id +#: model:ir.model.fields,field_description:agreement_account.field_account_payment__agreement_id +#: model_terms:ir.ui.view,arch_db:agreement_account.view_account_invoice_filter +msgid "Agreement" +msgstr "Acuerdo" + +#. module: agreement_account +#: model:ir.ui.menu,name:agreement_account.agreement_type_menu +msgid "Agreement Types" +msgstr "Tipos de Acuerdo" + +#. module: agreement_account +#: model:ir.model.fields,field_description:agreement_account.field_agreement__invoice_ids +#: model_terms:ir.ui.view,arch_db:agreement_account.agreement_form +msgid "Invoices" +msgstr "Facturas" + +#. module: agreement_account +#: model:ir.model,name:agreement_account.model_account_move +msgid "Journal Entry" +msgstr "Apunte Contable" + +#. module: agreement_account +#: model:ir.actions.act_window,name:agreement_account.account_invoice_in_invoice_refund_action +#: model_terms:ir.ui.view,arch_db:agreement_account.agreement_form +msgid "Vendor Bills" +msgstr "Facturas de Proveedores" + +#~ msgid "Display Name" +#~ msgstr "Mostrar Nombre" + +#~ msgid "ID" +#~ msgstr "ID" + +#~ msgid "Last Modified on" +#~ msgstr "Última Modificación el" diff --git a/agreement_account/i18n/it.po b/agreement_account/i18n/it.po new file mode 100644 index 000000000..1fca77e53 --- /dev/null +++ b/agreement_account/i18n/it.po @@ -0,0 +1,58 @@ +# Translation of Odoo Server. +# This file contains the translation of the following modules: +# * agreement_account +# +msgid "" +msgstr "" +"Project-Id-Version: Odoo Server 17.0\n" +"Report-Msgid-Bugs-To: \n" +"PO-Revision-Date: 2024-10-25 20:06+0000\n" +"Last-Translator: mymage \n" +"Language-Team: none\n" +"Language: it\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: \n" +"Plural-Forms: nplurals=2; plural=n != 1;\n" +"X-Generator: Weblate 5.6.2\n" + +#. module: agreement_account +#: model:ir.model.fields,field_description:agreement_account.field_agreement__out_invoice_count +msgid "# of Customer Invoices" +msgstr "N° fatture cliente" + +#. module: agreement_account +#: model:ir.model.fields,field_description:agreement_account.field_agreement__in_invoice_count +msgid "# of Vendor Bills" +msgstr "N° fatture fornitore" + +#. module: agreement_account +#: model:ir.model,name:agreement_account.model_agreement +#: model:ir.model.fields,field_description:agreement_account.field_account_bank_statement_line__agreement_id +#: model:ir.model.fields,field_description:agreement_account.field_account_move__agreement_id +#: model:ir.model.fields,field_description:agreement_account.field_account_payment__agreement_id +#: model_terms:ir.ui.view,arch_db:agreement_account.view_account_invoice_filter +msgid "Agreement" +msgstr "Contratto" + +#. module: agreement_account +#: model:ir.ui.menu,name:agreement_account.agreement_type_menu +msgid "Agreement Types" +msgstr "Tipi contratto" + +#. module: agreement_account +#: model:ir.model.fields,field_description:agreement_account.field_agreement__invoice_ids +#: model_terms:ir.ui.view,arch_db:agreement_account.agreement_form +msgid "Invoices" +msgstr "Fatture" + +#. module: agreement_account +#: model:ir.model,name:agreement_account.model_account_move +msgid "Journal Entry" +msgstr "Registrazione contabile" + +#. module: agreement_account +#: model:ir.actions.act_window,name:agreement_account.account_invoice_in_invoice_refund_action +#: model_terms:ir.ui.view,arch_db:agreement_account.agreement_form +msgid "Vendor Bills" +msgstr "Fatture fornitore" diff --git a/agreement_account/i18n/sv.po b/agreement_account/i18n/sv.po new file mode 100644 index 000000000..a0cca91ce --- /dev/null +++ b/agreement_account/i18n/sv.po @@ -0,0 +1,57 @@ +# Translation of Odoo Server. +# This file contains the translation of the following modules: +# * agreement_account +# +msgid "" +msgstr "" +"Project-Id-Version: Odoo Server 18.0\n" +"Report-Msgid-Bugs-To: \n" +"PO-Revision-Date: 2025-11-03 15:56+0000\n" +"Last-Translator: jakobkrabbe \n" +"Language-Team: none\n" +"Language: sv\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: \n" +"Plural-Forms: nplurals=2; plural=n != 1;\n" +"X-Generator: Weblate 5.10.4\n" + +#. module: agreement_account +#: model:ir.model.fields,field_description:agreement_account.field_agreement__out_invoice_count +msgid "# of Customer Invoices" +msgstr "# Antal kundfakturor" + +#. module: agreement_account +#: model:ir.model.fields,field_description:agreement_account.field_agreement__in_invoice_count +msgid "# of Vendor Bills" +msgstr "# Antal leverantörsfakturor" + +#. module: agreement_account +#: model:ir.model,name:agreement_account.model_agreement +#: model:ir.model.fields,field_description:agreement_account.field_account_bank_statement_line__agreement_id +#: model:ir.model.fields,field_description:agreement_account.field_account_move__agreement_id +#: model_terms:ir.ui.view,arch_db:agreement_account.view_account_invoice_filter +msgid "Agreement" +msgstr "Avtal" + +#. module: agreement_account +#: model:ir.ui.menu,name:agreement_account.agreement_type_menu +msgid "Agreement Types" +msgstr "Typer av avtal" + +#. module: agreement_account +#: model:ir.model.fields,field_description:agreement_account.field_agreement__invoice_ids +#: model_terms:ir.ui.view,arch_db:agreement_account.agreement_form +msgid "Invoices" +msgstr "Fakturor" + +#. module: agreement_account +#: model:ir.model,name:agreement_account.model_account_move +msgid "Journal Entry" +msgstr "Verifikat" + +#. module: agreement_account +#: model:ir.actions.act_window,name:agreement_account.account_invoice_in_invoice_refund_action +#: model_terms:ir.ui.view,arch_db:agreement_account.agreement_form +msgid "Vendor Bills" +msgstr "Leverantörsfakturor" diff --git a/agreement_account/migrations/19.0.1.0.0/pre-migration.py b/agreement_account/migrations/19.0.1.0.0/pre-migration.py new file mode 100644 index 000000000..291e44a07 --- /dev/null +++ b/agreement_account/migrations/19.0.1.0.0/pre-migration.py @@ -0,0 +1,8 @@ +# Copyright 2026 WISSEN BERATUNG +# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl). +"""Placeholder pre-migration script for 18.0 -> 19.0. + +No schema drift in this migration -- fields and models are stable. +Kept as an explicit empty step so OpenUpgrade recognises 19.0 as a +deliberate version bump. +""" diff --git a/agreement_account/models/__init__.py b/agreement_account/models/__init__.py new file mode 100644 index 000000000..77c035979 --- /dev/null +++ b/agreement_account/models/__init__.py @@ -0,0 +1,2 @@ +from . import account_move +from . import agreement diff --git a/agreement_account/models/account_move.py b/agreement_account/models/account_move.py new file mode 100644 index 000000000..7d9dc8bf0 --- /dev/null +++ b/agreement_account/models/account_move.py @@ -0,0 +1,18 @@ +# Copyright 2017-2020 Akretion France (http://www.akretion.com/) +# @author: Alexis de Lattre +# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl). + + +from odoo import fields, models + + +class AccountMove(models.Model): + _inherit = "account.move" + + agreement_id = fields.Many2one( + comodel_name="agreement", + string="Agreement", + ondelete="restrict", + tracking=True, + copy=False, + ) diff --git a/agreement_account/models/agreement.py b/agreement_account/models/agreement.py new file mode 100644 index 000000000..809228458 --- /dev/null +++ b/agreement_account/models/agreement.py @@ -0,0 +1,39 @@ +# Copyright 2017-2020 Akretion France (http://www.akretion.com/) +# @author: Alexis de Lattre +# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl). + + +from odoo import fields, models + + +class Agreement(models.Model): + _inherit = "agreement" + + invoice_ids = fields.One2many( + "account.move", "agreement_id", string="Invoices", readonly=True + ) + out_invoice_count = fields.Integer( + compute="_compute_invoice_count", string="# of Customer Invoices" + ) + in_invoice_count = fields.Integer( + compute="_compute_invoice_count", string="# of Vendor Bills" + ) + + def _compute_invoice_count(self): + base_domain = [("agreement_id", "in", self.ids)] + aio = self.env["account.move"] + out_rg_res = aio.read_group( + base_domain + [("move_type", "in", ("out_invoice", "out_refund"))], + ["agreement_id"], + ["agreement_id"], + ) + out_data = {x["agreement_id"][0]: x["agreement_id_count"] for x in out_rg_res} + in_rg_res = aio.read_group( + base_domain + [("move_type", "in", ("in_invoice", "in_refund"))], + ["agreement_id"], + ["agreement_id"], + ) + in_data = {x["agreement_id"][0]: x["agreement_id_count"] for x in in_rg_res} + for agreement in self: + agreement.out_invoice_count = out_data.get(agreement.id, 0) + agreement.in_invoice_count = in_data.get(agreement.id, 0) diff --git a/agreement_account/pyproject.toml b/agreement_account/pyproject.toml new file mode 100644 index 000000000..4231d0ccc --- /dev/null +++ b/agreement_account/pyproject.toml @@ -0,0 +1,3 @@ +[build-system] +requires = ["whool"] +build-backend = "whool.buildapi" diff --git a/agreement_account/readme/CONTRIBUTORS.md b/agreement_account/readme/CONTRIBUTORS.md new file mode 100644 index 000000000..7742cdaa2 --- /dev/null +++ b/agreement_account/readme/CONTRIBUTORS.md @@ -0,0 +1,4 @@ +- Alexis de Lattre \<\> +- Italo LOPES \<\> +- [Heliconia Solutions Pvt. Ltd.](https://www.heliconia.io) + - Bhavesh Heliconia diff --git a/agreement_account/readme/DESCRIPTION.md b/agreement_account/readme/DESCRIPTION.md new file mode 100644 index 000000000..18e63adc3 --- /dev/null +++ b/agreement_account/readme/DESCRIPTION.md @@ -0,0 +1 @@ +This module adds *Agreement* field on invoices. diff --git a/agreement_account/security/ir.model.access.csv b/agreement_account/security/ir.model.access.csv new file mode 100644 index 000000000..c1b7f487c --- /dev/null +++ b/agreement_account/security/ir.model.access.csv @@ -0,0 +1,3 @@ +id,name,model_id:id,group_id:id,perm_read,perm_write,perm_create,perm_unlink +access_agreement_full,Full access on agreement to Financial mgr,agreement.model_agreement,account.group_account_manager,1,1,1,1 +access_agreement_type_full,Full access on agreement type to Financial mgr,agreement.model_agreement_type,account.group_account_manager,1,1,1,1 diff --git a/agreement_account/static/description/icon.png b/agreement_account/static/description/icon.png new file mode 100644 index 0000000000000000000000000000000000000000..976ee9a3557481213d320ce20d50fe7667559aa9 GIT binary patch literal 30051 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 JR(<&I{{g^`ENuV) literal 0 HcmV?d00001 diff --git a/agreement_account/static/description/index.html b/agreement_account/static/description/index.html new file mode 100644 index 000000000..8c131b868 --- /dev/null +++ b/agreement_account/static/description/index.html @@ -0,0 +1,436 @@ + + + + + +README.rst + + + +
+ + + +Odoo Community Association + +
+

Agreement Account

+ +

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

+

This module adds Agreement field on invoices.

+

Table of contents

+ +
+

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

+
    +
  • Akretion
  • +
+
+
+

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.

+

Current maintainers:

+

alexis-via bealdav

+

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

+

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

+
+
+
+
+ + diff --git a/agreement_account/tests/__init__.py b/agreement_account/tests/__init__.py new file mode 100644 index 000000000..b636caa99 --- /dev/null +++ b/agreement_account/tests/__init__.py @@ -0,0 +1 @@ +from . import test_agreement diff --git a/agreement_account/tests/test_agreement.py b/agreement_account/tests/test_agreement.py new file mode 100644 index 000000000..9bbb2bdb8 --- /dev/null +++ b/agreement_account/tests/test_agreement.py @@ -0,0 +1,32 @@ +# Copyright 2017-2020 Akretion France (http://www.akretion.com/) +# @author: Alexis de Lattre +# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl). + +from odoo.addons.base.tests.common import BaseCommon + + +class TestAgreement(BaseCommon): + @classmethod + def setUpClass(self): + super().setUpClass() + self.test_customer = self.env["res.partner"].create({"name": "TestCustomer"}) + self.test_agreement_sale = self.env["agreement"].create( + { + "name": "TestAgreement-Sale", + "code": "SALE", + "partner_id": self.test_customer.id, + "domain": "sale", + } + ) + self.test_agreement_purchase = self.env["agreement"].create( + { + "name": "TestAgreement-Purchase", + "code": "PURCHASE", + "partner_id": self.test_customer.id, + "domain": "purchase", + } + ) + + def test_compute_invoice_count(self): + self.test_agreement_sale._compute_invoice_count() + self.test_agreement_purchase._compute_invoice_count() diff --git a/agreement_account/views/account_move.xml b/agreement_account/views/account_move.xml new file mode 100644 index 000000000..67fa9005b --- /dev/null +++ b/agreement_account/views/account_move.xml @@ -0,0 +1,57 @@ + + + + agreement.customer.invoice.form + account.move + + + + + + + + + + + agreement.supplier.invoice.form + account.move + + + + + + + + + + agreement.account.move.search + account.move + + + + + + + + + + + diff --git a/agreement_account/views/agreement.xml b/agreement_account/views/agreement.xml new file mode 100644 index 000000000..e968f65dc --- /dev/null +++ b/agreement_account/views/agreement.xml @@ -0,0 +1,84 @@ + + + + 150 + + + + + + Vendor Bills + account.move + list,form + [('move_type','in', ('in_invoice', 'in_refund')), ('state', 'not in', ('draft', 'cancel'))] + {'default_type': 'in_invoice', 'move_type': 'in_invoice', 'journal_type': 'purchase'} + + + + + list + + + + + + + form + + + + + + invoice.button.agreement.form + agreement + + +
+ + +
+
+
+
From f6cdd6ca4449c830317d8acadb716bd3b07e1a14 Mon Sep 17 00:00:00 2001 From: SyncMasta Date: Sun, 3 May 2026 16:40:27 +0200 Subject: [PATCH 2/4] [19.0][MIG] agreement_account: 19.0 API + prettier format read_group has been removed in 19.0. Migrated _compute_invoice_count in agreement.py from the old (domain, fields, groupby) tuple form to the new _read_group(domain, groupby=, aggregates=) form, which returns recordset tuples directly: # 18.0 rg = aio.read_group(domain, ['agreement_id'], ['agreement_id']) data = {x['agreement_id'][0]: x['agreement_id_count'] for x in rg} # 19.0 rg = aio._read_group(domain, groupby=['agreement_id'], aggregates=['__count']) data = {agreement.id: count for agreement, count in rg} Also: prettier @prettier/plugin-xml@3.4.2 normalisation across the view files and readme/, no semantic XML changes. Co-Authored-By: Claude Opus 4.7 (1M context) --- agreement_account/models/agreement.py | 16 +- agreement_account/readme/DESCRIPTION.md | 2 +- .../static/description/index.html | 1072 ++++++++++------- 3 files changed, 678 insertions(+), 412 deletions(-) diff --git a/agreement_account/models/agreement.py b/agreement_account/models/agreement.py index 809228458..adeb6f6b4 100644 --- a/agreement_account/models/agreement.py +++ b/agreement_account/models/agreement.py @@ -22,18 +22,18 @@ class Agreement(models.Model): def _compute_invoice_count(self): base_domain = [("agreement_id", "in", self.ids)] aio = self.env["account.move"] - out_rg_res = aio.read_group( + out_rg = aio._read_group( base_domain + [("move_type", "in", ("out_invoice", "out_refund"))], - ["agreement_id"], - ["agreement_id"], + groupby=["agreement_id"], + aggregates=["__count"], ) - out_data = {x["agreement_id"][0]: x["agreement_id_count"] for x in out_rg_res} - in_rg_res = aio.read_group( + out_data = {agreement.id: count for agreement, count in out_rg} + in_rg = aio._read_group( base_domain + [("move_type", "in", ("in_invoice", "in_refund"))], - ["agreement_id"], - ["agreement_id"], + groupby=["agreement_id"], + aggregates=["__count"], ) - in_data = {x["agreement_id"][0]: x["agreement_id_count"] for x in in_rg_res} + in_data = {agreement.id: count for agreement, count in in_rg} for agreement in self: agreement.out_invoice_count = out_data.get(agreement.id, 0) agreement.in_invoice_count = in_data.get(agreement.id, 0) diff --git a/agreement_account/readme/DESCRIPTION.md b/agreement_account/readme/DESCRIPTION.md index 18e63adc3..ff0b5ca02 100644 --- a/agreement_account/readme/DESCRIPTION.md +++ b/agreement_account/readme/DESCRIPTION.md @@ -1 +1 @@ -This module adds *Agreement* field on invoices. +This module adds _Agreement_ field on invoices. diff --git a/agreement_account/static/description/index.html b/agreement_account/static/description/index.html index 8c131b868..f2d7c107b 100644 --- a/agreement_account/static/description/index.html +++ b/agreement_account/static/description/index.html @@ -1,12 +1,11 @@ - - - -README.rst - - - -
- - - -Odoo Community Association - -
-

Agreement Account

- -

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

-

This module adds Agreement field on invoices.

-

Table of contents

- -
-

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

-
    -
  • Akretion
  • -
-
-
-

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.

-

Current maintainers:

-

alexis-via bealdav

-

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

-

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

-
-
-
-
- +

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

+

This module adds Agreement field on invoices.

+

Table of contents

+
+ +
+
+

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

+
    +
  • Akretion
  • +
+
+
+

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. +

+

+ Current + maintainers: +

+

+ alexis-via + bealdav +

+

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

+

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

+
+
+ + + From f888b97d6353149057ffcc8eeacb17fe64c18185 Mon Sep 17 00:00:00 2001 From: SyncMasta Date: Sun, 3 May 2026 20:19:06 +0200 Subject: [PATCH 3/4] [19.0][MIG] agreement_account: account_management_menu renamed in 19.0 MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit The XML ID 'account.account_management_menu' was removed in Odoo 19.0 (ValueError: External ID not found in the system: account.account_ management_menu). The 18.0 menu was a top-level 'Management' entry under group_account_manager. In 19.0 the Account top-level structure was reorganised: - account.account_management_menu — gone - account.account_reports_management_menu — under Reports tree - account.menu_finance_configuration — top-level 'Configuration' under group_account_manager Choosing menu_finance_configuration: it's the semantic equivalent (top-level, Account-Manager-only) and is the right home for the agreement-type setup action this menu hosts. Co-Authored-By: Claude Opus 4.7 (1M context) --- agreement_account/views/agreement.xml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/agreement_account/views/agreement.xml b/agreement_account/views/agreement.xml index e968f65dc..61717d2c5 100644 --- a/agreement_account/views/agreement.xml +++ b/agreement_account/views/agreement.xml @@ -1,13 +1,13 @@ - + 150 From 6525b41466df86e0f02245ff4bf79219faae6332 Mon Sep 17 00:00:00 2001 From: SyncMasta Date: Sun, 3 May 2026 21:40:46 +0200 Subject: [PATCH 4/4] [19.0][MIG] agreement_account: search xpath without expand=0 attribute The parent view account.view_account_invoice_filter no longer wraps its group-by filters in ; in 19.0 the container is a plain with no attributes. The 18.0 inheritance form cannot locate that element and fails with ParseError: Element '' cannot be located in parent view Switch to a positional xpath that matches the first group inside the search element, which is the group-by container regardless of whether it carries an expand attribute. Co-Authored-By: Claude Opus 4.7 (1M context) --- agreement_account/views/account_move.xml | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/agreement_account/views/account_move.xml b/agreement_account/views/account_move.xml index 67fa9005b..88392da58 100644 --- a/agreement_account/views/account_move.xml +++ b/agreement_account/views/account_move.xml @@ -45,13 +45,17 @@ - + + - +