Files
Odoo-Modules/fusion_claims/data/ir_config_parameter_data.xml
gsinghpal d60a75a391 fusion_claims: cap MOD follow-up email flood with rolling 30-day window
Two daily MOD crons were fighting each other. _cron_mod_schedule_followups
created a mail.activity on every MOD order in quote_submitted/awaiting_funding;
_cron_mod_escalate_followups unconditionally deleted the activity after
sending its one-time reminder email. The activity was recreated every day
in a tight loop with no per-period cap — a legitimate 2-4 month wait for
a MOD funding decision would generate dozens of activity churn events and
a bulk email burst the first time the escalate cron ran against a backlog.

Fix:
- New fields x_fc_mod_followup_month_count / _month_start / _cap_notified
  (copy=False) track a rolling window per order.
- New config params mod_followup_max_per_month (default 2),
  mod_followup_window_days (30), mod_followup_max_per_cron_run (10).
- _send_mod_followup_email resets the window after 30 days, refuses to
  send past the cap, and posts a one-shot chatter note explaining why.
- _cron_mod_schedule_followups no longer recreates the activity when the
  cap has been hit and stops daily-bumping x_fc_mod_next_followup_date.
- _cron_mod_escalate_followups processes oldest-deadline-first with a
  per-run throttle, only unlinks the activity on a successful send so
  humans can still action capped cases manually.
- write() resets the rolling counters on any real MOD status change.

Deployed to fusion_claims v19.0.8.0.1 on odoo-westin (westin-v19,
36 affected orders) and odoo-mobility (mobility, 2 affected orders).
2026-04-08 00:01:19 -04:00

148 lines
7.0 KiB
XML

<?xml version="1.0" encoding="utf-8"?>
<odoo>
<!--
Default configuration parameters for Fusion Claims.
noupdate="1" ensures these are ONLY set on first install,
never overwritten during module upgrades.
-->
<data noupdate="1">
<!-- ADP Billing -->
<record id="config_vendor_code" model="ir.config_parameter">
<field name="key">fusion_claims.vendor_code</field>
<field name="value"></field>
</record>
<record id="config_adp_posting_base_date" model="ir.config_parameter">
<field name="key">fusion_claims.adp_posting_base_date</field>
<field name="value">2026-01-23</field>
</record>
<record id="config_adp_posting_frequency_days" model="ir.config_parameter">
<field name="key">fusion_claims.adp_posting_frequency_days</field>
<field name="value">14</field>
</record>
<!-- Email Notifications -->
<record id="config_enable_email_notifications" model="ir.config_parameter">
<field name="key">fusion_claims.enable_email_notifications</field>
<field name="value">True</field>
</record>
<record id="config_application_reminder_days" model="ir.config_parameter">
<field name="key">fusion_claims.application_reminder_days</field>
<field name="value">4</field>
</record>
<record id="config_application_reminder_2_days" model="ir.config_parameter">
<field name="key">fusion_claims.application_reminder_2_days</field>
<field name="value">4</field>
</record>
<!-- AI Settings -->
<record id="config_ai_model" model="ir.config_parameter">
<field name="key">fusion_claims.ai_model</field>
<field name="value">gpt-4o-mini</field>
</record>
<record id="config_auto_parse_xml" model="ir.config_parameter">
<field name="key">fusion_claims.auto_parse_xml</field>
<field name="value">True</field>
</record>
<!-- Field Mappings (defaults for fresh installs) -->
<record id="config_field_sale_type" model="ir.config_parameter">
<field name="key">fusion_claims.field_sale_type</field>
<field name="value">x_fc_sale_type</field>
</record>
<record id="config_field_so_client_type" model="ir.config_parameter">
<field name="key">fusion_claims.field_so_client_type</field>
<field name="value">x_fc_client_type</field>
</record>
<record id="config_field_so_authorizer" model="ir.config_parameter">
<field name="key">fusion_claims.field_so_authorizer</field>
<field name="value">x_fc_authorizer_id</field>
</record>
<record id="config_field_invoice_type" model="ir.config_parameter">
<field name="key">fusion_claims.field_invoice_type</field>
<field name="value">x_fc_invoice_type</field>
</record>
<record id="config_field_inv_client_type" model="ir.config_parameter">
<field name="key">fusion_claims.field_inv_client_type</field>
<field name="value">x_fc_client_type</field>
</record>
<record id="config_field_inv_authorizer" model="ir.config_parameter">
<field name="key">fusion_claims.field_inv_authorizer</field>
<field name="value">x_fc_authorizer_id</field>
</record>
<record id="config_field_product_code" model="ir.config_parameter">
<field name="key">fusion_claims.field_product_code</field>
<field name="value">x_fc_adp_device_code</field>
</record>
<record id="config_field_sol_serial" model="ir.config_parameter">
<field name="key">fusion_claims.field_sol_serial</field>
<field name="value">x_fc_serial_number</field>
</record>
<record id="config_field_aml_serial" model="ir.config_parameter">
<field name="key">fusion_claims.field_aml_serial</field>
<field name="value">x_fc_serial_number</field>
</record>
<!-- March of Dimes -->
<record id="config_mod_default_email" model="ir.config_parameter">
<field name="key">fusion_claims.mod_default_email</field>
<field name="value">hvmp@marchofdimes.ca</field>
</record>
<!-- Twilio SMS -->
<record id="config_twilio_enabled" model="ir.config_parameter">
<field name="key">fusion_claims.twilio_enabled</field>
<field name="value">False</field>
</record>
<record id="config_twilio_account_sid" model="ir.config_parameter">
<field name="key">fusion_claims.twilio_account_sid</field>
<field name="value"></field>
</record>
<record id="config_twilio_auth_token" model="ir.config_parameter">
<field name="key">fusion_claims.twilio_auth_token</field>
<field name="value"></field>
</record>
<record id="config_twilio_phone_number" model="ir.config_parameter">
<field name="key">fusion_claims.twilio_phone_number</field>
<field name="value"></field>
</record>
<!-- MOD Follow-up Settings -->
<record id="config_mod_followup_interval" model="ir.config_parameter">
<field name="key">fusion_claims.mod_followup_interval_days</field>
<field name="value">14</field>
</record>
<record id="config_mod_followup_escalation" model="ir.config_parameter">
<field name="key">fusion_claims.mod_followup_escalation_days</field>
<field name="value">3</field>
</record>
<!-- Hard cap on auto follow-up emails per order per 30-day window. -->
<record id="config_mod_followup_max_per_month" model="ir.config_parameter">
<field name="key">fusion_claims.mod_followup_max_per_month</field>
<field name="value">2</field>
</record>
<record id="config_mod_followup_window_days" model="ir.config_parameter">
<field name="key">fusion_claims.mod_followup_window_days</field>
<field name="value">30</field>
</record>
<!-- Per-cron-run throttle so a backlog of stale MOD cases cannot
blast 30+ emails in one minute. Remaining orders roll over to
the next day's cron run. -->
<record id="config_mod_followup_max_per_cron_run" model="ir.config_parameter">
<field name="key">fusion_claims.mod_followup_max_per_cron_run</field>
<field name="value">10</field>
</record>
<!-- ODSP Settings -->
<record id="config_sa_mobility_email" model="ir.config_parameter">
<field name="key">fusion_claims.sa_mobility_email</field>
<field name="value">samobility@ontario.ca</field>
</record>
<record id="config_sa_mobility_phone" model="ir.config_parameter">
<field name="key">fusion_claims.sa_mobility_phone</field>
<field name="value">1-888-222-5099</field>
</record>
</data>
</odoo>