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.

⚙️
PRODUIT LIÉ
AutomationSequence V8.0
← Article précédent Article suivant →