gigafibre-fsm/apps/ops/src/config/nav.js
louispaulb f4138cdd75 Roster AI (planification) + prise de rendez-vous client
Solveur OR-Tools (services/roster-solver) : couverture, compétences,
équité, coût chargé, cadence/efficacité, capacité-par-job ; contraintes
dures/souples façon Timefold.

Hub (lib/roster.js) : génération via solveur, publication par réécriture
de semaine (anti-doublons), demande (effectif ou nb de jobs), cadence/coût/
compétences par tech, pause, congés (Tech Availability + approbation),
booking (slots roster-aware / fit 3-dispos / confirm) + portail public /book.
Réessai sur serialization failures frappe_pg ; appels ERP séquentiels.

Ops : page Planification (grille compacte « J8 », multi-shift, drag-select
+ undo/redo, modèles de semaine, éditeur cadence&coût, congés, SMS opt-in),
page Rendez-vous (répartiteur), jobColor tech en pause → tickets rouges.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-03 16:42:44 -04:00

36 lines
1.9 KiB
JavaScript

// Ops sidebar navigation + search filter options
// `requires` = capability needed to see this nav item (null = always visible)
export const navItems = [
{ path: '/', icon: 'LayoutDashboard', label: 'Tableau de bord', requires: 'view_dashboard_kpi' },
{ path: '/clients', icon: 'Users', label: 'Clients', requires: 'view_clients' },
{ path: '/dispatch', icon: 'Truck', label: 'Dispatch', requires: 'view_all_jobs' },
{ path: '/planification', icon: 'CalendarRange', label: 'Planification', requires: 'view_all_jobs' },
{ path: '/rdv', icon: 'CalendarClock', label: 'Rendez-vous', requires: 'view_all_jobs' },
{ path: '/tickets', icon: 'Ticket', label: 'Tickets', requires: 'view_all_tickets' },
{ path: '/equipe', icon: 'UsersRound', label: 'Équipe', requires: 'manage_users' },
{ path: '/rapports', icon: 'BarChart3', label: 'Rapports', requires: 'view_dashboard_kpi' },
{ path: '/campaigns', icon: 'Gift', label: 'Campagnes', requires: 'manage_users' },
{ path: '/email-queue', icon: 'Mail', label: 'File courriels', requires: 'view_settings' },
{ path: '/settings', icon: 'Settings', label: 'Paramètres', requires: 'view_settings' },
]
export const territoryOptions = [
{ label: 'Gatineau', value: 'Gatineau' },
{ label: 'Ottawa', value: 'Ottawa' },
{ label: 'Aylmer', value: 'Aylmer' },
{ label: 'Hull', value: 'Hull' },
{ label: 'Buckingham', value: 'Buckingham' },
{ label: 'Masson-Angers', value: 'Masson-Angers' },
]
export const statusOptions = [
{ label: 'Actif', value: 'Active' },
{ label: 'Inactif', value: 'Inactive' },
{ label: 'En attente', value: 'Pending' },
]
export const customerTypeOptions = [
{ label: 'Individu', value: 'Individual' },
{ label: 'Entreprise', value: 'Company' },
]