This commit is contained in:
gsinghpal
2026-02-24 01:18:44 -05:00
parent e8e554de95
commit f85658c03a
41 changed files with 4440 additions and 119 deletions

View File

@@ -612,13 +612,131 @@
<field name="help" type="html"><p class="o_view_nocontent_smiling_face">No ACSD cases yet</p></field>
</record>
<!-- ===================================================================== -->
<!-- ODSP: LIST VIEW -->
<!-- ===================================================================== -->
<record id="view_sale_order_list_odsp" model="ir.ui.view">
<field name="name">sale.order.list.odsp</field>
<field name="model">sale.order</field>
<field name="arch" type="xml">
<list string="ODSP Cases" default_order="date_order desc, id desc">
<!-- Always visible -->
<field name="name" string="Order"/>
<field name="date_order" string="Date" optional="show"/>
<field name="partner_id" string="Client"/>
<field name="x_fc_odsp_member_id" string="Member ID" optional="show"/>
<field name="x_fc_odsp_division" optional="show"/>
<!-- Division-specific status columns -->
<field name="x_fc_odsp_std_status" widget="badge" string="ODSP Status"
decoration-info="x_fc_odsp_std_status in ('quotation','submitted_to_odsp')"
decoration-warning="x_fc_odsp_std_status in ('pre_approved','on_hold')"
decoration-success="x_fc_odsp_std_status in ('ready_delivery','delivered','pod_submitted','payment_received','case_closed')"
decoration-danger="x_fc_odsp_std_status in ('denied','cancelled')"
optional="show"/>
<field name="x_fc_sa_status" widget="badge" string="SA Status"
decoration-info="x_fc_sa_status in ('quotation','form_ready','submitted_to_sa')"
decoration-warning="x_fc_sa_status in ('pre_approved','on_hold')"
decoration-success="x_fc_sa_status in ('ready_delivery','delivered','pod_submitted','payment_received','case_closed')"
decoration-danger="x_fc_sa_status in ('denied','cancelled')"
optional="hide"/>
<field name="x_fc_ow_status" widget="badge" string="OW Status"
decoration-info="x_fc_ow_status in ('quotation','documents_ready','submitted_to_ow')"
decoration-warning="x_fc_ow_status in ('on_hold')"
decoration-success="x_fc_ow_status in ('payment_received','ready_delivery','delivered','case_closed')"
decoration-danger="x_fc_ow_status in ('denied','cancelled')"
optional="hide"/>
<!-- ODSP contacts -->
<field name="x_fc_odsp_office_id" optional="show"/>
<field name="x_fc_odsp_case_worker_name" optional="show"/>
<field name="user_id" string="Sales Rep" optional="hide"/>
<field name="x_fc_authorizer_id" optional="hide"/>
<!-- Amounts -->
<field name="amount_total" widget="monetary" sum="Grand Total" optional="show"/>
<!-- Misc -->
<field name="x_fc_on_hold_date" optional="hide"/>
<field name="x_fc_case_locked" optional="hide"/>
<field name="state" widget="badge" decoration-success="state == 'sale'"
decoration-info="state == 'draft'" optional="hide"/>
</list>
</field>
</record>
<!-- ===================================================================== -->
<!-- ODSP: SEARCH VIEW -->
<!-- ===================================================================== -->
<record id="view_sale_order_search_odsp" model="ir.ui.view">
<field name="name">sale.order.search.odsp</field>
<field name="model">sale.order</field>
<field name="arch" type="xml">
<search string="Search ODSP Cases">
<field name="name"/>
<field name="partner_id"/>
<field name="x_fc_odsp_member_id"/>
<field name="x_fc_odsp_office_id"/>
<field name="x_fc_odsp_case_worker_name"/>
<separator/>
<!-- ODSP Standard Status -->
<filter string="Quotation" name="filter_quotation"
domain="[('x_fc_odsp_std_status', '=', 'quotation')]"/>
<filter string="Submitted to ODSP" name="filter_submitted_odsp"
domain="[('x_fc_odsp_std_status', '=', 'submitted_to_odsp')]"/>
<filter string="Pre-Approved" name="filter_pre_approved"
domain="[('x_fc_odsp_std_status', '=', 'pre_approved')]"/>
<filter string="Ready for Delivery" name="filter_ready_delivery"
domain="[('x_fc_odsp_std_status', '=', 'ready_delivery')]"/>
<filter string="Delivered" name="filter_delivered"
domain="[('x_fc_odsp_std_status', '=', 'delivered')]"/>
<filter string="POD Submitted" name="filter_pod_submitted"
domain="[('x_fc_odsp_std_status', '=', 'pod_submitted')]"/>
<filter string="Payment Received" name="filter_payment_received"
domain="[('x_fc_odsp_std_status', '=', 'payment_received')]"/>
<filter string="Case Closed" name="filter_case_closed"
domain="[('x_fc_odsp_std_status', '=', 'case_closed')]"/>
<separator/>
<!-- Special Status -->
<filter string="On Hold" name="filter_on_hold"
domain="[('x_fc_odsp_std_status', '=', 'on_hold')]"/>
<filter string="Denied" name="filter_denied"
domain="[('x_fc_odsp_std_status', '=', 'denied')]"/>
<filter string="Cancelled" name="filter_cancelled"
domain="[('x_fc_odsp_std_status', '=', 'cancelled')]"/>
<separator/>
<!-- Division Filters -->
<filter string="ODSP Standard" name="filter_division_standard"
domain="[('x_fc_odsp_division', '=', 'standard')]"/>
<filter string="SA Mobility" name="filter_division_sa"
domain="[('x_fc_odsp_division', '=', 'sa_mobility')]"/>
<filter string="Ontario Works" name="filter_division_ow"
domain="[('x_fc_odsp_division', '=', 'ontario_works')]"/>
<separator/>
<!-- Group By -->
<filter string="ODSP Division" name="group_division" context="{'group_by': 'x_fc_odsp_division'}"/>
<filter string="ODSP Status" name="group_odsp_status" context="{'group_by': 'x_fc_odsp_std_status'}"/>
<filter string="SA Status" name="group_sa_status" context="{'group_by': 'x_fc_sa_status'}"/>
<filter string="OW Status" name="group_ow_status" context="{'group_by': 'x_fc_ow_status'}"/>
<filter string="ODSP Office" name="group_odsp_office" context="{'group_by': 'x_fc_odsp_office_id'}"/>
<filter string="Salesperson" name="group_salesperson" context="{'group_by': 'user_id'}"/>
<filter string="Create Month" name="group_create_month" context="{'group_by': 'create_date:month'}"/>
<filter string="Create Quarter" name="group_create_quarter" context="{'group_by': 'create_date:quarter'}"/>
<filter string="Create Year" name="group_create_year" context="{'group_by': 'create_date:year'}"/>
</search>
</field>
</record>
<!-- ===================================================================== -->
<!-- ODSP: ACTIONS -->
<!-- ===================================================================== -->
<record id="action_fc_odsp_orders" model="ir.actions.act_window">
<field name="name">All ODSP Cases</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_adp')})]"/>
<field name="search_view_id" ref="view_sale_order_search_adp"/>
(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'])]</field>
<field name="context">{'default_x_fc_sale_type': 'odsp'}</field>
<field name="help" type="html"><p class="o_view_nocontent_smiling_face">No ODSP cases yet</p></field>
@@ -629,8 +747,8 @@
<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_adp')})]"/>
<field name="search_view_id" ref="view_sale_order_search_adp"/>
(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')]</field>
<field name="context">{'default_x_fc_sale_type': 'odsp', 'default_x_fc_odsp_division': 'standard'}</field>
<field name="help" type="html"><p class="o_view_nocontent_smiling_face">No ODSP Standard cases yet</p></field>
@@ -641,8 +759,8 @@
<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_adp')})]"/>
<field name="search_view_id" ref="view_sale_order_search_adp"/>
(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')]</field>
<field name="context">{'default_x_fc_sale_type': 'odsp', 'default_x_fc_odsp_division': 'sa_mobility'}</field>
<field name="help" type="html"><p class="o_view_nocontent_smiling_face">No SA Mobility cases yet</p></field>
@@ -653,8 +771,8 @@
<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_adp')})]"/>
<field name="search_view_id" ref="view_sale_order_search_adp"/>
(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')]</field>
<field name="context">{'default_x_fc_sale_type': 'odsp', 'default_x_fc_odsp_division': 'ontario_works'}</field>
<field name="help" type="html"><p class="o_view_nocontent_smiling_face">No Ontario Works cases yet</p></field>
@@ -986,12 +1104,54 @@ else:
sequence="30"
groups="group_fusion_claims_user,group_field_technician"/>
<!-- ===== DASHBOARD ===== -->
<menuitem id="menu_fc_dashboard"
name="Dashboard"
<!-- ===== LTC MANAGEMENT ===== -->
<menuitem id="menu_fc_ltc"
name="LTC Management"
parent="menu_adp_claims_root"
action="action_fusion_claims_dashboard"
sequence="5"/>
<menuitem id="menu_ltc_overview"
name="Overview"
parent="menu_fc_ltc"
action="action_ltc_repairs_kanban"
sequence="1"/>
<menuitem id="menu_ltc_repairs"
name="Repair Requests"
parent="menu_fc_ltc"
sequence="10"/>
<menuitem id="menu_ltc_repairs_all"
name="All Repairs"
parent="menu_ltc_repairs"
action="action_ltc_repairs_all"
sequence="1"/>
<menuitem id="menu_ltc_repairs_new"
name="New / Pending"
parent="menu_ltc_repairs"
action="action_ltc_repairs_new"
sequence="2"/>
<menuitem id="menu_ltc_repairs_progress"
name="In Progress"
parent="menu_ltc_repairs"
action="action_ltc_repairs_in_progress"
sequence="3"/>
<menuitem id="menu_ltc_repairs_completed"
name="Completed"
parent="menu_ltc_repairs"
action="action_ltc_repairs_completed"
sequence="4"/>
<menuitem id="menu_ltc_cleanup"
name="Cleanup Schedule"
parent="menu_fc_ltc"
action="action_ltc_cleanups"
sequence="20"/>
<menuitem id="menu_ltc_locations"
name="Locations"
parent="menu_fc_ltc"
sequence="30"/>
<menuitem id="menu_ltc_facilities"
name="Facilities"
parent="menu_ltc_locations"
action="action_ltc_facilities"
sequence="1"/>
<!-- ===== ADP SUBMENU (full workflow) ===== -->
<menuitem id="menu_fc_adp"
@@ -1156,6 +1316,22 @@ else:
action="action_device_import_wizard" sequence="20"/>
<menuitem id="menu_import_xml_files" name="Import XML Files" parent="menu_adp_config"
action="action_xml_import_wizard" sequence="30"/>
<menuitem id="menu_ltc_repair_stages" name="LTC Repair Stages" parent="menu_adp_config"
action="action_ltc_repair_stages" sequence="40"/>
<menuitem id="menu_forms_management"
name="Forms Management"
parent="menu_adp_config"
sequence="50"/>
<menuitem id="menu_form_submissions"
name="Form Submissions"
parent="menu_forms_management"
action="action_ltc_form_submissions"
sequence="1"/>
<menuitem id="menu_forms_settings"
name="Forms Settings"
parent="menu_forms_management"
action="action_fusion_claims_settings"
sequence="2"/>
<menuitem id="menu_fusion_claims_settings" name="Settings" parent="menu_adp_config"
action="action_fusion_claims_settings" sequence="90"/>

View File

@@ -13,17 +13,29 @@
<field name="name">fusion.loaner.checkout.list</field>
<field name="model">fusion.loaner.checkout</field>
<field name="arch" type="xml">
<list decoration-danger="state == 'overdue'"
<list decoration-danger="state == 'overdue'"
decoration-warning="state == 'rental_pending'"
decoration-muted="state in ('returned', 'lost')">
decoration-muted="state in ('returned', 'lost')"
default_order="checkout_date desc, id desc">
<field name="name"/>
<field name="partner_id"/>
<field name="product_id"/>
<field name="lot_id" optional="show"/>
<field name="checkout_date"/>
<field name="expected_return_date"/>
<field name="actual_return_date" optional="hide"/>
<field name="days_out"/>
<field name="state" widget="badge"/>
<field name="days_overdue" optional="hide"/>
<field name="sales_rep_id" optional="hide"/>
<field name="checkout_condition" optional="hide"/>
<field name="return_condition" optional="hide"/>
<field name="sale_order_id" optional="hide"/>
<field name="state" widget="badge"
decoration-info="state == 'draft'"
decoration-success="state == 'checked_out'"
decoration-danger="state in ('overdue', 'lost')"
decoration-warning="state == 'rental_pending'"
decoration-muted="state in ('returned', 'converted_rental')"/>
</list>
</field>
</record>
@@ -43,6 +55,21 @@
statusbar_visible="draft,checked_out,returned"/>
</header>
<sheet>
<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">Sale Order</span>
</div>
</button>
<button name="action_view_partner" type="object"
class="oe_stat_button" icon="fa-user">
<div class="o_field_widget o_stat_info">
<span class="o_stat_text">Contact</span>
</div>
</button>
</div>
<div class="oe_title">
<h1>
<field name="name" readonly="1"/>
@@ -83,10 +110,61 @@
<field name="name">fusion.loaner.checkout.search</field>
<field name="model">fusion.loaner.checkout</field>
<field name="arch" type="xml">
<search>
<search string="Search Loaners">
<field name="name"/>
<field name="partner_id"/>
<field name="product_id"/>
<field name="lot_id" string="Serial Number"/>
<field name="sale_order_id"/>
<field name="sales_rep_id"/>
<separator/>
<!-- Status Filters -->
<filter string="Draft" name="filter_draft"
domain="[('state', '=', 'draft')]"/>
<filter string="Checked Out" name="filter_checked_out"
domain="[('state', '=', 'checked_out')]"/>
<filter string="Overdue" name="filter_overdue"
domain="[('state', '=', 'overdue')]"/>
<filter string="Rental Pending" name="filter_rental_pending"
domain="[('state', '=', 'rental_pending')]"/>
<filter string="Returned" name="filter_returned"
domain="[('state', '=', 'returned')]"/>
<filter string="Converted to Rental" name="filter_converted"
domain="[('state', '=', 'converted_rental')]"/>
<filter string="Lost" name="filter_lost"
domain="[('state', '=', 'lost')]"/>
<separator/>
<!-- Quick Filters -->
<filter string="Active Loaners" name="filter_active"
domain="[('state', 'in', ['checked_out', 'overdue', 'rental_pending'])]"/>
<filter string="Needs Attention" name="filter_attention"
domain="[('state', 'in', ['overdue', 'rental_pending'])]"/>
<filter string="My Loaners" name="filter_my_loaners"
domain="[('sales_rep_id', '=', uid)]"/>
<separator/>
<!-- Condition Filters -->
<filter string="Needs Repair (Checkout)" name="filter_checkout_repair"
domain="[('checkout_condition', '=', 'needs_repair')]"/>
<filter string="Damaged (Return)" name="filter_return_damaged"
domain="[('return_condition', 'in', ['needs_repair', 'damaged'])]"/>
<separator/>
<!-- Group By -->
<filter string="Status" name="group_state"
context="{'group_by': 'state'}"/>
<filter string="Client" name="group_client"
context="{'group_by': 'partner_id'}"/>
<filter string="Product" name="group_product"
context="{'group_by': 'product_id'}"/>
<filter string="Sales Rep" name="group_sales_rep"
context="{'group_by': 'sales_rep_id'}"/>
<filter string="Checkout Condition" name="group_checkout_condition"
context="{'group_by': 'checkout_condition'}"/>
<filter string="Return Condition" name="group_return_condition"
context="{'group_by': 'return_condition'}"/>
<filter string="Checkout Month" name="group_checkout_month"
context="{'group_by': 'checkout_date:month'}"/>
<filter string="Return Month" name="group_return_month"
context="{'group_by': 'actual_return_date:month'}"/>
</search>
</field>
</record>
@@ -99,15 +177,63 @@
<field name="name">fusion.loaner.history.list</field>
<field name="model">fusion.loaner.history</field>
<field name="arch" type="xml">
<list>
<list default_order="action_date desc, id desc">
<field name="action_date"/>
<field name="checkout_id"/>
<field name="action" widget="badge"/>
<field name="partner_id" optional="show"/>
<field name="product_id" optional="show"/>
<field name="lot_id" optional="hide"/>
<field name="action" widget="badge"
decoration-info="action in ('create', 'note')"
decoration-success="action in ('checkout', 'return')"
decoration-warning="action in ('reminder_sent', 'overdue', 'rental_pending')"
decoration-danger="action in ('lost', 'condition_update')"/>
<field name="user_id"/>
<field name="notes"/>
<field name="notes" optional="show"/>
</list>
</field>
</record>
<!-- History Search View -->
<record id="view_fusion_loaner_history_search" model="ir.ui.view">
<field name="name">fusion.loaner.history.search</field>
<field name="model">fusion.loaner.history</field>
<field name="arch" type="xml">
<search string="Search Loaner History">
<field name="checkout_id"/>
<field name="partner_id"/>
<field name="product_id"/>
<field name="lot_id" string="Serial Number"/>
<field name="user_id"/>
<separator/>
<!-- Action Type Filters -->
<filter string="Checkouts" name="filter_checkout"
domain="[('action', '=', 'checkout')]"/>
<filter string="Returns" name="filter_return"
domain="[('action', '=', 'return')]"/>
<filter string="Reminders" name="filter_reminders"
domain="[('action', '=', 'reminder_sent')]"/>
<filter string="Overdue" name="filter_overdue"
domain="[('action', '=', 'overdue')]"/>
<filter string="Rental Conversions" name="filter_rental"
domain="[('action', 'in', ['rental_pending', 'rental_converted'])]"/>
<filter string="Lost" name="filter_lost"
domain="[('action', '=', 'lost')]"/>
<separator/>
<!-- Group By -->
<filter string="Action Type" name="group_action"
context="{'group_by': 'action'}"/>
<filter string="Client" name="group_client"
context="{'group_by': 'partner_id'}"/>
<filter string="Product" name="group_product"
context="{'group_by': 'product_id'}"/>
<filter string="User" name="group_user"
context="{'group_by': 'user_id'}"/>
<filter string="Month" name="group_month"
context="{'group_by': 'action_date:month'}"/>
</search>
</field>
</record>
<!-- ===================================================================== -->
<!-- WIZARD VIEWS -->
@@ -164,12 +290,45 @@
<field name="name">Loaner Equipment</field>
<field name="res_model">fusion.loaner.checkout</field>
<field name="view_mode">list,form</field>
<field name="search_view_id" ref="view_fusion_loaner_checkout_search"/>
<field name="context">{'search_default_filter_active': 1}</field>
<field name="help" type="html">
<p class="o_view_nocontent_smiling_face">No loaner checkouts yet</p>
<p>Track loaner equipment issued to clients during assessments or trials.</p>
</field>
</record>
<record id="action_fusion_loaner_all" model="ir.actions.act_window">
<field name="name">All Loaners</field>
<field name="res_model">fusion.loaner.checkout</field>
<field name="view_mode">list,form</field>
<field name="search_view_id" ref="view_fusion_loaner_checkout_search"/>
<field name="help" type="html">
<p class="o_view_nocontent_smiling_face">No loaner checkouts yet</p>
</field>
</record>
<record id="action_fusion_loaner_overdue" model="ir.actions.act_window">
<field name="name">Overdue Loaners</field>
<field name="res_model">fusion.loaner.checkout</field>
<field name="view_mode">list,form</field>
<field name="search_view_id" ref="view_fusion_loaner_checkout_search"/>
<field name="context">{'search_default_filter_attention': 1}</field>
</record>
<record id="action_fusion_loaner_returned" model="ir.actions.act_window">
<field name="name">Returned Loaners</field>
<field name="res_model">fusion.loaner.checkout</field>
<field name="view_mode">list,form</field>
<field name="search_view_id" ref="view_fusion_loaner_checkout_search"/>
<field name="context">{'search_default_filter_returned': 1}</field>
</record>
<record id="action_fusion_loaner_history" model="ir.actions.act_window">
<field name="name">Loaner History</field>
<field name="res_model">fusion.loaner.history</field>
<field name="view_mode">list</field>
<field name="search_view_id" ref="view_fusion_loaner_history_search"/>
</record>
<!-- Action: Loaner Products (products that can be loaned) -->
@@ -203,6 +362,24 @@
parent="menu_loaner_root"
action="action_fusion_loaner_checkout"
sequence="10"/>
<menuitem id="menu_loaner_all"
name="All Loaners"
parent="menu_loaner_root"
action="action_fusion_loaner_all"
sequence="15"/>
<menuitem id="menu_loaner_overdue"
name="Overdue / Attention"
parent="menu_loaner_root"
action="action_fusion_loaner_overdue"
sequence="18"/>
<menuitem id="menu_loaner_returned"
name="Returned"
parent="menu_loaner_root"
action="action_fusion_loaner_returned"
sequence="19"/>
<menuitem id="menu_loaner_history"
name="Loaner History"

View File

@@ -0,0 +1,180 @@
<?xml version="1.0" encoding="utf-8"?>
<odoo>
<!-- ================================================================== -->
<!-- CLEANUP - FORM VIEW -->
<!-- ================================================================== -->
<record id="view_ltc_cleanup_form" model="ir.ui.view">
<field name="name">fusion.ltc.cleanup.form</field>
<field name="model">fusion.ltc.cleanup</field>
<field name="arch" type="xml">
<form string="Cleanup Schedule">
<header>
<button name="action_start" type="object" string="Start"
class="btn-primary"
invisible="state != 'scheduled'"/>
<button name="action_complete" type="object" string="Complete"
class="btn-primary"
invisible="state != 'in_progress'"/>
<button name="action_cancel" type="object" string="Cancel"
invisible="state in ('completed', 'cancelled')"/>
<button name="action_reset" type="object" string="Reset to Scheduled"
invisible="state not in ('cancelled', 'rescheduled')"/>
<field name="state" widget="statusbar"
statusbar_visible="scheduled,in_progress,completed"/>
</header>
<sheet>
<div class="oe_button_box" name="button_box">
<button name="action_create_task" type="object"
class="oe_stat_button" icon="fa-tasks">
<div class="o_field_widget o_stat_info">
<span class="o_stat_text">Task</span>
</div>
</button>
</div>
<div class="oe_title">
<label for="name"/>
<h1>
<field name="name" readonly="1"/>
</h1>
</div>
<group>
<group string="Schedule">
<field name="facility_id"/>
<field name="scheduled_date"/>
<field name="completed_date"/>
<field name="technician_id"/>
</group>
<group string="Details">
<field name="items_cleaned"/>
<field name="task_id" readonly="1"/>
</group>
</group>
<notebook>
<page string="Notes" name="notes">
<field name="notes" placeholder="Cleanup notes..."/>
</page>
<page string="Photos" name="photos">
<field name="photo_ids" widget="many2many_binary"/>
</page>
</notebook>
</sheet>
<chatter/>
</form>
</field>
</record>
<!-- ================================================================== -->
<!-- CLEANUP - LIST VIEW -->
<!-- ================================================================== -->
<record id="view_ltc_cleanup_list" model="ir.ui.view">
<field name="name">fusion.ltc.cleanup.list</field>
<field name="model">fusion.ltc.cleanup</field>
<field name="arch" type="xml">
<list string="Cleanup Schedule" default_order="scheduled_date desc"
decoration-success="state == 'completed'"
decoration-muted="state in ('cancelled', 'rescheduled')">
<field name="name"/>
<field name="facility_id"/>
<field name="scheduled_date"/>
<field name="completed_date" optional="show"/>
<field name="technician_id" widget="many2one_avatar_user" optional="show"/>
<field name="items_cleaned" optional="show"/>
<field name="state" widget="badge"
decoration-info="state == 'scheduled'"
decoration-warning="state == 'in_progress'"
decoration-success="state == 'completed'"
decoration-danger="state == 'cancelled'"
decoration-muted="state == 'rescheduled'"/>
</list>
</field>
</record>
<!-- ================================================================== -->
<!-- CLEANUP - KANBAN VIEW -->
<!-- ================================================================== -->
<record id="view_ltc_cleanup_kanban" model="ir.ui.view">
<field name="name">fusion.ltc.cleanup.kanban</field>
<field name="model">fusion.ltc.cleanup</field>
<field name="arch" type="xml">
<kanban default_group_by="state" class="o_kanban_small_column">
<templates>
<t t-name="card">
<div class="d-flex justify-content-between">
<field name="name" class="fw-bold"/>
</div>
<div>
<field name="facility_id" class="fw-bold"/>
</div>
<div class="text-muted">
Scheduled: <field name="scheduled_date"/>
</div>
<div t-if="record.completed_date.raw_value" class="text-muted">
Completed: <field name="completed_date"/>
</div>
<footer class="mt-2">
<field name="technician_id" widget="many2one_avatar_user"/>
</footer>
</t>
</templates>
</kanban>
</field>
</record>
<!-- ================================================================== -->
<!-- CLEANUP - SEARCH VIEW -->
<!-- ================================================================== -->
<record id="view_ltc_cleanup_search" model="ir.ui.view">
<field name="name">fusion.ltc.cleanup.search</field>
<field name="model">fusion.ltc.cleanup</field>
<field name="arch" type="xml">
<search string="Search Cleanups">
<field name="facility_id"/>
<field name="technician_id"/>
<separator/>
<filter string="Scheduled" name="filter_scheduled"
domain="[('state', '=', 'scheduled')]"/>
<filter string="In Progress" name="filter_in_progress"
domain="[('state', '=', 'in_progress')]"/>
<filter string="Completed" name="filter_completed"
domain="[('state', '=', 'completed')]"/>
<separator/>
<filter string="Upcoming (7 Days)" name="filter_upcoming"
domain="[('scheduled_date', '&lt;=', (context_today() + datetime.timedelta(days=7)).strftime('%Y-%m-%d')),
('scheduled_date', '>=', context_today().strftime('%Y-%m-%d')),
('state', '=', 'scheduled')]"/>
<filter string="Overdue" name="filter_overdue"
domain="[('scheduled_date', '&lt;', context_today().strftime('%Y-%m-%d')),
('state', '=', 'scheduled')]"/>
<separator/>
<filter string="Facility" name="group_facility"
context="{'group_by': 'facility_id'}"/>
<filter string="Status" name="group_state"
context="{'group_by': 'state'}"/>
<filter string="Technician" name="group_technician"
context="{'group_by': 'technician_id'}"/>
<filter string="Scheduled Month" name="group_month"
context="{'group_by': 'scheduled_date:month'}"/>
</search>
</field>
</record>
<!-- ================================================================== -->
<!-- ACTIONS -->
<!-- ================================================================== -->
<record id="action_ltc_cleanups" model="ir.actions.act_window">
<field name="name">Cleanup Schedule</field>
<field name="res_model">fusion.ltc.cleanup</field>
<field name="view_mode">list,kanban,form</field>
<field name="search_view_id" ref="view_ltc_cleanup_search"/>
<field name="help" type="html">
<p class="o_view_nocontent_smiling_face">
No cleanups scheduled yet
</p>
<p>Cleanups are auto-scheduled based on facility settings, or can be created manually.</p>
</field>
</record>
</odoo>

View File

@@ -0,0 +1,299 @@
<?xml version="1.0" encoding="utf-8"?>
<odoo>
<!-- ================================================================== -->
<!-- FACILITY - FORM VIEW -->
<!-- ================================================================== -->
<record id="view_ltc_facility_form" model="ir.ui.view">
<field name="name">fusion.ltc.facility.form</field>
<field name="model">fusion.ltc.facility</field>
<field name="arch" type="xml">
<form string="LTC Facility">
<header/>
<sheet>
<widget name="web_ribbon" text="Archived" bg_color="text-bg-danger"
invisible="active"/>
<field name="active" invisible="1"/>
<div class="oe_button_box" name="button_box">
<button name="action_view_repairs" type="object"
class="oe_stat_button" icon="fa-wrench">
<div class="o_field_widget o_stat_info">
<span class="o_stat_value">
<field name="active_repair_count"/>
</span>
<span class="o_stat_text">Active Repairs</span>
</div>
</button>
<button name="action_view_repairs" type="object"
class="oe_stat_button" icon="fa-list">
<div class="o_field_widget o_stat_info">
<span class="o_stat_value">
<field name="repair_count"/>
</span>
<span class="o_stat_text">Total Repairs</span>
</div>
</button>
<button name="action_view_cleanups" type="object"
class="oe_stat_button" icon="fa-refresh">
<div class="o_field_widget o_stat_info">
<span class="o_stat_value">
<field name="cleanup_count"/>
</span>
<span class="o_stat_text">Cleanups</span>
</div>
</button>
</div>
<field name="image_1920" widget="image" class="oe_avatar"
options="{'preview_image': 'image_128'}"/>
<div class="oe_title">
<label for="name"/>
<h1>
<field name="name" placeholder="Facility Name"/>
</h1>
<field name="code" readonly="1"/>
</div>
<group>
<group string="Facility Details">
<field name="partner_id"/>
<field name="phone" widget="phone"/>
<field name="email" widget="email"/>
<field name="website" widget="url"/>
</group>
<group string="Address">
<field name="street"/>
<field name="street2"/>
<field name="city"/>
<field name="state_id"/>
<field name="zip"/>
<field name="country_id"/>
</group>
</group>
<notebook>
<page string="Key Contacts" name="contacts">
<group>
<group>
<field name="director_of_care_id"/>
<field name="service_supervisor_id"/>
</group>
<group>
<field name="physiotherapist_ids" widget="many2many_tags"/>
</group>
</group>
</page>
<page string="Floors &amp; Stations" name="structure">
<group>
<field name="number_of_floors"/>
</group>
<field name="floor_ids">
<list editable="bottom">
<field name="sequence" widget="handle"/>
<field name="name"/>
<field name="head_nurse_id"/>
<field name="physiotherapist_id"/>
</list>
</field>
</page>
<page string="Nursing Stations" name="stations">
<field name="floor_ids" mode="list">
<list>
<field name="name" string="Floor"/>
<field name="station_ids" widget="many2many_tags" string="Stations"/>
<field name="head_nurse_id"/>
</list>
</field>
</page>
<page string="Contract" name="contract">
<group>
<group>
<field name="contract_start_date"/>
<field name="contract_end_date"/>
</group>
<group>
<field name="cleanup_frequency"/>
<field name="cleanup_interval_days"
invisible="cleanup_frequency != 'custom'"/>
<field name="next_cleanup_date"/>
</group>
</group>
<separator string="Contract Document"/>
<div class="row mb-3">
<div class="col-md-6">
<div class="d-flex align-items-center gap-2">
<field name="contract_file"
filename="contract_file_filename"
widget="binary" nolabel="1"/>
<field name="contract_file_filename" invisible="1"/>
<button name="action_preview_contract" type="object"
class="btn btn-secondary"
icon="fa-eye"
string="Preview"
invisible="not contract_file"/>
</div>
</div>
</div>
<field name="contract_notes" placeholder="Contract details and notes..."/>
</page>
<page string="Notes" name="notes">
<field name="notes"/>
</page>
</notebook>
</sheet>
<chatter/>
</form>
</field>
</record>
<!-- ================================================================== -->
<!-- FACILITY - LIST VIEW -->
<!-- ================================================================== -->
<record id="view_ltc_facility_list" model="ir.ui.view">
<field name="name">fusion.ltc.facility.list</field>
<field name="model">fusion.ltc.facility</field>
<field name="arch" type="xml">
<list default_order="name">
<field name="code" optional="show"/>
<field name="name"/>
<field name="city"/>
<field name="phone" optional="show"/>
<field name="director_of_care_id" optional="show"/>
<field name="service_supervisor_id" optional="hide"/>
<field name="number_of_floors" optional="hide"/>
<field name="contract_start_date" optional="hide"/>
<field name="contract_end_date" optional="hide"/>
<field name="cleanup_frequency" optional="show"/>
<field name="next_cleanup_date" optional="show"/>
</list>
</field>
</record>
<!-- ================================================================== -->
<!-- FACILITY - SEARCH VIEW -->
<!-- ================================================================== -->
<record id="view_ltc_facility_search" model="ir.ui.view">
<field name="name">fusion.ltc.facility.search</field>
<field name="model">fusion.ltc.facility</field>
<field name="arch" type="xml">
<search string="Search Facilities">
<field name="name" string="Facility"/>
<field name="code"/>
<field name="city"/>
<field name="director_of_care_id"/>
<separator/>
<filter string="Active" name="filter_active"
domain="[('active', '=', True)]"/>
<filter string="Archived" name="filter_archived"
domain="[('active', '=', False)]"/>
<separator/>
<filter string="Has Repairs" name="filter_has_repairs"
domain="[('repair_ids', '!=', False)]"/>
<filter string="Cleanup Due" name="filter_cleanup_due"
domain="[('next_cleanup_date', '&lt;=', (context_today() + datetime.timedelta(days=7)).strftime('%Y-%m-%d')),
('next_cleanup_date', '!=', False)]"/>
<separator/>
<filter string="City" name="group_city" context="{'group_by': 'city'}"/>
<filter string="Cleanup Frequency" name="group_frequency"
context="{'group_by': 'cleanup_frequency'}"/>
</search>
</field>
</record>
<!-- ================================================================== -->
<!-- STATION - FORM VIEW (for inline editing within floors) -->
<!-- ================================================================== -->
<record id="view_ltc_station_form" model="ir.ui.view">
<field name="name">fusion.ltc.station.form</field>
<field name="model">fusion.ltc.station</field>
<field name="arch" type="xml">
<form string="Nursing Station">
<sheet>
<group>
<group>
<field name="name"/>
<field name="sequence"/>
</group>
<group>
<field name="head_nurse_id"/>
<field name="phone" widget="phone"/>
</group>
</group>
</sheet>
</form>
</field>
</record>
<!-- ================================================================== -->
<!-- STATION - LIST VIEW -->
<!-- ================================================================== -->
<record id="view_ltc_station_list" model="ir.ui.view">
<field name="name">fusion.ltc.station.list</field>
<field name="model">fusion.ltc.station</field>
<field name="arch" type="xml">
<list string="Nursing Stations" editable="bottom">
<field name="sequence" widget="handle"/>
<field name="floor_id"/>
<field name="name"/>
<field name="head_nurse_id"/>
<field name="phone"/>
</list>
</field>
</record>
<!-- ================================================================== -->
<!-- FLOOR - FORM VIEW (with embedded stations) -->
<!-- ================================================================== -->
<record id="view_ltc_floor_form" model="ir.ui.view">
<field name="name">fusion.ltc.floor.form</field>
<field name="model">fusion.ltc.floor</field>
<field name="arch" type="xml">
<form string="Floor">
<sheet>
<group>
<group>
<field name="name"/>
<field name="sequence"/>
<field name="facility_id" invisible="1"/>
</group>
<group>
<field name="head_nurse_id"/>
<field name="physiotherapist_id"/>
</group>
</group>
<field name="station_ids">
<list editable="bottom">
<field name="sequence" widget="handle"/>
<field name="name"/>
<field name="head_nurse_id"/>
<field name="phone"/>
</list>
</field>
</sheet>
</form>
</field>
</record>
<!-- ================================================================== -->
<!-- ACTIONS -->
<!-- ================================================================== -->
<record id="action_ltc_facilities" model="ir.actions.act_window">
<field name="name">LTC Facilities</field>
<field name="res_model">fusion.ltc.facility</field>
<field name="view_mode">list,form</field>
<field name="search_view_id" ref="view_ltc_facility_search"/>
<field name="context">{'search_default_filter_active': 1}</field>
<field name="help" type="html">
<p class="o_view_nocontent_smiling_face">
Add your first LTC Facility
</p>
<p>Create a facility record to start managing repairs and cleanups.</p>
</field>
</record>
</odoo>

View File

@@ -0,0 +1,148 @@
<?xml version="1.0" encoding="utf-8"?>
<odoo>
<!-- ================================================================== -->
<!-- FORM SUBMISSION - LIST VIEW -->
<!-- ================================================================== -->
<record id="view_ltc_form_submission_list" model="ir.ui.view">
<field name="name">fusion.ltc.form.submission.list</field>
<field name="model">fusion.ltc.form.submission</field>
<field name="arch" type="xml">
<list string="Form Submissions" default_order="submitted_date desc"
decoration-danger="is_emergency"
decoration-info="status == 'submitted'"
decoration-success="status == 'processed'">
<field name="name"/>
<field name="form_type"/>
<field name="facility_id"/>
<field name="client_name"/>
<field name="room_number"/>
<field name="product_serial" optional="show"/>
<field name="is_emergency"/>
<field name="submitted_date"/>
<field name="ip_address" optional="hide"/>
<field name="repair_id" optional="show"/>
<field name="status" widget="badge"
decoration-info="status == 'submitted'"
decoration-success="status == 'processed'"
decoration-danger="status == 'rejected'"/>
</list>
</field>
</record>
<!-- ================================================================== -->
<!-- FORM SUBMISSION - FORM VIEW -->
<!-- ================================================================== -->
<record id="view_ltc_form_submission_form" model="ir.ui.view">
<field name="name">fusion.ltc.form.submission.form</field>
<field name="model">fusion.ltc.form.submission</field>
<field name="arch" type="xml">
<form string="Form Submission">
<sheet>
<div class="oe_button_box" name="button_box">
<button name="action_view_repair" type="object"
class="oe_stat_button" icon="fa-wrench"
invisible="not repair_id">
<div class="o_field_widget o_stat_info">
<span class="o_stat_text">Repair</span>
</div>
</button>
</div>
<div class="oe_title">
<label for="name"/>
<h1>
<field name="name" readonly="1"/>
</h1>
</div>
<group>
<group>
<field name="form_type"/>
<field name="facility_id"/>
<field name="client_name"/>
<field name="room_number"/>
<field name="product_serial"/>
<field name="is_emergency"/>
</group>
<group>
<field name="status"/>
<field name="submitted_date"/>
<field name="ip_address"/>
<field name="repair_id"/>
</group>
</group>
</sheet>
</form>
</field>
</record>
<!-- ================================================================== -->
<!-- FORM SUBMISSION - SEARCH VIEW -->
<!-- ================================================================== -->
<record id="view_ltc_form_submission_search" model="ir.ui.view">
<field name="name">fusion.ltc.form.submission.search</field>
<field name="model">fusion.ltc.form.submission</field>
<field name="arch" type="xml">
<search string="Search Submissions">
<field name="name"/>
<field name="client_name"/>
<field name="facility_id"/>
<field name="room_number"/>
<separator/>
<filter string="Emergency" name="filter_emergency"
domain="[('is_emergency', '=', True)]"/>
<separator/>
<filter string="Submitted" name="filter_submitted"
domain="[('status', '=', 'submitted')]"/>
<filter string="Processed" name="filter_processed"
domain="[('status', '=', 'processed')]"/>
<filter string="Rejected" name="filter_rejected"
domain="[('status', '=', 'rejected')]"/>
<separator/>
<filter string="Today" name="filter_today"
domain="[('submitted_date', '>=', (context_today()).strftime('%Y-%m-%d'))]"/>
<filter string="This Week" name="filter_week"
domain="[('submitted_date', '>=', (context_today() - datetime.timedelta(days=7)).strftime('%Y-%m-%d'))]"/>
<filter string="This Month" name="filter_month"
domain="[('submitted_date', '>=', (context_today()).strftime('%Y-%m-01'))]"/>
<separator/>
<filter string="Facility" name="group_facility"
context="{'group_by': 'facility_id'}"/>
<filter string="Form Type" name="group_type"
context="{'group_by': 'form_type'}"/>
<filter string="Status" name="group_status"
context="{'group_by': 'status'}"/>
<filter string="Submitted Date" name="group_date"
context="{'group_by': 'submitted_date:day'}"/>
</search>
</field>
</record>
<!-- ================================================================== -->
<!-- ACTIONS -->
<!-- ================================================================== -->
<record id="action_ltc_form_submissions" model="ir.actions.act_window">
<field name="name">Form Submissions</field>
<field name="res_model">fusion.ltc.form.submission</field>
<field name="view_mode">list,form</field>
<field name="search_view_id" ref="view_ltc_form_submission_search"/>
<field name="help" type="html">
<p class="o_view_nocontent_smiling_face">
No form submissions yet
</p>
<p>Submissions from portal repair forms will appear here.</p>
</field>
</record>
<!-- SEQUENCE -->
<data noupdate="1">
<record id="seq_ltc_form_submission" model="ir.sequence">
<field name="name">LTC Form Submission</field>
<field name="code">fusion.ltc.form.submission</field>
<field name="prefix">LTC-SUB-</field>
<field name="padding">5</field>
<field name="number_next">1</field>
<field name="number_increment">1</field>
</record>
</data>
</odoo>

View File

@@ -0,0 +1,375 @@
<?xml version="1.0" encoding="utf-8"?>
<odoo>
<!-- ================================================================== -->
<!-- REPAIR - FORM VIEW -->
<!-- ================================================================== -->
<record id="view_ltc_repair_form" model="ir.ui.view">
<field name="name">fusion.ltc.repair.form</field>
<field name="model">fusion.ltc.repair</field>
<field name="arch" type="xml">
<form string="Repair Request">
<header>
<field name="stage_id" widget="statusbar"
options="{'clickable': '1'}"/>
</header>
<sheet>
<div class="oe_button_box" name="button_box">
<button name="action_view_sale_order" type="object"
class="oe_stat_button" icon="fa-shopping-cart"
invisible="not sale_order_id">
<div class="o_field_widget o_stat_info">
<span class="o_stat_value">
<field name="sale_order_name"/>
</span>
<span class="o_stat_text">Sale Order</span>
</div>
</button>
<button name="action_view_task" type="object"
class="oe_stat_button" icon="fa-tasks"
invisible="not task_id">
<div class="o_field_widget o_stat_info">
<span class="o_stat_text">Task</span>
</div>
</button>
</div>
<widget name="web_ribbon" text="Emergency" bg_color="text-bg-danger"
invisible="not is_emergency"/>
<div class="oe_title">
<label for="name"/>
<h1>
<field name="name" readonly="1"/>
</h1>
</div>
<group>
<group string="Repair Details">
<field name="facility_id"/>
<field name="client_id"/>
<field name="client_name" invisible="client_id"/>
<field name="room_number"/>
<field name="is_emergency"/>
<field name="priority" widget="priority"/>
</group>
<group string="Product &amp; Assignment">
<field name="product_serial"/>
<field name="product_id"/>
<field name="assigned_technician_id"/>
<field name="source"/>
</group>
</group>
<notebook>
<page string="Issue" name="issue">
<group>
<group>
<field name="issue_reported_date"/>
</group>
<group>
<field name="issue_fixed_date"/>
</group>
</group>
<label for="issue_description"/>
<field name="issue_description"
placeholder="Describe the issue in detail..."/>
<label for="resolution_description"/>
<field name="resolution_description"
placeholder="How was the issue resolved?"/>
</page>
<page string="Family/POA" name="poa">
<group>
<group>
<field name="poa_name"/>
<field name="poa_phone" widget="phone"/>
</group>
</group>
</page>
<page string="Financial" name="financial">
<group>
<group>
<field name="sale_order_id"/>
<field name="task_id"/>
</group>
<group>
<field name="currency_id" invisible="1"/>
<field name="company_id" invisible="1"/>
<field name="repair_value"/>
</group>
</group>
<button name="action_create_sale_order" type="object"
string="Create Sale Order" class="btn-primary"
invisible="sale_order_id"/>
</page>
<page string="Photos &amp; Notes" name="photos">
<div class="fc-gallery-content">
<separator string="Before Photos (Reported Condition)"/>
<field name="before_photo_ids" widget="many2many_binary"/>
<separator string="After Photos (Completed Repair)"/>
<field name="after_photo_ids" widget="many2many_binary"/>
</div>
<field name="photo_ids" invisible="1"/>
<separator string="Internal Notes"/>
<field name="notes" placeholder="Internal notes..."/>
</page>
</notebook>
</sheet>
<chatter/>
</form>
</field>
</record>
<!-- ================================================================== -->
<!-- REPAIR - KANBAN VIEW -->
<!-- ================================================================== -->
<record id="view_ltc_repair_kanban" model="ir.ui.view">
<field name="name">fusion.ltc.repair.kanban</field>
<field name="model">fusion.ltc.repair</field>
<field name="arch" type="xml">
<kanban default_group_by="stage_id"
default_order="is_emergency desc, issue_reported_date desc"
highlight_color="color"
class="o_kanban_small_column">
<field name="color"/>
<field name="is_emergency"/>
<field name="stage_id"/>
<field name="kanban_state"/>
<field name="stage_color"/>
<progressbar field="kanban_state"
colors='{"normal": "200", "done": "success", "blocked": "danger"}'/>
<templates>
<t t-name="menu">
<a t-if="widget.editable" role="menuitem" type="open"
class="dropdown-item">Edit</a>
<a t-if="widget.deletable" role="menuitem" type="delete"
class="dropdown-item">Delete</a>
<field widget="kanban_color_picker" name="color"/>
</t>
<t t-name="card" class="flex-row">
<main t-att-data-stage="record.stage_color.raw_value || 'secondary'"
t-att-data-emergency="record.is_emergency.raw_value ? '1' : '0'"
t-att-data-priority="record.priority.raw_value">
<div class="d-flex justify-content-between align-items-center">
<field name="name" class="fw-bold text-primary"/>
<span t-attf-style="#{record.priority.raw_value == '1' ? 'background: rgba(255,152,0,0.1); border-radius: 4px; padding: 1px 5px;' : ''}">
<field name="priority" widget="priority"/>
</span>
</div>
<div class="mt-1">
<span class="fw-bold">
<field name="display_client_name"/>
</span>
<span t-if="record.room_number.raw_value"
class="ms-1 badge text-bg-light">
Rm <field name="room_number"/>
</span>
</div>
<div class="text-muted small">
<field name="facility_id"/>
</div>
<div t-if="record.is_emergency.raw_value"
class="mt-1">
<span class="badge text-bg-danger">
<i class="fa fa-exclamation-triangle me-1"/>Emergency
</span>
</div>
<div t-if="record.product_serial.raw_value"
class="text-muted small mt-1">
<i class="fa fa-barcode me-1"/>S/N: <field name="product_serial"/>
</div>
<footer class="mt-2 pt-1 border-top">
<span class="text-muted small">
<i class="fa fa-calendar me-1"/><field name="issue_reported_date"/>
</span>
<div class="ms-auto d-flex align-items-center">
<field name="kanban_state" widget="state_selection"/>
<field name="assigned_technician_id"
widget="many2one_avatar_user"
class="ms-1"/>
</div>
</footer>
</main>
</t>
</templates>
</kanban>
</field>
</record>
<!-- ================================================================== -->
<!-- REPAIR - LIST VIEW -->
<!-- ================================================================== -->
<record id="view_ltc_repair_list" model="ir.ui.view">
<field name="name">fusion.ltc.repair.list</field>
<field name="model">fusion.ltc.repair</field>
<field name="arch" type="xml">
<list string="Repair Requests" default_order="issue_reported_date desc"
decoration-danger="is_emergency">
<field name="stage_color" column_invisible="1"/>
<field name="name"/>
<field name="facility_id"/>
<field name="display_client_name" string="Client"/>
<field name="room_number"/>
<field name="product_serial" optional="show"/>
<field name="issue_reported_date"/>
<field name="issue_fixed_date" optional="show"/>
<field name="stage_id" widget="badge"
decoration-info="stage_color == 'info'"
decoration-warning="stage_color == 'warning'"
decoration-success="stage_color == 'success'"
decoration-danger="stage_color == 'danger'"
optional="show"/>
<field name="is_emergency" string="Emergency" optional="show"
widget="boolean_toggle"/>
<field name="assigned_technician_id" widget="many2one_avatar_user"
optional="show"/>
<field name="sale_order_id" optional="hide"/>
<field name="repair_value" optional="hide"/>
<field name="source" optional="hide"/>
</list>
</field>
</record>
<!-- ================================================================== -->
<!-- REPAIR - SEARCH VIEW -->
<!-- ================================================================== -->
<record id="view_ltc_repair_search" model="ir.ui.view">
<field name="name">fusion.ltc.repair.search</field>
<field name="model">fusion.ltc.repair</field>
<field name="arch" type="xml">
<search string="Search Repairs">
<field name="name"/>
<field name="display_client_name" string="Client"/>
<field name="room_number"/>
<field name="product_serial"/>
<field name="facility_id"/>
<field name="assigned_technician_id"/>
<separator/>
<filter string="Emergency" name="filter_emergency"
domain="[('is_emergency', '=', True)]"/>
<separator/>
<filter string="New" name="filter_new"
domain="[('stage_id.sequence', '=', 1)]"/>
<filter string="In Progress" name="filter_in_progress"
domain="[('stage_id.fold', '=', False), ('stage_id.sequence', '>', 1)]"/>
<filter string="Completed" name="filter_completed"
domain="[('stage_id.fold', '=', True)]"/>
<separator/>
<filter string="Has Sale Order" name="filter_has_so"
domain="[('sale_order_id', '!=', False)]"/>
<filter string="No Sale Order" name="filter_no_so"
domain="[('sale_order_id', '=', False)]"/>
<separator/>
<filter string="This Month" name="filter_this_month"
domain="[('issue_reported_date', '>=', (context_today()).strftime('%Y-%m-01'))]"/>
<filter string="Last 30 Days" name="filter_30d"
domain="[('issue_reported_date', '>=', (context_today() - datetime.timedelta(days=30)).strftime('%Y-%m-%d'))]"/>
<filter string="This Year" name="filter_this_year"
domain="[('issue_reported_date', '>=', (context_today()).strftime('%Y-01-01'))]"/>
<separator/>
<filter string="Facility" name="group_facility"
context="{'group_by': 'facility_id'}"/>
<filter string="Stage" name="group_stage"
context="{'group_by': 'stage_id'}"/>
<filter string="Technician" name="group_technician"
context="{'group_by': 'assigned_technician_id'}"/>
<filter string="Source" name="group_source"
context="{'group_by': 'source'}"/>
<filter string="Reported Month" name="group_month"
context="{'group_by': 'issue_reported_date:month'}"/>
<filter string="Fixed Month" name="group_fixed_month"
context="{'group_by': 'issue_fixed_date:month'}"/>
</search>
</field>
</record>
<!-- ================================================================== -->
<!-- REPAIR STAGE - LIST + FORM (Configuration) -->
<!-- ================================================================== -->
<record id="view_ltc_repair_stage_list" model="ir.ui.view">
<field name="name">fusion.ltc.repair.stage.list</field>
<field name="model">fusion.ltc.repair.stage</field>
<field name="arch" type="xml">
<list string="Repair Stages" editable="bottom">
<field name="sequence" widget="handle"/>
<field name="name"/>
<field name="color"/>
<field name="fold"/>
<field name="description" optional="hide"/>
</list>
</field>
</record>
<record id="view_ltc_repair_stage_form" model="ir.ui.view">
<field name="name">fusion.ltc.repair.stage.form</field>
<field name="model">fusion.ltc.repair.stage</field>
<field name="arch" type="xml">
<form string="Repair Stage">
<sheet>
<group>
<field name="name"/>
<field name="sequence"/>
<field name="color"/>
<field name="fold"/>
<field name="description"/>
</group>
</sheet>
</form>
</field>
</record>
<!-- ================================================================== -->
<!-- ACTIONS -->
<!-- ================================================================== -->
<record id="action_ltc_repairs_kanban" model="ir.actions.act_window">
<field name="name">Repair Overview</field>
<field name="res_model">fusion.ltc.repair</field>
<field name="view_mode">kanban,list,form</field>
<field name="search_view_id" ref="view_ltc_repair_search"/>
<field name="help" type="html">
<p class="o_view_nocontent_smiling_face">
No repair requests yet
</p>
<p>Repair requests submitted via the portal form or manually will appear here.</p>
</field>
</record>
<record id="action_ltc_repairs_all" model="ir.actions.act_window">
<field name="name">All Repairs</field>
<field name="res_model">fusion.ltc.repair</field>
<field name="view_mode">kanban,list,form</field>
<field name="search_view_id" ref="view_ltc_repair_search"/>
</record>
<record id="action_ltc_repairs_new" model="ir.actions.act_window">
<field name="name">New / Pending</field>
<field name="res_model">fusion.ltc.repair</field>
<field name="view_mode">kanban,list,form</field>
<field name="search_view_id" ref="view_ltc_repair_search"/>
<field name="domain">[('stage_id.sequence', '&lt;=', 2)]</field>
</record>
<record id="action_ltc_repairs_in_progress" model="ir.actions.act_window">
<field name="name">In Progress</field>
<field name="res_model">fusion.ltc.repair</field>
<field name="view_mode">kanban,list,form</field>
<field name="search_view_id" ref="view_ltc_repair_search"/>
<field name="domain">[('stage_id.fold', '=', False), ('stage_id.sequence', '>', 2)]</field>
</record>
<record id="action_ltc_repairs_completed" model="ir.actions.act_window">
<field name="name">Completed</field>
<field name="res_model">fusion.ltc.repair</field>
<field name="view_mode">kanban,list,form</field>
<field name="search_view_id" ref="view_ltc_repair_search"/>
<field name="domain">[('stage_id.fold', '=', True)]</field>
</record>
<record id="action_ltc_repair_stages" model="ir.actions.act_window">
<field name="name">Repair Stages</field>
<field name="res_model">fusion.ltc.repair.stage</field>
<field name="view_mode">list,form</field>
</record>
</odoo>

View File

@@ -500,6 +500,25 @@
</div>
</div>
<!-- ===== PORTAL FORMS ===== -->
<h2>Portal Forms</h2>
<div class="row mt16 o_settings_container">
<div class="col-12 col-lg-6 o_setting_box">
<div class="o_setting_right_pane">
<span class="o_form_label">LTC Form Access Password</span>
<div class="text-muted">
Set a password to protect the public LTC repair form.
Share this with facility staff so they can submit repair requests.
Minimum 4 characters. Leave empty to allow unrestricted access.
</div>
<div class="mt-2">
<field name="fc_ltc_form_password"
placeholder="e.g. 1234"/>
</div>
</div>
</div>
</div>
<!-- Hidden fields for field mappings (still needed for ir.config_parameter storage) -->
<div class="d-none">
<field name="fc_field_sale_type"/>

View File

@@ -16,6 +16,32 @@
<field name="x_fc_contact_type" placeholder="Select contact type..."/>
</xpath>
<!-- LTC section in notebook -->
<xpath expr="//notebook" position="inside">
<page string="LTC Home" name="ltc_info"
invisible="x_fc_contact_type not in ('long_term_care_home',)">
<group string="LTC Facility Information">
<group>
<field name="x_fc_ltc_facility_id"/>
<field name="x_fc_ltc_room_number"/>
</group>
</group>
<group string="Family Contacts">
<field name="x_fc_ltc_family_contact_ids" nolabel="1">
<list editable="bottom">
<field name="name"/>
<field name="relationship"/>
<field name="phone"/>
<field name="phone2"/>
<field name="email"/>
<field name="is_poa"/>
<field name="notes" optional="hide"/>
</list>
</field>
</group>
</page>
</xpath>
<!-- ODSP section in notebook -->
<xpath expr="//notebook" position="inside">
<page string="ODSP" name="odsp_info"
@@ -71,6 +97,8 @@
domain="[('x_fc_contact_type', 'in', ['odsp_customer', 'adp_odsp_customer'])]"/>
<filter name="filter_odsp_office" string="ODSP Offices"
domain="[('x_fc_contact_type', '=', 'odsp_office')]"/>
<filter name="filter_ltc_home" string="LTC Homes"
domain="[('x_fc_contact_type', '=', 'long_term_care_home')]"/>
</xpath>
</field>
</record>

View File

@@ -163,8 +163,12 @@
domain="[('x_fc_is_field_staff', '=', True)]"/>
<field name="task_type"/>
<field name="priority" widget="priority"/>
<field name="sale_order_id"/>
<field name="purchase_order_id"/>
<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"/>