Initial commit

This commit is contained in:
gsinghpal
2026-02-22 01:22:18 -05:00
commit 5200d5baf0
2394 changed files with 386834 additions and 0 deletions

View File

@@ -0,0 +1,93 @@
<?xml version="1.0" encoding="utf-8"?>
<odoo>
<!-- ================================================================= -->
<!-- AI TOOLS: Server Actions for Client Data Queries (MUST BE FIRST) -->
<!-- ================================================================= -->
<!-- Tool 1: Search Client Profiles -->
<record id="ai_tool_search_clients" model="ir.actions.server">
<field name="name">Fusion: Search Client Profiles</field>
<field name="state">code</field>
<field name="use_in_ai" eval="True"/>
<field name="model_id" ref="ai.model_ai_agent"/>
<field name="code">
ai['result'] = record._fc_tool_search_clients(search_term, city_filter, condition_filter)
</field>
<field name="ai_tool_description">Search for client profiles in Fusion Claims. Can search by name, health card number, city, or medical condition. Returns matching profiles with basic info and financial summaries.</field>
<field name="ai_tool_schema">{"type": "object", "properties": {"search_term": {"type": "string", "description": "Search term to match against name, health card number, or city"}, "city_filter": {"type": "string", "description": "Filter by city name"}, "condition_filter": {"type": "string", "description": "Filter by medical condition (e.g., CVA, diabetes)"}}, "required": []}</field>
</record>
<!-- Tool 2: Get Client Details -->
<record id="ai_tool_client_details" model="ir.actions.server">
<field name="name">Fusion: Get Client Details</field>
<field name="state">code</field>
<field name="use_in_ai" eval="True"/>
<field name="model_id" ref="ai.model_ai_agent"/>
<field name="code">
ai['result'] = record._fc_tool_client_details(profile_id)
</field>
<field name="ai_tool_description">Get detailed information about a specific client profile including personal info, medical status, benefits, claims history, and ADP application history. Requires profile_id from a previous search.</field>
<field name="ai_tool_schema">{"type": "object", "properties": {"profile_id": {"type": "number", "description": "ID of the client profile to get details for"}}, "required": ["profile_id"]}</field>
</record>
<!-- Tool 3: Get Aggregated Stats -->
<record id="ai_tool_client_stats" model="ir.actions.server">
<field name="name">Fusion: Get Claims Statistics</field>
<field name="state">code</field>
<field name="use_in_ai" eval="True"/>
<field name="model_id" ref="ai.model_ai_agent"/>
<field name="code">
ai['result'] = record._fc_tool_claims_stats()
</field>
<field name="ai_tool_description">Get aggregated statistics about Fusion Claims data: total profiles, total orders, breakdown by sale type, breakdown by workflow status, and top cities by client count. No parameters needed.</field>
<field name="ai_tool_schema">{"type": "object", "properties": {}, "required": []}</field>
</record>
<!-- ================================================================= -->
<!-- AI TOPIC (references tools above) -->
<!-- ================================================================= -->
<record id="ai_topic_client_intelligence" model="ai.topic">
<field name="name">Fusion Claims Client Intelligence</field>
<field name="description">Query client profiles, ADP claims, funding history, medical conditions, and device information.</field>
<field name="instructions">You help users find information about ADP clients, claims, medical conditions, devices, and funding history. Use the Fusion search/details/stats tools to query data.</field>
<field name="tool_ids" eval="[(6, 0, [
ref('fusion_claims.ai_tool_search_clients'),
ref('fusion_claims.ai_tool_client_details'),
ref('fusion_claims.ai_tool_client_stats'),
])]"/>
</record>
<!-- ================================================================= -->
<!-- AI AGENT (references topic above) -->
<!-- ================================================================= -->
<record id="ai_agent_fusion_claims" model="ai.agent">
<field name="name">Fusion Claims Intelligence</field>
<field name="subtitle">Ask about clients, ADP claims, funding history, medical conditions, and devices.</field>
<field name="llm_model">gpt-4.1</field>
<field name="response_style">analytical</field>
<field name="restrict_to_sources" eval="False"/>
<field name="system_prompt">You are Fusion Claims Intelligence, an AI assistant for ADP claims management.
You help staff find information about clients, medical conditions, mobility devices, funding history, and claim status.
Capabilities:
1. Search client profiles by name, health card number, city, or medical condition
2. Get detailed client information including claims history and ADP applications
3. Provide aggregated statistics about claims, funding types, and demographics
Response guidelines:
- Be concise and data-driven
- Format monetary values with $ and commas
- Include key identifiers (name, health card, city) when listing clients
- Include order number, status, and amounts when discussing claims
- If asked about a specific client, search first, then get details
- Always provide the profile ID for record lookup
Key terminology:
- ADP = Assistive Devices Program (Ontario government)
- Client Type REG = Regular (75% ADP / 25% Client), ODS/OWP/ACS = 100% ADP
- Sale Types: ADP, ODSP, WSIB, Insurance, March of Dimes, Muscular Dystrophy, Hardship Funding
- Sections: 2a = Walkers, 2b = Manual Wheelchairs, 2c = Power Bases/Scooters, 2d = Seating</field>
<field name="topic_ids" eval="[(6, 0, [ref('ai_topic_client_intelligence')])]"/>
</record>
</odoo>

