Frappe Framework
Étapes et actions
Chaque étape a une condition. Les actions du cœur écrivent un champ, créent un document, notifient, affectent, appellent une URL ou un script.
Types
La table Actions s’exécute de haut en bas. Une ligne a un Step Type et, pour une action, un Action Type et des Parameters. Le cadre est dans Automatisations. Les applications en ajoutent via hooks.py : Étendre les automatisations.
| Type | Effet |
|---|---|
| Action | Une action : champ, e-mail, etc. |
| Wait | Pause d’une durée, puis la suite |
| WaitForEvent | Pause jusqu’à un événement, ou jusqu’au délai |
| If | Une condition, puis seulement la branche qui correspond |
Wait : {"value": 2, "unit": "Days"}. unit vaut Seconds, Minutes, Hours ou Days. Le run est Waiting. À la reprise, le document est rechargé.
WaitForEvent : event_name, correlation_key (Jinja, rendu à l’arrivée sur l’étape), timeout_value, timeout_unit. L’exemple est crm.email_replied et {{ doc.name }}, trois jours. La reprise a lieu quand emit() envoie le même événement et la même clé, ou si le délai passe. Ensuite, context.event a outcome égal à Matched ou Timed Out, et payload. Un If juste après peut tester context["event"]["outcome"] == "Timed Out" pour une relance sans réponse.
If : Step Condition. Les étapes filles mettent Parent Step au numéro de la ligne If, et Branch à If ou Else. Sans parent, l’étape part toujours. L’exemple : si doc.grand_total > 10000, affecter [email protected], sinon [email protected], puis une notification sans parent. Les If s’imbriquent. La branche est choisie une fois, pas réévaluée après un Wait.
Condition
Step Condition est une expression Python. Fausse : l’étape est Skipped et le run continue. Elle lit doc (le déclencheur), target (l’enregistrement visé) et context, dont context["steps"], les sorties précédentes par clé d’étape.
Actions du cœur
| Action | Paramètres clés |
|---|---|
| Set Field Value | field et value, ou values |
| Increment Field Value | field, amount (négatif pour soustraire) |
| Create Document | doctype, values |
| Send Notification | channel Email ou System, recipients, subject, message, ou email_template |
| Assign to User | assign_to, description |
| Call Webhook | url, method, headers, payload, timeout |
| Run Script | server_script (script API) ou script en ligne |
Exemples : values met status à Replied et priority à High. Un ToDo de relance a description, reference_type, reference_name et allocated_to en Jinja sur le lead. L’e-mail a pour destinataires @owner, @assignees et [email protected]. Le message publié est un paragraphe : le nom a été clos à la date de frappe.utils.nowdate(). @owner et @assignees se résolvent au moment de l’étape, sur le document tel qu’il était au début du run, ou après le dernier Wait. Une affectation faite plus tôt dans le même run n’y est pas encore.
Le Jinja voit doc et target (l’enregistrement de l’étape), trigger (celui qui a lancé), payload, context, et context.steps.<step_key>.
Autres enregistrements
Par défaut, l’étape agit sur le déclencheur. Relationships déclare un alias, Target le choisit : [{"alias": "customer", "relationship": "customer"}]. Lien, lien dynamique et lien de table enfant sont disponibles sous leur fieldname. Un lien inverse s’appelle <doctype>_via_<field>, par exemple crm_deal_via_lead. Create Document peut poser un Output Alias pour les étapes suivantes.
Erreurs et essai
Stop on Error est actif : le premier échec marque Failed. Coupé, la suite tourne et le run est Partially Failed. Chaque étape a son savepoint : l’échec annule ses écritures, pas les précédentes. Call Webhook et Run Script sortent de la base : une fois l’un exécuté, le run n’est jamais rejoué depuis le début, pour ne pas renvoyer le webhook. Call Webhook refuse les adresses privées et internes, suit au plus cinq redirections, et un statut 400 ou plus fait échouer l’étape. Run Script exige bench set-config -g server_script_enabled 1. Seul un System Manager écrit un script en ligne. Il lit doc, target, trigger, payload, context, pose des clés sur result, et ne peut pas appeler frappe.db.commit(). Le script serveur détaille cette activation.
Test Run, sur un flux enregistré et un document, exécute puis annule chaque changement. Le résultat liste statut, messages et valeurs de condition. Les Wait sont simulés. Call Webhook décrit la requête qu’il enverrait, sans l’envoyer.
Point d’attention
La branche If ne bouge plus après une attente. @assignees ne voit pas une affectation du même run, tant qu’un Wait n’a pas rechargé le document.
