Files
Odoo-Modules/fusion_repairs/views/menus.xml
gsinghpal f463600585 feat(fusion_repairs): Bundle 5 - M5 pre-paid service plans + burn-down
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>
2026-05-21 00:19:28 -04:00

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>