===== STRUCTURE ===== . ├── css │   └── app.css ├── js │   ├── app.js │   └── bootstrap.js ├── output.txt └── views ├── auth │   └── login.blade.php ├── layout │   ├── app.blade.php │   ├── header.blade.php │   └── sidebar.blade.php ├── pages │   ├── cities │   │   ├── create.blade.php │   │   ├── edit.blade.php │   │   └── index.blade.php │   ├── dashboard │   │   └── admin-dashboard.blade.php │   ├── dashboard.blade.php │   ├── deplacements │   │   ├── create.blade.php │   │   ├── index.blade.php │   │   └── show.blade.php │   ├── listings │   │   ├── create.blade.php │   │   ├── edit.blade.php │   │   ├── index.blade.php │   │   └── partials │   │   └── table.blade.php │   ├── permissions │   │   ├── index.blade.php │   │   └── show.blade.php │   ├── salaries │   │   ├── index.blade.php │   │   └── show.blade.php │   ├── tickets │   │   ├── index.blade.php │   │   └── show.blade.php │   ├── users │   │   ├── create.blade.php │   │   ├── edit.blade.php │   │   ├── index.blade.php │   │   ├── show.blade.php │   │   └── tracking.blade.php │   └── visits │   ├── index.blade.php │   ├── progress.blade.php │   └── show.blade.php ├── vendor │   └── pagination │   └── bootstrap-5-fa.blade.php └── welcome.blade.php 19 directories, 36 files ===== CONTENU DES FICHIERS ===== ----- ./output.txt ----- ----- ./js/app.js ----- import './bootstrap'; ----- ./js/bootstrap.js ----- import axios from 'axios'; window.axios = axios; window.axios.defaults.headers.common['X-Requested-With'] = 'XMLHttpRequest'; ----- ./views/pages/cities/create.blade.php ----- @extends('layout.app') @section('title', 'Ajouter un secteur') @section('page_title', 'Nouveau secteur') @section('content')
Retour {{-- Erreurs de validation --}} @if ($errors->any())
Erreurs :
    @foreach ($errors->all() as $err)
  • {{ $err }}
  • @endforeach
@endif
@csrf
@endsection ----- ./views/pages/cities/index.blade.php ----- @extends('layout.app') @section('title', 'Secteurs / Villes') @section('page_title', 'Gestion des secteurs') @section('content')
Liste des secteurs
Ajouter secteur
{{-- Filtres Région --}}
@if (session('success'))
{{ session('success') }}
@endif @foreach($cities as $city) {{-- Modal d’attachement --}} @endforeach
Nom Région Délégués assignés Actions
{{ $city->name }} {{ $city->region }} @foreach($city->users as $user) {{ $user->name }} @endforeach
@csrf @method('DELETE')
{{ $cities->appends(request()->except('page'))->links('vendor.pagination.bootstrap-5-fa') }}
@endsection ----- ./views/pages/cities/edit.blade.php ----- @extends('layout.app') @section('title', 'Modifier un secteur') @section('page_title', 'Modification du secteur : ' . $city->name) @section('content')
Retour {{-- Erreurs de validation --}} @if ($errors->any())
Erreurs :
    @foreach ($errors->all() as $err)
  • {{ $err }}
  • @endforeach
@endif
@csrf @method('PUT')
@endsection ----- ./views/pages/users/create.blade.php ----- @extends('layout.app') @section('title', 'Ajouter utilisateur') @section('page_title', 'Nouvel utilisateur') @section('content')
Retour @if ($errors->any())
Erreurs :
    @foreach ($errors->all() as $err)
  • {{ $err }}
  • @endforeach
@endif
@csrf
@endsection ----- ./views/pages/users/index.blade.php ----- @extends('layout.app') @section('title', 'Délégués') @section('page_title', 'Gestion des utilisateurs') @section('content') @if (session('success'))
{{ session('success') }}
@endif
Liste des Délégués
Ajouter un Délégués
{{-- 🔍 Filtres --}}
{{-- 🧾 Tableau --}} @foreach($users as $user) @endforeach
Code Nom Email Rôle Statut Action
{{ $user->code }} {{ $user->name }} {{ $user->email }} {{ ucfirst($user->role) }} @if($user->is_active) Actif @else Inactif @endif {{-- ✅ Voir Tracking (Carte) --}} {{-- ✅ Voir Profil --}} {{-- ✅ Modifier --}}
{{-- Pagination --}} {{ $users->appends(request()->except('page'))->links('vendor.pagination.bootstrap-5-fa') }}
@endsection ----- ./views/pages/users/show.blade.php ----- @extends('layout.app') @section('title', 'Fiche utilisateur') @section('page_title', 'Profil de ' . $user->name) @section('content')
Retour
{{-- CSS impression A4 --}} @endsection ----- ./views/pages/users/tracking.blade.php ----- @extends('layout.app') @section('title', 'Tracking') @section('page_title', 'Suivi des trajets & Visites') @section('content')

