Browse Source

dons recurrents : fichier de paiement multi-dons

master
root 3 years ago
parent
commit
168ff9bc75
2 changed files with 163 additions and 29 deletions
  1. +155
    -28
      models/donation.py
  2. +8
    -1
      views/donation.xml

+ 155
- 28
models/donation.py View File

@ -1,5 +1,5 @@
from odoo import models, fields, api
from odoo.exceptions import UserError, ValidationError
from odoo import models, fields, api,_
from odoo.exceptions import UserError, ValidationError,Warning
from psycopg2 import sql, DatabaseError from psycopg2 import sql, DatabaseError
from datetime import datetime from datetime import datetime
@ -63,37 +63,23 @@ class DonationDonation(models.Model):
res['domain']={'segment_id':[('operation_id', '=', self.operation_id.id)]} res['domain']={'segment_id':[('operation_id', '=', self.operation_id.id)]}
return res return res
# @api.onchange('start_date')
# def _onchange_start_date(self):
# if self.start_date:
# self.donation_date=fields.Date.context_today(self)
# return True
# def _compute_rum(self):
# for rec in self:
# rec.rum_direct_debit=''
#if rec.recurring_template: rec.rum_direct_debit='GHGHH65767688899976'
#rec.rum_direct_debit='GHGHH65767688899976'
class DonationRecurringGenerate(models.TransientModel):
_inherit = 'donation.recurring.generate'
def generate(self):
self.ensure_one()
def generate_recurring_payment(self):
#self.ensure_one()
doo = self.env["donation.donation"] doo = self.env["donation.donation"]
#chercher les templates de dons récurrents actifs
donations = doo.search( donations = doo.search(
[ [
("recurring_template", "=", "active"),
("company_id", "=", self.company_id.id),
("recurring_template", "=", "active")
] ]
) )
new_donation_ids = [] new_donation_ids = []
#pour chaque template de don récurrent
#création d'un don si les dates sont bonnes
for donation in donations: for donation in donations:
generate=True generate=True
existing_recur_donations = doo.search([("source_recurring_id", "=",int(donation.id))]) existing_recur_donations = doo.search([("source_recurring_id", "=",int(donation.id))])
@ -115,7 +101,7 @@ class DonationRecurringGenerate(models.TransientModel):
generate=False generate=False
break break
#si tout est ok pour la date, génération du don
if generate==True: if generate==True:
default = { default = {
"recurring_template":'', "recurring_template":'',
@ -125,12 +111,17 @@ class DonationRecurringGenerate(models.TransientModel):
"payment_mode_id":donation.payment_mode_id.id, "payment_mode_id":donation.payment_mode_id.id,
"mandate_required":'True', "mandate_required":'True',
"mandate_id":donation.mandate_id.id, "mandate_id":donation.mandate_id.id,
"state":"draft"
} }
#creation du don à partir du template de don récurrent
new_donation = donation.copy(default=default) new_donation = donation.copy(default=default)
#ajout du don à la collection des dons générés pour affichage
new_donation_ids.append(new_donation.id) new_donation_ids.append(new_donation.id)
payment_mode_id=donation.payment_mode_id.id
#création de l'ordre de paiement SEPA avec tous les dons générés
self.create_direct_debit_payment_order(new_donation_ids,payment_mode_id)
#affichage des dons générés
action = self.env.ref("donation.donation_action").sudo().read([])[0] action = self.env.ref("donation.donation_action").sudo().read([])[0]
action.update( action.update(
{ {
@ -140,4 +131,140 @@ class DonationRecurringGenerate(models.TransientModel):
) )
return action return action
def create_direct_debit_payment_order(self,donation_ids,payment_mode_id):
"""Create Direct debit payment order on donation validation or update
an existing draft Direct Debit pay order"""
apoo = self.env["account.payment.order"].sudo()
payorder_vals = {"payment_mode_id": payment_mode_id}
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)
# add payment lines
donations=self.env["donation.donation"].search([("id", "in",donation_ids)])
for donation in donations:
#validation du don et génération des écritures comptables
self.validate_donation(donation)
if donation.payment_mode_id.payment_type == "inbound":
#génération de la ligne de paiement dans l'ordre de prélèvement
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 donations:donation.message_post(body=msg)
return True
def validate_donation(self,donations):
check_total = self.env["res.users"].has_group(
"donation.group_donation_check_total"
)
for donation in donations:
if donation.donation_date > fields.Date.context_today(self):
raise UserError(
_(
"The date of donation %s should be today "
"or in the past, not in the future!"
)
% donation.number
)
if not donation.line_ids:
raise UserError(
_(
"Cannot validate donation %s because it doesn't "
"have any lines!"
)
% donation.number
)
if donation.currency_id.is_zero(donation.amount_total):
raise UserError(
_("Cannot validate donation %s because the " "total amount is 0!")
% donation.number
)
if donation.state != "draft":
raise UserError(
_(
"Cannot validate donation %s because it is not "
"in draft state."
)
% donation.number
)
if check_total and donation.currency_id.compare_amounts(
donation.check_total, donation.amount_total
):
raise UserError(
_(
"The amount of donation %s (%s) is different "
"from the sum of the donation lines (%s)."
)
% (
donation.number,
format_amount(
self.env, donation.check_total, donation.currency_id
),
format_amount(
self.env, donation.amount_total, donation.currency_id
),
)
)
full_in_kind = all([line.in_kind for line in donation.line_ids])
if not donation.payment_mode_id and not full_in_kind:
raise UserError(
_(
"Payment Mode is not set on donation %s (only fully "
"in-kind donations don't require a payment mode)."
)
% donation.number
)
vals = {"state": "done"}
if full_in_kind and donation.payment_mode_id:
vals["payment_mode_id"] = False
if not full_in_kind:
move_vals = donation._prepare_donation_move()
# when we have a full in-kind donation: no account move
if move_vals:
move = self.env["account.move"].create(move_vals)
move.action_post()
vals["move_id"] = move.id
else:
donation.message_post(
body=_("Full in-kind donation: no account move generated")
)
receipt = donation.generate_each_tax_receipt()
if receipt:
vals["tax_receipt_id"] = receipt.id
donation.write(vals)
if donation.bank_statement_line_id:
donation._reconcile_donation_from_bank_statement()
donation.partner_id._update_donor_rank()
return

+ 8
- 1
views/donation.xml View File

@ -68,6 +68,13 @@
<field name="domain">[('recurring_template', '!=', False)]</field> <field name="domain">[('recurring_template', '!=', False)]</field>
</record> </record>
<record model="ir.actions.server" id="ir_action_generate_recurring_payment">
<field name="name">generate_recurring_payment</field>
<field name="model_id" ref="donation.model_donation_donation"/>
<field name="state">code</field>
<field name="code">action=model.generate_recurring_payment()</field>
</record>
<menuitem id="recurring_donation_top_menu" sequence="15" <menuitem id="recurring_donation_top_menu" sequence="15"
name="Recurring donations" web_icon="opendons,static/description/recurring_donation.png"/> name="Recurring donations" web_icon="opendons,static/description/recurring_donation.png"/>
@ -77,7 +84,7 @@
<menuitem id="recurring_donation_menu" action="donation_recurring_action" <menuitem id="recurring_donation_menu" action="donation_recurring_action"
parent="recurring_donation_title_menu" sequence="10"/> parent="recurring_donation_title_menu" sequence="10"/>
<menuitem id="recurring_generate_menu" action="donation_recurring.donation_recurring_generate_action"
<menuitem id="recurring_generate_menu" action="ir_action_generate_recurring_payment"
parent="recurring_donation_title_menu" sequence="30"/> parent="recurring_donation_title_menu" sequence="30"/>
</odoo> </odoo>

Loading…
Cancel
Save