diff --git a/sale_payment_sheet_financial_risk/README.rst b/sale_payment_sheet_financial_risk/README.rst new file mode 100644 index 000000000..755b21f59 --- /dev/null +++ b/sale_payment_sheet_financial_risk/README.rst @@ -0,0 +1,104 @@ +================================= +Sale Payment Sheet Financial Risk +================================= + +.. + !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! + !! This file is generated by oca-gen-addon-readme !! + !! changes will be overwritten. !! + !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! + !! source digest: sha256:b0d067aeec5d180561b3303445fcce99de32785455e3e31c7ee153c35e9b7a00 + !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! + +.. |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/18.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-18-0/credit-control-18-0-sale_payment_sheet_financial_risk + :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/credit-control&target_branch=18.0 + :alt: Try me on Runboat + +|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. + +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| image:: https://raw.githubusercontent.com/OCA/credit-control/18.0/sale_payment_sheet_financial_risk/static/description/deduct_sale_payment_sheet_unset.png +.. |When deduction is set| image:: https://raw.githubusercontent.com/OCA/credit-control/18.0/sale_payment_sheet_financial_risk/static/description/deduct_sale_payment_sheet_set.png + +**Table of contents** + +.. contents:: + :local: + +Usage +===== + +To use this module, you need to: + +1. Go to *Customers > Financial Risk* +2. 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. +3. Set *Deduct Sale Payment Sheet* to reduce each risk field depending + of payment sheet invoice status (type of debt). + +Bug Tracker +=========== + +Bugs are tracked on `GitHub Issues `_. +In case of trouble, please check there if your issue has already been reported. +If you spotted it first, help us to smash it by providing a detailed and welcomed +`feedback `_. + +Do not contact contributors directly about support or help with technical issues. + +Credits +======= + +Authors +------- + +* Tecnativa + +Contributors +------------ + +- `Tecnativa `__: + + - Carlos Dauden + - Ernesto Tejeda + - Carolina Fernandez + +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..cdfd170df --- /dev/null +++ b/sale_payment_sheet_financial_risk/__manifest__.py @@ -0,0 +1,19 @@ +# Copyright 2021 Tecnativa - Carlos Dauden +# Copyright 2023 Tecnativa - Carolina Fernandez +# 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": "18.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..0faf1743e --- /dev/null +++ b/sale_payment_sheet_financial_risk/i18n/es.po @@ -0,0 +1,87 @@ +# 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-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" +"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 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 +#: 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__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 +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,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 +msgid "Total Sale Payment Sheet" +msgstr "Total hoja de pagos de ventas" diff --git a/sale_payment_sheet_financial_risk/i18n/it.po b/sale_payment_sheet_financial_risk/i18n/it.po new file mode 100644 index 000000000..509975e23 --- /dev/null +++ b/sale_payment_sheet_financial_risk/i18n/it.po @@ -0,0 +1,87 @@ +# 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 16.0\n" +"Report-Msgid-Bugs-To: \n" +"PO-Revision-Date: 2024-05-02 13:37+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 4.17\n" + +#. module: sale_payment_sheet_financial_risk +#: model:ir.model,name:sale_payment_sheet_financial_risk.model_res_partner +msgid "Contact" +msgstr "Contatto" + +#. 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 "Ricevuta deduzione pagamento vendita" + +#. 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 each field depending of sheet invoice status" +msgstr "" +"Dedurre i pagamenti in sospeso in ogni campo che dipende dagli stati " +"ricevute fatture" + +#. 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 "Limitare ricevuta pagamento vendita" + +#. 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 "Informazioni rischio ricevuta pagamento vendita" + +#. 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 "Ricevuta pagamento vendita" + +#. 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 "Riga ricevuta pagamento vendita" + +#. 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 "Imposta a 0 se non bloccato" + +#. 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 "" +"Valori ricevuta pagamento raggurppati per campo ridotto (campo valore tra " +"parentesi)" + +#. 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 "Somma valore ricevuta pagamento in sospeso da validare" + +#. 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 "Totale ricevuta pagamento vendita" 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..f418754e3 --- /dev/null +++ b/sale_payment_sheet_financial_risk/i18n/sale_payment_sheet_financial_risk.pot @@ -0,0 +1,80 @@ +# 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 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: 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 each field depending of sheet invoice status" +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__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 +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,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 +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..26f192d7c --- /dev/null +++ b/sale_payment_sheet_financial_risk/models/res_partner.py @@ -0,0 +1,139 @@ +# 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 + + +class ResPartner(models.Model): + _inherit = "res.partner" + + risk_sale_payment_sheet_include = fields.Boolean( + string="Deduct Sale 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", + 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", + 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 is not equal to "Normal" registry + commercial_partners = self.filtered( + lambda p: (p.ids == p.commercial_partner_id.ids) + ) + return [ + ("partner_id", "in", commercial_partners.ids), + ("invoice_id.payment_state", "!=", "paid"), + "|", + ("state", "=", "open"), + ("statement_line_id.state", "=", "open"), + ] + + @api.depends( + "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}) + 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"], + lazy=False, + ) + for group in payments_group: + g_partner_id = group["partner_id"][0] + partner = self.filtered( + lambda p, partner_id=g_partner_id: p.ids[0] == partner_id + ) + 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( + -group["amount"], + partner.risk_currency_id, + company, + fields.Date.context_today(self), + round=False, + ) + + @api.model + def _risk_field_list(self): + res = super()._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) + + def get_risk_sale_payment_sheet_info(self, info_values): + # Not put space between values to avoid line break + return "\n".join( + f"{-v:.2f}({self[k]:.2f})" 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"].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, partner_id=partner_id: p.ids[0] == 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 + partner.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/pyproject.toml b/sale_payment_sheet_financial_risk/pyproject.toml new file mode 100644 index 000000000..4231d0ccc --- /dev/null +++ b/sale_payment_sheet_financial_risk/pyproject.toml @@ -0,0 +1,3 @@ +[build-system] +requires = ["whool"] +build-backend = "whool.buildapi" diff --git a/sale_payment_sheet_financial_risk/readme/CONTRIBUTORS.md b/sale_payment_sheet_financial_risk/readme/CONTRIBUTORS.md new file mode 100644 index 000000000..fec53cf71 --- /dev/null +++ b/sale_payment_sheet_financial_risk/readme/CONTRIBUTORS.md @@ -0,0 +1,4 @@ +- [Tecnativa](https://www.tecnativa.com): + - Carlos Dauden + - Ernesto Tejeda + - Carolina Fernandez diff --git a/sale_payment_sheet_financial_risk/readme/DESCRIPTION.md b/sale_payment_sheet_financial_risk/readme/DESCRIPTION.md new file mode 100644 index 000000000..5d662528f --- /dev/null +++ b/sale_payment_sheet_financial_risk/readme/DESCRIPTION.md @@ -0,0 +1,10 @@ +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](../static/description/deduct_sale_payment_sheet_unset.png) + +![When deduction is set](../static/description/deduct_sale_payment_sheet_set.png) diff --git a/sale_payment_sheet_financial_risk/readme/USAGE.md b/sale_payment_sheet_financial_risk/readme/USAGE.md new file mode 100644 index 000000000..d15b3e6d9 --- /dev/null +++ b/sale_payment_sheet_financial_risk/readme/USAGE.md @@ -0,0 +1,8 @@ +To use this module, you need to: + +1. Go to *Customers \> Financial Risk* +2. 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. +3. 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 000000000..47b5e67d5 Binary files /dev/null and b/sale_payment_sheet_financial_risk/static/description/deduct_sale_payment_sheet_set.png differ diff --git a/sale_payment_sheet_financial_risk/static/description/deduct_sale_payment_sheet_unset.png b/sale_payment_sheet_financial_risk/static/description/deduct_sale_payment_sheet_unset.png new file mode 100644 index 000000000..c872c42e6 Binary files /dev/null and b/sale_payment_sheet_financial_risk/static/description/deduct_sale_payment_sheet_unset.png differ 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 000000000..3a0328b51 Binary files /dev/null and b/sale_payment_sheet_financial_risk/static/description/icon.png differ 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..12e269eb1 --- /dev/null +++ b/sale_payment_sheet_financial_risk/static/description/index.html @@ -0,0 +1,447 @@ + + + + + +Sale Payment Sheet Financial Risk + + + +
+

