Files
Odoo-Modules/fusion_repairs/security/ir.model.access.csv
gsinghpal 48dd7718e2 feat(fusion_repairs): Bundle 10 - align pricing to Westin's printed rate card
User shared their actual published service-rate card. Bundle 9's seeded
numbers were placeholders that no longer match. Realigned the rate card,
added the LIFT & ELEVATING SERVICE class, added the in-shop labour
rate path, added the delivery / pickup charge model, added rush as a
proper tier (distinct from after-hours), and added 30-min increment
rounding on top of the existing 1-hour minimum.

EQUIPMENT CLASS

  fusion.repair.product.category gets a new x_fc_equipment_class
  selection: 'standard' vs 'lift_elevating'. The published card splits
  pricing into two service classes - lift_elevating has higher rates
  ($160 callout vs $95, $110/h vs $85).

  Categories marked lift_elevating in seed:
    stairlift, porch_lift, lift_chair (new)

  New 'Lift Chair' category seeded (power recliner / lift chair).

CALLOUT RATE CARD

  fusion.repair.callout.rate gets:
    - equipment_class field (standard / lift_elevating)
    - in_shop_labor_rate field (separate $75 vs $85 on-site)
    - 'rush' tier value (was missing - rush was implicit via emergency
       surcharge from Bundle 8; now a proper tier matching the printed
       rate card row 'Rush Service Calls $120')

  Re-seeded with the PUBLISHED Westin rate card (exact values):

    STANDARD SERVICE
      regular         $95  callout / $85/h on-site  / $75/h in-shop
      rush            $120 callout / $85/h          / $75/h
      after_hours     $140 callout / $85/h          / $75/h
      weekend         $180 callout / $85/h          / $75/h   (extension)
      holiday         $220 callout / $85/h          / $75/h   (extension)

    LIFT & ELEVATING SERVICE
      regular         $160 callout / $110/h on-site / $110/h in-shop
      rush            $200 callout / $110/h         / $110/h  (extension)
      after_hours     $240 callout / $110/h         / $110/h  (extension)
      weekend         $300 callout / $110/h         / $110/h  (extension)
      holiday         $360 callout / $110/h         / $110/h  (extension)

    Travel: $0.70 per km, BOTH WAYS, past 25 km, per technician
    (matches the per-card '$0.70 per km x 2-way' footnote).

  get_for_tier(tier, equipment_class) now resolves with a fallback:
  tries (tier, lift_elevating) first, falls back to (tier, standard)
  if no lift-specific row exists - so an admin can leave standard rows
  as the catch-all and only customise lift for the exceptions.

DELIVERY / PICKUP RATE CARD

  New fusion.repair.delivery.charge model + seed of all 7 items from
  the printed card:
    Local Service Area (within Brampton) ........ $35
    Outside Local Area .......................... $60
    Rush Pickups / Delivery ..................... $60 + $0.70/km x 2-way
    Lift Chair Delivery and Set-Up .............. $120
    Hospital Bed Delivery and Set-Up ............ $120
    Stairlift Delivery and Set-Up ............... $300
    Stairlift Removal ........................... $300

  quote_rush(distance_km) helper for the office's delivery scheduling.
  New menu: Configuration > Delivery / Pickup Charges.

PRICING ENGINE UPDATES (repair.order._compute_callout_quote)

  - Class-aware rate lookup (uses category.equipment_class).
  - In-shop mode (x_fc_in_shop=True): skips callout fee + extra-tech +
    travel; charges in_shop_labor_rate * hours * techs only. Per the
    rate-card footnote 'In-Shop Labour Rate'.
  - 30-min increment rounding ON TOP of the 1-hour floor:
    billable_h = max(ceil(actual * 2) / 2, min_hours)
    -> 20-min work bills 1.0 h
    -> 75-min work bills 1.5 h
    -> 95-min work bills 2.0 h
  - Improved breakdown text shows the rate-card row name + class +
    pro-ration math so the client can see how the total was computed.

NEW FIELDS

  repair.order:
    x_fc_in_shop  (Boolean) - flip to switch the quote engine to
                              in-shop mode.
    x_fc_callout_tier now includes 'rush' as a value (was missing).

  visit-report wizard:
    callout_in_shop related field - tech can flip the mode on-site if
    the work was actually done in-store after pickup.

MIGRATION SCRIPT

  migrations/19.0.2.1.0/post-migration.py runs once on existing
  installs:
    1. Updates stairlift / porch_lift / lift_chair categories
       equipment_class -> lift_elevating
    2. Wipes the 4 Bundle 9 rate-card xml_ids so the new noupdate=1
       seed creates them with the correct printed values.

  Fresh installs get the right values directly from the seed XML.
  Admin-created custom rate rows (no xml_id) are NEVER touched.