Tracking {{ $user->name }}

{{-- ✅ KPI PAR TYPE (DÉJÀ FILTRÉ DANS CONTROLLER) --}} @if($kpiByListingType->count() > 0)
Visites par type d'établissement :
@foreach($kpiByListingType as $type => $items) {{ $type }} : {{ $items->count() }} @endforeach
@endif
Début : {{ $startTime ?? '—' }} | Fin : {{ $endTime ?? '—' }} | Durée : {{ $durationFormatted ?? '—' }} | Total points : {{ count($locations) }} | Arrêts : {{ count($disconnects) }} | Total visites : {{ count($visits) }}
Aujourd'hui Hier Avant-hier Cette semaine Tout
@if(count($disconnects) > 0)

Arrêts détectés

@foreach($disconnects as $d) @endforeach
Début Fin Durée (minutes)
{{ $d['from'] }} {{ $d['to'] }} {{ $d['duration'] }}
@endif @if(count($visits) > 0)

Visites réalisées

@foreach($visits as $visit) @endforeach
Date Établissement Type Distance Statut Action
{{ $visit->date_visit }} {{ $visit->listing->name ?? '-' }} {{ $visit->listing->type ?? '-' }} @if($visit->distance_meters && $visit->distance_meters > 100) {{ $visit->distance_meters }} m @else {{ $visit->distance_meters ?? 0 }} m @endif {{ $visit->status }}
@endif @endsection ----- ./views/pages/users/edit.blade.php ----- @extends('layout.app') @section('title', 'Modifier utilisateur') @section('page_title', 'Modification de ' . $user->name) @section('content')
Retour @if ($errors->any())
Erreurs :
    @foreach ($errors->all() as $err)
  • {{ $err }}
  • @endforeach
@endif
@csrf @method('PUT')
@endsection ----- ./views/pages/listings/create.blade.php ----- @extends('layout.app') @section('title','Ajouter listing') @section('page_title','Nouveau listing') @section('content')
Retour @if ($errors->any())
    @foreach ($errors->all() as $err)
  • {{ $err }}
  • @endforeach
@endif
@csrf
@endsection ----- ./views/pages/listings/index.blade.php ----- @extends('layout.app') @section('title','Listings') @section('page_title','Gestion des Listings') @section('content')
{{-- Titre et bouton Ajouter --}}
Liste des clients / listings
Ajouter
{{-- Message de succès --}} @if (session('success'))
{{ session('success') }}
@endif {{-- Formulaire de filtres --}}
{{-- Tri --}}
{{-- Tableau Listings --}}
@include('pages.listings.partials.table', ['listings' => $listings])
@endsection ----- ./views/pages/listings/edit.blade.php ----- @extends('layout.app') @section('title','Modifier listing') @section('page_title','Éditer : ' . $listing->name) @section('content')
Retour @if ($errors->any())
    @foreach ($errors->all() as $err)
  • {{ $err }}
  • @endforeach
