This commit is contained in:
gsinghpal
2026-02-23 00:32:20 -05:00
parent d6bac8e623
commit e8e554de95
549 changed files with 1330 additions and 124935 deletions

View File

@@ -237,47 +237,55 @@
<field name="partner_id"/>
<field name="x_fc_claim_number"/>
<field name="x_fc_authorizer_id"/>
<field name="x_fc_client_ref_1" string="Client Reference 1"/>
<field name="x_fc_client_ref_2" string="Client Reference 2"/>
<separator/>
<!-- Status Filters - Active Workflow -->
<filter string="Quotation" name="filter_quotation"
<filter string="Quotation" name="filter_quotation"
domain="[('x_fc_adp_application_status', '=', 'quotation')]"/>
<filter string="Assessment Scheduled" name="filter_assessment_scheduled"
<filter string="Assessment Scheduled" name="filter_assessment_scheduled"
domain="[('x_fc_adp_application_status', '=', 'assessment_scheduled')]"/>
<filter string="Assessment Completed" name="filter_assessment_completed"
<filter string="Assessment Completed" name="filter_assessment_completed"
domain="[('x_fc_adp_application_status', '=', 'assessment_completed')]"/>
<filter string="Waiting for Application" name="filter_waiting_for_application"
<filter string="Waiting for Application" name="filter_waiting_for_application"
domain="[('x_fc_adp_application_status', '=', 'waiting_for_application')]"/>
<filter string="Application Received" name="filter_application_received"
<filter string="Application Received" name="filter_application_received"
domain="[('x_fc_adp_application_status', '=', 'application_received')]"/>
<filter string="Ready for Submission" name="filter_ready_submission"
<filter string="Ready for Submission" name="filter_ready_submission"
domain="[('x_fc_adp_application_status', '=', 'ready_submission')]"/>
<filter string="Submitted" name="filter_submitted"
<filter string="Submitted" name="filter_submitted"
domain="[('x_fc_adp_application_status', '=', 'submitted')]"/>
<filter string="Resubmitted" name="filter_resubmitted"
<filter string="Accepted by ADP" name="filter_accepted"
domain="[('x_fc_adp_application_status', '=', 'accepted')]"/>
<filter string="Rejected by ADP" name="filter_rejected"
domain="[('x_fc_adp_application_status', '=', 'rejected')]"/>
<filter string="Resubmitted" name="filter_resubmitted"
domain="[('x_fc_adp_application_status', '=', 'resubmitted')]"/>
<filter string="Needs Correction" name="filter_needs_correction"
<filter string="Needs Correction" name="filter_needs_correction"
domain="[('x_fc_adp_application_status', '=', 'needs_correction')]"/>
<filter string="Approved" name="filter_approved"
<filter string="Approved" name="filter_approved"
domain="[('x_fc_adp_application_status', '=', 'approved')]"/>
<filter string="Approved with Deduction" name="filter_approved_deduction"
<filter string="Approved with Deduction" name="filter_approved_deduction"
domain="[('x_fc_adp_application_status', '=', 'approved_deduction')]"/>
<filter string="Ready to Bill" name="filter_ready_bill"
<filter string="Ready for Delivery" name="filter_ready_delivery"
domain="[('x_fc_adp_application_status', '=', 'ready_delivery')]"/>
<filter string="Ready to Bill" name="filter_ready_bill"
domain="[('x_fc_adp_application_status', '=', 'ready_bill')]"/>
<filter string="Billed to ADP" name="filter_billed"
<filter string="Billed to ADP" name="filter_billed"
domain="[('x_fc_adp_application_status', '=', 'billed')]"/>
<filter string="Case Closed" name="filter_case_closed"
<filter string="Case Closed" name="filter_case_closed"
domain="[('x_fc_adp_application_status', '=', 'case_closed')]"/>
<separator/>
<!-- Special Status Filters -->
<filter string="On Hold" name="filter_on_hold"
<filter string="On Hold" name="filter_on_hold"
domain="[('x_fc_adp_application_status', '=', 'on_hold')]"/>
<filter string="Withdrawn" name="filter_withdrawn"
<filter string="Withdrawn" name="filter_withdrawn"
domain="[('x_fc_adp_application_status', '=', 'withdrawn')]"/>
<filter string="Denied" name="filter_denied"
<filter string="Denied" name="filter_denied"
domain="[('x_fc_adp_application_status', '=', 'denied')]"/>
<filter string="Cancelled" name="filter_cancelled"
<filter string="Cancelled" name="filter_cancelled"
domain="[('x_fc_adp_application_status', '=', 'cancelled')]"/>
<filter string="Expired" name="filter_expired"
<filter string="Expired" name="filter_expired"
domain="[('x_fc_adp_application_status', '=', 'expired')]"/>
<separator/>
<!-- Group By -->
@@ -419,6 +427,30 @@
<field name="domain">[('x_fc_is_adp_sale', '=', True), ('x_fc_adp_application_status', 'in', ['submitted', 'resubmitted'])]</field>
</record>
<!-- 6b. Accepted by ADP -->
<record id="action_adp_accepted" model="ir.actions.act_window">
<field name="name">Accepted by ADP</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_adp')}),
(0, 0, {'view_mode': 'kanban', 'view_id': ref('view_sale_order_kanban_adp')})]"/>
<field name="search_view_id" ref="view_sale_order_search_adp"/>
<field name="domain">[('x_fc_is_adp_sale', '=', True), ('x_fc_adp_application_status', '=', 'accepted')]</field>
</record>
<!-- 6c. Rejected by ADP -->
<record id="action_adp_rejected" model="ir.actions.act_window">
<field name="name">Rejected by ADP</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_adp')}),
(0, 0, {'view_mode': 'kanban', 'view_id': ref('view_sale_order_kanban_adp')})]"/>
<field name="search_view_id" ref="view_sale_order_search_adp"/>
<field name="domain">[('x_fc_is_adp_sale', '=', True), ('x_fc_adp_application_status', '=', 'rejected')]</field>
</record>
<!-- 7. Needs Correction -->
<record id="action_adp_needs_correction" model="ir.actions.act_window">
<field name="name">Needs Correction</field>
@@ -967,81 +999,98 @@ else:
parent="menu_adp_claims_root"
sequence="20"/>
<menuitem id="menu_adp_quotations"
name="Quotation Stage"
<menuitem id="menu_adp_all_orders" name="All ADP Orders" parent="menu_fc_adp"
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_quotations"
name="Quotation Stage"
parent="menu_fc_adp"
action="action_adp_quotations"
sequence="10"/>
<menuitem id="menu_adp_assessment_scheduled"
name="Assessment Scheduled"
<menuitem id="menu_adp_assessment_scheduled"
name="Assessment Scheduled"
parent="menu_fc_adp"
action="action_adp_assessment_scheduled"
sequence="12"/>
<menuitem id="menu_adp_assessment_completed"
name="Waiting for Application"
<menuitem id="menu_adp_assessment_completed"
name="Waiting for Application"
parent="menu_fc_adp"
action="action_adp_assessment_completed"
sequence="14"/>
<menuitem id="menu_adp_application_received"
name="Application Received"
<menuitem id="menu_adp_application_received"
name="Application Received"
parent="menu_fc_adp"
action="action_adp_application_received"
sequence="16"/>
<menuitem id="menu_adp_ready_submission"
name="Ready for Submission"
<menuitem id="menu_adp_ready_submission"
name="Ready for Submission"
parent="menu_fc_adp"
action="action_adp_ready_submission"
sequence="18"/>
<menuitem id="menu_adp_pending_approval"
name="Application Submitted"
<menuitem id="menu_adp_pending_approval"
name="Application Submitted"
parent="menu_fc_adp"
action="action_adp_pending_approval"
sequence="20"/>
<menuitem id="menu_adp_needs_correction"
name="Needs Correction"
<menuitem id="menu_adp_accepted"
name="Accepted by ADP"
parent="menu_fc_adp"
action="action_adp_needs_correction"
action="action_adp_accepted"
sequence="21"/>
<menuitem id="menu_adp_rejected"
name="Rejected by ADP"
parent="menu_fc_adp"
action="action_adp_rejected"
sequence="22"/>
<menuitem id="menu_adp_approved"
name="Application Approved"
<menuitem id="menu_adp_needs_correction"
name="Needs Correction"
parent="menu_fc_adp"
action="action_adp_needs_correction"
sequence="23"/>
<menuitem id="menu_adp_approved"
name="Application Approved"
parent="menu_fc_adp"
action="action_adp_approved"
sequence="25"/>
<menuitem id="menu_adp_ready_delivery"
name="Ready for Delivery"
<menuitem id="menu_adp_ready_delivery"
name="Ready for Delivery"
parent="menu_fc_adp"
action="action_adp_ready_delivery"
sequence="27"/>
<menuitem id="menu_adp_ready_billing"
name="Ready for Billing"
<menuitem id="menu_adp_ready_billing"
name="Ready for Billing"
parent="menu_fc_adp"
action="action_adp_ready_billing"
sequence="30"/>
<menuitem id="menu_adp_billed"
name="Billed to ADP"
<menuitem id="menu_adp_billed"
name="Billed to ADP"
parent="menu_fc_adp"
action="action_adp_billed"
sequence="35"/>
<menuitem id="menu_adp_closed"
name="Case Closed"
<menuitem id="menu_adp_closed"
name="Case Closed"
parent="menu_fc_adp"
action="action_adp_closed"
sequence="40"/>
<!-- ADP Special Statuses -->
<menuitem id="menu_adp_special_statuses"
name="Special Statuses"
<menuitem id="menu_adp_special_statuses"
name="Special Statuses"
parent="menu_fc_adp"
sequence="50"/>
@@ -1056,14 +1105,6 @@ else:
<menuitem id="menu_adp_expired" name="Expired" parent="menu_adp_special_statuses"
action="action_adp_expired" sequence="50"/>
<!-- ADP All Records -->
<menuitem id="menu_adp_all_records" name="All Records" parent="menu_fc_adp"
sequence="60"/>
<menuitem id="menu_adp_all_orders" name="All ADP Orders" parent="menu_adp_all_records"
action="action_adp_orders_all" sequence="10"/>
<menuitem id="menu_adp_invoices" name="ADP Invoices" parent="menu_adp_all_records"
action="action_adp_invoices" sequence="20"/>
<!-- ===== FUNDING TYPE MENUS ===== -->
<menuitem id="menu_fc_odsp" name="ODSP" parent="menu_adp_claims_root"
sequence="25"/>

