donation_direct_debit; black, isort, etc.

14.0
Alexis de Lattre 3 years ago
parent 323ceeb99a
commit 51047fdc39

@ -4,18 +4,18 @@
{
'name': 'Donation Direct Debit',
'version': '14.0.1.0.0',
'category': 'Accounting',
'license': 'AGPL-3',
'summary': 'Auto-generate direct debit order on donation validation',
'author': 'Akretion, Odoo Community Association (OCA)',
'maintainers': ['alexis-via'],
'website': 'https://github.com/OCA/donation',
'depends': ['account_banking_sepa_direct_debit', 'donation'],
'data': [
'views/donation.xml',
"name": "Donation Direct Debit",
"version": "14.0.1.0.0",
"category": "Accounting",
"license": "AGPL-3",
"summary": "Auto-generate direct debit order on donation validation",
"author": "Akretion, Odoo Community Association (OCA)",
"maintainers": ["alexis-via"],
"website": "https://github.com/OCA/donation",
"depends": ["account_banking_sepa_direct_debit", "donation"],
"data": [
"views/donation.xml",
],
'demo': ['demo/donation_demo.xml'],
'installable': True,
"demo": ["demo/donation_demo.xml"],
"installable": True,
}

@ -1,33 +1,32 @@
<?xml version="1.0" encoding="utf-8"?>
<?xml version="1.0" encoding="utf-8" ?>
<!--
© 2015-2016 Akretion France (Alexis de Lattre <alexis.delattre@akretion.com>)
License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl).
-->
<odoo noupdate="1">
<record id="donor2_iban" model="res.partner.bank">
<field name="acc_number">FR93 1277 1277 1277 1277 1277 127</field>
<field name="partner_id" ref="donation_base.donor2" />
<field name="bank_id" ref="account_payment_mode.bank_la_banque_postale"/>
<field name="bank_id" ref="account_payment_mode.bank_la_banque_postale" />
</record>
<record id="donor2_mandate" model="account.banking.mandate">
<field name="partner_bank_id" ref="donor2_iban"/>
<field name="partner_bank_id" ref="donor2_iban" />
<field name="type">recurrent</field>
<field name="recurrent_sequence_type">first</field>
<field name="signature_date" eval="time.strftime('%Y-01-01')"/>
<field name="signature_date" eval="time.strftime('%Y-01-01')" />
<field name="state">valid</field>
</record>
<record id="donor4" model="res.partner">
<field name="name">Bella Andalouse</field>
<field name="donor_rank" eval="1"/>
<field name="donor_rank" eval="1" />
<field name="street">42 avenue de la République</field>
<field name="zip">50550</field>
<field name="city">Saint-Vaast la Hougue</field>
<field name="country_id" ref="base.fr"/>
<field name="country_id" ref="base.fr" />
<field name="email">bella.andalouse@yahoo.example.com</field>
<field name="tax_receipt_option">annual</field>
</record>
@ -35,33 +34,35 @@
<record id="donor4_iban" model="res.partner.bank">
<field name="acc_number">FR50 4266 4266 4266 4266 4266 426</field>
<field name="partner_id" ref="donor4" />
<field name="bank_id" ref="account_payment_mode.bank_la_banque_postale"/>
<field name="bank_id" ref="account_payment_mode.bank_la_banque_postale" />
</record>
<record id="donor4_mandate" model="account.banking.mandate">
<field name="partner_bank_id" ref="donor4_iban"/>
<field name="partner_bank_id" ref="donor4_iban" />
<field name="type">recurrent</field>
<field name="recurrent_sequence_type">first</field>
<field name="signature_date" eval="time.strftime('%Y-%m-01')"/>
<field name="signature_date" eval="time.strftime('%Y-%m-01')" />
<field name="state">valid</field>
</record>
<record id="donation6" model="donation.donation">
<field name="currency_id" ref="base.EUR"/>
<field name="currency_id" ref="base.EUR" />
<field name="check_total">150</field>
<field name="partner_id" ref="donor4"/>
<field name="donation_date" eval="time.strftime('%Y-%m-01')"/>
<field name="payment_mode_id" ref="account_banking_sepa_direct_debit.payment_mode_inbound_sepa_dd1"/>
<field name="partner_id" ref="donor4" />
<field name="donation_date" eval="time.strftime('%Y-%m-01')" />
<field name="payment_ref">Don prelev SEPA</field>
<field name="campaign_id" ref="donation.prospecting_origin"/>
<field name="mandate_id" ref="donor4_mandate"/>
<field name="payment_mode_id" ref="account_banking_sepa_direct_debit.payment_mode_inbound_sepa_dd1"/>
<field name="campaign_id" ref="donation.prospecting_origin" />
<field name="mandate_id" ref="donor4_mandate" />
<field
name="payment_mode_id"
ref="account_banking_sepa_direct_debit.payment_mode_inbound_sepa_dd1"
/>
<field name="tax_receipt_option">annual</field>
</record>
<record id="donation6_l1" model="donation.line">
<field name="donation_id" ref="donation6"/>
<field name="product_id" ref="donation_base.product_product_donation"/>
<field name="donation_id" ref="donation6" />
<field name="product_id" ref="donation_base.product_product_donation" />
<field name="quantity">1</field>
<field name="unit_price">150</field>
</record>

