New fusion.repair.inspection.certificate model for the annual safety inspections required on stairlifts, porch lifts, and power wheelchairs in many jurisdictions. Model - mail.thread chatter-tracked; fields: name (CERT-YYYY-NNNN auto-seq), partner_id, product_id (filtered to safety-critical categories), lot_id, repair_order_id back-link, inspector_user_id (must be field staff), jurisdiction (selection: Ontario / BC / Alberta / Quebec / Other), issued_date, valid_for_months (default 12), expiry_date (computed, stored, uses relativedelta - correct month boundaries), status (non-stored compute: valid / expiring / expired / revoked), revoked, notes, last_reminder_band. - Unique constraint on certificate number (models.Constraint, not _sql_constraints, per project rule). - Sequence 'fusion.repair.inspection.certificate' with use_date_range=True so the counter resets each year (CERT-2026-0001 ... CERT-2027-0001). Visit report integration - New issue_inspection_cert checkbox on fusion.repair.visit.report.wizard. - When ticked AND the repair's category is safety_critical, action_confirm() creates the certificate via _create_inspection_certificate() and redirects to the cert form so the tech can print immediately. - Non-safety-critical equipment quietly skips with a chatter note explaining why. PDF report - web.html_container + web.external_layout, model bound so it appears as a Print action on the certificate form. - 'Certificate of Inspection' / 'Safety Inspected' gold-banner layout with client name, equipment, serial, jurisdiction, issued + expiry dates, inspector signature line, and the certificate number. - Print Certificate button in form header. Daily cron - cron_send_expiry_reminders runs at 09:00, sends two band-tracked reminders (30 days + 7 days before expiry) to the client. - New mail.template email_template_inspection_expiry_reminder with 4px amber accent, certificate ref, equipment, expiry date, and a CTA to call to book the re-inspection visit. - last_reminder_band on the cert prevents re-sending the same band. Backend wiring - New menu entry 'Fusion Repairs > Inspection Certificates'. - ACL: User read, Dispatcher write, Manager unlink. Field technicians can create (they need to issue from the field). - List view with red/amber/green status decoration. - Form with statusbar, header buttons (Print, Revoke with confirm), chatter. Verified end-to-end on local westin-v19: Stairlift repair RO-202605-15 -> visit-report with issue_inspection_cert=True -> CERT-2026-0001 issued (status=valid, expires 2027-05-21) Cert CERT-2026-0002 expiring in 30 days -> cron flagged last_reminder_band='30' (would email client). Bumped to 19.0.1.4.0 (minor bump for the new public-facing capability). Co-authored-by: Cursor <cursoragent@cursor.com>
125 lines
4.5 KiB
Python
125 lines
4.5 KiB
Python
# -*- coding: utf-8 -*-
|
|
# Copyright 2024-2026 Nexa Systems Inc.
|
|
# License OPL-1 (Odoo Proprietary License v1.0)
|
|
|
|
{
|
|
'name': 'Fusion Repairs',
|
|
'version': '19.0.1.4.0',
|
|
'category': 'Inventory/Repairs',
|
|
'summary': 'Guided medical equipment repair intake, dispatch, maintenance, and self-service portal',
|
|
'description': """
|
|
Fusion Repairs
|
|
==============
|
|
|
|
Comprehensive repairs and maintenance management for medical equipment retailers
|
|
and service providers (hospital beds, wheelchairs, stairlifts, porch lifts,
|
|
walkers, mattresses, rollators).
|
|
|
|
Phase 1 - MVP
|
|
-------------
|
|
- Three intake surfaces sharing one service layer:
|
|
* Backend wizard for CS reps on the phone
|
|
* Sales rep portal (/my/repair/new) for reps on the road
|
|
* Public client self-service portal (/repair) - voicemail ready
|
|
- Guided question templates per medical equipment category
|
|
- Phone-first partner lookup with duplicate-call detection
|
|
- Multi-equipment per call (one repair.order per unit)
|
|
- Photo / video capture during intake
|
|
- Third-party equipment support (equipment we didn't sell)
|
|
- Auto warranty detection from original sale order
|
|
- Office notification recipients + 4 follow-up activities
|
|
- repair.order extensions linked to fusion.technician.task
|
|
|
|
Phase 2-4 (roadmap)
|
|
-------------------
|
|
- AI self-check engine with strict medical safety guardrails
|
|
- Upsell engine and direct-buy parts/plans
|
|
- Repair warranty tracking (free re-do window)
|
|
- Visit report wizard with Poynt terminal payment
|
|
- Maintenance contracts with client self-booking
|
|
- Weekend safety on-call paging
|
|
- SMS notifications, compliance certificates, analytics
|
|
|
|
Copyright (C) 2024-2026 Nexa Systems Inc. All rights reserved.
|
|
""",
|
|
'author': 'Nexa Systems Inc.',
|
|
'website': 'https://www.nexasystems.ca',
|
|
'maintainer': 'Nexa Systems Inc.',
|
|
'support': 'support@nexasystems.ca',
|
|
'license': 'OPL-1',
|
|
'price': 0.00,
|
|
'currency': 'CAD',
|
|
'depends': [
|
|
'base',
|
|
'mail',
|
|
'portal',
|
|
'website',
|
|
'sale_management',
|
|
'stock',
|
|
'repair',
|
|
'maintenance',
|
|
'fusion_tasks',
|
|
'fusion_poynt',
|
|
'fusion_authorizer_portal',
|
|
],
|
|
'data': [
|
|
# Security
|
|
'security/security.xml',
|
|
'security/ir.model.access.csv',
|
|
# Data (must load before views that reference records)
|
|
'data/ir_sequence_data.xml',
|
|
'data/ir_config_parameter_data.xml',
|
|
'data/ir_cron_data.xml',
|
|
'data/mail_activity_type_data.xml',
|
|
'data/mail_template_data.xml',
|
|
'data/repair_product_category_data.xml',
|
|
'data/intake_template_data.xml',
|
|
'data/self_check_data.xml',
|
|
# Views
|
|
'views/repair_product_category_views.xml',
|
|
'views/intake_template_views.xml',
|
|
'views/service_catalog_views.xml',
|
|
'views/repair_warranty_views.xml',
|
|
'views/maintenance_contract_views.xml',
|
|
'views/repair_dashboard_views.xml',
|
|
'views/repair_inspection_views.xml',
|
|
'views/repair_order_views.xml',
|
|
'views/sale_order_views.xml',
|
|
'views/technician_task_views.xml',
|
|
'views/res_partner_views.xml',
|
|
'views/res_users_views.xml',
|
|
'views/res_config_settings_views.xml',
|
|
# Portal templates
|
|
'views/portal_sales_rep_templates.xml',
|
|
'views/portal_client_repair_templates.xml',
|
|
'views/portal_maintenance_templates.xml',
|
|
# Wizards
|
|
'wizard/repair_intake_wizard_views.xml',
|
|
'wizard/repair_visit_report_wizard_views.xml',
|
|
'wizard/qr_sticker_wizard_views.xml',
|
|
# Reports
|
|
'report/qr_sticker_report.xml',
|
|
'report/inspection_certificate_report.xml',
|
|
# Menus (last, after all referenced actions exist)
|
|
'views/menus.xml',
|
|
],
|
|
'assets': {
|
|
'web.assets_backend': [
|
|
# Tokens MUST load first - dashboard.scss references its variables.
|
|
'fusion_repairs/static/src/scss/_fr_tokens.scss',
|
|
'fusion_repairs/static/src/scss/dashboard.scss',
|
|
'fusion_repairs/static/src/components/dashboard/dashboard.js',
|
|
'fusion_repairs/static/src/components/dashboard/dashboard.xml',
|
|
],
|
|
'web.assets_frontend': [
|
|
'fusion_repairs/static/src/scss/portal_repair_mobile.scss',
|
|
'fusion_repairs/static/src/scss/portal_client_repair.scss',
|
|
'fusion_repairs/static/src/js/portal_repair_intake.js',
|
|
],
|
|
},
|
|
'images': ['static/description/icon.png'],
|
|
'installable': True,
|
|
'application': True,
|
|
'auto_install': False,
|
|
}
|