[FIX] partial payment in extend process
This commit is contained in:
parent
fa171291eb
commit
8a2b0c4bd2
|
|
@ -197,7 +197,19 @@ class AccountRegisterPayment(models.TransientModel):
|
|||
def action_create_payments(self):
|
||||
res = super(AccountRegisterPayment, self).action_create_payments()
|
||||
|
||||
if self.env.context.get('dont_redirect_to_payments'):
|
||||
if self.env.context.get('dont_redirect_to_payments') and self.env.context.get('wiz_id'):
|
||||
if self.amount < self.env.context.get('default_amount'):
|
||||
return {
|
||||
'type': 'ir.actions.act_window',
|
||||
'name': _('Extend Donation'),
|
||||
'res_model': 'donation.extension.wizard',
|
||||
'view_mode': 'form',
|
||||
'target': 'new',
|
||||
'res_id': self.env.context.get('wiz_id'),
|
||||
'context': {
|
||||
'paid_amount': self.amount,
|
||||
},
|
||||
}
|
||||
return {
|
||||
'type': 'ir.actions.client',
|
||||
'tag': 'display_notification',
|
||||
|
|
|
|||
|
|
@ -39,6 +39,7 @@ class DonationExtensionWizard(models.TransientModel):
|
|||
compute='_compute_total_extension_amount',
|
||||
store=True,
|
||||
)
|
||||
paid_amount = fields.Float(string="Paid Amount", readonly=True)
|
||||
|
||||
|
||||
|
||||
|
|
@ -47,14 +48,14 @@ class DonationExtensionWizard(models.TransientModel):
|
|||
for rec in self:
|
||||
rec.total_extension_amount = sum(line.total_donation_amount for line in rec.line_ids if line.direct_debit == False)
|
||||
|
||||
@api.constrains('is_different_payment', 'payment_line_ids')
|
||||
def _check_payment_sum_when_different(self):
|
||||
for rec in self:
|
||||
if not rec.is_different_payment:
|
||||
sum_payments = sum(line.payment_amount for line in rec.payment_line_ids)
|
||||
if float_compare(sum_payments, rec.total_extension_amount, precision_digits=2) != 0:
|
||||
raise ValidationError(_("Total payment amounts (%s) must equal total extension amount (%s).") %
|
||||
(sum_payments, rec.total_extension_amount))
|
||||
# @api.constrains('is_different_payment', 'payment_line_ids')
|
||||
# def _check_payment_sum_when_different(self):
|
||||
# for rec in self:
|
||||
# if not rec.is_different_payment:
|
||||
# sum_payments = sum(line.payment_amount for line in rec.payment_line_ids)
|
||||
# if float_compare(sum_payments, rec.total_extension_amount, precision_digits=2) != 0:
|
||||
# raise ValidationError(_("Total payment amounts (%s) must equal total extension amount (%s).") %
|
||||
# (sum_payments, rec.total_extension_amount))
|
||||
|
||||
def _compute_line_ids(self):
|
||||
extension_line_ids = [(5,)]
|
||||
|
|
@ -97,73 +98,96 @@ class DonationExtensionWizard(models.TransientModel):
|
|||
"""
|
||||
invoice_ids = self.env['account.move']
|
||||
donation_line_ids = self.env['donations.details.lines']
|
||||
self.paid_amount += self.env.context.get('paid_amount', 0.0)
|
||||
amount = self.total_extension_amount - self.paid_amount
|
||||
print(self.env.context.get('paid_amount'),'-------------------------------------',self.paid_amount)
|
||||
print(self.total_extension_amount,'=================',amount)
|
||||
|
||||
for line in self.line_ids:
|
||||
result = line._extend()
|
||||
if result:
|
||||
invoice_ids += result[0]
|
||||
donation_line_ids += result[1]
|
||||
|
||||
if invoice_ids and not self.is_different_payment:
|
||||
invoices = invoice_ids.filtered(
|
||||
lambda inv: inv.state == 'posted' and inv.move_type in ('out_invoice', 'out_refund'))
|
||||
if not invoices:
|
||||
return
|
||||
if invoice_ids:
|
||||
return {
|
||||
'name': _('Register Payment'),
|
||||
'res_model': 'account.payment.register',
|
||||
'view_mode': 'form',
|
||||
'context': {
|
||||
'active_model': 'account.move',
|
||||
'active_ids': invoice_ids.ids,
|
||||
'default_amount': amount,
|
||||
'dont_redirect_to_payments': True,
|
||||
'sponsorship_line_ids': self.line_ids.donation_line_id.ids,
|
||||
'sponsorship_payment': True,
|
||||
'default_sponsorship_payment': True,
|
||||
'wiz_id': self.id
|
||||
# 'force_sponsorship_line_partner_id': self.donation_detail_id.sponsor_id.id,
|
||||
},
|
||||
'target': 'new',
|
||||
'type': 'ir.actions.act_window',
|
||||
}
|
||||
# invoices = invoice_ids.filtered(
|
||||
# lambda inv: inv.state == 'posted' and inv.move_type in ('out_invoice', 'out_refund'))
|
||||
# if not invoices:
|
||||
# return
|
||||
|
||||
residual_map = {inv.id: float(inv.amount_residual) for inv in invoices}
|
||||
# residual_map = {inv.id: float(inv.amount_residual) for inv in invoices}
|
||||
#
|
||||
# invoices = invoices.sorted(key=lambda r: r.invoice_date or r.date or fields.Date.context_today(self))
|
||||
|
||||
invoices = invoices.sorted(key=lambda r: r.invoice_date or r.date or fields.Date.context_today(self))
|
||||
# for pay_line in self.payment_line_ids:
|
||||
# remaining = float(pay_line.payment_amount or 0.0)
|
||||
# if float_compare(remaining, 0.0, precision_digits=2) <= 0:
|
||||
# continue
|
||||
#
|
||||
# candidate_invoices = invoices.filtered(lambda inv: inv.partner_id == pay_line.partner_id)
|
||||
#
|
||||
# if not candidate_invoices:
|
||||
# candidate_invoices = invoices
|
||||
#
|
||||
# for inv in candidate_invoices:
|
||||
# if float_compare(remaining, 0.0, precision_digits=2) <= 0:
|
||||
# break
|
||||
#
|
||||
# inv_res = residual_map.get(inv.id, 0.0)
|
||||
# if float_compare(inv_res, 0.0, precision_digits=2) <= 0:
|
||||
# continue
|
||||
#
|
||||
# pay_amount = min(remaining, inv_res)
|
||||
#
|
||||
# payment_register_vals = {
|
||||
# 'payment_type': 'inbound',
|
||||
# 'partner_type': 'customer',
|
||||
# 'partner_id': inv.partner_id.id,
|
||||
# 'amount': pay_amount,
|
||||
# 'journal_id': pay_line.journal_id.id,
|
||||
# # 'payment_method_id': pay_line.payment_method.id,
|
||||
# 'communication': _("Extension Payment for %s") % inv.name,
|
||||
# 'transaction_file_attachment': pay_line.payment_file_attachment,
|
||||
#
|
||||
# }
|
||||
|
||||
for pay_line in self.payment_line_ids:
|
||||
remaining = float(pay_line.payment_amount or 0.0)
|
||||
if float_compare(remaining, 0.0, precision_digits=2) <= 0:
|
||||
continue
|
||||
# ctx = {
|
||||
# 'active_model': 'account.move',
|
||||
# 'active_ids': [inv.id],
|
||||
# 'dont_redirect_to_payments': True,
|
||||
# 'sponsorship_line_ids': donation_line_ids.ids,
|
||||
# 'sponsorship_payment': True,
|
||||
# 'default_sponsorship_payment': True,
|
||||
# }
|
||||
|
||||
candidate_invoices = invoices.filtered(lambda inv: inv.partner_id == pay_line.partner_id)
|
||||
|
||||
if not candidate_invoices:
|
||||
candidate_invoices = invoices
|
||||
|
||||
for inv in candidate_invoices:
|
||||
if float_compare(remaining, 0.0, precision_digits=2) <= 0:
|
||||
break
|
||||
|
||||
inv_res = residual_map.get(inv.id, 0.0)
|
||||
if float_compare(inv_res, 0.0, precision_digits=2) <= 0:
|
||||
continue
|
||||
|
||||
pay_amount = min(remaining, inv_res)
|
||||
|
||||
payment_register_vals = {
|
||||
'payment_type': 'inbound',
|
||||
'partner_type': 'customer',
|
||||
'partner_id': inv.partner_id.id,
|
||||
'amount': pay_amount,
|
||||
'journal_id': pay_line.journal_id.id,
|
||||
# 'payment_method_id': pay_line.payment_method.id,
|
||||
'communication': _("Extension Payment for %s") % inv.name,
|
||||
'transaction_file_attachment': pay_line.payment_file_attachment,
|
||||
|
||||
}
|
||||
|
||||
ctx = {
|
||||
'active_model': 'account.move',
|
||||
'active_ids': [inv.id],
|
||||
'dont_redirect_to_payments': True,
|
||||
'sponsorship_line_ids': donation_line_ids.ids,
|
||||
'sponsorship_payment': True,
|
||||
'default_sponsorship_payment': True,
|
||||
}
|
||||
|
||||
payment_register = self.env['account.payment.register'].sudo().with_context(ctx).new(
|
||||
payment_register_vals)
|
||||
payments = payment_register.action_create_payments()
|
||||
|
||||
inv_sudo = inv.sudo()
|
||||
inv_sudo.invalidate_cache(['amount_residual'])
|
||||
new_residual = float(inv_sudo.amount_residual or 0.0)
|
||||
residual_map[inv.id] = new_residual
|
||||
|
||||
remaining = remaining - pay_amount
|
||||
# payment_register = self.env['account.payment.register'].sudo().with_context(ctx).new(
|
||||
# payment_register_vals)
|
||||
# payments = payment_register.action_create_payments()
|
||||
#
|
||||
# inv_sudo = inv.sudo()
|
||||
# inv_sudo.invalidate_cache(['amount_residual'])
|
||||
# new_residual = float(inv_sudo.amount_residual or 0.0)
|
||||
# residual_map[inv.id] = new_residual
|
||||
#
|
||||
# remaining = remaining - pay_amount
|
||||
|
||||
|
||||
|
||||
|
|
@ -455,6 +479,7 @@ class DonationExtensionWizardLine(models.TransientModel):
|
|||
'journal_id': int(kafala_journal_id),
|
||||
'date': fields.Date.today(),
|
||||
'partner_id': sponsorship.sponsor_id.id,
|
||||
'invoice_origin': sponsorship.code,
|
||||
'invoice_line_ids': [(0, 0, {
|
||||
'product_id': donation_line.product_id.id,
|
||||
'price_unit': self.total_donation_amount,
|
||||
|
|
|
|||
Loading…
Reference in New Issue