Mise en place suppression membre

This commit is contained in:
d6soft
2025-06-12 16:39:44 +02:00
parent 4244b961fd
commit b9672a6228
27 changed files with 125586 additions and 123640 deletions

22
api/.vscode/settings.json vendored Normal file
View File

@@ -0,0 +1,22 @@
{
"workbench.colorCustomizations": {
"activityBar.activeBackground": "#fa1b49",
"activityBar.background": "#fa1b49",
"activityBar.foreground": "#e7e7e7",
"activityBar.inactiveForeground": "#e7e7e799",
"activityBarBadge.background": "#155e02",
"activityBarBadge.foreground": "#e7e7e7",
"commandCenter.border": "#e7e7e799",
"sash.hoverBorder": "#fa1b49",
"statusBar.background": "#dd0531",
"statusBar.foreground": "#e7e7e7",
"statusBarItem.hoverBackground": "#fa1b49",
"statusBarItem.remoteBackground": "#dd0531",
"statusBarItem.remoteForeground": "#e7e7e7",
"titleBar.activeBackground": "#dd0531",
"titleBar.activeForeground": "#e7e7e7",
"titleBar.inactiveBackground": "#dd053199",
"titleBar.inactiveForeground": "#e7e7e799"
},
"peacock.color": "#dd0531"
}

View File

