New models - fusion.repair.service.plan.subscription Tracks pre-paid maintenance packages: partner, plan product, optional category restriction, visits_included / visits_used / visits_remaining, start_date / end_date, computed state (active/exhausted/expired/cancelled), burn_history One2many. PLAN-NNNNN sequence. - fusion.repair.service.plan.burn One row per maintenance visit that consumed a plan visit - feeds the Burn History tab on the subscription form. product.template extensions - x_fc_is_service_plan boolean toggle - x_fc_plan_visits_included (default 4) - x_fc_plan_duration_months (default 12) - x_fc_plan_category_id - if set, only burns for repairs in that category (e.g. an Annual Stairlift Maintenance plan does not burn for wheelchair repairs) sale.order.action_confirm() override - For each order line whose product has x_fc_is_service_plan=True, spawns one fusion.repair.service.plan.subscription per qty unit. - Start date = today; end date = today + plan_duration_months (relativedelta - correct month boundaries). Visit report wizard - New _burn_service_plan_visit(repair) call from action_confirm() finds the matching active subscription and burns one visit + posts a chatter note "Visit burned for repair X. N of M remaining." on the subscription. - Skips quote-only repairs. - The wizard does NOT zero out the invoice - the burn is informational; the office reconciles plan credits in their accounting workflow. Backend - Service Plans menu under Fusion Repairs root. - List view colour-coded by state. - Form with statusbar + cancel button + Burn History notebook. - Service Plan tab added to product.template form (manager only). - ACL: User read; Dispatcher write/create; Manager full + unlink. Verified end-to-end on local westin-v19: Created plan product 'Annual Stairlift Maintenance - 4 Visits' Sold it via sale.order -> PLAN-00001 auto-created (visits_included=4, end_date=2027-05-21) Submitted visit-report on a stairlift repair -> visits_used=1 remaining=3 (correctly category-matched). Bumped to 19.0.1.5.0. Co-authored-by: Cursor <cursoragent@cursor.com>
92 lines
3.3 KiB
XML
92 lines
3.3 KiB
XML
<?xml version="1.0" encoding="utf-8"?>
|
|
<odoo>
|
|
|
|
<!-- Top-level app menu - lands on the OWL dashboard with quick-actions and KPIs -->
|
|
<menuitem id="menu_fusion_repairs_root"
|
|
name="Fusion Repairs"
|
|
sequence="48"
|
|
web_icon="fusion_repairs,static/description/icon.png"
|
|
action="action_fusion_repairs_home_dashboard"
|
|
groups="fusion_repairs.group_fusion_repairs_user"/>
|
|
|
|
<menuitem id="menu_fusion_repairs_home"
|
|
name="Dashboard"
|
|
parent="menu_fusion_repairs_root"
|
|
action="action_fusion_repairs_home_dashboard"
|
|
sequence="5"/>
|
|
|
|
<menuitem id="menu_fusion_repairs_dashboard"
|
|
name="Service Calls"
|
|
parent="menu_fusion_repairs_root"
|
|
action="action_fusion_repair_dashboard"
|
|
sequence="10"/>
|
|
|
|
<menuitem id="menu_fusion_repairs_new_call"
|
|
name="New Service Call"
|
|
parent="menu_fusion_repairs_root"
|
|
action="action_open_repair_intake_wizard"
|
|
sequence="15"/>
|
|
|
|
<menuitem id="menu_fusion_repairs_all_orders"
|
|
name="All Repair Orders"
|
|
parent="menu_fusion_repairs_root"
|
|
action="repair.action_repair_order_tree"
|
|
sequence="20"/>
|
|
|
|
<menuitem id="menu_fusion_repairs_maintenance_contracts"
|
|
name="Maintenance Contracts"
|
|
parent="menu_fusion_repairs_root"
|
|
action="action_maintenance_contract"
|
|
sequence="30"/>
|
|
|
|
<menuitem id="menu_fusion_repairs_inspections"
|
|
name="Inspection Certificates"
|
|
parent="menu_fusion_repairs_root"
|
|
action="action_repair_inspection"
|
|
sequence="35"/>
|
|
|
|
<menuitem id="menu_fusion_repairs_service_plans"
|
|
name="Service Plans"
|
|
parent="menu_fusion_repairs_root"
|
|
action="action_service_plan_subscription"
|
|
sequence="37"/>
|
|
|
|
<!-- Configuration -->
|
|
<menuitem id="menu_fusion_repairs_configuration"
|
|
name="Configuration"
|
|
parent="menu_fusion_repairs_root"
|
|
sequence="90"
|
|
groups="fusion_repairs.group_fusion_repairs_manager"/>
|
|
|
|
<menuitem id="menu_fusion_repairs_categories"
|
|
name="Equipment Categories"
|
|
parent="menu_fusion_repairs_configuration"
|
|
action="action_repair_product_category"
|
|
sequence="10"/>
|
|
|
|
<menuitem id="menu_fusion_repairs_intake_templates"
|
|
name="Intake Templates"
|
|
parent="menu_fusion_repairs_configuration"
|
|
action="action_repair_intake_template"
|
|
sequence="20"/>
|
|
|
|
<menuitem id="menu_fusion_repairs_service_catalog"
|
|
name="Service Catalogue"
|
|
parent="menu_fusion_repairs_configuration"
|
|
action="action_repair_service_catalog"
|
|
sequence="30"/>
|
|
|
|
<menuitem id="menu_fusion_repairs_warranty"
|
|
name="Repair Warranties"
|
|
parent="menu_fusion_repairs_configuration"
|
|
action="action_repair_warranty_coverage"
|
|
sequence="40"/>
|
|
|
|
<menuitem id="menu_fusion_repairs_qr_stickers"
|
|
name="Generate QR Stickers"
|
|
parent="menu_fusion_repairs_configuration"
|
|
action="action_qr_sticker_wizard"
|
|
sequence="50"/>
|
|
|
|
</odoo>
|