VERIFIED END-TO-END (0 bugs across 28 checks)

  Rate card matches printed values exactly:
    regular/standard      = $95/$85h/$75h          PASS
    rush/standard         = $120/$85h/$75h         PASS
    after_hours/standard  = $140/$85h/$75h         PASS
    regular/lift          = $160/$110h/$110h       PASS

  Six end-to-end quote scenarios:
    A. Standard 12km 20-min   -> $180  ($95 + 1h*$85)
    B. Lift     12km 20-min   -> $270  ($160 + 1h*$110)
    C. Rush     30km 1.2h     -> $254.50
       ($120 + ceil(2.4)/2=1.5h * $85 + 5km*2*$0.70 = $7)
    D. After-hours lift 2-tech 35km 2.6h -> $928.00
       ($240 + ceil(5.2)/2=3.0h * $110 * 2 + 10km*2*$0.70*2)
    E. In-shop  standard 2h   -> $150  (2h * $75 in-shop, no callout)
    F. In-shop  lift 1.5h     -> $165  (1.5h * $110 in-shop)

  Seven delivery rates loaded with correct amounts; rush 40km calc
  = $81 ($60 base + 15km*2*$0.70).

  Stairlift / Porch Lift / Lift Chair categories correctly marked
  lift_elevating; rest stay standard.

Bumped to 19.0.2.1.0.

Co-authored-by: Cursor <cursoragent@cursor.com>
2026-05-21 02:47:11 -04:00

7.0 KiB

