Commit ba6ce5a1 authored by Thibaut Vallee's avatar Thibaut Vallee
Browse files

Envoie des mails

parent f540aee9
Loading
Loading
Loading
Loading
+4 −1
Changes for composer.json: 4 added lines, 1 removed line.
Original line number Diff line number Diff line
@@ -25,6 +25,9 @@
        "symfony/property-access": "^7.4",
        "symfony/yaml": "^7.4"
    },
    "suggest": {
        "unicaen/mail-bundle" : "Bundle unicaen pour la gestion des envoies de mails"
    },
    "require-dev": {
        "friendsofphp/php-cs-fixer": "^3.75"
    },
@@ -40,4 +43,4 @@
            "symfony/runtime": true
        }
    }
}
},
+2 −0
Changes for config/unicaen.evenement.yaml.dist: 2 added lines, 0 removed lines.
Original line number Diff line number Diff line
@@ -33,3 +33,5 @@ unicaen_evenement:
        handlers:
            'test' : 'evenement_test_handler'

        #Profil utilisé pour envoyer les mails (si non définie : Default)
        #mail_profil: 'default'

doc/configuration.md

0 → 100644
+66 −0
Changes for doc/configuration.md: 66 added lines, 0 removed lines.
Original line number Diff line number Diff line
# unicaen/evenement-bundle

## Configuration

Le bundle dispose d'une configuration par défaut qu'il est possible de personnalisée via le fichier unicaen.envenement.yaml

```bash
cp vendor/unicaen/evenement-bundle/config/unicaen.envenement.yaml.dist \
   config/packages/unicaen.envenement.yaml
```

Voici la liste des paramétres que l'on peut définir avec leurs valeurs par défaut

| Paramètre                                         | Valeur par défaut   | Description                                                              |
|---------------------------------------------------|---------------------|--------------------------------------------------------------------------|
| unicaen_evenement.etat.default_code               | en_attente          | Code de l'état par défaut de tout nouvel événement                       |
| unicaen_evenement.evenement.max_events_per_run    | 50                  | Nombre maximum d'événements qui peuvent être traiter d'affilés           |
| unicaen_evenement.evenement.max_time_execution    | PT45S               | Un événement en cours sera mis en echec après ce délais                  |
| unicaen_evenement.evenement.ttl                   | P3D                 | Un événement en attente passera dans l'état annuler si ce délai est dépassé |
| unicaen_evenement.evenement.skip_if_event_running | true                | Interdire ou non plusieurs traitements d'événement den paralléle         |
| unicaen_evenement.evenement.stop_on_failure       | true                | Arrête le traitement des événement après X echec                         |
| unicaen_evenement.evenement.max_allowed_failures  | 10                  | Nombre maximum d'échec autorisé                                          |
| unicaen_evenement.evenement.handlers              | [Evenement de test] | Tableaux de mapping entre les événements et leurs scripts d'execution    |


**Quelques subtilité** :

- Les délais sont à fournir aux format php DateTime
- max_time_execution ne peut pas dépasser 10 min
- max_time_execution doit être afiné en fonction du paramétre php max_execution_time et du délais entre les crons :
Pour un traitement des événements toutes les 5min, il est recommandé de mêtre un max_time à 3

## Handlers

Le traitement des événements repose sur un système de "Handlers", c'est-à-dire de classe php qui s'occupe du traitement d'un événement
Chaque type d'événement doit correspondre à 1 et 1 seul Handler est implémenter l'interface [EvenementHandlerInterface.php](../src/Service/EvenementHandlerInterface.php)

```php
Interface EvenementHandlerInterface
{
    public static function getDefaultIndexName(): string;
    public function traiterEvenement(EvenementInterface $evenement): EvenementInterface;
    public function supports(EvenementInterface $evenement): bool;
}
```
La fonction supports() permet de définir des conditions d'execution d'un événement.

Le mapping entre l'événenement et son handler sont à définir dans le paramétre unicaen_evenement.evenement.handlers   
```yaml
unicaen_evenement:
    evenement:
        # format : 'code_type_evenement' : 'defaultIndexName
        handlers:
            'test' : 'evenement_test_handler'
            'send_mail' : 'send_mail_handler'
```
La clé doit correspondre au code du type d'événement et la valeur à l'index retournée par getDefaultIndexName()

La gestion du traitement des événements ce fait nécessairement par l'[EvenementManager.php](../src/Service/EvenementManager.php).
C'est lui qui est en charge de vérifier que les événements remplissent les conditions d'execution et de répartir le traitement des événements par les différents Handlers.

Ainsi lors de la définition d'un Handler, il n'est pas nécessaire de vérifier que l'événement est bien En Attente.
La fonction support des Handler permet de rajouter des conditions spécifiques à chaque Handler.
Par exemple pour send_mail_handler, de vérifier que l'on dispose bien d'une adresse de destinataire.

doc/mail.md

