feat: add fusion_odoo_fixes module for default Odoo patches

- New standalone module to collect fixes for default Odoo behavior
- Fix #1: account_followup never clears followup_next_action_date
  when invoices are paid, causing collection emails to fully-paid
  clients. Hooks into _invoice_paid_hook to auto-clear stale data.
- Harden Fusion Accounting followup queries with amount_residual > 0
  filter and add balance check before sending emails

Co-authored-by: Cursor <cursoragent@cursor.com>
This commit is contained in:
gsinghpal
2026-02-24 03:31:14 -05:00
parent 9d9453b5c8
commit 84c009416e
7 changed files with 120 additions and 1 deletions

View File

@@ -237,6 +237,7 @@ class FusionFollowupLine(models.Model):
('account_id.account_type', '=', 'asset_receivable'),
('parent_state', '=', 'posted'),
('reconciled', '=', False),
('amount_residual', '>', 0),
('date_maturity', '<', today),
])
line.overdue_amount = sum(overdue_lines.mapped('amount_residual'))
@@ -281,6 +282,8 @@ class FusionFollowupLine(models.Model):
of the current follow-up level, then advances the partner to
the next level.
Skips sending if the partner no longer has any overdue balance.
:raises UserError: If no follow-up level is set.
"""
self.ensure_one()
@@ -291,6 +294,11 @@ class FusionFollowupLine(models.Model):
self.partner_id.display_name,
))
self._compute_overdue_values()
if self.overdue_amount <= 0:
self.followup_status = 'no_action_needed'
return True
level = self.followup_level_id
partner = self.partner_id

View File

@@ -76,7 +76,8 @@ class FusionPartnerFollowup(models.Model):
"""Return unpaid receivable move lines that are past due.
Searches for posted, unreconciled journal items on receivable
accounts where the maturity date is earlier than today.
accounts where the maturity date is earlier than today and
there is still an outstanding balance.
:returns: An ``account.move.line`` recordset.
"""
@@ -88,6 +89,7 @@ class FusionPartnerFollowup(models.Model):
('account_id.account_type', '=', 'asset_receivable'),
('parent_state', '=', 'posted'),
('reconciled', '=', False),
('amount_residual', '>', 0),
('date_maturity', '<', today),
])

View File

@@ -188,6 +188,15 @@ class FusionFollowupSendWizard(models.TransientModel):
if not line:
raise UserError(_("No follow-up record is linked to this wizard."))
line._compute_overdue_values()
if line.overdue_amount <= 0:
line.followup_status = 'no_action_needed'
raise UserError(_(
"Partner '%s' no longer has any overdue balance. "
"Follow-up cancelled.",
line.partner_id.display_name,
))
partner = line.partner_id
# ---- Email ----