File diff suppressed because it is too large Load Diff

View File

@@ -0,0 +1,30 @@
<?xml version="1.0" encoding="utf-8"?>
<odoo>
<!-- Server Action: Sync ADP Fields to Invoices -->
<!-- This appears in the Action menu on Sale Orders -->
<record id="action_sync_adp_fields_server" model="ir.actions.server">
<field name="name">Sync to Invoices</field>
<field name="model_id" ref="sale.model_sale_order"/>
<field name="binding_model_id" ref="sale.model_sale_order"/>
<field name="binding_view_types">form,list</field>
<field name="state">code</field>
<field name="code">
if records:
# Filter to only ADP sales
adp_records = records.filtered(lambda r: r.x_fc_is_adp_sale and r.state == 'sale')
if adp_records:
action = adp_records.action_sync_adp_fields()
else:
action = {
'type': 'ir.actions.client',
'tag': 'display_notification',
'params': {
'title': 'No ADP Sales',
'message': 'Selected orders are not confirmed ADP sales.',
'type': 'warning',
'sticky': False,
}
}
</field>
</record>
</odoo>

View File

@@ -0,0 +1,151 @@
<?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>
<!-- Technician / Field Service -->
<record id="config_store_open_hour" model="ir.config_parameter">
<field name="key">fusion_claims.store_open_hour</field>
<field name="value">9.0</field>
</record>
<record id="config_store_close_hour" model="ir.config_parameter">
<field name="key">fusion_claims.store_close_hour</field>
<field name="value">18.0</field>
</record>
<!-- Push Notifications -->
<record id="config_push_enabled" model="ir.config_parameter">
<field name="key">fusion_claims.push_enabled</field>
<field name="value">False</field>
</record>
<record id="config_push_advance_minutes" model="ir.config_parameter">
<field name="key">fusion_claims.push_advance_minutes</field>
<field name="value">30</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>
<!-- 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>

View File

@@ -0,0 +1,160 @@
<?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: Sync ADP Fields from Sale Orders to Invoices -->
<record id="ir_cron_sync_adp_fields" model="ir.cron">
<field name="name">Fusion Claims: Sync ADP Fields</field>
<field name="model_id" ref="sale.model_sale_order"/>
<field name="state">code</field>
<field name="code">model._cron_sync_adp_fields()</field>
<field name="interval_number">1</field>
<field name="interval_type">hours</field>
</record>
<!-- 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: Calculate Travel Times for Technician Tasks -->
<record id="ir_cron_technician_travel_times" model="ir.cron">
<field name="name">Fusion Claims: Calculate Technician Travel Times</field>
<field name="model_id" ref="model_fusion_technician_task"/>
<field name="state">code</field>
<field name="code">model._cron_calculate_travel_times()</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=5, minute=0, second=0)"/>
</record>
<!-- Cron Job: Send Push Notifications for Upcoming Tasks -->
<record id="ir_cron_technician_push_notifications" model="ir.cron">
<field name="name">Fusion Claims: Technician Push Notifications</field>
<field name="model_id" ref="model_fusion_technician_task"/>
<field name="state">code</field>
<field name="code">model._cron_send_push_notifications()</field>
<field name="interval_number">15</field>
<field name="interval_type">minutes</field>
<field name="active">True</field>
</record>
</data>
</odoo>