@@ -127,12 +127,10 @@ class UserController {
u.encrypted_mobile,
u.fk_role as role,
u.fk_entite,
u.infos,
u.chk_alert_email,
u.chk_suivi,
u.date_naissance,
u.date_embauche,
u.matricule,
u.chk_active,
u.created_at,
u.updated_at,
@@ -226,11 +224,11 @@ class UserController {
$email = trim(strtolower($data['email']));
$name = trim($data['name']);
$firstName = isset($data['first_name']) ? trim($data['first_name']) : '';
$role = isset($data['role']) ? trim($data['role']) : '1';
$role = isset($data['role']) ? (int)$data['role'] : 1;
$entiteId = isset($data['fk_entite']) ? (int)$data['fk_entite'] : 1;
// Vérification des longueurs d'entrée
if (strlen($email) > 255 || strlen($name) > 255) {
if (strlen($email) > 75 || strlen($name) > 50) {
Response::json([
'status' => 'error',
'message' => 'Email ou nom trop long'
@@ -270,26 +268,24 @@ class UserController {
$phone = isset($data['phone']) ? ApiService::encryptData(trim($data['phone'])) : null;
$mobile = isset($data['mobile']) ? ApiService::encryptData(trim($data['mobile'])) : null;
$sectName = isset($data['sect_name']) ? trim($data['sect_name']) : '';
$infos = isset($data['infos']) ? trim($data['infos']) : '';
$alertEmail = isset($data['chk_alert_email']) ? (int)$data['chk_alert_email'] : 1;
$suivi = isset($data['chk_suivi']) ? (int)$data['chk_suivi'] : 0;
$dateNaissance = isset($data['date_naissance']) ? $data['date_naissance'] : null;
$dateEmbauche = isset($data['date_embauche']) ? $data['date_embauche'] : null;
$matricule = isset($data['matricule']) ? trim($data['matricule']) : '';
// Insertion en base de données
$stmt = $this->db->prepare('
INSERT INTO users (
encrypted_email, user_pswd, encrypted_name, first_name,
encrypted_email, user_pass_hash, encrypted_name, first_name,
sect_name, encrypted_phone, encrypted_mobile, fk_role,
fk_entite, infos, chk_alert_email, chk_suivi,
date_naissance, date_embauche, matricule,
fk_entite, chk_alert_email, chk_suivi,
date_naissance, date_embauche,
created_at, fk_user_creat, chk_active
) VALUES (
?, ?, ?, ?,
?, ?, ?, ?,
?, ?, ?, ?,
?, ?, ?,
?, ?,
NOW(), ?, 1
)
');
@@ -303,12 +299,10 @@ class UserController {
$mobile,
$role,
$entiteId,
$infos,
$alertEmail,
$suivi,
$dateNaissance,
$dateEmbauche,
$matricule,
$currentUserId
]);
$userId = $this->db->lastInsertId();
@@ -418,12 +412,10 @@ class UserController {
'sect_name',
'fk_role',
'fk_entite',
'infos',
'chk_alert_email',
'chk_suivi',
'date_naissance',
'date_embauche',
'matricule',
'chk_active'
];
@@ -443,7 +435,7 @@ class UserController {
], 400);
return;
}
$updateFields[] = "user_pswd = :password";
$updateFields[] = "user_pass_hash = :password";
$params['password'] = password_hash($data['password'], PASSWORD_DEFAULT);
}
@@ -498,24 +490,23 @@ class UserController {
public function deleteUser(string $id): void {
Session::requireAuth();
// Vérification des droits d'accès (rôle administrateur)
$currentUserId = Session::getUserId();
// Récupérer le rôle de l'utilisateur depuis la base de données
$stmt = $this->db->prepare('SELECT fk_role FROM users WHERE id = ?');
// Récupérer les infos de l'utilisateur courant
$stmt = $this->db->prepare('SELECT fk_role, fk_entite FROM users WHERE id = ?');
$stmt->execute([$currentUserId]);
$result = $stmt->fetch(PDO::FETCH_ASSOC);
$userRole = $result ? $result['fk_role'] : null;
$currentUser = $stmt->fetch(PDO::FETCH_ASSOC);
if ($userRole != '1' && $userRole != '2') {
if (!$currentUser) {
Response::json([
'status' => 'error',
'message' => 'Accès non autorisé'
'message' => 'Utilisateur courant non trouvé'
], 403);
return;
}
$currentUserId = Session::getUserId();
$userRole = (int)$currentUser['fk_role'];
$userEntite = $currentUser['fk_entite'];
// Empêcher la suppression de son propre compte
if ($currentUserId == $id) {
@@ -526,37 +517,104 @@ class UserController {
return;
}
// Récupérer l'utilisateur cible
$stmt2 = $this->db->prepare('SELECT fk_entite FROM users WHERE id = ?');
$stmt2->execute([$id]);
$userToDelete = $stmt2->fetch(PDO::FETCH_ASSOC);
if (!$userToDelete) {
Response::json([
'status' => 'error',
'message' => 'Utilisateur cible non trouvé'
], 404);
return;
}
// Contrôle des droits
if ($userRole === 1) {
Response::json([
'status' => 'error',
'message' => "Vous n'avez pas le droit de supprimer un utilisateur"
], 403);
return;
} elseif ($userRole === 2) {
if ($userEntite != $userToDelete['fk_entite']) {
Response::json([
'status' => 'error',
'message' => "Vous n'avez pas le droit de supprimer un utilisateur d'une autre amicale"
], 403);
return;
}
}
// fk_role > 2 : tout est permis (hors auto-suppression)
// ——— Gestion du transfert éventuel ———
$transferTo = isset($_GET['transfer_to']) ? trim($_GET['transfer_to']) : null;
$operationId = isset($_GET['operation_id']) ? trim($_GET['operation_id']) : null;
if (($transferTo && !$operationId) || (!$transferTo && $operationId)) {
Response::json([
'status' => 'error',
'message' => "Il faut fournir transfer_to ET operation_id ou aucun des deux"
], 400);
return;
}
if ($transferTo && $operationId) {
try {
$stmt3 = $this->db->prepare('
UPDATE passages
SET fk_user = :new_user_id
WHERE fk_user = :delete_user_id
AND fk_operation = :operation_id
');
$stmt3->execute([
'new_user_id' => $transferTo,
'delete_user_id' => $id,
'operation_id' => $operationId
]);
} catch (PDOException $e) {
Response::json([
'status' => 'error',
'message' => 'Erreur lors du transfert des passages',
'error' => $e->getMessage()
], 500);
return;
}
}
// —— Suppression réelle de l'utilisateur ——
try {
// Désactivation de l'utilisateur plutôt que suppression
$stmt = $this->db->prepare('
UPDATE users
SET chk_active = 0,
updated_at = NOW(),
fk_user_modif = ?
WHERE id = ?
');
$stmt->execute([$currentUserId, $id]);
// Supprimer les enregistrements dépendants dans ope_users
$stmtOpeUsers = $this->db->prepare('DELETE FROM ope_users WHERE fk_user = ?');
$stmtOpeUsers->execute([$id]);
// Ici éventuellement : d'autres suppressions en cascade si besoin
$stmt = $this->db->prepare('DELETE FROM users WHERE id = ?');
$stmt->execute([$id]);
if ($stmt->rowCount() === 0) {
Response::json([
'status' => 'error',
'message' => 'Utilisateur non trouvé'
'message' => 'Utilisateur non trouvé ou déjà supprimé'
], 404);
return;
}
LogService::log('Utilisateur GeoSector désactivé', [
LogService::log('Utilisateur GeoSector supprimé', [
'level' => 'info',
'deactivatedBy' => $currentUserId,
'userId' => $id
'deletedBy' => $currentUserId,
'userId' => $id,
'passage_transfer' => $transferTo && $operationId ? "Vers utilisateur $transferTo pour operation $operationId" : 'Aucun'
]);
Response::json([
'status' => 'success',
'message' => 'Utilisateur désactivé avec succès'
'message' => 'Utilisateur supprimé avec succès'
]);
} catch (PDOException $e) {
LogService::log('Erreur lors de la désactivation d\'un utilisateur GeoSector', [
LogService::log('Erreur lors de la suppression d\'un utilisateur GeoSector', [
'level' => 'error',
'error' => $e->getMessage(),
'userId' => $id