This commit is contained in:
gsinghpal
2026-03-09 15:21:22 -04:00
parent a3e85a23ef
commit acd3fc455e
243 changed files with 20459 additions and 4197 deletions

View File

@@ -341,6 +341,27 @@
</field>
</record>
<!-- ===================================================================== -->
<!-- INVOICE LIST: Custom Columns -->
<!-- ===================================================================== -->
<record id="view_out_invoice_tree_fusion_claims" model="ir.ui.view">
<field name="name">account.move.list.fusion.central</field>
<field name="model">account.move</field>
<field name="inherit_id" ref="account.view_invoice_tree"/>
<field name="priority">80</field>
<field name="arch" type="xml">
<xpath expr="//field[@name='amount_untaxed_in_currency_signed']" position="before">
<field name="x_fc_invoice_type" string="Invoice Type" optional="hide"/>
<field name="x_fc_client_type" string="Client Type" optional="hide"/>
<field name="x_fc_claim_number" string="Claim #" optional="hide"/>
<field name="x_fc_client_ref_1" string="Client Ref 1" optional="hide"/>
<field name="x_fc_client_ref_2" string="Client Ref 2" optional="hide"/>
<field name="partner_shipping_id" string="Delivery Address" optional="hide"/>
<field name="x_fc_adp_invoice_portion" string="Portion" optional="hide" widget="badge"/>
</xpath>
</field>
</record>
<!-- ===================================================================== -->
<!-- INVOICE SEARCH: Filters -->
<!-- ===================================================================== -->
@@ -350,24 +371,59 @@
<field name="inherit_id" ref="account.view_account_invoice_filter"/>
<field name="arch" type="xml">
<xpath expr="//search" position="inside">
<!-- Search Fields -->
<field name="partner_shipping_id" string="Delivery Address"/>
<field name="x_fc_claim_number" string="Claim Number"/>
<field name="x_fc_client_ref_1" string="Client Reference 1"/>
<field name="x_fc_client_ref_2" string="Client Reference 2"/>
<field name="x_fc_invoice_type" string="Invoice Type"/>
<field name="x_fc_client_type" string="Client Type"/>
<separator/>
<filter string="ADP Invoices" name="adp_invoices"
<!-- Sale Type Filters -->
<filter string="ADP" name="type_adp"
domain="[('x_fc_invoice_type', 'in', ['adp', 'adp_odsp'])]"/>
<filter string="ADP Client" name="type_adp_client"
domain="[('x_fc_invoice_type', '=', 'adp_client')]"/>
<filter string="ODSP" name="type_odsp"
domain="[('x_fc_invoice_type', 'in', ['odsp', 'adp_odsp'])]"/>
<filter string="MOD" name="type_mod"
domain="[('x_fc_invoice_type', '=', 'march_of_dimes')]"/>
<filter string="WSIB" name="type_wsib"
domain="[('x_fc_invoice_type', '=', 'wsib')]"/>
<filter string="Insurance" name="type_insurance"
domain="[('x_fc_invoice_type', '=', 'insurance')]"/>
<filter string="Direct/Private" name="type_direct_private"
domain="[('x_fc_invoice_type', '=', 'direct_private')]"/>
<filter string="Hardship" name="type_hardship"
domain="[('x_fc_invoice_type', '=', 'hardship')]"/>
<filter string="Rentals" name="type_rental"
domain="[('x_fc_invoice_type', '=', 'rental')]"/>
<filter string="Muscular Dystrophy" name="type_muscular_dystrophy"
domain="[('x_fc_invoice_type', '=', 'muscular_dystrophy')]"/>
<filter string="Others" name="type_other"
domain="[('x_fc_invoice_type', '=', 'other')]"/>
<filter string="Regular" name="type_regular"
domain="[('x_fc_invoice_type', '=', 'regular')]"/>
<separator/>
<!-- ADP Export Filters -->
<filter string="ADP Exported" name="adp_exported"
domain="[('adp_exported', '=', True)]"/>
<filter string="Not ADP Exported" name="not_adp_exported"
domain="[('adp_exported', '=', False), ('x_fc_invoice_type', 'in', ['adp', 'adp_odsp']), ('move_type', 'in', ['out_invoice', 'out_refund'])]"/>
<separator/>
<!-- Client Type Filters -->
<filter string="REG Clients" name="reg_clients"
domain="[('x_fc_client_type', '=', 'REG')]"/>
<filter string="ODS/OWP/ACS" name="full_funding"
domain="[('x_fc_client_type', 'in', ['ODS', 'OWP', 'ACS'])]"/>
<separator/>
<!-- Invoice Portion Filters -->
<filter string="Client Invoices (25%)" name="client_invoices"
domain="[('x_fc_adp_invoice_portion', '=', 'client')]"/>
<filter string="ADP Invoices (75%)" name="adp_portion_invoices"
domain="[('x_fc_adp_invoice_portion', '=', 'adp')]"/>
<separator/>
<!-- ADP Billing Status Filters -->
<filter string="Billing: Waiting" name="billing_waiting"
domain="[('x_fc_adp_billing_status', '=', 'waiting')]"/>
<filter string="Billing: Submitted" name="billing_submitted"
@@ -376,6 +432,16 @@
domain="[('x_fc_adp_billing_status', '=', 'need_correction')]"/>
<filter string="Billing: Payment Issued" name="billing_payment_issued"
domain="[('x_fc_adp_billing_status', '=', 'payment_issued')]"/>
<separator/>
<!-- Group By -->
<filter string="Invoice Type" name="group_invoice_type"
context="{'group_by': 'x_fc_invoice_type'}"/>
<filter string="Client Type" name="group_client_type"
context="{'group_by': 'x_fc_client_type'}"/>
<filter string="Invoice Portion" name="group_invoice_portion"
context="{'group_by': 'x_fc_adp_invoice_portion'}"/>
<filter string="Billing Status" name="group_billing_status"
context="{'group_by': 'x_fc_adp_billing_status'}"/>
</xpath>
</field>
</record>

View File