@endif
@csrf @method('PUT')
@endsection ----- ./views/pages/listings/partials/table.blade.php ----- @forelse($listings as $listing) @empty @endforelse
Nom Type Spécialité Ville Délégués Adresse Actions
{{ $listing->name }} {{ ucfirst($listing->type) }} {{ $listing->specialty ?? '—' }} {{ $listing->city?->name ?? '—' }} @if($listing->city && $listing->city->users->count()) @foreach($listing->city->users as $user) {{ $user->name }} @endforeach @else — @endif {{ Str::limit($listing->address, 40) }}
@csrf @method('DELETE')
Aucun listing trouvé
{{-- Pagination --}} {{ $listings->appends(request()->except('page'))->links('vendor.pagination.bootstrap-5-fa') }} ----- ./views/pages/salaries/index.blade.php ----- @extends('layout.app') @section('title','Salaires délégués') @section('page_title','Gestion des salaires par cycle') @section('content')
💼 Cycle :
@csrf @method('PUT')
@if(session('success'))
{{ session('success') }}
@endif @foreach($salaires as $s) @endforeach
Délégué Fixe (DH) Visites valides Prime ({{ $primePerVisit }} DH/visite) Total (DH) Actions
{{ $s['delegue']->name }} {{ number_format($s['fixe'],2) }} {{ $s['visites'] }} {{ number_format($s['prime'],2) }} {{ number_format($s['total'],2) }} Détails
@endsection ----- ./views/pages/salaries/show.blade.php ----- @extends('layout.app') @section('title','Salaire '.$user->name) @section('page_title','Salaire de '.$user->name) @section('content')
Retour
@csrf @method('PUT')
Cycle sélectionné : @foreach($cycles as $c) @if($c->id == $currentCycle) {{ $c->number }} @endif @endforeach
Salaire fixe :{{ number_format($fixe,2) }} DH
Visites valides :{{ $visites->count() }}
Prime par visite :{{ number_format($primePerVisit,2) }} DH
Prime totale :{{ number_format($prime,2) }} DH
Total :{{ number_format($total,2) }} DH

Détails des visites
@foreach($visites as $v) @endforeach
DateClientType
{{ optional($v->date_visit)->format('d/m/Y H:i') }} {{ $v->listing?->name ?? '-' }} {{ ucfirst($v->visite_type) }}
@endsection ----- ./views/pages/tickets/index.blade.php ----- @extends('layout.app') @section('title','Visites avec ticket') @section('page_title','Liste des visites avec ticket') @section('content')
@foreach($visits as $v) @endforeach
ID Délégué Client Type Date visite Coordonnées Actions
{{ $v->id }} {{ $v->user->name ?? '-' }} {{ $v->listing->name ?? '-' }} {{ $v->visite_type }} {{ optional($v->date_visit)->format('d/m/Y H:i') }} {{ $v->poslat ?? '-' }}, {{ $v->poslong ?? '-' }} Voir / Corriger
{{ $visits->links() }}
@endsection ----- ./views/pages/tickets/show.blade.php ----- @extends('layout.app') @section('title','Visite #'.$visit->id) @section('page_title','Visite avec ticket') @section('content')
Délégué : {{ $visit->user->name }}
Client : {{ $visit->listing->name }}

Type : {{ $visit->visite_type }}

Statut : {{ $visit->status }}

Coordonnées : {{ $visit->poslat }}, {{ $visit->poslong }}

@csrf @method('PUT')
@endsection ----- ./views/pages/dashboard/admin-dashboard.blade.php ----- @extends('layout.app') @section('title', 'Dashboard') @section('page_title', 'Tableau de bord GloPharma') @section('content') @php $chartVisits = $visitsPerMonth ?? []; $chartStatuses = $visitesByStatus ?? []; @endphp
{{-- Résumé --}}
Utilisateurs
{{ $totalUsers }}
{{ $activeUsers }} actifs
{{ $activeUsersRate }}% des comptes actifs
Visites
{{ $totalVisits }}
{{ $validVisits }} valides
Taux de validation : {{ $validVisitsRate }}%
Déplacements
{{ $totalDeplacements }}
{{ $deplacementsEnCours }} en cours
Suivi logistique terrain
Permissions
{{ $totalPermissions }}
{{ $permissionsPending }} en attente
Nécessitent une action admin
{{-- Graphiques --}}

Évolution des visites

Progression des 12 derniers mois

Répartition des statuts

Distribution des visites

{{-- Bas dashboard --}}

Top délégués

Selon les visites validées

@forelse($topDelegues as $index => $del)
#{{ $index + 1 }}
{{ $del->name }}
Performance terrain
{{ $del->total }}
@empty

Aucune donnée disponible.

@endforelse

Notifications admin

Points nécessitant votre attention

@if($permissionsPending > 0)
{{ $permissionsPending }} permission(s) en attente
Merci de traiter les demandes en cours.
@else
Aucune alerte critique
Tout est à jour pour le moment.
@endif

Activités récentes

Dernières visites enregistrées

@forelse($recentVisits as $visit)
{{ $visit->user->name ?? 'Utilisateur' }}
Visite {{ $visit->status }} • {{ $visit->date_visit ? \Carbon\Carbon::parse($visit->date_visit)->translatedFormat('d M Y H:i') : '-' }}
@empty

Aucune activité récente.