View File

@@ -0,0 +1,55 @@
<?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>
<!-- ADP Delivery Reminder Activity Type -->
<record id="mail_activity_type_adp_delivery" model="mail.activity.type">
<field name="name">ADP Delivery Reminder</field>
<field name="summary">Complete delivery for ADP billing</field>
<field name="icon">fa-truck</field>
<field name="delay_count">0</field>
<field name="delay_unit">days</field>
<field name="res_model">sale.order</field>
<field name="category">default</field>
<field name="decoration_type">warning</field>
</record>
<!-- ADP Billing Deadline Activity Type -->
<record id="mail_activity_type_adp_billing" model="mail.activity.type">
<field name="name">ADP Billing Deadline</field>
<field name="summary">Complete ADP billing by Wednesday 6 PM</field>
<field name="icon">fa-file-invoice-dollar</field>
<field name="delay_count">0</field>
<field name="delay_unit">days</field>
<field name="res_model">account.move</field>
<field name="category">default</field>
<field name="decoration_type">warning</field>
</record>
<!-- ADP Correction Required Activity Type -->
<record id="mail_activity_type_adp_correction" model="mail.activity.type">
<field name="name">ADP Correction Required</field>
<field name="summary">Invoice needs correction and resubmission</field>
<field name="icon">fa-exclamation-triangle</field>
<field name="delay_count">0</field>
<field name="delay_unit">days</field>
<field name="res_model">account.move</field>
<field name="category">default</field>
<field name="decoration_type">danger</field>
</record>
<!-- MOD Follow-up Call Activity Type -->
<record id="mail_activity_type_mod_followup" model="mail.activity.type">
<field name="name">MOD Follow-up Call</field>
<field name="summary">Call client for March of Dimes case update</field>
<field name="icon">fa-phone</field>
<field name="delay_count">14</field>
<field name="delay_unit">days</field>
<field name="res_model">sale.order</field>
<field name="category">default</field>
<field name="decoration_type">warning</field>
</record>
</odoo>

View File