@@ -18,6 +18,7 @@
<field name="device_code"/>
<field name="device_type"/>
<field name="manufacturer" optional="show"/>
<field name="build_type" optional="show"/>
<field name="device_description" optional="hide"/>
<field name="adp_price"/>
<field name="max_quantity"/>
@@ -44,6 +45,7 @@
<group string="Device Information">
<field name="device_type"/>
<field name="manufacturer"/>
<field name="build_type"/>
<field name="device_description"/>
</group>
<group string="Pricing">
@@ -77,9 +79,12 @@
<field name="device_description"/>
<separator/>
<filter string="Serial Required" name="sn_required" domain="[('sn_required', '=', True)]"/>
<filter string="Modular" name="filter_modular" domain="[('build_type', '=', 'modular')]"/>
<filter string="Custom Fabricated" name="filter_custom" domain="[('build_type', '=', 'custom_fabricated')]"/>
<separator/>
<filter string="Device Type" name="group_device_type" context="{'group_by': 'device_type'}"/>
<filter string="Manufacturer" name="group_manufacturer" context="{'group_by': 'manufacturer'}"/>
<filter string="Build Type" name="group_build_type" context="{'group_by': 'build_type'}"/>
</search>
</field>
</record>
@@ -778,6 +783,348 @@
<field name="help" type="html"><p class="o_view_nocontent_smiling_face">No Ontario Works cases yet</p></field>
</record>
<!-- ===================================================================== -->
<!-- ODSP STANDARD: PER-STATUS ACTIONS -->
<!-- ===================================================================== -->
<record id="action_odsp_std_quotation" model="ir.actions.act_window">
<field name="name">Quotation</field>
<field name="res_model">sale.order</field>
<field name="view_mode">list,form,kanban</field>
<field name="view_ids" eval="[(5, 0, 0),
(0, 0, {'view_mode': 'list', 'view_id': ref('view_sale_order_list_odsp')})]"/>
<field name="search_view_id" ref="view_sale_order_search_odsp"/>
<field name="domain">[('x_fc_sale_type', 'in', ['odsp', 'adp_odsp']), ('x_fc_odsp_division', '=', 'standard'), ('x_fc_odsp_std_status', '=', 'quotation')]</field>
<field name="context">{'default_x_fc_sale_type': 'odsp', 'default_x_fc_odsp_division': 'standard'}</field>
</record>
<record id="action_odsp_std_submitted" model="ir.actions.act_window">
<field name="name">Submitted to ODSP</field>
<field name="res_model">sale.order</field>
<field name="view_mode">list,form,kanban</field>
<field name="view_ids" eval="[(5, 0, 0),
(0, 0, {'view_mode': 'list', 'view_id': ref('view_sale_order_list_odsp')})]"/>
<field name="search_view_id" ref="view_sale_order_search_odsp"/>
<field name="domain">[('x_fc_sale_type', 'in', ['odsp', 'adp_odsp']), ('x_fc_odsp_division', '=', 'standard'), ('x_fc_odsp_std_status', '=', 'submitted_to_odsp')]</field>
<field name="context">{'default_x_fc_sale_type': 'odsp', 'default_x_fc_odsp_division': 'standard'}</field>
</record>
<record id="action_odsp_std_pre_approved" model="ir.actions.act_window">
<field name="name">Pre-Approved</field>
<field name="res_model">sale.order</field>
<field name="view_mode">list,form,kanban</field>
<field name="view_ids" eval="[(5, 0, 0),
(0, 0, {'view_mode': 'list', 'view_id': ref('view_sale_order_list_odsp')})]"/>
<field name="search_view_id" ref="view_sale_order_search_odsp"/>
<field name="domain">[('x_fc_sale_type', 'in', ['odsp', 'adp_odsp']), ('x_fc_odsp_division', '=', 'standard'), ('x_fc_odsp_std_status', '=', 'pre_approved')]</field>
<field name="context">{'default_x_fc_sale_type': 'odsp', 'default_x_fc_odsp_division': 'standard'}</field>
</record>
<record id="action_odsp_std_ready_delivery" model="ir.actions.act_window">
<field name="name">Ready for Delivery</field>
<field name="res_model">sale.order</field>
<field name="view_mode">list,form,kanban</field>
<field name="view_ids" eval="[(5, 0, 0),
(0, 0, {'view_mode': 'list', 'view_id': ref('view_sale_order_list_odsp')})]"/>
<field name="search_view_id" ref="view_sale_order_search_odsp"/>
<field name="domain">[('x_fc_sale_type', 'in', ['odsp', 'adp_odsp']), ('x_fc_odsp_division', '=', 'standard'), ('x_fc_odsp_std_status', '=', 'ready_delivery')]</field>
<field name="context">{'default_x_fc_sale_type': 'odsp', 'default_x_fc_odsp_division': 'standard'}</field>
</record>
<record id="action_odsp_std_delivered" model="ir.actions.act_window">
<field name="name">Delivered</field>
<field name="res_model">sale.order</field>
<field name="view_mode">list,form,kanban</field>
<field name="view_ids" eval="[(5, 0, 0),
(0, 0, {'view_mode': 'list', 'view_id': ref('view_sale_order_list_odsp')})]"/>
<field name="search_view_id" ref="view_sale_order_search_odsp"/>
<field name="domain">[('x_fc_sale_type', 'in', ['odsp', 'adp_odsp']), ('x_fc_odsp_division', '=', 'standard'), ('x_fc_odsp_std_status', '=', 'delivered')]</field>
<field name="context">{'default_x_fc_sale_type': 'odsp', 'default_x_fc_odsp_division': 'standard'}</field>
</record>
<record id="action_odsp_std_pod_submitted" model="ir.actions.act_window">
<field name="name">POD Submitted</field>
<field name="res_model">sale.order</field>
<field name="view_mode">list,form,kanban</field>
<field name="view_ids" eval="[(5, 0, 0),
(0, 0, {'view_mode': 'list', 'view_id': ref('view_sale_order_list_odsp')})]"/>
<field name="search_view_id" ref="view_sale_order_search_odsp"/>
<field name="domain">[('x_fc_sale_type', 'in', ['odsp', 'adp_odsp']), ('x_fc_odsp_division', '=', 'standard'), ('x_fc_odsp_std_status', '=', 'pod_submitted')]</field>
<field name="context">{'default_x_fc_sale_type': 'odsp', 'default_x_fc_odsp_division': 'standard'}</field>
</record>
<record id="action_odsp_std_payment_received" model="ir.actions.act_window">
<field name="name">Payment Received</field>
<field name="res_model">sale.order</field>
<field name="view_mode">list,form,kanban</field>
<field name="view_ids" eval="[(5, 0, 0),
(0, 0, {'view_mode': 'list', 'view_id': ref('view_sale_order_list_odsp')})]"/>
<field name="search_view_id" ref="view_sale_order_search_odsp"/>
<field name="domain">[('x_fc_sale_type', 'in', ['odsp', 'adp_odsp']), ('x_fc_odsp_division', '=', 'standard'), ('x_fc_odsp_std_status', '=', 'payment_received')]</field>
<field name="context">{'default_x_fc_sale_type': 'odsp', 'default_x_fc_odsp_division': 'standard'}</field>
</record>
<record id="action_odsp_std_case_closed" model="ir.actions.act_window">
<field name="name">Case Closed</field>
<field name="res_model">sale.order</field>
<field name="view_mode">list,form,kanban</field>
<field name="view_ids" eval="[(5, 0, 0),
(0, 0, {'view_mode': 'list', 'view_id': ref('view_sale_order_list_odsp')})]"/>
<field name="search_view_id" ref="view_sale_order_search_odsp"/>
<field name="domain">[('x_fc_sale_type', 'in', ['odsp', 'adp_odsp']), ('x_fc_odsp_division', '=', 'standard'), ('x_fc_odsp_std_status', '=', 'case_closed')]</field>
<field name="context">{'default_x_fc_sale_type': 'odsp', 'default_x_fc_odsp_division': 'standard'}</field>
</record>
<record id="action_odsp_std_on_hold" model="ir.actions.act_window">
<field name="name">On Hold</field>
<field name="res_model">sale.order</field>
<field name="view_mode">list,form,kanban</field>
<field name="view_ids" eval="[(5, 0, 0),
(0, 0, {'view_mode': 'list', 'view_id': ref('view_sale_order_list_odsp')})]"/>
<field name="search_view_id" ref="view_sale_order_search_odsp"/>
<field name="domain">[('x_fc_sale_type', 'in', ['odsp', 'adp_odsp']), ('x_fc_odsp_division', '=', 'standard'), ('x_fc_odsp_std_status', '=', 'on_hold')]</field>
<field name="context">{'default_x_fc_sale_type': 'odsp', 'default_x_fc_odsp_division': 'standard'}</field>
</record>
<record id="action_odsp_std_denied" model="ir.actions.act_window">
<field name="name">Denied</field>
<field name="res_model">sale.order</field>
<field name="view_mode">list,form,kanban</field>
<field name="view_ids" eval="[(5, 0, 0),
(0, 0, {'view_mode': 'list', 'view_id': ref('view_sale_order_list_odsp')})]"/>
<field name="search_view_id" ref="view_sale_order_search_odsp"/>
<field name="domain">[('x_fc_sale_type', 'in', ['odsp', 'adp_odsp']), ('x_fc_odsp_division', '=', 'standard'), ('x_fc_odsp_std_status', '=', 'denied')]</field>
<field name="context">{'default_x_fc_sale_type': 'odsp', 'default_x_fc_odsp_division': 'standard'}</field>
</record>
<record id="action_odsp_std_cancelled" model="ir.actions.act_window">
<field name="name">Cancelled</field>
<field name="res_model">sale.order</field>
<field name="view_mode">list,form,kanban</field>
<field name="view_ids" eval="[(5, 0, 0),
(0, 0, {'view_mode': 'list', 'view_id': ref('view_sale_order_list_odsp')})]"/>
<field name="search_view_id" ref="view_sale_order_search_odsp"/>
<field name="domain">[('x_fc_sale_type', 'in', ['odsp', 'adp_odsp']), ('x_fc_odsp_division', '=', 'standard'), ('x_fc_odsp_std_status', '=', 'cancelled')]</field>
<field name="context">{'default_x_fc_sale_type': 'odsp', 'default_x_fc_odsp_division': 'standard'}</field>
</record>
<!-- ===================================================================== -->
<!-- SA MOBILITY: PER-STATUS ACTIONS -->
<!-- ===================================================================== -->
<record id="action_odsp_sa_quotation" model="ir.actions.act_window">
<field name="name">Quotation</field>
<field name="res_model">sale.order</field>
<field name="view_mode">list,form,kanban</field>
<field name="view_ids" eval="[(5, 0, 0),
(0, 0, {'view_mode': 'list', 'view_id': ref('view_sale_order_list_odsp')})]"/>
<field name="search_view_id" ref="view_sale_order_search_odsp"/>
<field name="domain">[('x_fc_sale_type', 'in', ['odsp', 'adp_odsp']), ('x_fc_odsp_division', '=', 'sa_mobility'), ('x_fc_sa_status', '=', 'quotation')]</field>
<field name="context">{'default_x_fc_sale_type': 'odsp', 'default_x_fc_odsp_division': 'sa_mobility'}</field>
</record>
<record id="action_odsp_sa_form_ready" model="ir.actions.act_window">
<field name="name">SA Form Ready</field>
<field name="res_model">sale.order</field>
<field name="view_mode">list,form,kanban</field>
<field name="view_ids" eval="[(5, 0, 0),
(0, 0, {'view_mode': 'list', 'view_id': ref('view_sale_order_list_odsp')})]"/>
<field name="search_view_id" ref="view_sale_order_search_odsp"/>
<field name="domain">[('x_fc_sale_type', 'in', ['odsp', 'adp_odsp']), ('x_fc_odsp_division', '=', 'sa_mobility'), ('x_fc_sa_status', '=', 'form_ready')]</field>
<field name="context">{'default_x_fc_sale_type': 'odsp', 'default_x_fc_odsp_division': 'sa_mobility'}</field>
</record>
<record id="action_odsp_sa_submitted" model="ir.actions.act_window">
<field name="name">Submitted to SA Mobility</field>
<field name="res_model">sale.order</field>
<field name="view_mode">list,form,kanban</field>
<field name="view_ids" eval="[(5, 0, 0),
(0, 0, {'view_mode': 'list', 'view_id': ref('view_sale_order_list_odsp')})]"/>
<field name="search_view_id" ref="view_sale_order_search_odsp"/>
<field name="domain">[('x_fc_sale_type', 'in', ['odsp', 'adp_odsp']), ('x_fc_odsp_division', '=', 'sa_mobility'), ('x_fc_sa_status', '=', 'submitted_to_sa')]</field>
<field name="context">{'default_x_fc_sale_type': 'odsp', 'default_x_fc_odsp_division': 'sa_mobility'}</field>
</record>
<record id="action_odsp_sa_pre_approved" model="ir.actions.act_window">
<field name="name">Pre-Approved</field>
<field name="res_model">sale.order</field>
<field name="view_mode">list,form,kanban</field>
<field name="view_ids" eval="[(5, 0, 0),
(0, 0, {'view_mode': 'list', 'view_id': ref('view_sale_order_list_odsp')})]"/>
<field name="search_view_id" ref="view_sale_order_search_odsp"/>
<field name="domain">[('x_fc_sale_type', 'in', ['odsp', 'adp_odsp']), ('x_fc_odsp_division', '=', 'sa_mobility'), ('x_fc_sa_status', '=', 'pre_approved')]</field>
<field name="context">{'default_x_fc_sale_type': 'odsp', 'default_x_fc_odsp_division': 'sa_mobility'}</field>
</record>
<record id="action_odsp_sa_ready_delivery" model="ir.actions.act_window">
<field name="name">Ready for Delivery</field>
<field name="res_model">sale.order</field>
<field name="view_mode">list,form,kanban</field>
<field name="view_ids" eval="[(5, 0, 0),
(0, 0, {'view_mode': 'list', 'view_id': ref('view_sale_order_list_odsp')})]"/>
<field name="search_view_id" ref="view_sale_order_search_odsp"/>
<field name="domain">[('x_fc_sale_type', 'in', ['odsp', 'adp_odsp']), ('x_fc_odsp_division', '=', 'sa_mobility'), ('x_fc_sa_status', '=', 'ready_delivery')]</field>
<field name="context">{'default_x_fc_sale_type': 'odsp', 'default_x_fc_odsp_division': 'sa_mobility'}</field>
</record>
<record id="action_odsp_sa_delivered" model="ir.actions.act_window">
<field name="name">Delivered</field>
<field name="res_model">sale.order</field>
<field name="view_mode">list,form,kanban</field>
<field name="view_ids" eval="[(5, 0, 0),
(0, 0, {'view_mode': 'list', 'view_id': ref('view_sale_order_list_odsp')})]"/>
<field name="search_view_id" ref="view_sale_order_search_odsp"/>
<field name="domain">[('x_fc_sale_type', 'in', ['odsp', 'adp_odsp']), ('x_fc_odsp_division', '=', 'sa_mobility'), ('x_fc_sa_status', '=', 'delivered')]</field>
<field name="context">{'default_x_fc_sale_type': 'odsp', 'default_x_fc_odsp_division': 'sa_mobility'}</field>
</record>
<record id="action_odsp_sa_pod_submitted" model="ir.actions.act_window">
<field name="name">POD Submitted</field>
<field name="res_model">sale.order</field>
<field name="view_mode">list,form,kanban</field>
<field name="view_ids" eval="[(5, 0, 0),
(0, 0, {'view_mode': 'list', 'view_id': ref('view_sale_order_list_odsp')})]"/>
<field name="search_view_id" ref="view_sale_order_search_odsp"/>
<field name="domain">[('x_fc_sale_type', 'in', ['odsp', 'adp_odsp']), ('x_fc_odsp_division', '=', 'sa_mobility'), ('x_fc_sa_status', '=', 'pod_submitted')]</field>
<field name="context">{'default_x_fc_sale_type': 'odsp', 'default_x_fc_odsp_division': 'sa_mobility'}</field>
</record>
<record id="action_odsp_sa_payment_received" model="ir.actions.act_window">
<field name="name">Payment Received</field>
<field name="res_model">sale.order</field>
<field name="view_mode">list,form,kanban</field>
<field name="view_ids" eval="[(5, 0, 0),
(0, 0, {'view_mode': 'list', 'view_id': ref('view_sale_order_list_odsp')})]"/>
<field name="search_view_id" ref="view_sale_order_search_odsp"/>
<field name="domain">[('x_fc_sale_type', 'in', ['odsp', 'adp_odsp']), ('x_fc_odsp_division', '=', 'sa_mobility'), ('x_fc_sa_status', '=', 'payment_received')]</field>
<field name="context">{'default_x_fc_sale_type': 'odsp', 'default_x_fc_odsp_division': 'sa_mobility'}</field>
</record>
<record id="action_odsp_sa_case_closed" model="ir.actions.act_window">
<field name="name">Case Closed</field>
<field name="res_model">sale.order</field>
<field name="view_mode">list,form,kanban</field>
<field name="view_ids" eval="[(5, 0, 0),
(0, 0, {'view_mode': 'list', 'view_id': ref('view_sale_order_list_odsp')})]"/>
<field name="search_view_id" ref="view_sale_order_search_odsp"/>
<field name="domain">[('x_fc_sale_type', 'in', ['odsp', 'adp_odsp']), ('x_fc_odsp_division', '=', 'sa_mobility'), ('x_fc_sa_status', '=', 'case_closed')]</field>
<field name="context">{'default_x_fc_sale_type': 'odsp', 'default_x_fc_odsp_division': 'sa_mobility'}</field>
</record>
<record id="action_odsp_sa_on_hold" model="ir.actions.act_window">
<field name="name">On Hold</field>
<field name="res_model">sale.order</field>
<field name="view_mode">list,form,kanban</field>
<field name="view_ids" eval="[(5, 0, 0),
(0, 0, {'view_mode': 'list', 'view_id': ref('view_sale_order_list_odsp')})]"/>
<field name="search_view_id" ref="view_sale_order_search_odsp"/>
<field name="domain">[('x_fc_sale_type', 'in', ['odsp', 'adp_odsp']), ('x_fc_odsp_division', '=', 'sa_mobility'), ('x_fc_sa_status', '=', 'on_hold')]</field>
<field name="context">{'default_x_fc_sale_type': 'odsp', 'default_x_fc_odsp_division': 'sa_mobility'}</field>
</record>
<record id="action_odsp_sa_denied" model="ir.actions.act_window">
<field name="name">Denied</field>
<field name="res_model">sale.order</field>
<field name="view_mode">list,form,kanban</field>
<field name="view_ids" eval="[(5, 0, 0),
(0, 0, {'view_mode': 'list', 'view_id': ref('view_sale_order_list_odsp')})]"/>
<field name="search_view_id" ref="view_sale_order_search_odsp"/>
<field name="domain">[('x_fc_sale_type', 'in', ['odsp', 'adp_odsp']), ('x_fc_odsp_division', '=', 'sa_mobility'), ('x_fc_sa_status', '=', 'denied')]</field>
<field name="context">{'default_x_fc_sale_type': 'odsp', 'default_x_fc_odsp_division': 'sa_mobility'}</field>
</record>
<record id="action_odsp_sa_cancelled" model="ir.actions.act_window">
<field name="name">Cancelled</field>
<field name="res_model">sale.order</field>
<field name="view_mode">list,form,kanban</field>
<field name="view_ids" eval="[(5, 0, 0),
(0, 0, {'view_mode': 'list', 'view_id': ref('view_sale_order_list_odsp')})]"/>
<field name="search_view_id" ref="view_sale_order_search_odsp"/>
<field name="domain">[('x_fc_sale_type', 'in', ['odsp', 'adp_odsp']), ('x_fc_odsp_division', '=', 'sa_mobility'), ('x_fc_sa_status', '=', 'cancelled')]</field>
<field name="context">{'default_x_fc_sale_type': 'odsp', 'default_x_fc_odsp_division': 'sa_mobility'}</field>
</record>
<!-- ===================================================================== -->
<!-- ONTARIO WORKS: PER-STATUS ACTIONS -->
<!-- ===================================================================== -->
<record id="action_odsp_ow_quotation" model="ir.actions.act_window">
<field name="name">Quotation</field>
<field name="res_model">sale.order</field>
<field name="view_mode">list,form,kanban</field>
<field name="view_ids" eval="[(5, 0, 0),
(0, 0, {'view_mode': 'list', 'view_id': ref('view_sale_order_list_odsp')})]"/>
<field name="search_view_id" ref="view_sale_order_search_odsp"/>
<field name="domain">[('x_fc_sale_type', 'in', ['odsp', 'adp_odsp']), ('x_fc_odsp_division', '=', 'ontario_works'), ('x_fc_ow_status', '=', 'quotation')]</field>
<field name="context">{'default_x_fc_sale_type': 'odsp', 'default_x_fc_odsp_division': 'ontario_works'}</field>
</record>
<record id="action_odsp_ow_documents_ready" model="ir.actions.act_window">
<field name="name">Documents Ready</field>
<field name="res_model">sale.order</field>
<field name="view_mode">list,form,kanban</field>
<field name="view_ids" eval="[(5, 0, 0),
(0, 0, {'view_mode': 'list', 'view_id': ref('view_sale_order_list_odsp')})]"/>
<field name="search_view_id" ref="view_sale_order_search_odsp"/>
<field name="domain">[('x_fc_sale_type', 'in', ['odsp', 'adp_odsp']), ('x_fc_odsp_division', '=', 'ontario_works'), ('x_fc_ow_status', '=', 'documents_ready')]</field>
<field name="context">{'default_x_fc_sale_type': 'odsp', 'default_x_fc_odsp_division': 'ontario_works'}</field>
</record>
<record id="action_odsp_ow_submitted" model="ir.actions.act_window">
<field name="name">Submitted to Ontario Works</field>
<field name="res_model">sale.order</field>
<field name="view_mode">list,form,kanban</field>
<field name="view_ids" eval="[(5, 0, 0),
(0, 0, {'view_mode': 'list', 'view_id': ref('view_sale_order_list_odsp')})]"/>
<field name="search_view_id" ref="view_sale_order_search_odsp"/>
<field name="domain">[('x_fc_sale_type', 'in', ['odsp', 'adp_odsp']), ('x_fc_odsp_division', '=', 'ontario_works'), ('x_fc_ow_status', '=', 'submitted_to_ow')]</field>
<field name="context">{'default_x_fc_sale_type': 'odsp', 'default_x_fc_odsp_division': 'ontario_works'}</field>
</record>
<record id="action_odsp_ow_payment_received" model="ir.actions.act_window">
<field name="name">Payment Received</field>
<field name="res_model">sale.order</field>
<field name="view_mode">list,form,kanban</field>
<field name="view_ids" eval="[(5, 0, 0),
(0, 0, {'view_mode': 'list', 'view_id': ref('view_sale_order_list_odsp')})]"/>
<field name="search_view_id" ref="view_sale_order_search_odsp"/>
<field name="domain">[('x_fc_sale_type', 'in', ['odsp', 'adp_odsp']), ('x_fc_odsp_division', '=', 'ontario_works'), ('x_fc_ow_status', '=', 'payment_received')]</field>
<field name="context">{'default_x_fc_sale_type': 'odsp', 'default_x_fc_odsp_division': 'ontario_works'}</field>
</record>
<record id="action_odsp_ow_ready_delivery" model="ir.actions.act_window">
<field name="name">Ready for Delivery</field>
<field name="res_model">sale.order</field>
<field name="view_mode">list,form,kanban</field>
<field name="view_ids" eval="[(5, 0, 0),
(0, 0, {'view_mode': 'list', 'view_id': ref('view_sale_order_list_odsp')})]"/>
<field name="search_view_id" ref="view_sale_order_search_odsp"/>
<field name="domain">[('x_fc_sale_type', 'in', ['odsp', 'adp_odsp']), ('x_fc_odsp_division', '=', 'ontario_works'), ('x_fc_ow_status', '=', 'ready_delivery')]</field>
<field name="context">{'default_x_fc_sale_type': 'odsp', 'default_x_fc_odsp_division': 'ontario_works'}</field>
</record>
<record id="action_odsp_ow_delivered" model="ir.actions.act_window">
<field name="name">Delivered</field>
<field name="res_model">sale.order</field>
<field name="view_mode">list,form,kanban</field>
<field name="view_ids" eval="[(5, 0, 0),
(0, 0, {'view_mode': 'list', 'view_id': ref('view_sale_order_list_odsp')})]"/>
<field name="search_view_id" ref="view_sale_order_search_odsp"/>
<field name="domain">[('x_fc_sale_type', 'in', ['odsp', 'adp_odsp']), ('x_fc_odsp_division', '=', 'ontario_works'), ('x_fc_ow_status', '=', 'delivered')]</field>
<field name="context">{'default_x_fc_sale_type': 'odsp', 'default_x_fc_odsp_division': 'ontario_works'}</field>
</record>
<record id="action_odsp_ow_case_closed" model="ir.actions.act_window">
<field name="name">Case Closed</field>
<field name="res_model">sale.order</field>
<field name="view_mode">list,form,kanban</field>
<field name="view_ids" eval="[(5, 0, 0),
(0, 0, {'view_mode': 'list', 'view_id': ref('view_sale_order_list_odsp')})]"/>
<field name="search_view_id" ref="view_sale_order_search_odsp"/>
<field name="domain">[('x_fc_sale_type', 'in', ['odsp', 'adp_odsp']), ('x_fc_odsp_division', '=', 'ontario_works'), ('x_fc_ow_status', '=', 'case_closed')]</field>
<field name="context">{'default_x_fc_sale_type': 'odsp', 'default_x_fc_odsp_division': 'ontario_works'}</field>
</record>
<record id="action_odsp_ow_on_hold" model="ir.actions.act_window">
<field name="name">On Hold</field>
<field name="res_model">sale.order</field>
<field name="view_mode">list,form,kanban</field>
<field name="view_ids" eval="[(5, 0, 0),
(0, 0, {'view_mode': 'list', 'view_id': ref('view_sale_order_list_odsp')})]"/>
<field name="search_view_id" ref="view_sale_order_search_odsp"/>
<field name="domain">[('x_fc_sale_type', 'in', ['odsp', 'adp_odsp']), ('x_fc_odsp_division', '=', 'ontario_works'), ('x_fc_ow_status', '=', 'on_hold')]</field>
<field name="context">{'default_x_fc_sale_type': 'odsp', 'default_x_fc_odsp_division': 'ontario_works'}</field>
</record>
<record id="action_odsp_ow_denied" model="ir.actions.act_window">
<field name="name">Denied</field>
<field name="res_model">sale.order</field>
<field name="view_mode">list,form,kanban</field>
<field name="view_ids" eval="[(5, 0, 0),
(0, 0, {'view_mode': 'list', 'view_id': ref('view_sale_order_list_odsp')})]"/>
<field name="search_view_id" ref="view_sale_order_search_odsp"/>
<field name="domain">[('x_fc_sale_type', 'in', ['odsp', 'adp_odsp']), ('x_fc_odsp_division', '=', 'ontario_works'), ('x_fc_ow_status', '=', 'denied')]</field>
<field name="context">{'default_x_fc_sale_type': 'odsp', 'default_x_fc_odsp_division': 'ontario_works'}</field>
</record>
<record id="action_odsp_ow_cancelled" model="ir.actions.act_window">
<field name="name">Cancelled</field>
<field name="res_model">sale.order</field>
<field name="view_mode">list,form,kanban</field>
<field name="view_ids" eval="[(5, 0, 0),
(0, 0, {'view_mode': 'list', 'view_id': ref('view_sale_order_list_odsp')})]"/>
<field name="search_view_id" ref="view_sale_order_search_odsp"/>
<field name="domain">[('x_fc_sale_type', 'in', ['odsp', 'adp_odsp']), ('x_fc_odsp_division', '=', 'ontario_works'), ('x_fc_ow_status', '=', 'cancelled')]</field>
<field name="context">{'default_x_fc_sale_type': 'odsp', 'default_x_fc_odsp_division': 'ontario_works'}</field>
</record>
<!-- ===================================================================== -->
<!-- MARCH OF DIMES: KANBAN VIEW -->
<!-- ===================================================================== -->
@@ -947,10 +1294,10 @@
</record>
<!-- ===================================================================== -->
<!-- MARCH OF DIMES: ACTION -->
<!-- MARCH OF DIMES: ACTIONS -->
<!-- ===================================================================== -->
<record id="action_fc_march_of_dimes_orders" model="ir.actions.act_window">
<field name="name">March of Dimes Cases</field>
<field name="name">All MOD Cases</field>
<field name="res_model">sale.order</field>
<field name="view_mode">list,kanban,form</field>
<field name="view_ids" eval="[(5, 0, 0),
@@ -959,7 +1306,188 @@
<field name="search_view_id" ref="view_sale_order_search_mod"/>
<field name="domain">[('x_fc_sale_type', '=', 'march_of_dimes')]</field>
<field name="context">{'default_x_fc_sale_type': 'march_of_dimes'}</field>
<field name="help" type="html"><p class="o_view_nocontent_smiling_face">No March of Dimes cases yet</p></field>
<field name="help" type="html"><p class="o_view_nocontent_smiling_face">No MOD cases yet</p></field>
</record>
<record id="action_mod_schedule_assessment" model="ir.actions.act_window">
<field name="name">Schedule Assessment</field>
<field name="res_model">sale.order</field>
<field name="view_mode">list,kanban,form</field>
<field name="view_ids" eval="[(5, 0, 0),
(0, 0, {'view_mode': 'list', 'view_id': ref('view_sale_order_list_mod')}),
(0, 0, {'view_mode': 'kanban', 'view_id': ref('view_sale_order_kanban_mod')})]"/>
<field name="search_view_id" ref="view_sale_order_search_mod"/>
<field name="domain">[('x_fc_sale_type', '=', 'march_of_dimes'), ('x_fc_mod_status', '=', 'need_to_schedule')]</field>
<field name="context">{'default_x_fc_sale_type': 'march_of_dimes'}</field>
</record>
<record id="action_mod_assessment_booked" model="ir.actions.act_window">
<field name="name">Assessment Booked</field>
<field name="res_model">sale.order</field>
<field name="view_mode">list,kanban,form</field>
<field name="view_ids" eval="[(5, 0, 0),
(0, 0, {'view_mode': 'list', 'view_id': ref('view_sale_order_list_mod')}),
(0, 0, {'view_mode': 'kanban', 'view_id': ref('view_sale_order_kanban_mod')})]"/>
<field name="search_view_id" ref="view_sale_order_search_mod"/>
<field name="domain">[('x_fc_sale_type', '=', 'march_of_dimes'), ('x_fc_mod_status', '=', 'assessment_scheduled')]</field>
<field name="context">{'default_x_fc_sale_type': 'march_of_dimes'}</field>
</record>
<record id="action_mod_assessment_done" model="ir.actions.act_window">
<field name="name">Assessment Done</field>
<field name="res_model">sale.order</field>
<field name="view_mode">list,kanban,form</field>
<field name="view_ids" eval="[(5, 0, 0),
(0, 0, {'view_mode': 'list', 'view_id': ref('view_sale_order_list_mod')}),
(0, 0, {'view_mode': 'kanban', 'view_id': ref('view_sale_order_kanban_mod')})]"/>
<field name="search_view_id" ref="view_sale_order_search_mod"/>
<field name="domain">[('x_fc_sale_type', '=', 'march_of_dimes'), ('x_fc_mod_status', '=', 'assessment_completed')]</field>
<field name="context">{'default_x_fc_sale_type': 'march_of_dimes'}</field>
</record>
<record id="action_mod_processing_drawing" model="ir.actions.act_window">
<field name="name">Processing Drawing</field>
<field name="res_model">sale.order</field>
<field name="view_mode">list,kanban,form</field>
<field name="view_ids" eval="[(5, 0, 0),
(0, 0, {'view_mode': 'list', 'view_id': ref('view_sale_order_list_mod')}),
(0, 0, {'view_mode': 'kanban', 'view_id': ref('view_sale_order_kanban_mod')})]"/>
<field name="search_view_id" ref="view_sale_order_search_mod"/>
<field name="domain">[('x_fc_sale_type', '=', 'march_of_dimes'), ('x_fc_mod_status', '=', 'processing_drawings')]</field>
<field name="context">{'default_x_fc_sale_type': 'march_of_dimes'}</field>
</record>
<record id="action_mod_quote_sent" model="ir.actions.act_window">
<field name="name">Quote Sent</field>
<field name="res_model">sale.order</field>
<field name="view_mode">list,kanban,form</field>
<field name="view_ids" eval="[(5, 0, 0),
(0, 0, {'view_mode': 'list', 'view_id': ref('view_sale_order_list_mod')}),
(0, 0, {'view_mode': 'kanban', 'view_id': ref('view_sale_order_kanban_mod')})]"/>
<field name="search_view_id" ref="view_sale_order_search_mod"/>
<field name="domain">[('x_fc_sale_type', '=', 'march_of_dimes'), ('x_fc_mod_status', '=', 'quote_submitted')]</field>
<field name="context">{'default_x_fc_sale_type': 'march_of_dimes'}</field>
</record>
<record id="action_mod_awaiting_funding" model="ir.actions.act_window">
<field name="name">Awaiting Funding</field>
<field name="res_model">sale.order</field>
<field name="view_mode">list,kanban,form</field>
<field name="view_ids" eval="[(5, 0, 0),
(0, 0, {'view_mode': 'list', 'view_id': ref('view_sale_order_list_mod')}),
(0, 0, {'view_mode': 'kanban', 'view_id': ref('view_sale_order_kanban_mod')})]"/>
<field name="search_view_id" ref="view_sale_order_search_mod"/>
<field name="domain">[('x_fc_sale_type', '=', 'march_of_dimes'), ('x_fc_mod_status', '=', 'awaiting_funding')]</field>
<field name="context">{'default_x_fc_sale_type': 'march_of_dimes'}</field>
</record>
<record id="action_mod_approved" model="ir.actions.act_window">
<field name="name">Approved</field>
<field name="res_model">sale.order</field>
<field name="view_mode">list,kanban,form</field>
<field name="view_ids" eval="[(5, 0, 0),
(0, 0, {'view_mode': 'list', 'view_id': ref('view_sale_order_list_mod')}),
(0, 0, {'view_mode': 'kanban', 'view_id': ref('view_sale_order_kanban_mod')})]"/>
<field name="search_view_id" ref="view_sale_order_search_mod"/>
<field name="domain">[('x_fc_sale_type', '=', 'march_of_dimes'), ('x_fc_mod_status', '=', 'funding_approved')]</field>
<field name="context">{'default_x_fc_sale_type': 'march_of_dimes'}</field>
</record>
<record id="action_mod_pca_received" model="ir.actions.act_window">
<field name="name">PCA Received</field>
<field name="res_model">sale.order</field>
<field name="view_mode">list,kanban,form</field>
<field name="view_ids" eval="[(5, 0, 0),
(0, 0, {'view_mode': 'list', 'view_id': ref('view_sale_order_list_mod')}),
(0, 0, {'view_mode': 'kanban', 'view_id': ref('view_sale_order_kanban_mod')})]"/>
<field name="search_view_id" ref="view_sale_order_search_mod"/>
<field name="domain">[('x_fc_sale_type', '=', 'march_of_dimes'), ('x_fc_mod_status', '=', 'contract_received')]</field>
<field name="context">{'default_x_fc_sale_type': 'march_of_dimes'}</field>
</record>
<record id="action_mod_in_production" model="ir.actions.act_window">
<field name="name">In Production</field>
<field name="res_model">sale.order</field>
<field name="view_mode">list,kanban,form</field>
<field name="view_ids" eval="[(5, 0, 0),
(0, 0, {'view_mode': 'list', 'view_id': ref('view_sale_order_list_mod')}),
(0, 0, {'view_mode': 'kanban', 'view_id': ref('view_sale_order_kanban_mod')})]"/>
<field name="search_view_id" ref="view_sale_order_search_mod"/>
<field name="domain">[('x_fc_sale_type', '=', 'march_of_dimes'), ('x_fc_mod_status', '=', 'in_production')]</field>
<field name="context">{'default_x_fc_sale_type': 'march_of_dimes'}</field>
</record>
<record id="action_mod_complete" model="ir.actions.act_window">
<field name="name">Complete</field>
<field name="res_model">sale.order</field>
<field name="view_mode">list,kanban,form</field>
<field name="view_ids" eval="[(5, 0, 0),
(0, 0, {'view_mode': 'list', 'view_id': ref('view_sale_order_list_mod')}),
(0, 0, {'view_mode': 'kanban', 'view_id': ref('view_sale_order_kanban_mod')})]"/>
<field name="search_view_id" ref="view_sale_order_search_mod"/>
<field name="domain">[('x_fc_sale_type', '=', 'march_of_dimes'), ('x_fc_mod_status', '=', 'project_complete')]</field>
<field name="context">{'default_x_fc_sale_type': 'march_of_dimes'}</field>
</record>
<record id="action_mod_pod_sent" model="ir.actions.act_window">
<field name="name">POD Sent</field>
<field name="res_model">sale.order</field>
<field name="view_mode">list,kanban,form</field>
<field name="view_ids" eval="[(5, 0, 0),
(0, 0, {'view_mode': 'list', 'view_id': ref('view_sale_order_list_mod')}),
(0, 0, {'view_mode': 'kanban', 'view_id': ref('view_sale_order_kanban_mod')})]"/>
<field name="search_view_id" ref="view_sale_order_search_mod"/>
<field name="domain">[('x_fc_sale_type', '=', 'march_of_dimes'), ('x_fc_mod_status', '=', 'pod_submitted')]</field>
<field name="context">{'default_x_fc_sale_type': 'march_of_dimes'}</field>
</record>
<record id="action_mod_closed" model="ir.actions.act_window">
<field name="name">Closed</field>
<field name="res_model">sale.order</field>
<field name="view_mode">list,kanban,form</field>
<field name="view_ids" eval="[(5, 0, 0),
(0, 0, {'view_mode': 'list', 'view_id': ref('view_sale_order_list_mod')}),
(0, 0, {'view_mode': 'kanban', 'view_id': ref('view_sale_order_kanban_mod')})]"/>
<field name="search_view_id" ref="view_sale_order_search_mod"/>
<field name="domain">[('x_fc_sale_type', '=', 'march_of_dimes'), ('x_fc_mod_status', '=', 'case_closed')]</field>
<field name="context">{'default_x_fc_sale_type': 'march_of_dimes'}</field>
</record>
<!-- MOD Special Status Actions -->
<record id="action_mod_on_hold" model="ir.actions.act_window">
<field name="name">On Hold</field>
<field name="res_model">sale.order</field>
<field name="view_mode">list,kanban,form</field>
<field name="view_ids" eval="[(5, 0, 0),
(0, 0, {'view_mode': 'list', 'view_id': ref('view_sale_order_list_mod')}),
(0, 0, {'view_mode': 'kanban', 'view_id': ref('view_sale_order_kanban_mod')})]"/>
<field name="search_view_id" ref="view_sale_order_search_mod"/>
<field name="domain">[('x_fc_sale_type', '=', 'march_of_dimes'), ('x_fc_mod_status', '=', 'on_hold')]</field>
<field name="context">{'default_x_fc_sale_type': 'march_of_dimes'}</field>
</record>
<record id="action_mod_denied" model="ir.actions.act_window">
<field name="name">Denied</field>
<field name="res_model">sale.order</field>
<field name="view_mode">list,kanban,form</field>
<field name="view_ids" eval="[(5, 0, 0),
(0, 0, {'view_mode': 'list', 'view_id': ref('view_sale_order_list_mod')}),
(0, 0, {'view_mode': 'kanban', 'view_id': ref('view_sale_order_kanban_mod')})]"/>
<field name="search_view_id" ref="view_sale_order_search_mod"/>
<field name="domain">[('x_fc_sale_type', '=', 'march_of_dimes'), ('x_fc_mod_status', '=', 'funding_denied')]</field>
<field name="context">{'default_x_fc_sale_type': 'march_of_dimes'}</field>
</record>
<record id="action_mod_cancelled" model="ir.actions.act_window">
<field name="name">Cancelled</field>
<field name="res_model">sale.order</field>
<field name="view_mode">list,kanban,form</field>
<field name="view_ids" eval="[(5, 0, 0),
(0, 0, {'view_mode': 'list', 'view_id': ref('view_sale_order_list_mod')}),
(0, 0, {'view_mode': 'kanban', 'view_id': ref('view_sale_order_kanban_mod')})]"/>
<field name="search_view_id" ref="view_sale_order_search_mod"/>
<field name="domain">[('x_fc_sale_type', '=', 'march_of_dimes'), ('x_fc_mod_status', '=', 'cancelled')]</field>
<field name="context">{'default_x_fc_sale_type': 'march_of_dimes'}</field>
</record>
<record id="action_fc_muscular_dystrophy_orders" model="ir.actions.act_window">
@@ -1070,6 +1598,90 @@
<field name="context">{'default_move_type': 'out_invoice'}</field>
</record>
<!-- ===================================================================== -->
<!-- INVOICE ACTIONS PER FUNDING SOURCE -->
<!-- ===================================================================== -->
<record id="action_adp_client_invoices" model="ir.actions.act_window">
<field name="name">ADP Client Invoices</field>
<field name="res_model">account.move</field>
<field name="view_mode">list,form</field>
<field name="domain">[('x_fc_invoice_type', '=', 'adp_client'), ('move_type', 'in', ['out_invoice', 'out_refund'])]</field>
<field name="context">{'default_move_type': 'out_invoice'}</field>
</record>
<record id="action_odsp_invoices" model="ir.actions.act_window">
<field name="name">ODSP Invoices</field>
<field name="res_model">account.move</field>
<field name="view_mode">list,form</field>
<field name="domain">[('x_fc_invoice_type', 'in', ['odsp', 'adp_odsp']), ('move_type', 'in', ['out_invoice', 'out_refund'])]</field>
<field name="context">{'default_move_type': 'out_invoice'}</field>
</record>
<record id="action_mod_invoices" model="ir.actions.act_window">
<field name="name">MOD Invoices</field>
<field name="res_model">account.move</field>
<field name="view_mode">list,form</field>
<field name="domain">[('x_fc_invoice_type', '=', 'march_of_dimes'), ('move_type', 'in', ['out_invoice', 'out_refund'])]</field>
<field name="context">{'default_move_type': 'out_invoice'}</field>
</record>
<record id="action_wsib_invoices" model="ir.actions.act_window">
<field name="name">WSIB Invoices</field>
<field name="res_model">account.move</field>
<field name="view_mode">list,form</field>
<field name="domain">[('x_fc_invoice_type', '=', 'wsib'), ('move_type', 'in', ['out_invoice', 'out_refund'])]</field>
<field name="context">{'default_move_type': 'out_invoice'}</field>
</record>
<record id="action_insurance_invoices" model="ir.actions.act_window">
<field name="name">Insurance Invoices</field>
<field name="res_model">account.move</field>
<field name="view_mode">list,form</field>
<field name="domain">[('x_fc_invoice_type', '=', 'insurance'), ('move_type', 'in', ['out_invoice', 'out_refund'])]</field>
<field name="context">{'default_move_type': 'out_invoice'}</field>
</record>
<record id="action_direct_private_invoices" model="ir.actions.act_window">
<field name="name">Direct/Private Invoices</field>
<field name="res_model">account.move</field>
<field name="view_mode">list,form</field>
<field name="domain">[('x_fc_invoice_type', '=', 'direct_private'), ('move_type', 'in', ['out_invoice', 'out_refund'])]</field>
<field name="context">{'default_move_type': 'out_invoice'}</field>
</record>
<record id="action_hardship_invoices" model="ir.actions.act_window">
<field name="name">Hardship Invoices</field>
<field name="res_model">account.move</field>
<field name="view_mode">list,form</field>
<field name="domain">[('x_fc_invoice_type', '=', 'hardship'), ('move_type', 'in', ['out_invoice', 'out_refund'])]</field>
<field name="context">{'default_move_type': 'out_invoice'}</field>
</record>
<record id="action_rental_invoices" model="ir.actions.act_window">
<field name="name">Rental Invoices</field>
<field name="res_model">account.move</field>
<field name="view_mode">list,form</field>
<field name="domain">[('x_fc_invoice_type', '=', 'rental'), ('move_type', 'in', ['out_invoice', 'out_refund'])]</field>
<field name="context">{'default_move_type': 'out_invoice'}</field>
</record>
<record id="action_muscular_dystrophy_invoices" model="ir.actions.act_window">
<field name="name">Muscular Dystrophy Invoices</field>
<field name="res_model">account.move</field>
<field name="view_mode">list,form</field>
<field name="domain">[('x_fc_invoice_type', '=', 'muscular_dystrophy'), ('move_type', 'in', ['out_invoice', 'out_refund'])]</field>
<field name="context">{'default_move_type': 'out_invoice'}</field>
</record>
<record id="action_other_invoices" model="ir.actions.act_window">
<field name="name">Other Invoices</field>
<field name="res_model">account.move</field>
<field name="view_mode">list,form</field>
<field name="domain">[('x_fc_invoice_type', '=', 'other'), ('move_type', 'in', ['out_invoice', 'out_refund'])]</field>
<field name="context">{'default_move_type': 'out_invoice'}</field>
</record>
<!-- Open AI Agent Chat -->
<record id="action_fc_open_ai_chat" model="ir.actions.server">
<field name="name">Ask Fusion Claims AI</field>
@@ -1102,11 +1714,15 @@ else:
name="Fusion Claims"
web_icon="fusion_claims,static/description/icon.png"
sequence="30"
groups="group_fusion_claims_user,group_field_technician"/>
groups="group_fusion_claims_user,fusion_tasks.group_field_technician"/>
<!-- ===== ALL INVOICES ===== -->
<menuitem id="menu_fc_all_invoices" name="All Invoices" parent="menu_adp_claims_root"
action="action_fc_all_invoices" sequence="3"/>
<!-- ===== LTC MANAGEMENT ===== -->
<menuitem id="menu_fc_ltc"
name="LTC Management"
name="LTC"
parent="menu_adp_claims_root"
sequence="5"/>
<menuitem id="menu_ltc_overview"
@@ -1163,6 +1779,8 @@ else:
action="action_adp_orders_all" sequence="1"/>
<menuitem id="menu_adp_invoices" name="ADP Invoices" parent="menu_fc_adp"
action="action_adp_invoices" sequence="2"/>
<menuitem id="menu_adp_client_invoices" name="ADP Client Invoices" parent="menu_fc_adp"
action="action_adp_client_invoices" sequence="3"/>
<menuitem id="menu_adp_quotations"
name="Quotation Stage"
@@ -1270,14 +1888,139 @@ else:
sequence="25"/>
<menuitem id="menu_fc_odsp_all" name="All ODSP Cases" parent="menu_fc_odsp"
action="action_fc_odsp_orders" sequence="1"/>
<menuitem id="menu_odsp_invoices" name="ODSP Invoices" parent="menu_fc_odsp"
action="action_odsp_invoices" sequence="2"/>
<!-- ===== ODSP Standard ===== -->
<menuitem id="menu_fc_odsp_standard" name="ODSP Standard" parent="menu_fc_odsp"
action="action_fc_odsp_standard_orders" sequence="10"/>
sequence="10"/>
<menuitem id="menu_odsp_std_all" name="All Standard Cases" parent="menu_fc_odsp_standard"
action="action_fc_odsp_standard_orders" sequence="1"/>
<menuitem id="menu_odsp_std_quotation" name="Quotation" parent="menu_fc_odsp_standard"
action="action_odsp_std_quotation" sequence="10"/>
<menuitem id="menu_odsp_std_submitted" name="Submitted to ODSP" parent="menu_fc_odsp_standard"
action="action_odsp_std_submitted" sequence="12"/>
<menuitem id="menu_odsp_std_pre_approved" name="Pre-Approved" parent="menu_fc_odsp_standard"
action="action_odsp_std_pre_approved" sequence="14"/>
<menuitem id="menu_odsp_std_ready_delivery" name="Ready for Delivery" parent="menu_fc_odsp_standard"
action="action_odsp_std_ready_delivery" sequence="16"/>
<menuitem id="menu_odsp_std_delivered" name="Delivered" parent="menu_fc_odsp_standard"
action="action_odsp_std_delivered" sequence="18"/>
<menuitem id="menu_odsp_std_pod_submitted" name="POD Submitted" parent="menu_fc_odsp_standard"
action="action_odsp_std_pod_submitted" sequence="20"/>
<menuitem id="menu_odsp_std_payment_received" name="Payment Received" parent="menu_fc_odsp_standard"
action="action_odsp_std_payment_received" sequence="22"/>
<menuitem id="menu_odsp_std_case_closed" name="Case Closed" parent="menu_fc_odsp_standard"
action="action_odsp_std_case_closed" sequence="24"/>
<menuitem id="menu_odsp_std_special" name="Special Statuses" parent="menu_fc_odsp_standard"
sequence="50"/>
<menuitem id="menu_odsp_std_on_hold" name="On Hold" parent="menu_odsp_std_special"
action="action_odsp_std_on_hold" sequence="10"/>
<menuitem id="menu_odsp_std_denied" name="Denied" parent="menu_odsp_std_special"
action="action_odsp_std_denied" sequence="20"/>
<menuitem id="menu_odsp_std_cancelled" name="Cancelled" parent="menu_odsp_std_special"
action="action_odsp_std_cancelled" sequence="30"/>
<!-- ===== SA Mobility ===== -->
<menuitem id="menu_fc_odsp_sa_mobility" name="SA Mobility" parent="menu_fc_odsp"
action="action_fc_odsp_sa_mobility_orders" sequence="20"/>
sequence="20"/>
<menuitem id="menu_odsp_sa_all" name="All SA Cases" parent="menu_fc_odsp_sa_mobility"
action="action_fc_odsp_sa_mobility_orders" sequence="1"/>
<menuitem id="menu_odsp_sa_quotation" name="Quotation" parent="menu_fc_odsp_sa_mobility"
action="action_odsp_sa_quotation" sequence="10"/>
<menuitem id="menu_odsp_sa_form_ready" name="SA Form Ready" parent="menu_fc_odsp_sa_mobility"
action="action_odsp_sa_form_ready" sequence="12"/>
<menuitem id="menu_odsp_sa_submitted" name="Submitted to SA" parent="menu_fc_odsp_sa_mobility"
action="action_odsp_sa_submitted" sequence="14"/>
<menuitem id="menu_odsp_sa_pre_approved" name="Pre-Approved" parent="menu_fc_odsp_sa_mobility"
action="action_odsp_sa_pre_approved" sequence="16"/>
<menuitem id="menu_odsp_sa_ready_delivery" name="Ready for Delivery" parent="menu_fc_odsp_sa_mobility"
action="action_odsp_sa_ready_delivery" sequence="18"/>
<menuitem id="menu_odsp_sa_delivered" name="Delivered" parent="menu_fc_odsp_sa_mobility"
action="action_odsp_sa_delivered" sequence="20"/>
<menuitem id="menu_odsp_sa_pod_submitted" name="POD Submitted" parent="menu_fc_odsp_sa_mobility"
action="action_odsp_sa_pod_submitted" sequence="22"/>
<menuitem id="menu_odsp_sa_payment_received" name="Payment Received" parent="menu_fc_odsp_sa_mobility"
action="action_odsp_sa_payment_received" sequence="24"/>
<menuitem id="menu_odsp_sa_case_closed" name="Case Closed" parent="menu_fc_odsp_sa_mobility"
action="action_odsp_sa_case_closed" sequence="26"/>
<menuitem id="menu_odsp_sa_special" name="Special Statuses" parent="menu_fc_odsp_sa_mobility"
sequence="50"/>
<menuitem id="menu_odsp_sa_on_hold" name="On Hold" parent="menu_odsp_sa_special"
action="action_odsp_sa_on_hold" sequence="10"/>
<menuitem id="menu_odsp_sa_denied" name="Denied" parent="menu_odsp_sa_special"
action="action_odsp_sa_denied" sequence="20"/>
<menuitem id="menu_odsp_sa_cancelled" name="Cancelled" parent="menu_odsp_sa_special"
action="action_odsp_sa_cancelled" sequence="30"/>
<!-- ===== Ontario Works ===== -->
<menuitem id="menu_fc_odsp_ontario_works" name="Ontario Works" parent="menu_fc_odsp"
action="action_fc_odsp_ontario_works_orders" sequence="30"/>
<menuitem id="menu_fc_march_of_dimes" name="March of Dimes" parent="menu_adp_claims_root"
action="action_fc_march_of_dimes_orders" sequence="30"/>
sequence="30"/>
<menuitem id="menu_odsp_ow_all" name="All OW Cases" parent="menu_fc_odsp_ontario_works"
action="action_fc_odsp_ontario_works_orders" sequence="1"/>
<menuitem id="menu_odsp_ow_quotation" name="Quotation" parent="menu_fc_odsp_ontario_works"
action="action_odsp_ow_quotation" sequence="10"/>
<menuitem id="menu_odsp_ow_documents_ready" name="Documents Ready" parent="menu_fc_odsp_ontario_works"
action="action_odsp_ow_documents_ready" sequence="12"/>
<menuitem id="menu_odsp_ow_submitted" name="Submitted to OW" parent="menu_fc_odsp_ontario_works"
action="action_odsp_ow_submitted" sequence="14"/>
<menuitem id="menu_odsp_ow_payment_received" name="Payment Received" parent="menu_fc_odsp_ontario_works"
action="action_odsp_ow_payment_received" sequence="16"/>
<menuitem id="menu_odsp_ow_ready_delivery" name="Ready for Delivery" parent="menu_fc_odsp_ontario_works"
action="action_odsp_ow_ready_delivery" sequence="18"/>
<menuitem id="menu_odsp_ow_delivered" name="Delivered" parent="menu_fc_odsp_ontario_works"
action="action_odsp_ow_delivered" sequence="20"/>
<menuitem id="menu_odsp_ow_case_closed" name="Case Closed" parent="menu_fc_odsp_ontario_works"
action="action_odsp_ow_case_closed" sequence="22"/>
<menuitem id="menu_odsp_ow_special" name="Special Statuses" parent="menu_fc_odsp_ontario_works"
sequence="50"/>
<menuitem id="menu_odsp_ow_on_hold" name="On Hold" parent="menu_odsp_ow_special"
action="action_odsp_ow_on_hold" sequence="10"/>
<menuitem id="menu_odsp_ow_denied" name="Denied" parent="menu_odsp_ow_special"
action="action_odsp_ow_denied" sequence="20"/>
<menuitem id="menu_odsp_ow_cancelled" name="Cancelled" parent="menu_odsp_ow_special"
action="action_odsp_ow_cancelled" sequence="30"/>
<menuitem id="menu_fc_march_of_dimes" name="MOD" parent="menu_adp_claims_root"
sequence="30"/>
<menuitem id="menu_mod_all_cases" name="All MOD Cases" parent="menu_fc_march_of_dimes"
action="action_fc_march_of_dimes_orders" sequence="1"/>
<menuitem id="menu_mod_invoices" name="MOD Invoices" parent="menu_fc_march_of_dimes"
action="action_mod_invoices" sequence="2"/>
<menuitem id="menu_mod_schedule_assessment" name="Schedule Assessment" parent="menu_fc_march_of_dimes"
action="action_mod_schedule_assessment" sequence="10"/>
<menuitem id="menu_mod_assessment_booked" name="Assessment Booked" parent="menu_fc_march_of_dimes"
action="action_mod_assessment_booked" sequence="12"/>
<menuitem id="menu_mod_assessment_done" name="Assessment Done" parent="menu_fc_march_of_dimes"
action="action_mod_assessment_done" sequence="14"/>
<menuitem id="menu_mod_processing_drawing" name="Processing Drawing" parent="menu_fc_march_of_dimes"
action="action_mod_processing_drawing" sequence="16"/>
<menuitem id="menu_mod_quote_sent" name="Quote Sent" parent="menu_fc_march_of_dimes"
action="action_mod_quote_sent" sequence="18"/>
<menuitem id="menu_mod_awaiting_funding" name="Awaiting Funding" parent="menu_fc_march_of_dimes"
action="action_mod_awaiting_funding" sequence="20"/>
<menuitem id="menu_mod_approved" name="Approved" parent="menu_fc_march_of_dimes"
action="action_mod_approved" sequence="22"/>
<menuitem id="menu_mod_pca_received" name="PCA Received" parent="menu_fc_march_of_dimes"
action="action_mod_pca_received" sequence="24"/>
<menuitem id="menu_mod_in_production" name="In Production" parent="menu_fc_march_of_dimes"
action="action_mod_in_production" sequence="26"/>
<menuitem id="menu_mod_complete" name="Complete" parent="menu_fc_march_of_dimes"
action="action_mod_complete" sequence="28"/>
<menuitem id="menu_mod_pod_sent" name="POD Sent" parent="menu_fc_march_of_dimes"
action="action_mod_pod_sent" sequence="30"/>
<menuitem id="menu_mod_closed" name="Closed" parent="menu_fc_march_of_dimes"
action="action_mod_closed" sequence="32"/>
<!-- MOD Special Statuses -->
<menuitem id="menu_mod_special_statuses" name="Special Statuses" parent="menu_fc_march_of_dimes"
sequence="50"/>
<menuitem id="menu_mod_on_hold" name="On Hold" parent="menu_mod_special_statuses"
action="action_mod_on_hold" sequence="10"/>
<menuitem id="menu_mod_denied" name="Denied" parent="menu_mod_special_statuses"
action="action_mod_denied" sequence="20"/>
<menuitem id="menu_mod_cancelled" name="Cancelled" parent="menu_mod_special_statuses"
action="action_mod_cancelled" sequence="30"/>
<!-- ===== OTHER FUNDINGS SUBMENU ===== -->
<menuitem id="menu_fc_other_fundings" name="Other Fundings" parent="menu_adp_claims_root"
sequence="35"/>
@@ -1292,6 +2035,24 @@ else:
<menuitem id="menu_fc_wsib" name="WSIB" parent="menu_fc_other_fundings"
action="action_fc_wsib_orders" sequence="50"/>
<!-- Invoices submenu under Other Fundings -->
<menuitem id="menu_fc_other_invoices_sep" name="Invoices" parent="menu_fc_other_fundings"
sequence="60"/>
<menuitem id="menu_wsib_invoices" name="WSIB Invoices" parent="menu_fc_other_invoices_sep"
action="action_wsib_invoices" sequence="10"/>
<menuitem id="menu_insurance_invoices" name="Insurance Invoices" parent="menu_fc_other_invoices_sep"
action="action_insurance_invoices" sequence="20"/>
<menuitem id="menu_direct_private_invoices" name="Direct/Private Invoices" parent="menu_fc_other_invoices_sep"
action="action_direct_private_invoices" sequence="30"/>
<menuitem id="menu_hardship_invoices" name="Hardship Invoices" parent="menu_fc_other_invoices_sep"
action="action_hardship_invoices" sequence="40"/>
<menuitem id="menu_rental_invoices" name="Rental Invoices" parent="menu_fc_other_invoices_sep"
action="action_rental_invoices" sequence="50"/>
<menuitem id="menu_muscular_dystrophy_invoices" name="Muscular Dystrophy Invoices" parent="menu_fc_other_invoices_sep"
action="action_muscular_dystrophy_invoices" sequence="60"/>
<menuitem id="menu_other_type_invoices" name="Other Invoices" parent="menu_fc_other_invoices_sep"
action="action_other_invoices" sequence="70"/>
<!-- ===== CLIENT INTELLIGENCE ===== -->
<menuitem id="menu_fc_client_intelligence"
name="Client Intelligence"

