Import CSV des relevés d'une source

- ImportController : create() (formulaire) + store() (traitement)
- Détection automatique du séparateur ; ou ,
- Suppression du BOM UTF-8
- Correspondance colonnes ↔ champs par libellé
- Parsing des types : date (avec calendrier), booléen, nombre, lieu (recherche par nom_long), texte
- Vue sources/import.blade.php : formulaire + liste des colonnes attendues
- Routes sources.import.create / sources.import.store
- Bouton "↑ Importer CSV" dans la fiche source (soumis aux droits create releve)

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
This commit is contained in:
2026-06-05 20:05:03 +02:00
parent f5a7407be0
commit cdbf6d458c
4 changed files with 222 additions and 0 deletions
+3
View File
@@ -3,6 +3,7 @@
use App\Http\Controllers\CarteController;
use App\Http\Controllers\DashboardController;
use App\Http\Controllers\ExportController;
use App\Http\Controllers\ImportController;
use App\Http\Controllers\LieuController;
use App\Http\Controllers\NotificationController;
use App\Http\Controllers\ProfileController;
@@ -61,6 +62,8 @@ Route::middleware('auth')->group(function () {
Route::get('carte', [CarteController::class, 'index'])->name('carte');
Route::get('carte/data', [CarteController::class, 'data'])->name('carte.data');
Route::get('export/source/{source}/csv', [ExportController::class, 'sourceCsv'])->name('export.source.csv');
Route::get('sources/{source}/import', [ImportController::class, 'create'])->name('sources.import.create');
Route::post('sources/{source}/import', [ImportController::class, 'store'])->name('sources.import.store');
Route::get('notifications', [NotificationController::class, 'index'])->name('notifications.index');
Route::post('notifications/{id}/read', [NotificationController::class, 'markAsRead'])->name('notifications.read');