Skip to content

Commit

Permalink
[ADD] account_reconcile_payment_order
Browse files Browse the repository at this point in the history
  • Loading branch information
etobella committed Oct 2, 2024
1 parent 8450574 commit 0ed72e5
Show file tree
Hide file tree
Showing 21 changed files with 1,125 additions and 0 deletions.
78 changes: 78 additions & 0 deletions account_reconcile_payment_order/README.rst
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.
1 change: 1 addition & 0 deletions account_reconcile_payment_order/__init__.py
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
from . import models
26 changes: 26 additions & 0 deletions account_reconcile_payment_order/__manifest__.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,26 @@
# 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",
]
},
"demo": [],
}
4 changes: 4 additions & 0 deletions account_reconcile_payment_order/models/__init__.py
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
110 changes: 110 additions & 0 deletions account_reconcile_payment_order/models/account_bank_statement_line.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,110 @@
# 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"

add_payment_order_id = fields.Many2one(
"account.payment.order.maturity",
check_company=True,
store=False,
default=False,
prefetch=False,
)

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
11 changes: 11 additions & 0 deletions account_reconcile_payment_order/models/account_payment.py
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 account_reconcile_payment_order/models/account_payment_order.py
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()

Check warning on line 48 in account_reconcile_payment_order/models/account_payment_order.py

View check run for this annotation

Codecov / codecov/patch

account_reconcile_payment_order/models/account_payment_order.py#L47-L48

Added lines #L47 - L48 were not covered by tests
Original file line number Diff line number Diff line change
@@ -0,0 +1,52 @@
# Copyright 2024 Dixmit
# License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl).

from odoo import api, fields, models


class AccountPaymentOrderMaturity(models.Model):

_name = "account.payment.order.maturity"
_description = "Account Payment Order Maturity" # TODO

payment_order_id = fields.Many2one(
"account.payment.order", required=True, ondelete="cascade"
)
currency_id = fields.Many2one("res.currency", required=True)
date = fields.Date(required=True)
company_id = fields.Many2one(
"res.company", related="payment_order_id.company_id", store=True
)
payment_ids = fields.One2many("account.payment", inverse_name="maturity_order_id")
payment_type = fields.Selection(related="payment_order_id.payment_type", store=True)
is_matched = fields.Boolean(compute="_compute_matched_info", store=True)
amount_residual = fields.Monetary(
compute="_compute_matched_info", store=True, currency_field="currency_id"
)

@api.depends(
"payment_ids",
"payment_ids.is_matched",
"payment_ids.move_id.line_ids.amount_residual",
)
def _compute_matched_info(self):
for record in self:
record.is_matched = all(record.mapped("payment_ids.is_matched"))
residual_field = (
"amount_residual"
if record.currency_id == record.company_id.currency_id
else "amount_residual_currency"
)
amount_residual = 0.0
for pay in record.mapped("payment_ids"):
(
liquidity_lines,
counterpart_lines,
writeoff_lines,
) = pay._seek_for_lines()
amount_residual += sum(liquidity_lines.mapped(residual_field))
record.amount_residual = amount_residual

def action_view_order(self):
self.ensure_one()
return self.payment_order_id.get_formview_action()

Check warning on line 52 in account_reconcile_payment_order/models/account_payment_order_maturity.py

View check run for this annotation

Codecov / codecov/patch

account_reconcile_payment_order/models/account_payment_order_maturity.py#L51-L52

Added lines #L51 - L52 were not covered by tests
1 change: 1 addition & 0 deletions account_reconcile_payment_order/readme/CONTRIBUTORS.md
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
- Enric Tobella (www.dixmit.com)
2 changes: 2 additions & 0 deletions account_reconcile_payment_order/readme/DESCRIPTION.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,2 @@
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.
2 changes: 2 additions & 0 deletions account_reconcile_payment_order/security/ir.model.access.csv
Original file line number Diff line number Diff line change
@@ -0,0 +1,2 @@
id,name,model_id:id,group_id:id,perm_read,perm_write,perm_create,perm_unlink
access_account_payment_order_maturity,account.account_paymenbt_order_maturity,model_account_payment_order_maturity,account.group_account_user,1,1,1,1
12 changes: 12 additions & 0 deletions account_reconcile_payment_order/security/security.xml
Original file line number Diff line number Diff line change
@@ -0,0 +1,12 @@
<?xml version="1.0" encoding="UTF-8" ?>
<odoo>
<record id="security_payment_order_company_maturity_rule" model="ir.rule">
<field name="name">payment_order_maturity_company_rule</field>
<field name="model_id" ref="model_account_payment_order_maturity" />
<field name="domain_force">[('company_id', 'in', company_ids)]</field>
<field name="perm_read" eval="True" />
<field name="perm_write" eval="True" />
<field name="perm_create" eval="True" />
<field name="perm_unlink" eval="True" />
</record>
</odoo>
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Loading

0 comments on commit 0ed72e5

Please sign in to comment.