@@ -0,0 +1,203 @@
<?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.
Email templates for ADP sales with landscape reports.
Design: Professional, dark/light mode safe, anti-spam friendly.
-->
<odoo>
<data noupdate="1">
<!-- =============================================================== -->
<!-- ADP Quotation Email Template (Landscape Report) -->
<!-- =============================================================== -->
<record id="email_template_adp_quotation" model="mail.template">
<field name="name">ADP: Send Quotation (Landscape)</field>
<field name="model_id" ref="sale.model_sale_order"/>
<field name="subject">{{ object.company_id.name }} - Quotation {{ object.name or 'n/a' }}</field>
<field name="email_from">{{ (object.user_id.email_formatted or object.company_id.email_formatted or user.email_formatted) }}</field>
<field name="partner_to">{{ object.partner_id.id }}</field>
<field name="body_html" type="html">
<div style="font-family:-apple-system,BlinkMacSystemFont,'Segoe UI',Roboto,Arial,sans-serif;max-width:600px;margin:0 auto;color:#2d3748;">
<div style="height:4px;background-color:#2B6CB0;"></div>
<div style="background:#ffffff;padding:32px 28px;border:1px solid #e2e8f0;border-top:none;">
<p style="color:#2B6CB0;font-size:13px;font-weight:600;letter-spacing:0.5px;text-transform:uppercase;margin:0 0 24px 0;">
<t t-out="object.company_id.name"/>
</p>
<h2 style="color:#1a202c;font-size:22px;font-weight:700;margin:0 0 6px 0;line-height:1.3;">ADP Quotation</h2>
<p style="color:#718096;font-size:15px;line-height:1.5;margin:0 0 24px 0;">
Please find attached your quotation <strong style="color:#2d3748;"><t t-out="object.name"/></strong>.
</p>
<table style="width:100%;border-collapse:collapse;margin:0 0 24px 0;">
<tr><td colspan="2" style="padding:10px 14px;font-size:12px;font-weight:600;color:#718096;text-transform:uppercase;letter-spacing:0.5px;border-bottom:2px solid #e2e8f0;">Quotation Details</td></tr>
<tr><td style="padding:10px 14px;color:#718096;font-size:14px;border-bottom:1px solid #f0f0f0;width:35%;">Reference</td><td style="padding:10px 14px;color:#2d3748;font-size:14px;border-bottom:1px solid #f0f0f0;"><t t-out="object.name"/></td></tr>
<tr><td style="padding:10px 14px;color:#718096;font-size:14px;border-bottom:1px solid #f0f0f0;">Date</td><td style="padding:10px 14px;color:#2d3748;font-size:14px;border-bottom:1px solid #f0f0f0;"><t t-out="object.date_order" t-options="{'widget': 'date'}"/></td></tr>
<t t-if="object.x_fc_authorizer_id">
<tr><td style="padding:10px 14px;color:#718096;font-size:14px;border-bottom:1px solid #f0f0f0;">Authorizer</td><td style="padding:10px 14px;color:#2d3748;font-size:14px;border-bottom:1px solid #f0f0f0;"><t t-out="object.x_fc_authorizer_id.name"/></td></tr>
</t>
<t t-if="object.x_fc_client_type == 'REG'">
<tr><td style="padding:10px 14px;color:#718096;font-size:14px;border-bottom:1px solid #f0f0f0;">Client Portion (25%)</td><td style="padding:10px 14px;color:#2d3748;font-size:14px;border-bottom:1px solid #f0f0f0;"><t t-out="object.x_fc_client_portion_total" t-options="{'widget': 'monetary', 'display_currency': object.currency_id}"/></td></tr>
<tr><td style="padding:10px 14px;color:#718096;font-size:14px;border-bottom:1px solid #f0f0f0;">ADP Portion (75%)</td><td style="padding:10px 14px;color:#2d3748;font-size:14px;border-bottom:1px solid #f0f0f0;"><t t-out="object.x_fc_adp_portion_total" t-options="{'widget': 'monetary', 'display_currency': object.currency_id}"/></td></tr>
</t>
<tr><td style="padding:10px 14px;color:#718096;font-size:14px;font-weight:600;border-top:2px solid #e2e8f0;">Total</td><td style="padding:10px 14px;color:#2B6CB0;font-size:14px;font-weight:700;border-top:2px solid #e2e8f0;"><t t-out="object.amount_total" t-options="{'widget': 'monetary', 'display_currency': object.currency_id}"/></td></tr>
</table>
<div style="padding:10px 14px;border:1px dashed #e2e8f0;border-radius:6px;margin:0 0 24px 0;">
<p style="margin:0;font-size:13px;color:#718096;"><strong style="color:#2d3748;">Attached:</strong> ADP Quotation (PDF)</p>
</div>
<div style="border-left:3px solid #2B6CB0;padding:12px 16px;margin:0 0 24px 0;background:#f7fafc;">
<p style="margin:0;font-size:14px;line-height:1.5;color:#2d3748;">Please review the attached quotation. If you have any questions or need assistance, do not hesitate to contact us.</p>
</div>
<p style="color:#2d3748;font-size:14px;line-height:1.6;margin:24px 0 0 0;">
Best regards,<br/>
<strong><t t-out="object.user_id.name or object.company_id.name"/></strong><br/>
<span style="color:#718096;"><t t-out="object.company_id.name"/></span>
</p>
</div>
<div style="padding:16px 28px;text-align:center;">
<p style="color:#a0aec0;font-size:11px;line-height:1.5;margin:0;">
<t t-out="object.company_id.name"/>
<t t-if="object.company_id.phone"> · <t t-out="object.company_id.phone"/></t>
<t t-if="object.company_id.email"> · <t t-out="object.company_id.email"/></t><br/>
This is an automated notification from the ADP Claims Management System.
</p>
</div>
</div>
</field>
<field name="lang">{{ object.partner_id.lang }}</field>
<field name="auto_delete" eval="True"/>
<field name="report_template_ids" eval="[(4, ref('fusion_claims.action_report_saleorder_landscape'))]"/>
</record>
<!-- =============================================================== -->
<!-- ADP Sales Order Confirmation Email Template -->
<!-- =============================================================== -->
<record id="email_template_adp_sales_order" model="mail.template">
<field name="name">ADP: Sales Order Confirmation (Landscape)</field>
<field name="model_id" ref="sale.model_sale_order"/>
<field name="subject">{{ object.company_id.name }} - Order Confirmation {{ object.name or 'n/a' }}</field>
<field name="email_from">{{ (object.user_id.email_formatted or object.company_id.email_formatted or user.email_formatted) }}</field>
<field name="partner_to">{{ object.partner_id.id }}</field>
<field name="body_html" type="html">
<div style="font-family:-apple-system,BlinkMacSystemFont,'Segoe UI',Roboto,Arial,sans-serif;max-width:600px;margin:0 auto;color:#2d3748;">
<div style="height:4px;background-color:#38a169;"></div>
<div style="background:#ffffff;padding:32px 28px;border:1px solid #e2e8f0;border-top:none;">
<p style="color:#38a169;font-size:13px;font-weight:600;letter-spacing:0.5px;text-transform:uppercase;margin:0 0 24px 0;">
<t t-out="object.company_id.name"/>
</p>
<h2 style="color:#1a202c;font-size:22px;font-weight:700;margin:0 0 6px 0;line-height:1.3;">Order Confirmed</h2>
<p style="color:#718096;font-size:15px;line-height:1.5;margin:0 0 24px 0;">
Your ADP sales order <strong style="color:#2d3748;"><t t-out="object.name"/></strong> has been confirmed.
</p>
<table style="width:100%;border-collapse:collapse;margin:0 0 24px 0;">
<tr><td colspan="2" style="padding:10px 14px;font-size:12px;font-weight:600;color:#718096;text-transform:uppercase;letter-spacing:0.5px;border-bottom:2px solid #e2e8f0;">Order Details</td></tr>
<tr><td style="padding:10px 14px;color:#718096;font-size:14px;border-bottom:1px solid #f0f0f0;width:35%;">Reference</td><td style="padding:10px 14px;color:#2d3748;font-size:14px;border-bottom:1px solid #f0f0f0;"><t t-out="object.name"/></td></tr>
<tr><td style="padding:10px 14px;color:#718096;font-size:14px;border-bottom:1px solid #f0f0f0;">Date</td><td style="padding:10px 14px;color:#2d3748;font-size:14px;border-bottom:1px solid #f0f0f0;"><t t-out="object.date_order" t-options="{'widget': 'date'}"/></td></tr>
<t t-if="object.x_fc_authorizer_id">
<tr><td style="padding:10px 14px;color:#718096;font-size:14px;border-bottom:1px solid #f0f0f0;">Authorizer</td><td style="padding:10px 14px;color:#2d3748;font-size:14px;border-bottom:1px solid #f0f0f0;"><t t-out="object.x_fc_authorizer_id.name"/></td></tr>
</t>
<t t-if="object.x_fc_client_type == 'REG'">
<tr><td style="padding:10px 14px;color:#718096;font-size:14px;border-bottom:1px solid #f0f0f0;">Client Portion (25%)</td><td style="padding:10px 14px;color:#2d3748;font-size:14px;border-bottom:1px solid #f0f0f0;"><t t-out="object.x_fc_client_portion_total" t-options="{'widget': 'monetary', 'display_currency': object.currency_id}"/></td></tr>
<tr><td style="padding:10px 14px;color:#718096;font-size:14px;border-bottom:1px solid #f0f0f0;">ADP Portion (75%)</td><td style="padding:10px 14px;color:#2d3748;font-size:14px;border-bottom:1px solid #f0f0f0;"><t t-out="object.x_fc_adp_portion_total" t-options="{'widget': 'monetary', 'display_currency': object.currency_id}"/></td></tr>
</t>
<tr><td style="padding:10px 14px;color:#718096;font-size:14px;font-weight:600;border-top:2px solid #e2e8f0;">Total</td><td style="padding:10px 14px;color:#38a169;font-size:14px;font-weight:700;border-top:2px solid #e2e8f0;"><t t-out="object.amount_total" t-options="{'widget': 'monetary', 'display_currency': object.currency_id}"/></td></tr>
</table>
<div style="padding:10px 14px;border:1px dashed #e2e8f0;border-radius:6px;margin:0 0 24px 0;">
<p style="margin:0;font-size:13px;color:#718096;"><strong style="color:#2d3748;">Attached:</strong> Sales Order Confirmation (PDF)</p>
</div>
<div style="border-left:3px solid #38a169;padding:12px 16px;margin:0 0 24px 0;background:#f7fafc;">
<p style="margin:0;font-size:14px;line-height:1.5;color:#2d3748;">Your order is being processed. We will keep you updated on the delivery status and any updates from the Assistive Devices Program.</p>
</div>
<p style="color:#2d3748;font-size:14px;line-height:1.6;margin:24px 0 0 0;">
Best regards,<br/>
<strong><t t-out="object.user_id.name or object.company_id.name"/></strong><br/>
<span style="color:#718096;"><t t-out="object.company_id.name"/></span>
</p>
</div>
<div style="padding:16px 28px;text-align:center;">
<p style="color:#a0aec0;font-size:11px;line-height:1.5;margin:0;">
<t t-out="object.company_id.name"/>
<t t-if="object.company_id.phone"> · <t t-out="object.company_id.phone"/></t>
<t t-if="object.company_id.email"> · <t t-out="object.company_id.email"/></t><br/>
This is an automated notification from the ADP Claims Management System.
</p>
</div>
</div>
</field>
<field name="lang">{{ object.partner_id.lang }}</field>
<field name="auto_delete" eval="True"/>
<field name="report_template_ids" eval="[(4, ref('fusion_claims.action_report_saleorder_landscape'))]"/>
</record>
<!-- =============================================================== -->
<!-- ADP Client Invoice Email Template -->
<!-- =============================================================== -->
<record id="email_template_adp_invoice" model="mail.template">
<field name="name">ADP: Send Invoice (Landscape)</field>
<field name="model_id" ref="account.model_account_move"/>
<field name="subject">{{ object.company_id.name }} - Invoice {{ object.name or 'Draft' }}</field>
<field name="email_from">{{ (object.invoice_user_id.email_formatted or object.company_id.email_formatted or user.email_formatted) }}</field>
<field name="partner_to">{{ object.partner_id.id }}</field>
<field name="body_html" type="html">
<div style="font-family:-apple-system,BlinkMacSystemFont,'Segoe UI',Roboto,Arial,sans-serif;max-width:600px;margin:0 auto;color:#2d3748;">
<div style="height:4px;background-color:#2B6CB0;"></div>
<div style="background:#ffffff;padding:32px 28px;border:1px solid #e2e8f0;border-top:none;">
<p style="color:#2B6CB0;font-size:13px;font-weight:600;letter-spacing:0.5px;text-transform:uppercase;margin:0 0 24px 0;">
<t t-out="object.company_id.name"/>
</p>
<h2 style="color:#1a202c;font-size:22px;font-weight:700;margin:0 0 6px 0;line-height:1.3;">Invoice</h2>
<p style="color:#718096;font-size:15px;line-height:1.5;margin:0 0 24px 0;">
Please find attached your invoice <strong style="color:#2d3748;"><t t-out="object.name or 'Draft'"/></strong>.
</p>
<table style="width:100%;border-collapse:collapse;margin:0 0 24px 0;">
<tr><td colspan="2" style="padding:10px 14px;font-size:12px;font-weight:600;color:#718096;text-transform:uppercase;letter-spacing:0.5px;border-bottom:2px solid #e2e8f0;">Invoice Details</td></tr>
<tr><td style="padding:10px 14px;color:#718096;font-size:14px;border-bottom:1px solid #f0f0f0;width:35%;">Invoice</td><td style="padding:10px 14px;color:#2d3748;font-size:14px;border-bottom:1px solid #f0f0f0;"><t t-out="object.name or 'Draft'"/></td></tr>
<tr><td style="padding:10px 14px;color:#718096;font-size:14px;border-bottom:1px solid #f0f0f0;">Date</td><td style="padding:10px 14px;color:#2d3748;font-size:14px;border-bottom:1px solid #f0f0f0;"><t t-out="object.invoice_date" t-options="{'widget': 'date'}"/></td></tr>
<t t-if="object.invoice_date_due">
<tr><td style="padding:10px 14px;color:#718096;font-size:14px;border-bottom:1px solid #f0f0f0;">Due Date</td><td style="padding:10px 14px;color:#2d3748;font-size:14px;border-bottom:1px solid #f0f0f0;"><t t-out="object.invoice_date_due" t-options="{'widget': 'date'}"/></td></tr>
</t>
<t t-if="object.x_fc_adp_invoice_portion">
<tr><td style="padding:10px 14px;color:#718096;font-size:14px;border-bottom:1px solid #f0f0f0;">Type</td><td style="padding:10px 14px;color:#2d3748;font-size:14px;border-bottom:1px solid #f0f0f0;">
<t t-if="object.x_fc_adp_invoice_portion == 'client'">Client Portion</t>
<t t-if="object.x_fc_adp_invoice_portion == 'adp'">ADP Portion</t>
</td></tr>
</t>
<tr><td style="padding:10px 14px;color:#718096;font-size:14px;font-weight:600;border-top:2px solid #e2e8f0;">Amount Due</td><td style="padding:10px 14px;color:#2B6CB0;font-size:14px;font-weight:700;border-top:2px solid #e2e8f0;"><t t-out="object.amount_residual" t-options="{'widget': 'monetary', 'display_currency': object.currency_id}"/></td></tr>
</table>
<div style="padding:10px 14px;border:1px dashed #e2e8f0;border-radius:6px;margin:0 0 24px 0;">
<p style="margin:0;font-size:13px;color:#718096;"><strong style="color:#2d3748;">Attached:</strong> Invoice (PDF)</p>
</div>
<t t-if="object.x_fc_adp_invoice_portion == 'client'">
<div style="border-left:3px solid #2B6CB0;padding:12px 16px;margin:0 0 24px 0;background:#f7fafc;">
<p style="margin:0;font-size:14px;line-height:1.5;color:#2d3748;">This invoice represents your client portion for the ADP-funded equipment. The remaining amount will be billed directly to the Assistive Devices Program.</p>
</div>
</t>
<t t-else="">
<div style="border-left:3px solid #2B6CB0;padding:12px 16px;margin:0 0 24px 0;background:#f7fafc;">
<p style="margin:0;font-size:14px;line-height:1.5;color:#2d3748;">Please review the attached invoice and process payment at your earliest convenience. Contact us if you have any questions.</p>
</div>
</t>
<p style="color:#2d3748;font-size:14px;line-height:1.6;margin:24px 0 0 0;">
Best regards,<br/>
<strong><t t-out="object.invoice_user_id.name or object.company_id.name"/></strong><br/>
<span style="color:#718096;"><t t-out="object.company_id.name"/></span>
</p>
</div>
<div style="padding:16px 28px;text-align:center;">
<p style="color:#a0aec0;font-size:11px;line-height:1.5;margin:0;">
<t t-out="object.company_id.name"/>
<t t-if="object.company_id.phone"> · <t t-out="object.company_id.phone"/></t>
<t t-if="object.company_id.email"> · <t t-out="object.company_id.email"/></t><br/>
This is an automated notification from the ADP Claims Management System.
</p>
</div>
</div>
</field>
<field name="lang">{{ object.partner_id.lang }}</field>
<field name="auto_delete" eval="True"/>
<field name="report_template_ids" eval="[(4, ref('fusion_claims.action_report_invoice_landscape'))]"/>
</record>
</data>
</odoo>

