- 3 workflows modifiés le 2026-05-22 pour formaterSessionDatedu webhook Zoho Forms en3 juin 2026(Luxon locale fr,toFormat('d MMMM yyyy')) - Workflows à valider : -vmgE2exd30yVsIvN: New Form Received (Inscription Fide, Fr), input YYYYMMDD, commite2f142c-dadrKh6ARFwRB6h1: New Form Received (Inscription Fide, En), input YYYYMMDD, commite2f142c-eqbpiZOexnZfwqDH: New Form Received (Préinscription MOS, Fr), input dd/MM/yyyy, commitac5cb72- Méthode : ouvrir un Contact ayant soumis le formulaire après le 2026-05-22 dans Zoho CRM Proactif, related list Notes, note titreFormulaire reçu (…): le champDate:doit afficher3 juin 2026(et non plus20260603ou25.06.2026) - Si aucune soumission organique d'ici l'échéance, faire un test manuel via Zoho Forms
- Brainstorming entamé le 2026-05-26, pausé en attendant 2 inputs Proactif sur le format des champs et les lookups destinataires. Repos concernés :n8n(workflow Outlook + populate + PDF),zoho-helper(workflow rule + Custom Function Deluge + champs CRM + Zoho Forms config),pdfmonkey(template HTML/CSS de l'attestation). - Décisions déjà prises (à conserver) : 1. Trigger : workflow rule Zoho time-based sur Inscriptions,Date_fin_cours - 14 jours(champ miroir déjà sync viasyncDatesCoursVersInscription). 1 inscription = 1 attestation = 1 email formateur. 2. Scope : uniquement les inscriptions oùCat_gorie_de_formation == "ASO+"(orthographe exacte avec le+, gotcha picklist Zoho documenté danszoho-helper/.claude/rules/deluge.mdgotcha #11). Idéalement aussi filter surStatut_d_inscription not in [Annulé, Refusé]. 3. Stockage des réponses du formulaire : étendre le module Attestations existant (Zoho CRM Proactif, module id790258000008720043) avec 5 nouveaux champs : Niveau de début, Niveau final atteint, Objectifs de la mesure atteints (picklist Oui/Non/Partiellement), Remarque (multi-line), Recommandation (multi-line). 1 record Attestation par inscription, lié via lookup Inscription. 4. Estimation Thomas/Proactif déjà partagée : règle workflow (0.25h Proactif) + modèle email (0.25h Proactif) + Zoho Forms sync CRM (0.5h Thomas) + template PDFMonkey (1.5h Thomas) + automations n8n (1.5h Thomas). - Décisions TBD (à clarifier avec Proactif avant d'écrire le spec) : 1. Format des 2 champs Niveau : picklist (Débutant/Intermédiaire/Avancé, A1-C2, ou échelle métier propre) ? texte libre multi-ligne ? note numérique 1-10 / 1-6 ? plusieurs sous-niveaux notés (Lecture / Écriture / Oral / Informatique) ? Impacte la création des champs CRM, le Zoho Forms, et le rendu PDF. 2. Lookups destinataires : (a) le formateur qui reçoit le mail avec lien vers le formulaire : nouveau lookupFormateursur Inscriptions vers Contacts layout Formateur ? via Séance/Suivis (1ère séance liée) ? via Cours.Formateur ? (b) le responsable de formation qui reçoit le PDF :Products.Owner? un lookup ou email dédié sur Products (à créer) ? - Architecture pressentie (sous réserve clarifications) : 1. Workflow rule Zoho time-based sur Inscriptions → webhook n8ninscription-aso-fin-mesure-j14→ format mail Outlook avec lien pré-rempli vers Zoho Forms (paramètres URL :inscriptionId,contactId) → envoi au formateur. 2. Formateur remplit Zoho Forms → sync natif Forms→CRM crée le record Attestation avec les 5 champs + lookup Inscription. 3. Workflow rule Zoho On Create Attestations → webhook n8nattestation-aso-created→ fetch Inscription + Contact + Products → POST PDFMonkey templateattestation-fin-mesure-aso→ upload PDF en pièce jointe sur le record Attestation → email Outlook au responsable de formation (Products.Owner ou champ dédié) avec PDF en attachment. - À reprendre via : "On reprend le brainstorming de l'attestation de fin de mesure ASO+ ?" → Claude charge ce TODO + relitn8n/clients/proactif/CLAUDE.md+zoho-helper/clients/proactif/CLAUDE.md+pdfmonkey/.claude/CLAUDE.md, pose les questions TBD restantes, puis écrit le spec + plan.
- Mise en place le 2026-05-23 : 2 workflow rules sur Contacts qui appellent la Custom FunctionsetNationaliteISOContact(dériveNationalit_ISOdepuisNationalitevia Map Dependency API en 2 étapes list + specific). Rule A : On Create avec sourcesAPI + Web + Email + Importcochées. Rule B : On Edit avec critère "Nationalite is modified" - Backfill des 189 records historiques OK le 2026-05-23 (DONE: updated=189 skippedNoMapping=0 errors=0). Reste à valider que la rule fire effectivement sur les nouvelles créations qui tombent via n8n/API - Méthode de validation : laisser tomber ~1 semaine de records puis lancer COQLselect id, Nationalite, Nationalit_ISO from Contacts where Created_Time > '2026-05-23T00:00:00+02:00' and Nationalite is not null and Nationalit_ISO is null→ devrait renvoyer 0 row - Si rows trouvées : checkerSetup > Functions > setNationaliteISOContact > View Log Detailspour voir si la function a tourné. Causes probables : source API pas cochée dans la rule Create, merge tag${Contacts.Id}mal saisi en argument, ou scopeZohoCRM.settings.READperdu sur connectionzohoall- Fonctions concernées :zoho-helper/clients/proactif/functions/crm/Automation/setNationaliteISOContact.dg+Standalone/backfillNationaliteISOContacts.dg- Une fois validé, supprimer aussi la fonction debugdebugMapDependencyContactscôté Zoho et le.dgcôté repo (déjà proposé en chat le 2026-05-23)
- Routine remote /scheduletrig_015DPU4iWcgjYiX8rUXiKKBJ, cron37 5 * * 2(mardi 05h37 UTC = 07h37 Zurich), reprogrammée au mardi exprès pour valider demain (à remettre au lundi si OK). Elle clone lm-security + lm-hub, modèle sonnet, et lancenode bin/run-audit.js --deliver. - Vérifier SANS l'UI claude.ai (le deep-link routines/ID ne résout pas ; passer par la page liste claude.ai/code/routines). Signaux concrets : commits sur lm-stack/lm-security (reports/<date>.md+state.json, message "chore: audit securite") et sur lm-stack/lm-hub (data/todo.md, "todo: findings securite"), plus l'email à hello@ via le worker lm-security-notify. Check rapide :gh api 'repos/lm-stack/lm-security/commits?per_page=5' --jq '.[].commit.message'- Si aucun commit ni email : le run a buté, cause probable n°1 =ghnon authentifié dans le sandbox /schedule (le prompt de la routine doit le diagnostiquer). Fix : (a) ajouter un PAT GitHub fine-grained au prompt de la routine (Contents read sur lm-stack + yb-concept, read/write sur lm-security + lm-hub ; un PAT lm-hub existe déjà en secret Pages), ou (b) basculer sur GitHub Actions (logs visibles + secrets natifs, recommandé vu l'opacité de /schedule). - Contexte build (session 2026-06-01) : moteur lm-security Node/TDD 45 tests (revue opus, bug dédup gitleaks full-history corrigé), poussé sur lm-stack/lm-security. Worker email prouvé (https://lm-security-notify.hello-cb2.workers.dev, secret dans le password manager et dans le prompt routine). Flag --deliver câblé. Spec et plan : lm-security/docs/superpowers/. - Une fois validé : figer le jour définitif (lundi vs mardi), renommer la routine (encore "(lundi)"), et trancher /schedule vs GitHub Actions pour l'observabilité. - Vérifié le 2026-06-11 : le run du mardi 2026-06-09 a bien tourné (commit lm-security 05:47 UTC) mais en mode dégradé : 2 repos scannés sur 26+ (gh non authentifié dans le sandbox, cause n°1 anticipée), osv-scanner bloqué (osv.dev inaccessible), email non envoyé (worker lm-security-notify en HTTP 403, confirmé côté Gmail). 0 finding sur les 2 repos scannés (gitleaks + semgrep OK). Décision restante : PAT GitHub dans le prompt de la routine ou bascule GitHub Actions (recommandée par le rapport lui-même), puis figer le jour et renommer la routine. - 2026-07-13 : bascule GitHub Actions faite (workflow audit.yml sur lm-security, cron lundi 05h37 UTC, dry-run de validation via input limit, échec de run notifié par email). Reste : poser les secrets AUDIT_GH_PAT (PAT classique scope repo + admin:repo_hook lecture) et LM_SECURITY_EMAIL_SECRET sur le repo lm-security, lancer Run workflow avec limit=3 pour valider, puis run complet et suppression de la routine /schedule trig_015DPU4iWcgjYiX8rUXiKKBJ
- Objectif : à la création ou duplication d'un cours (Products), réhydrater les picklists enfants de dépendance vidés par le clone Zoho (Remplissage + les 7 autres enfants de Type). Cause : une Map Dependency Zoho n'est qu'un filtre UI (cf .claude/rules/deluge.md gotcha #8).
- Code déjà écrit et poussé : clients/proactif/functions/crm/Automation/setDependentPicklistDefaultsCours.dg (commit 1888e55, branche main). Spec : docs/specs/2026-06-04-remplissage-defauts-dependance-cours-design.md. Plan détaillé pas-à-pas : docs/plans/2026-06-04-remplissage-defauts-dependance-cours.md.
- Étapes Zoho (UI manuel) : (1) créer la Custom Function Automation setDependentPicklistDefaultsCours (argument coursId de type Int), coller le code sans les lignes d'en-tête ; (2) linker la connection zohoall (gotcha #9, scope ZohoCRM.settings.READ) ; (3) Test Run sur un cours Type=Fide avec Remplissage vidé, attendu maj vers {"Remplissage":"Oui"} ; (4) créer la rule "All, Cours, Créé" (Products, On Create, sources API+Web+Email+Import, action = la fonction, coursId = ${Products.Id}).
- Validation E2E : cloner un cours Fide et vérifier que Remplissage et les autres enfants reviennent remplis, plus idempotence (une valeur saisie à la main n'est pas réécrite).
- Arbitrage ouvert (cf spec) : updateRecord en trigger vide, donc aucune automation aval ne se déclenche sur les champs posés ; si une rule doit fire sur Statut à la création, exclure Statut de l'update silencieux.
- Réparer le cours Test Fide déjà dupliqué : à la main, ou standalone de backfill (modèle backfillNationaliteISOContacts) si plusieurs cours sont impactés. - Workflow n8n hdLG3GYGHPYCaFbk (Zoho Affaires, Button: Générer offre) actif sur auto.executiveeducation.app : reçoit un dealId, assemble le payload depuis le CRM (Affaire + Organisation + Contact + Formateurs), génère le PDF via le subflow PDFMonkey MjlDoaqpQdwjn1f8 et l'attache à l'Affaire - Fait le 2026-06-08 (commit df4ba68) : fix des bios formateurs, le nœud Get Formateurs passe de POST /coql à GET /Contacts?ids=...&fields=... car le credential OAuth Zoho n'a pas le scope COQL. Validé via test MCP sur l'Affaire GILAI (40556000108109026) - Reste à valider le rendu PDF complet sur une Affaire de test bien remplie - Corriger côté CRM avant validation finale : objectifs Objectif_1/2/3 avec espaces manquants à la saisie (ex GILAI « Renforcerlagouvernancedesdonnées... »), subform Programme à remplir (Titre, Durée, Unité, Objectifs) sinon programme vide dans le PDF, organisations sans adresse (Rue, Code_postal, Ville) donc destinataire incomplet - Vérifier ou câbler le bouton « Générer offre » sur le module Affaires (déclencheur prod : POST du dealId vers le webhook zoho-affaires-button-offre, Basic Auth) - Flag availableInMCP strippé par la CI sync-to-n8n.yml à chaque déploiement : à réactiver à la main pour tester via MCP, ou à ajouter à la whitelist settings de la CI pour le rendre durable - Réfs : plan docs/superpowers/plans/2026-06-05-generation-offre-pdfmonkey.md et spec docs/superpowers/specs/2026-06-05-generation-offre-pdfmonkey-design.md
- Volet Séances ASO+ validé en réel le 2026-07-15 via la fenêtre glissante (appels bulk CRM/Creator sur 3 cours, ~250 séances/cours, aucune erreur de concurrence, réconciliation vérifiée). Restent les Suivis (créer une inscription de test) et les Séances PAP (couplé au retest PAP du 2026-06-12)
- PR #22 (Phase 1 Suivis, workflow uYtGU1PoP1bQ59h50GQUH) et PR #23 (Phase 2 Séances ASO+/PAP, VRK7hkby805TzQAx + sai4IbspbIqnEReX) déployées en prod le 2026-06-09 : fan-out 1 appel par séance remplacé par des appels bulk (CRM 100 par appel, Creator 200 par appel) pour corriger la limite de concurrence Zoho ("maximum API calls simultaneously", erreur item 33)
- Test : créer un cours ASO+, un cours PAP et une inscription de test ; dans le log d'exécution n8n, vérifier des appels bulk (2 ou 3) au lieu de la rafale (plus d'erreur item 33)
- Vérifier Suivis et Séances présents en CRM ET Creator, avec ID_Zoho_Creator réconcilié des deux côtés, dates Creator au format dd-MMM-yyyy, et PATCH Date_de_fin du cours PAP correct
- Non-régression : inscription Test Fide (1 séance via l'ancien chemin Create Seance), cours MOS et KIM (WordPress) inchangés
- Phase 2 non vérifiable via MCP (subflows availableInMCP false) : l'E2E est la seule validation comportementale. Réf : docs/superpowers/specs/2026-06-09-suivis-seances-bulk-anti-ratelimit-design.md et docs/superpowers/plans/2026-06-09-suivis-seances-bulk.md
- Incident test 2026-07-15 14:57 : inscription ASO+ créée sans dates de mesure, ~250 suivis générés jusqu'à fin juillet 2027 (fallback 1900-2099 du Search Séances mesure dans Inscription créée). Fix déployé (n8n 96f023ad, CI verte) : IF Mesure renseignée ? court-circuite vers un NoOp si mesure vide (les suivis viennent du placement aso-inscription-placee), fallbacks retirés du criteria. Au passage le bulk Suivis anti rate-limit est de fait exercé (250 suivis en bulk sans erreur de concurrence) : reste l'E2E fonctionnel via la transition blueprint, APRÈS purge des ~250 suivis de test (one-shot n8n à monter, suivis CRM + miroirs Creator)
- Rectif 2026-07-15 (décision Thomas) : abandon du garde-fou Mesure renseignée ? au profit d'une coupure franche. Inscription créée ne génère plus AUCUN suivi pour ASO/ASO+ (sortie true de Est un cours ASO ? vers NoOp terminal) ; les suivis ASO viennent exclusivement du dispatch (Inscription ASO+ placée pzuBGj2uVD34Nt4e). 4 nœuds ASO retirés + bloc bornage nettoyé du code partagé Prepare Suivi rows, autres types inchangés (n8n 94fa0a20). E2E fonctionnel du dispatch encore à faire, APRÈS purge des ~250 suivis de test - Go du re-scrape de tout le canton de Vaud acté : meeting du 2026-06-03 (PoC partiel 409 leads validé, emails passés chez NeverBounce et triés par Fabien), confirmé par Thomas le 2026-06-11. ~2'900 leads VD attendus au complet (vs 409 sur 14 % du périmètre) - Préalable bloquant (Thomas, billing) : upgrader le compte Apify en Starter ($29/mois, ~2 mois), le tier FREE cape à $5 et avait coupé 410 searches sur 476 le 2026-05-22 - Puis relancercompass/crawler-google-placesavecmafondue/data-enrichment/poc-vaud/apify_vaud_input.json(476 searches, input prêt,scrapeContacts: true), rejouer le pipeline (dédup placeId, buckets cœur/secondaire/hors-cible, régénérerleads-vaud.xlsx), et repasser les nouveaux emails chez NeverBounce avant toute campagne - Suspens connexes du fil email du 2026-06-04 : répondre à Fabien sur les offres Fondue (rester sur les poids différents ou détailler chaque fondue), relancer pour l'accès n8n principal (compte créé par Fabien, invitation reçue) et pour les infos offres Fondue + Événement promises - Contexte cible : campagnes email prévues en août, limite Zoho 1'000 emails/jour à étaler sur un planning - Réfs :mafondue/data-enrichment/STATUS.mdetmafondue/.claude/CLAUDE.md(mis à jour le 2026-06-11), bilan PoCpoc-vaud/bilan-poc-vaud.md
- Volet ASO soldé le 2026-07-15 : la fenêtre glissante a généré ~250 séances par cours sur 3 cours en réel (plusieurs chunks par cours, CRM + Creator réconciliés), après conversion des 7 références $().item fragiles restantes de VRK7hkby805TzQAx en .first() (commit 7d6bceea). Reste le volet PAP ci-dessous - Fix déployé le 2026-06-11 (commit dd981a3 sur lm-stack/n8n) : .item remplacé par .first() dans le node Build Séance Creator chunks des deux générateurs (PAP sai4IbspbIqnEReX, ASO VRK7hkby805TzQAx). L'erreur paired item ne survenait qu'au-delà de 100 séances (2 chunks et plus), invisible sur les tests à chunk unique - Avant le retest : supprimer le cours PAP de test planté du 2026-06-11 (la fonction Deluge purgeSeancesSuivisCoursSupprime nettoie les 120 séances CRM orphelines créées avant le crash), puis recréer un cours PAP - Vérifier la chaîne bulk complète : 120 séances CRM, séances Creator, ID_Zoho_Creator côté CRM et ID_Zoho_CRM côté Creator réconciliés, PATCH Date_de_fin du cours - Si possible tester aussi un cours ASO+ de plus de 50 jours ouvrés (plus de 100 séances, même bug latent corrigé) - Complète la tâche E2E bulk du 2026-06-09 (génération bulk Suivis et Séances anti rate-limit)
- Pourquoi : suite à la décommission du workflow GitHub Actionssync-changelog.ymldu repoexeced(qui publiait un changelog vers le WordPress Knowledge, supprimé demasteretdevelople 2026-06-04). Ce workflow appelait l'API Anthropic pour générer les résumés. Le secret GitHubANTHROPIC_API_KEYa été supprimé du repo, mais la valeur de la clé reste active à la source. - Action : se connecter à la console Anthropic avec le compte ExecEdhec.execed@unil.ch, repérer la clé qui servait au workflow changelog, puis la révoquer / supprimer. - Voir aussi (cleanup parallèle, hors scope de cette tâche) : le WordPress Application Password (ex-secretWP_APP_PASSWORD) reste lui aussi actif côté WordPress et serait à révoquer dans le profil de l'utilisateur WP.
- Pourquoi : les séances PAP générées se créent dans le CRM mais échouent à la sync Zoho Creator (workflowi6EO8vIzV0bG2fFn"Séance créée", nodeCreate Seancevers le formSeances_Form) avec erreur 3001 "Invalid column value for Salle". Le champSalleest obligatoire côté Creator (lookup mandatory), or les séances PAP partent sans salle. - Cause : le subflowsai4IbspbIqnEReX(Generate PAP Sessions) code en dursalleId: "", et le nodeGenerate PAP Sessionsdu parentijgMMlqpQEz_6-qAR_Z_Y(Cours créé) ne passe pascoursSalleau subflow, contrairement à la branche ASO qui passecoursSalle. - Préalable bloquant : demander à Proactif quelle salle attribuer aux séances PAP. Ont-elles une salle fixe, et si oui laquelle (record du module Salles) ? PAP est une mesure d'insertion (DGEM), il se peut qu'il n'y ait pas de salle physique. - Fix selon la réponse : (a) si les cours PAP portent une salle, câblercoursSallecomme pour l'ASO (ajouter l'inputcoursSallesur le node Generate PAP, au trigger du subflow, etsalleId: coursSalledans Create Séance) ; (b) si pas de salle fixe, définir une salle par défaut à écrire, ou rendre le champSallenon obligatoire côté Creator (impacte TOUTES les séances, à valider avant). - Contexte parent : suite du fix Centre des séances ASO/PAP (commit06633dbsur lm-stack/n8n,seanceCenterprendcoursCentrela marque au lieu decoursLocationla ville). ASO confirmé OK après ajout de l'optionASO+dans la dropdownCategoriedu form Creator. Reste aussi à vérifier que la marque Centre des cours PAP est dans la dropdown Creator (pasGroupe Proactif, absent côté Creator).
- Décision (brainstorming 2026-06-18) : renouveler un forfait de séances Allemand sans tout re-saisir. Proactif prépare, le client valide via un Zoho Form prérempli, facture directe (pas de re-signature). Nombre de séances + montant figés par Proactif (le client valide, pas de recalcul côté form). - Modèle de données : une offre = un Deal de type "Renouvellement" (valeur picklist à ajouter au type de Deal). On réutilise le Cours (Products) existant : on lui ajoute une 2e inscription (le renouvellement) et on étend sa Date_de_fin. 1 cours = N inscriptions (1 par forfait). - Préparation = widget Zoho retenu (React/Vite, pattern session-calendar / session-management) : choisir le cours à renouveler, ajuster séances/montant/nouvelle date de fin, générer le Deal "Renouvellement" rattaché au cours via un nouveau lookup Cours_a_renouveler (Deals vers Products). Forme à préciser : Web Tab "Renouvellements" ou widget-bouton sur la fiche Cours/Contact. Garde-fous : 0 cours trouvé = anomalie (ne pas traiter, alerter), plusieurs = le plus récent ; retrouver le cours via la dernière inscription Allemand du contact (pas forcément "active", l'ancien forfait est souvent épuisé au moment du renouvellement). Bouton custom et clone natif envisagés puis écartés au profit du widget. - Validation client = nouveau Zoho Form "Renouvellement Allemand" prérempli (contact, cours, séances, montant) ; le client confirme, choisit le moyen de paiement Stripe ou virement (comme le form Inscription actuel WF3), complète adresse/consentement. - Soumission = nouveau workflow n8n "New Form Received (Renouvellement, Allemand)" calqué sur 1DQIOdYpa981RdSi (form Inscription) mais SANS créer de cours : marquer le Deal gagné (Offre_signée=Oui, date de succès, moyen de paiement), étendre Date_de_fin du cours, créer la 2e inscription (Contact + Formation = cours existant), créer la facture directe, Stripe si choisi, Task "Planifier les séances" (séances créées à la main comme aujourd'hui). - Réutilise l'existant : WF1 k5lJ2nTAccxw3xjL (génération offre PDFMonkey), WF2 oRyd45SUtL48VPpQ (offre gratuite), WF3 1DQIOdYpa981RdSi (inscription vers cours/inscription/facture/Stripe), subflow Create Deal POCzgxlK3jNNhOFi. Offre Allemand = Deal ; flux actuel offre vers form offre gratuite vers form inscription. - À confirmer avant la spec : (a) date de fin du cours saisie par Proactif ou calculée depuis le nombre de séances ; (b) séances créées manuellement (Task) ou générées auto ; (c) PDF récap de renouvellement utile ou non ; (d) noms de champs CRM exacts (type de Deal, Products Date_de_fin, Inscriptions, Factures) via le MCP Zoho CRM Proactif. Puis écrire spec + plan (superpowers). - Relevé des api_names CRM fait le 2026-07-06 via MCP (question d) : Deals.Type existe (valeurs -None-, Existing Business, New Business, PAS de Renouvellement) mais champ unused hors layout, donc ajouter la valeur ET poser le champ sur le layout ; aucun lookup Deals vers Products, Cours_a_renouveler à créer ; Offre_sign_e (picklist Oui/Non), Date_du_succ_s, Moyen_de_paiement (Stripe/Facture). Products : Date_de_d_but et Date_de_fin (datetime, graphie exacte d_but) ; piège : aucune valeur Allemand dans Products.Type, les cours Allemand se filtrent par Centre = Allemand.ch (actual_value exacte). Inscriptions : Contact, Formation (label Cours), Statut_d_inscription, Cat_gorie_de_formation ; bonus : le lookup Formation_Precedente (Cours précédent) vers Products existe déjà, réutilisable. Factures (module custom, pas Invoices natif) : Participant, Inscription, Affaire, MontantTotal (HT), MontantTotalTTC, StatutFacture, Modele. Restent les questions a, b, c (date de fin saisie ou calculée, séances manuelles ou auto, PDF récap ou non) avant d'écrire la spec
- Widget déployé et fonctionnel : recherche participant, sélection d'une plage de dates dans un calendrier (jours à séances marqués), application d'un statut à toutes les séances de la plage, bandeau de confirmation persistant avec liens cliquables vers chaque fiche Suivi, en composant Home. Reste uniquement le polish visuel pour le rendre indiscernable de l'UI Zoho CRM. Code : clients/proactif/widgets/crm/suivi-statut/ (React + Vite + Tailwind, build via build.ps1, page d'index /index.html).
- Déjà fait dans le dernier build : suppression de la carte/conteneur (ni bordure ni ombre), fond transparent, contenu pleine largeur, 2 colonnes (gauche participant + statut + bouton, droite calendrier), texte d'aide du calendrier retiré, police Puvi via CDN Zoho, bouton et champs calqués sur le CSS Zoho fourni (classes .zbtn et .zinput dans src/index.css, avec var(--primaryBackground) etc. et fallback navy ExecEd #0C2340).
- Fix connu à appliquer en premier : retirer la classe bg-slate-50 du <body> dans index.html, c'est le fond gris résiduel (le background:transparent du CSS est battu par la classe Tailwind, question de spécificité).
- Questions à poser à l'utilisateur au début, avant de coder : (1) relever dans l'inspecteur, sur un vrai bouton et un vrai input du CRM Proactif, les valeurs calculées de --primaryBackground, --primaryBackgroundHover, --primaryColor, --primaryShadow, --buttonBorderRadius, --formBorder, --lyte-input-border-radius, --baseColor ; sinon donner directement la teinte voulue du bouton (le navy #0C2340 n'est qu'un fallback non validé). (2) vérifier si l'iframe du widget hérite des variables de thème Zoho : tester var(--primaryBackground) SANS fallback et voir si le bouton prend la couleur du thème. (3) confirmer que Puvi se charge bien dans l'iframe (sinon fallback système).
- À documenter pour les prochains widgets (pièges résolus au déploiement) dans clients/proactif/CLAUDE.md ou .claude/rules/widgets.md : activer le REST API (slider OAuth2) de chaque fonction Standalone sinon NOT_ACTIVE quand le widget l'appelle ; parser crmAPIRequest avec .get("params") et non .toMap() ; page d'index = /index.html (pas /app/index.html) pour un composant Home, sinon 404 sur app/app/index.html ; COQL en lignes courtes (la longue ligne se coupe au copier-coller et casse la string) ; replaceAll en Deluge prend une regex (classe [():] au lieu de remplacer "(" seul).
- Follow-up session 2026-06-24 (ajout du sélecteur de créneau « Appliquer à ») : restreindre le widget aux seuls contacts ET suivis auxquels l'utilisateur connecté a accès, car il expose actuellement TOUS les contacts et TOUS les suivis à n'importe quel utilisateur. Cause : les Standalone searchParticipants et getParticipantSuivis tournent en permissions élevées (OAuth de la fonction + connexion zohoall pour la COQL), donc elles court-circuitent les règles de partage / ownership / territoire Zoho de l'utilisateur appelant. À faire : identifier l'utilisateur connecté (zoho.loginuserid en Deluge ou ZOHO.CRM.CONFIG.getCurrentUser côté widget) et filtrer contacts + suivis par ownership / partage (clarifier le modèle d'accès Proactif : un formateur ne doit voir que ses participants), vérifier aussi applySuiviStatut côté écriture.
- Point git du 2026-07-06 : le code (fonctions Deluge corrigées avec parsing .get("params") et COQL searchParticipants, widget réécrit) est déjà committé et poussé sur feat/widget-suivi-statut (branche synchronisée avec origin, working tree propre) ; il ne reste que le merge de feat/widget-suivi-statut dans main - Site déployé le 2026-05-08 comme proposition gratuite à Eric, patron d'Alpha-Contrôle SA (Ursy, FR), voir mail draft Gmail « Une proposition de site web, sans engagement » - URL : https://alpha-controle.pages.dev/, projetalpha-controlesur le compte CF Pages de hello@lausanne.marketing - Repo : https://github.com/lm-stack/alpha (commit6cb4960du 2026-05-08) - Le 2026-06-22 : si pas d'engagement client,DELETE /accounts/{account_id}/pages/projects/alpha-controlevia MCP Cloudflare, et archiver/supprimer le repo GitHub - Si Eric a mordu d'ici là : retirer cette tâche, le site devient un projet client (et remplacerassets/inspiration-morand.pngpar une vraie photo de l'atelier d'Ursy) - Constat du 2026-07-06 : échéance dépassée de deux semaines, aucune décision enregistrée ; vérifier si Eric a répondu puis trancher : suppression (désormais via wrangler avec cf-lm, le MCP Cloudflare est déprécié) + archivage du repo, ou conversion en projet client ; suppression exécutable par Claude sur feu vert
- Le domaine intuify.ch a été migré de Hostinger vers Infomaniak. Le credential SMTP auto@intuify.ch a été repointé vers mail.infomaniak.com port 465 SSL (user et mot de passe inchangés), mais le test de connexion n8n échoue le 2026-06-22 (erreur « Couldn't connect with these settings »), probablement propagation. Re-tester le 2026-06-23 ; si toujours KO, vérifier le couple port/SSL (465 + SSL ON, ou 587 + STARTTLS) et que la boîte Infomaniak est active. - MaFondue : les 4 workflows du backup sont déjà construits et vérifiés (run de backup OK le 2026-06-22, seul l'email échoue faute de SMTP). Une fois le credential SMTP fonctionnel sur MaFondue (à créer avec les mêmes réglages) : prévenir Claude qui l'assignera aux 2 nodes Send Email (workflows icBHrZ0GfJ0bTdiu et tO1RIzGpTitTYm2o via le MCP), réglera Error Workflow en UI sur les 3 workflows, activera le schedule 03h17 et relancera le backup test. - Proactif : le credential SMTP fEkxl274OhhoQpMJ (SMTP account auto@intuify.ch) a été repointé vers Infomaniak ; le re-tester. Il sert à 6 workflows dont l'error workflow ZOQ7ifWOLtJvlCcl, donc tant qu'il ne passe pas, les notifications d'erreur Proactif ne partent plus. - Remplace l'item de build 2026-06-17 (les 4 workflows MaFondue sont faits et vérifiés ; ne reste que ce volet SMTP).
- Le code Deluge est déjà corrigé (bascule sur connection:"pdfmonkey", commits zoho-helper ae7548f + c69e9dd du 2026-06-11), mais les anciennes clés ExecEd et Proactif restent dans l'historique git : seule la rotation neutralise la fuite, pas le retrait du fichier. - À faire : régénérer les deux clés dans le dashboard PDFMonkey, puis reporter les nouvelles valeurs dans les deux Zoho Connections nommées pdfmonkey (CRM ExecEd + CRM Proactif). L'utilisateur pose les secrets lui-même, jamais en clair dans le chat. - Référence : lm-security/SECURITY-SCAN-REPORT.md (finding #1 ; déplacé de la racine du workspace le 2026-07-09). - Consolide les anciennes tâches sécurité du 2026-06-12 et du 2026-06-18 : le Bearer OTP LM est suivi à part (tâche dédiée du 2026-06-19), le Bearer Proactif AI et DataForSEO sont déjà résolus.
- Reprise prévue la semaine prochaine du chantier landing pages (référencement local de l'Étude par lieux et par domaines de droit) - Déjà fait cette semaine : modèle réutilisable + page exemple avocat-penal.html (séquence SEO constante, données structurées JSON-LD LegalService/Attorney + FAQPage + BreadcrumbList), doc de stratégie docs/landing-pages-seo.md (réponse au risque Google doorway/contenu dupliqué, verdict par type de page), passe design (logo SVG, H1 compact, fil d'Ariane doré, portrait avec équerres, sections allégées). En ligne sur https://lubi.lausanne.marketing/avocat-penal - À faire : figer la liste finale des pages (lieux avocat-lausanne, avocat-morges, avocat-fribourg ; domaines avocat-penal, avocat-etranger, avocat-immigration, avocat-assurance ; niches avocat-terrorisme, avocat-covid19, avocat-renteAI ; page albanaise avokat-shqiptar), décliner le gabarit avec un contenu unique par page (règle une intention = une page, fusionner penal et penaliste), ajouter un hub Domaines/Régions + maillage nav/footer/sitemap, placer la 2e image - Avant mise en ligne en prod : basculer le canonical sur le domaine de production réel (la prod reste etude-lubishtani.ch sous WordPress) et brancher le formulaire de contact (Worker + Email Routing) - Session 2026-06-22 : gros travail design sur la page exemple avocat-penal.html, à reverser dans le gabarit avant de décliner les autres pages. Hero repris comme l'accueil en 2 colonnes avec slider photo de Me Lubishtani (3 clichés en fondu automatique) et H1 réduit pour les pages autres que l'accueil ; section réponse en texte seul (portrait déplacé dans le hero) ; Quand faire appel en boîtes à icônes (6 cas) ; Notre approche en section Steps (01/02/03) ; Où intervient en 3 colonnes Lausanne/Bienne/Suisse romande avec photos Unsplash (maquette : remplacer par de vraies photos des bureaux, Bienne étant un visuel générique) ; FAQ en 2 colonnes avec photo à gauche et 6 questions ; sections Pourquoi confier et Où intervient inversées (ordre et couleurs de fond) ; bloc contact = formulaire seul + 5 coordonnées en colonne à droite (Google Maps retiré), footer revu. Tout déployé en continu sur lubi.lausanne.marketing/avocat-penal (deploy manuel wrangler ; le formulaire reste action=# sans backend). On reprend demain.
- Le subflow n8n 3BZcBFfWQvsNkC3b (Upload document Proactif) a été migré le 2026-06-18 vers un upload binaire + POST /crm/v8/{module}/{id}/Attachments en OAuth2 (credential Zoho account), commit n8n 1afdff3 : il n'appelle plus cette fonction Deluge.
- Sécurité : la zapikey de la fonction était en clair dans l'URL du workflow et reste dans l'historique git. Révoquer/régénérer côté Zoho (supprimer le fichier ne suffit pas). Ce secret n'était pas listé dans SECURITY-SCAN-REPORT.md.
- Pendant du TODO execed du 2026-06-23 (même chantier upload sans fonction Deluge). La migration n8n Proactif est faite ; reste la suppression de la fonction et la rotation du secret.
- Vérification pré-suppression du 2026-07-06 : aucune référence runtime restante. Repo n8n : zéro occurrence (subflow 3BZcBFfWQvsNkC3b bien migré, aucun workflow versionné ne contient zapikey). Zoho Proactif via MCP : 58/58 workflow rules inspectées (16 avec actions functions, aucune pdfmonkey), 32/32 webhooks (tous vers auto.proactif.ch), 2 boutons custom sans lien. zoho-helper : seule sa définition .dg + doc. Limites : schedules/blueprints non exposés par le MCP, fonctions Zoho non versionnées invisibles. Feu vert : supprimer la fonction puis révoquer la zapikey - Upload de documents execed (subflow n8n upload-document, ID 7rCIM0fiAO26EHs4) migré le 2026-06-16 vers un pattern sans fonction Deluge : download du PDF en binaire puis POST /crm/v8/{module}/{id}/Attachments en OAuth2 (credential Zoho account), modèle Proactif mXQm0J4CBDv4XV1p. Source pdfmonkey validée (GILAI) ; source odoo (facture portail) à valider via une facture de test.
- Après ~1 semaine de stabilité : supprimer la fonction Deluge uploadDocument (zoho-helper/clients/execed/functions/crm/Standalone/uploadDocument.dg) cote Zoho execed, APRES avoir confirmé qu'aucun autre déclencheur Zoho ne l'appelle. Supprimer aussi le credential n8n devenu inutile zapikey (Upload document).
- Si le pattern tient : migrer les autres clients n8n sur le même modèle (download binaire + Attachments OAuth2), en priorité Proactif dont le subflow 3BZcBFfWQvsNkC3b appelle encore la fonction Deluge getrequireddatafrompdfmonkey avec une zapikey en clair dans l'URL (faille de sécurité à régler par la même occasion).
- Le reste de la chaîne offre execed est terminé : transmission payload (JSON.stringify dans MjlDoaqpQdwjn1f8), images réhébergées sur execed-tools.pages.dev/offre, fond default-page en CSS, champs CRM Délai de réalisation / Domaine personnalisé + câblage, upload OAuth.
- Vérification pré-suppression du 2026-07-06 : aucune référence runtime restante. Zoho ExecEd via MCP : 84/84 workflow rules inspectées (20 avec actions functions, aucune uploadDocument), 50/50 webhooks sans URL de fonction ni zapikey. Le credential n8n zapikey (Upload document) est orphelin dans les workflows versionnés. Trace inerte à nettoyer en même temps : le node template n8n/nodes/zoho/upload-document.json (bibliothèque de snippets, zapikey via variable d'env) à supprimer ou migrer vers le pattern Attachments OAuth2. Volet Proactif déjà couvert (subflow 3BZcBFfWQvsNkC3b migré le 2026-06-18) - Build du 2026-06-22 fait via le MCP Zoho MaFondue (org Froval SA, édition Professional) : 4 modules configurés (Prospects, Comptes ex-Entreprises, Contacts, Offres ex-Affaires), champs ERD créés, champs hors-ERD masqués (non destructif). Détail complet dans mafondue/crm-zoho/STATUS.md, section "Build 2026-06-22". - Décision bloquée par Fabien : mail envoyé le 2026-06-22 sur la suppression des ~12 462 contacts (dernière modif 2022) et ~1 449 prospects (2024) existants, de qualité douteuse. S'il valide la suppression, repartir sur une base propre et aligner strictement sur l'ERD (supprimer les champs legacy, listes en strict ERD). - Trancher "Origine du prospect" sur Contacts : merge (garder les valeurs maison Fabien, Connaissance, Réseaux sociaux (IG, FB), Newsletter, Salon - Evénement, plus les valeurs ERD) ou strict ERD (10 valeurs, le reste en inactif). Si Fabien fait supprimer les données : strict ERD. Prospects est déjà en strict ERD. - Champs legacy Bexio (Adresse, Localité, Langue, Bexio_Client_ID, Gestion du consentement, etc.) actuellement masqués sur Comptes/Contacts/Prospects : les supprimer si Fabien valide la suppression, sinon les laisser masqués. - Affichage conditionnel non réalisé (limite d'édition) : les règles de mise en page (Pays si Canton = Étranger, Autorisation si Ambassadeur = Oui, langue préremplie selon le canton) nécessitent Zoho Enterprise ; l'org est en Professional. Décider : passer en Enterprise, laisser les champs toujours visibles, ou poser une règle de validation "Pays obligatoire si Canton = Étranger" (dispo en Professional). - Placer le champ Score natif sur la fiche Prospects (présent mais hors layout, géré par les règles de scoring Zia). - Limite connue : la section "Google AdWords" et quelques champs système (conversion, désabonnement, enrichissement, dernière activité) ne sont pas masquables via l'API.
- Adresse actuellement configurée : info@chateauvaumarcus.ch (vars EMAIL_TO et destination_address du binding send_email dans workers/contact-mailer/wrangler.toml) - Confirmer avec la cliente l'adresse de réception définitive des demandes de contact du château - Procédure : éditer EMAIL_TO et destination_address dans wrangler.toml, vérifier la nouvelle adresse comme destination dans Email Routing (compte LM) si elle change, puis cf-lm puis npx wrangler deploy - Tâche issue de la finalisation du formulaire de contact (worker vaumarcus-contact-mailer + Email Routing) le 2026-06-16
- Références d'accès DataForSEO (login/password, placeholders inclus) retirées de README-routines.md et INFRA.md le 2026-06-09 lors de l'audit sécurité - Pipeline conservé mais inactif côté DataForSEO : scripts/fetch-dataforseo.ts, scripts/analyze-signals.ts, workflow .github/workflows/seo-data-refresh.yml - À faire : recréer le compte DataForSEO, regénérer les clés API, les poser en GitHub Secrets DATAFORSEO_LOGIN / DATAFORSEO_PASSWORD du repo lm (jamais en clair), re-documenter, valider un run de bout en bout - Objectif : réactiver l'idéation SEO data-driven (volume, difficulté, idées de mots-clés) pour les articles automatisés
- Diagnostic CONFIRMÉ le 2026-07-10 (test reproduit par API : modification du Compte test à 08:38, règle exécutée, zéro exécution n8n, zéro échec dans le journal webhook Zoho interrogé sur 2 jours) : Zoho n'émet jamais la requête, signature d'une connexion non autorisée. Les Connections ne sont pas exposées par l'API : correction UI uniquement - Action Thomas (UI Zoho) : Paramètres, Espace développeur, Connexions, « n8n » : vérifier statut « Connectée » (cliquer Connecter si besoin), type Service personnalisé auth API Key, paramètre de type HEADER nommé exactement Authorization, valeur Basic du gestionnaire (credential « Internal n8n API (MaFondue) ») - Re-test après correction : modifier le Compte « Test Sync Intuify » (id 1001507000026835106, n'importe quelle édition) et vérifier qu'une exécution apparaît sur CfRDjBCeqeOLlTuZ (search_executions) ; sans effet de bord, le node « Sync vers Bexio » est désactivé - Acquis : credentials « Zoho CRM » (yEyouvdlkTZWYirP, refresh token re-validé le 2026-07-10) et « Internal n8n API (MaFondue) » (iGCOQvLQhQZcbYHY) bindés sur tous les nodes ; publiés : Zoho (Comptes created/edited) CfRDjBCeqeOLlTuZ (webhook en écoute, 401 vérifié) + Subflow: Bexio (Upsert contact) 510xhl625Oa1DhMB ; côté Zoho : webhook n8n : Comptes upsert (1001507000026847001) + rule n8n : Comptes créés/modifiés (1001507000026840003) actifs ; gotcha : pas de scope org sur le self-client (ne pas smoke-tester via /crm/v8/org) - Reste de la Phase B : PAT Bexio (developer.bexio.com, token « n8n sync Zoho ») + credential Bearer « Bexio PAT » dans n8n, binding des 8 nodes Bexio + réactivation du node « Sync vers Bexio », résolution des constantes Bexio (user_id via GET /2.0/users, codes kb_item_status_id), publication des workflows restants, règle Contacts + bouton Rafraîchir côté Zoho, tests unitaires, seed initial (valider avec Fabien : historique factures = exercice courant, présence de fournisseurs), activation du Delta scan - Réfs : plan lm-stack/n8n docs/superpowers/plans/2026-07-09-sync-bexio-zoho-mafondue.md, mapping clients/mafondue/zoho-sync-fields.md, état détaillé dans clients/mafondue/CLAUDE.md
- État : chaîne complète EN PROD et validée E2E par Thomas le 2026-07-14 (fiche Attestation Modèle = ASO -> rule CRM -> webhook -> n8n dispatch -> PDF attaché). Template PDFMonkey "ATTESTATION ASO" (id 346f83bb-e26f-4c0c-904e-f591dd3c6ba7), source pdfmonkey/clients/proactif/attestation-aso/ - Détail complet dans le plan : n8n/docs/superpowers/plans/2026-07-01-attestation-aso.md ; repos concernés : n8n, pdfmonkey, zoho-helper - Avancement 2026-07-06 : doc faite (CLAUDE.md n8n + pdfmonkey) ; mapping civilité confirmé contre le picklist réel (gotcha : Non spécifié sortirait brut sur le PDF) ; webhook vérifié actif ; signatures embarquées en base64 dans le template PDFMonkey (pdfmonkey 3f75337, CI verte, plus rien à héberger) ; fonction Deluge renommée genererattestationaso (taxonomie Button, zoho-helper 344ac3e) + restructurée avec return final unique exigé par le validateur (a1fdd1c) ; fonction CRÉÉE dans Zoho par Thomas le 2026-07-06 - Avancement 2026-07-14 : architecture finale posée (décision Thomas : PAS de bouton, un seul webhook CRM pour ASO et MMT, dispatch sur le Modèle côté n8n). CRM via MCP : webhook « n8n - Attestation créée » (790258000012352001, POST attestation-created, form-data attestationId + modele, auth type connection sur la Connection n8n, zéro secret) + rule « Attestation créée » (790258000012353001, On Create Attestations, criteria Modèle dans [ASO, MMT], active, vérifiée par GET). n8n via repo + CI (run 29323508506 vert) : workflow pWXEk2MI735VWiRR renommé « Attestation créée (Zoho CRM) », webhook re-pointé attestation-created, Switch Modèle (ASO = chaîne PDFMonkey existante, MMT = Forward vers h13NHQJauBZLfhqL). La rule « All, Attestations, Créée » (initPresencesJournalieres) n'a pas été touchée. Fonction Deluge genererattestationaso ORPHELINE (bouton abandonné) : suppression dans Zoho possible, .dg archivé dans zoho-helper. Limite branche MMT : les champs caisse de chômage ne transitent pas (fallback gracieux, champs PDF 1.141/1.65 vides). Doc à jour : n8n/clients/proactif/CLAUDE.md (commits b8e2b522, 752d104a, 25f264ad) - Avancement 2026-07-14 (suite) : test E2E validé par Thomas (« ça fonctionne ») ; webhook CRM « n8n - Attestation créée » enrichi à 17 params pour la branche MMT (identité contact, mesure, cours + taux et centre, date_format yyyy-mm-dd, vérifié par GET) et Forward MMT relaie désormais le body complet (n8n 8ff0be61, CI 29330837598 verte) : sans ça le PDF MMT sortait sans identité (Aggregate Data lit le body du webhook, aucun fallback). Reste connu : caisse de chômage (numéro + email) non transmissible par merge field (lookup 3 niveaux), champs SECO 1.141/1.65 vides - Prochaine action : retravailler le design du template PDFMonkey ASO (retour Thomas 2026-07-14 : le modèle fonctionne mais le design n'est pas bon ; attendre ses précisions ou un screenshot) ; ensuite finaliser + envoyer le draft « Feedbacks ASO+ » (bullet FED-70129 à passer en « c'est en place ») ; test Modèle = MMT optionnel (fix caisse b2cbe75 jamais testé)
- Contexte : TXTtwilio.lausanne.marketing(jetontwilio-domain-verification=ec50fc5b...) posé le 2026-07-10 dans la zone Cloudflare LM, servi publiquement (vérifié via Google et Cloudflare DoH, valeur strictement identique au jeton), mais le vérificateur Twilio renvoyait encore « There was an error verifying this domain » le jour même : cache interne côté Twilio soupçonné - Étape 1 : Twilio One Console, Organization settings, Domains, lausanne.marketing, bouton « Check verification » - Étape 2 si toujours Unverified : supprimer l'entrée du domaine chez Twilio et la recréer en méthode DNS ; un nouveau jeton sera généré : mettre à jour le TXTtwiliode la zonelausanne.marketing(compte Cloudflare LM, zone active, effet immédiat) - Étape 3 si échec persistant : ticket au support Twilio en signalant quetwilio.lausanne.marketingrépond publiquement sur n'importe quel résolveur - Au passage : vérifier queintuify.chest passé de « Verified (Uncertain) » à « Verified » (vérifié pendant la fenêtre de bascule des NS Infomaniak vers Cloudflare du 2026-07-10, le statut devrait se consolider tout seul)
- Dimension : sast (High)
- Fichier : /home/runner/work/lm-security/lm-security/lm-security/.work/n8n/.github/workflows/sync-to-n8n.yml:104
- Référence : yaml.github-actions.security.run-shell-injection.run-shell-injection
- Action : vérifier et corriger - Dimension : sast (High)
- Fichier : /home/runner/work/lm-security/lm-security/lm-security/.work/claude-config/project/hooks/dispatcher.js:60
- Référence : javascript.lang.security.detect-child-process.detect-child-process
- Action : vérifier et corriger - Dimension : sast (High)
- Fichier : /home/runner/work/lm-security/lm-security/lm-security/.work/lm-presentation/scripts/export-pdf.mjs:45
- Référence : javascript.lang.security.audit.spawn-shell-true.spawn-shell-true
- Action : vérifier et corriger - Dimension : sast (High)
- Fichier : /home/runner/work/lm-security/lm-security/lm-security/.work/lm-presentation/scripts/export-pdf.mjs:67
- Référence : javascript.lang.security.audit.spawn-shell-true.spawn-shell-true
- Action : vérifier et corriger - Dimension : sast (High)
- Fichier : /home/runner/work/lm-security/lm-security/lm-security/.work/lm-presentation/scripts/export-pdf.mjs:79
- Référence : javascript.lang.security.audit.spawn-shell-true.spawn-shell-true
- Action : vérifier et corriger - Dimension : sast (High)
- Fichier : /home/runner/work/lm-security/lm-security/lm-security/.work/calculator-health/backend/Dockerfile:12
- Référence : dockerfile.security.missing-user.missing-user
- Action : vérifier et corriger - Dimension : sast (High)
- Fichier : /home/runner/work/lm-security/lm-security/lm-security/.work/calculator-health/poc/Dockerfile:18
- Référence : dockerfile.security.missing-user.missing-user
- Action : vérifier et corriger - Import test du 2026-07-13 : 9 Comptes + 1 Contact (David Leresche) créés dans Zoho depuis les 10 contacts Bexio les plus récents via le subflow de prod (pivot bexio_contact_id, Statut Actif, Source Bexio, sync_mapping remplie, re-run = 0 upsert). Jugement métier à porter sur le mapping des champs, avec Fabien si possible - Décision à prendre avant le seed complet : réintroduire ou non Phone + Website sur Comptes et Mobile sur Contacts (natifs masqués hors ERD, valeurs perdues silencieusement à l'import : David Leresche n'a aucun numéro dans le CRM), et sort de l'email société (pas de champ natif sur Comptes, pattern Contact technique pas dans l'ERD actuel) - Layouts du 2026-07-13 : section Informations à cacher (Créé par, Modifié par, Devise, Taux de change) posée sur Prospects, Contacts et Offres ; option pour finir comme Comptes : supprimer la section Google AdWords en UI sur ces 3 modules (intouchable par API), puis retrait complet de Devise et Taux de change possible sur Prospects et Contacts - Zoho Campaigns : une sync est active et envoie actuellement des contacts ; vérifier son périmètre (sync CRM vers Campaigns, listes, campagnes en cours) et l'impact avant le seed complet Bexio, risque que les contacts importés partent en campagne email - Réfs : mafondue/crm-zoho/STATUS.md (sections Audit de structure et Harmonisation layouts), lm-stack/n8n clients/mafondue/CLAUDE.md (état Phase B de la sync)
- Décision Thomas (nuit du 14 au 15.07, fin de session 69ddf03a-be3e-436c-8971-72f977b71eaa) : arrêter l'approche fonctions Deluge one-shot (tâtonnements, Test Run qui ne transmet pas les arguments, éditeur qui réécrit le code, lag d'indexation invisible) et repartir sur des workflows n8n de cleaning déclenchables d'un clic - Fonctions Zoho à SUPPRIMER (via MCP deleteFunction, les .dg restent dans zoho-helper comme référence, commits 9c74cc7 et 4395b7b) : reconcilierseancesgo (790258000012345018), purgerdoublonsseancesgo (790258000012384008), reconcilieretudiantsgo (790258000012362002), purgerseancesorphelinesgo (790258000012337020), reconcilieretudiants et purgerseancesorphelines (ids via getFunctions) - À GARDER tel quel : le contrôle de cohérence en prod (checkcoherencecreatorcrm + checkcoherenceentite + executercontrolecoherence, schedule quotidien 05h00, email vers hello@lausanne.marketing seulement si anomalie) - MYSTÈRE à élucider AVANT toute purge de données : les 3 runs enchaînés de reconcilierseancesgo ont POSTé environ 300 miroirs séances (code 3000 + ID confirmés dans les logs) mais purgerdoublonsseancesgo voit 0 doublon dans All_Sessions_API ; hypothèse dominante : criteria/filtre sur le report All_Sessions_API qui masque ces records (vérifier dans le builder Creator) ; vérif rapide : count de « Toutes les séances » (Seances_List) dans l'UI et chercher « Test Fide » en doublon - Workflows n8n à créer (déclenchement manuel/bouton, logique éprouvée des .dg) : détection manquants/orphelins/doublons en lisant Seances_List paginé (PAS All_Sessions_API), purge DELETE v2.1 par critère + skip_workflow, recréation POST Seances_Form v2.1 avec mapping picklist actual vers display et salle « Libre » par défaut - Reste à réconcilier (chiffres du contrôle du 14.07) : Séances environ 93 manquantes + doublons éventuels ; Cours 12 manquants (3 ASO+, 9 dispatch KIM) + 2 orphelins de test à purger (courstest, COURSASOTEST2) ; Inscriptions 26 manquants ; Suivis 347 manquants + 114 orphelins + 543 doublons ; Étudiants solde 9 (4 fiches test yopmail à supprimer côté CRM, 3 doublons Valentina à fusionner, Axelle Barman et Rayan Abdullahi en attente de la réponse d'Anne-Laure pour leurs coordonnées)
- Le repointage du subflow Mandant a cassé les préinscriptions KIM avec conseiller pendant 8h le 14.07 (INVALID_DATA sur Conseiller) ; celle de 15h24 (Lucas Fortin) a été rejouée avec succès le 15.07 après pose du Statut Conseiller·ère sur la fiche Lauren Cordey - Vérifier les Executions des 2 parents Préinscription KIM (FrQcskBKWcRIVfBCdP, EnnBMBkXvtaHITJwyC) sur la fenêtre : retry « with currently saved workflow » des échecs restants ; si erreur FILTER_CRITERIA sur le conseiller, poser d'abord Statut = Conseiller·ère sur sa fiche Partenaires
- Soumettre une Offre gratuite de test avec Audience Enfant puis vérifier : fiche parent sur layout Représentant·e légal·e (aucun miroir Creator, sortie no-op des Switch Contact), fiche enfant sur layout Enfant (Statut Enfant, lookup représentant rempli, alias email parent+enfant@), miroir Etudiants_Form dans Creator, zéro erreur n8n - Rail déployé le 15.07 (commit 4a7832a3) ; spec : zoho-helper/clients/proactif/docs/specs/2026-07-14-layout-enfant-module-partenaires-design.md
- Support de séance : mafondue/crm-zoho/meeting-2026-07-15.md (6 décisions + annexes + déroulé post-meeting), état technique complet dans crm-zoho/STATUS.md - Décisions attendues : champ Axes multiple unique (Prospects/Comptes/Contacts), nettoyage des doublons Bexio dans Bexio par Mathieu (SV Suisse x5, liste des doublons probables à générer par nous), mapping des groupes ENTREPRISE/GMS/DIVERS/FDG/LAITERIE TERROIR + statut des fiches _PROSPECT, GO import audience Campaigns (16 227 Prospects prêts dans crm-zoho/audience/), remise en service du formulaire newsletter mafondue.ch (cassé : accès site à obtenir, rebrancher vers le CRM avec opt-in daté), gestionnaire de mots de passe Bitwarden (OK de principe + admin) - Questions clés : signification de MBG et FDG, ventes e-commerce dans Bexio ou pas, fournisseurs à importer ou exclure, taux EUR à confirmer (1 EUR = 1.081522 CHF), périmètre factures (historique 2019+ ou exercice courant), 2 sièges Zoho à ajouter (1 seul payé, 3 prévus à l'offre), emailing des clients sociétés = activer la piste interlocuteurs (Campaigns n'adresse pas les Comptes) - Après la séance : exécuter les arbitrages (champ Axes environ 2h, mappings manquants, liste doublons pour Mathieu, import audience si GO), reporter les décisions dans STATUS.md et retirer la note de l'index DOCS.md - Côté Thomas indépendamment du meeting : corriger la connexion Zoho « n8n » en UI (débloque le sens Zoho vers Bexio), go changelog ERD (champ Email sur Comptes, diagramme en attente de push), trancher le fallback mobile vers Téléphone pour les sociétés sans fixe - État sync au 14.07 : import test HORECA validé (236 fiches avec axes, statuts, cantons, rattachements), factures testées sur les 3 cas (société CHF, personne, EUR), 213 Comptes dans le CRM, seed complet prêt à 2 passes
- TRIAGE des 53 findings « secret » fait le 2026-07-23 (sous-agent, valeurs masquées) : findings granulaires retirés de l'inbox, git garde l'historique. Bilan : 7 vrais secrets, 5 faux positifs, reste = doublons et artefacts de scan - Vrais secrets PRÉSENTS dans le working tree : 4 secrets HMAC de webhook Typeform en clair dans staticData des workflows « Typeform to SMTP » lm (zSxezPcaynzogQxD / NQyRojj2o7PB2seA / DgrXAinizlwJtSEm / 9IvoyPSPVYSLw0lm, ligne 84). Rotation = désactiver puis réactiver le Typeform Trigger dans n8n (régénère le secret) puis re-commit ; impact faible (forger une soumission = un email de confirmation). Point structurel : n8n committe webhookSecret en clair dans staticData, à exclure du sync sinon la valeur régénérée re-fuite - Vrais secrets en HISTORIQUE git seulement (fichiers supprimés) : token Digiforma (qIEz5it3gP2ZNrQx) et clé Supabase (7dk1fdYvJwZGmvP5) = les « 2 JWT morts » déjà révoqués ; zapikey Zoho (L87Cnk4XfHdOCb61, dup archivée) à vérifier côté Zoho puis régénérer si encore valide. Tous neutralisés par la purge d'historique n8n - Faux positifs confirmés (ne pas re-traiter ; poser une exclusion côté moteur lm-security) : subflows « Zoho Upload » actuels proactif (3BZcBFfWQvsNkC3b) et execed (7rCIM0fiAO26EHs4) = références credential OAuth2/BasicAuth, pas des valeurs ; state.json:4534 = SHA de commit git dans le cache du moteur d'audit - Exécuter la purge de l'historique n8n (2 JWT morts) dès qu'aucune session Claude n'est active sur le repo : procédure prête dans lm-security/docs/procedures/purge-historique-n8n.md, outillage installé (Python 3.12 + git-filter-repo), TODO dédié déjà dans l'inbox - Décider du sort des clés encore ouvertes : 4 clés des workflows Typeform to SMTP (lm) et clé du subflow Zoho Upload ExecEd : rotation côté fournisseur si encore utilisées, sinon même purge d'historique - Subflow « Zoho (Upload document) » : correction prévue avec Thomas en supprimant la fonction (TODO existant dans ce sens) - Poursuivre sur le reste du rapport email du matin : environ 106 TODO High/Critical encore dans l'inbox (deps et SAST High) et les findings Medium du rapport (branch protection absente sur la quasi-totalité des repos, collaborateurs externes vaumarcus et ybcs-website) - Déjà fait le 2026-07-14 : vitest 3.2.7 sur 5 repos, lm-presentation passé en privé, historique claude-config purgé (snyk), bloc env de settings.local.json exclu du sync
- UI Creator (Thomas) ; préalable au cran 2 « enfant sans email » et à la saisie manuelle d'enfants ; le rail actuel passe par l'alias email du parent, donc non bloquant en prod
- À valider avant d'implémenter (décision actée « enfant sans email ») : remplacer l'alias parent+enfant@ de l'Offre gratuite par une dédup Repr_sentant_e_l_gal_e + Prénom/Nom - Migrer les enfants existants (recherche email contient +enfant@ : passer sur layout Enfant et retirer l'email) et les parents existants (layout Étudiant + Statut Représentant·e légal·e : passer sur layout Représentant·e légal·e)
- Layout Représentant légal : Email obligatoire, écran minimal, associer la valeur de Statut « Représentant·e légal·e » au layout - Layout Enfant : élaguer les champs hérités du clone Participant et ajouter les champs métier enfants (autorisation parentale, lien de parenté) avec l'équipe - Vérifier et documenter le criteria exact du lookup filter posé le 14.07 au soir sur Inscriptions « Conseiller·ère » (query 790258000012402488, vraisemblablement Statut = Conseiller·ère)
- Besoin (Thomas 2026-07-15, complément de la fenêtre glissante) : quand le lookup Salle d'un cours ASO+ change, re-pointer TOUTES les séances À VENIR du cours (à partir du jour du changement) sur la nouvelle salle, côté CRM ET côté miroir Creator ; les séances passées gardent l'ancienne salle (historique de présence). Sans ça, la fenêtre glissante continuerait de générer les nouveaux mois avec la nouvelle salle pendant que l'existant resterait sur l'ancienne : planning incohérent - Esquisse technique (à designer à la reprise) : rule CRM Products On Edit avec Edit Specific Field = Salle (attention : la rule « Cours modifié » existante et sa chaîne n8n KRyiHf6ApzI6Sw4SS_Ik- syncent déjà la fiche cours, il faudra soit une branche dédiée soit une rule séparée + gotcha 1 webhook par branche) -> webhook n8n -> search séances du cours avec Date_de_debut >= jour du changement -> PATCH bulk CRM (100/appel, trigger vide pour éviter la cascade Séance modifiée x250) -> update Creator en bulk v2.1 par critère ou par paquets (PAS du 1 par 1, exigence bulk de Thomas) - Points à trancher : (a) séances du jour même incluses ou seulement le lendemain ; (b) même mécanique souhaitée pour un changement de Créneau (horaires) ou de Formateur ? ; (c) périmètre ASO+ seulement ou tous les types de cours à séances - Prérequis levé le 2026-07-15 : fenêtre glissante validée en réel (purge de 819 orphelines + run complet 3 cours) ; chantier prêt à designer. Rappel du comportement actuel : la salle est lue sur le cours au moment du run, un changement ne s'applique qu'aux mois générés ensuite, d'où ce chantier pour le stock existant - Renommage 2026-07-15 : orchestrateur désormais nommé « Création auto. des séances ASO+ (Cron mensuel) » (AeakQtWGiVuveRaK), générateur « Subflow: Générer séances ASO+ (Zoho CRM, Zoho Creator) » (VRK7hkby805TzQAx) ; ex fenêtre glissante / Generate ASO Sessions
- Custom view Contacts (layout Enfant, date de naissance il y a plus de 18 ans) pour la bascule manuelle vers Participant
- Spec 2026-07-14-layout-enfant-module-partenaires-design.md, CLAUDE.md client proactif, functions/crm/Standalone/reconcilierpartenaires.dg : modifiés localement pendant les sessions des 14 et 15.07, jamais commités
- Reliquat de la mise en service de la fenêtre glissante ASO+ (validée en réel le 2026-07-15 : purge de 819 séances orphelines puis run complet sur les 3 cours, ~250 séances/cours CRM + Creator réconciliées) - Fiche Jardin d'enfants : décider le Type (« Jardin d'enfants » sans séances, ou ASO si elle doit porter des séances via la fenêtre glissante), puis créer la fiche cours - Picklist : vérifier l'entrée résiduelle affichée « ASO+ » (ids 790258000008373096/098) dans les formulaires Cours et Inscriptions ; depuis le renommage du 13.07 la valeur attendue est « ASO » (rustine de mappage ASO+ vers ASO posée côté n8n, commit ff2f3ebd)
- Valider le fix de la purge (le changement de cours doit supprimer les anciens suivis, testé mais pas confirmé par Thomas) - Router les inscriptions Fondation vers la disposition (règle Deluge On Create : Layout = Fondation quand Centre = Fondation Proactif) et poser le statut « À valider » automatiquement à la création - Migrer les inscriptions Fondation existantes vers la disposition Fondation, puis retirer le blueprint ASO+ de la disposition Standard - Ajouter le garde-fou n8n « dates de mesure vides donc aucun suivi » sur le workflow Inscription ASO+ placée (pzuBGj2uVD34Nt4e) : sinon une date de mesure vide casse le critère de recherche Zoho (INVALID_QUERY, cas Sakineh le 2026-07-17). Angle mort à creuser : comprendre COMMENT une inscription arrive sans dates alors que la transition blueprint « Confirmer » les rend obligatoires (5 champs) : le placement doit passer par un chemin qui contourne la transition (changement de cours à la main, qui déclenche quand même purgeEtRecreeSuivisAso), vérifier la Chronologie de Sakineh. Autre angle mort : l'échec est aujourd'hui silencieux (erreur n8n sans alerte, l'email « aucune séance » ne couvre que le cas 0 séance), prévoir une remontée d'erreur - Masquer les valeurs ASO et ASO+ dans la disposition Standard du picklist Type de cours - Documenter dans clients/proactif/CLAUDE.md les fonctions placementInscriptionAso, purgeEtRecreeSuivisAso, forcerCoursDispatchAso, les règles et le blueprint Parcours ASO+ - Envoyer le mail équipe (brouillon Gmail prêt) et traiter le point ouvert d'Emeline « je ne vois pas le suivi » (permissions Portal à vérifier) - Périphérique : basculer l'attestation ASO et les rules time-based ASO+ sur les dates de mesure (au lieu des dates du cours annuel)
- Cause racine CONFIRMÉE par Thomas (2026-07-17) : les séances sont en double dans le cours (Products) lui-même, pas dans le flux placement/suivis. Vérifié sur le cours ASO+ Intermédiaire (deux séances sur le même créneau, ex. 17.07 de 08:30 à 11:45) - Les suivis en double ne sont qu'une conséquence : le workflow « Inscription ASO+ placée » (pzuBGj2uVD34Nt4e) crée un suivi par séance trouvée dans la fenêtre. Fiche témoin INS-11433 (Manila, cours Intermédiaire) : 12 suivis au lieu de 6, IDs 305750 à 305761 contigus. La Chronologie montre placementInscriptionAso et purgeEtRecreeSuivisAso appelés une seule fois à 16:41, donc un seul passage n8n qui a lu 12 séances (6 jours x 2). Le workflow de suivis n'est donc PAS en cause - REPARTIR DE LÀ la prochaine fois (diagnostic déjà fait, ne pas le refaire) : investiguer le générateur de séances = workflow n8n « Création auto. des séances ASO+ (Cron mensuel) » AeakQtWGiVuveRaK puis subflow « Subflow: Générer séances ASO+ » VRK7hkby805TzQAx. Trouver pourquoi il crée chaque séance deux fois (double déclenchement cron + manuel ? idempotence « lendemain de la dernière séance » cassée ?). Cours concernés : ASO+ Débutant 790258000012329062, ASO+ Intermédiaire 790258000012329923 - Ordre de correction : corriger le générateur EN PREMIER (sinon le cron du 1er du mois ou un lancement manuel re-double), puis nettoyer l'existant en DEUX passes distinctes, les séances doublées ET les suivis doublés. Piège corrigé le 2026-07-17 : supprimer une séance ne supprime PAS les suivis qui pointent dessus (aucune cascade sur suppression de séance ; seule la suppression d'un cours purge les deux, via purgeSeancesSuivisCoursSupprime). Sans nettoyage explicite des suivis, on obtient des suivis orphelins pointant vers des séances supprimées - Angle mort ampleur : ce n'est pas que Manila. Si le générateur a tourné deux fois sur toute sa fenêtre, c'est ~12 mois de Débutant et Intermédiaire qui sont doublés (des centaines de séances par cours) et TOUTES les inscriptions déjà placées sur ces cours ont des suivis doublés. Très probablement le même phénomène que les « 543 doublons Suivis » déjà notés dans la tâche cleaning Creator/CRM du 2026-07-15 : à traiter ensemble, chiffrer l'ampleur réelle avant de purger - Angle mort dégâts en cours : tant que les séances ne sont pas dédoublées, chaque nouvelle confirmation ASO+ sur Débutant/Intermédiaire recrée des suivis doublés. NE PAS relancer le générateur à la main avant le fix, et surveiller le cron mensuel (1er du mois 06:00 Europe/Zurich) qui pourrait aggraver - Angle mort périmètre : vérifier le cours ASO+ Avancé (790258000012329932), doublé aussi ou épargné ? Si Avancé est propre, le doublage vient sans doute de deux lancements manuels ciblés et non d'un bug systématique du cron : indice pour l'enquête sur le générateur - Angle mort dédoublonnage non destructif : sur les inscriptions où un formateur a déjà saisi la présence, garder le suivi qui porte une donnée (Statut rempli), pas bêtement le premier ou le plus récent, sinon on efface du travail de formateur. Idem côté séances si un widget ou le portail Creator référence un ID précis - Bug distinct à ne pas confondre (déjà couvert par la tâche go-live ASO+, garde-fou dates vides) : une inscription SANS dates de mesure (ex. Sakineh) fait planter le même workflow pzuBGj2uVD34Nt4e avec INVALID_QUERY (le critère de recherche se construit avec une date vide). Rien à voir avec les doublons
- Livré et déployé (n8n + pdfmonkey, CI vertes) : routage du rail enfant/représentant sur « représentant rempli » (apprentis inclus), email interne enfant+prenom+nom@allemand.ch avec dédup homonymes, accusé de réception envoyé au parent (Deal.Email), champs Deal lookup Repr_sentant_l_gal + booléen Repr_sentant_rempli, bundles apprentis + entreprise collectifs (nouveaux champs formulaire NombreParticipant/DureeSeance), offres PDF Kinderklub/ECR (Objectifs et Supports masqués, lieu Epalinges, durée 60/75 min) corrigées à la source dans le subflow Create Deal POCzgxlK3jNNhOFi - Reste côté Thomas : envoyer le brouillon de mail à Anne-Laure (fil « Feedbacks Allemand.ch ») ; tester une offre ECR et vérifier que prix/articles ne sortent pas vides (risque apostrophe droite vs courbe U+2019 dans le nom de bundle « ECR d'allemand ») ; supprimer le layout Contacts « Représentant légal » devenu inutile (les parents vont sur Adulte + Statut Représentant·e légal·e) - Reste côté dev : test E2E complet (soumission enfant + apprenti + entreprise collectif, vérifier fiches CRM, sync Creator, notes, devis généré) ; nettoyage final des 3 Switch Contact (retirer la condition sur le layout Représentant légal) + MAJ doc, une fois le layout supprimé - En attente d'Anne-Laure (vacances environ 2 semaines) : garder ou retirer le « cours en duo » entreprise ; calendrier fixe ECR (16.01.2027, 10h-11h15) sans donnée source, reste en saisie manuelle - Remplace la tâche du 2026-07-15 « Tester de bout en bout le rail enfant Allemand.ch »
- Chantier génération et envoi automatique des offres depuis le CRM (Blueprint Zoho, PDF PDFMonkey, email). Spec et plan dans n8n/docs/superpowers/ (2026-07-15-mafondue-offres-blueprint-pdf), ledger d'avancement dans n8n/.superpowers/sdd/progress.md - Phase A livrée : 4 templates PDFMonkey déployés (offre-fondue, offre-evenement, offre-caquelon, offre-divers, CI verte), 3 workflows n8n construits et publiés : mainflow Hg0nrttpNlkJzYEx + subflows 2vCiR0v8lQBwwVBo (PDFMonkey Create doc) et R15pfY5njIzNbuE9 (upload document) - BLOCAGE identifié après debug complet : la connexion Zoho de n8n (credential yEyouvdlkTZWYirP, celle de la sync Bexio) ne peut PAS lire le module Offres. Zoho renvoie 204 sur un GET direct de l'Offre (id valide en dur), alors que la même connexion lit les Comptes. Ce n'est ni l'id, ni le partage (passé en public sans effet), ni le workflow. Le périmètre de la connexion couvre les modules de la sync (Comptes, Contacts, Factures) mais pas les Offres - Action Thomas au prochain point : ré-autoriser ou recréer la connexion Zoho de n8n avec un périmètre complet (ZohoCRM.modules.ALL + ZohoCRM.files.CREATE + ZohoCRM.send_mail.all.CREATE), idéalement via un compte admin. Une seule bonne connexion débloque la lecture des Offres, l'upload du PDF et l'envoi email. Question ouverte : savoir si la connexion actuelle est un OAuth "Connect my account" n8n ou un self-client api-console.zoho.eu, pour ajuster au bon endroit - Ensuite : dérouler le test de bout en bout (PDF généré et attaché à la fiche), réactiver les 2 nodes d'envoi désactivés pour les tests (HTTP: Send Mail et HTTP: Alerte email dans le mainflow), confirmer info@mafondue.ch comme adresse expéditrice vérifiée dans Zoho (Configuration, Canaux, E-mail), puis Task 13 à 15 du plan (webhook et Blueprint Zoho, tests, pilote Caroline ou Fabien) - Config déjà posée : credentials PDFMonkey (BBa3vn5c7PyYPwp7) et SMTP branchés, 4 template_ids et info@mafondue.ch injectés, webhooks en Basic Auth. Modules Offres et Comptes passés en partage public (aligné décision workshop). Offre et Compte de test à nettoyer : Deals 1001507000026936002 et Accounts 1001507000026935002 - Gotcha prod pour la config du webhook Zoho (Task 13) : envoyer l'id de l'Offre en STRING dans le body. Les ids à 18-19 chiffres dépassent la précision des nombres JavaScript : un id non quoté serait arrondi par n8n et deviendrait introuvable (204)
- Analyse d'impact du 2026-07-15 : chantier lourd (3 à 5 jours + rodage), reco de différer vu l'ERP Proactif à environ 12 mois ; Thomas envisage quand même de le faire vendredi - Modèle actuel : Contacts layout Formateur (790258000004997001) ; unique lookup CRM = Seances.Formateur (vérifié live : Products et Suivis n'en ont pas) ; miroir Creator Formateurs_Form avec ID_Zoho_CRM par fiche ; formateur fixe ASO+ 790258000009804702 en dur dans le générateur n8n VRK7hkby805TzQAx - Si go : module custom + nouveau lookup sur Seances (cible d'un lookup non modifiable ; webhooks et merge tags suivent l'ID interne du champ, re-pointage manuel des webhooks Séance créée/modifiée), environ 12 workflows n8n à toucher (Contact créé/modifié/supprimé 3wzLP4/tP61/UgcN + séances bidirectionnelles i6EO8/pEXnj/FE7HDN/tT4410 + subflows Créer séance et générateurs ASO/PAP), re-mapping ID_Zoho_CRM de toutes les fiches Formateurs_Form Creator + re-pointage du lookup sur toutes les séances, config cFormateurs de checkCoherenceCreatorCrm, branches Formateur de synccontact/deletecontact - Playbook : migration Partenaires du 2026-07-14 en version plus lourde ; bonne nouvelle : widgets session-calendar/session-management et portail Creator Formateurs quasi inchangés (branchés sur Creator) - Décision préalable à documenter : quelle douleur motive la sortie (permissions, reporting, pollution Contacts) ; si la douleur est faible, alternative légère par vue dédiée ou permissions par layout
- Maquette avocat-penal terminée et en ligne sur lubi.lausanne.marketing/avocat-penal : design itéré du 2026-06-19 au 2026-07-10 (dernier commit 5508f39), retours de Thomas intégrés (marges desktop élargies, Actualités au menu, section contact de l'accueil avec adresses et cartes, H1 agrandi + slider aligné sur la colonne texte, prix CHF 150 allégé, question FAQ raccourcie « un avocat pénal et un pénaliste ») - Brouillon Gmail prêt pour Kastriot (2026-07-10, sujet « Maquette de la page Avocat pénaliste », à relire et envoyer) ; ensuite recueillir ses retours sur la maquette et les intégrer - Liste des déclinaisons proposée dans docs/landing-pages-seo.md section 5, à valider avec Kastriot avant rédaction : vague 1 avocat-lausanne + avocat-bienne + avokat-shqiptar (traduction albanaise à lui faire relire), vague 2 avocat-terrorisme + avocat-droit-etrangers + avocat-assurances-sociales, vague 3 conditionnelle ; fusions actées penaliste/immigration/renteAI/generaliste - Vague 1 à livrer avec le maillage (hub Domaines/Régions, liens nav/footer, sitemap) ; avant mise en prod : canonical sur etude-lubishtani.ch et formulaire câblé (Worker + Email Routing) - Déploiement : manuel via wrangler pages deploy (compte LM, projet lubishtani), dist = assets publics uniquement (jamais .git, docs/, bricks/, CLAUDE.md)
- Creator répond HTTP 200 même quand il refuse un enregistrement : le verdict est un code applicatif placé dans le corps (3000 succès, 3002 validation refusée). Sans contrôle, le nœud suivant litdata.IDqui est absent, écrit un ID Creator vide dans le CRM, et l'enregistrement passe pour synchronisé alors qu'il n'existe pas côté Creator - Déjà couverts le 2026-07-20 :Contact créé(3wzLP4_zPoXq6ClK8H-aH, sur Create Etudiant et Create Formateur),Cours créé(ijgMMlqpQEz_6-qAR_Z_Y),Jour spécial créé(hqjq8zQMEQ7kudnc),Salle créée(GacaUaH8XlG0J0DM) - Méthode : lister dansclients/proactif/workflows/les nœuds httpRequest dont l'URL contientcreator.zoho.eu, puis repérer ceux qui ne sont pas suivis d'un test du code retour - Pattern à répliquer : nœud If sur{{ Number($json.code) }}égal à 3000, branche false vers un stopAndError qui remonte$json.error. Documenté dansn8n/.claude/CLAUDE.md, section sur le HTTP 200 de Creator - Pousser workflow par workflow : la CI réactive sans condition tout workflow qu'elle synchronise, un push groupé peut réveiller un workflow volontairement désactivé
- CAUSE RACINE PROUVÉE E2E (test du 2026-07-22 23:55) : le nœud « Create Suivi » de i6EO8 (Séance créée CRM) et FE7HDN (Séance créée Creator) est une version amputée de celui des inscriptions (uYtGU1). Il lui manque DEUX choses = DEUX bugs. (a)trigger:[]: sans lui, la rule « All, Suivi, Créé » fire vers 0y5O2q qui crée un 2e miroir = DOUBLONS. (b)Type_de_formation: le Suivi naît sans type, or Type_de_cours est OBLIGATOIRE côté Creator, donc miroir refusé 3002 (silencieux avant le contrôle code-3000 du 20/07) = MANQUANTS. Test EVAM : séance ajoutée sur cours à 1 inscrit, Suivi sans type (confirmé) + exécution 0y5O2q observée (cascade) + 0 miroir Creator (confirmé). uYtGU1 pose luiType_de_formation: coursTypeETtrigger:[]dès la création, d'où KIM/ASO/Test Fide sains - FIX PRÉVENTIF À FAIRE (feu vert Thomas obtenu, cause prouvée) : aligner le « Create Suivi » de i6EO8 ET FE7HDN sur uYtGU1 = ajouterType_de_formation(le Type du cours ; i6EO8 le lit déjà via son node Get Cours Type, FE7HDN à câbler) +trigger:[]. Un seul changement coupe les 2 bugs à la source. Recoupe la tâche (B) « nœuds n8n qui écrivent dans Creator sans contrôle du code 3000 ». Attention : chantier « générateur unifié » en parallèle sur le repo n8n, git pull --rebase avant, pousser workflow par workflow - DOUBLONS : SOLDÉS le 22/07. 241 miroirs surnuméraires purgés (outil c7QklWHTYJmd4amD, amélioré : batchInterval 1s anti-429 + onError continue sur « Réaligner fiche CRM » pour tolérer les groupes orphelins). Croisement post-purge : 0 doublon restant. Le stock venait surtout de recréations de masse en fenêtre passée (IDs 9.86M à 10.43M, beaucoup de triples) amplifiées par le double-write ; ne se reforme plus activement, mais le double-write RÉARME dès qu'une séance est créée sur un cours à type, d'où le fix préventif - MANQUANTS : 242 Suivis CRM sans miroir Creator (liste exacte par croisement des exports CRM 4169 / Creator 4041 ; CSV et 5 lots de 50 dans le scratchpad de session). = 210 EVAM (100% des EVAM, cause = type vide) + 24 KIM (type OK, autre cause à confirmer) + 8. Le « 128 » d'avant était le NET (242 manquants moins 114 orphelins), trompeur - OUTIL RECRÉATION construit le 22/07 : « Cleaning : Recréer les miroirs Suivis (Zoho Creator) » (n8n id tdr6E05fp8ylMQVK, mode analyse par défaut). Cible par idsCibles (PAS le subflow Détecter écarts instable) + résout les 4 lookups + Statut (Libellé vers ID via module Statuts) + Type_de_cours (dérivé du Cours, mapping ASO+ vers ASO) + garde skip si lookup/statut non résolu + idempotence par ID_Zoho_CRM + code-3000 + throttle. Testé en ANALYSE OK (3 KIM : « A creer 3, 0 skip »). RESTE à re-tester en EXECUTER (les 2 tests executer ont échoué sur 3001 Statut puis 3002 S_ance/Type_de_cours, TOUS corrigés le 22/07, non re-testés). Spec+plan : n8n/docs/superpowers/{specs,plans}/2026-07-22-recreer-miroirs-suivis - SÉQUENCE recréation : re-tester executer sur 3 KIM (ids dans le scratchpad) puis, si OK, dérouler les 242 par lots de 50, hors heures de trafic, environ 10 min entre les lots - BACKFILL CRM à prévoir (chantier à part) : l'outil recrée le miroir avec le type dérivé, mais ne corrige PAS leType_de_formationvide sur les 210 Suivis EVAM côté CRM. PoserType_de_formation = Cours.Typesur les Suivis sans type, pour la cohérence du reporting CRM - ORPHELINS : 114 miroirs Creator sans Suivi CRM (= les 114 de l'email de contrôle), liste exacte dispo. GARDE-FOU : NE PAS lancer « Purger les orphelins » (g6cx0NPzsTmpPphi) tant que le count CRM du subflow Détecter écarts n'est pas fiabilisé (il a lu 2419 vs vrai 4169 = bug pagination CRM, il verrait environ 1600 faux orphelins et supprimerait des miroirs valides). Sinon, cibler par idsCibles la liste vérifiée - SUBFLOW « Détecter écarts » (So5IrUcTQQd5uwRO) À FIABILISER : count CRM instable (2419 vs 4169) malgré la condition d'arrêt posée le 21/07. Prérequis avant tout traitement orphelins/manquants qui s'appuie dessus. La détection des DOUBLONS n'en dépend pas (elle groupe les miroirs Creator entre eux), d'où sa fiabilité
- Objectif : pour les cours continus, vérifier que le mécanisme d'extension mensuelle (fenêtre glissante) ajoute bien un mois de séances après la dernière, via le module « Séances par défaut », et sans doublon (idempotence) - ASO+ : tapis roulant déjà en place, à tester. Chaîne : fonction DelugedeclencherGenerationSeancesAso(planifiée mensuelle côté Zoho), webhook n8naso-generer-seances, cronAeakQtWGiVuveRaK, puis générateur unifié7zfgfhwJdJaMsi9i. Test : run manuel, vérifier une tranche ajoutée après la dernière séance, puis re-run = no-op (idempotence COQL côté Deluge) - Jardin d'enfants : côté n8n, aucun tapis roulant branché (génération à la création seulement). À confirmer côté Deluge (fonction planifiée équivalente ?) ; sinon le brancher avant de pouvoir tester. Config « Séances par défaut » créée le 2026-07-23 - PAP : aujourd'hui traité comme cours à fenêtre fixe [début, fin] (génération à la création, pas de tapis roulant côté n8n). Confirmer si PAP est un cours continu qui doit avoir un tapis roulant ; si oui, le brancher - Où : tests dans l'UI n8n (le MCP Proactif ne voit ni n'exécute les subflows). La planification Deluge n'est pas visible depuis le repo n8n, donc le test valide le comportement réel de bout en bout - PLA : config « Séances par défaut » aussi créée le 2026-07-23 (génération à la création ; pas de tapis roulant demandé pour l'instant)
- Symptôme : ajouter une séance à un cours crée le Suivi CRM mais PAS son miroir Creator (ID_Zoho_Creator reste vide). Le nœud Create Suivi Creator est refusé par Creator. Bug qui traîne depuis environ 6 jours, beaucoup d'allers-retours de test, Thomas très remonté : le prochain diagnostic doit se faire sur données réelles, pas sur hypothèse. - Workflow réellement en cause : FE7HDN_3Qb9Ut9gthMxg8 (Séance créée Creator), déclenché quand la séance est ajoutée côté Creator (widget/portail). Piège qui a coûté des heures : au début j'ai corrigé i6EO8 (Séance créée CRM) à tort ; le chemin testé passe par FE7HDN. i6EO8 a le même défaut et a été corrigé pareil. - Cause de fond : le nœud Create Suivi Creator était une version amputée du miroir des inscriptions (uYtGU1). Le form Creator Suivis_Form a Contact, Cours, Type_de_cours, S_ance, Statut obligatoires, et le lookup Statut est filtré par une criteria (Type_applicable contains input.Type_de_cours) : scripts suivistypeducoursrules.dg et suivisformloadrules.dg côté zoho-helper. - Erreurs résolues une par une (chaque fix débloque le champ suivant) : (1) 3001 Invalid column value Non renseigné sur Statut, corrigé en envoyant le Statut par son ID Creator 249310000000221056 plus ajout du Type_de_cours ; (2) 3002 Select a value for Séance, corrigé en renommant le champ Seance en S_ance (api_name Creator réel, confirmé via getFormMetadata). - ETAT AU SOIR DU 2026-07-23 : les 3 fixes sont déployés (CI verte) MAIS le miroir échoue ENCORE (toujours pas d'id Creator sur le suivi). La NOUVELLE erreur n'est pas encore connue : c'est le point de reprise. - REPRENDRE EXACTEMENT PAR LA : dans l'UI n8n, ouvrir la dernière exécution de FE7HDN, cliquer le nœud Create Suivi Creator, récupérer l'OUTPUT (code plus message exact que Creator renvoie maintenant) ET l'INPUT (valeurs réelles envoyées : Categorie = le type, ID_Zoho_Creator de la séance, ids Creator de Contact/Cours/Inscription). C'est la seule donnée qui manque pour trancher la cause suivante. Ne rien redéployer avant d'avoir ce log. - Référence qui MARCHE (à copier plutôt que rustiner) : miroir des inscriptions uYtGU1, nœud Create Suivis Creator (bulk), en POST v2.1 sur www.zohoapis.eu/creator/v2.1/data/team-it_proactif/calendrier/form/Suivis_Form avec skip_workflow ["form_workflow"], champs Contact, Cours, Inscription, S_ance, Type_de_cours=coursType, Statut=249310000000221056, ID_Zoho_CRM. PISTE FORTE : aligner EXACTEMENT les miroirs FE7HDN et i6EO8 sur uYtGU1 (basculer en v2.1 plus skip_workflow, copier tous les champs), au lieu de corriger champ par champ. NB : en v2.1 la réponse est result[0].code et result[0].data.ID (adapter alors If1 et Update Suivi). - Commits déployés aujourd'hui (repo n8n, branche main) : i6EO8 = 2decd781 (Type_de_cours plus Statut ID), a7a73c89 (trigger:[]), cc4498e4 (S_ance) ; le tout après un revert c6887849 d'un premier essai raté (trigger:[] seul sans réparer le miroir = miroir manquant, commit b6f1deb5). FE7HDN = 6f254448 (Type_de_cours plus Statut ID plus trigger:[]), cc4498e4 (S_ance). - Gotchas à ne pas réapprendre : api_names Creator du Suivi = S_ance (pas Seance), Type_de_cours, Statut (lookup vers module Statuts, attend un ID de record ; Non renseigné = 249310000000221056). Côté CRM le champ séance est bien Seance : ne pas y toucher. Le trigger:[] sur le POST CRM Create Suivi coupe la cascade 0y5O2qU1vWAan3vY (Suivi créé) qui postait aussi un miroir sans type (3001). Le MCP n8n Proactif ne retrouve ni i6EO8 ni 0y5O2q par id : diagnostiquer via les JSON et outputs copiés depuis l'UI par Thomas. - Angle mort à confirmer : que body.Categorie (FE7HDN) soit bien une valeur valide du picklist Type_de_cours (KIM, ASO...). Pour ASO+ risque connu du + décodé en espace par le webhook.
- Dans n8n, ouvrir chacun des 4 workflows « Typeform to SMTP » et désactiver puis réactiver le node Typeform Trigger : cela ré-enregistre le webhook et régénère le secret
- Fichiers : clients/lm/workflows/{zSxezPcaynzogQxD, NQyRojj2o7PB2seA, DgrXAinizlwJtSEm, 9IvoyPSPVYSLw0lm}.json (secret en clair dans staticData, ligne 84)
- Impact faible : permet seulement de forger une soumission de formulaire, qui envoie un email de confirmation. Présents aussi en historique git, couverts par la purge n8n de ce soir
- Point structurel à régler à terme : n8n committe webhookSecret en clair dans staticData, à exclure du sync sinon la valeur régénérée re-fuite - Reprise du chantier "Débloquer la création du miroir Creator des Suivis quand une séance est ajoutée". Réf conversation Claude Code : session 29f841c0-6573-4734-aac8-bc3adf0d24e8 - CAUSE RACINE corrigée : le nœud Create Suivi des workflows live FE7HDN_3Qb9Ut9gthMxg8 (Séance créée Zoho Creator, le workflow réellement déclenché) et i6EO8vIzV0bG2fFn (Séance créée Zoho CRM) ne posait ni Type_de_formation, ni Date_de_debut / Date_de_fin, ni Email sur le Suivi CRM. Le miroir Creator se créait (code 3000) mais le Suivi CRM naissait incomplet. Corrigé en s'alignant sur le nœud de référence uYtGU1 (chemin inscription). Déployé, CI verte (commits d015af7a et 124fea4c sur lm-stack/n8n) - Outil de détection créé : o29GCLVxxAySjMMe "Cleaning : Lister Suivis sans miroir Creator" (read-only, pagination par page_token pour dépasser le plafond de 2000 records de l'API Zoho, le page_token du 1er appel doit rester undefined). Dernier run : 4242 Suivis scannés, 246 sans ID_Zoho_Creator, 5 lots de 50. La liste est dans l'output du nœud Filtrer sans miroir, re-générable à tout moment - Outil de recréation prêt et testé : tdr6E05fp8ylMQVK "Cleaning : Recréer les miroirs Suivis" (mode analyse par défaut, ne JAMAIS committer executer). Test analyse sur 5 = 5 à créer, 0 skip. Test executer sur 3 (790258000013385110, 790258000013225037, 790258000011934127) = 3 miroirs créés, 0 échec - RESTE A FAIRE lundi : (1) valider l'idempotence en relançant executer sur les 3 après 10 min (lag d'indexation Creator), attendu crees=0 ; (2) dérouler les 246 par lots de 50 en mode executer dans l'UI n8n, en attendant environ 10 min entre chaque lot (anti-429), en repartant d'une liste fraîche via o29GCLVxxAySjMMe ; (3) contrôle final : re-exécuter o29GCLVxxAySjMMe, le sans_miroir doit tomber à environ 0 - Exécution manuelle dans l'UI n8n uniquement (le MCP n8n Proactif ne peut pas lancer ces workflows, availableInMCP off). Toujours vérifier côté Creator ET CRM après un lot : le code 3000 seul n'est pas une preuve
- Suite de la réunion de cadrage du 2026-07-16 : migration du suivi de « la 10 » depuis l'outil « Arc en ciel » vers Zoho CRM. Engagement pris en séance de pricer tout le backlog, en vue d'une réunion de priorisation où le client choisira quoi développer. - Livrables déjà produits (transcription Whisper + analyse) à la racine du workspace (C:/Users/weasy/GitHub/) : compte-rendu « Réunion Zoho 2026-07-16 - Compte-rendu et taches.md » (backlog complet avec statuts scope / à chiffrer / déjà live), plus le transcript brut et le transcript horodaté. - Chiffrer chaque item et le présenter par tâche dans l'email, avec le prix, pour permettre au client de prioriser. Familles du backlog : droits et accès formateurs (granularité par champ, retrait d'accès des remplaçants, formateurs secondaires), gestion des cours (heures max avec blocage, blocage après la date de fin, champs d'objectifs structurés), séances et salles (interdire salle sans séance, suppression de séance, libération auto via statut « stand by », dashboard et alertes), suivi pédagogique (champs obligatoires, rappel auto 3 jours après, affichage limité au type de cours), absences (commentaire obligatoire si absent, notification email instantanée avec le commentaire), pilotage (champs de suivi dates rapport/devis/décision AI, dashboards, exports CSV/Excel/PDF, rappel 2 semaines avant la fin de décision). - Contacts Proactif : Anna (gestion des mandats), Virginie et Dominique (peuvent réaliser certains dashboards et le blueprint). Accès des formateurs à la fiche du jeune (numéro AVS, adresse) à valider avec Lidio. - En attente d'Anna avant de finaliser le chiffrage : liste des champs visibles / modifiables par les formateurs, et liste des champs du suivi pédagogique (obligatoires ou non). - Pour reprendre tout le contexte : id de session Claude Code 2fd35f95-546f-40d4-830d-ef728faa3a3a
- V1.1 (4e critère métier en terme doux jobSpread=30, statut malade, gestion 100 % UI par Carole sans import CSV) construite et vérifiée (48 tests unitaires + smoke API + smoke navigateur), sur la brancheplan-2-metier-malade-uijusqu'au commitae360c1, pas encore en prod - Migration sur la base vivante (compte ExecEd viacf-execed; D1 déjà provisionnée id06bbd47f..., donc ALTER/CREATE et pas recréation) :npx wrangler d1 execute emba-groupe --remote --file=migrations/001-metier-malade.sql, vérifierPRAGMA table_info(participant)(colonnes metier_id et malade), puisnpx wrangler pages deploy public- Ensuite mergerplan-2-metier-malade-uidansmain- Optionnel pour le go-live Carole : retirer la mention "démo" du header et le bouton "Charger un exemple" ; le fichier.dev.vars(DEV_EMAIL local bidon, gitignoré) est à laisser ou supprimer - Réf : docs/superpowers/specs/2026-07-24-emba-groupe-v1_1-metier-malade.md et docs/superpowers/plans/2026-07-24-emba-groupe-v1_1-metier-malade.md
- Implémentation T1 à T10 du plan Cerveau MJ V1 (narration/arbitrage) terminée et poussée sur master (origin/master à 5ac1b70 le 2026-06-22) : moteur de règles, boucle LLM/outils, client Anthropic, CLI de playtest. 130 tests sur 130 hors-ligne verts, typecheck propre, revue finale sans finding bloquant. - Reste le seul test non automatisable : le playtest avec le vrai LLM. Poser ANTHROPIC_API_KEY dans la session sans jamais la mettre dans le repo (variable d'environnement PowerShell de session ou variable User Windows), puis lancer npm run play depuis C:\Users\weasy\GitHub\dnd. - À vérifier : le MJ pose la scène du village en français, fait jouer l'enquête, déclenche le combat dans la cave, joue les gobelins seul, conclut ; relever coût et latence par tour (affichés) pour valider les hypothèses de la section 7 du spec. Modèle par défaut claude-opus-4-8. - Optionnel et différé (noté dans dnd/.superpowers/sdd/progress.md) : passe de durcissement de 3 tests golden (ajouter expect sur le role avant les if de narrowing dans gm, anthropic et e2e ; asserter le contenu de providerRaw, max_tokens et thinking dans anthropic.test).
- Itération conformité/compétences/absences terminée et mergée dans master le 2026-07-06 (commit c4aeb93, 79/79 tests verts, re-review et smoke E2E navigateur complets) - Objectif : valider avec Réb le paradigme postes cycliques fixes et les nouveautés (majorations préréglage Vaud, substituabilité des rôles, min senior, absences en période, compteur annuel nuit) sur un vrai cas hospitalier, pas des données de démo - Lancement local : cd poc puis .venv/Scripts/python server.py, http://localhost:8000 ; état dans le navigateur, boutons Exporter/Importer JSON pour préparer et sauvegarder le scénario - Si une démo hébergée est utile pour la session : poc/DEPLOY.md (Dockerfile prêt)
- Repolm-presentation(slides.lausanne.marketing) : refonte chrome + nouveaux layouts en cours - Problème ouvert : en mode fenêtré, la slide vit dans une card 16:9 (.deck-stage) qui laisse des bandes externes entre la card et le chrome (menu hamburger haut-gauche, toolbar haut-droite Télécharger PDF + Présentation, footer flottant bas avec flèches prev/next + counter). Ni le bg blanc ni le bg gris#F4F5F7n'a convenu au client - Dernière tentative pushée (commit3a75e8c,feat(deck): body bg suit la couleur du slide courant) : body bg adapté dynamiquement via JS sur l'event Revealslidechangedqui litgetComputedStyle(slide).backgroundColoret l'applique au body (transition 0.4s ease). Validation prod interrompue par l'utilisateur : à vérifier visuellement - À faire : (1) confirmer ou pivoter sur le rendu body-bg dynamique (alternatives : effet cinéma noir uniforme, gradient, distortion 16:9 contrôlée pour faire fill total), (2) continuer en parallèle l'enrichissement du catalogue layouts (fact, image-left/right, two-cols, two-cols-header, iframe inspirés de Slidev) - Fichiers clés :src/layouts/Deck.astro(init Reveal + listeners menu/toolbar/TOC + body bg dynamique),src/styles/slides.css(chrome flottant + deck-stage + fullscreen),src/components/slides/{Cover,Section,Closing,ImageGrid,Default}.astro,src/content/presentations/template.mdx(catalogue) etcrm-data-automation.mdx- URLs de validation : https://slides.lausanne.marketing/p/template (catalogue Cover + Section + ImageGrid 2/3/4/5 + Closing) et https://slides.lausanne.marketing/p/crm-data-automation (deck Jour 1 + transitions Jours 2-3 vers contenus à rédiger en plan v4) - État global : plan v3 (12 modules de contenu) mergé. Plan v4 hors-scope = rédaction complète du deck CRM Data Auto sur 3 jours
- Soumettre un formulaire Inscription Fide en anglais (workflowdadrKh6ARFwRB6h1) - Vérifier dans le record Inscription Zoho que les paires de champs FR/EN sont bien remplies côte à côte (ex:annee_scolaire+School_years,Statut_du_s_jour+Residence_status,Pourquoi_fide+Why_fide, etc.) - Vérifier queDisability_list(multiselect) reçoit bien un array d'éléments anglais ethandicap_listeun array d'éléments français - Vérifier quelangueMaternelleetlieuTestont la même valeur dans les 2 colonnes (pass-through) - Vérifier que les Yes/No (analphabete,testFideAvant,handicap,coursFrancais) sont bien traduits inline - Si une valeur EN remonte non traduite alors qu'elle devrait l'être, ajouter la ligne manquante dans la DataTable n8ninscriptionFide(IDo6tDTeSch23fnAXc)
- Contexte : commitb2cbe75: Aggregate Data litCaisse_numero+Caisse_emaildepuis le webhook (champs résolus du lookupCaisse_de_chomagesur Inscription), Fill PDF utilise ces nouveaux champs pour 1.141 et 1.65, fallback gracieux si lookup vide (champs PDF vides + warning loggué) - Champ texte legacyCaisse_de_ch_mage(id790258000008737551) supprimé côté Zoho Inscriptions - Aucune Deluge ne pousse actuellement vers/attestation-mmt-created(vérifié via MCP : workflow rule "All, Attestations, Créée" appelle uniquementinitPresencesJournalieres) - 3 options de test : - A : curl/Postman avec payload incluantinscriptionCaisseChomageNumero+inscriptionCaisseChomageEmail- B : "Execute workflow" depuis l'UI n8n avec payload mocké - C : créer d'abord la DelugegenerateAttestationViaN8n(specn8n/docs/superpowers/specs/2026-04-30-mmt-feedback-integration-design.md) puis test E2E via futur bouton "Régénérer PDF" sur Attestation - Vérifier : champs PDF1.141(numéro caisse) et1.65(email caisse, page 3 Adressblatt) remplis quand lookup rempli, vides + warning quand lookup vide - Fichiers :n8n/clients/proactif/mmt/fill-pdf.js,n8n/clients/proactif/workflows/h13NHQJauBZLfhqL.json
- Module Zoho créé :Contacts_organisateur_MMT(id790258000009013676), label UI = "Référent" (lookup versOrganisateurs) - Records à créer (prérequis : 2 recordsOrganisateursKim + Proactif.ch créés au préalable) : - Kim → Boris Hoogeveen Easton,Cours_types = [Tous]- Proactif → Jenna Randria,Cours_types = [PAP, CV Express]- Proactif → Virginie Thomas,Cours_types = [PLA-BUR, INI]- Proactif → Boris Hoogeveen Easton,Cours_types = [COV]- Données complètes dans le spec :n8n/docs/superpowers/specs/2026-04-30-mmt-feedback-integration-design.md- Bloque : modif Deluge webhook MMT + modif workflow n8nh13NHQJauBZLfhqL(workflow Attestation MMT) - Le MCP Proactif n'expose pascreateRecords→ saisie manuelle UI (option A retenue)
- Pages concernées : accueil, à propos, contact, services, références, consultant
- Exemples : consultant web, consultant stratégie digitale, consultant IA - Contexte : migré depuis lm/docs/TODO.md, les pages agence-web locales sont terminées (PR #7 mergée)
- WorkflowanJN30oMb0KclJ0Lactif, branche MOS ajoutée au SubFlow Create Invoice (statut : en cours) - Configurer le webhook Zoho (bouton custom ou workflow rule sur inscription MOS) pour déclencher la facture depuis le CRM - Tester de bout en bout avec une inscription MOS réelle - Vérifier la génération PDF (template MOS dans le SubFlow Create Invoice) - Vérifier que les montants Currency sont remplis (MontantTotal, MontantTotalTTC) - AdapterinvoiceObjectsi besoin (actuellement "MOS Excel Expert")
- Objectif : déplacer la composition du message des nodes Outlook n8n vers Zoho pour les workflows Fide concernés
- Présenter les 4 services LM : Stratégie digitale, CRM & Automation, IA & Agents, Site web - Positionner l'adresse du destinataire dans la fenêtre d'enveloppe (norme suisse, à gauche) pour la détection automatique par Pingen
- Déjà fait : test manuel du workflow avec une date passée connue (jour avec des inscriptions VD) - Reste : vérifier le parsing des noms depuis les messages SOGC, vérifier le rendu du PDF (mise en page et données), envoyer une lettre de test via Pingen (staging si dispo), puis activer en production - Prérequis : créer les credentials Zefix dans n8n (accès API reçu)