Sale Payment Sheet Financial Risk

+ + +

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

+

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

+ +
+

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. +
  5. Set Deduct Sale Payment Sheet to reduce each risk field depending +of payment sheet invoice status (type of debt).
  6. +
+
+
+

Bug Tracker

+

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

+

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

+
+
+

Credits

+
+

Authors

+
    +
  • Tecnativa
  • +
+
+
+

Contributors

+
    +
  • Tecnativa:
      +
    • Carlos Dauden
    • +
    • Ernesto Tejeda
    • +
    • Carolina Fernandez
    • +
    +
  • +
+
+
+

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..8eab351e1 --- /dev/null +++ b/sale_payment_sheet_financial_risk/tests/test_sale_payment_sheet_financial_risk.py @@ -0,0 +1,18 @@ +# Copyright 2022 Tecnativa - Carlos Dauden +# License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl). + +from odoo.tests import tagged + +from odoo.addons.sale_payment_sheet.tests.test_sale_payment_sheet import ( + TestSaleInvoicePayment, +) + + +@tagged("post_install", "-at_install") +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 new file mode 100644 index 000000000..c81c77971 --- /dev/null +++ b/sale_payment_sheet_financial_risk/views/res_partner_view.xml @@ -0,0 +1,35 @@ + + + + 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 + + + + + + + + + + diff --git a/test-requirements.txt b/test-requirements.txt new file mode 100644 index 000000000..897200a63 --- /dev/null +++ b/test-requirements.txt @@ -0,0 +1 @@ +odoo-addon-sale_payment_sheet @ git+https://github.com/OCA/sale-workflow.git@refs/pull/3810/head#subdirectory=sale_payment_sheet