test(fusion_accounting_followup): engine integration tests for full lifecycle

End-to-end flows over a real posted receivable line: aging discovery,
level resolution, send-with-cache reuse, pause+force override, and
audit history growth. Adds ignore_pause kwarg to compute_followup_level
so force=True in send_followup_email reaches level resolution.

Made-with: Cursor
This commit is contained in:
gsinghpal
2026-04-19 20:54:13 -04:00
parent 6802d60e44
commit 9b6d6b3895
4 changed files with 85 additions and 8 deletions

View File

@@ -54,12 +54,12 @@ class FusionFollowupEngine(models.AbstractModel):
}
@api.model
def compute_followup_level(self, partner):
def compute_followup_level(self, partner, *, ignore_pause=False):
"""Return the fusion.followup.level recordset that should fire now,
or empty recordset if no action needed."""
partner.ensure_one()
Level = self.env['fusion.followup.level']
if partner.fusion_followup_paused_until and \
if not ignore_pause and partner.fusion_followup_paused_until and \
partner.fusion_followup_paused_until > fields.Date.today():
return Level
@@ -101,11 +101,6 @@ class FusionFollowupEngine(models.AbstractModel):
Creates a fusion.followup.run record. Uses cached text if available."""
partner.ensure_one()
if not level:
level = self.compute_followup_level(partner)
if not level:
return {'status': 'no_action', 'partner_id': partner.id}
if not force and partner.fusion_followup_paused_until and \
partner.fusion_followup_paused_until > fields.Date.today():
return {
@@ -113,6 +108,11 @@ class FusionFollowupEngine(models.AbstractModel):
'partner_id': partner.id,
}
if not level:
level = self.compute_followup_level(partner, ignore_pause=force)
if not level:
return {'status': 'no_action', 'partner_id': partner.id}
if level.requires_manual_review and not force:
run = self._create_run(partner, level, state='manual_review')
return {