Files
Odoo-Modules/fusion_repairs/security/ir.model.access.csv
gsinghpal 73ee48e7c9 feat(fusion_repairs): Phase 3 - maintenance contracts + client self-booking
Maintenance contracts
- New fusion.repair.maintenance.contract model: one per partner +
  product + lot. Fields: interval_months, last_service_date,
  next_due_date, state, booking_token (secrets.token_urlsafe),
  last_reminder_band (30 / 7 / 1), booking_repair_id
- roll_next_due_date() advances the cycle by interval_months and resets
  the band / booked-repair so the next cycle starts fresh
- sale.order._spawn_maintenance_contracts() creates contracts for
  delivered SOs whose product has x_fc_maintenance_interval_months > 0
  (called from Phase 3 hooks; ready for cron / on-state change wiring)

Reminder cron
- Daily ir.cron at 07:00 -> cron_send_due_reminders()
- Sends email at 30 / 7 / 1 day bands before next_due_date; tracks
  last_reminder_band so we never re-send the same band in one cycle
- Master toggle via ir.config_parameter fusion_repairs.enable_email_notifications

Public client booking portal
- /repairs/maintenance/book/<token>  GET landing page with a date input
- /repairs/maintenance/book/<token>/confirm  POST creates a repair.order
  via contract.create_repair_from_booking() (source='client_portal')
- Idempotent: existing booking shows "already booked" instead of
  spawning a duplicate
- Invalid / expired tokens render a friendly "link not valid" page

Mail template
- email_template_maintenance_due_reminder with 4px green accent bar,
  600px max-width, dark/light safe; renders the tokenized booking CTA
  button directly to /repairs/maintenance/book/<token>

Backend
- Maintenance Contracts list / form with statusbar + chatter
- Menu under Operations -> Maintenance Contracts
- Sequence MC/##### for contract reference
- Access rules: User read, Dispatcher write, Manager full

Verified end-to-end on local westin-v19:
- Contract MC/00003 created due in 7 days
- cron_send_due_reminders() fires the 7-day band; second invocation
  skips (idempotent)
- create_repair_from_booking() spawns BR-WA/RO/00014 with
  x_fc_intake_source='client_portal' and links it back to the contract
- HTTP GET /repairs/maintenance/book/<token> -> 200 with the date input
  and contract reference visible in the page

Co-authored-by: Cursor <cursoragent@cursor.com>
2026-05-20 22:01:30 -04:00

2.7 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