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>
2.7 KiB
2.7 KiB
| 1 | id | name | model_id:id | group_id:id | perm_read | perm_write | perm_create | perm_unlink |
|---|---|---|---|---|---|---|---|---|
| 2 | access_repair_product_category_user | Repair Category User Read | model_fusion_repair_product_category | group_fusion_repairs_user | 1 | 0 | 0 | 0 |
| 3 | access_repair_product_category_manager | Repair Category Manager Full | model_fusion_repair_product_category | group_fusion_repairs_manager | 1 | 1 | 1 | 1 |
| 4 | access_repair_intake_template_user | Intake Template User Read | model_fusion_repair_intake_template | group_fusion_repairs_user | 1 | 0 | 0 | 0 |
| 5 | access_repair_intake_template_manager | Intake Template Manager Full | model_fusion_repair_intake_template | group_fusion_repairs_manager | 1 | 1 | 1 | 1 |
| 6 | access_repair_intake_question_user | Intake Question User Read | model_fusion_repair_intake_question | group_fusion_repairs_user | 1 | 0 | 0 | 0 |
| 7 | access_repair_intake_question_manager | Intake Question Manager Full | model_fusion_repair_intake_question | group_fusion_repairs_manager | 1 | 1 | 1 | 1 |
| 8 | access_repair_intake_answer_user | Intake Answer User Full | model_fusion_repair_intake_answer | group_fusion_repairs_user | 1 | 1 | 1 | 0 |
| 9 | access_repair_intake_answer_manager | Intake Answer Manager Full | model_fusion_repair_intake_answer | group_fusion_repairs_manager | 1 | 1 | 1 | 1 |
| 10 | access_repair_intake_answer_tech_portal | Intake Answer Technician Read | model_fusion_repair_intake_answer | fusion_tasks.group_field_technician | 1 | 0 | 0 | 0 |
| 11 | access_repair_intake_wizard_user | Intake Wizard User Full | model_fusion_repair_intake_wizard | group_fusion_repairs_user | 1 | 1 | 1 | 1 |
| 12 | access_repair_intake_wizard_equipment_user | Intake Wizard Equipment User Full | model_fusion_repair_intake_wizard_equipment | group_fusion_repairs_user | 1 | 1 | 1 | 1 |
| 13 | access_repair_service_catalog_user | Catalogue User Read | model_fusion_repair_service_catalog | group_fusion_repairs_user | 1 | 0 | 0 | 0 |
| 14 | access_repair_service_catalog_manager | Catalogue Manager Full | model_fusion_repair_service_catalog | group_fusion_repairs_manager | 1 | 1 | 1 | 1 |
| 15 | access_repair_warranty_user | Warranty User Read | model_fusion_repair_warranty_coverage | group_fusion_repairs_user | 1 | 0 | 0 | 0 |
| 16 | access_repair_warranty_manager | Warranty Manager Full | model_fusion_repair_warranty_coverage | group_fusion_repairs_manager | 1 | 1 | 1 | 1 |
| 17 | access_repair_visit_report_wizard_user | Visit Report Wizard User | model_fusion_repair_visit_report_wizard | group_fusion_repairs_user | 1 | 1 | 1 | 1 |
| 18 | access_repair_visit_report_wizard_line_user | Visit Report Line User | model_fusion_repair_visit_report_wizard_line | group_fusion_repairs_user | 1 | 1 | 1 | 1 |
| 19 | access_repair_maintenance_user | Maintenance Contract User Read | model_fusion_repair_maintenance_contract | group_fusion_repairs_user | 1 | 0 | 0 | 0 |
| 20 | access_repair_maintenance_dispatcher | Maintenance Contract Dispatcher | model_fusion_repair_maintenance_contract | group_fusion_repairs_dispatcher | 1 | 1 | 1 | 0 |
| 21 | access_repair_maintenance_manager | Maintenance Contract Manager Full | model_fusion_repair_maintenance_contract | group_fusion_repairs_manager | 1 | 1 | 1 | 1 |