From d748aad9f39b35811d64321869ebe2108bbb10c2 Mon Sep 17 00:00:00 2001 From: Carlos Dauden Date: Mon, 20 Jun 2022 18:27:34 +0200 Subject: [PATCH 01/11] [ADD] sale_payment_sheet_financial_risk: New module TT37610 --- sale_payment_sheet_financial_risk/README.rst | 85 ++++ sale_payment_sheet_financial_risk/__init__.py | 1 + .../__manifest__.py | 18 + sale_payment_sheet_financial_risk/i18n/es.po | 64 +++ .../sale_payment_sheet_financial_risk.pot | 60 +++ .../models/__init__.py | 1 + .../models/res_partner.py | 81 ++++ .../readme/CONTRIBUTORS.rst | 3 + .../readme/DESCRIPTION.rst | 2 + .../readme/USAGE.rst | 5 + .../static/description/icon.png | Bin 0 -> 9455 bytes .../static/description/index.html | 433 ++++++++++++++++++ .../tests/__init__.py | 3 + .../test_sale_payment_sheet_financial_risk.py | 12 + .../views/res_partner_view.xml | 29 ++ ...sale_payment_sheet_financial_risk_view.xml | 15 + 16 files changed, 812 insertions(+) create mode 100644 sale_payment_sheet_financial_risk/README.rst create mode 100644 sale_payment_sheet_financial_risk/__init__.py create mode 100644 sale_payment_sheet_financial_risk/__manifest__.py create mode 100644 sale_payment_sheet_financial_risk/i18n/es.po create mode 100644 sale_payment_sheet_financial_risk/i18n/sale_payment_sheet_financial_risk.pot create mode 100644 sale_payment_sheet_financial_risk/models/__init__.py create mode 100644 sale_payment_sheet_financial_risk/models/res_partner.py create mode 100644 sale_payment_sheet_financial_risk/readme/CONTRIBUTORS.rst create mode 100644 sale_payment_sheet_financial_risk/readme/DESCRIPTION.rst create mode 100644 sale_payment_sheet_financial_risk/readme/USAGE.rst create mode 100644 sale_payment_sheet_financial_risk/static/description/icon.png create mode 100644 sale_payment_sheet_financial_risk/static/description/index.html create mode 100644 sale_payment_sheet_financial_risk/tests/__init__.py create mode 100644 sale_payment_sheet_financial_risk/tests/test_sale_payment_sheet_financial_risk.py create mode 100644 sale_payment_sheet_financial_risk/views/res_partner_view.xml create mode 100644 sale_payment_sheet_financial_risk/views/sale_payment_sheet_financial_risk_view.xml diff --git a/sale_payment_sheet_financial_risk/README.rst b/sale_payment_sheet_financial_risk/README.rst new file mode 100644 index 000000000..01151a7ee --- /dev/null +++ b/sale_payment_sheet_financial_risk/README.rst @@ -0,0 +1,85 @@ +================================= +Sale Payment Sheet Financial Risk +================================= + +.. !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! + !! This file is generated by oca-gen-addon-readme !! + !! changes will be overwritten. !! + !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! + +.. |badge1| image:: https://img.shields.io/badge/maturity-Beta-yellow.png + :target: https://odoo-community.org/page/development-status + :alt: Beta +.. |badge2| image:: https://img.shields.io/badge/licence-AGPL--3-blue.png + :target: http://www.gnu.org/licenses/agpl-3.0-standalone.html + :alt: License: AGPL-3 +.. |badge3| image:: https://img.shields.io/badge/github-OCA%2Fcredit--control-lightgray.png?logo=github + :target: https://github.com/OCA/credit-control/tree/13.0/sale_payment_sheet_financial_risk + :alt: OCA/credit-control +.. |badge4| image:: https://img.shields.io/badge/weblate-Translate%20me-F47D42.png + :target: https://translation.odoo-community.org/projects/credit-control-13-0/credit-control-13-0-sale_payment_sheet_financial_risk + :alt: Translate me on Weblate +.. |badge5| image:: https://img.shields.io/badge/runbot-Try%20me-875A7B.png + :target: https://runbot.odoo-community.org/runbot/262/13.0 + :alt: Try me on Runbot + +|badge1| |badge2| |badge3| |badge4| |badge5| + +Extends Partner Financial Risk to allows you to deduct from the risk the amounts +collected on sale payment sheets pending reconciliation. + +**Table of contents** + +.. contents:: + :local: + +Usage +===== + +To use this module, you need to: + +#. Go to *Customers > Financial Risk* +#. You will see the new Sale Payment Sheet field that accumulates in negative sign the + unreconciled payments so that this amount can be deducted from the risk. + +Bug Tracker +=========== + +Bugs are tracked on `GitHub Issues `_. +In case of trouble, please check there if your issue has already been reported. +If you spotted it first, help us smashing it by providing a detailed and welcomed +`feedback `_. + +Do not contact contributors directly about support or help with technical issues. + +Credits +======= + +Authors +~~~~~~~ + +* Tecnativa + +Contributors +~~~~~~~~~~~~ + +* `Tecnativa `_: + + * Carlos Dauden + +Maintainers +~~~~~~~~~~~ + +This module is maintained by the OCA. + +.. image:: https://odoo-community.org/logo.png + :alt: Odoo Community Association + :target: https://odoo-community.org + +OCA, or the Odoo Community Association, is a nonprofit organization whose +mission is to support the collaborative development of Odoo features and +promote its widespread use. + +This module is part of the `OCA/credit-control `_ project on GitHub. + +You are welcome to contribute. To learn how please visit https://odoo-community.org/page/Contribute. diff --git a/sale_payment_sheet_financial_risk/__init__.py b/sale_payment_sheet_financial_risk/__init__.py new file mode 100644 index 000000000..0650744f6 --- /dev/null +++ b/sale_payment_sheet_financial_risk/__init__.py @@ -0,0 +1 @@ +from . import models diff --git a/sale_payment_sheet_financial_risk/__manifest__.py b/sale_payment_sheet_financial_risk/__manifest__.py new file mode 100644 index 000000000..e2ec35897 --- /dev/null +++ b/sale_payment_sheet_financial_risk/__manifest__.py @@ -0,0 +1,18 @@ +# Copyright 2021 Tecnativa - Carlos Dauden +# License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl). + +{ + "name": "Sale Payment Sheet Financial Risk", + "summary": "Manage partner risk in sale payment sheet", + "version": "13.0.1.0.0", + "category": "Account", + "license": "AGPL-3", + "author": "Tecnativa, Odoo Community Association (OCA)", + "website": "https://github.com/OCA/credit-control", + "depends": ["account_financial_risk", "sale_payment_sheet"], + "data": [ + "views/res_partner_view.xml", + "views/sale_payment_sheet_financial_risk_view.xml", + ], + "installable": True, +} diff --git a/sale_payment_sheet_financial_risk/i18n/es.po b/sale_payment_sheet_financial_risk/i18n/es.po new file mode 100644 index 000000000..45569de08 --- /dev/null +++ b/sale_payment_sheet_financial_risk/i18n/es.po @@ -0,0 +1,64 @@ +# Translation of Odoo Server. +# This file contains the translation of the following modules: +# * sale_payment_sheet_financial_risk +# +msgid "" +msgstr "" +"Project-Id-Version: Odoo Server 13.0\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2022-06-20 16:01+0000\n" +"PO-Revision-Date: 2022-06-20 18:03+0200\n" +"Last-Translator: Carlos Dauden \n" +"Language-Team: \n" +"Language: es\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" +"X-Generator: Poedit 2.3\n" + +#. module: sale_payment_sheet_financial_risk +#: model:ir.model,name:sale_payment_sheet_financial_risk.model_res_partner +msgid "Contact" +msgstr "Contacto" + +#. module: sale_payment_sheet_financial_risk +#: model:ir.model.fields,field_description:sale_payment_sheet_financial_risk.field_res_partner__risk_sale_payment_sheet_include +#: model:ir.model.fields,field_description:sale_payment_sheet_financial_risk.field_res_users__risk_sale_payment_sheet_include +msgid "Deduct Sale Payment Sheet" +msgstr "Deducir hoja de pago de ventas" + +#. module: sale_payment_sheet_financial_risk +#: model:ir.model.fields,help:sale_payment_sheet_financial_risk.field_res_partner__risk_sale_payment_sheet_include +#: model:ir.model.fields,help:sale_payment_sheet_financial_risk.field_res_users__risk_sale_payment_sheet_include +msgid "Deduct pending payments in sales payment sheet" +msgstr "Deducir pagos pendientes en hoja de pago de ventas" + +#. module: sale_payment_sheet_financial_risk +#: model:ir.model.fields,field_description:sale_payment_sheet_financial_risk.field_res_partner__risk_sale_payment_sheet_limit +#: model:ir.model.fields,field_description:sale_payment_sheet_financial_risk.field_res_users__risk_sale_payment_sheet_limit +msgid "Limit Sale Payment Sheet" +msgstr "Limite en hojas de pagos de ventas" + +#. module: sale_payment_sheet_financial_risk +#: model:ir.model.fields,field_description:sale_payment_sheet_financial_risk.field_res_partner__sale_payment_sheet_ids +#: model:ir.model.fields,field_description:sale_payment_sheet_financial_risk.field_res_users__sale_payment_sheet_ids +msgid "Sale Payment Sheet" +msgstr "Hoja de pagos de ventas" + +#. module: sale_payment_sheet_financial_risk +#: model_terms:ir.ui.view,arch_db:sale_payment_sheet_financial_risk.financial_risk_sale_payment_sheet_line_pivot_view +msgid "Sale Payment Sheet Lines" +msgstr "Lineas de hoja de pagos de ventas" + +#. module: sale_payment_sheet_financial_risk +#: model:ir.model.fields,help:sale_payment_sheet_financial_risk.field_res_partner__risk_sale_payment_sheet_limit +#: model:ir.model.fields,help:sale_payment_sheet_financial_risk.field_res_users__risk_sale_payment_sheet_limit +msgid "Set 0 if it is not locked" +msgstr "Establece 0 si no está bloqueado" + +#. module: sale_payment_sheet_financial_risk +#: model:ir.model.fields,field_description:sale_payment_sheet_financial_risk.field_res_partner__risk_sale_payment_sheet +#: model:ir.model.fields,field_description:sale_payment_sheet_financial_risk.field_res_users__risk_sale_payment_sheet +msgid "Total Sale Payment Sheet" +msgstr "Total hoja de pagos de ventas" diff --git a/sale_payment_sheet_financial_risk/i18n/sale_payment_sheet_financial_risk.pot b/sale_payment_sheet_financial_risk/i18n/sale_payment_sheet_financial_risk.pot new file mode 100644 index 000000000..712d3444d --- /dev/null +++ b/sale_payment_sheet_financial_risk/i18n/sale_payment_sheet_financial_risk.pot @@ -0,0 +1,60 @@ +# Translation of Odoo Server. +# This file contains the translation of the following modules: +# * sale_payment_sheet_financial_risk +# +msgid "" +msgstr "" +"Project-Id-Version: Odoo Server 13.0\n" +"Report-Msgid-Bugs-To: \n" +"Last-Translator: \n" +"Language-Team: \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: \n" +"Plural-Forms: \n" + +#. module: sale_payment_sheet_financial_risk +#: model:ir.model,name:sale_payment_sheet_financial_risk.model_res_partner +msgid "Contact" +msgstr "" + +#. module: sale_payment_sheet_financial_risk +#: model:ir.model.fields,field_description:sale_payment_sheet_financial_risk.field_res_partner__risk_sale_payment_sheet_include +#: model:ir.model.fields,field_description:sale_payment_sheet_financial_risk.field_res_users__risk_sale_payment_sheet_include +msgid "Deduct Sale Payment Sheet" +msgstr "" + +#. module: sale_payment_sheet_financial_risk +#: model:ir.model.fields,help:sale_payment_sheet_financial_risk.field_res_partner__risk_sale_payment_sheet_include +#: model:ir.model.fields,help:sale_payment_sheet_financial_risk.field_res_users__risk_sale_payment_sheet_include +msgid "Deduct pending payments in sales payment sheet" +msgstr "" + +#. module: sale_payment_sheet_financial_risk +#: model:ir.model.fields,field_description:sale_payment_sheet_financial_risk.field_res_partner__risk_sale_payment_sheet_limit +#: model:ir.model.fields,field_description:sale_payment_sheet_financial_risk.field_res_users__risk_sale_payment_sheet_limit +msgid "Limit Sale Payment Sheet" +msgstr "" + +#. module: sale_payment_sheet_financial_risk +#: model:ir.model.fields,field_description:sale_payment_sheet_financial_risk.field_res_partner__sale_payment_sheet_ids +#: model:ir.model.fields,field_description:sale_payment_sheet_financial_risk.field_res_users__sale_payment_sheet_ids +msgid "Sale Payment Sheet" +msgstr "" + +#. module: sale_payment_sheet_financial_risk +#: model_terms:ir.ui.view,arch_db:sale_payment_sheet_financial_risk.financial_risk_sale_payment_sheet_line_pivot_view +msgid "Sale Payment Sheet Lines" +msgstr "" + +#. module: sale_payment_sheet_financial_risk +#: model:ir.model.fields,help:sale_payment_sheet_financial_risk.field_res_partner__risk_sale_payment_sheet_limit +#: model:ir.model.fields,help:sale_payment_sheet_financial_risk.field_res_users__risk_sale_payment_sheet_limit +msgid "Set 0 if it is not locked" +msgstr "" + +#. module: sale_payment_sheet_financial_risk +#: model:ir.model.fields,field_description:sale_payment_sheet_financial_risk.field_res_partner__risk_sale_payment_sheet +#: model:ir.model.fields,field_description:sale_payment_sheet_financial_risk.field_res_users__risk_sale_payment_sheet +msgid "Total Sale Payment Sheet" +msgstr "" diff --git a/sale_payment_sheet_financial_risk/models/__init__.py b/sale_payment_sheet_financial_risk/models/__init__.py new file mode 100644 index 000000000..91fed54d4 --- /dev/null +++ b/sale_payment_sheet_financial_risk/models/__init__.py @@ -0,0 +1 @@ +from . import res_partner diff --git a/sale_payment_sheet_financial_risk/models/res_partner.py b/sale_payment_sheet_financial_risk/models/res_partner.py new file mode 100644 index 000000000..f867c6adc --- /dev/null +++ b/sale_payment_sheet_financial_risk/models/res_partner.py @@ -0,0 +1,81 @@ +# Copyright 2022 Tecnativa - Carlos Dauden +# License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl). + +from odoo import api, fields, models + + +class ResPartner(models.Model): + _inherit = "res.partner" + + risk_sale_payment_sheet_include = fields.Boolean( + string="Deduct Sale Payment Sheet", + help="Deduct pending payments in sales payment sheet", + ) + risk_sale_payment_sheet_limit = fields.Monetary( + string="Limit Sale Payment Sheet", + currency_field="risk_currency_id", + help="Set 0 if it is not locked", + ) + risk_sale_payment_sheet = fields.Monetary( + compute="_compute_risk_sale_payment_sheet", + currency_field="risk_currency_id", + compute_sudo=True, + string="Total Sale Payment Sheet", + ) + sale_payment_sheet_ids = fields.One2many( + comodel_name="sale.payment.sheet.line", inverse_name="partner_id" + ) + + def _get_risk_sale_payment_sheet_domain(self): + # When p is NewId object instance bool(p.id) is False + commercial_partners = self.filtered( + lambda p: (p.id and p == p.commercial_partner_id) + ) + return [ + ("partner_id", "in", commercial_partners.ids), + "|", + ("state", "=", "open"), + ("statement_line_id.state", "=", "open"), + ] + + @api.depends( + "sale_payment_sheet_ids.amount", "child_ids.sale_payment_sheet_ids.amount", + ) + def _compute_risk_sale_payment_sheet(self): + self.update({"risk_sale_payment_sheet": 0.0}) + payments_group = self.env["sale.payment.sheet.line"].read_group( + domain=self._get_risk_sale_payment_sheet_domain(), + fields=["partner_id", "amount"], + groupby=["partner_id"], + orderby="id", + lazy=False, + ) + for group in payments_group: + partner = self.browse(group["partner_id"][0]) + company = self.env.user.company_id + company_currency = company.currency_id + partner.risk_sale_payment_sheet = company_currency._convert( + -group["amount"], + partner.risk_currency_id, + company, + fields.Date.context_today(self), + round=False, + ) + + @api.model + def _risk_field_list(self): + res = super(ResPartner, self)._risk_field_list() + res.append( + ( + "risk_sale_payment_sheet", + "risk_sale_payment_sheet_limit", + "risk_sale_payment_sheet_include", + ) + ) + return res + + def _get_field_risk_model_domain(self, field_name): + if field_name == "risk_sale_payment_sheet": + return "sale.payment.sheet.line", self._get_risk_sale_payment_sheet_domain() + else: + return super()._get_field_risk_model_domain(field_name) diff --git a/sale_payment_sheet_financial_risk/readme/CONTRIBUTORS.rst b/sale_payment_sheet_financial_risk/readme/CONTRIBUTORS.rst new file mode 100644 index 000000000..af740da8f --- /dev/null +++ b/sale_payment_sheet_financial_risk/readme/CONTRIBUTORS.rst @@ -0,0 +1,3 @@ +* `Tecnativa `_: + + * Carlos Dauden diff --git a/sale_payment_sheet_financial_risk/readme/DESCRIPTION.rst b/sale_payment_sheet_financial_risk/readme/DESCRIPTION.rst new file mode 100644 index 000000000..a5d71b9c9 --- /dev/null +++ b/sale_payment_sheet_financial_risk/readme/DESCRIPTION.rst @@ -0,0 +1,2 @@ +Extends Partner Financial Risk to allows you to deduct from the risk the amounts +collected on sale payment sheets pending reconciliation. diff --git a/sale_payment_sheet_financial_risk/readme/USAGE.rst b/sale_payment_sheet_financial_risk/readme/USAGE.rst new file mode 100644 index 000000000..0b5d3e8a4 --- /dev/null +++ b/sale_payment_sheet_financial_risk/readme/USAGE.rst @@ -0,0 +1,5 @@ +To use this module, you need to: + +#. Go to *Customers > Financial Risk* +#. You will see the new Sale Payment Sheet field that accumulates in negative sign the + unreconciled payments so that this amount can be deducted from the risk. diff --git a/sale_payment_sheet_financial_risk/static/description/icon.png b/sale_payment_sheet_financial_risk/static/description/icon.png new file mode 100644 index 0000000000000000000000000000000000000000..3a0328b516c4980e8e44cdb63fd945757ddd132d GIT binary patch literal 9455 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 z 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 Xviia!U7SGha1wx#SCgwmn*{w2TRX*I literal 0 HcmV?d00001 diff --git a/sale_payment_sheet_financial_risk/static/description/index.html b/sale_payment_sheet_financial_risk/static/description/index.html new file mode 100644 index 000000000..8fbfa4862 --- /dev/null +++ b/sale_payment_sheet_financial_risk/static/description/index.html @@ -0,0 +1,433 @@ + + + + + + +Sale Payment Sheet Financial Risk + + + +
+

