update
This commit is contained in:
@@ -6,6 +6,7 @@ namespace App\Controllers;
|
||||
|
||||
use App\Core\Access;
|
||||
use App\Core\Csrf;
|
||||
use App\Core\Journal;
|
||||
use App\Core\JsonResponse;
|
||||
use App\Core\PdfResponse;
|
||||
use App\Core\Request;
|
||||
@@ -414,6 +415,16 @@ final class AgentController
|
||||
]);
|
||||
}
|
||||
|
||||
Journal::ecriture(
|
||||
'AGENT_RATTACHEMENT_MODIFIE',
|
||||
'agent',
|
||||
(int) $agentId,
|
||||
$structureId === null
|
||||
? sprintf('Lieu principal retiré à l’agent #%d.', (int) $agentId)
|
||||
: sprintf('Lieu principal de l’agent #%d changé pour le lieu #%d.', (int) $agentId, (int) $structureId),
|
||||
['id_structure' => $structureId !== null ? (int) $structureId : null]
|
||||
);
|
||||
|
||||
JsonResponse::send(200, [
|
||||
'message' => $structureId === null
|
||||
? 'Les paramètres de l’agent ont été mis à jour sans lieu principal.'
|
||||
@@ -518,6 +529,14 @@ final class AgentController
|
||||
}
|
||||
|
||||
$structure = $this->structureModel->findActive((int) $structureId);
|
||||
Journal::ecriture(
|
||||
'AGENT_CREE',
|
||||
'agent',
|
||||
isset($created['id_agent']) ? (int) $created['id_agent'] : null,
|
||||
sprintf('Création de l’agent %s %s (matricule %s).', $prenom, $nom, $matricule),
|
||||
['matricule' => $matricule, 'id_structure' => (int) $structureId, 'type_contrat' => $contractType]
|
||||
);
|
||||
|
||||
JsonResponse::send(201, [
|
||||
'message' => sprintf('%s %s a été ajouté avec le lieu principal « %s ».', $prenom, $nom, $structure['nom']),
|
||||
'agent' => array_merge($created, [
|
||||
@@ -548,7 +567,9 @@ final class AgentController
|
||||
* POST api/update_agent.php — modification de la fiche d'un agent.
|
||||
*
|
||||
* Mêmes contrôles que create(), matricule excepté : celui-ci n'est jamais
|
||||
* modifiable, c'est la clé de rapprochement avec les outils RH.
|
||||
* modifiable, c'est la clé de rapprochement avec les outils RH. Le nom et le
|
||||
* prénom, EUX, le sont (V7.13) : mariage, divorce, ou simple faute de frappe
|
||||
* à la saisie initiale — sans cet écran, il fallait passer par SQL.
|
||||
*
|
||||
* La quotité de travail n'est pas modifiable ici non plus : elle détermine
|
||||
* le quota annuel déjà consommé, et la changer en cours d'année fausserait
|
||||
@@ -562,6 +583,8 @@ final class AgentController
|
||||
Csrf::assertPayload($payload);
|
||||
|
||||
$agentId = filter_var($payload['agent_id'] ?? null, FILTER_VALIDATE_INT);
|
||||
$nom = trim((string) ($payload['nom'] ?? ''));
|
||||
$prenom = trim((string) ($payload['prenom'] ?? ''));
|
||||
$email = trim((string) ($payload['email'] ?? ''));
|
||||
$telephone = trim((string) ($payload['telephone'] ?? ''));
|
||||
$adresse = trim((string) ($payload['adresse'] ?? ''));
|
||||
@@ -586,9 +609,15 @@ final class AgentController
|
||||
if (!$agentId) {
|
||||
JsonResponse::send(422, ['error' => 'Agent invalide.']);
|
||||
}
|
||||
if ($this->agentModel->findActive((int) $agentId) === null) {
|
||||
// La fiche AVANT modification est conservée : elle sert à repérer un
|
||||
// renommage et à le nommer explicitement dans le journal.
|
||||
$agentAvant = $this->agentModel->findActive((int) $agentId);
|
||||
if ($agentAvant === null) {
|
||||
JsonResponse::send(404, ['error' => 'Agent introuvable.']);
|
||||
}
|
||||
if ($nom === '' || $prenom === '') {
|
||||
JsonResponse::send(422, ['error' => 'Le nom et le prénom de l’agent sont obligatoires.']);
|
||||
}
|
||||
if (!$postId || !in_array((int) $postId, $validPostIds, true)
|
||||
|| !in_array($contractType, ['PERMANENT', 'TEMPORAIRE'], true)
|
||||
|| !$contractStartDate || $contractStartDate->format('Y-m-d') !== $contractStart
|
||||
@@ -598,15 +627,43 @@ final class AgentController
|
||||
if ($email !== '' && filter_var($email, FILTER_VALIDATE_EMAIL) === false) {
|
||||
JsonResponse::send(422, ['error' => 'L’adresse e-mail saisie n’est pas valide.']);
|
||||
}
|
||||
if (strlen($email) > 255 || strlen($telephone) > 30 || strlen($adresse) > 255 || strlen($diplomeLibelle) > 150 || strlen($ptaComment) > 1000) {
|
||||
if (strlen($nom) > 100 || strlen($prenom) > 100 || strlen($email) > 255 || strlen($telephone) > 30
|
||||
|| strlen($adresse) > 255 || strlen($diplomeLibelle) > 150 || strlen($ptaComment) > 1000) {
|
||||
JsonResponse::send(422, ['error' => 'Un des champs dépasse la longueur autorisée.']);
|
||||
}
|
||||
if ($structureId !== null && $this->structureModel->findActive((int) $structureId) === null) {
|
||||
JsonResponse::send(422, ['error' => 'Lieu d’affectation principal invalide ou inactif.']);
|
||||
}
|
||||
|
||||
// Contrôle MIROIR de celui posé à l'affectation (V7.15) : interdire de
|
||||
// planifier hors contrat ne sert à rien si l'on peut ensuite déplacer le
|
||||
// contrat sous des affectations existantes. Le refus nomme la période
|
||||
// concernée, pour que l'utilisateur sache quoi retirer avant de
|
||||
// recommencer.
|
||||
$orphelins = $this->agentModel->entriesOutsideContract(
|
||||
(int) $agentId,
|
||||
$contractStart,
|
||||
$contractEnd !== '' ? $contractEnd : null
|
||||
);
|
||||
if ($orphelins['nombre'] > 0) {
|
||||
$lisible = static fn(?string $date): string => $date === null
|
||||
? '—'
|
||||
: implode('/', array_reverse(explode('-', $date)));
|
||||
JsonResponse::send(422, [
|
||||
'error' => sprintf(
|
||||
'Ces dates de contrat laisseraient %d affectation(s) en dehors du contrat, entre le %s et le %s. Supprimez-les d’abord, ou élargissez les dates.',
|
||||
$orphelins['nombre'],
|
||||
$lisible($orphelins['premiere']),
|
||||
$lisible($orphelins['derniere'])
|
||||
),
|
||||
'code' => 'HORS_CONTRAT',
|
||||
]);
|
||||
}
|
||||
|
||||
try {
|
||||
$this->agentModel->updateProfile((int) $agentId, [
|
||||
'nom' => $nom,
|
||||
'prenom' => $prenom,
|
||||
'email' => $email !== '' ? $email : null,
|
||||
'telephone' => $telephone !== '' ? $telephone : null,
|
||||
'adresse' => $adresse !== '' ? $adresse : null,
|
||||
@@ -627,9 +684,33 @@ final class AgentController
|
||||
]);
|
||||
}
|
||||
|
||||
// La fiche est relue une seule fois : elle sert à la fois au libellé de
|
||||
// la trace et à la réponse.
|
||||
$agent = $this->agentModel->findActive((int) $agentId);
|
||||
|
||||
$identiteAvant = trim((string) $agentAvant['prenom'] . ' ' . (string) $agentAvant['nom']);
|
||||
$identiteApres = trim($prenom . ' ' . $nom);
|
||||
$renomme = $identiteAvant !== $identiteApres;
|
||||
|
||||
Journal::ecriture(
|
||||
'AGENT_MODIFIE',
|
||||
'agent',
|
||||
(int) $agentId,
|
||||
$renomme
|
||||
// Un renommage doit se lire dans le journal sans avoir à
|
||||
// comparer deux lignes : l'ancienne identité y figure en clair.
|
||||
? sprintf('Modification de la fiche de l’agent %s, renommé depuis « %s ».', $identiteApres, $identiteAvant)
|
||||
: sprintf('Modification de la fiche de l’agent %s.', $identiteApres),
|
||||
[
|
||||
'id_structure' => $structureId !== null ? (int) $structureId : null,
|
||||
'type_contrat' => $contractType,
|
||||
'identite_precedente' => $renomme ? $identiteAvant : null,
|
||||
]
|
||||
);
|
||||
|
||||
JsonResponse::send(200, [
|
||||
'message' => 'Les informations de l’agent ont été mises à jour.',
|
||||
'agent' => $this->agentModel->findActive((int) $agentId),
|
||||
'agent' => $agent,
|
||||
]);
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user