-
-
Notifications
You must be signed in to change notification settings - Fork 386
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
[ADD] account_reconcile_payment_order
- Loading branch information
Showing
22 changed files
with
1,211 additions
and
0 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,78 @@ | ||
=============================== | ||
Account Reconcile Payment Order | ||
=============================== | ||
|
||
.. | ||
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! | ||
!! This file is generated by oca-gen-addon-readme !! | ||
!! changes will be overwritten. !! | ||
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! | ||
!! source digest: sha256:62593d3c4026a4022d861045e7c9cd3fa56484718450a6e7d52325acb833b6e4 | ||
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! | ||
.. |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%2Faccount--reconcile-lightgray.png?logo=github | ||
:target: https://github.com/OCA/account-reconcile/tree/16.0/account_reconcile_payment_order | ||
:alt: OCA/account-reconcile | ||
.. |badge4| image:: https://img.shields.io/badge/weblate-Translate%20me-F47D42.png | ||
:target: https://translation.odoo-community.org/projects/account-reconcile-16-0/account-reconcile-16-0-account_reconcile_payment_order | ||
: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/account-reconcile&target_branch=16.0 | ||
:alt: Try me on Runboat | ||
|
||
|badge1| |badge2| |badge3| |badge4| |badge5| | ||
|
||
This module allows to show the payment orders directly on the recocncile | ||
widget. This way, we can select or unselect automatically all the lines | ||
of the payment order. | ||
|
||
**Table of contents** | ||
|
||
.. contents:: | ||
:local: | ||
|
||
Bug Tracker | ||
=========== | ||
|
||
Bugs are tracked on `GitHub Issues <https://github.com/OCA/account-reconcile/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 <https://github.com/OCA/account-reconcile/issues/new?body=module:%20account_reconcile_payment_order%0Aversion:%2016.0%0A%0A**Steps%20to%20reproduce**%0A-%20...%0A%0A**Current%20behavior**%0A%0A**Expected%20behavior**>`_. | ||
|
||
Do not contact contributors directly about support or help with technical issues. | ||
|
||
Credits | ||
======= | ||
|
||
Authors | ||
------- | ||
|
||
* Dixmit | ||
|
||
Contributors | ||
------------ | ||
|
||
- Enric Tobella (`www.dixmit.com <http://www.dixmit.com>`__) | ||
|
||
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/account-reconcile <https://github.com/OCA/account-reconcile/tree/16.0/account_reconcile_payment_order>`_ project on GitHub. | ||
|
||
You are welcome to contribute. To learn how please visit https://odoo-community.org/page/Contribute. |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,2 @@ | ||
from . import models | ||
from .hooks import post_init_hook |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,27 @@ | ||
# Copyright 2024 Dixmit | ||
# License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl). | ||
|
||
{ | ||
"name": "Account Reconcile Payment Order", | ||
"summary": """ | ||
Allow to reconcile payment order on reconcile widget""", | ||
"version": "16.0.1.0.0", | ||
"license": "AGPL-3", | ||
"author": "Dixmit,Odoo Community Association (OCA)", | ||
"website": "https://github.com/OCA/account-reconcile", | ||
"depends": ["account_reconcile_oca", "account_payment_order"], | ||
"data": [ | ||
"security/security.xml", | ||
"security/ir.model.access.csv", | ||
"views/account_payment_order_maturity.xml", | ||
"views/account_bank_statement_line.xml", | ||
], | ||
"assets": { | ||
"web.assets_backend": [ | ||
"account_reconcile_payment_order/static/src/**/*.esm.js", | ||
"account_reconcile_payment_order/static/src/**/*.xml", | ||
] | ||
}, | ||
"post_init_hook": "post_init_hook", | ||
"demo": [], | ||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,61 @@ | ||
# Copyright 2023 ForgeFlow S.L. | ||
# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl.html). | ||
|
||
from odoo import SUPERUSER_ID, api | ||
|
||
|
||
def post_init_hook(cr, registry): | ||
cr.execute( | ||
""" | ||
INSERT INTO account_payment_order_maturity ( | ||
payment_order_id, | ||
date, | ||
currency_id, | ||
company_id, | ||
payment_type, | ||
is_matched | ||
) | ||
SELECT | ||
apo.id, | ||
apl.date, | ||
ap.currency_id, | ||
apo.company_id, | ||
apo.payment_type, | ||
bool_and(ap.is_matched) | ||
FROM | ||
account_payment_order apo | ||
INNER JOIN account_payment ap | ||
ON ap.payment_order_id = apo.id | ||
INNER JOIN account_payment_account_payment_line_rel apaplr | ||
ON apaplr.account_payment_id = ap.id | ||
INNER JOIN account_payment_line apl | ||
ON apl.id = apaplr.account_payment_line_id | ||
INNER JOIN account_move_line aml | ||
ON aml.move_id = ap.move_id | ||
INNER JOIN account_account aa | ||
ON aa.id = aml.account_id | ||
WHERE apo.state = 'uploaded' | ||
GROUP BY apo.id, apl.date, ap.currency_id | ||
""" | ||
) | ||
cr.execute( | ||
""" | ||
UPDATE account_payment ap | ||
SET maturity_order_id = apom.id | ||
FROM account_payment_order_maturity apom | ||
INNER JOIN account_payment_line apl | ||
ON apl.order_id = apom.payment_order_id | ||
INNER JOIN account_payment_account_payment_line_rel apaplr | ||
ON apl.id = apaplr.account_payment_line_id | ||
WHERE | ||
apaplr.account_payment_id = ap.id | ||
AND apom.date = apl.date | ||
AND apom.currency_id = ap.currency_id | ||
""" | ||
) | ||
env = api.Environment(cr, SUPERUSER_ID, {}) | ||
|
||
# We assume that there will not be too many records to process | ||
env["account.payment.order.maturity"].search( | ||
[("is_matched", "=", False)] | ||
)._compute_matched_info() |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,4 @@ | ||
from . import account_bank_statement_line | ||
from . import account_payment_order | ||
from . import account_payment_order_maturity | ||
from . import account_payment |
121 changes: 121 additions & 0 deletions
121
account_reconcile_payment_order/models/account_bank_statement_line.py
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,121 @@ | ||
# Copyright 2024 Dixmit | ||
# License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl). | ||
|
||
from odoo import api, fields, models | ||
|
||
|
||
class AccountBankStatementLine(models.Model): | ||
|
||
_inherit = "account.bank.statement.line" | ||
|
||
payment_type_filter = fields.Selection( | ||
selection=lambda r: r.env["account.payment.order"] | ||
._fields["payment_type"] | ||
.selection, | ||
compute="_compute_payment_type_filter", | ||
) | ||
add_payment_order_id = fields.Many2one( | ||
"account.payment.order.maturity", | ||
check_company=True, | ||
store=False, | ||
default=False, | ||
prefetch=False, | ||
) | ||
|
||
@api.depends() | ||
def _compute_payment_type_filter(self): | ||
for record in self: | ||
record.payment_type_filter = "inbound" if record.amount > 0 else "outbound" | ||
|
||
def clean_reconcile(self): | ||
""" | ||
Remove the counterparts when cleaning | ||
""" | ||
res = super().clean_reconcile() | ||
data = self.reconcile_data_info | ||
data["order_counterparts"] = [] | ||
self.reconcile_data_info = data | ||
return res | ||
|
||
@api.onchange("add_payment_order_id") | ||
def _onchange_add_payment_order_id(self): | ||
""" | ||
We need to check if the payment order is in already on the counterpart. | ||
In this case we need to add all the liquidity lines. Otherwise, we remove them | ||
""" | ||
if self.add_payment_order_id: | ||
data = self.reconcile_data_info["data"] | ||
if self.add_payment_order_id.id not in self.reconcile_data_info.get( | ||
"order_counterparts", [] | ||
): | ||
new_data = [] | ||
counterparts = [] | ||
for line in data: | ||
counterparts += line.get("counterpart_line_ids", []) | ||
new_data.append(line) | ||
for payment in self.add_payment_order_id.payment_ids.filtered( | ||
lambda r: not r.is_matched | ||
): | ||
( | ||
liquidity_lines, | ||
counterpart_lines, | ||
writeoff_lines, | ||
) = payment._seek_for_lines() | ||
for line in liquidity_lines.filtered( | ||
lambda r: r.id not in counterparts | ||
): | ||
reconcile_auxiliary_id, lines = self._get_reconcile_line( | ||
line, "other", True, 0.0 | ||
) | ||
new_data += lines | ||
data_info = self._recompute_suspense_line( | ||
new_data, | ||
self.reconcile_data_info["reconcile_auxiliary_id"], | ||
self.manual_reference, | ||
) | ||
data_info["order_counterparts"].append(self.add_payment_order_id.id) | ||
self.reconcile_data_info = data_info | ||
elif self.add_payment_order_id: | ||
data = self.reconcile_data_info["data"] | ||
lines = [] | ||
for payment in self.add_payment_order_id.payment_ids.filtered( | ||
lambda r: not r.is_matched | ||
): | ||
( | ||
liquidity_lines, | ||
counterpart_lines, | ||
writeoff_lines, | ||
) = payment._seek_for_lines() | ||
lines += liquidity_lines.ids | ||
new_data = [] | ||
for line in data: | ||
if set(line.get("counterpart_line_ids", [])).intersection( | ||
set(lines) | ||
): | ||
continue | ||
new_data.append(line) | ||
data_info = self._recompute_suspense_line( | ||
new_data, | ||
self.reconcile_data_info["reconcile_auxiliary_id"], | ||
self.manual_reference, | ||
) | ||
["order_counterparts"].append(self.add_payment_order_id.id) | ||
counterparts = set(data_info["order_counterparts"]) | ||
counterparts.remove(self.add_payment_order_id.id) | ||
data_info["order_counterparts"] = list(counterparts) | ||
self.reconcile_data_info = data_info | ||
self.add_payment_order_id = False | ||
|
||
def _recompute_suspense_line(self, data, reconcile_auxiliary_id, manual_reference): | ||
""" | ||
We want to keep the counterpart when we recompute | ||
""" | ||
order_counterparts = ( | ||
self.reconcile_data_info | ||
and self.reconcile_data_info.get("order_counterparts", []) | ||
) or [] | ||
result = super()._recompute_suspense_line( | ||
data, reconcile_auxiliary_id, manual_reference | ||
) | ||
result["order_counterparts"] = order_counterparts | ||
return result |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,11 @@ | ||
# Copyright 2024 Dixmit | ||
# License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl). | ||
|
||
from odoo import fields, models | ||
|
||
|
||
class AccountPayment(models.Model): | ||
|
||
_inherit = "account.payment" | ||
|
||
maturity_order_id = fields.Many2one(comodel_name="account.payment.order.maturity") |
48 changes: 48 additions & 0 deletions
48
account_reconcile_payment_order/models/account_payment_order.py
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,48 @@ | ||
# Copyright 2024 Dixmit | ||
# License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl). | ||
|
||
from itertools import groupby | ||
|
||
from odoo import fields, models | ||
|
||
|
||
class AccountPaymentOrder(models.Model): | ||
|
||
_inherit = "account.payment.order" | ||
|
||
maturity_order_ids = fields.One2many( | ||
comodel_name="account.payment.order.maturity", inverse_name="payment_order_id" | ||
) | ||
|
||
def generated2uploaded(self): | ||
result = super().generated2uploaded() | ||
for record in self: | ||
vals = sorted( | ||
self.payment_ids.read(["id", "payment_line_date", "currency_id"]), | ||
key=lambda r: (r["payment_line_date"], r["currency_id"][0]), | ||
) | ||
for key, _group in groupby( | ||
vals, lambda x: (x["payment_line_date"], x["currency_id"][0]) | ||
): | ||
self.env["account.payment.order.maturity"].create( | ||
{ | ||
"payment_order_id": record.id, | ||
"currency_id": key[1], | ||
"date": key[0], | ||
"payment_ids": [ | ||
( | ||
6, | ||
0, | ||
record.payment_ids.filtered( | ||
lambda r: r.payment_line_date == key[0] | ||
and r.currency_id.id == key[1] | ||
).ids, | ||
) | ||
], | ||
} | ||
) | ||
return result | ||
|
||
def action_uploaded_cancel(self): | ||
self.maturity_order_ids.unlink() | ||
return super().action_cancel() | ||
Oops, something went wrong.