View File

@@ -0,0 +1,18 @@
<?xml version="1.0" encoding="utf-8"?>
<odoo>
<data noupdate="1">
<record id="sa_sig_template_default" model="fusion.sa.signature.template">
<field name="name">SA Mobility Standard</field>
<field name="notes">Default signature positions for SA Mobility approval forms from ODSP.</field>
<field name="sa_default_sig_page">2</field>
<field name="sa_sig_name_x">105</field>
<field name="sa_sig_name_y">97</field>
<field name="sa_sig_date_x">430</field>
<field name="sa_sig_date_y">97</field>
<field name="sa_sig_x">72</field>
<field name="sa_sig_y">72</field>
<field name="sa_sig_w">190</field>
<field name="sa_sig_h">25</field>
</record>
</data>
</odoo>

View File

@@ -0,0 +1,15 @@
<?xml version="1.0" encoding="utf-8"?>
<odoo>
<data noupdate="1">
<record id="product_labor_hourly" model="product.template">
<field name="name">LABOR - CHARGED HOURLY - NON REFUNDABLE</field>
<field name="default_code">LABOR</field>
<field name="type">service</field>
<field name="list_price">75.00</field>
<field name="uom_id" ref="uom.product_uom_hour"/>
<field name="sale_ok" eval="True"/>
<field name="purchase_ok" eval="False"/>
<field name="taxes_id" eval="[(6, 0, [ref('account.1_hst_sale_tax_13')])]"/>
</record>
</data>
</odoo>