View File

@@ -409,7 +409,7 @@
<!-- ===================================================================== -->
<menuitem id="menu_loaner_root"
name="Loaner Management"
name="Loaners"
parent="menu_adp_claims_root"
sequence="58"/>

View File

@@ -0,0 +1,89 @@
<?xml version="1.0" encoding="UTF-8"?>
<odoo>
<record id="view_page11_sign_request_list" model="ir.ui.view">
<field name="name">fusion.page11.sign.request.list</field>
<field name="model">fusion.page11.sign.request</field>
<field name="arch" type="xml">
<list>
<field name="sale_order_id"/>
<field name="signer_name"/>
<field name="signer_email"/>
<field name="signer_type"/>
<field name="sent_date"/>
<field name="signed_date"/>
<field name="expiry_date"/>
<field name="state" widget="badge"
decoration-success="state == 'signed'"
decoration-info="state == 'sent'"
decoration-warning="state == 'expired'"
decoration-danger="state == 'cancelled'"/>
</list>
</field>
</record>
<record id="view_page11_sign_request_form" model="ir.ui.view">
<field name="name">fusion.page11.sign.request.form</field>
<field name="model">fusion.page11.sign.request</field>
<field name="arch" type="xml">
<form string="Page 11 Signing Request">
<header>
<button name="action_resend" type="object" string="Resend Email"
class="btn-primary" invisible="state not in ('sent', 'expired')"/>
<button name="action_request_new_signature" type="object"
string="Request New Signature"
class="btn-warning" invisible="state not in ('signed', 'cancelled')"
confirm="This will cancel the current signed version and open a new signing request. Continue?"/>
<button name="action_cancel" type="object" string="Cancel"
class="btn-secondary" invisible="state not in ('draft', 'sent')"/>
<field name="state" widget="statusbar"
statusbar_visible="draft,sent,signed"/>
</header>
<sheet>
<group>
<group string="Request Details">
<field name="sale_order_id" readonly="1"/>
<field name="signer_name"/>
<field name="signer_email"/>
<field name="signer_type"/>
<field name="signer_relationship"
invisible="signer_type == 'client'"/>
</group>
<group string="Dates">
<field name="sent_date" readonly="1"/>
<field name="expiry_date"/>
<field name="signed_date" readonly="1"/>
</group>
</group>
<group string="Consent" invisible="state != 'signed'">
<field name="consent_signed_by"/>
<field name="consent_declaration_accepted"/>
</group>
<group string="Agent Details"
invisible="consent_signed_by != 'agent' or state != 'signed'">
<group>
<field name="agent_first_name"/>
<field name="agent_last_name"/>
<field name="agent_phone"/>
</group>
<group>
<field name="agent_street"/>
<field name="agent_city"/>
<field name="agent_province"/>
<field name="agent_postal_code"/>
</group>
</group>
<group string="Signature" invisible="state != 'signed'">
<field name="signature_data" widget="image" readonly="1"/>
</group>
<group string="Signed PDF" invisible="state != 'signed' or not signed_pdf">
<field name="signed_pdf" filename="signed_pdf_filename"/>
<field name="signed_pdf_filename" invisible="1"/>
</group>
<group string="Custom Message" invisible="not custom_message">
<field name="custom_message" readonly="1" nolabel="1"/>
</group>
</sheet>
</form>
</field>
</record>
</odoo>