@ -2,63 +2,80 @@
# @author: Alexis de Lattre <alexis.delattre@akretion.com>
# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl).
from odoo import models, fields, api, _
from odoo import _, api, fields, models
from odoo.exceptions import UserError
class DonationDonation(models.Model):
_inherit = 'donation.donation'
_inherit = "donation.donation"
mandate_id = fields.Many2one(
'account.banking.mandate', string='Mandate',
states={'done': [('readonly', True)]}, tracking=True,
check_company=True, ondelete='restrict',
"account.banking.mandate",
string="Mandate",
states={"done": [("readonly", True)]},
tracking=True,
check_company=True,
ondelete="restrict",
domain="[('state', '=', 'valid'), "
"('partner_id', '=', commercial_partner_id), "
"('company_id', '=', company_id)]")
"('company_id', '=', company_id)]",
)
mandate_required = fields.Boolean(
related="payment_mode_id.payment_method_id.mandate_required", readonly=True
)
@api.onchange('payment_mode_id')
@api.onchange("payment_mode_id")
def donation_partner_direct_debit_change(self):
if self.partner_id and self.payment_mode_id and self.payment_mode_id.payment_method_id.mandate_required and not self.mandate_id:
mandate = self.env['account.banking.mandate'].search([
('state', '=', 'valid'),
('partner_id', '=', self.commercial_partner_id.id),
], limit=1)
if (
self.partner_id
and self.payment_mode_id
and self.payment_mode_id.payment_method_id.mandate_required
and not self.mandate_id
):
mandate = self.env["account.banking.mandate"].search(
[
("state", "=", "valid"),
("partner_id", "=", self.commercial_partner_id.id),
],
limit=1,
)
if mandate:
self.mandate_id = mandate
def _prepare_donation_move(self):
vals = super()._prepare_donation_move()
vals.update({
'mandate_id': self.mandate_id.id or False,
'payment_mode_id': self.payment_mode_id.id,
})
vals.update(
{
"mandate_id": self.mandate_id.id or False,
"payment_mode_id": self.payment_mode_id.id,
}
)
return vals
def _prepare_payment_order(self):
self.ensure_one()
vals = {'payment_mode_id': self.payment_mode_id.id}
vals = {"payment_mode_id": self.payment_mode_id.id}
return vals
def validate(self):
'''Create Direct debit payment order on donation validation or update
an existing draft Direct Debit pay order'''
"""Create Direct debit payment order on donation validation or update
an existing draft Direct Debit pay order"""
res = super().validate()
apoo = self.env['account.payment.order'].sudo()
apoo = self.env["account.payment.order"].sudo()
for donation in self:
if (
donation.payment_mode_id and
donation.payment_mode_id.payment_type == 'inbound' and
donation.payment_mode_id.payment_order_ok and
donation.move_id):
payorders = apoo.search([
('state', '=', 'draft'),
('company_id', '=', donation.company_id.id),
('payment_mode_id', '=', donation.payment_mode_id.id),
])
donation.payment_mode_id
and donation.payment_mode_id.payment_type == "inbound"
and donation.payment_mode_id.payment_order_ok
and donation.move_id
):
payorders = apoo.search(
[
("state", "=", "draft"),
("company_id", "=", donation.company_id.id),
("payment_mode_id", "=", donation.payment_mode_id.id),
]
)
msg = False
if payorders:
payorder = payorders[0]
@ -66,37 +83,48 @@ class DonationDonation(models.Model):
payorder_vals = donation._prepare_payment_order()
payorder = apoo.create(payorder_vals)
msg = _(
"A new draft direct debit order <a href=# data-oe-model=account.payment.order data-oe-id=%d>%s</a> has been "
"automatically created") % (payorder.id, payorder.name)
"A new draft direct debit order "
"<a href=# data-oe-model=account.payment.order "
"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
payment_account_id = (
donation.payment_mode_id.fixed_journal_id.payment_debit_account_id.id
)
for mline in donation.move_id.line_ids:
if mline.account_id.id == payment_account_id:
mline.sudo().create_payment_line_from_move_line(payorder)
break
if not msg:
msg = _("A new payment line has been automatically added "
msg = _(
"A new payment line has been automatically added "
"to the existing draft direct debit order "
"<a href=# data-oe-model=account.payment.order data-oe-id=%d>%s</a>.") % (payorder.id, payorder.name)
"<a href=# data-oe-model=account.payment.order "
"data-oe-id=%d>%s</a>."
) % (payorder.id, payorder.name)
donation.message_post(body=msg)
return res
def done2cancel(self):
for donation in self:
if donation.move_id:
donation_mv_line_ids = [
line.id for line in donation.move_id.line_ids]
donation_mv_line_ids = [line.id for line in donation.move_id.line_ids]
if donation_mv_line_ids:
plines = self.env['account.payment.line'].search([
('move_line_id', 'in', donation_mv_line_ids),
('company_id', '=', donation.company_id.id),
('state', 'in', ('draft', 'open')),
])
plines = self.env["account.payment.line"].search(
[
("move_line_id", "in", donation_mv_line_ids),
("company_id", "=", donation.company_id.id),
("state", "in", ("draft", "open")),
]
)
if plines:
raise UserError(_(
raise UserError(
_(
"You cannot cancel a donation "
"which is linked to a payment line in a "
"direct debit order. Remove it from the "
"following direct debit order: %s.")
% plines[0].order_id.display_name)
"following direct debit order: %s."
)
% plines[0].order_id.display_name
)
return super().done2cancel()

