feat: Version 3.3.5 - Optimisations pages, améliorations ergonomie et affichages dynamiques stats
🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude <noreply@anthropic.com>
This commit is contained in:
@@ -576,6 +576,43 @@ class PassageController {
|
||||
'operationId' => $operationId
|
||||
]);
|
||||
|
||||
// Enregistrer la génération du reçu dans shutdown_function pour garantir son exécution
|
||||
// Même si le worker FPM est tué après fastcgi_finish_request()
|
||||
$fkType = isset($data['fk_type']) ? (int)$data['fk_type'] : 0;
|
||||
if ($fkType === 1 || $fkType === 5) {
|
||||
// Vérifier si un email a été fourni
|
||||
$hasEmail = false;
|
||||
if (!empty($data['email'])) {
|
||||
$hasEmail = filter_var($data['email'], FILTER_VALIDATE_EMAIL) !== false;
|
||||
} elseif (!empty($encryptedEmail)) {
|
||||
$hasEmail = true;
|
||||
}
|
||||
|
||||
if ($hasEmail) {
|
||||
$capturedPassageId = $passageId; // Capturer pour la closure
|
||||
|
||||
register_shutdown_function(function() use ($capturedPassageId) {
|
||||
try {
|
||||
$receiptService = new \App\Services\ReceiptService();
|
||||
$receiptGenerated = $receiptService->generateReceiptForPassage($capturedPassageId);
|
||||
|
||||
if ($receiptGenerated) {
|
||||
LogService::log('Reçu généré automatiquement pour le passage', [
|
||||
'level' => 'info',
|
||||
'passageId' => $capturedPassageId
|
||||
]);
|
||||
}
|
||||
} catch (Exception $e) {
|
||||
LogService::log('Erreur lors de la génération automatique du reçu', [
|
||||
'level' => 'warning',
|
||||
'error' => $e->getMessage(),
|
||||
'passageId' => $capturedPassageId
|
||||
]);
|
||||
}
|
||||
});
|
||||
}
|
||||
}
|
||||
|
||||
// Envoyer la réponse immédiatement pour éviter les timeouts
|
||||
Response::json([
|
||||
'status' => 'success',
|
||||
@@ -583,51 +620,19 @@ class PassageController {
|
||||
'passage_id' => $passageId,
|
||||
'receipt_generated' => false // On va générer le reçu en arrière-plan
|
||||
], 201);
|
||||
|
||||
|
||||
// Flush la sortie pour s'assurer que la réponse est envoyée
|
||||
if (ob_get_level()) {
|
||||
ob_end_flush();
|
||||
}
|
||||
flush();
|
||||
|
||||
|
||||
// Fermer la connexion HTTP mais continuer le traitement
|
||||
if (function_exists('fastcgi_finish_request')) {
|
||||
fastcgi_finish_request();
|
||||
}
|
||||
|
||||
// Générer automatiquement un reçu si c'est un don (fk_type = 1) avec email valide
|
||||
if (isset($data['fk_type']) && (int)$data['fk_type'] === 1) {
|
||||
// Vérifier si un email a été fourni
|
||||
$hasEmail = false;
|
||||
if (!empty($data['email'])) {
|
||||
$hasEmail = filter_var($data['email'], FILTER_VALIDATE_EMAIL) !== false;
|
||||
} elseif (!empty($encryptedEmail)) {
|
||||
// L'email a déjà été validé lors du chiffrement
|
||||
$hasEmail = true;
|
||||
}
|
||||
|
||||
if ($hasEmail) {
|
||||
try {
|
||||
$receiptService = new \App\Services\ReceiptService();
|
||||
$receiptGenerated = $receiptService->generateReceiptForPassage($passageId);
|
||||
|
||||
if ($receiptGenerated) {
|
||||
LogService::log('Reçu généré automatiquement pour le passage', [
|
||||
'level' => 'info',
|
||||
'passageId' => $passageId
|
||||
]);
|
||||
}
|
||||
} catch (Exception $e) {
|
||||
LogService::log('Erreur lors de la génération automatique du reçu', [
|
||||
'level' => 'warning',
|
||||
'error' => $e->getMessage(),
|
||||
'passageId' => $passageId
|
||||
]);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
return; // Fin de la méthode, éviter d'exécuter le code après
|
||||
|
||||
return; // Fin de la méthode
|
||||
} catch (Exception $e) {
|
||||
LogService::log('Erreur lors de la création du passage', [
|
||||
'level' => 'error',
|
||||
@@ -792,65 +797,72 @@ class PassageController {
|
||||
'passageId' => $passageId
|
||||
]);
|
||||
|
||||
// Enregistrer la génération du reçu dans shutdown_function pour garantir son exécution
|
||||
// Même si le worker FPM est tué après fastcgi_finish_request()
|
||||
$capturedPassageId = $passageId;
|
||||
$capturedDb = $this->db;
|
||||
|
||||
register_shutdown_function(function() use ($capturedPassageId, $capturedDb) {
|
||||
try {
|
||||
// Récupérer les données actualisées du passage
|
||||
$stmt = $capturedDb->prepare('SELECT fk_type, encrypted_email, nom_recu FROM ope_pass WHERE id = ?');
|
||||
$stmt->execute([$capturedPassageId]);
|
||||
$updatedPassage = $stmt->fetch(PDO::FETCH_ASSOC);
|
||||
|
||||
if ($updatedPassage) {
|
||||
// Générer un reçu si :
|
||||
// - C'est un don (fk_type = 1) ou un lot (fk_type = 5)
|
||||
// - Il y a un email valide
|
||||
// - Il n'y a pas encore de reçu (nom_recu est vide ou null)
|
||||
$fkType = (int)$updatedPassage['fk_type'];
|
||||
if (($fkType === 1 || $fkType === 5) &&
|
||||
!empty($updatedPassage['encrypted_email']) &&
|
||||
empty($updatedPassage['nom_recu'])) {
|
||||
|
||||
// Vérifier que l'email est valide en le déchiffrant
|
||||
$email = ApiService::decryptSearchableData($updatedPassage['encrypted_email']);
|
||||
|
||||
if (!empty($email) && filter_var($email, FILTER_VALIDATE_EMAIL)) {
|
||||
$receiptService = new \App\Services\ReceiptService();
|
||||
$receiptGenerated = $receiptService->generateReceiptForPassage($capturedPassageId);
|
||||
|
||||
if ($receiptGenerated) {
|
||||
LogService::log('Reçu généré automatiquement après mise à jour du passage', [
|
||||
'level' => 'info',
|
||||
'passageId' => $capturedPassageId
|
||||
]);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
} catch (Exception $e) {
|
||||
LogService::log('Erreur lors de la génération automatique du reçu après mise à jour', [
|
||||
'level' => 'warning',
|
||||
'error' => $e->getMessage(),
|
||||
'passageId' => $capturedPassageId
|
||||
]);
|
||||
}
|
||||
});
|
||||
|
||||
// Envoyer la réponse immédiatement pour éviter les timeouts
|
||||
Response::json([
|
||||
'status' => 'success',
|
||||
'message' => 'Passage mis à jour avec succès',
|
||||
'receipt_generated' => false // On va générer le reçu en arrière-plan
|
||||
], 200);
|
||||
|
||||
|
||||
// Flush la sortie pour s'assurer que la réponse est envoyée
|
||||
if (ob_get_level()) {
|
||||
ob_end_flush();
|
||||
}
|
||||
flush();
|
||||
|
||||
|
||||
// Fermer la connexion HTTP mais continuer le traitement
|
||||
if (function_exists('fastcgi_finish_request')) {
|
||||
fastcgi_finish_request();
|
||||
}
|
||||
|
||||
// Maintenant générer le reçu en arrière-plan après avoir envoyé la réponse
|
||||
try {
|
||||
// Récupérer les données actualisées du passage
|
||||
$stmt = $this->db->prepare('SELECT fk_type, encrypted_email, nom_recu FROM ope_pass WHERE id = ?');
|
||||
$stmt->execute([$passageId]);
|
||||
$updatedPassage = $stmt->fetch(PDO::FETCH_ASSOC);
|
||||
|
||||
if ($updatedPassage) {
|
||||
// Générer un reçu si :
|
||||
// - C'est un don (fk_type = 1)
|
||||
// - Il y a un email valide
|
||||
// - Il n'y a pas encore de reçu (nom_recu est vide ou null)
|
||||
if ((int)$updatedPassage['fk_type'] === 1 &&
|
||||
!empty($updatedPassage['encrypted_email']) &&
|
||||
empty($updatedPassage['nom_recu'])) {
|
||||
|
||||
// Vérifier que l'email est valide en le déchiffrant
|
||||
$email = ApiService::decryptSearchableData($updatedPassage['encrypted_email']);
|
||||
|
||||
if (!empty($email) && filter_var($email, FILTER_VALIDATE_EMAIL)) {
|
||||
$receiptService = new \App\Services\ReceiptService();
|
||||
$receiptGenerated = $receiptService->generateReceiptForPassage($passageId);
|
||||
|
||||
if ($receiptGenerated) {
|
||||
LogService::log('Reçu généré automatiquement après mise à jour du passage', [
|
||||
'level' => 'info',
|
||||
'passageId' => $passageId
|
||||
]);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
} catch (Exception $e) {
|
||||
LogService::log('Erreur lors de la génération automatique du reçu après mise à jour', [
|
||||
'level' => 'warning',
|
||||
'error' => $e->getMessage(),
|
||||
'passageId' => $passageId
|
||||
]);
|
||||
}
|
||||
|
||||
return; // Fin de la méthode, éviter d'exécuter le code après
|
||||
|
||||
return; // Fin de la méthode
|
||||
} catch (Exception $e) {
|
||||
LogService::log('Erreur lors de la mise à jour du passage', [
|
||||
'level' => 'error',
|
||||
|
||||
Reference in New Issue
Block a user