View File

@@ -194,26 +194,6 @@
</div>
</div>
<h2>External APIs</h2>
<div class="row mt-4 o_settings_container">
<!-- Google Maps API Key -->
<div class="col-12 col-lg-6 o_setting_box">
<div class="o_setting_right_pane">
<span class="o_form_label">Google Maps API</span>
<div class="text-muted">
API key for Google Maps Places autocomplete in address fields (accessibility assessments, etc.)
</div>
<div class="mt-2">
<field name="fc_google_maps_api_key" placeholder="Enter your Google Maps API Key" password="True"/>
</div>
<div class="alert alert-info mt-2" role="alert">
<i class="fa fa-info-circle"/> Enable the "Places API" in your Google Cloud Console for address autocomplete.
</div>
</div>
</div>
</div>
<h2>AI Client Intelligence</h2>
<div class="row mt-4 o_settings_container">
@@ -256,117 +236,6 @@
</div>
</div>
<h2>Technician Management</h2>
<div class="row mt-4 o_settings_container">
<!-- Store Hours -->
<div class="col-12 col-lg-6 o_setting_box">
<div class="o_setting_right_pane">
<span class="o_form_label">Store / Scheduling Hours</span>
<div class="text-muted">
Operating hours for technician task scheduling. Tasks can only be booked
within these hours. Calendar view is also restricted to this range.
</div>
<div class="mt-2 d-flex align-items-center gap-2">
<field name="fc_store_open_hour" widget="float_time" style="max-width: 100px;"/>
<span>to</span>
<field name="fc_store_close_hour" widget="float_time" style="max-width: 100px;"/>
</div>
</div>
</div>
<!-- Distance Matrix Toggle -->
<div class="col-12 col-lg-6 o_setting_box">
<div class="o_setting_left_pane">
<field name="fc_google_distance_matrix_enabled"/>
</div>
<div class="o_setting_right_pane">
<label for="fc_google_distance_matrix_enabled"/>
<div class="text-muted">
Calculate travel time between technician tasks using Google Distance Matrix API.
Requires Google Maps API key above with Distance Matrix API enabled.
</div>
</div>
</div>
<!-- Start Address (Company Default / Fallback) -->
<div class="col-12 col-lg-6 o_setting_box">
<div class="o_setting_right_pane">
<span class="o_form_label">Default HQ / Fallback Address</span>
<div class="text-muted">
Company default start location used when a technician has no personal
start address set. Each technician can set their own start location
in their user profile or from the portal.
</div>
<div class="mt-2">
<field name="fc_technician_start_address" placeholder="e.g. 123 Main St, Brampton, ON"/>
</div>
</div>
</div>
<!-- Location History Retention -->
<div class="col-12 col-lg-6 o_setting_box">
<div class="o_setting_right_pane">
<span class="o_form_label">Location History Retention</span>
<div class="text-muted">
How many days to keep technician GPS location history before automatic cleanup.
</div>
<div class="mt-2 d-flex align-items-center gap-2">
<field name="fc_location_retention_days" placeholder="30" style="max-width: 80px;"/>
<span class="text-muted">days</span>
</div>
<div class="text-muted small mt-1">
Leave empty = 30 days. Enter 0 = delete at end of each day. 1+ = keep that many days.
</div>
</div>
</div>
</div>
<h2>Push Notifications</h2>
<div class="row mt-4 o_settings_container">
<!-- Push Enable -->
<div class="col-12 col-lg-6 o_setting_box">
<div class="o_setting_left_pane">
<field name="fc_push_enabled"/>
</div>
<div class="o_setting_right_pane">
<label for="fc_push_enabled"/>
<div class="text-muted">
Send web push notifications to technicians about upcoming tasks.
Requires VAPID keys (auto-generated on first save if empty).
</div>
</div>
</div>
<!-- Advance Minutes -->
<div class="col-12 col-lg-6 o_setting_box">
<div class="o_setting_right_pane">
<span class="o_form_label">Notification Advance Time</span>
<div class="text-muted">
Send push notification this many minutes before a scheduled task.
</div>
<div class="mt-2">
<field name="fc_push_advance_minutes"/> minutes
</div>
</div>
</div>
<!-- VAPID Public Key -->
<div class="col-12 col-lg-6 o_setting_box">
<div class="o_setting_right_pane">
<span class="o_form_label">VAPID Public Key</span>
<div class="mt-2">
<field name="fc_vapid_public_key" placeholder="Auto-generated"/>
</div>
</div>
</div>
<!-- VAPID Private Key -->
<div class="col-12 col-lg-6 o_setting_box">
<div class="o_setting_right_pane">
<span class="o_form_label">VAPID Private Key</span>
<div class="mt-2">
<field name="fc_vapid_private_key" password="True" placeholder="Auto-generated"/>
</div>
</div>
</div>
</div>
<h2>March of Dimes</h2>
<div class="row mt-4 o_settings_container">

