Le modèle de flux V8
AutomationSequence V8 n'est pas un simple exécuteur d'actions linéaires — il supporte un modèle de flux complet : variables dynamiques, conditions imbriquées, boucles foreach et while, sauts conditionnels goto et appels de sous-séquences. Tout cela reste déclaratif en JSON.
La philosophie V8 : tout ce qui peut s'exprimer en JSON doit s'exprimer en JSON. On ne sort vers Python que pour ce qui sort des capacités du moteur natif.
Variables et interpolation
Toute valeur dans une séquence peut référencer une variable avec la syntaxe {{nom_variable}}. Les variables sont résolues au moment de l'exécution de l'action :
# Déclaration de variables initiales
{
"vars": {
"mois": "{{date_YYYYMM}}",
"service": "Cardiologie",
"seuil_alerte": 100
}
}
# Interpolation avancée
"subject": "Rapport {{service}} — {{mois}} ({{data|length}} lignes)"
# Filtres disponibles
"{{data|length}}" # longueur d'une liste
"{{nom|upper}}" # majuscules
"{{montant|round:2}}" # arrondi 2 décimales
"{{date|format:%d/%m/%Y}}"# formatage de date
"{{list|join:, }}" # jointure de liste
"{{data|sample:5}}" # 5 premiers éléments
Conditions
{
"type": "condition",
"if": "len({{data}}) > {{seuil_alerte}}",
"then_actions": [
{"type": "file_write_csv", "data": "{{data}}"},
{"type": "smtp_send", "subject": "Export OK"}
],
"else_actions": [
{
"type": "condition",
"if": "len({{data}}) == 0",
"then_actions": [
{"type": "smtp_send", "subject": "⚠ AUCUNE DONNÉE"}
]
}
]
}
Boucle foreach
{
"type": "foreach",
"items": "{{services_list}}",
"item_var": "service",
"index_var": "i",
"actions": [
{
"type": "oracle_query",
"query": "SELECT * FROM sejours WHERE service = :s",
"bind": {"s": "{{service.code}}"},
"output_var": "service_data"
},
{
"type": "file_write_csv",
"data": "{{service_data}}",
"path": "exports/{{service.nom}}_{{mois}}.csv"
}
],
"parallel": false, // true = exécution parallèle
"break_on_error": false
}
Boucle while_loop
{
"type": "while_loop",
"condition": "{{page_num}} <= {{total_pages}}",
"max_iterations": 100,
"actions": [
{"type": "http_get",
"url": "https://api.exemple.fr/data?page={{page_num}}",
"output_var": "page_data"},
{"type": "set_var",
"page_num": "{{page_num + 1}}",
"total_pages": "{{page_data.meta.total_pages}}"}
]
}
goto et labels
[
{"type": "oracle_query", "on_error": "goto:cleanup"},
{"type": "file_write_csv"},
{"type": "goto", "label": "done"},
{"type": "label", "name": "cleanup"},
{"type": "smtp_send", "subject": "Erreur — nettoyage effectué"},
{"type": "stop"},
{"type": "label", "name": "done"},
{"type": "smtp_send", "subject": "Séquence terminée"}
]
Sous-séquences
{
"type": "call_sequence",
"sequence": "shared/envoyer_rapport.json",
"input_vars": {
"destinataire": "{{email_ops}}",
"fichier": "{{export_path}}"
},
"output_vars": ["smtp_status"]
}
// Les variables d'entrée sont copiées dans le contexte de la sous-séquence
// Les variables de sortie sont remontées dans le contexte parent
Conclusion
Le moteur de flux V8 permet d'exprimer des logiques complexes — boucles, conditions imbriquées, sauts conditionnels, sous-séquences réutilisables — entièrement en JSON. L'interpolation {{var|filtre}} couvre 95% des transformations nécessaires sans sortir vers Python. Pour le reste, le Plugin API reste disponible.