Mise en place suppression membre
This commit is contained in:
@@ -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
|
||||
|
||||
Reference in New Issue
Block a user