View File

@@ -1088,6 +1088,13 @@
invisible="x_fc_technician_task_count == 0">
<field name="x_fc_technician_task_count" widget="statinfo" string="Tasks"/>
</button>
<!-- Page 11 Signing Requests -->
<button name="action_view_page11_requests" type="object"
class="oe_stat_button" icon="fa-pencil-square-o"
invisible="page11_sign_request_count == 0">
<field name="page11_sign_request_count" widget="statinfo" string="Page 11 Requests"/>
</button>
</xpath>
</field>
</record>
@@ -1201,6 +1208,18 @@
invisible="not x_fc_is_adp_sale or x_fc_adp_application_status not in ('quotation', 'assessment_scheduled')"
help="Mark assessment as completed (override available from Quotation stage)"/>
<!-- Request Page 11 Remote Signature (before Application Received) -->
<button name="action_request_page11_signature" type="object"
string="Request Page 11 Signature" class="btn-warning"
icon="fa-pencil-square-o"
invisible="not x_fc_is_adp_sale or x_fc_adp_application_status not in ('assessment_completed', 'waiting_for_application', 'application_received') or x_fc_signed_pages_11_12"
help="Send Page 11 to a family member or agent for remote digital signing"/>
<button name="action_request_page11_signature" type="object"
string="Re-sign Page 11" class="btn-secondary"
icon="fa-repeat"
invisible="not x_fc_is_adp_sale or x_fc_adp_application_status not in ('assessment_completed', 'waiting_for_application', 'application_received') or not x_fc_signed_pages_11_12"
help="Page 11 already signed. Click to request a new signature."/>
<!-- Waiting for Application -> Application Received -->
<button name="action_application_received" type="object"
string="Application Received" class="btn-info"
@@ -1274,12 +1293,19 @@
invisible="not x_fc_is_adp_sale or x_fc_adp_application_status not in ('submitted', 'resubmitted', 'needs_correction', 'accepted', 'approved', 'approved_deduction', 'ready_delivery', 'ready_bill')"
help="Put this application on hold"/>
<button name="%(fusion_claims.action_set_status_withdrawn)d"
<button name="%(fusion_claims.action_set_status_withdrawn)d"
type="action" string="Withdraw" class="btn-secondary"
icon="fa-undo"
invisible="not x_fc_is_adp_sale or x_fc_adp_application_status not in ('submitted', 'resubmitted', 'needs_correction', 'accepted', 'approved', 'approved_deduction', 'ready_bill')"
help="Withdraw this application"/>
<button name="action_resubmit_from_withdrawn" type="object"
string="Resubmit Application" class="btn-primary"
icon="fa-repeat"
invisible="not x_fc_is_adp_sale or x_fc_adp_application_status != 'withdrawn'"
confirm="This will return the application to Ready for Submission status. Continue?"
help="Return this withdrawn application to Ready for Submission"/>
<!-- ============================================================ -->
<!-- REVIEW BUTTONS (color changes based on verified/approved) -->
<!-- ============================================================ -->
@@ -1493,10 +1519,16 @@
icon="fa-pause"
invisible="x_fc_adp_application_status in ('on_hold', 'denied', 'withdrawn', 'cancelled', 'case_closed')"/>
<button name="action_resume_from_hold" type="object"
string="Resume"
string="Resume"
class="btn-success btn-sm me-1"
icon="fa-play"
invisible="x_fc_adp_application_status != 'on_hold'"/>
<button name="action_resubmit_from_withdrawn" type="object"
string="Resubmit Application"
class="btn-primary btn-sm me-1"
icon="fa-repeat"
invisible="x_fc_adp_application_status != 'withdrawn'"
confirm="This will return the application to Ready for Submission status. Continue?"/>
<button name="%(fusion_claims.action_set_status_withdrawn)d"
type="action" string="Withdraw"
class="btn-secondary btn-sm me-1"
@@ -1815,8 +1847,14 @@
widget="binary" nolabel="1" class="fc-tile-upload-field"
required="x_fc_is_adp_sale and x_fc_adp_application_status not in ('quotation', 'assessment_scheduled', 'assessment_completed', 'waiting_for_application', 'application_received')"
readonly="x_fc_case_locked"/>
<button name="action_request_page11_signature" type="object"
class="btn btn-sm btn-outline-primary mt-1"
string="Request Signature"
title="Send Page 11 to a family member or agent for remote signing"
invisible="x_fc_signed_pages_11_12 or not x_fc_is_adp_sale"/>
</div>
</div>
<field name="page11_sign_status" invisible="1"/>
</div>
</div>
</div>
@@ -2105,22 +2143,6 @@
</div>
</div>
<!-- SYNC TO INVOICES - Shows when there are invoices to sync -->
<div class="alert alert-secondary mb-3" role="alert"
invisible="not x_fc_has_adp_invoice and not x_fc_has_client_invoice">
<div class="d-flex align-items-center justify-content-between">
<div>
<strong><i class="fa fa-refresh"/> Sync ADP Fields</strong>
<p class="mb-0 small text-muted">
Push claim number, client references, dates, and serial numbers from this order to linked invoices.
</p>
</div>
<button name="action_sync_adp_fields" type="object"
string="Sync to Invoices" class="btn btn-secondary btn-sm ms-3"
icon="fa-refresh"/>
</div>
</div>
<!-- DEDUCTION ALERT - Only show when there are deductions -->
<field name="x_fc_has_deductions" invisible="1"/>
<field name="x_fc_total_deduction_amount" invisible="1"/>