Sale Payment Sheet Financial Risk

+ + +

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

+

Extends Partner Financial Risk to allows you to deduct from the risk the amounts +collected on sale payment sheets pending reconciliation.

+

Table of contents

+ +
+

Usage

+

To use this module, you need to:

+
    +
  1. Go to Customers > Financial Risk
  2. +
  3. You will see the new Sale Payment Sheet field that accumulates in negative sign the +unreconciled payments so that this amount can be deducted from the risk.
  4. +
+
+
+

Bug Tracker

+

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

+

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

+
+
+

Credits

+
+

Authors

+
    +
  • Tecnativa
  • +
+
+
+

Contributors

+ +
+
+

Maintainers

+

This module is maintained by the OCA.

+Odoo Community Association +

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

+

This module is part of the OCA/credit-control project on GitHub.

+

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

+
+
+
+ + diff --git a/sale_payment_sheet_financial_risk/tests/__init__.py b/sale_payment_sheet_financial_risk/tests/__init__.py new file mode 100644 index 000000000..d2696d922 --- /dev/null +++ b/sale_payment_sheet_financial_risk/tests/__init__.py @@ -0,0 +1,3 @@ +# License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl). + +from . import test_sale_payment_sheet_financial_risk diff --git a/sale_payment_sheet_financial_risk/tests/test_sale_payment_sheet_financial_risk.py b/sale_payment_sheet_financial_risk/tests/test_sale_payment_sheet_financial_risk.py new file mode 100644 index 000000000..18772ba42 --- /dev/null +++ b/sale_payment_sheet_financial_risk/tests/test_sale_payment_sheet_financial_risk.py @@ -0,0 +1,12 @@ +# Copyright 2022 Tecnativa - Carlos Dauden +# License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl). + +from odoo.addons.sale_payment_sheet.tests.test_sale_payment_sheet import ( + TestSaleInvoicePayment, +) + + +class TestSalePaymentSheetFinancialRisk(TestSaleInvoicePayment): + def test_payment_wizard_risk(self): + self.test_payment_wizard() + self.assertEqual(self.partner.risk_sale_payment_sheet, -150.00) diff --git a/sale_payment_sheet_financial_risk/views/res_partner_view.xml b/sale_payment_sheet_financial_risk/views/res_partner_view.xml new file mode 100644 index 000000000..a11ca8676 --- /dev/null +++ b/sale_payment_sheet_financial_risk/views/res_partner_view.xml @@ -0,0 +1,29 @@ + + + + res.partner.view.risk + res.partner + + + + + + + + + diff --git a/sale_payment_sheet_financial_risk/views/sale_payment_sheet_financial_risk_view.xml b/sale_payment_sheet_financial_risk/views/sale_payment_sheet_financial_risk_view.xml new file mode 100644 index 000000000..dc9e9a717 --- /dev/null +++ b/sale_payment_sheet_financial_risk/views/sale_payment_sheet_financial_risk_view.xml @@ -0,0 +1,15 @@ + + + + Account financial risk sale payment sheet pivot view + sale.payment.sheet.line + + + + + + + + + + From 465b720a5569b564a033534fccabea8d110d193e Mon Sep 17 00:00:00 2001 From: Carlos Dauden Date: Thu, 28 Jul 2022 10:49:43 +0200 Subject: [PATCH 02/11] [IMP] sale_payment_sheet_financial_risk: Reduce each risk field depending of payment sheet invoice status (type of debt) TT37610 --- sale_payment_sheet_financial_risk/README.rst | 13 ++++ .../__manifest__.py | 2 +- sale_payment_sheet_financial_risk/i18n/es.po | 31 +++++++-- .../sale_payment_sheet_financial_risk.pot | 22 +++++- .../models/res_partner.py | 65 ++++++++++++++++-- .../readme/DESCRIPTION.rst | 11 +++ .../readme/USAGE.rst | 2 + .../deduct_sale_payment_sheet_set.png | Bin 0 -> 48697 bytes .../deduct_sale_payment_sheet_unset.png | Bin 0 -> 43495 bytes .../static/description/index.html | 6 ++ .../test_sale_payment_sheet_financial_risk.py | 3 + .../views/res_partner_view.xml | 6 ++ 12 files changed, 150 insertions(+), 11 deletions(-) create mode 100644 sale_payment_sheet_financial_risk/static/description/deduct_sale_payment_sheet_set.png create mode 100644 sale_payment_sheet_financial_risk/static/description/deduct_sale_payment_sheet_unset.png diff --git a/sale_payment_sheet_financial_risk/README.rst b/sale_payment_sheet_financial_risk/README.rst index 01151a7ee..e3bcaaf33 100644 --- a/sale_payment_sheet_financial_risk/README.rst +++ b/sale_payment_sheet_financial_risk/README.rst @@ -28,6 +28,17 @@ Sale Payment Sheet Financial Risk Extends Partner Financial Risk to allows you to deduct from the risk the amounts collected on sale payment sheets pending reconciliation. +When *Deduct Sale Payment Sheet* is set each risk field is reduced depending of payment +sheet invoice status (type of debt) and shows amounts grouped by field risk. + +.. image:: https://raw.githubusercontent.com/OCA/credit-control/13.0/sale_payment_sheet_financial_risk/static/description/deduct_sale_payment_sheet_unset.png + :alt: When deduction not is set + :width: 400 px + +.. image:: https://raw.githubusercontent.com/OCA/credit-control/13.0/sale_payment_sheet_financial_risk/static/description/deduct_sale_payment_sheet_set.png + :alt: When deduction is set + :width: 400 px + **Table of contents** .. contents:: @@ -41,6 +52,8 @@ To use this module, you need to: #. Go to *Customers > Financial Risk* #. You will see the new Sale Payment Sheet field that accumulates in negative sign the unreconciled payments so that this amount can be deducted from the risk. +#. Set *Deduct Sale Payment Sheet* to reduce each risk field depending of payment sheet + invoice status (type of debt). Bug Tracker =========== diff --git a/sale_payment_sheet_financial_risk/__manifest__.py b/sale_payment_sheet_financial_risk/__manifest__.py index e2ec35897..08677ad37 100644 --- a/sale_payment_sheet_financial_risk/__manifest__.py +++ b/sale_payment_sheet_financial_risk/__manifest__.py @@ -4,7 +4,7 @@ { "name": "Sale Payment Sheet Financial Risk", "summary": "Manage partner risk in sale payment sheet", - "version": "13.0.1.0.0", + "version": "13.0.1.1.0", "category": "Account", "license": "AGPL-3", "author": "Tecnativa, Odoo Community Association (OCA)", diff --git a/sale_payment_sheet_financial_risk/i18n/es.po b/sale_payment_sheet_financial_risk/i18n/es.po index 45569de08..0faf1743e 100644 --- a/sale_payment_sheet_financial_risk/i18n/es.po +++ b/sale_payment_sheet_financial_risk/i18n/es.po @@ -6,8 +6,8 @@ msgid "" msgstr "" "Project-Id-Version: Odoo Server 13.0\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2022-06-20 16:01+0000\n" -"PO-Revision-Date: 2022-06-20 18:03+0200\n" +"POT-Creation-Date: 2022-07-28 08:34+0000\n" +"PO-Revision-Date: 2022-07-28 10:39+0200\n" "Last-Translator: Carlos Dauden \n" "Language-Team: \n" "Language: es\n" @@ -31,8 +31,10 @@ msgstr "Deducir hoja de pago de ventas" #. module: sale_payment_sheet_financial_risk #: model:ir.model.fields,help:sale_payment_sheet_financial_risk.field_res_partner__risk_sale_payment_sheet_include #: model:ir.model.fields,help:sale_payment_sheet_financial_risk.field_res_users__risk_sale_payment_sheet_include -msgid "Deduct pending payments in sales payment sheet" -msgstr "Deducir pagos pendientes en hoja de pago de ventas" +msgid "Deduct pending payments in each field depending of sheet invoice status" +msgstr "" +"Deducir pagos pendientes en cada campo dependiendo del tipo de deuda de la " +"factura informada en la hoja de pagos" #. module: sale_payment_sheet_financial_risk #: model:ir.model.fields,field_description:sale_payment_sheet_financial_risk.field_res_partner__risk_sale_payment_sheet_limit @@ -40,6 +42,12 @@ msgstr "Deducir pagos pendientes en hoja de pago de ventas" msgid "Limit Sale Payment Sheet" msgstr "Limite en hojas de pagos de ventas" +#. module: sale_payment_sheet_financial_risk +#: model:ir.model.fields,field_description:sale_payment_sheet_financial_risk.field_res_partner__risk_sale_payment_sheet_info +#: model:ir.model.fields,field_description:sale_payment_sheet_financial_risk.field_res_users__risk_sale_payment_sheet_info +msgid "Risk Sale Payment Sheet Info" +msgstr "Info riesgo hoja de pagos" + #. module: sale_payment_sheet_financial_risk #: model:ir.model.fields,field_description:sale_payment_sheet_financial_risk.field_res_partner__sale_payment_sheet_ids #: model:ir.model.fields,field_description:sale_payment_sheet_financial_risk.field_res_users__sale_payment_sheet_ids @@ -57,6 +65,21 @@ msgstr "Lineas de hoja de pagos de ventas" msgid "Set 0 if it is not locked" msgstr "Establece 0 si no está bloqueado" +#. module: sale_payment_sheet_financial_risk +#: model:ir.model.fields,help:sale_payment_sheet_financial_risk.field_res_partner__risk_sale_payment_sheet_info +#: model:ir.model.fields,help:sale_payment_sheet_financial_risk.field_res_users__risk_sale_payment_sheet_info +msgid "" +"Sheet payment amounts grouped by reduce field (amount field in brackets)" +msgstr "" +"Importes de la hoja de pagos agrupados por campo reducido (importe del campo " +"entre paréntesis)" + +#. module: sale_payment_sheet_financial_risk +#: model:ir.model.fields,help:sale_payment_sheet_financial_risk.field_res_partner__risk_sale_payment_sheet +#: model:ir.model.fields,help:sale_payment_sheet_financial_risk.field_res_users__risk_sale_payment_sheet +msgid "Sum of payment sheet amount pending to validate" +msgstr "Suma importes de la hoja de pagos pendientes de validar" + #. module: sale_payment_sheet_financial_risk #: model:ir.model.fields,field_description:sale_payment_sheet_financial_risk.field_res_partner__risk_sale_payment_sheet #: model:ir.model.fields,field_description:sale_payment_sheet_financial_risk.field_res_users__risk_sale_payment_sheet diff --git a/sale_payment_sheet_financial_risk/i18n/sale_payment_sheet_financial_risk.pot b/sale_payment_sheet_financial_risk/i18n/sale_payment_sheet_financial_risk.pot index 712d3444d..26ae96397 100644 --- a/sale_payment_sheet_financial_risk/i18n/sale_payment_sheet_financial_risk.pot +++ b/sale_payment_sheet_financial_risk/i18n/sale_payment_sheet_financial_risk.pot @@ -27,7 +27,8 @@ msgstr "" #. module: sale_payment_sheet_financial_risk #: model:ir.model.fields,help:sale_payment_sheet_financial_risk.field_res_partner__risk_sale_payment_sheet_include #: model:ir.model.fields,help:sale_payment_sheet_financial_risk.field_res_users__risk_sale_payment_sheet_include -msgid "Deduct pending payments in sales payment sheet" +msgid "" +"Deduct pending payments in each field depending of sheet invoice status" msgstr "" #. module: sale_payment_sheet_financial_risk @@ -36,6 +37,12 @@ msgstr "" msgid "Limit Sale Payment Sheet" msgstr "" +#. module: sale_payment_sheet_financial_risk +#: model:ir.model.fields,field_description:sale_payment_sheet_financial_risk.field_res_partner__risk_sale_payment_sheet_info +#: model:ir.model.fields,field_description:sale_payment_sheet_financial_risk.field_res_users__risk_sale_payment_sheet_info +msgid "Risk Sale Payment Sheet Info" +msgstr "" + #. module: sale_payment_sheet_financial_risk #: model:ir.model.fields,field_description:sale_payment_sheet_financial_risk.field_res_partner__sale_payment_sheet_ids #: model:ir.model.fields,field_description:sale_payment_sheet_financial_risk.field_res_users__sale_payment_sheet_ids @@ -53,6 +60,19 @@ msgstr "" msgid "Set 0 if it is not locked" msgstr "" +#. module: sale_payment_sheet_financial_risk +#: model:ir.model.fields,help:sale_payment_sheet_financial_risk.field_res_partner__risk_sale_payment_sheet_info +#: model:ir.model.fields,help:sale_payment_sheet_financial_risk.field_res_users__risk_sale_payment_sheet_info +msgid "" +"Sheet payment amounts grouped by reduce field (amount field in brackets)" +msgstr "" + +#. module: sale_payment_sheet_financial_risk +#: model:ir.model.fields,help:sale_payment_sheet_financial_risk.field_res_partner__risk_sale_payment_sheet +#: model:ir.model.fields,help:sale_payment_sheet_financial_risk.field_res_users__risk_sale_payment_sheet +msgid "Sum of payment sheet amount pending to validate" +msgstr "" + #. module: sale_payment_sheet_financial_risk #: model:ir.model.fields,field_description:sale_payment_sheet_financial_risk.field_res_partner__risk_sale_payment_sheet #: model:ir.model.fields,field_description:sale_payment_sheet_financial_risk.field_res_users__risk_sale_payment_sheet diff --git a/sale_payment_sheet_financial_risk/models/res_partner.py b/sale_payment_sheet_financial_risk/models/res_partner.py index f867c6adc..16f838288 100644 --- a/sale_payment_sheet_financial_risk/models/res_partner.py +++ b/sale_payment_sheet_financial_risk/models/res_partner.py @@ -1,6 +1,8 @@ # Copyright 2022 Tecnativa - Carlos Dauden # License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl). +from collections import defaultdict + from odoo import api, fields, models @@ -9,7 +11,7 @@ class ResPartner(models.Model): risk_sale_payment_sheet_include = fields.Boolean( string="Deduct Sale Payment Sheet", - help="Deduct pending payments in sales payment sheet", + help="Deduct pending payments in each field depending of sheet invoice status", ) risk_sale_payment_sheet_limit = fields.Monetary( string="Limit Sale Payment Sheet", @@ -21,15 +23,21 @@ class ResPartner(models.Model): currency_field="risk_currency_id", compute_sudo=True, string="Total Sale Payment Sheet", + help="Sum of payment sheet amount pending to validate", + ) + risk_sale_payment_sheet_info = fields.Text( + compute="_compute_risk_account_amount", + compute_sudo=True, + help="Sheet payment amounts grouped by reduce field (amount field in brackets)", ) sale_payment_sheet_ids = fields.One2many( comodel_name="sale.payment.sheet.line", inverse_name="partner_id" ) def _get_risk_sale_payment_sheet_domain(self): - # When p is NewId object instance bool(p.id) is False + # When p is NewId object instance is not equal to "Normal" registry commercial_partners = self.filtered( - lambda p: (p.id and p == p.commercial_partner_id) + lambda p: (p.ids == p.commercial_partner_id.ids) ) return [ ("partner_id", "in", commercial_partners.ids), @@ -39,7 +47,9 @@ def _get_risk_sale_payment_sheet_domain(self): ] @api.depends( - "sale_payment_sheet_ids.amount", "child_ids.sale_payment_sheet_ids.amount", + "sale_payment_sheet_ids.amount", + "child_ids.sale_payment_sheet_ids.amount", + "risk_sale_payment_sheet_include", ) def _compute_risk_sale_payment_sheet(self): self.update({"risk_sale_payment_sheet": 0.0}) @@ -51,7 +61,9 @@ def _compute_risk_sale_payment_sheet(self): lazy=False, ) for group in payments_group: - partner = self.browse(group["partner_id"][0]) + partner = self.filtered(lambda p: p.ids[0] == group["partner_id"][0]) + if partner.risk_sale_payment_sheet_include: + continue company = self.env.user.company_id company_currency = company.currency_id partner.risk_sale_payment_sheet = company_currency._convert( @@ -79,3 +91,46 @@ def _get_field_risk_model_domain(self, field_name): return "sale.payment.sheet.line", self._get_risk_sale_payment_sheet_domain() else: return super()._get_field_risk_model_domain(field_name) + + def get_risk_sale_payment_sheet_info(self, info_values): + # Not put space between values to avoid line break + return "\n".join( + "{:.2f}({:.2f})".format(-v, self[k]) for k, v in info_values.items() if v + ) + + @api.depends("risk_sale_payment_sheet_include") + def _compute_risk_account_amount(self): + res = super()._compute_risk_account_amount() + self.update({"risk_sale_payment_sheet_info": ""}) + sheet_lines = ( + self.env["sale.payment.sheet.line"] + .sudo() + .search(self._get_risk_sale_payment_sheet_domain()) + ) + # Get all account risk fields with empty dummy group + dummy_groups = defaultdict(lambda: {"read_group": []}) + account_vals_zero = self._prepare_risk_account_vals(dummy_groups) + risk_fields = account_vals_zero.keys() + info_dic = {} + for sheet_line in sheet_lines: + partner_id = sheet_line.partner_id.id + partner = self.filtered(lambda p: p.ids == [partner_id]) + if not partner.risk_sale_payment_sheet_include: + continue + if partner_id not in info_dic: + info_dic[partner_id] = account_vals_zero.copy() + move_lines = sheet_line.invoice_id.line_ids + for risk_field in risk_fields: + # Get field domain and evaluate to reduce value in match field + domain = self._get_field_risk_model_domain(risk_field)[1] + if move_lines.filtered_domain(domain): + partner[risk_field] -= sheet_line.amount + info_dic[partner_id][risk_field] += sheet_line.amount + break + else: + partner["risk_account_amount"] -= sheet_line.amount + # Set for each sheet line to avoid NewId iterable issue if fill dict + self.risk_sale_payment_sheet_info = partner.get_risk_sale_payment_sheet_info( + info_dic[partner_id] + ) + return res diff --git a/sale_payment_sheet_financial_risk/readme/DESCRIPTION.rst b/sale_payment_sheet_financial_risk/readme/DESCRIPTION.rst index a5d71b9c9..57f4fcfb9 100644 --- a/sale_payment_sheet_financial_risk/readme/DESCRIPTION.rst +++ b/sale_payment_sheet_financial_risk/readme/DESCRIPTION.rst @@ -1,2 +1,13 @@ Extends Partner Financial Risk to allows you to deduct from the risk the amounts collected on sale payment sheets pending reconciliation. + +When *Deduct Sale Payment Sheet* is set each risk field is reduced depending of payment +sheet invoice status (type of debt) and shows amounts grouped by field risk. + +.. image:: ../static/description/deduct_sale_payment_sheet_unset.png + :alt: When deduction not is set + :width: 400 px + +.. image:: ../static/description/deduct_sale_payment_sheet_set.png + :alt: When deduction is set + :width: 400 px diff --git a/sale_payment_sheet_financial_risk/readme/USAGE.rst b/sale_payment_sheet_financial_risk/readme/USAGE.rst index 0b5d3e8a4..a286db2b1 100644 --- a/sale_payment_sheet_financial_risk/readme/USAGE.rst +++ b/sale_payment_sheet_financial_risk/readme/USAGE.rst @@ -3,3 +3,5 @@ To use this module, you need to: #. Go to *Customers > Financial Risk* #. You will see the new Sale Payment Sheet field that accumulates in negative sign the unreconciled payments so that this amount can be deducted from the risk. +#. Set *Deduct Sale Payment Sheet* to reduce each risk field depending of payment sheet + invoice status (type of debt). diff --git a/sale_payment_sheet_financial_risk/static/description/deduct_sale_payment_sheet_set.png b/sale_payment_sheet_financial_risk/static/description/deduct_sale_payment_sheet_set.png new file mode 100644 index 0000000000000000000000000000000000000000..47b5e67d591d4a4a38412e695392e25340b0e8a4 GIT binary patch literal 48697 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 +p79E^_&dYTZ(-X6|036pmJ^eD$`rT7sYnG_WC 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 CsHX1# literal 0 HcmV?d00001 diff --git a/sale_payment_sheet_financial_risk/static/description/index.html b/sale_payment_sheet_financial_risk/static/description/index.html index 8fbfa4862..ab3fd0b2f 100644 --- a/sale_payment_sheet_financial_risk/static/description/index.html +++ b/sale_payment_sheet_financial_risk/static/description/index.html @@ -370,6 +370,10 @@