0 → 100644
+41 −0
Changes for doc/mail.md: 41 added lines, 0 removed lines.
Original line number Diff line number Diff line
# unicaen/evenement-bundle

## Mails

UnicaenEvenement est partiellement indépendant du bundle unicaen/mail-bundle
En effet, l'un des usages classique des événements et l'envoie de mails automatique.
Nous déléguons ici l'envoie des mails à unicaen/mail-bundle

### Configurations

Afin d'envoyer des mails, unicaen/evenement-bundle requiére peu de configuration :
1) l'utilisation de unicaen/mail-bundle

```
composer require unicaen/mail-bundle
```

2) une clé de configuration optionnelle pour définir le profil servant à envoyer les mails

```yml
unicaen_evenement:
    evenement:
        mail_profil: 'default'
```

Le reste de la configuration est délégué au bundle unicaen/mail-bundle

### EvenementMailHandler

Afin de décorollé les evenements "classique" de ceux en charge d'envoyer des mails, 
il faut utiliser des instance de [AbstractEvenementMailHandler](../src/Service/AbstractEvenementMailHandler.php).

Cette classe injecte les services de unicaen/mail-bundle et la configuration nécessaire.

Par défaut, on considére que ce type de Handler requiére nécessairement l'envoie de mail. 
Une vérification sur la disponibilité des services est donc effectué.
Cependant, comme pour le cas de l'événement de test, ceci n'est pas obligatoire.
Pour désactiver ce controle dans un handler précis, il faut surcharger la méthode static `AbstractEvenementMailHandler::mailerIsMandatory()`

Charge ensuite à la fonction `traiterEvenement()` d'utiliser les services de unicaen/mail-bundle pour envoyer les mails.

doc/modele.md

0 → 100644
+76 −0
Changes for doc/modele.md: 76 added lines, 0 removed lines.
Original line number Diff line number Diff line
# unicaen/evenement-bundle

## Modéle de données

### Etats

Le systéme d'état permet de décrire si un événement est en attente de traitement, en cours ...
[EvenementInterface.php](../src/Model/EvenementInterface.php) donne l'ensemble de ses états.
Pour le moment, nous distinguons les 5 états suivants :
- "en_attente"
- "en_cours"
- "succes"
- "echec"
- "annule"

Il est cependant possible d'en rajouter ou de modifier leurs descriptions.
A noter que les 5 états précédents servent dans des constantes. Une sécurité permet d'éviter de les supprimer par erreurs depuis l'application, mais pas depuis la BDD.

### Types d'évènements

Les types d'événements permettent de décrire des actions a traiter par événement. Pour chaque action automatique, il faut définir un événement type avec :
- son code : identifiant textuel unique
- son libelle et une description
- des parametres éventuels : par exemple { "mail-to" } signifiera que l'événement de type test attendrons éventuellement un paramétre de destinataire de mail.
- Récursion : non réimplémenté pour le moment

Pour chaque nouveau type d'événement, il est important de définir un Handler pour implémenter le traitement des événements de ce type. (cf [configuration.md](configuration.md) > Handlers)

### Instance d'événement
Chaque événement se caractérise par :
- 1 type (ie : test)
- 1 etat (ie : en_attente)
- nom et description
- parametres (ie : { "mail-to" : "jimi.hendrix@mail.fr"} )
- date de création, 
- date de planification : date à partir de laquels l'événement peux être traité, 
- date de traitement effective
- date de fin : pour les événements récursifs
- des logs : cf Section Gestions des logs
- un parent éventuelle (pour les collections d'événements)
- une liste de mots clefs (pour de la recherche)

## Gestions des logs

Chaque instance d'événements dispose d'un champs $logs.
C'est logs sont par défaut considérer comme une collection au format JSon avec pour chaque action entrées :
La date du log et le message associées ie :
```json
[
    {"date":"28/10/2026 - 10:00:00","log":"Début du traitement de l'événement"},
    {"date":"28/10/2026 - 10:00:05","log":"Echec : Une erreur XXXX ..."},
    {"date":"28/10/2026 - 10:00:30","log":"Réinitialisation de l'événement"},
    {"date":"28/10/2026 - 10:00:35","log":"Début du traitement de l'événement"},
    {"date":"28/10/2026 - 10:00:40","log":"Ceci est un événement de test"}
]
```

Afin de conserver de la lisibilité et éviter la pertes de données, utiliser la fonction EvenementInterface::addLog(string $msg)
qui est en charge d'inclure la date dans la liste des logs.

La fonction EvenementInterface::getLastLog() permet d'obtenir les derniéres informations

## Evenement et envoie de mails

Il est possible d'utiliser les événements pour envoyer des mails automatique.
Pour celà, il faut instancier des handler de type [AbstractEvenementMailHandler.php](../src/Service/AbstractEvenementMailHandler.php)
Cf [mail.md](mail.md) pour plus d'information

## Récursion

Le système de récursions des événements n'est pas encore implémentée

### Journal

Le système des journals des traitements n'est pas encore implémentée
Loading