@ -6,35 +6,44 @@ from odoo.tests.common import TransactionCase
class TestDirectDebit(TransactionCase):
def test_direct_debit(self):
donation = self.env.ref('donation_direct_debit.donation6')
dd_payment_mode = self.env.ref('account_banking_sepa_direct_debit.payment_mode_inbound_sepa_dd1')
bank_journal = self.env['account.journal'].create({
'type': 'bank',
'name': 'Bank account test',
})
dd_payment_mode.write({
'donation': True,
'bank_account_link': 'fixed',
'fixed_journal_id': bank_journal.id,
})
donation = self.env.ref("donation_direct_debit.donation6")
dd_payment_mode = self.env.ref(
"account_banking_sepa_direct_debit.payment_mode_inbound_sepa_dd1"
)
bank_journal = self.env["account.journal"].create(
{
"type": "bank",
"name": "Bank account test",
}
)
dd_payment_mode.write(
{
"donation": True,
"bank_account_link": "fixed",
"fixed_journal_id": bank_journal.id,
}
)
donation.validate()
self.assertEqual(donation.state, 'done')
self.assertEqual(donation.state, "done")
self.assertTrue(donation.move_id)
self.assertEqual(donation.mandate_id, donation.move_id.mandate_id)
self.assertEqual(
donation.payment_mode_id, donation.move_id.payment_mode_id)
paylines = self.env['account.payment.line'].search(
[('communication', '=', donation.payment_ref),
('partner_id', '=', donation.commercial_partner_id.id)])
self.assertEqual(donation.payment_mode_id, donation.move_id.payment_mode_id)
paylines = self.env["account.payment.line"].search(
[
("communication", "=", donation.payment_ref),
("partner_id", "=", donation.commercial_partner_id.id),
]
)
self.assertEqual(len(paylines), 1)
payline = paylines[0]
self.assertFalse(donation.currency_id.compare_amounts(
payline.amount_currency, donation.check_total))
self.assertFalse(
donation.currency_id.compare_amounts(
payline.amount_currency, donation.check_total
)
)
self.assertEqual(payline.currency_id, donation.currency_id)
self.assertTrue(payline.move_line_id in donation.move_id.line_ids)
self.assertEqual(
payline.partner_bank_id, donation.mandate_id.partner_bank_id)
self.assertEqual(payline.partner_bank_id, donation.mandate_id.partner_bank_id)
self.assertEqual(payline.mandate_id, donation.mandate_id)
self.assertEqual(payline.order_id.state, 'draft')
self.assertEqual(payline.order_id.state, "draft")

@ -1,21 +1,24 @@
<?xml version="1.0" encoding="utf-8"?>
<?xml version="1.0" encoding="utf-8" ?>
<!--
Copyright 2015-2021 Akretion France (http://www.akretion.com/)
@author: Alexis de Lattre <alexis.delattre@akretion.com>
License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl).
-->
<odoo>
<record id="donation_form" model="ir.ui.view">
<field name="name">mandate.donation.form</field>
<field name="model">donation.donation</field>
<field name="inherit_id" ref="donation.donation_form"/>
<field name="inherit_id" ref="donation.donation_form" />
<field name="arch" type="xml">
<field name="payment_mode_id" position="after">
<field name="mandate_id" options="{'no_create_edit': True}" attrs="{'required': [('mandate_required', '=', True)], 'invisible': [('mandate_required', '=', False)]}"/>
<field name="mandate_required" invisible="1"/>
<field
name="mandate_id"
options="{'no_create_edit': True}"
attrs="{'required': [('mandate_required', '=', True)], 'invisible': [('mandate_required', '=', False)]}"
/>
<field name="mandate_required" invisible="1" />
</field>
</field>
</record>

@ -0,0 +1,6 @@
import setuptools
setuptools.setup(
setup_requires=['setuptools-odoo'],
odoo_addon=True,
)
Loading…
Cancel
Save