Sale Payment Sheet Financial Risk

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

Extends Partner Financial Risk to allows you to deduct from the risk the amounts collected on sale payment sheets pending reconciliation.

+

When Deduct Sale Payment Sheet is set each risk field is reduced depending of payment +sheet invoice status (type of debt) and shows amounts grouped by field risk.

+When deduction not is set +When deduction is set

Table of contents

    @@ -390,6 +394,8 @@

    Usage

  • Go to Customers > Financial Risk
  • You will see the new Sale Payment Sheet field that accumulates in negative sign the unreconciled payments so that this amount can be deducted from the risk.
  • +
  • Set Deduct Sale Payment Sheet to reduce each risk field depending of payment sheet +invoice status (type of debt).
diff --git a/sale_payment_sheet_financial_risk/tests/test_sale_payment_sheet_financial_risk.py b/sale_payment_sheet_financial_risk/tests/test_sale_payment_sheet_financial_risk.py index 18772ba42..385ae627d 100644 --- a/sale_payment_sheet_financial_risk/tests/test_sale_payment_sheet_financial_risk.py +++ b/sale_payment_sheet_financial_risk/tests/test_sale_payment_sheet_financial_risk.py @@ -10,3 +10,6 @@ class TestSalePaymentSheetFinancialRisk(TestSaleInvoicePayment): def test_payment_wizard_risk(self): self.test_payment_wizard() self.assertEqual(self.partner.risk_sale_payment_sheet, -150.00) + self.assertFalse(self.partner.risk_sale_payment_sheet_info) + self.partner.risk_sale_payment_sheet_include = True + self.assertIn("150", self.partner.risk_sale_payment_sheet_info) diff --git a/sale_payment_sheet_financial_risk/views/res_partner_view.xml b/sale_payment_sheet_financial_risk/views/res_partner_view.xml index a11ca8676..4f1925d17 100644 --- a/sale_payment_sheet_financial_risk/views/res_partner_view.xml +++ b/sale_payment_sheet_financial_risk/views/res_partner_view.xml @@ -21,6 +21,12 @@ nolabel="1" widget='monetary' options="{'currency_field': 'risk_currency_id'}" + attrs="{'invisible': [('risk_sale_payment_sheet_info', '!=', '')]}" + /> + From 927dec0af017112adfd45b64771bc40fc7ffeb42 Mon Sep 17 00:00:00 2001 From: Ernesto Tejeda Date: Thu, 16 Feb 2023 15:18:26 +0100 Subject: [PATCH 03/11] [IMP] sale_payment_sheet_financial_risk: black, isort, prettier --- sale_payment_sheet_financial_risk/models/res_partner.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/sale_payment_sheet_financial_risk/models/res_partner.py b/sale_payment_sheet_financial_risk/models/res_partner.py index 16f838288..2a9bb81b3 100644 --- a/sale_payment_sheet_financial_risk/models/res_partner.py +++ b/sale_payment_sheet_financial_risk/models/res_partner.py @@ -130,7 +130,7 @@ def _compute_risk_account_amount(self): else: partner["risk_account_amount"] -= sheet_line.amount # Set for each sheet line to avoid NewId iterable issue if fill dict - self.risk_sale_payment_sheet_info = partner.get_risk_sale_payment_sheet_info( - info_dic[partner_id] + self.risk_sale_payment_sheet_info = ( + partner.get_risk_sale_payment_sheet_info(info_dic[partner_id]) ) return res From 54da722fe9b3de1520294af05d6d4e7169a6719c Mon Sep 17 00:00:00 2001 From: Ernesto Tejeda Date: Sun, 19 Feb 2023 19:55:21 +0100 Subject: [PATCH 04/11] [MIG] sale_payment_sheet_financial_risk: Migration to 15.0 --- sale_payment_sheet_financial_risk/README.rst | 15 ++++++++------- sale_payment_sheet_financial_risk/__manifest__.py | 2 +- .../i18n/sale_payment_sheet_financial_risk.pot | 2 +- .../readme/CONTRIBUTORS.rst | 1 + .../static/description/index.html | 11 ++++++----- 5 files changed, 17 insertions(+), 14 deletions(-) diff --git a/sale_payment_sheet_financial_risk/README.rst b/sale_payment_sheet_financial_risk/README.rst index e3bcaaf33..01ca08846 100644 --- a/sale_payment_sheet_financial_risk/README.rst +++ b/sale_payment_sheet_financial_risk/README.rst @@ -14,13 +14,13 @@ Sale Payment Sheet Financial Risk :target: http://www.gnu.org/licenses/agpl-3.0-standalone.html :alt: License: AGPL-3 .. |badge3| image:: https://img.shields.io/badge/github-OCA%2Fcredit--control-lightgray.png?logo=github - :target: https://github.com/OCA/credit-control/tree/13.0/sale_payment_sheet_financial_risk + :target: https://github.com/OCA/credit-control/tree/15.0/sale_payment_sheet_financial_risk :alt: OCA/credit-control .. |badge4| image:: https://img.shields.io/badge/weblate-Translate%20me-F47D42.png - :target: https://translation.odoo-community.org/projects/credit-control-13-0/credit-control-13-0-sale_payment_sheet_financial_risk + :target: https://translation.odoo-community.org/projects/credit-control-15-0/credit-control-15-0-sale_payment_sheet_financial_risk :alt: Translate me on Weblate .. |badge5| image:: https://img.shields.io/badge/runbot-Try%20me-875A7B.png - :target: https://runbot.odoo-community.org/runbot/262/13.0 + :target: https://runbot.odoo-community.org/runbot/262/15.0 :alt: Try me on Runbot |badge1| |badge2| |badge3| |badge4| |badge5| @@ -31,11 +31,11 @@ collected on sale payment sheets pending reconciliation. When *Deduct Sale Payment Sheet* is set each risk field is reduced depending of payment sheet invoice status (type of debt) and shows amounts grouped by field risk. -.. image:: https://raw.githubusercontent.com/OCA/credit-control/13.0/sale_payment_sheet_financial_risk/static/description/deduct_sale_payment_sheet_unset.png +.. image:: https://raw.githubusercontent.com/OCA/credit-control/15.0/sale_payment_sheet_financial_risk/static/description/deduct_sale_payment_sheet_unset.png :alt: When deduction not is set :width: 400 px -.. image:: https://raw.githubusercontent.com/OCA/credit-control/13.0/sale_payment_sheet_financial_risk/static/description/deduct_sale_payment_sheet_set.png +.. image:: https://raw.githubusercontent.com/OCA/credit-control/15.0/sale_payment_sheet_financial_risk/static/description/deduct_sale_payment_sheet_set.png :alt: When deduction is set :width: 400 px @@ -61,7 +61,7 @@ Bug Tracker Bugs are tracked on `GitHub Issues `_. In case of trouble, please check there if your issue has already been reported. If you spotted it first, help us smashing it by providing a detailed and welcomed -`feedback `_. +`feedback `_. Do not contact contributors directly about support or help with technical issues. @@ -79,6 +79,7 @@ Contributors * `Tecnativa `_: * Carlos Dauden + * Ernesto Tejeda Maintainers ~~~~~~~~~~~ @@ -93,6 +94,6 @@ OCA, or the Odoo Community Association, is a nonprofit organization whose mission is to support the collaborative development of Odoo features and promote its widespread use. -This module is part of the `OCA/credit-control `_ project on GitHub. +This module is part of the `OCA/credit-control `_ project on GitHub. You are welcome to contribute. To learn how please visit https://odoo-community.org/page/Contribute. diff --git a/sale_payment_sheet_financial_risk/__manifest__.py b/sale_payment_sheet_financial_risk/__manifest__.py index 08677ad37..246f7dcc4 100644 --- a/sale_payment_sheet_financial_risk/__manifest__.py +++ b/sale_payment_sheet_financial_risk/__manifest__.py @@ -4,7 +4,7 @@ { "name": "Sale Payment Sheet Financial Risk", "summary": "Manage partner risk in sale payment sheet", - "version": "13.0.1.1.0", + "version": "15.0.1.0.0", "category": "Account", "license": "AGPL-3", "author": "Tecnativa, Odoo Community Association (OCA)", diff --git a/sale_payment_sheet_financial_risk/i18n/sale_payment_sheet_financial_risk.pot b/sale_payment_sheet_financial_risk/i18n/sale_payment_sheet_financial_risk.pot index 26ae96397..531f70c42 100644 --- a/sale_payment_sheet_financial_risk/i18n/sale_payment_sheet_financial_risk.pot +++ b/sale_payment_sheet_financial_risk/i18n/sale_payment_sheet_financial_risk.pot @@ -4,7 +4,7 @@ # msgid "" msgstr "" -"Project-Id-Version: Odoo Server 13.0\n" +"Project-Id-Version: Odoo Server 15.0\n" "Report-Msgid-Bugs-To: \n" "Last-Translator: \n" "Language-Team: \n" diff --git a/sale_payment_sheet_financial_risk/readme/CONTRIBUTORS.rst b/sale_payment_sheet_financial_risk/readme/CONTRIBUTORS.rst index af740da8f..0b072f0d5 100644 --- a/sale_payment_sheet_financial_risk/readme/CONTRIBUTORS.rst +++ b/sale_payment_sheet_financial_risk/readme/CONTRIBUTORS.rst @@ -1,3 +1,4 @@ * `Tecnativa `_: * Carlos Dauden + * Ernesto Tejeda diff --git a/sale_payment_sheet_financial_risk/static/description/index.html b/sale_payment_sheet_financial_risk/static/description/index.html index ab3fd0b2f..2132b44aa 100644 --- a/sale_payment_sheet_financial_risk/static/description/index.html +++ b/sale_payment_sheet_financial_risk/static/description/index.html @@ -367,13 +367,13 @@