1idnamemodel_id:idgroup_id:idperm_readperm_writeperm_createperm_unlink
2access_repair_product_category_userRepair Category User Readmodel_fusion_repair_product_categorygroup_fusion_repairs_user1000
3access_repair_product_category_managerRepair Category Manager Fullmodel_fusion_repair_product_categorygroup_fusion_repairs_manager1111
4access_repair_intake_template_userIntake Template User Readmodel_fusion_repair_intake_templategroup_fusion_repairs_user1000
5access_repair_intake_template_managerIntake Template Manager Fullmodel_fusion_repair_intake_templategroup_fusion_repairs_manager1111
6access_repair_intake_question_userIntake Question User Readmodel_fusion_repair_intake_questiongroup_fusion_repairs_user1000
7access_repair_intake_question_managerIntake Question Manager Fullmodel_fusion_repair_intake_questiongroup_fusion_repairs_manager1111
8access_repair_intake_answer_userIntake Answer User Fullmodel_fusion_repair_intake_answergroup_fusion_repairs_user1110
9access_repair_intake_answer_managerIntake Answer Manager Fullmodel_fusion_repair_intake_answergroup_fusion_repairs_manager1111
10access_repair_intake_answer_tech_portalIntake Answer Technician Readmodel_fusion_repair_intake_answerfusion_tasks.group_field_technician1000
11access_repair_intake_wizard_userIntake Wizard User Fullmodel_fusion_repair_intake_wizardgroup_fusion_repairs_user1111
12access_repair_intake_wizard_equipment_userIntake Wizard Equipment User Fullmodel_fusion_repair_intake_wizard_equipmentgroup_fusion_repairs_user1111
13access_repair_service_catalog_userCatalogue User Readmodel_fusion_repair_service_cataloggroup_fusion_repairs_user1000
14access_repair_service_catalog_managerCatalogue Manager Fullmodel_fusion_repair_service_cataloggroup_fusion_repairs_manager1111
15access_repair_warranty_userWarranty User Readmodel_fusion_repair_warranty_coveragegroup_fusion_repairs_user1000
16access_repair_warranty_managerWarranty Manager Fullmodel_fusion_repair_warranty_coveragegroup_fusion_repairs_manager1111
17access_repair_visit_report_wizard_userVisit Report Wizard Usermodel_fusion_repair_visit_report_wizardgroup_fusion_repairs_user1111
18access_repair_visit_report_wizard_line_userVisit Report Line Usermodel_fusion_repair_visit_report_wizard_linegroup_fusion_repairs_user1111
19access_repair_maintenance_userMaintenance Contract User Readmodel_fusion_repair_maintenance_contractgroup_fusion_repairs_user1000
20access_repair_maintenance_dispatcherMaintenance Contract Dispatchermodel_fusion_repair_maintenance_contractgroup_fusion_repairs_dispatcher1110
21access_repair_maintenance_managerMaintenance Contract Manager Fullmodel_fusion_repair_maintenance_contractgroup_fusion_repairs_manager1111
22access_repair_order_repairs_userRepair Order Repairs User Read/Writerepair.model_repair_ordergroup_fusion_repairs_user1110
23access_repair_order_repairs_managerRepair Order Repairs Manager Fullrepair.model_repair_ordergroup_fusion_repairs_manager1111
24access_technician_task_repairs_userTechnician Task Repairs User Schedulefusion_tasks.model_fusion_technician_taskgroup_fusion_repairs_user1110
25access_technician_task_repairs_managerTechnician Task Repairs Manager Fullfusion_tasks.model_fusion_technician_taskgroup_fusion_repairs_manager1111
26access_repair_self_check_rule_userSelf-Check Rule User Readmodel_fusion_repair_self_check_rulegroup_fusion_repairs_user1000
27access_repair_self_check_rule_managerSelf-Check Rule Manager Fullmodel_fusion_repair_self_check_rulegroup_fusion_repairs_manager1111
28access_qr_sticker_wizard_userQR Sticker Wizard User Fullmodel_fusion_repair_qr_sticker_wizardgroup_fusion_repairs_user1111
29access_repair_inspection_userInspection Cert User Readmodel_fusion_repair_inspection_certificategroup_fusion_repairs_user1000
30access_repair_inspection_dispatcherInspection Cert Dispatchermodel_fusion_repair_inspection_certificategroup_fusion_repairs_dispatcher1110
31access_repair_inspection_managerInspection Cert Manager Fullmodel_fusion_repair_inspection_certificategroup_fusion_repairs_manager1111
32access_repair_inspection_technicianInspection Cert Field Tech Read-Onlymodel_fusion_repair_inspection_certificatefusion_tasks.group_field_technician1000
33access_service_plan_sub_userService Plan Sub User Readmodel_fusion_repair_service_plan_subscriptiongroup_fusion_repairs_user1000
34access_service_plan_sub_dispatcherService Plan Sub Dispatchermodel_fusion_repair_service_plan_subscriptiongroup_fusion_repairs_dispatcher1110
35access_service_plan_sub_managerService Plan Sub Manager Fullmodel_fusion_repair_service_plan_subscriptiongroup_fusion_repairs_manager1111
36access_service_plan_burn_userService Plan Burn User Readmodel_fusion_repair_service_plan_burngroup_fusion_repairs_user1000
37access_service_plan_burn_managerService Plan Burn Manager Fullmodel_fusion_repair_service_plan_burngroup_fusion_repairs_manager1111
38access_emergency_charge_userEmergency Charge User Readmodel_fusion_repair_emergency_chargegroup_fusion_repairs_user1000
39access_emergency_charge_managerEmergency Charge Manager Fullmodel_fusion_repair_emergency_chargegroup_fusion_repairs_manager1111
40access_part_order_userPart Order User Readmodel_fusion_repair_part_ordergroup_fusion_repairs_user1000
41access_part_order_dispatcherPart Order Dispatchermodel_fusion_repair_part_ordergroup_fusion_repairs_dispatcher1110
42access_part_order_managerPart Order Manager Fullmodel_fusion_repair_part_ordergroup_fusion_repairs_manager1111
43access_part_order_technicianPart Order Field Tech Createmodel_fusion_repair_part_orderfusion_tasks.group_field_technician1110
44access_visit_report_partline_userVisit Report Part Line User Fullmodel_fusion_repair_visit_report_wizard_partlinegroup_fusion_repairs_user1111
45access_visit_report_partline_techVisit Report Part Line Field Tech Fullmodel_fusion_repair_visit_report_wizard_partlinefusion_tasks.group_field_technician1111
46access_callout_rate_userCallout Rate User Readmodel_fusion_repair_callout_rategroup_fusion_repairs_user1000
47access_callout_rate_managerCallout Rate Manager Fullmodel_fusion_repair_callout_rategroup_fusion_repairs_manager1111
48access_delivery_charge_userDelivery Charge User Readmodel_fusion_repair_delivery_chargegroup_fusion_repairs_user1000
49access_delivery_charge_managerDelivery Charge Manager Fullmodel_fusion_repair_delivery_chargegroup_fusion_repairs_manager1111
50access_labor_warranty_userLabor Warranty User Readmodel_fusion_repair_labor_warrantygroup_fusion_repairs_user1000
51access_labor_warranty_sales_repLabor Warranty Sales Rep Writemodel_fusion_repair_labor_warrantygroup_fusion_repairs_sales_rep1100
52access_labor_warranty_managerLabor Warranty Manager Fullmodel_fusion_repair_labor_warrantygroup_fusion_repairs_manager1111
53access_labor_warranty_technicianLabor Warranty Field Tech Readmodel_fusion_repair_labor_warrantyfusion_tasks.group_field_technician1100