Files
Odoo-Modules/fusion_repairs/data/ir_sequence_data.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

67 lines
3.2 KiB
XML

<?xml version="1.0" encoding="utf-8"?>
<odoo>
<data noupdate="1">
<!-- Intake session reference. -->
<!-- Groups multiple repair.order records created from the same call. -->
<record id="seq_repair_intake_session" model="ir.sequence">
<field name="name">Repair Intake Session</field>
<field name="code">fusion.repair.intake.session</field>
<field name="prefix">RIS</field>
<field name="padding">6</field>
<field name="number_next">1</field>
<field name="number_increment">1</field>
<field name="company_id" eval="False"/>
</record>
<!-- Maintenance contract reference -->
<record id="seq_repair_maintenance_contract" model="ir.sequence">
<field name="name">Repair Maintenance Contract</field>
<field name="code">fusion.repair.maintenance.contract</field>
<field name="prefix">MC/</field>
<field name="padding">5</field>
<field name="number_next">1</field>
<field name="number_increment">1</field>
<field name="company_id" eval="False"/>
</record>
<!-- Service plan subscription reference: PLAN-NNNNN. -->
<record id="seq_repair_service_plan_subscription" model="ir.sequence">
<field name="name">Service Plan Subscription</field>
<field name="code">fusion.repair.service.plan.subscription</field>
<field name="prefix">PLAN-</field>
<field name="padding">5</field>
<field name="number_next">1</field>
<field name="number_increment">1</field>
<field name="company_id" eval="False"/>
</record>
<!-- Inspection certificate reference: CERT-YYYY-NNNN, yearly reset. -->
<record id="seq_repair_inspection_certificate" model="ir.sequence">
<field name="name">Inspection Certificate</field>
<field name="code">fusion.repair.inspection.certificate</field>
<field name="prefix">CERT-%(year)s-</field>
<field name="padding">4</field>
<field name="number_next">1</field>
<field name="number_increment">1</field>
<field name="use_date_range" eval="True"/>
<field name="company_id" eval="False"/>
</record>
<!-- Date-based repair.order reference: RO-YYYYMM-NN, counter resets monthly.
use_date_range=True so Odoo creates an ir.sequence.date_range record
per month with its own number_next, giving each month a fresh -01.
%(year)s -> 4-digit year, %(month)s -> zero-padded month (per strftime %m). -->
<record id="seq_repair_order_monthly" model="ir.sequence">
<field name="name">Repair Order (RO-YYYYMM-NN)</field>
<field name="code">fusion.repair.order.monthly</field>
<field name="prefix">RO-%(year)s%(month)s-</field>
<field name="suffix"/>
<field name="padding">2</field>
<field name="number_next">1</field>
<field name="number_increment">1</field>
<field name="use_date_range" eval="True"/>
<field name="company_id" eval="False"/>
</record>
</data>
</odoo>