View File

@@ -1,80 +0,0 @@
<?xml version="1.0" encoding="utf-8"?>
<odoo>
<!-- ================================================================== -->
<!-- SYNC CONFIG - FORM VIEW -->
<!-- ================================================================== -->
<record id="view_task_sync_config_form" model="ir.ui.view">
<field name="name">fusion.task.sync.config.form</field>
<field name="model">fusion.task.sync.config</field>
<field name="arch" type="xml">
<form string="Task Sync Configuration">
<header>
<button name="action_test_connection" type="object"
string="Test Connection" class="btn-secondary" icon="fa-plug"/>
<button name="action_sync_now" type="object"
string="Sync Now" class="btn-success" icon="fa-sync"/>
</header>
<sheet>
<div class="oe_title">
<h1><field name="name" placeholder="e.g. Westin Healthcare"/></h1>
</div>
<group>
<group string="Connection">
<field name="instance_id" placeholder="e.g. westin"/>
<field name="url" placeholder="http://192.168.1.40:8069"/>
<field name="database" placeholder="e.g. westin-v19"/>
<field name="username" placeholder="e.g. admin"/>
<field name="api_key" password="True"/>
<field name="active"/>
</group>
<group string="Status">
<field name="last_sync"/>
<field name="last_sync_error" readonly="1"/>
</group>
</group>
<div class="alert alert-info mt-3">
<i class="fa fa-info-circle"/>
Technicians are matched across instances by their
<strong>Tech Sync ID</strong> field (Settings &gt; Users).
Set the same ID (e.g. "gordy") on both instances for each shared technician.
</div>
</sheet>
</form>
</field>
</record>
<!-- ================================================================== -->
<!-- SYNC CONFIG - LIST VIEW -->
<!-- ================================================================== -->
<record id="view_task_sync_config_list" model="ir.ui.view">
<field name="name">fusion.task.sync.config.list</field>
<field name="model">fusion.task.sync.config</field>
<field name="arch" type="xml">
<list>
<field name="name"/>
<field name="instance_id"/>
<field name="url"/>
<field name="database"/>
<field name="active"/>
<field name="last_sync"/>
</list>
</field>
</record>
<!-- ================================================================== -->
<!-- SYNC CONFIG - ACTION + MENU -->
<!-- ================================================================== -->
<record id="action_task_sync_config" model="ir.actions.act_window">
<field name="name">Task Sync Instances</field>
<field name="res_model">fusion.task.sync.config</field>
<field name="view_mode">list,form</field>
</record>
<menuitem id="menu_task_sync_config"
name="Task Sync"
parent="fusion_claims.menu_technician_schedule"
action="action_task_sync_config"
sequence="99"/>
</odoo>

View File

