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

@@ -0,0 +1,5 @@
# -*- coding: utf-8 -*-
# Copyright 2025-2026 Nexa Systems Inc.
# License OPL-1 (Odoo Proprietary License v1.0)
from . import models

View File

@@ -0,0 +1,36 @@
# -*- coding: utf-8 -*-
# Copyright 2025-2026 Nexa Systems Inc.
# License OPL-1 (Odoo Proprietary License v1.0)
{
'name': 'Fusion Odoo Fixes',
'version': '19.0.1.0.0',
'category': 'Technical',
'summary': 'Patches and fixes for default Odoo behavior.',
'description': """
Fusion Odoo Fixes
=================
A standalone module that corrects known issues in default Odoo
modules. Each fix is self-contained and safe to install on any
Odoo 19 instance.
Current Fixes
-------------
1. **Follow-up Cleanup on Payment** -- Odoo's account_followup
module never clears followup_next_action_date when invoices
are fully paid, causing collection emails to be sent to
clients with zero balance. This fix hooks into the payment
reconciliation flow and removes paid partners from the
follow-up queue automatically.
""",
'author': 'Nexa Systems Inc.',
'website': 'https://nexasystems.ca',
'depends': [
'account',
],
'data': [],
'installable': True,
'auto_install': False,
'license': 'OPL-1',
}

View File

@@ -0,0 +1,5 @@
# -*- coding: utf-8 -*-
# Copyright 2025-2026 Nexa Systems Inc.
# License OPL-1 (Odoo Proprietary License v1.0)
from . import account_move

View File

@@ -0,0 +1,54 @@
# -*- coding: utf-8 -*-
# Copyright 2025-2026 Nexa Systems Inc.
# License OPL-1 (Odoo Proprietary License v1.0)
#
# FIX: account_followup never clears followup_next_action_date
# ------------------------------------------------------------
# Odoo's account_followup module sets followup_next_action_date on
# res.partner when overdue invoices are detected, but never clears it
# when those invoices are paid. The daily cron re-evaluates status
# via SQL so it *usually* skips zero-balance partners, but the stale
# field causes partners to appear in follow-up lists and manual sends
# can still fire emails to fully-paid clients.
#
# This override hooks into _invoice_paid_hook (called by the core
# reconciliation engine) and clears the follow-up date when the
# partner has no remaining receivable balance.
import logging
from odoo import models
_logger = logging.getLogger(__name__)
class AccountMove(models.Model):
_inherit = 'account.move'
def _invoice_paid_hook(self):
super()._invoice_paid_hook()
partner_model = self.env['res.partner']
if 'followup_next_action_date' not in partner_model._fields:
return
partners = self.mapped('partner_id.commercial_partner_id').filtered(
'followup_next_action_date'
)
if not partners:
return
for partner in partners:
has_balance = self.env['account.move.line'].search_count([
('partner_id', '=', partner.id),
('account_id.account_type', '=', 'asset_receivable'),
('parent_state', '=', 'posted'),
('reconciled', '=', False),
('amount_residual', '>', 0),
], limit=1)
if not has_balance:
partner.write({'followup_next_action_date': False})
_logger.info(
"Cleared follow-up for partner %s (ID %s) -- no outstanding balance",
partner.name, partner.id,
)