Sale Payment Sheet Financial Risk

!! This file is generated by oca-gen-addon-readme !! !! changes will be overwritten. !! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! --> -

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

+

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

Extends Partner Financial Risk to allows you to deduct from the risk the amounts collected on sale payment sheets pending reconciliation.

When Deduct Sale Payment Sheet is set each risk field is reduced depending of payment sheet invoice status (type of debt) and shows amounts grouped by field risk.

-When deduction not is set -When deduction is set +When deduction not is set +When deduction is set

Table of contents

    @@ -403,7 +403,7 @@

    Bug Tracker

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

    +feedback.

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

@@ -419,6 +419,7 @@

Contributors

@@ -430,7 +431,7 @@

Maintainers

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

-

This module is part of the OCA/credit-control project on GitHub.

+

This module is part of the OCA/credit-control project on GitHub.

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

From 5b92ad0e5e9b0f5f6bc9db6d44a6d284c5f5cb12 Mon Sep 17 00:00:00 2001 From: Carlos Dauden Date: Mon, 29 May 2023 20:11:29 +0200 Subject: [PATCH 05/11] [FIX] xxx_financial_risk: Inconsistent 'compute_sudo' for several computed fields --- sale_payment_sheet_financial_risk/README.rst | 15 +++++--- .../__manifest__.py | 2 +- .../models/res_partner.py | 6 +-- .../static/description/index.html | 38 ++++++++++--------- 4 files changed, 32 insertions(+), 29 deletions(-) diff --git a/sale_payment_sheet_financial_risk/README.rst b/sale_payment_sheet_financial_risk/README.rst index 01ca08846..61416e962 100644 --- a/sale_payment_sheet_financial_risk/README.rst +++ b/sale_payment_sheet_financial_risk/README.rst @@ -2,10 +2,13 @@ Sale Payment Sheet Financial Risk ================================= -.. !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! +.. + !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! !! This file is generated by oca-gen-addon-readme !! !! changes will be overwritten. !! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! + !! source digest: sha256:0172454156b0f73b799bb47bd931b80e7eff57d69050321a3d9bda63ff3953b5 + !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! .. |badge1| image:: https://img.shields.io/badge/maturity-Beta-yellow.png :target: https://odoo-community.org/page/development-status @@ -19,11 +22,11 @@ Sale Payment Sheet Financial Risk .. |badge4| image:: https://img.shields.io/badge/weblate-Translate%20me-F47D42.png :target: https://translation.odoo-community.org/projects/credit-control-15-0/credit-control-15-0-sale_payment_sheet_financial_risk :alt: Translate me on Weblate -.. |badge5| image:: https://img.shields.io/badge/runbot-Try%20me-875A7B.png - :target: https://runbot.odoo-community.org/runbot/262/15.0 - :alt: Try me on Runbot +.. |badge5| image:: https://img.shields.io/badge/runboat-Try%20me-875A7B.png + :target: https://runboat.odoo-community.org/builds?repo=OCA/credit-control&target_branch=15.0 + :alt: Try me on Runboat -|badge1| |badge2| |badge3| |badge4| |badge5| +|badge1| |badge2| |badge3| |badge4| |badge5| Extends Partner Financial Risk to allows you to deduct from the risk the amounts collected on sale payment sheets pending reconciliation. @@ -60,7 +63,7 @@ Bug Tracker Bugs are tracked on `GitHub Issues `_. In case of trouble, please check there if your issue has already been reported. -If you spotted it first, help us smashing it by providing a detailed and welcomed +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. diff --git a/sale_payment_sheet_financial_risk/__manifest__.py b/sale_payment_sheet_financial_risk/__manifest__.py index 246f7dcc4..4f86f675e 100644 --- a/sale_payment_sheet_financial_risk/__manifest__.py +++ b/sale_payment_sheet_financial_risk/__manifest__.py @@ -4,7 +4,7 @@ { "name": "Sale Payment Sheet Financial Risk", "summary": "Manage partner risk in sale payment sheet", - "version": "15.0.1.0.0", + "version": "15.0.1.0.1", "category": "Account", "license": "AGPL-3", "author": "Tecnativa, Odoo Community Association (OCA)", diff --git a/sale_payment_sheet_financial_risk/models/res_partner.py b/sale_payment_sheet_financial_risk/models/res_partner.py index 2a9bb81b3..f4b756e74 100644 --- a/sale_payment_sheet_financial_risk/models/res_partner.py +++ b/sale_payment_sheet_financial_risk/models/res_partner.py @@ -102,10 +102,8 @@ def get_risk_sale_payment_sheet_info(self, info_values): def _compute_risk_account_amount(self): res = super()._compute_risk_account_amount() self.update({"risk_sale_payment_sheet_info": ""}) - sheet_lines = ( - self.env["sale.payment.sheet.line"] - .sudo() - .search(self._get_risk_sale_payment_sheet_domain()) + sheet_lines = self.env["sale.payment.sheet.line"].search( + self._get_risk_sale_payment_sheet_domain() ) # Get all account risk fields with empty dummy group dummy_groups = defaultdict(lambda: {"read_group": []}) diff --git a/sale_payment_sheet_financial_risk/static/description/index.html b/sale_payment_sheet_financial_risk/static/description/index.html index 2132b44aa..f7b32ec71 100644 --- a/sale_payment_sheet_financial_risk/static/description/index.html +++ b/sale_payment_sheet_financial_risk/static/description/index.html @@ -1,20 +1,20 @@ - + - + Sale Payment Sheet Financial Risk