@@ -1,113 +0,0 @@
<?xml version="1.0" encoding="utf-8"?>
<odoo>
<!-- ================================================================== -->
<!-- LIST VIEW -->
<!-- ================================================================== -->
<record id="view_technician_location_list" model="ir.ui.view">
<field name="name">fusion.technician.location.list</field>
<field name="model">fusion.technician.location</field>
<field name="arch" type="xml">
<list string="Technician Locations" create="0" edit="0"
default_order="logged_at desc">
<field name="user_id" widget="many2one_avatar_user"/>
<field name="logged_at" string="Time"/>
<field name="latitude" optional="hide"/>
<field name="longitude" optional="hide"/>
<field name="accuracy" string="Accuracy (m)" optional="hide"/>
<field name="source"/>
</list>
</field>
</record>
<!-- ================================================================== -->
<!-- FORM VIEW (read-only) -->
<!-- ================================================================== -->
<record id="view_technician_location_form" model="ir.ui.view">
<field name="name">fusion.technician.location.form</field>
<field name="model">fusion.technician.location</field>
<field name="arch" type="xml">
<form string="Location Log" create="0" edit="0">
<sheet>
<group>
<group>
<field name="user_id"/>
<field name="logged_at"/>
<field name="source"/>
</group>
<group>
<field name="latitude"/>
<field name="longitude"/>
<field name="accuracy"/>
</group>
</group>
</sheet>
</form>
</field>
</record>
<!-- ================================================================== -->
<!-- SEARCH VIEW -->
<!-- ================================================================== -->
<record id="view_technician_location_search" model="ir.ui.view">
<field name="name">fusion.technician.location.search</field>
<field name="model">fusion.technician.location</field>
<field name="arch" type="xml">
<search string="Search Location Logs">
<field name="user_id" string="Technician"/>
<separator/>
<filter string="Today" name="filter_today"
domain="[('logged_at', '>=', context_today().strftime('%Y-%m-%d'))]"/>
<filter string="Last 7 Days" name="filter_7d"
domain="[('logged_at', '>=', (context_today() - datetime.timedelta(days=7)).strftime('%Y-%m-%d'))]"/>
<filter string="Last 30 Days" name="filter_30d"
domain="[('logged_at', '>=', (context_today() - datetime.timedelta(days=30)).strftime('%Y-%m-%d'))]"/>
<separator/>
<filter string="Technician" name="group_user" context="{'group_by': 'user_id'}"/>
<filter string="Date" name="group_date" context="{'group_by': 'logged_at:day'}"/>
<filter string="Source" name="group_source" context="{'group_by': 'source'}"/>
</search>
</field>
</record>
<!-- ================================================================== -->
<!-- ACTION -->
<!-- ================================================================== -->
<record id="action_technician_locations" model="ir.actions.act_window">
<field name="name">Location History</field>
<field name="res_model">fusion.technician.location</field>
<field name="view_mode">list,form</field>
<field name="search_view_id" ref="view_technician_location_search"/>
<field name="context">{
'search_default_filter_today': 1,
'search_default_group_user': 1,
}</field>
<field name="help" type="html">
<p class="o_view_nocontent_smiling_face">
No location data logged yet.
</p>
<p>Technician locations are automatically logged when they use the portal.</p>
</field>
</record>
<!-- ================================================================== -->
<!-- MENU ITEMS (under Technician Management) -->
<!-- ================================================================== -->
<menuitem id="menu_technician_locations"
name="Location History"
parent="menu_technician_management"
action="action_technician_locations"
sequence="50"/>
<!-- CRON: Cleanup old location records (runs daily) -->
<record id="ir_cron_cleanup_technician_locations" model="ir.cron">
<field name="name">Cleanup Old Technician Locations</field>
<field name="model_id" ref="model_fusion_technician_location"/>
<field name="state">code</field>
<field name="code">model._cron_cleanup_old_locations()</field>
<field name="interval_number">1</field>
<field name="interval_type">days</field>
<field name="active">True</field>
</record>
</odoo>

View File

