Aller au contenu principal

Rapport planifié par email

Le problème

La direction veut un rapport « chiffres d'hier » à 08:00 chaque jour ouvré dans sa boîte de réception. Ou un « résumé pipeline hebdomadaire » le lundi. Sans écrire un script cron + email personnalisé.

Le modèle

Un job Nomaflow avec trois étapes :

  1. Rendre le rapport en XLSX (via l'endpoint d'export d'écran du framework, ou un helper Python).
  2. Attacher + envoyer l'email via votre relais SMTP ou un service transactionnel.
  3. Journaliser l'envoi pour audit (optionnel).

Le framework gère la planification, les tentatives en cas d'échec, l'historique d'exécution, les alertes.

La recette

Étape 1 — vérifier que les données sont interrogeables

Vous avez besoin d'une requête de connecteur qui produit les lignes que vous voulez restituer. Si vous avez déjà un écran qui montre les bonnes données, c'est terminé — sa requête de lecture est ce que vous exporterez.

Pour l'exemple, nous réutiliserons la requête deals.list du tutoriel CRM.

Étape 2 — configurer le relais SMTP

Paramètres → Framework → Notifications → SMTP :

ChampValeur
Hostsmtp.example.com
Port587
Usernameliberty@example.com
Password🔒 (chiffré)
TLSSTARTTLS
From addressLiberty <liberty@example.com>

Envoyez un email de test depuis le formulaire pour vérifier.

Étape 3 — construire le job

Paramètres → Jobs → + Nouveau job :

ChampValeur
Nomcrm-daily-pipeline-report
Appcrm
DescriptionQuotidien 08:00 jours ouvrés : export pipeline à la direction.
Schedule0 8 * * 1-5
TimezoneEurope/Paris
Instance unique
Timeout120 secondes

Étape 4 — les trois étapes

Étape 1 — rendre le XLSX

ChampValeur
Nomrender
TypeHTTP
VarianteConnector endpoint
Connecteurliberty-self
Endpointscreens.export
Paramètresapp = crm, screen_id = deals, format = xlsx, from_date = ${yesterday}, to_date = ${yesterday}
Alias de résultatxlsx

Le connecteur liberty-self est intégré au framework — il expose la surface REST du framework lui-même aux étapes de job.

Étape 2 — envoyer l'email

ChampValeur
Nomemail
TypeHTTP
VarianteRaw URL
MéthodePOST
URLL'endpoint pont SMTP du framework : http://127.0.0.1:8000/api/notifications/email (authentifié avec le JWT de l'utilisateur système — le framework gère cela pour les jobs déclenchés par le système).
HeadersContent-Type: application/json
Body{ "to": ["management@example.com"], "subject": "Pipeline quotidien — ${yesterday}", "body": "Veuillez trouver ci-joint le pipeline au ${yesterday}.", "attachments": [{ "name": "pipeline-${yesterday}.xlsx", "content": "${steps.render.body}", "encoding": "base64" }] }

Étape 3 — journaliser l'envoi (optionnel)

ChampValeur
Nomlog-send
TypeSQL Query
Connecteur / Requêteaudit / log-event:write
Paramètresevent = "pipeline-report-sent", payload = ${steps.email.body}

Une petite table audit qui enregistre chaque email déclenché par le système — utile quand quelqu'un dit « je n'ai pas reçu le rapport ».

Étape 5 — notifications en cas d'échec

Dans le bloc Notifications du job :

ChampValeur
En échecslack:#ops-alerts
En sauté(laisser vide)

Si le job échoue (base en panne, SMTP rejette l'email), le canal ops est notifié.

Étape 6 — tester et livrer

Cliquez sur ▶ Exécuter maintenant dans le constructeur de job. La page de détail d'exécution s'ouvre avec les trois étapes ; en cas de succès, l'email arrive dans la boîte de réception des destinataires et la table d'audit reçoit une ligne.

L'aperçu 5 prochaines exécutions du job confirme qu'il s'exécutera demain à 08:00.

Variantes

Vous voulez…Faites ceci
Un PDF au lieu d'un XLSXRemplacez format = xlsx par format = pdf à l'étape 1. Fonctionne pour les tableaux de bord ; les écrans rendent leur feuille de style d'impression en PDF.
Un rapport hebdomadaire (lundis seulement)Changez le cron en 0 8 * * 1.
Plusieurs destinataires avec des vues différentesBouclez dans une étape Python au lieu d'une seule étape HTTP — passez une liste de tuples (destinataire, screen_id, filtres).
Un corps HTML inline au lieu d'une pièce jointeL'endpoint screens.export du framework supporte format = html — intégrez la réponse directement dans le corps de l'email.
Slack au lieu d'emailRemplacez l'étape 2 par un HTTP POST sur le webhook Slack, avec le fichier uploadé via files.upload au lieu d'attaché.

Pour aller plus loin