When admin (gsingh, uid=2) opened a repair on the dashboard:
"Sorry, Gurpreet Singh (id=2) doesn't have 'read' access to:
- Repair Order, RO-202605-04 (repair.order: 34)
Blame the following rules:
- Repair Order: Technician sees own repairs"
Root cause: per-group record rules in Odoo are OR'd within the same
model. Admin had been added directly to fusion_tasks.group_field_technician
in this database (verified via res_groups_users_rel - direct=1), so the
technician's restrictive rule ('only repairs you are assigned to') kicked
in. Until now there was no per-group rule for the Repairs Office groups
to OR against, so the restrictive rule won by default.
Fix - added two pairs of permissive rules:
rule_repair_order_repairs_user_full - User can read/write/create
rule_repair_order_repairs_manager_unlink - Manager also can delete
rule_technician_task_repairs_office - User can read/write/create tasks
rule_technician_task_repairs_manager_unlink - Manager also can delete tasks
Both have domain_force=[(1,'=',1)] so they grant unrestricted access for
the Repairs groups. OR'd with the field_technician rule, admin and other
office users now see everything. Field technicians who do NOT have any
Repairs group still see only their assigned repairs (rule unchanged).
Also added the matching ir.model.access.csv entries - record rules don't
fire if the user has no model-level ACL. This is the second fix
('office users can schedule') from the same complaint - Repairs User now
has read/write/create on fusion.technician.task; Repairs Manager also
gets unlink.
Verified end-to-end on westin-v19:
Admin can see 17 repairs (was 0 before fix)
Admin can read RO-202605-04 -> 'Gurpreet Singh' (the exact failing record)
Admin can create fusion.technician.task -> permission check passes
(model's own time-overlap business validation correctly rejects an
overlap, but that is a value error not a permission error)
Bumped to 19.0.1.0.7.
Co-authored-by: Cursor <cursoragent@cursor.com>
118 lines
4.2 KiB
Python
118 lines
4.2 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.0.7',
|
|
'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',
|
|
# 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_order_views.xml',
|
|
'views/sale_order_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',
|
|
# 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,
|
|
}
|