diff --git a/partner_statement/__manifest__.py b/partner_statement/__manifest__.py index 41cd1861..5dafa7e1 100644 --- a/partner_statement/__manifest__.py +++ b/partner_statement/__manifest__.py @@ -3,7 +3,7 @@ { "name": "Partner Statement", - "version": "13.0.1.2.2", + "version": "14.0.1.0.0", "category": "Accounting & Finance", "summary": "OCA Financial Reports", "author": "ForgeFlow, Odoo Community Association (OCA)", @@ -12,6 +12,7 @@ "depends": ["account"], "external_dependencies": {"python": ["dateutil"]}, "data": [ + "security/ir.model.access.csv", "security/statement_security.xml", "views/activity_statement.xml", "views/outstanding_statement.xml", diff --git a/partner_statement/report/activity_statement.py b/partner_statement/report/activity_statement.py index a6be08bc..c7c52986 100644 --- a/partner_statement/report/activity_statement.py +++ b/partner_statement/report/activity_statement.py @@ -23,13 +23,15 @@ class ActivityStatement(models.AbstractModel): ELSE sum(l.debit) END as debit, CASE WHEN l.currency_id is not null AND l.amount_currency < 0.0 - THEN sum(-l.amount_currency) + THEN sum(l.amount_currency * (-1)) ELSE sum(l.credit) END as credit FROM account_move_line l + JOIN account_account aa ON (aa.id = l.account_id) + JOIN account_account_type at ON (at.id = aa.user_type_id) JOIN account_move m ON (l.move_id = m.id) WHERE l.partner_id IN %(partners)s - AND l.account_internal_type = %(account_type)s + AND at.type = %(account_type)s AND l.date < %(date_start)s AND not l.blocked AND m.state IN ('posted') GROUP BY l.partner_id, l.currency_id, l.amount_currency, l.company_id @@ -105,10 +107,12 @@ class ActivityStatement(models.AbstractModel): ELSE l.date_maturity END as date_maturity FROM account_move_line l + JOIN account_account aa ON (aa.id = l.account_id) + JOIN account_account_type at ON (at.id = aa.user_type_id) JOIN account_move m ON (l.move_id = m.id) JOIN account_journal aj ON (l.journal_id = aj.id) WHERE l.partner_id IN %(partners)s - AND l.account_internal_type = %(account_type)s + AND at.type = %(account_type)s AND %(date_start)s <= l.date AND l.date <= %(date_end)s AND m.state IN ('posted') diff --git a/partner_statement/report/outstanding_statement.py b/partner_statement/report/outstanding_statement.py index 7f406340..2cbd7846 100644 --- a/partner_statement/report/outstanding_statement.py +++ b/partner_statement/report/outstanding_statement.py @@ -16,76 +16,62 @@ class OutstandingStatement(models.AbstractModel): return str( self._cr.mogrify( """ - SELECT l.id, m.name AS move_id, l.partner_id, l.date, l.name, - l.blocked, l.currency_id, l.company_id, - CASE WHEN l.ref IS NOT NULL THEN l.ref ELSE m.ref END as ref, + SELECT l.id, m.name AS move_id, l.partner_id, l.date, l.name, + l.blocked, l.currency_id, l.company_id, + CASE WHEN l.ref IS NOT NULL + THEN l.ref + ELSE m.ref + END as ref, CASE WHEN (l.currency_id is not null AND l.amount_currency > 0.0) THEN avg(l.amount_currency) ELSE avg(l.debit) END as debit, CASE WHEN (l.currency_id is not null AND l.amount_currency < 0.0) - THEN avg(-l.amount_currency) + THEN avg(l.amount_currency * (-1)) ELSE avg(l.credit) END as credit, - (abs(COALESCE(l.balance, 0.0)) + sum( - coalesce(pr.pr_sign, 0.0) * coalesce(pr.amount, 0.0)) - ) * sign(COALESCE(l.balance, 0.0)) AS open_amount, - (abs(COALESCE(l.amount_currency, 0.0)) + sum( - coalesce(pr.pr_sign, 0.0) * CASE - WHEN pr.currency_id IS NOT NULL AND pr.currency_id = l.currency_id - THEN coalesce(pr.amount_currency, 0.0) - WHEN cur.id IS NOT NULL AND ROUND( - abs(COALESCE(l.balance, 0.0)), cur.decimal_places) > 0.0 - THEN ROUND(coalesce(pr.amount, 0.0) * - COALESCE(l.amount_currency, 0.0) / NULLIF(l.balance, 0.0), - cur.decimal_places) - ELSE ROUND(coalesce(pr.amount, 0.0) * - COALESCE(( - SELECT r.rate FROM res_currency_rate r - JOIN account_move_line aml - ON pr.credit_move_id = aml.id - WHERE r.currency_id = l.currency_id - AND r.name <= aml.date - AND (r.company_id IS NULL - OR r.company_id = l.company_id) - ORDER BY r.company_id, r.name DESC LIMIT 1), 1.0), - cur.decimal_places) - END) - ) * sign(COALESCE(l.amount_currency, 0.0)) AS open_amount_currency, + CASE WHEN l.balance > 0.0 + THEN l.balance - sum(coalesce(pd.amount, 0.0)) + ELSE l.balance + sum(coalesce(pc.amount, 0.0)) + END AS open_amount, + CASE WHEN l.balance > 0.0 + THEN l.amount_currency - sum(coalesce(pd.debit_amount_currency, 0.0)) + ELSE l.amount_currency + sum(coalesce(pc.credit_amount_currency, 0.0)) + END AS open_amount_currency, CASE WHEN l.date_maturity is null THEN l.date ELSE l.date_maturity END as date_maturity - FROM ( - SELECT l.*, CASE - WHEN l.debit = 0.0 AND l.credit = 0.0 AND l.currency_id IS NOT NULL - AND ROUND(COALESCE(l.amount_currency, 0.0), - cur.decimal_places) > 0.0 THEN 1 - WHEN l.debit = 0.0 AND l.credit = 0.0 AND l.currency_id IS NOT NULL - AND ROUND(COALESCE(l.amount_currency, 0.0), - cur.decimal_places) < 0.0 THEN -1 - WHEN l.balance > 0.0 THEN 1 ELSE -1 END as sign FROM account_move_line l - LEFT JOIN res_currency cur ON cur.id = l.currency_id - ) l - JOIN account_move m ON l.move_id = m.id - LEFT JOIN res_currency cur ON cur.id = l.currency_id - LEFT JOIN LATERAL (SELECT pr.*, - CASE WHEN pr.credit_move_id = l.id THEN l.sign - ELSE -l.sign END AS pr_sign - FROM account_partial_reconcile pr - WHERE pr.max_date <= %(date_end)s AND ( - (pr.debit_move_id = l.id) OR (pr.credit_move_id = l.id)) - ) as pr ON TRUE - WHERE l.partner_id IN %(partners)s - AND l.account_internal_type = %(account_type)s - AND ( - (pr.id IS NOT NULL AND pr.max_date <= %(date_end)s) OR - (pr.id IS NULL) - ) AND l.date <= %(date_end)s AND m.state IN ('posted') - 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 ELSE m.ref END, - l.blocked, l.currency_id, l.balance, l.amount_currency, l.company_id + JOIN account_account aa ON (aa.id = l.account_id) + JOIN account_account_type at ON (at.id = aa.user_type_id) + JOIN account_move m ON (l.move_id = m.id) + LEFT JOIN (SELECT pr.* + FROM account_partial_reconcile pr + INNER JOIN account_move_line l2 + ON pr.credit_move_id = l2.id + WHERE l2.date <= %(date_end)s + ) as pd ON pd.debit_move_id = l.id + LEFT JOIN (SELECT pr.* + FROM account_partial_reconcile pr + INNER JOIN account_move_line l2 + ON pr.debit_move_id = l2.id + WHERE l2.date <= %(date_end)s + ) as pc ON pc.credit_move_id = l.id + WHERE l.partner_id IN %(partners)s AND at.type = %(account_type)s + AND ( + (pd.id IS NOT NULL AND + pd.max_date <= %(date_end)s) OR + (pc.id IS NOT NULL AND + pc.max_date <= %(date_end)s) OR + (pd.id IS NULL AND pc.id IS NULL) + ) AND l.date <= %(date_end)s AND m.state IN ('posted') + 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 + ELSE m.ref + END, + l.blocked, l.currency_id, l.balance, l.amount_currency, l.company_id """, locals(), ), @@ -121,9 +107,7 @@ class OutstandingStatement(models.AbstractModel): Q2.open_amount FROM Q2 JOIN res_company c ON (c.id = Q2.company_id) - JOIN res_currency cur ON cur.id = COALESCE(Q2.currency_id, c.currency_id) - WHERE c.id = %(company_id)s AND - round(Q2.open_amount, cur.decimal_places) != 0.0 + WHERE c.id = %(company_id)s AND Q2.open_amount != 0.0 """, locals(), ), diff --git a/partner_statement/report/report_statement_common.py b/partner_statement/report/report_statement_common.py index fbada72a..e48f83b5 100644 --- a/partner_statement/report/report_statement_common.py +++ b/partner_statement/report/report_statement_common.py @@ -38,66 +38,47 @@ class ReportStatementCommon(models.AbstractModel): return str( self._cr.mogrify( """ - SELECT l.partner_id, l.currency_id, l.company_id, l.move_id, - (abs(COALESCE(l.balance, 0.0)) + sum( - coalesce(pr.pr_sign, 0.0) * coalesce(pr.amount, 0.0)) - ) * sign(COALESCE(l.balance, 0.0)) AS open_due, - (abs(COALESCE(l.amount_currency, 0.0)) + sum( - coalesce(pr.pr_sign, 0.0) * CASE - WHEN pr.currency_id IS NOT NULL AND pr.currency_id = l.currency_id - THEN coalesce(pr.amount_currency, 0.0) - WHEN cur.id IS NOT NULL AND ROUND( - abs(COALESCE(l.balance, 0.0)), cur.decimal_places) > 0.0 - THEN ROUND(coalesce(pr.amount, 0.0) * - COALESCE(l.amount_currency, 0.0) / NULLIF(l.balance, 0.0), - cur.decimal_places) - ELSE ROUND(coalesce(pr.amount, 0.0) * - COALESCE(( - SELECT r.rate FROM res_currency_rate r - JOIN account_move_line aml - ON pr.credit_move_id = aml.id - WHERE r.currency_id = l.currency_id - AND r.name <= aml.date - AND (r.company_id IS NULL - OR r.company_id = l.company_id) - ORDER BY r.company_id, r.name DESC LIMIT 1), 1.0), - cur.decimal_places) - END) - ) * sign(COALESCE(l.amount_currency, 0.0)) AS open_due_currency, + SELECT l.partner_id, l.currency_id, l.company_id, l.move_id, + CASE WHEN l.balance > 0.0 + THEN l.balance - sum(coalesce(pd.amount, 0.0)) + ELSE l.balance + sum(coalesce(pc.amount, 0.0)) + END AS open_due, + CASE WHEN l.balance > 0.0 + THEN l.amount_currency - sum(coalesce(pd.debit_amount_currency, 0.0)) + ELSE l.amount_currency + sum(coalesce(pc.credit_amount_currency, 0.0)) + END AS open_due_currency, CASE WHEN l.date_maturity is null THEN l.date ELSE l.date_maturity - END as date_maturity - FROM ( - SELECT l.*, CASE - WHEN l.debit = 0.0 AND l.credit = 0.0 AND l.currency_id IS NOT NULL - AND ROUND(COALESCE(l.amount_currency, 0.0), - cur.decimal_places) > 0.0 THEN 1 - WHEN l.debit = 0.0 AND l.credit = 0.0 AND l.currency_id IS NOT NULL - AND ROUND(COALESCE(l.amount_currency, 0.0), - cur.decimal_places) < 0.0 THEN -1 - WHEN l.balance > 0.0 THEN 1 ELSE -1 END as sign + END as date_maturity FROM account_move_line l - LEFT JOIN res_currency cur ON cur.id = l.currency_id - ) l - JOIN account_move m ON l.move_id = m.id - LEFT JOIN res_currency cur ON cur.id = l.currency_id - LEFT JOIN LATERAL (SELECT pr.*, - CASE WHEN pr.credit_move_id = l.id THEN l.sign - ELSE -l.sign END AS pr_sign - FROM account_partial_reconcile pr - WHERE pr.max_date <= %(date_end)s AND ( - (pr.debit_move_id = l.id) OR (pr.credit_move_id = l.id)) - ) as pr ON TRUE - WHERE l.partner_id IN %(partners)s - AND l.account_internal_type = %(account_type)s - AND ( - (pr.id IS NOT NULL AND pr.max_date <= %(date_end)s) OR - (pr.id IS NULL) - ) AND l.date <= %(date_end)s AND not l.blocked - AND m.state IN ('posted') - 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 + JOIN account_move m ON (l.move_id = m.id) + JOIN account_account aa ON (aa.id = l.account_id) + JOIN account_account_type at ON (at.id = aa.user_type_id) + LEFT JOIN (SELECT pr.* + FROM account_partial_reconcile pr + INNER JOIN account_move_line l2 + ON pr.credit_move_id = l2.id + WHERE l2.date <= %(date_end)s + ) as pd ON pd.debit_move_id = l.id + LEFT JOIN (SELECT pr.* + FROM account_partial_reconcile pr + INNER JOIN account_move_line l2 + ON pr.debit_move_id = l2.id + WHERE l2.date <= %(date_end)s + ) as pc ON pc.credit_move_id = l.id + WHERE l.partner_id IN %(partners)s AND at.type = %(account_type)s + AND ( + (pd.id IS NOT NULL AND + pd.max_date <= %(date_end)s) OR + (pc.id IS NOT NULL AND + pc.max_date <= %(date_end)s) OR + (pd.id IS NULL AND pc.id IS NULL) + ) AND l.date <= %(date_end)s AND not l.blocked + AND m.state IN ('posted') + 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 """, locals(), ), @@ -307,8 +288,8 @@ class ReportStatementCommon(models.AbstractModel): ) @api.model - # flake8: noqa: C901 def _get_report_values(self, docids, data=None): + # flake8: noqa: C901 """ @return: returns a dict of parameters to pass to qweb report. the most important pair is {'data': res} which contains all diff --git a/partner_statement/security/ir.model.access.csv b/partner_statement/security/ir.model.access.csv new file mode 100644 index 00000000..f3a19dcc --- /dev/null +++ b/partner_statement/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_activity_statement_wizard,access_activity_statement_wizard,model_activity_statement_wizard,account.group_account_invoice,1,1,1,0 +access_outstanding_statement_wizard,access_outstanding_statement_wizard,model_outstanding_statement_wizard,account.group_account_invoice,1,1,1,0 diff --git a/partner_statement/tests/test_res_config_settings.py b/partner_statement/tests/test_res_config_settings.py index 919cccf7..02683de7 100644 --- a/partner_statement/tests/test_res_config_settings.py +++ b/partner_statement/tests/test_res_config_settings.py @@ -32,4 +32,4 @@ class TestResConfigSettings(TransactionCase): self.user_obj._has_group("partner_statement.group_activity_statement") ) res = self.env["ir.default"].get("activity.statement.wizard", "aging_type") - self.assertEquals(res, "months") + self.assertEqual(res, "months") diff --git a/partner_statement/views/activity_statement.xml b/partner_statement/views/activity_statement.xml index 36563bf5..721b7856 100644 --- a/partner_statement/views/activity_statement.xml +++ b/partner_statement/views/activity_statement.xml @@ -161,13 +161,11 @@ - + + Activity Statement + res.partner + partner_statement.activity_statement + qweb-pdf + partner_statement.activity_statement + diff --git a/partner_statement/views/outstanding_statement.xml b/partner_statement/views/outstanding_statement.xml index 9752406f..4fca43f4 100644 --- a/partner_statement/views/outstanding_statement.xml +++ b/partner_statement/views/outstanding_statement.xml @@ -157,13 +157,11 @@ - + + Outstanding Statement + res.partner + partner_statement.outstanding_statement + qweb-pdf + partner_statement.outstanding_statement + diff --git a/partner_statement/wizard/statement_common.py b/partner_statement/wizard/statement_common.py index d1072d52..df055700 100644 --- a/partner_statement/wizard/statement_common.py +++ b/partner_statement/wizard/statement_common.py @@ -11,16 +11,10 @@ class StatementCommon(models.AbstractModel): _name = "statement.common.wizard" _description = "Statement Reports Common Wizard" - def _get_company(self): - return ( - self.env["res.company"].browse(self.env.context.get("force_company")) - or self.env.company - ) - name = fields.Char() company_id = fields.Many2one( comodel_name="res.company", - default=_get_company, + default=lambda self: self.env.company, string="Company", required=True, ) diff --git a/partner_statement/wizard/statement_wizard.xml b/partner_statement/wizard/statement_wizard.xml index 9c3d41c7..84ec2762 100644 --- a/partner_statement/wizard/statement_wizard.xml +++ b/partner_statement/wizard/statement_wizard.xml @@ -3,24 +3,28 @@ License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl). --> - - + + Partner Activity Statement + + activity.statement.wizard + form + + new + + + Partner Outstanding Statement + + outstanding.statement.wizard + form + + new + Statement Common Wizard View @@ -28,11 +32,11 @@
-

@@ -86,14 +90,14 @@ primary - - @@ -105,15 +109,15 @@ primary - -