diff --git a/partner_statement/README.rst b/partner_statement/README.rst index 27ef8c2c..b60b1211 100644 --- a/partner_statement/README.rst +++ b/partner_statement/README.rst @@ -6,7 +6,7 @@ Partner Statement ================= -.. +.. !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! !! This file is generated by oca-gen-addon-readme !! !! changes will be overwritten. !! @@ -148,6 +148,7 @@ Contributors - Lois Rilo - Dhara Solanki - Danny Adair +- Simone Rubino Maintainers ----------- @@ -168,7 +169,7 @@ promote its widespread use. Current `maintainer `__: -|maintainer-MiquelRForgeFlow| +|maintainer-MiquelRForgeFlow| This module is part of the `OCA/account-financial-reporting `_ project on GitHub. diff --git a/partner_statement/readme/CONTRIBUTORS.md b/partner_statement/readme/CONTRIBUTORS.md index 346629bb..032b15c0 100644 --- a/partner_statement/readme/CONTRIBUTORS.md +++ b/partner_statement/readme/CONTRIBUTORS.md @@ -3,3 +3,4 @@ - Lois Rilo \<\> - Dhara Solanki \<\> - Danny Adair \<\> +- Simone Rubino \<\> diff --git a/partner_statement/report/activity_statement.py b/partner_statement/report/activity_statement.py index 6bb391b3..d45b581a 100644 --- a/partner_statement/report/activity_statement.py +++ b/partner_statement/report/activity_statement.py @@ -163,6 +163,7 @@ class ActivityStatement(models.AbstractModel): excluded_accounts_ids = tuple( self.env.context.get("excluded_accounts_ids", []) ) or (-1,) + show_only_overdue = self.env.context.get("show_only_overdue", False) payment_ref = _("Payment") return str( self._cr.mogrify( @@ -203,6 +204,11 @@ class ActivityStatement(models.AbstractModel): AND l.date <= %(date_end)s AND m.state IN ('posted') AND aa.account_type = %(account_type)s + AND CASE + WHEN %(show_only_overdue)s + THEN COALESCE(l.date_maturity, l.date) <= %(date_end)s + ELSE TRUE + END GROUP BY l.partner_id, m.name, l.date, l.date_maturity, CASE WHEN (aj.type IN ('sale', 'purchase')) THEN l.name diff --git a/partner_statement/report/outstanding_statement.py b/partner_statement/report/outstanding_statement.py index 67b60f88..58ccc2df 100644 --- a/partner_statement/report/outstanding_statement.py +++ b/partner_statement/report/outstanding_statement.py @@ -29,6 +29,7 @@ class OutstandingStatement(models.AbstractModel): excluded_accounts_ids = tuple( self.env.context.get("excluded_accounts_ids", []) ) or (-1,) + show_only_overdue = self.env.context.get("show_only_overdue", False) return str( self._cr.mogrify( """ @@ -83,6 +84,11 @@ class OutstandingStatement(models.AbstractModel): (pd.id IS NULL AND pc.id IS NULL) ) AND l.date <= %(date_end)s AND m.state IN ('posted') AND aa.account_type = %(account_type)s + AND CASE + WHEN %(show_only_overdue)s + THEN COALESCE(l.date_maturity, l.date) <= %(date_end)s + ELSE TRUE + END GROUP BY l.id, l.partner_id, m.name, l.date, l.date_maturity, l.name, CASE WHEN l.ref IS NOT NULL THEN l.ref diff --git a/partner_statement/report/report_statement_common.py b/partner_statement/report/report_statement_common.py index f70ad9d9..49347a31 100644 --- a/partner_statement/report/report_statement_common.py +++ b/partner_statement/report/report_statement_common.py @@ -62,6 +62,7 @@ class ReportStatementCommon(models.AbstractModel): excluded_accounts_ids = tuple( self.env.context.get("excluded_accounts_ids", []) ) or (-1,) + show_only_overdue = self.env.context.get("show_only_overdue", False) return str( self._cr.mogrify( """ @@ -104,6 +105,11 @@ class ReportStatementCommon(models.AbstractModel): ) AND l.date <= %(date_end)s AND not l.blocked AND m.state IN ('posted') AND aa.account_type = %(account_type)s + AND CASE + WHEN %(show_only_overdue)s + THEN COALESCE(l.date_maturity, l.date) <= %(date_end)s + ELSE TRUE + END GROUP BY l.partner_id, l.currency_id, l.date, l.date_maturity, l.amount_currency, l.balance, l.move_id, l.company_id, l.id """, @@ -366,6 +372,11 @@ class ReportStatementCommon(models.AbstractModel): self = self.with_context( excluded_accounts_ids=excluded_accounts_ids, ) + show_only_overdue = data["show_only_overdue"] + if show_only_overdue: + self = self.with_context( + show_only_overdue=show_only_overdue, + ) aging_type = data["aging_type"] is_activity = data.get("is_activity") is_detailed = data.get("is_detailed") @@ -592,6 +603,7 @@ class ReportStatementCommon(models.AbstractModel): "Currencies": currencies, "account_type": account_type, "excluded_accounts_ids": excluded_accounts_ids, + "show_only_overdue": show_only_overdue, "is_detailed": is_detailed, "bucket_labels": bucket_labels, "get_inv_addr": self._get_invoice_address, diff --git a/partner_statement/static/description/index.html b/partner_statement/static/description/index.html index 5ab388e2..d4b0d479 100644 --- a/partner_statement/static/description/index.html +++ b/partner_statement/static/description/index.html @@ -503,6 +503,7 @@ If you spotted it first, help us to smash it by providing a detailed and welcome
  • Lois Rilo <lois.rilo@forgeflow.com>
  • Dhara Solanki <dhara.solanki@initos.com>
  • Danny Adair <danny@o4sb.com>
  • +
  • Simone Rubino <simone.rubino@pytech.it>
  • diff --git a/partner_statement/tests/test_outstanding_statement.py b/partner_statement/tests/test_outstanding_statement.py index f68533e6..f4148c8c 100644 --- a/partner_statement/tests/test_outstanding_statement.py +++ b/partner_statement/tests/test_outstanding_statement.py @@ -1,8 +1,9 @@ # Copyright 2018 ForgeFlow, S.L. (https://www.forgeflow.com) +# Copyright 2025 Simone Rubino - PyTech # License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl.html). -from odoo.tests import new_test_user -from odoo.tests.common import TransactionCase +from odoo import fields +from odoo.tests.common import TransactionCase, new_test_user class TestOutstandingStatement(TransactionCase): @@ -148,3 +149,50 @@ class TestOutstandingStatement(TransactionCase): other_partner = partners - invoice_partner other_partner_data = report["data"].get(other_partner.id) self.assertFalse(other_partner_data) + + def test_show_only_overdue(self): + """If "Show Only Overdue" is enabled, + only overdue lines are shown. + """ + # Arrange + partner = self.partner1 + today = fields.Date.today() + overdue_invoice = self.env["account.move"].search( + [ + ("partner_id", "=", partner.id), + ("state", "=", "posted"), + ("invoice_date_due", "<", today), + ], + limit=1, + ) + due_invoice = self.env["account.move"].search( + [ + ("partner_id", "=", partner.id), + ("state", "=", "posted"), + ("invoice_date_due", ">=", today), + ], + limit=1, + ) + wizard = self.wiz.with_context( + active_ids=partner.ids, + ).create( + { + "date_end": today, + "show_only_overdue": True, + } + ) + # pre-condition + self.assertTrue(due_invoice) + self.assertTrue(overdue_invoice) + + # Act + data = wizard._prepare_statement() + report = self.statement_model._get_report_values(partner.ids, data) + + # Assert + # Only the overdue invoice is shown + partner_data = report["data"][partner.id]["currencies"] + partner_move_lines = partner_data[overdue_invoice.currency_id.id]["lines"] + moves_names = [line["name"] for line in partner_move_lines] + self.assertNotIn(due_invoice.name, moves_names) + self.assertIn(overdue_invoice.name, moves_names) diff --git a/partner_statement/wizard/statement_common.py b/partner_statement/wizard/statement_common.py index 77ff6325..e30419bb 100644 --- a/partner_statement/wizard/statement_common.py +++ b/partner_statement/wizard/statement_common.py @@ -20,6 +20,9 @@ class StatementCommon(models.AbstractModel): ) date_end = fields.Date(required=True, default=fields.Date.context_today) show_aging_buckets = fields.Boolean(default=True) + show_only_overdue = fields.Boolean( + help="Show only lines due before the selected date", + ) number_partner_ids = fields.Integer( default=lambda self: len(self._context["active_ids"]) ) @@ -94,6 +97,7 @@ class StatementCommon(models.AbstractModel): "company_id": self.company_id.id, "partner_ids": self._context["active_ids"], "show_aging_buckets": self.show_aging_buckets, + "show_only_overdue": self.show_only_overdue, "filter_non_due_partners": self.filter_partners_non_due, "account_type": self.account_type, "aging_type": self.aging_type, diff --git a/partner_statement/wizard/statement_wizard.xml b/partner_statement/wizard/statement_wizard.xml index b97be724..2e3f3aa3 100644 --- a/partner_statement/wizard/statement_wizard.xml +++ b/partner_statement/wizard/statement_wizard.xml @@ -66,6 +66,7 @@ +