Commit 31a7bab4 authored by Jean-Philippe Metivier's avatar Jean-Philippe Metivier
Browse files

remise à zero des journaux datés

parent 5bad216c
Loading
Loading
Loading
Loading
Loading
+2 −1
Original line number Diff line number Diff line
@@ -9,7 +9,8 @@
    ],
    "require": {
        "unicaen/app": "^6.0|^7.0",
        "unicaen/privilege": "^6.0"
        "unicaen/privilege": "^6.0",
        "unicaen/mail": "^7.0"
    },
    "autoload": {
        "psr-0": [],
+15 −0
Original line number Diff line number Diff line
@@ -134,6 +134,21 @@ return [
];
```

Mise en échec des journaux
===
Dans le fichier de configuration ```unicaen-evenement.global.php```, modifier la clé 'delai-reset-journal' pour stopper un journal qui serait en cours d'execution depuis trop longtemps (surement un plantage).
Si la clef 'mail-contact' est renseignée alors un mail est envoyé vers cette adresse pour prévenir de la remise à zéro.
Cette clef est facultative.

```php
return [
    'unicaen-evenement' => [
        'delai-reset-journal' => 'P1D',
        'mail-contact' => 'alain.terrieur@unicaen.fr',
    ],
];
```

Date Limite de Traitement
===
Dans le fichier de configuration ```unicaen-evenement.global.php```, modifier la clé 'max_time_execution' pour stoper automatiquement les événements trop long
+84 −1
Original line number Diff line number Diff line
@@ -2,8 +2,11 @@

namespace UnicaenEvenement\Command;

use DateInterval;
use DateTime;
use DateTimeImmutable;
use Exception;
use RuntimeException;
use Symfony\Component\Console\Command\Command;
use Symfony\Component\Console\Input\InputInterface;
use Symfony\Component\Console\Output\OutputInterface;
@@ -14,6 +17,7 @@ use UnicaenEvenement\Service\Etat\EtatServiceAwareTrait;
use UnicaenEvenement\Service\Evenement\EvenementServiceAwareTrait;
use UnicaenEvenement\Service\EvenementGestion\EvenementGestionServiceAwareTrait;
use UnicaenEvenement\Service\Journal\JournalServiceAwareTrait;
use UnicaenMail\Service\Mail\MailServiceAwareTrait;

class TraiterEvenementsCommand extends Command
{
@@ -21,6 +25,7 @@ class TraiterEvenementsCommand extends Command
    use EvenementServiceAwareTrait;
    use EvenementGestionServiceAwareTrait;
    use JournalServiceAwareTrait;
    use MailServiceAwareTrait;

    /**
     * @var int $maxExecutionTime
@@ -31,6 +36,9 @@ class TraiterEvenementsCommand extends Command
     * @file /etc/crontab
     */
    protected int $maxExecutionTime = 300;
    private ?string $delaiResetJournal = null;
    private ?string $delaiPeremption = null;
    private ?string $mailContact = null;

    public function getMaxExecutionTime(): int
    {
@@ -42,6 +50,36 @@ class TraiterEvenementsCommand extends Command
        $this->maxExecutionTime = $maxExecutionTime;
    }

    public function getDelaiPeremption(): ?string
    {
        return $this->delaiPeremption;
    }

    public function setDelaiPeremption(?string $delaiPeremption): void
    {
        $this->delaiPeremption = $delaiPeremption;
    }

    public function getDelaiResetJournal(): ?string
    {
        return $this->delaiResetJournal;
    }

    public function setDelaiResetJournal(?string $delaiResetJournal): void
    {
        $this->delaiResetJournal = $delaiResetJournal;
    }

    public function getMailContact(): ?string
    {
        return $this->mailContact;
    }

    public function setMailContact(?string $mailContact): void
    {
        $this->mailContact = $mailContact;
    }

    protected static $defaultName = 'evenement:traiter-evenements';

    protected function configure(): void
@@ -50,6 +88,12 @@ class TraiterEvenementsCommand extends Command
        //$this->addArgument('event', InputArgument::OPTIONAL, "ID de l'événement");
    }

    function intervalToSeconds(DateInterval $interval): int {
        $reference = new DateTimeImmutable();
        $endTime = $reference->add($interval);
        return abs($endTime->getTimestamp() - $reference->getTimestamp());
    }

    protected function execute(InputInterface $input, OutputInterface $output): int
    {
        $io = new SymfonyStyle($input, $output);
@@ -58,10 +102,29 @@ class TraiterEvenementsCommand extends Command
        $io->title("Traitement des événements en attente");

        $journal = $this->getJournalService()->getDernierJournal();

        if ($this->getJournalService()->isRunning()) {
            if ($this->getDelaiResetJournal() !== null) {
                try {
                    $interval = new DateInterval($this->getDelaiResetJournal());
                } catch (Exception $e) {
                    throw new RuntimeException("Un problème est survenu lors du calcul de l'interval associé au Reset de journal",0,$e);
                }
                $age = (new DateTime())->diff($journal->getDate());
                if ($this->intervalToSeconds($age) > $this->intervalToSeconds($interval)) {
                    $journal->setEtat($this->getEtatEvenementService()->findByCode(Etat::ECHEC));
                    $journal->setLog("Arrêt pour dépassement du délai");
                    $this->getJournalService()->update($journal);
                    $io->warning("Arrêt du journal pour cause de dépassement du délai");
                    $this->getMailService()->sendMail($this->getMailContact(), "unicaen/evenement : le journal vient d'être débloqué", "unicaen/evenement : le journal vient d'être débloqué<br>Pensez à vérifier la raison du blocage précédent");
                }
            }

            if ($this->getJournalService()->isRunning()) {
                $io->error("Un traitement est déjà en cours !");
                return self::FAILURE;
            }
        }

        if (isset($journal) && $journal->getEtat()->getCode() == Etat::EN_COURS) {
            $time = new DateTime();
@@ -92,7 +155,8 @@ class TraiterEvenementsCommand extends Command
        $io->success("Debut du traitement");
        $io->success("-------------------");

        $start = new DateTime(); $nbOp = 0;
        $start = new DateTime();
        $nbOp = 0;
        $texte .= "Début du traitement : " . $start->format('d/m/Y H:i:s') . "<br/>";

        $evenements = $this->getEvenementService()->getEvenementsByEtat(Etat::EN_ATTENTE);
@@ -114,9 +178,28 @@ class TraiterEvenementsCommand extends Command
                // si le temps d'exécution maximal est dépassé ; on quitte la procédure
                break;
            }
//            if ($this->delaiPeremption !== null) {
//                try {
//                    $dateLimiteTraitement = DateTime::createFromFormat('d/m/Y H:i:s', $evenement->getDatePlanification()->format('d/m/Y H:i:s'));
//                    $dateLimiteTraitement->add(new DateInterval($this->delaiPeremption));
//                } catch (Exception $e) {
//                    throw new RuntimeException("Impossible de calcul la date limite de traitement",0,$e);
//                }
//
//                if ($dateLimiteTraitement < new DateTime()) {
//                    $io->text("- péremption de l'événement #" . $evenement->getId());
//                    $annule = $this->getEtatEvenementService()->findByCode(Etat::ANNULE);
//                    $evenement->setEtat($annule);
//                    $evenement->setLog("Date Limite de Traitement dépassée, événement annulé");
//                    $this->evenementService->update($evenement);
//                    break;
//                }
//            }

            try {
                if ($evenement !== null) {


                    $io->text("- traitement de l'événement #" . $evenement->getId());
                    $texte .= "Traitement de l'événement #" . $evenement->getId() . " <br/>";
                    try {
+18 −0
Original line number Diff line number Diff line
@@ -5,11 +5,13 @@ namespace UnicaenEvenement\Command;
use Psr\Container\ContainerExceptionInterface;
use Psr\Container\ContainerInterface;
use Psr\Container\NotFoundExceptionInterface;
use RuntimeException;
use Symfony\Component\Console\Command\Command;
use UnicaenEvenement\Service\Etat\EtatService;
use UnicaenEvenement\Service\Evenement\EvenementService;
use UnicaenEvenement\Service\EvenementGestion\EvenementGestionService;
use UnicaenEvenement\Service\Journal\JournalService;
use UnicaenMail\Service\Mail\MailService;

class TraiterEvenementsCommandFactory extends Command
{
@@ -32,15 +34,31 @@ class TraiterEvenementsCommandFactory extends Command
         * @var EvenementService $evenementService
         * @var EvenementGestionService $evenementGestionService
         * @var JournalService $journalService
         * @var MailService $mailService
         */
        $etatService = $container->get(EtatService::class);
        $evenementService = $container->get(EvenementService::class);
        $evenementGestionService = $container->get(EvenementGestionService::class);
        $journalService = $container->get(JournalService::class);
        $mailService = $container->get(MailService::class);
        $command->setEtatEvenementService($etatService);
        $command->setEvenementService($evenementService);
        $command->setEvenementGestionService($evenementGestionService);
        $command->setJournalService($journalService);
        $command->setMailService($mailService);

        $config = $container->get('Config');
        if (!isset($config['unicaen-evenement'])) {
            throw new RuntimeException("Clef de configuration ['unicaen-evenement'] absente", -1);
        }
        $config = $config['unicaen-evenement'];
        $peremptionService = $config['delai-peremption'] ?? null;
        $delaiResetjournal = $config['delai-reset-journal'] ?? null;
        $mailContact = $config['mail-contact'] ?? null;

        $command->setDelaiPeremption($peremptionService);
        $command->setDelaiResetJournal($delaiResetjournal);
        $command->setMailContact($mailContact);
        return $command;
    }
}