Skip to content

Commit

Permalink
Merge pull request #119 from akretion/14-fix-direct_debit
Browse files Browse the repository at this point in the history
[14.0][FIX] donation by direct debit
  • Loading branch information
alexis-via authored Nov 20, 2023
2 parents 85321d1 + 79d9f51 commit cf119ff
Show file tree
Hide file tree
Showing 4 changed files with 81 additions and 10 deletions.
62 changes: 60 additions & 2 deletions donation/models/account_journal.py
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,8 @@
# @author: Alexis de Lattre <[email protected]>
# License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl.html).

from odoo import fields, models
from odoo import _, api, fields, models
from odoo.exceptions import ValidationError


class AccountJournal(models.Model):
Expand All @@ -16,8 +17,65 @@ class AccountJournal(models.Model):
domain="[('reconcile', '=', True), ('deprecated', '=', False), "
"('company_id', '=', company_id), "
"('id', 'not in', (default_account_id, suspense_account_id, "
"payment_credit_account_id, payment_debit_account_id))]",
"payment_credit_account_id, payment_debit_account_id, "
"donation_debit_order_account_id))]",
string="Donation by Credit Transfer Account",
help="Transfer account for donations received by credit transfer. "
"Leave empty if you don't receive donations on this bank account.",
)
donation_debit_order_account_id = fields.Many2one(
"account.account",
check_company=True,
copy=False,
ondelete="restrict",
domain="[('reconcile', '=', True), ('deprecated', '=', False), "
"('company_id', '=', company_id), "
"('user_type_id.type', '=', 'receivable'), "
"('id', 'not in', (default_account_id, suspense_account_id, "
"payment_credit_account_id, payment_debit_account_id, donation_account_id))]",
string="Donation by Debit Order Account",
help="Transfer account for donations by debit order. "
"Leave empty if you don't handle donations by debit order on this bank account."
"This account must be a receivable account, otherwise the debit order will not work.",
)

@api.constrains("donation_account_id", "donation_debit_order_account_id")
def _check_donation_accounts(self):
for journal in self:
if (
journal.donation_account_id
and not journal.donation_account_id.reconcile
):
raise ValidationError(
_(
"The Donation by Credit Transfer Account of journal "
"'%(journal)s' must be reconciliable, but the account "
"'%(account)s' is not reconciliable.",
journal=journal.display_name,
account=journal.donation_account_id.display_name,
)
)
ddo_account = journal.donation_debit_order_account_id
if ddo_account:
if not ddo_account.reconcile:
raise ValidationError(
_(
"The Donation by Debit Order Account of journal "
"'%(journal)s' must be reconciliable, but the account "
"'%(account)s' is not reconciliable.",
journal=journal.display_name,
account=ddo_account.display_name,
)
)
if ddo_account.user_type_id.type != "receivable":
raise ValidationError(
_(
"The Donation by Debit Order Account of journal "
"'%(journal)s' must be a receivable account, "
"but the account '%(account)s' is configured with "
"type '%(account_type)s'.",
journal=journal.display_name,
account=ddo_account.display_name,
account_type=ddo_account.user_type_id.display_name,
)
)
19 changes: 14 additions & 5 deletions donation/models/donation.py
Original file line number Diff line number Diff line change
Expand Up @@ -275,15 +275,12 @@ def _prepare_each_tax_receipt(self):
}
return vals

# TODO migration: remove 'journal' argument and use self.payment_mode_id.fixed_journal_id
def _prepare_counterpart_move_line(
self, total_company_cur, total_currency, journal
):
self.ensure_one()
if not journal.payment_debit_account_id:
raise UserError(
_("Missing Outstanding Receipts Account on journal '%s'.")
% journal.display_name
)
journal = self.payment_mode_id.fixed_journal_id
if self.company_currency_id.compare_amounts(total_company_cur, 0) > 0:
debit = total_company_cur
credit = 0
Expand All @@ -292,7 +289,19 @@ def _prepare_counterpart_move_line(
debit = 0
if self.bank_statement_line_id:
account_id = journal.donation_account_id.id
elif self.payment_mode_id.payment_order_ok:
if not journal.donation_debit_order_account_id:
raise UserError(
_("Missing Donation by Debit Order Account on journal '%s'.")
% journal.display_name
)
account_id = journal.donation_debit_order_account_id.id
else:
if not journal.payment_debit_account_id:
raise UserError(
_("Missing Outstanding Receipts Account on journal '%s'.")
% journal.display_name
)
account_id = journal.payment_debit_account_id.id
vals = {
"debit": debit,
Expand Down
4 changes: 4 additions & 0 deletions donation/views/account_journal.xml
Original file line number Diff line number Diff line change
Expand Up @@ -12,6 +12,10 @@
name="donation_account_id"
attrs="{'invisible': [('type', '!=', 'bank')]}"
/>
<field
name="donation_debit_order_account_id"
attrs="{'invisible': [('type', '!=', 'bank')]}"
/>
</field>
</field>
</record>
Expand Down
6 changes: 3 additions & 3 deletions donation_direct_debit/models/donation.py
Original file line number Diff line number Diff line change
Expand Up @@ -88,11 +88,11 @@ def validate(self):
"data-oe-id=%d>%s</a> has been automatically created"
) % (payorder.id, payorder.name)
# add payment line
payment_account_id = (
donation.payment_mode_id.fixed_journal_id.payment_debit_account_id.id
match_account_id = (
donation.payment_mode_id.fixed_journal_id.donation_debit_order_account_id.id
)
for mline in donation.move_id.line_ids:
if mline.account_id.id == payment_account_id:
if mline.account_id.id == match_account_id:
mline.sudo().create_payment_line_from_move_line(payorder)
break
if not msg:
Expand Down

0 comments on commit cf119ff

Please sign in to comment.