@@ -1,541 +1,156 @@
<?xml version="1.0" encoding="utf-8"?>
<!--
Copyright 2024-2026 Nexa Systems Inc.
License OPL-1 (Odoo Proprietary License v1.0)
Claims-specific extensions to the base technician task views
defined in fusion_tasks. Adds SO/PO/facility/rental fields.
-->
<odoo>
<!-- ================================================================== -->
<!-- SEQUENCE -->
<!-- SEARCH VIEW EXTENSION -->
<!-- ================================================================== -->
<record id="seq_technician_task" model="ir.sequence">
<field name="name">Technician Task</field>
<field name="code">fusion.technician.task</field>
<field name="prefix">TASK-</field>
<field name="padding">5</field>
<field name="number_increment">1</field>
</record>
<!-- ================================================================== -->
<!-- RES.USERS FORM EXTENSION - Field Staff toggle -->
<!-- ================================================================== -->
<record id="view_users_form_field_staff" model="ir.ui.view">
<field name="name">res.users.form.field.staff</field>
<field name="model">res.users</field>
<field name="inherit_id" ref="base.view_users_form"/>
<record id="view_technician_task_search_claims" model="ir.ui.view">
<field name="name">fusion.technician.task.search.claims</field>
<field name="model">fusion.technician.task</field>
<field name="inherit_id" ref="fusion_tasks.view_technician_task_search"/>
<field name="arch" type="xml">
<xpath expr="//field[@name='share']" position="after">
<field name="x_fc_is_field_staff"/>
<field name="x_fc_start_address"
invisible="not x_fc_is_field_staff"
placeholder="e.g. 123 Main St, Brampton, ON"/>
<field name="x_fc_tech_sync_id"
invisible="not x_fc_is_field_staff"
placeholder="e.g. gordy, manpreet"/>
<xpath expr="//filter[@name='filter_pod']" position="after">
<filter string="Has Purchase Order" name="has_po"
domain="[('purchase_order_id', '!=', False)]"/>
</xpath>
</field>
</record>
<!-- ================================================================== -->
<!-- SEARCH VIEW -->
<!-- FORM VIEW EXTENSION -->
<!-- ================================================================== -->
<record id="view_technician_task_search" model="ir.ui.view">
<field name="name">fusion.technician.task.search</field>
<record id="view_technician_task_form_claims" model="ir.ui.view">
<field name="name">fusion.technician.task.form.claims</field>
<field name="model">fusion.technician.task</field>
<field name="inherit_id" ref="fusion_tasks.view_technician_task_form"/>
<field name="arch" type="xml">
<search string="Search Tasks">
<!-- Quick Filters -->
<filter string="Today" name="filter_today"
domain="[('scheduled_date', '=', context_today().strftime('%Y-%m-%d'))]"/>
<filter string="Tomorrow" name="filter_tomorrow"
domain="[('scheduled_date', '=', (context_today() + datetime.timedelta(days=1)).strftime('%Y-%m-%d'))]"/>
<filter string="This Week" name="filter_this_week"
domain="[('scheduled_date', '>=', (context_today() - datetime.timedelta(days=context_today().weekday())).strftime('%Y-%m-%d')),
('scheduled_date', '&lt;=', (context_today() + datetime.timedelta(days=6-context_today().weekday())).strftime('%Y-%m-%d'))]"/>
<separator/>
<filter string="Pending" name="filter_pending" domain="[('status', '=', 'pending')]"/>
<filter string="Scheduled" name="filter_scheduled" domain="[('status', '=', 'scheduled')]"/>
<filter string="En Route" name="filter_en_route" domain="[('status', '=', 'en_route')]"/>
<filter string="In Progress" name="filter_in_progress" domain="[('status', '=', 'in_progress')]"/>
<filter string="Completed" name="filter_completed" domain="[('status', '=', 'completed')]"/>
<filter string="Active" name="filter_active" domain="[('status', 'not in', ['cancelled', 'completed'])]"/>
<separator/>
<filter string="My Tasks" name="filter_my_tasks"
domain="['|', ('technician_id', '=', uid), ('additional_technician_ids', 'in', [uid])]"/>
<filter string="Deliveries" name="filter_deliveries" domain="[('task_type', '=', 'delivery')]"/>
<filter string="Repairs" name="filter_repairs" domain="[('task_type', '=', 'repair')]"/>
<filter string="POD Required" name="filter_pod" domain="[('pod_required', '=', True)]"/>
<filter string="Has Purchase Order" name="has_po"
domain="[('purchase_order_id', '!=', False)]"/>
<separator/>
<filter string="Local Tasks" name="filter_local"
domain="[('x_fc_sync_source', '=', False)]"/>
<filter string="Synced Tasks" name="filter_synced"
domain="[('x_fc_sync_source', '!=', False)]"/>
<separator/>
<!-- Group By -->
<filter string="Technician" name="group_technician" context="{'group_by': 'technician_id'}"/>
<filter string="Date" name="group_date" context="{'group_by': 'scheduled_date'}"/>
<filter string="Status" name="group_status" context="{'group_by': 'status'}"/>
<filter string="Task Type" name="group_type" context="{'group_by': 'task_type'}"/>
<filter string="Client" name="group_client" context="{'group_by': 'partner_id'}"/>
</search>
<!-- Stat buttons: View Case + Purchase Order -->
<xpath expr="//div[@name='button_box']" position="inside">
<button name="action_view_sale_order" type="object"
class="oe_stat_button" icon="fa-file-text-o"
invisible="not sale_order_id">
<div class="o_field_widget o_stat_info">
<span class="o_stat_text">View Case</span>
</div>
</button>
<button name="action_view_purchase_order" type="object"
class="oe_stat_button" icon="fa-shopping-cart"
invisible="not purchase_order_id">
<div class="o_field_widget o_stat_info">
<span class="o_stat_text">Purchase Order</span>
</div>
</button>
</xpath>
<!-- Add facility_id, sale_order_id, purchase_order_id after priority -->
<xpath expr="//field[@name='priority']" position="after">
<field name="facility_id"
invisible="task_type != 'ltc_visit'"/>
<field name="sale_order_id"
invisible="task_type == 'ltc_visit'"/>
<field name="purchase_order_id"
invisible="task_type == 'ltc_visit'"/>
</xpath>
<!-- Add Rental Inspection tab after Completion tab -->
<xpath expr="//page[@name='completion']" position="after">
<page string="Rental Inspection" name="rental_inspection"
invisible="task_type != 'pickup'">
<group>
<group string="Condition">
<field name="rental_inspection_condition"/>
<field name="rental_inspection_completed"/>
</group>
</group>
<group string="Inspection Notes">
<field name="rental_inspection_notes" nolabel="1"/>
</group>
<group string="Inspection Photos">
<field name="rental_inspection_photo_ids"
widget="many2many_binary" nolabel="1"/>
</group>
</page>
</xpath>
</field>
</record>
<!-- ================================================================== -->
<!-- FORM VIEW -->
<!-- LIST VIEW EXTENSION -->
<!-- ================================================================== -->
<record id="view_technician_task_form" model="ir.ui.view">
<field name="name">fusion.technician.task.form</field>
<record id="view_technician_task_list_claims" model="ir.ui.view">
<field name="name">fusion.technician.task.list.claims</field>
<field name="model">fusion.technician.task</field>
<field name="inherit_id" ref="fusion_tasks.view_technician_task_list"/>
<field name="arch" type="xml">
<form string="Technician Task">
<field name="x_fc_is_shadow" invisible="1"/>
<field name="x_fc_sync_source" invisible="1"/>
<header>
<button name="action_start_en_route" type="object" string="En Route"
class="btn-primary" invisible="status != 'scheduled' or x_fc_is_shadow"/>
<button name="action_start_task" type="object" string="Start Task"
class="btn-primary" invisible="status not in ('scheduled', 'en_route') or x_fc_is_shadow"/>
<button name="action_complete_task" type="object" string="Complete"
class="btn-success" invisible="status not in ('in_progress', 'en_route') or x_fc_is_shadow"/>
<button name="action_reschedule" type="object" string="Reschedule"
class="btn-warning" invisible="status not in ('scheduled', 'en_route') or x_fc_is_shadow"/>
<button name="action_cancel_task" type="object" string="Cancel"
class="btn-danger" invisible="status in ('completed', 'cancelled') or x_fc_is_shadow"
confirm="Are you sure you want to cancel this task?"/>
<button name="action_reset_to_scheduled" type="object" string="Reset to Scheduled"
invisible="status not in ('cancelled', 'rescheduled') or x_fc_is_shadow"/>
<button string="Calculate Travel"
class="btn-secondary o_fc_calculate_travel" icon="fa-car"
invisible="x_fc_is_shadow"/>
<field name="status" widget="statusbar"
statusbar_visible="pending,scheduled,en_route,in_progress,completed"/>
</header>
<sheet>
<!-- Shadow task banner -->
<div class="alert alert-info text-center" role="alert"
invisible="not x_fc_is_shadow">
<strong><i class="fa fa-link"/> This task is synced from
<field name="x_fc_sync_source" readonly="1" nolabel="1" class="d-inline"/>
— view only.</strong>
</div>
<div class="oe_button_box" name="button_box">
<button name="action_view_sale_order" type="object"
class="oe_stat_button" icon="fa-file-text-o"
invisible="not sale_order_id">
<div class="o_field_widget o_stat_info">
<span class="o_stat_text">View Case</span>
</div>
</button>
<button name="action_view_purchase_order" type="object"
class="oe_stat_button" icon="fa-shopping-cart"
invisible="not purchase_order_id">
<div class="o_field_widget o_stat_info">
<span class="o_stat_text">Purchase Order</span>
</div>
</button>
</div>
<widget name="web_ribbon" title="Completed" bg_color="text-bg-success"
invisible="status != 'completed'"/>
<widget name="web_ribbon" title="Cancelled" bg_color="text-bg-danger"
invisible="status != 'cancelled'"/>
<widget name="web_ribbon" title="Synced" bg_color="text-bg-info"
invisible="not x_fc_is_shadow or status in ('completed', 'cancelled')"/>
<div class="oe_title">
<h1>
<field name="name" readonly="1"/>
</h1>
</div>
<!-- Schedule Info Banner -->
<field name="schedule_info_html" nolabel="1" colspan="2"
invisible="not technician_id or not scheduled_date"/>
<!-- Previous Task / Travel Warning Banner -->
<field name="prev_task_summary_html" nolabel="1" colspan="2"
invisible="not technician_id or not scheduled_date"/>
<!-- Hidden fields for calendar sync and legacy -->
<field name="datetime_start" invisible="1"/>
<field name="datetime_end" invisible="1"/>
<field name="time_start_12h" invisible="1"/>
<field name="time_end_12h" invisible="1"/>
<group>
<group string="Assignment">
<field name="technician_id"
domain="[('x_fc_is_field_staff', '=', True)]"/>
<field name="additional_technician_ids"
widget="many2many_tags_avatar"
domain="[('x_fc_is_field_staff', '=', True), ('id', '!=', technician_id)]"
options="{'color_field': 'color'}"/>
<field name="task_type"/>
<field name="priority" widget="priority"/>
<field name="facility_id"
invisible="task_type != 'ltc_visit'"/>
<field name="sale_order_id"
invisible="task_type == 'ltc_visit'"/>
<field name="purchase_order_id"
invisible="task_type == 'ltc_visit'"/>
</group>
<group string="Schedule">
<field name="scheduled_date"/>
<field name="time_start" widget="float_time"
string="Start Time"/>
<field name="duration_hours" widget="float_time"
string="Duration"/>
<field name="time_end" widget="float_time"
string="End Time" readonly="1"
force_save="1"/>
</group>
</group>
<group>
<group string="Client">
<field name="partner_id"/>
<field name="partner_phone" widget="phone"/>
</group>
<group string="Location">
<field name="is_in_store"/>
<field name="address_partner_id" invisible="is_in_store"/>
<field name="address_street" readonly="is_in_store"/>
<field name="address_street2" string="Unit/Suite #" invisible="is_in_store"/>
<field name="address_buzz_code" invisible="is_in_store"/>
<field name="address_city" invisible="1"/>
<field name="address_state_id" invisible="1"/>
<field name="address_zip" invisible="1"/>
<field name="address_lat" invisible="1"/>
<field name="address_lng" invisible="1"/>
</group>
</group>
<group>
<group string="Travel (Auto-Calculated)">
<field name="travel_time_minutes" readonly="1"/>
<field name="travel_distance_km" readonly="1"/>
<field name="travel_origin" readonly="1"/>
<field name="previous_task_id" readonly="1"/>
</group>
<group string="Options">
<field name="pod_required"/>
<field name="active" invisible="1"/>
</group>
</group>
<notebook>
<page string="Description" name="description">
<group>
<field name="description" placeholder="What needs to be done..."/>
</group>
<group>
<field name="equipment_needed" placeholder="Tools, parts, materials..."/>
</group>
</page>
<page string="Completion" name="completion">
<group>
<field name="completion_datetime"/>
<field name="completion_notes"/>
</group>
<group>
<field name="voice_note_transcription"/>
</group>
</page>
<page string="Rental Inspection" name="rental_inspection"
invisible="task_type != 'pickup'">
<group>
<group string="Condition">
<field name="rental_inspection_condition"/>
<field name="rental_inspection_completed"/>
</group>
</group>
<group string="Inspection Notes">
<field name="rental_inspection_notes" nolabel="1"/>
</group>
<group string="Inspection Photos">
<field name="rental_inspection_photo_ids"
widget="many2many_binary" nolabel="1"/>
</group>
</page>
</notebook>
</sheet>
<chatter/>
</form>
</field>
</record>
<!-- ================================================================== -->
<!-- LIST VIEW -->
<!-- ================================================================== -->
<record id="view_technician_task_list" model="ir.ui.view">
<field name="name">fusion.technician.task.list</field>
<field name="model">fusion.technician.task</field>
<field name="arch" type="xml">
<list string="Technician Tasks" decoration-success="status == 'completed'"
decoration-warning="status == 'in_progress'"
decoration-info="status == 'en_route'"
decoration-danger="status == 'cancelled'"
decoration-muted="status == 'rescheduled'"
default_order="scheduled_date, sequence, time_start">
<field name="name"/>
<field name="technician_id" widget="many2one_avatar_user"/>
<field name="additional_technician_ids" widget="many2many_tags_avatar"
optional="show" string="+ Techs"/>
<field name="task_type" decoration-bf="1"/>
<field name="scheduled_date"/>
<field name="time_start_display" string="Start"/>
<field name="time_end_display" string="End"/>
<field name="partner_id"/>
<field name="address_city"/>
<field name="travel_time_minutes" string="Travel (min)" optional="show"/>
<field name="status" widget="badge"
decoration-success="status == 'completed'"
decoration-warning="status == 'in_progress'"
decoration-info="status in ('scheduled', 'en_route')"
decoration-danger="status == 'cancelled'"/>
<field name="priority" widget="priority" optional="hide"/>
<field name="pod_required" optional="hide"/>
<xpath expr="//field[@name='pod_required']" position="after">
<field name="sale_order_id" optional="hide"/>
<field name="purchase_order_id" optional="hide"/>
<field name="x_fc_source_label" string="Source" optional="show"
widget="badge" decoration-info="x_fc_is_shadow"
decoration-success="not x_fc_is_shadow"/>
</list>
</xpath>
</field>
</record>
<!-- ================================================================== -->
<!-- KANBAN VIEW -->
<!-- ================================================================== -->
<record id="view_technician_task_kanban" model="ir.ui.view">
<field name="name">fusion.technician.task.kanban</field>
<field name="model">fusion.technician.task</field>
<field name="arch" type="xml">
<kanban default_group_by="status" class="o_kanban_small_column"
records_draggable="1" group_create="0">
<field name="color"/>
<field name="priority"/>
<field name="technician_id"/>
<field name="additional_technician_ids"/>
<field name="additional_tech_count"/>
<field name="partner_id"/>
<field name="task_type"/>
<field name="scheduled_date"/>
<field name="time_start_display"/>
<field name="address_city"/>
<field name="travel_time_minutes"/>
<field name="status"/>
<field name="x_fc_is_shadow"/>
<field name="x_fc_sync_client_name"/>
<templates>
<t t-name="card">
<div t-attf-class="oe_kanban_color_#{record.color.raw_value} oe_kanban_card oe_kanban_global_click">
<div class="oe_kanban_content">
<div class="o_kanban_record_top mb-1">
<div class="o_kanban_record_headings">
<strong class="o_kanban_record_title">
<field name="name"/>
</strong>
</div>
<field name="priority" widget="priority"/>
</div>
<div class="mb-1">
<span class="badge bg-primary me-1"><field name="task_type"/></span>
<span class="text-muted"><field name="scheduled_date"/> - <field name="time_start_display"/></span>
</div>
<div class="mb-1">
<i class="fa fa-user me-1"/>
<t t-if="record.x_fc_is_shadow.raw_value">
<span t-out="record.x_fc_sync_client_name.value"/>
</t>
<t t-else="">
<field name="partner_id"/>
</t>
</div>
<div class="text-muted small" t-if="record.address_city.raw_value">
<i class="fa fa-map-marker me-1"/><field name="address_city"/>
<t t-if="record.travel_time_minutes.raw_value">
<span class="ms-2"><i class="fa fa-car me-1"/><field name="travel_time_minutes"/> min</span>
</t>
</div>
<div t-if="record.additional_tech_count.raw_value > 0" class="text-muted small mb-1">
<i class="fa fa-users me-1"/>
<span>+<field name="additional_tech_count"/> technician(s)</span>
</div>
<div class="o_kanban_record_bottom mt-2">
<div class="oe_kanban_bottom_left">
<field name="activity_ids" widget="kanban_activity"/>
</div>
<div class="oe_kanban_bottom_right">
<field name="technician_id" widget="many2one_avatar_user"/>
</div>
</div>
</div>
</div>
</t>
</templates>
</kanban>
</field>
</record>
<!-- ================================================================== -->
<!-- CALENDAR VIEW -->
<!-- ================================================================== -->
<record id="view_technician_task_calendar" model="ir.ui.view">
<field name="name">fusion.technician.task.calendar</field>
<field name="model">fusion.technician.task</field>
<field name="arch" type="xml">
<calendar string="Technician Schedule"
date_start="datetime_start" date_stop="datetime_end"
color="technician_id" mode="week" event_open_popup="1"
quick_create="0">
<!-- Displayed on the calendar card -->
<field name="partner_id"/>
<field name="x_fc_sync_client_name"/>
<field name="task_type"/>
<field name="time_start_display" string="Start"/>
<field name="time_end_display" string="End"/>
<!-- Popover (hover/click) details -->
<field name="name"/>
<field name="technician_id" avatar_field="image_128"/>
<field name="address_display" string="Address"/>
<field name="travel_time_minutes" string="Travel (min)"/>
<field name="status"/>
<field name="duration_hours" widget="float_time" string="Duration"/>
</calendar>
</field>
</record>
<!-- ================================================================== -->
<!-- MAP VIEW (Enterprise web_map) -->
<!-- ================================================================== -->
<record id="view_technician_task_map" model="ir.ui.view">
<field name="name">fusion.technician.task.map</field>
<field name="model">fusion.technician.task</field>
<field name="arch" type="xml">
<map res_partner="address_partner_id" default_order="time_start"
routing="1" js_class="fusion_task_map">
<field name="partner_id" string="Client"/>
<field name="task_type" string="Type"/>
<field name="technician_id" string="Technician"/>
<field name="time_start_display" string="Start"/>
<field name="time_end_display" string="End"/>
<field name="status" string="Status"/>
<field name="travel_time_minutes" string="Travel (min)"/>
</map>
</field>
</record>
<!-- ================================================================== -->
<!-- ACTIONS -->
<!-- MENU ITEMS - Field Service under Claims app -->
<!-- ================================================================== -->
<!-- Main Tasks Action (List/Kanban) -->
<record id="action_technician_tasks" model="ir.actions.act_window">
<field name="name">Technician Tasks</field>
<field name="res_model">fusion.technician.task</field>
<field name="view_mode">list,kanban,form,calendar,map</field>
<field name="search_view_id" ref="view_technician_task_search"/>
<field name="context">{'search_default_filter_active': 1}</field>
<field name="help" type="html">
<p class="o_view_nocontent_smiling_face">
Create your first technician task
</p>
<p>Schedule deliveries, repairs, and other field tasks for your technicians.</p>
</field>
</record>
<!-- Schedule Action (Map default) -->
<record id="action_technician_schedule" model="ir.actions.act_window">
<field name="name">Schedule</field>
<field name="res_model">fusion.technician.task</field>
<field name="view_mode">map,calendar,list,kanban,form</field>
<field name="search_view_id" ref="view_technician_task_search"/>
<field name="context">{'search_default_filter_active': 1}</field>
</record>
<!-- Map View Action (for app landing page) -->
<record id="action_technician_map_view" model="ir.actions.act_window">
<field name="name">Delivery Map</field>
<field name="res_model">fusion.technician.task</field>
<field name="view_mode">map,list,kanban,form,calendar</field>
<field name="search_view_id" ref="view_technician_task_search"/>
<field name="context">{'search_default_filter_active': 1}</field>
</record>
<!-- Today's Tasks Action -->
<record id="action_technician_tasks_today" model="ir.actions.act_window">
<field name="name">Today's Tasks</field>
<field name="res_model">fusion.technician.task</field>
<field name="view_mode">kanban,list,form,map</field>
<field name="search_view_id" ref="view_technician_task_search"/>
<field name="context">{'search_default_filter_today': 1, 'search_default_filter_active': 1}</field>
</record>
<!-- My Tasks Action -->
<record id="action_technician_my_tasks" model="ir.actions.act_window">
<field name="name">My Tasks</field>
<field name="res_model">fusion.technician.task</field>
<field name="view_mode">list,kanban,form,calendar,map</field>
<field name="search_view_id" ref="view_technician_task_search"/>
<field name="context">{'search_default_filter_my_tasks': 1, 'search_default_filter_active': 1}</field>
</record>
<!-- Pending Tasks Action -->
<record id="action_technician_tasks_pending" model="ir.actions.act_window">
<field name="name">Pending Tasks</field>
<field name="res_model">fusion.technician.task</field>
<field name="view_mode">list,kanban,form</field>
<field name="search_view_id" ref="view_technician_task_search"/>
<field name="context">{'search_default_filter_pending': 1}</field>
</record>
<!-- ================================================================== -->
<!-- MENU ITEMS -->
<!-- ================================================================== -->
<!-- Field Service - top-level menu (sequence 3 = first child = app default) -->
<!-- Field Service parent menu under Claims -->
<menuitem id="menu_technician_management"
name="Field Service"
parent="fusion_claims.menu_adp_claims_root"
sequence="3"
groups="fusion_claims.group_fusion_claims_user,fusion_claims.group_field_technician"/>
groups="fusion_claims.group_fusion_claims_user,fusion_tasks.group_field_technician"/>
<!-- Delivery Map - first item under Field Service = default landing view -->
<!-- Delivery Map - first item = default landing view -->
<menuitem id="menu_fc_delivery_map"
name="Delivery Map"
parent="menu_technician_management"
action="action_technician_map_view"
action="fusion_tasks.action_technician_map_view"
sequence="5"
groups="fusion_claims.group_fusion_claims_user,fusion_claims.group_field_technician"/>
groups="fusion_claims.group_fusion_claims_user,fusion_tasks.group_field_technician"/>
<menuitem id="menu_technician_tasks_today"
name="Today's Tasks"
parent="menu_technician_management"
action="action_technician_tasks_today"
action="fusion_tasks.action_technician_tasks_today"
sequence="10"/>
<menuitem id="menu_technician_schedule"
name="Schedule"
parent="menu_technician_management"
action="action_technician_schedule"
action="fusion_tasks.action_technician_schedule"
sequence="15"/>
<menuitem id="menu_technician_tasks_pending"
name="Pending Tasks"
parent="menu_technician_management"
action="action_technician_tasks_pending"
action="fusion_tasks.action_technician_tasks_pending"
sequence="20"/>
<menuitem id="menu_technician_tasks"
name="All Tasks"
parent="menu_technician_management"
action="action_technician_tasks"
action="fusion_tasks.action_technician_tasks"
sequence="30"/>
<menuitem id="menu_technician_my_tasks"
name="My Tasks"
parent="menu_technician_management"
action="action_technician_my_tasks"
action="fusion_tasks.action_technician_my_tasks"
sequence="35"
groups="fusion_claims.group_field_technician"/>
groups="fusion_tasks.group_field_technician"/>
<!-- Task Sync under Field Service in Claims -->
<menuitem id="menu_task_sync_claims"
name="Task Sync"
parent="menu_technician_management"
action="fusion_tasks.action_task_sync_config"
sequence="99"/>
</odoo>