@endforelse
@endsection @push('styles') @endpush @push('scripts') @endpush ----- ./views/pages/visits/index.blade.php ----- @extends('layout.app') @section('title','Visites') @section('page_title','Liste des visites') @section('content')
Suivi des visites
``` Télécharger XLS filtré ```
{{-- FILTRES --}}
```
```
@if(session('success'))
{{ session('success') }}
@endif
@forelse($visits as $v) ``` {{-- 🔥 LOCALISATION MODERNE --}} ``` @empty @endforelse
# Délégué Secteur Client Accompagnant Type Date Durée Statut Localisation Actions
{{ $v->id }} {{ optional($v->user)->name ?? '-' }}
{{ optional(optional($v->listing)->city)->name ?? '-' }}
{{ optional(optional($v->listing)->city)->region ?? '' }}
{{ $v->listing?->name ?? '-' }}
{{ optional($v->listing)->type ?? '-' }} / {{ optional($v->listing)->specialty ?? '' }}
{{ optional($v->userAccompagnant)->name ?? '-' }} {{ $v->visite_type }} {{ $v->date_visit ? \Carbon\Carbon::parse($v->date_visit)->format('d/m/Y H:i') : '-' }} @php $seconds = $v->elapsed_time ?? 0; $h = floor($seconds / 3600); $m = floor(($seconds % 3600) / 60); $s = $seconds % 60; @endphp {{ sprintf('%02d:%02d:%02d', $h, $m, $s) }} @switch($v->status) @case('valide') Valide @break @case('invalide') Invalide @break @case('double') Double @break @default Non réalisée @endswitch @if($v->has_ticket) Hors zone @else Conforme @endif {{-- bouton map --}} @if($v->lat && $v->lng) @endif
Aucune visite trouvée
{{ $visits->appends(request()->except('page'))->links('vendor.pagination.bootstrap-5-fa') }}
{{-- TOOLTIP --}} @endsection ----- ./views/pages/visits/show.blade.php ----- @extends('layout.app') @section('title','Rapport de visite') @section('page_title','Rapport de visite #'.$visit->id) @section('content') @php $proposedMeds = $visit->proposed_meds ?? []; $requestedMeds = $visit->requested_meds ?? []; $results = collect($visit->results ?? []); @endphp @endsection ----- ./views/pages/visits/progress.blade.php ----- @extends('layout.app') @section('title','Visites en cours') @section('page_title','Suivi des visites en cours') @section('content')
{{-- HEADER --}}
Suivi en temps réel
{{-- FILTRES --}}
{{-- SEARCH --}}
{{-- USER --}}
{{-- CITY --}}
{{-- STATUS --}} {{-- DATE FROM --}}
{{-- DATE TO --}}
{{-- BTN --}}
{{-- MESSAGE --}} @if(session('success'))
{{ session('success') }}
@endif {{-- TABLE --}}
@forelse($visits as $v) {{-- ID --}} {{-- USER --}} {{-- CITY --}} {{-- CLIENT --}} {{-- START --}} {{-- END --}} {{-- DURATION --}} {{-- STATUS --}} {{-- ACTION --}} @empty @endforelse
# Délégué Secteur Client Début Fin Durée Statut Actions
{{ $v->id }}{{ $v->user?->name ?? '-' }}
{{ $v->listing?->city?->name ?? '-' }}
{{ $v->listing?->city?->region ?? '' }}
{{ $v->listing?->name ?? '-' }}
{{ optional($v->listing)->type ?? '-' }} / {{ optional($v->listing)->specialty ?? '' }}
{{ $v->start_time?->format('d/m/Y H:i') ?? '-' }} {{ $v->end_time?->format('d/m/Y H:i') ?? '-' }} {{ $v->duration ?? '-' }} @switch($v->status) @case('in_progress') En cours @break @case('finished') Terminée (sans rapport) @break @case('cancelled') Annulée @break @default - @endswitch
Aucune visite en cours trouvée
{{-- PAGINATION --}}
{{ $visits->appends(request()->except('page'))->links('vendor.pagination.bootstrap-5-fa') }}
@endsection ----- ./views/pages/dashboard.blade.php ----- @extends('layout.app') @section('title', 'Dashboard - Administration') @section('page_title', 'Tableau de bord') @section('content')
Utilisateurs

48

Budgets

250K MAD

Produits

112

Pharmacies

76

