feat: Version 3.6.2 - Correctifs tâches #17-20

- #17: Amélioration gestion des secteurs et statistiques
- #18: Optimisation services API et logs
- #19: Corrections Flutter widgets et repositories
- #20: Fix création passage - détection automatique ope_users.id vs users.id

Suppression dossier web/ (migration vers app Flutter)

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
This commit is contained in:
2026-01-16 14:11:15 +01:00
parent 7b78037175
commit 232940b1eb
196 changed files with 8483 additions and 7966 deletions

View File

@@ -12,17 +12,15 @@ use App\Services\DepartmentBoundaryService;
require_once __DIR__ . '/../Services/EventLogService.php';
require_once __DIR__ . '/../Services/ApiService.php';
class SectorController
class SectorController
{
private \PDO $db;
private LogService $logService;
private AddressService $addressService;
private DepartmentBoundaryService $boundaryService;
public function __construct()
{
$this->db = Database::getInstance();
$this->logService = new LogService();
$this->addressService = new AddressService();
$this->boundaryService = new DepartmentBoundaryService();
}
@@ -72,7 +70,7 @@ class SectorController
Response::json(['status' => 'success', 'data' => $sectors]);
} catch (\Exception $e) {
$this->logService->error('Erreur lors de la récupération des secteurs', [
LogService::error('Erreur lors de la récupération des secteurs', [
'error' => $e->getMessage(),
'trace' => $e->getTraceAsString()
]);
@@ -152,14 +150,14 @@ class SectorController
$departmentsTouched = $this->boundaryService->getDepartmentsForSector($coordinates);
if (empty($departmentsTouched)) {
$this->logService->warning('Aucun département trouvé pour le secteur', [
LogService::warning('Aucun département trouvé pour le secteur', [
'libelle' => $data['libelle'],
'entity_id' => $entityId,
'entity_dept' => $departement
]);
}
} catch (\Exception $e) {
$this->logService->warning('Impossible de vérifier les limites départementales', [
LogService::warning('Impossible de vérifier les limites départementales', [
'error' => $e->getMessage(),
'libelle' => $data['libelle']
]);
@@ -169,7 +167,7 @@ class SectorController
try {
$addressCount = $this->addressService->countAddressesInPolygon($coordinates, $entityId);
} catch (\Exception $e) {
$this->logService->warning('Impossible de récupérer les adresses du secteur', [
LogService::warning('Impossible de récupérer les adresses du secteur', [
'error' => $e->getMessage(),
'libelle' => $data['libelle'],
'entity_id' => $entityId
@@ -208,7 +206,7 @@ class SectorController
$opeUserId = $stmtOpeUser->fetchColumn();
if (!$opeUserId) {
$this->logService->warning('ope_users.id non trouvé pour cette opération', [
LogService::warning('ope_users.id non trouvé pour cette opération', [
'ope_users_id' => $memberId,
'operation_id' => $operationId
]);
@@ -275,7 +273,7 @@ class SectorController
}
} catch (\Exception $e) {
$this->logService->warning('Erreur lors de la récupération des passages orphelins', [
LogService::warning('Erreur lors de la récupération des passages orphelins', [
'sector_id' => $sectorId,
'error' => $e->getMessage()
]);
@@ -335,7 +333,7 @@ class SectorController
$firstOpeUserId = $stmtFirstOpeUser->fetchColumn();
if (!$firstOpeUserId) {
$this->logService->warning('Premier ope_users.id non trouvé pour cette opération', [
LogService::warning('Premier ope_users.id non trouvé pour cette opération', [
'ope_users_id' => $users[0],
'operation_id' => $operationId
]);
@@ -401,7 +399,7 @@ class SectorController
// Log pour vérifier l'uniformisation GPS (surtout pour immeubles)
if ($fkHabitat == 2 && $nbLog > 1) {
$this->logService->info('[SectorController] Création passages immeuble avec GPS uniformisés', [
LogService::info('[SectorController] Création passages immeuble avec GPS uniformisés', [
'address_id' => $address['id'],
'nb_passages' => $nbLog,
'gps_lat' => $gpsLat,
@@ -410,7 +408,7 @@ class SectorController
]);
}
} catch (\Exception $e) {
$this->logService->warning('Erreur lors de la création d\'un passage', [
LogService::warning('Erreur lors de la création d\'un passage', [
'address_id' => $address['id'],
'error' => $e->getMessage()
]);
@@ -421,7 +419,7 @@ class SectorController
}
} catch (\Exception $e) {
// En cas d'erreur avec les adresses, on ne bloque pas la création du secteur
$this->logService->error('Erreur lors du stockage des adresses du secteur', [
LogService::error('Erreur lors du stockage des adresses du secteur', [
'sector_id' => $sectorId,
'error' => $e->getMessage(),
'entity_id' => $entityId
@@ -525,7 +523,7 @@ class SectorController
$responseData['users_sectors'][] = $userData;
}
$this->logService->info('Secteur créé', [
LogService::info('Secteur créé', [
'sector_id' => $sectorId,
'libelle' => $sectorData['libelle'],
'entity_id' => $entityId,
@@ -567,7 +565,7 @@ class SectorController
if ($this->db->inTransaction()) {
$this->db->rollBack();
}
$this->logService->error('Erreur lors de la création du secteur', [
LogService::error('Erreur lors de la création du secteur', [
'error' => $e->getMessage(),
'data' => $data ?? null
]);
@@ -634,7 +632,7 @@ class SectorController
// Gestion des membres (reçus comme 'users' depuis Flutter)
if (isset($data['users'])) {
$this->logService->info('[UPDATE USERS] Début modification des membres', [
LogService::info('[UPDATE USERS] Début modification des membres', [
'sector_id' => $id,
'users_demandes' => $data['users'],
'nb_users' => count($data['users'])
@@ -642,27 +640,27 @@ class SectorController
// Récupérer l'opération du secteur pour l'INSERT
$opQuery = "SELECT fk_operation FROM ope_sectors WHERE id = :sector_id";
$this->logService->info('[UPDATE USERS] SQL - Récupération fk_operation', [
LogService::info('[UPDATE USERS] SQL - Récupération fk_operation', [
'query' => $opQuery,
'params' => ['sector_id' => $id]
]);
$opStmt = $this->db->prepare($opQuery);
$opStmt->execute(['sector_id' => $id]);
$operationId = $opStmt->fetch()['fk_operation'];
$this->logService->info('[UPDATE USERS] fk_operation récupéré', [
LogService::info('[UPDATE USERS] fk_operation récupéré', [
'operation_id' => $operationId
]);
// Supprimer les affectations existantes
$deleteQuery = "DELETE FROM ope_users_sectors WHERE fk_sector = :sector_id";
$this->logService->info('[UPDATE USERS] SQL - Suppression des anciens membres', [
LogService::info('[UPDATE USERS] SQL - Suppression des anciens membres', [
'query' => $deleteQuery,
'params' => ['sector_id' => $id]
]);
$deleteStmt = $this->db->prepare($deleteQuery);
$deleteStmt->execute(['sector_id' => $id]);
$deletedCount = $deleteStmt->rowCount();
$this->logService->info('[UPDATE USERS] Membres supprimés', [
LogService::info('[UPDATE USERS] Membres supprimés', [
'nb_deleted' => $deletedCount
]);
@@ -670,7 +668,7 @@ class SectorController
if (!empty($data['users'])) {
$insertQuery = "INSERT INTO ope_users_sectors (fk_operation, fk_user, fk_sector, created_at, updated_at, fk_user_creat, chk_active)
VALUES (:operation_id, :user_id, :sector_id, NOW(), NOW(), :user_creat, 1)";
$this->logService->info('[UPDATE USERS] SQL - Requête INSERT préparée', [
LogService::info('[UPDATE USERS] SQL - Requête INSERT préparée', [
'query' => $insertQuery
]);
$insertStmt = $this->db->prepare($insertQuery);
@@ -689,7 +687,7 @@ class SectorController
$opeUserId = $stmtOpeUser->fetchColumn();
if (!$opeUserId) {
$this->logService->warning('[UPDATE USERS] ope_users.id non trouvé pour cette opération', [
LogService::warning('[UPDATE USERS] ope_users.id non trouvé pour cette opération', [
'ope_users_id' => $memberId,
'operation_id' => $operationId
]);
@@ -703,17 +701,17 @@ class SectorController
'sector_id' => $id,
'user_creat' => $_SESSION['user_id'] ?? null
];
$this->logService->info('[UPDATE USERS] SQL - INSERT user', [
LogService::info('[UPDATE USERS] SQL - INSERT user', [
'params' => $params
]);
$insertStmt->execute($params);
$insertedUsers[] = $memberId;
$this->logService->info('[UPDATE USERS] User inséré avec succès', [
LogService::info('[UPDATE USERS] User inséré avec succès', [
'user_id' => $memberId
]);
} catch (\PDOException $e) {
$failedUsers[] = $memberId;
$this->logService->warning('[UPDATE USERS] ERREUR insertion user', [
LogService::warning('[UPDATE USERS] ERREUR insertion user', [
'sector_id' => $id,
'user_id' => $memberId,
'error' => $e->getMessage(),
@@ -722,7 +720,7 @@ class SectorController
}
}
$this->logService->info('[UPDATE USERS] Résultat des insertions', [
LogService::info('[UPDATE USERS] Résultat des insertions', [
'users_demandes' => $data['users'],
'users_inseres' => $insertedUsers,
'users_echoues' => $failedUsers,
@@ -744,7 +742,7 @@ class SectorController
$chkAdressesChange = $data['chk_adresses_change'] ?? 1;
if (isset($data['sector']) && $chkAdressesChange == 0) {
$this->logService->info('[UPDATE] Modification secteur sans recalcul adresses/passages', [
LogService::info('[UPDATE] Modification secteur sans recalcul adresses/passages', [
'sector_id' => $id,
'chk_adresses_change' => $chkAdressesChange
]);
@@ -770,7 +768,7 @@ class SectorController
}
// Récupérer et stocker les nouvelles adresses
$this->logService->info('[UPDATE] Récupération des adresses', [
LogService::info('[UPDATE] Récupération des adresses', [
'sector_id' => $id,
'entity_id' => $entityId,
'nb_points' => count($coordinates)
@@ -781,7 +779,7 @@ class SectorController
// Enrichir les adresses avec les données bâtiments
$addresses = $this->addressService->enrichAddressesWithBuildings($addresses, $entityId);
$this->logService->info('[UPDATE] Adresses récupérées', [
LogService::info('[UPDATE] Adresses récupérées', [
'sector_id' => $id,
'nb_addresses' => count($addresses)
]);
@@ -815,12 +813,12 @@ class SectorController
]);
}
$this->logService->info('[UPDATE] Adresses stockées dans sectors_adresses', [
LogService::info('[UPDATE] Adresses stockées dans sectors_adresses', [
'sector_id' => $id,
'nb_stored' => count($addresses)
]);
} else {
$this->logService->warning('[UPDATE] Aucune adresse trouvée pour le secteur', [
LogService::warning('[UPDATE] Aucune adresse trouvée pour le secteur', [
'sector_id' => $id,
'entity_id' => $entityId
]);
@@ -828,19 +826,19 @@ class SectorController
// Vérifier si c'est un problème de connexion à la base d'adresses
if (!$this->addressService->isConnected()) {
$this->logService->warning('[UPDATE] Base d\'adresses non accessible - passages créés sans adresses', [
LogService::warning('[UPDATE] Base d\'adresses non accessible - passages créés sans adresses', [
'sector_id' => $id
]);
}
} catch (\Exception $e) {
$this->logService->error('[UPDATE] Erreur lors de la mise à jour des adresses du secteur', [
LogService::error('[UPDATE] Erreur lors de la mise à jour des adresses du secteur', [
'sector_id' => $id,
'error' => $e->getMessage()
]);
}
// Maintenant que les adresses sont mises à jour, traiter les passages
$this->logService->info('[UPDATE] Début mise à jour des passages', ['sector_id' => $id]);
LogService::info('[UPDATE] Début mise à jour des passages', ['sector_id' => $id]);
$passageCounters = $this->updatePassagesForSector($id, $data['sector']);
}
@@ -934,7 +932,7 @@ class SectorController
WHERE ous.fk_sector = :sector_id
ORDER BY u.id";
$this->logService->info('[UPDATE USERS] SQL - Récupération finale des users', [
LogService::info('[UPDATE USERS] SQL - Récupération finale des users', [
'query' => $usersQuery,
'params' => ['sector_id' => $id]
]);
@@ -944,7 +942,7 @@ class SectorController
$usersSectors = $usersStmt->fetchAll(\PDO::FETCH_ASSOC);
$userIds = array_column($usersSectors, 'id');
$this->logService->info('[UPDATE USERS] Users récupérés après commit', [
LogService::info('[UPDATE USERS] Users récupérés après commit', [
'sector_id' => $id,
'users_ids' => $userIds,
'nb_users' => count($userIds),
@@ -971,7 +969,7 @@ class SectorController
$usersDecrypted[] = $userData;
}
$this->logService->info('Secteur modifié', [
LogService::info('Secteur modifié', [
'sector_id' => $id,
'updates' => array_keys($data),
'passage_counters' => $passageCounters,
@@ -999,7 +997,7 @@ class SectorController
if ($this->db->inTransaction()) {
$this->db->rollBack();
}
$this->logService->error('Erreur lors de la modification du secteur', [
LogService::error('Erreur lors de la modification du secteur', [
'sector_id' => $id,
'error' => $e->getMessage()
]);
@@ -1065,7 +1063,7 @@ class SectorController
]);
} catch (\Exception $e) {
$this->logService->error('Erreur lors de la récupération des adresses du secteur', [
LogService::error('Erreur lors de la récupération des adresses du secteur', [
'sector_id' => $id,
'error' => $e->getMessage()
]);
@@ -1198,7 +1196,7 @@ class SectorController
$passagesDecrypted[] = $passage;
}
$this->logService->info('Secteur supprimé', [
LogService::info('Secteur supprimé', [
'sector_id' => $id,
'libelle' => $sector['libelle'],
'passages_deleted' => $passagesToDelete,
@@ -1216,7 +1214,7 @@ class SectorController
} catch (\Exception $e) {
$this->db->rollBack();
$this->logService->error('Erreur lors de la suppression du secteur', [
LogService::error('Erreur lors de la suppression du secteur', [
'sector_id' => $id,
'error' => $e->getMessage()
]);
@@ -1238,7 +1236,7 @@ class SectorController
]);
} catch (\Exception $e) {
$this->logService->error('Erreur lors de la vérification des contours départementaux', [
LogService::error('Erreur lors de la vérification des contours départementaux', [
'error' => $e->getMessage()
]);
Response::json(['status' => 'error', 'message' => 'Erreur lors de la vérification'], 500);
@@ -1298,7 +1296,7 @@ class SectorController
]);
} catch (\Exception $e) {
$this->logService->error('Erreur lors de la vérification des limites', [
LogService::error('Erreur lors de la vérification des limites', [
'error' => $e->getMessage()
]);
Response::json(['status' => 'error', 'message' => 'Erreur lors de la vérification'], 500);
@@ -1422,7 +1420,7 @@ class SectorController
$addressesStmt->execute(['sector_id' => $sectorId]);
$addresses = $addressesStmt->fetchAll();
$this->logService->info('[updatePassagesForSector] Adresses dans sectors_adresses', [
LogService::info('[updatePassagesForSector] Adresses dans sectors_adresses', [
'sector_id' => $sectorId,
'nb_addresses' => count($addresses)
]);
@@ -1435,7 +1433,7 @@ class SectorController
$firstUserId = $firstUser ? $firstUser['fk_user'] : null;
if ($firstUserId && !empty($addresses)) {
$this->logService->info('[updatePassagesForSector] Traitement des passages', [
LogService::info('[updatePassagesForSector] Traitement des passages', [
'user_id' => $firstUserId,
'nb_addresses' => count($addresses)
]);
@@ -1594,7 +1592,7 @@ class SectorController
$insertStmt->execute($insertParams);
$counters['passages_created'] = count($toInsert);
} catch (\Exception $e) {
$this->logService->error('Erreur lors de l\'insertion multiple des passages', [
LogService::error('Erreur lors de l\'insertion multiple des passages', [
'sector_id' => $sectorId,
'error' => $e->getMessage()
]);
@@ -1658,12 +1656,12 @@ class SectorController
$counters['passages_updated'] = count($toUpdate);
// Log pour vérifier l'uniformisation GPS (surtout pour immeubles)
$this->logService->info('[updatePassagesForSector] Passages mis à jour avec GPS uniformisés', [
LogService::info('[updatePassagesForSector] Passages mis à jour avec GPS uniformisés', [
'nb_updated' => count($toUpdate),
'sector_id' => $sectorId
]);
} catch (\Exception $e) {
$this->logService->error('Erreur lors de la mise à jour multiple des passages', [
LogService::error('Erreur lors de la mise à jour multiple des passages', [
'sector_id' => $sectorId,
'error' => $e->getMessage()
]);
@@ -1680,7 +1678,7 @@ class SectorController
$deleteStmt->execute($toDelete);
$counters['passages_deleted'] += count($toDelete);
} catch (\Exception $e) {
$this->logService->error('Erreur lors de la suppression multiple des passages', [
LogService::error('Erreur lors de la suppression multiple des passages', [
'sector_id' => $sectorId,
'error' => $e->getMessage()
]);
@@ -1688,7 +1686,7 @@ class SectorController
}
} else {
$this->logService->warning('[updatePassagesForSector] Pas de création de passages', [
LogService::warning('[updatePassagesForSector] Pas de création de passages', [
'reason' => !$firstUserId ? 'Pas d\'utilisateur affecté' : 'Pas d\'adresses',
'first_user_id' => $firstUserId,
'nb_addresses' => count($addresses)
@@ -1697,14 +1695,14 @@ class SectorController
// Retourner les compteurs détaillés
$this->logService->info('[updatePassagesForSector] Fin traitement', [
LogService::info('[updatePassagesForSector] Fin traitement', [
'sector_id' => $sectorId,
'counters' => $counters
]);
return $counters;
} catch (\Exception $e) {
$this->logService->error('Erreur lors de la mise à jour des passages', [
LogService::error('Erreur lors de la mise à jour des passages', [
'sector_id' => $sectorId,
'error' => $e->getMessage()
]);