feat(rbac): human labels + descriptions for all 50 permissions

- Add Permissions::permissionLabels() mapping every slug to a
  human-readable RO label (e.g. 'clients.view_all' → 'Vezi toți
  clienții').
- RoleResource permission checkboxes now show translated labels
  as titles + technical slug as description (so admins see both
  the meaning and the key).
- PermissionOverridesRelationManager Select 'permission_id' now
  shows 'Human label (technical.slug)' format, plus helper text
  explaining GRANT/DENY. Same format on the display column.
- +57 translations (50 permission labels in RU/EN + role page
  supporting keys + module labels).

All 306 tests pass.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
This commit is contained in:
2026-07-18 11:16:21 +00:00
parent af0327d27d
commit 49b491a7bd
4 changed files with 185 additions and 7 deletions
+59
View File
@@ -132,6 +132,65 @@ class Permissions
];
}
/** Human-readable label for each permission slug. Used by role editor + audit UI. */
public static function permissionLabels(): array
{
return [
'clients.view_all' => 'Vezi toți clienții',
'clients.view_own' => 'Vezi doar clienții proprii',
'clients.create' => 'Adaugă client',
'clients.edit' => 'Editează client',
'clients.delete' => 'Șterge client',
'clients.export' => 'Exportă clienți (CSV)',
'vehicles.view_all' => 'Vezi toate mașinile',
'vehicles.create' => 'Adaugă mașină',
'vehicles.edit' => 'Editează mașină',
'vehicles.delete' => 'Șterge mașină',
'work_orders.view_all' => 'Vezi toate fișele',
'work_orders.view_own_assigned' => 'Vezi doar fișele proprii asignate',
'work_orders.create' => 'Deschide fișă nouă',
'work_orders.edit' => 'Editează fișă',
'work_orders.delete' => 'Șterge fișă',
'work_orders.change_status' => 'Schimbă statusul fișei',
'work_orders.approve_discount_5' => 'Aprobă discount ≤ 5%',
'work_orders.approve_discount_20' => 'Aprobă discount ≤ 20%',
'work_orders.approve_discount_any' => 'Aprobă discount fără limită',
'work_orders.print' => 'Tipărește / PDF fișă',
'finance.view_overview' => 'Vezi panou finanțe',
'finance.view_pl' => 'Vezi profit & pierdere (P&L)',
'finance.view_internal_margin' => 'Vezi marja internă (baza de salariu)',
'finance.create_payment' => 'Înregistrează plată',
'finance.delete_payment' => 'Șterge plată',
'finance.create_expense' => 'Înregistrează cheltuială',
'finance.export' => 'Exportă rapoarte financiare',
'salaries.view_own' => 'Vezi propriul salariu',
'salaries.view_all' => 'Vezi salariile tuturor',
'salaries.calculate' => 'Calculează salarii',
'salaries.mark_paid' => 'Marchează salariul ca plătit',
'inventory.view' => 'Vezi stoc (piese)',
'inventory.create_part' => 'Adaugă piesă în catalog',
'inventory.edit_part' => 'Editează piesă',
'inventory.delete_part' => 'Șterge piesă',
'inventory.adjust_stock' => 'Ajustează stocul manual',
'inventory.create_purchase' => 'Creează comandă de aprovizionare',
'inventory.receive_goods' => 'Recepționează marfă',
'suppliers.view' => 'Vezi furnizori',
'suppliers.edit' => 'Editează furnizor',
'suppliers.delete' => 'Șterge furnizor',
'admin.users.view' => 'Vezi utilizatori',
'admin.users.manage' => 'Gestionează utilizatori (creează/blochează)',
'admin.roles.manage' => 'Editează roluri & drepturi',
'admin.settings.edit' => 'Editează setările companiei',
'admin.settings.integrations' => 'Configurează integrări externe',
'admin.api_tokens.manage' => 'Gestionează tokene API',
'admin.audit_log.view' => 'Vezi jurnalul de audit',
'admin.backup.download' => 'Descarcă backup',
'ai_assistant.use' => 'Folosește AI Assistant',
'ai_assistant.configure_keys' => 'Configurează chei API pentru AI',
'analytics.view' => 'Vezi rapoarte & analitică',
];
}
/**
* Role-permission matrix per TZ §2.4.
* Returns: ['owner' => [perm1, perm2, ...], ...]