[UPD] odex_takaful

This commit is contained in:
Samir Ladoui 2026-01-20 09:05:52 +01:00
parent b75fd11de6
commit 65f738515e
3 changed files with 129 additions and 50 deletions

View File

@ -1,5 +1,6 @@
# -*- coding: utf-8 -*- # -*- coding: utf-8 -*-
from odoo import models, fields, api, _ from odoo import models, fields, api, _
from dateutil.relativedelta import relativedelta
class DonationExtensionHistory(models.Model): class DonationExtensionHistory(models.Model):
@ -125,6 +126,74 @@ class DonationExtensionHistory(models.Model):
store=False store=False
) )
direct_debit_partner_bank_id = fields.Many2one("res.partner.bank")
debit_payment_file_attachment = fields.Binary(attachment=True)
debit_payment_attachment_file_name = fields.Char()
journal_id = fields.Many2one('account.journal')
last_digits = fields.Char()
bank_id = fields.Many2one('res.bank')
paid_amount = fields.Float()
def _apply_extension_on_sponsorship(self):
new_end_date = self.donation_detail_id.end_date + relativedelta(months=self.extension_months)
donation_line_new_vals = {
'end_date': new_end_date,
'payment_month_count': self.donation_detail_id.payment_month_count + self.extension_months,
}
if self.new_direct_debit:
donation_line_new_vals.update({
'direct_debit': self.new_direct_debit,
'direct_debit_partner_bank_id': self.direct_debit_partner_bank_id.id,
'journal_id': self.journal_id.id,
'debit_payment_file_attachment': self.debit_payment_file_attachment,
'debit_payment_attachment_file_name': self.debit_payment_attachment_file_name,
'last_digits': self.last_digits,
'bank_id': self.bank_id.id,
})
self.donation_detail_id.write(donation_line_new_vals)
benefit_ids = self.donation_detail_id.benefit_ids | self.donation_detail_id.benefit_id
benefit_ids.write({
'sponsorship_end_date': new_end_date,
'kafala_status': 'have_kafala',
})
# Create new scheduling lines for the extension period
if self.new_direct_debit:
self._create_extension_scheduling_lines()
def _create_extension_scheduling_lines(self):
self.ensure_one()
donation_line = self.donation_detail_id
start_date = donation_line.end_date + relativedelta(months=1)
# Distribute total amount across months
base_amount, remainder = divmod(self.extension_amount, self.extension_months)
base_amount = float(base_amount)
for month in range(self.extension_months):
scheduled_date = start_date + relativedelta(months=month)
month_year = scheduled_date.strftime("%m/%Y")
# Distribute remainder across first months
amount = base_amount + 1 if month < remainder else base_amount
# Format the amount to 2 decimal places for better representation
amount = round(amount, 2)
# Create scheduling line
self.env['sponsorship.scheduling.line'].sudo().create({
'sponsorship_id': donation_line.sponsorship_id.id or donation_line.sponsorship_mechanism_id.id,
'donation_detail_linked_id': donation_line.id,
'beneficiary_id': donation_line.benefit_id.id if donation_line.benefit_id else False,
'month_year': month_year,
'scheduled_date': scheduled_date,
'amount': amount,
'status': 'unpaid',
})
def _sms_get_number_fields(self): def _sms_get_number_fields(self):
"""Return fields to use for SMS phone number""" """Return fields to use for SMS phone number"""
return ['sponsor_phone'] return ['sponsor_phone']
@ -172,7 +241,7 @@ class DonationExtensionHistory(models.Model):
'context': { 'context': {
'active_model': 'account.move', 'active_model': 'account.move',
'active_ids': self.invoice_id.ids, 'active_ids': self.invoice_id.ids,
'default_amount': self.extension_amount, 'default_amount': self.extension_amount - self.paid_amount,
'sponsorship_payment_skip_compute_amount': True, 'sponsorship_payment_skip_compute_amount': True,
'dont_redirect_to_payments': True, 'dont_redirect_to_payments': True,
'sponsorship_line_ids': self.donation_detail_id.ids, 'sponsorship_line_ids': self.donation_detail_id.ids,

View File

@ -377,7 +377,10 @@ class AccountRegisterPayment(models.TransientModel):
if self.env.context.get('from_extension_history') and donation_extension_history_id and res: if self.env.context.get('from_extension_history') and donation_extension_history_id and res:
history = self.env['donation.extension.history'].browse(donation_extension_history_id) history = self.env['donation.extension.history'].browse(donation_extension_history_id)
if history: if history:
history.sudo().write({'state': 'paid'}) history.paid_amount += self.amount
if history.paid_amount >= history.extension_amount:
history.sudo()._apply_extension_on_sponsorship()
history.sudo().write({'state': 'paid'})
elif self.env.context.get('dont_redirect_to_payments') and self.env.context.get('wiz_id'): elif self.env.context.get('dont_redirect_to_payments') and self.env.context.get('wiz_id'):
if self.amount < self.env.context.get('default_amount'): if self.amount < self.env.context.get('default_amount'):
@ -405,6 +408,7 @@ class AccountRegisterPayment(models.TransientModel):
('invoice_id', '=', line.extension_invoice_id.id) ('invoice_id', '=', line.extension_invoice_id.id)
], limit=1) ], limit=1)
if history: if history:
history.sudo()._apply_extension_on_sponsorship()
history.sudo().write({'state': 'paid'}) history.sudo().write({'state': 'paid'})
return { return {

View File

@ -353,29 +353,29 @@ class DonationExtensionWizardLine(models.TransientModel):
old_end_date = self.current_end_date old_end_date = self.current_end_date
# Update end date # Update end date
donation_line_new_vals = { # donation_line_new_vals = {
'end_date': new_end_date, # 'end_date': new_end_date,
'payment_month_count': self.donation_line_id.payment_month_count + self.months, # 'payment_month_count': self.donation_line_id.payment_month_count + self.months,
} # }
if self.direct_debit: # if self.direct_debit:
donation_line_new_vals.update({ # donation_line_new_vals.update({
'direct_debit': self.direct_debit, # 'direct_debit': self.direct_debit,
'direct_debit_partner_bank_id': self.direct_debit_partner_bank_id.id, # 'direct_debit_partner_bank_id': self.direct_debit_partner_bank_id.id,
'journal_id': self.journal_id.id, # 'journal_id': self.journal_id.id,
'debit_payment_file_attachment': self.debit_payment_file_attachment, # 'debit_payment_file_attachment': self.debit_payment_file_attachment,
'debit_payment_attachment_file_name': self.debit_payment_attachment_file_name, # 'debit_payment_attachment_file_name': self.debit_payment_attachment_file_name,
}) # })
self.donation_line_id.write(donation_line_new_vals) # self.donation_line_id.write(donation_line_new_vals)
benefit_ids = self.donation_line_id.benefit_ids | self.donation_line_id.benefit_id # benefit_ids = self.donation_line_id.benefit_ids | self.donation_line_id.benefit_id
benefit_ids.write({ # benefit_ids.write({
'sponsorship_end_date': new_end_date, # 'sponsorship_end_date': new_end_date,
'kafala_status': 'have_kafala', # 'kafala_status': 'have_kafala',
}) # })
# Create new scheduling lines for the extension period # # Create new scheduling lines for the extension period
if self.direct_debit: # if self.direct_debit:
self._create_extension_scheduling_lines() # self._create_extension_scheduling_lines()
# Create invoice for the extension # Create invoice for the extension
invoice_id = self._create_extension_invoice() invoice_id = self._create_extension_invoice()
@ -393,6 +393,12 @@ class DonationExtensionWizardLine(models.TransientModel):
'old_direct_debit': self.donation_line_id.direct_debit, 'old_direct_debit': self.donation_line_id.direct_debit,
'new_direct_debit': self.direct_debit, 'new_direct_debit': self.direct_debit,
'direct_debit_partner_bank_id': self.direct_debit_partner_bank_id.id,
'debit_payment_file_attachment': self.debit_payment_file_attachment,
'debit_payment_attachment_file_name': self.debit_payment_attachment_file_name,
'journal_id': self.journal_id.id,
'last_digits': self.last_digits,
'bank_id': self.bank_id.id,
}) })
if not self.direct_debit: if not self.direct_debit:
@ -402,36 +408,36 @@ class DonationExtensionWizardLine(models.TransientModel):
return False return False
def _create_extension_scheduling_lines(self): # def _create_extension_scheduling_lines(self):
""" # """
Create scheduling lines for the extension period # Create scheduling lines for the extension period
""" # """
self.ensure_one() # self.ensure_one()
donation_line = self.donation_line_id # donation_line = self.donation_line_id
start_date = self.current_end_date + relativedelta(months=1) # start_date = self.current_end_date + relativedelta(months=1)
# Distribute total amount across months # # Distribute total amount across months
base_amount, remainder = divmod(self.total_donation_amount, self.months) # base_amount, remainder = divmod(self.total_donation_amount, self.months)
base_amount = float(base_amount) # base_amount = float(base_amount)
for month in range(self.months): # for month in range(self.months):
scheduled_date = start_date + relativedelta(months=month) # scheduled_date = start_date + relativedelta(months=month)
month_year = scheduled_date.strftime("%m/%Y") # month_year = scheduled_date.strftime("%m/%Y")
# Distribute remainder across first months # # Distribute remainder across first months
amount = base_amount + 1 if month < remainder else base_amount # amount = base_amount + 1 if month < remainder else base_amount
# Format the amount to 2 decimal places for better representation # # Format the amount to 2 decimal places for better representation
amount = round(amount, 2) # amount = round(amount, 2)
# Create scheduling line # # Create scheduling line
self.env['sponsorship.scheduling.line'].sudo().create({ # self.env['sponsorship.scheduling.line'].sudo().create({
'sponsorship_id': donation_line.sponsorship_id.id or donation_line.sponsorship_mechanism_id.id, # 'sponsorship_id': donation_line.sponsorship_id.id or donation_line.sponsorship_mechanism_id.id,
'donation_detail_linked_id': donation_line.id, # 'donation_detail_linked_id': donation_line.id,
'beneficiary_id': donation_line.benefit_id.id if donation_line.benefit_id else False, # 'beneficiary_id': donation_line.benefit_id.id if donation_line.benefit_id else False,
'month_year': month_year, # 'month_year': month_year,
'scheduled_date': scheduled_date, # 'scheduled_date': scheduled_date,
'amount': amount, # 'amount': amount,
'status': 'unpaid', # 'status': 'unpaid',
}) # })
def _create_extension_invoice(self): def _create_extension_invoice(self):
""" """