View File

@@ -0,0 +1,41 @@
<?xml version="1.0" encoding="UTF-8"?>
<!--
Copyright 2024-2026 Nexa Systems Inc.
License OPL-1 (Odoo Proprietary License v1.0)
Part of the Fusion Claim Assistant product family.
-->
<odoo>
<data noupdate="1">
<!-- Loaner Stock Location -->
<record id="stock_location_loaner" model="stock.location">
<field name="name">Loaner Stock</field>
<field name="usage">internal</field>
<field name="location_id" ref="stock.stock_location_stock"/>
</record>
<!-- Sequence for Loaner Checkout -->
<record id="seq_loaner_checkout" model="ir.sequence">
<field name="name">Loaner Checkout Sequence</field>
<field name="code">fusion.loaner.checkout</field>
<field name="prefix">LOAN/</field>
<field name="padding">5</field>
<field name="company_id" eval="False"/>
</record>
<!-- Loaner Product Categories -->
<record id="product_category_loaner" model="product.category">
<field name="name">Loaner Equipment</field>
</record>
<record id="product_category_loaner_rollator" model="product.category">
<field name="name">Rollators</field>
<field name="parent_id" ref="product_category_loaner"/>
</record>
<record id="product_category_loaner_wheelchair" model="product.category">
<field name="name">Wheelchairs</field>
<field name="parent_id" ref="product_category_loaner"/>
</record>
<record id="product_category_loaner_powerchair" model="product.category">
<field name="name">Powerchairs</field>
<field name="parent_id" ref="product_category_loaner"/>
</record>
</data>
</odoo>