View File

@@ -1,105 +1,6 @@
<?xml version="1.0" encoding="utf-8"?>
<odoo>
<!-- SA Signature Template - Form View -->
<record id="view_fusion_sa_signature_template_form" model="ir.ui.view">
<field name="name">fusion.sa.signature.template.form</field>
<field name="model">fusion.sa.signature.template</field>
<field name="arch" type="xml">
<form string="SA Signature Template">
<sheet>
<div class="oe_title">
<h1><field name="name" placeholder="e.g. SA Mobility Standard"/></h1>
</div>
<group>
<group>
<field name="sa_default_sig_page" string="Default Signature Page"/>
<field name="active"/>
</group>
<group>
<field name="notes" placeholder="Usage notes"/>
</group>
</group>
<div class="row mt-3">
<div class="col-5">
<h4>Signature Coordinates</h4>
<div class="text-muted mb-2" style="font-size: 0.85em;">
PDF points (72 pts = 1 inch). Y = from top.
</div>
<group string="Name">
<field name="sa_sig_name_x" string="X"/>
<field name="sa_sig_name_y" string="Y from top"/>
</group>
<group string="Date">
<field name="sa_sig_date_x" string="X"/>
<field name="sa_sig_date_y" string="Y from top"/>
</group>
<group string="Signature">
<field name="sa_sig_x" string="X"/>
<field name="sa_sig_y" string="Y from top"/>
<field name="sa_sig_w" string="Width"/>
<field name="sa_sig_h" string="Height"/>
</group>
<separator/>
<group>
<field name="preview_pdf" filename="preview_pdf_filename"
string="Sample PDF"/>
<field name="preview_pdf_filename" invisible="1"/>
<field name="preview_pdf_page" string="Preview Page"
help="0 = use Default Signature Page above"/>
</group>
</div>
<div class="col-7">
<h4>Preview</h4>
<div class="text-muted mb-2" style="font-size: 0.85em;">
Upload a sample PDF on the left to see where signatures land.
</div>
<field name="preview_image" widget="image" invisible="not preview_image"
options="{'size': [700, 0]}" class="w-100"/>
<div invisible="preview_image" class="text-muted text-center p-5"
style="border: 1px dashed #666; border-radius: 8px;">
<p>No preview available.</p>
<p>Upload a sample SA Mobility approval PDF to see signature placement.</p>
</div>
</div>
</div>
</sheet>
</form>
</field>
</record>
<!-- SA Signature Template - List View -->
<record id="view_fusion_sa_signature_template_list" model="ir.ui.view">
<field name="name">fusion.sa.signature.template.list</field>
<field name="model">fusion.sa.signature.template</field>
<field name="arch" type="xml">
<list string="SA Signature Templates">
<field name="name"/>
<field name="sa_default_sig_page" string="Sig Page"/>
<field name="active" column_invisible="1"/>
</list>
</field>
</record>
<!-- SA Signature Template - Action -->
<record id="action_fusion_sa_signature_templates" model="ir.actions.act_window">
<field name="name">SA Signature Templates</field>
<field name="res_model">fusion.sa.signature.template</field>
<field name="view_mode">list,form</field>
<field name="help" type="html">
<p class="o_view_nocontent_smiling_face">
Create a SA Mobility Signature Template
</p>
<p>
Define where client name, date, and signature are placed on ODSP approval forms.
Set once, used automatically for all SA Mobility cases.
</p>
</field>
</record>
<!-- Menu item under Configuration -->
<menuitem id="menu_fusion_sa_signature_templates"
name="SA Signature Templates"
parent="menu_adp_config"
action="action_fusion_sa_signature_templates"
sequence="45"/>
<!-- SA Signature Templates have been retired.
ODSP signing positions are now managed via Configuration > PDF Templates
(category = ODSP) using the drag-and-drop visual editor. -->
</odoo>

View File

@@ -0,0 +1,80 @@
<?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

@@ -25,6 +25,9 @@
<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>
</field>
</record>
@@ -56,6 +59,13 @@
<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'}"/>
@@ -75,26 +85,36 @@
<field name="model">fusion.technician.task</field>
<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'"/>
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')"/>
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')"/>
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')"/>
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')"
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')"/>
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"/>
class="btn-secondary o_fc_calculate_travel" icon="fa-car"
invisible="x_fc_is_shadow"/>
<field name="status" widget="statusbar"
statusbar_visible="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"
@@ -103,11 +123,20 @@
<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"/>
@@ -135,6 +164,7 @@
<field name="task_type"/>
<field name="priority" widget="priority"/>
<field name="sale_order_id"/>
<field name="purchase_order_id"/>
</group>
<group string="Schedule">
<field name="scheduled_date"/>
@@ -234,6 +264,10 @@
<field name="priority" widget="priority" optional="hide"/>
<field name="pod_required" optional="hide"/>
<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>
</field>
</record>
@@ -257,6 +291,8 @@
<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">
@@ -274,7 +310,13 @@
<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"/><field name="partner_id"/>
<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"/>
@@ -311,6 +353,7 @@
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"/>