Plus besoin de re-chercher avec un processus complexe : une page liste les adresses de service non conformes (review/unmatched) avec leur proposition AQ canonique, et permet de RÉSOUDRE une fois (persisté) : - Approuver : la proposition AQ devient officielle (validated, coords RQA). - Corriger : recherche AQ locale (rqa_addresses + fibre) → lier la bonne adresse. - GPS : saisir/coller lat,long (relevé sur map.targointernet.com qui a la géoloc des unités de camping) + lien direct « voir sur la carte » par ligne. - Rejeter : pas d'adresse civique (boîte postale/hors-QC) → 'no_address'. Tri par type (camping / civique à corriger / à confirmer / non-adresse) + stats + recherche + pagination. Backend : lib/address-conformity.js (GET stats|list|candidates, POST resolve) sur le Postgres LOCAL, routé /address/conformity/* (server.js). Front : api/address.js + pages/AddressConformityPage.vue + route /conformite-adresses + entrée nav « Conformité adresses » (icône MapPinned, requires view_settings). État courant : validated 15 195 · review 1 366 · unmatched 550 (camping 540 / civique 333 / non-adresse 93). Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
38 lines
2.1 KiB
JavaScript
38 lines
2.1 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: '/copilote', icon: 'Sparkles', label: 'Copilote', 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: '/conformite-adresses', icon: 'MapPinned', label: 'Conformité adresses', requires: 'view_settings' },
|
|
{ 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' },
|
|
]
|