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>
36 lines
1.9 KiB
JavaScript
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' },
|
|
]
|