Activités récentes
Date Utilisateur Action Résultat
20 Juin 2025 Salah Salah Ajout visite Succès
19 Juin 2025 Admin Modification Listing Avertissement
@endsection ----- ./views/pages/permissions/index.blade.php ----- @extends('layout.app') @section('title','Permissions') @section('page_title','Demandes de Permissions') @section('content')
Suivi des permissions
@if(session('success'))
{{ session('success') }}
@endif
@if($permissions->count() == 0)

Aucune demande trouvée.

@else
@foreach($permissions as $perm)
{{ $perm->user->name }}

{{ $perm->start_date->format('d/m/Y') }} @if($perm->end_date) → {{ $perm->end_date->format('d/m/Y') }} @endif

Motif: {{ ucfirst($perm->reason) }}

@if($perm->notes)

{{ Str::limit($perm->notes,80) }}

@endif
@if($perm->status=="en_cours") En cours @elseif($perm->status=="accepté") Accepté @else Refusé @endif

Détails
@if($perm->status!='accepté')
@csrf @method('PUT')
@endif @if($perm->status!='refus')
@csrf @method('PUT')
@endif
@endforeach
@endif
{{ $permissions->links() }}
@endsection ----- ./views/pages/permissions/show.blade.php ----- @extends('layout.app') @section('title','Détail permission') @section('page_title','Demande de permission #'.$permission->id) @section('content')
Retour
@endsection ----- ./views/pages/deplacements/create.blade.php ----- @extends('layout.app') @section('title','Nouveau déplacement') @section('page_title','Ajouter un déplacement') @section('content')
Retour @if($errors->any())
    @foreach($errors->all() as $err)
  • {{ $err }}
  • @endforeach
@endif
@csrf
@endsection ----- ./views/pages/deplacements/index.blade.php ----- @extends('layout.app') @section('title','Déplacements') @section('page_title','Liste des Déplacements') @section('content')
Tous les Déplacements
Ajouter
@if(session('success'))
{{ session('success') }}
@endif
@foreach($deplacements as $d) @endforeach
ID Délégué De À Date Distance (Km) Statut Actions
{{ $d->id }} {{ $d->user?->name }} {{ $d->from_city }} {{ $d->to_city }} {{ $d->date_depart->format('d/m/Y H:i') }} {{ $d->distance_km ?? '-' }} @if($d->status === 'realise') Réalisé @elseif($d->status === 'en_cours') En cours @else Non réalisé @endif
@csrf @method('DELETE')
{{ $deplacements->links() }}
@endsection ----- ./views/pages/deplacements/show.blade.php ----- @extends('layout.app') @section('title','Rapport déplacement') @section('page_title',"Détails du déplacement #$deplacement->id") @section('content')
Retour
@endsection ----- ./views/auth/login.blade.php ----- Connexion | GloPharma

Bienvenue sur GloPharma

Connectez-vous pour accéder à votre espace

@if($errors->any())
{{ $errors->first() }}
@endif
@csrf
----- ./views/layout/sidebar.blade.php ----- ----- ./views/layout/app.blade.php ----- @yield('title', 'Administration GloPharma') @stack('styles') @include('layout.sidebar') @include('layout.header')
@yield('content')
@stack('scripts') ----- ./views/layout/header.blade.php -----
GloPharma Logo
@yield('page_title', 'Tableau de bord')
----- ./views/welcome.blade.php ----- {{ config('app.name', 'Laravel') }} @if (file_exists(public_path('build/manifest.json')) || file_exists(public_path('hot'))) @vite(['resources/css/app.css', 'resources/js/app.js']) @else @endif
@if (Route::has('login')) @endif

Let's get started

Laravel has an incredibly rich ecosystem.
We suggest starting with the following.

{{-- Laravel Logo --}} {{-- Light Mode 12 SVG --}} {{-- Dark Mode 12 SVG --}}
@if (Route::has('login')) @endif ----- ./views/vendor/pagination/bootstrap-5-fa.blade.php ----- @if ($paginator->hasPages()) @endif ----- ./css/app.css ----- @import 'tailwindcss'; @source '../../vendor/laravel/framework/src/Illuminate/Pagination/resources/views/*.blade.php'; @source '../../storage/framework/views/*.php'; @source '../**/*.blade.php'; @source '../**/*.js'; @theme { --font-sans: 'Instrument Sans', ui-sans-serif, system-ui, sans-serif, 'Apple Color Emoji', 'Segoe UI Emoji', 'Segoe UI Symbol', 'Noto Color Emoji'; }