Reworks the March of Dimes workflow to match reality: the OT does their own disability assessment and provides the VOD letter; our accessibility specialist then visits to produce the proposal/drawings/quote; and the application can be submitted by us (internal), the client, or the authorizer themselves. The old workflow flattened all this into one assessment state with a dead-end funding_denied and no document tracking. Data model (13 new sale.order fields): - 5 new document binaries + filenames: VOD letter, Application Form (filled), Notice of Assessment, Property Tax, Proposal Document - x_fc_mod_submitted_by Selection (internal/client/authorizer) - x_fc_mod_handoff_date, x_fc_mod_vod_requested_date - x_fc_mod_accessibility_specialist_id (m2o res.partner — internal or external) - x_fc_mod_previous_status_before_hold (for proper resume) - x_fc_mod_funding_denial_reason (captured via wizard) Settings (4 res.company fields + res_config_settings mirrors): - x_fc_mod_application_form (blank) + filename - x_fc_mod_vod_form (blank) + filename - x_fc_mod_followup_assignee_mode (office_contact / sales_rep) - x_fc_mod_followup_office_contact_id res.partner: added 'accessibility_specialist' to x_fc_contact_type. State machine: - New state handoff_to_client between quote_submitted and awaiting_funding, used for paths B/C (client or authorizer submits themselves) - Fixed action_mod_on_hold to save x_fc_mod_previous_status_before_hold - Fixed action_mod_resume to restore previous status (was hardcoded to in_production, losing context for cases held earlier) 4 new wizards: - mod_submission_path_wizard — chooses submitted_by, auto-fires VOD request email on first switch to 'internal' - mod_funding_denied_wizard — captures denial category + reason - mod_resubmit_wizard — revises + resubmits denied cases (with optional doc clearing) - mod_submission_confirmed_wizard — records client/authorizer confirmed submission, advances to awaiting_funding 8 new action methods: - action_mod_set_submission_path, action_mod_request_vod, action_mod_handoff_to_client (validates docs, fires handoff email), action_mod_confirmed_submission, action_mod_resubmit_from_denied, action_mod_cancel_from_denied, action_mod_reopen_cancelled - action_mod_funding_denied now opens the denial wizard 3 new email methods + 2 existing fixes: - _send_mod_vod_request_email — auto-attaches blank VOD form from company settings, sent to authorizer when we are handling submission - _send_mod_handoff_email — two templates (client vs authorizer), attaches proposal + drawing + blank MOD Application Form - _mod_company_attachment helper for building attachments from company Binary - Fixed _send_mod_assessment_completed_email to include authorizer - Fixed _send_mod_pod_submitted_email to include client New cron: - _cron_mod_handoff_followup (daily 09:00) — creates mail.activity for office to confirm MOD submission. Assignee via company setting (office contact or sales rep). Uses existing rolling-window cap (2/month per order). Views: - sale_order form: new status-bar buttons (set path, request VOD, handoff, confirm, resubmit, cancel, reopen), new document section in MOD Documents tab with submission-path tracking, denial details, hold history - res_config_settings: new MOD blank forms upload + assignee config Deployed to odoo-westin (westin-v19) and odoo-mobility (mobility). Pre-deploy FK cleanup from earlier session means mobility updated cleanly without workaround. HTTP 200 on both, cron verified active, all new fields present.
173 lines
9.1 KiB
XML
173 lines
9.1 KiB
XML
<?xml version="1.0" encoding="UTF-8"?>
|
|
<!--
|
|
Copyright 2024-2025 Nexa Systems Inc.
|
|
License OPL-1 (Odoo Proprietary License v1.0)
|
|
Part of the Fusion Claim Assistant product family.
|
|
-->
|
|
<odoo>
|
|
<data>
|
|
<!-- Cron Job: Renew ADP Delivery Reminders -->
|
|
<record id="ir_cron_renew_delivery_reminders" model="ir.cron">
|
|
<field name="name">Fusion Claims: Renew Delivery Reminders</field>
|
|
<field name="model_id" ref="sale.model_sale_order"/>
|
|
<field name="state">code</field>
|
|
<field name="code">model._cron_renew_delivery_reminders()</field>
|
|
<field name="interval_number">1</field>
|
|
<field name="interval_type">days</field>
|
|
<field name="active">True</field>
|
|
</record>
|
|
|
|
<!-- Cron Job: Renew ADP Billing Reminders -->
|
|
<record id="ir_cron_renew_billing_reminders" model="ir.cron">
|
|
<field name="name">Fusion Claims: Renew Billing Reminders</field>
|
|
<field name="model_id" ref="account.model_account_move"/>
|
|
<field name="state">code</field>
|
|
<field name="code">model._cron_renew_billing_reminders()</field>
|
|
<field name="interval_number">1</field>
|
|
<field name="interval_type">days</field>
|
|
<field name="active">True</field>
|
|
</record>
|
|
|
|
<!-- Cron Job: Renew ADP Correction Reminders -->
|
|
<record id="ir_cron_renew_correction_reminders" model="ir.cron">
|
|
<field name="name">Fusion Claims: Renew Correction Reminders</field>
|
|
<field name="model_id" ref="account.model_account_move"/>
|
|
<field name="state">code</field>
|
|
<field name="code">model._cron_renew_correction_reminders()</field>
|
|
<field name="interval_number">1</field>
|
|
<field name="interval_type">days</field>
|
|
<field name="active">True</field>
|
|
</record>
|
|
|
|
<!-- Cron Job: Auto-Close Cases (1 month after billed) -->
|
|
<record id="ir_cron_auto_close_cases" model="ir.cron">
|
|
<field name="name">Fusion Claims: Auto-Close Billed Cases</field>
|
|
<field name="model_id" ref="sale.model_sale_order"/>
|
|
<field name="state">code</field>
|
|
<field name="code">model._cron_auto_close_billed_cases()</field>
|
|
<field name="interval_number">1</field>
|
|
<field name="interval_type">days</field>
|
|
<field name="active">True</field>
|
|
</record>
|
|
|
|
<!-- Cron Job: Auto-Close ODSP Cases (7 days after payment received) -->
|
|
<record id="ir_cron_auto_close_odsp_paid" model="ir.cron">
|
|
<field name="name">Fusion Claims: Auto-Close ODSP Paid Cases</field>
|
|
<field name="model_id" ref="sale.model_sale_order"/>
|
|
<field name="state">code</field>
|
|
<field name="code">model._cron_auto_close_odsp_paid_cases()</field>
|
|
<field name="interval_number">1</field>
|
|
<field name="interval_type">days</field>
|
|
<field name="active">True</field>
|
|
</record>
|
|
|
|
<!-- Cron Job: Send Application Reminder Emails (4 days after assessment) -->
|
|
<record id="ir_cron_application_reminder" model="ir.cron">
|
|
<field name="name">Fusion Claims: First Application Reminder</field>
|
|
<field name="model_id" ref="sale.model_sale_order"/>
|
|
<field name="state">code</field>
|
|
<field name="code">model._cron_send_application_reminders()</field>
|
|
<field name="interval_number">1</field>
|
|
<field name="interval_type">days</field>
|
|
<field name="active">True</field>
|
|
<field name="nextcall" eval="DateTime.now().replace(hour=9, minute=0, second=0)"/>
|
|
</record>
|
|
|
|
<!-- Cron Job: Send Second Application Reminder Emails (X days after first reminder) -->
|
|
<record id="ir_cron_application_reminder_2" model="ir.cron">
|
|
<field name="name">Fusion Claims: Second Application Reminder</field>
|
|
<field name="model_id" ref="sale.model_sale_order"/>
|
|
<field name="state">code</field>
|
|
<field name="code">model._cron_send_application_reminders_2()</field>
|
|
<field name="interval_number">1</field>
|
|
<field name="interval_type">days</field>
|
|
<field name="active">True</field>
|
|
<field name="nextcall" eval="DateTime.now().replace(hour=9, minute=0, second=0)"/>
|
|
</record>
|
|
|
|
<!-- Cron Job: Acceptance Reminder Emails (next business day after submission) -->
|
|
<record id="ir_cron_acceptance_reminder" model="ir.cron">
|
|
<field name="name">Fusion Claims: Acceptance Reminder Emails</field>
|
|
<field name="model_id" ref="sale.model_sale_order"/>
|
|
<field name="state">code</field>
|
|
<field name="code">model._cron_send_acceptance_reminders()</field>
|
|
<field name="interval_number">1</field>
|
|
<field name="interval_type">days</field>
|
|
<field name="active">True</field>
|
|
<field name="nextcall" eval="DateTime.now().replace(hour=9, minute=0, second=0)"/>
|
|
</record>
|
|
|
|
<!-- Cron Job: Loaner Equipment Reminders - moved to separate file after views -->
|
|
<!-- Will be added via ir_cron_loaner_data.xml -->
|
|
|
|
<!-- Cron Job: MOD Bi-weekly Follow-up Scheduler -->
|
|
<record id="ir_cron_mod_followup_scheduler" model="ir.cron">
|
|
<field name="name">Fusion Claims: MOD Follow-up Scheduler</field>
|
|
<field name="model_id" ref="sale.model_sale_order"/>
|
|
<field name="state">code</field>
|
|
<field name="code">model._cron_mod_schedule_followups()</field>
|
|
<field name="interval_number">1</field>
|
|
<field name="interval_type">days</field>
|
|
<field name="active">True</field>
|
|
<field name="nextcall" eval="DateTime.now().replace(hour=8, minute=0, second=0)"/>
|
|
</record>
|
|
|
|
<!-- Cron Job: MOD Follow-up Escalation (auto-email when activity overdue) -->
|
|
<record id="ir_cron_mod_followup_escalation" model="ir.cron">
|
|
<field name="name">Fusion Claims: MOD Follow-up Escalation</field>
|
|
<field name="model_id" ref="sale.model_sale_order"/>
|
|
<field name="state">code</field>
|
|
<field name="code">model._cron_mod_escalate_followups()</field>
|
|
<field name="interval_number">1</field>
|
|
<field name="interval_type">days</field>
|
|
<field name="active">True</field>
|
|
<field name="nextcall" eval="DateTime.now().replace(hour=10, minute=0, second=0)"/>
|
|
</record>
|
|
|
|
<!-- Cron Job: Expire Old Page 11 Signing Requests -->
|
|
<record id="ir_cron_expire_page11_requests" model="ir.cron">
|
|
<field name="name">Fusion Claims: Expire Page 11 Signing Requests</field>
|
|
<field name="model_id" ref="model_fusion_page11_sign_request"/>
|
|
<field name="state">code</field>
|
|
<field name="code">model._cron_expire_requests()</field>
|
|
<field name="interval_number">1</field>
|
|
<field name="interval_type">days</field>
|
|
<field name="active">True</field>
|
|
<field name="nextcall" eval="DateTime.now().replace(hour=2, minute=0, second=0)"/>
|
|
</record>
|
|
|
|
<!-- Cron Job: MOD Handoff Follow-up (2026-04 update)
|
|
Creates a mail.activity for the office to call the client or
|
|
authorizer to confirm they have submitted the MOD application.
|
|
Uses the rolling-window cap (shared with existing MOD follow-up)
|
|
so activities are spaced out, max 2 per 30-day window per order. -->
|
|
<record id="ir_cron_mod_handoff_followup" model="ir.cron">
|
|
<field name="name">Fusion Claims: MOD Handoff Follow-up</field>
|
|
<field name="model_id" ref="sale.model_sale_order"/>
|
|
<field name="state">code</field>
|
|
<field name="code">model._cron_mod_handoff_followup()</field>
|
|
<field name="interval_number">1</field>
|
|
<field name="interval_type">days</field>
|
|
<field name="active">True</field>
|
|
<field name="nextcall" eval="DateTime.now().replace(hour=9, minute=0, second=0)"/>
|
|
</record>
|
|
|
|
<!-- Cron Job: ADP 12-month auto-expire for approved applications.
|
|
Approved / approved_deduction orders past the configured funding
|
|
window (fusion_claims.adp_approval_expiry_months, default 12 months)
|
|
are auto-transitioned to 'expired'. Users can reopen via the
|
|
"Reopen Expired" button on the order form. -->
|
|
<record id="ir_cron_adp_expire_approved" model="ir.cron">
|
|
<field name="name">Fusion Claims: ADP Expire Approved Applications</field>
|
|
<field name="model_id" ref="sale.model_sale_order"/>
|
|
<field name="state">code</field>
|
|
<field name="code">model._cron_adp_expire_approved()</field>
|
|
<field name="interval_number">1</field>
|
|
<field name="interval_type">days</field>
|
|
<field name="active">True</field>
|
|
<field name="nextcall" eval="DateTime.now().replace(hour=3, minute=0, second=0)"/>
|
|
</record>
|
|
|
|
</data>
|
|
</odoo>
|