{
  "name": "Collecte du dossier de preuves Qualiopi (questionnaires a chaud et a froid)",
  "nodes": [
    {
      "id": "ddf69f66-79ee-4216-a68c-d3f71a168a28",
      "name": "Note sessions",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        -460,
        -420
      ],
      "parameters": {
        "color": 4,
        "width": 520,
        "height": 280,
        "content": "## 1. Onglet Sessions (Google Sheets)\n\n`id_session` | `titre_formation` | `date_fin` | `nom_apprenant` | `email_apprenant` | `email_commanditaire` | `questionnaire_chaud_envoye_le` | `questionnaire_froid_envoye_le`\n\nA chaud : J+1 apres la fin de session. A froid : J+90 (indicateurs 30 et 31 du referentiel Qualiopi)."
      },
      "typeVersion": 1
    },
    {
      "id": "64607926-2991-4539-afde-ac1e0ccaeac0",
      "name": "Note reponses",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        -460,
        140
      ],
      "parameters": {
        "color": 3,
        "width": 520,
        "height": 280,
        "content": "## 2. Reception des reponses\n\n`POST /qualiopi-reponse` depuis votre formulaire (Google Forms, Tally, Typeform, formulaire maison) :\n\n`{ id_session, type, email_apprenant, notes: { contenu, animation, organisation, atteinte_objectifs }, recommandation, commentaire }`\n\nUne note < 3/5 declenche une alerte au referent qualite (indicateur 32 - reclamations)."
      },
      "typeVersion": 1
    },
    {
      "id": "cca62d51-dc9d-4a55-a6d7-069a8972c712",
      "name": "Note archivage",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        -460,
        700
      ],
      "parameters": {
        "color": 5,
        "width": 520,
        "height": 260,
        "content": "## 3. Archivage mensuel\n\nLe 1er de chaque mois, toutes les reponses sont exportees en CSV et deposees sur votre espace d'archivage (Drive, S3, GED, NAS).\n\nC'est ce fichier horodate que vous presentez a l'auditeur : une preuve unique, datee et exhaustive."
      },
      "typeVersion": 1
    },
    {
      "id": "af0734a3-0b24-47b2-af48-a595be0174f0",
      "name": "Chaque jour a 9h",
      "type": "n8n-nodes-base.scheduleTrigger",
      "position": [
        -420,
        -100
      ],
      "parameters": {
        "rule": {
          "interval": [
            {
              "field": "cronExpression",
              "expression": "0 9 * * *"
            }
          ]
        }
      },
      "typeVersion": 1.2
    },
    {
      "id": "3c05c326-7889-4fe7-a066-6068d1d7f005",
      "name": "Lire les sessions terminees",
      "type": "n8n-nodes-base.googleSheets",
      "position": [
        -200,
        -100
      ],
      "parameters": {
        "options": {},
        "sheetName": {
          "__rl": true,
          "mode": "name",
          "value": "Sessions"
        },
        "documentId": {
          "__rl": true,
          "mode": "id",
          "value": "REMPLACER_PAR_ID_DU_GOOGLE_SHEET"
        }
      },
      "typeVersion": 4.5
    },
    {
      "id": "3ce7cbba-569a-42f3-aef0-e98ffcac7685",
      "name": "Determiner les questionnaires a envoyer",
      "type": "n8n-nodes-base.code",
      "position": [
        20,
        -100
      ],
      "parameters": {
        "jsCode": "// Determine les questionnaires a chaud (J+1) et a froid (J+90) a envoyer.\nconst DELAI_CHAUD = 1;\nconst DELAI_FROID = 90;\nconst BASE_FORMULAIRE = 'https://votre-of.fr/questionnaire';\n\nconst maintenant = new Date();\nconst sortie = [];\n\nfor (const item of $input.all()) {\n  const l = item.json;\n  if (!l.email_apprenant) continue;\n\n  const fin = new Date(l.date_fin);\n  if (isNaN(fin.getTime())) continue;\n\n  const jours = Math.floor((maintenant - fin) / 86400000);\n  const dejaChaud = Boolean(String(l.questionnaire_chaud_envoye_le || '').trim());\n  const dejaFroid = Boolean(String(l.questionnaire_froid_envoye_le || '').trim());\n\n  let type = null;\n  if (!dejaChaud && jours >= DELAI_CHAUD) type = 'chaud';\n  else if (dejaChaud && !dejaFroid && jours >= DELAI_FROID) type = 'froid';\n  if (!type) continue;\n\n  const lien =\n    BASE_FORMULAIRE +\n    '?session=' + encodeURIComponent(l.id_session) +\n    '&type=' + type +\n    '&email=' + encodeURIComponent(l.email_apprenant);\n\n  sortie.push({\n    json: {\n      ...l,\n      type_questionnaire: type,\n      jours_depuis_fin: jours,\n      lien_questionnaire: lien,\n      envoye_le: maintenant.toISOString(),\n    },\n  });\n}\n\nreturn sortie;"
      },
      "typeVersion": 2
    },
    {
      "id": "fc348754-1414-41e8-a706-f408b932054b",
      "name": "A chaud ou a froid ?",
      "type": "n8n-nodes-base.switch",
      "position": [
        240,
        -100
      ],
      "parameters": {
        "rules": {
          "values": [
            {
              "conditions": {
                "options": {
                  "version": 2,
                  "leftValue": "",
                  "caseSensitive": true,
                  "typeValidation": "loose"
                },
                "combinator": "and",
                "conditions": [
                  {
                    "id": "245b4f0c-a289-4440-ac0c-45388f2622a9",
                    "operator": {
                      "type": "string",
                      "operation": "equals"
                    },
                    "leftValue": "={{ $json.type_questionnaire }}",
                    "rightValue": "chaud"
                  }
                ]
              },
              "renameOutput": true,
              "outputKey": "A chaud"
            },
            {
              "conditions": {
                "options": {
                  "version": 2,
                  "leftValue": "",
                  "caseSensitive": true,
                  "typeValidation": "loose"
                },
                "combinator": "and",
                "conditions": [
                  {
                    "id": "ee89e9ee-a133-462b-a7c1-c97fb3b84678",
                    "operator": {
                      "type": "string",
                      "operation": "equals"
                    },
                    "leftValue": "={{ $json.type_questionnaire }}",
                    "rightValue": "froid"
                  }
                ]
              },
              "renameOutput": true,
              "outputKey": "A froid"
            }
          ]
        },
        "options": {
          "looseTypeValidation": true
        }
      },
      "typeVersion": 3.2
    },
    {
      "id": "d7e5db5f-c5d6-41d5-a307-2708ae44d7ce",
      "name": "Questionnaire a chaud",
      "type": "n8n-nodes-base.set",
      "position": [
        460,
        -220
      ],
      "parameters": {
        "options": {},
        "assignments": {
          "assignments": [
            {
              "id": "57d819ff-82b8-482e-a1b2-b22846126599",
              "name": "objet_questionnaire",
              "type": "string",
              "value": "=Votre avis sur la formation {{ $json.titre_formation }}"
            },
            {
              "id": "fbed99db-4594-45fc-ab8f-061b7a6a4e19",
              "name": "corps_questionnaire",
              "type": "string",
              "value": "=<p>Bonjour {{ $json.nom_apprenant }},</p><p>Vous venez de terminer la formation <strong>{{ $json.titre_formation }}</strong>. Votre retour nous aide &agrave; am&eacute;liorer nos prestations et fait partie de notre d&eacute;marche qualit&eacute; certifi&eacute;e.</p><p>Le questionnaire prend 2 minutes :</p><p><a href=\"{{ $json.lien_questionnaire }}\">R&eacute;pondre au questionnaire de satisfaction</a></p><p>Merci pour votre temps.</p>"
            }
          ]
        },
        "includeOtherFields": true
      },
      "typeVersion": 3.4
    },
    {
      "id": "aa65bdd8-0461-40ef-a739-a406f8dd7fed",
      "name": "Questionnaire a froid",
      "type": "n8n-nodes-base.set",
      "position": [
        460,
        -40
      ],
      "parameters": {
        "options": {},
        "assignments": {
          "assignments": [
            {
              "id": "fe4c053b-1c7a-4b80-a91b-a89150fd0ee2",
              "name": "objet_questionnaire",
              "type": "string",
              "value": "=3 mois apres : quel impact de la formation {{ $json.titre_formation }} ?"
            },
            {
              "id": "009e2052-7988-4292-a25a-065534612dbb",
              "name": "corps_questionnaire",
              "type": "string",
              "value": "=<p>Bonjour {{ $json.nom_apprenant }},</p><p>Vous avez suivi la formation <strong>{{ $json.titre_formation }}</strong> il y a environ 3 mois. Nous souhaitons mesurer ce que vous en avez concr&egrave;tement mis en pratique.</p><p><a href=\"{{ $json.lien_questionnaire }}\">R&eacute;pondre au questionnaire d'impact</a></p><p>Vos r&eacute;ponses alimentent directement l'am&eacute;lioration de nos programmes.</p>"
            }
          ]
        },
        "includeOtherFields": true
      },
      "typeVersion": 3.4
    },
    {
      "id": "9e2522c3-6e6e-4d85-a274-7cdc91e2c860",
      "name": "Fusionner les envois",
      "type": "n8n-nodes-base.merge",
      "position": [
        680,
        -100
      ],
      "parameters": {
        "numberInputs": 2
      },
      "typeVersion": 3
    },
    {
      "id": "9b263a49-aad1-425d-a504-edbe3928da4d",
      "name": "Envoyer le questionnaire",
      "type": "n8n-nodes-base.gmail",
      "position": [
        900,
        -100
      ],
      "parameters": {
        "sendTo": "={{ $json.email_apprenant }}",
        "subject": "={{ $json.objet_questionnaire }}",
        "message": "={{ $json.corps_questionnaire }}",
        "options": {
          "appendAttribution": false
        },
        "emailType": "html",
        "resource": "message",
        "operation": "send"
      },
      "typeVersion": 2.1,
      "webhookId": "711dd715-417a-4e51-af21-2e1c73dcd3bb"
    },
    {
      "id": "a961768b-b245-406a-aa6b-e0b20fac3116",
      "name": "Tracer l'envoi du questionnaire",
      "type": "n8n-nodes-base.googleSheets",
      "position": [
        1120,
        -100
      ],
      "parameters": {
        "columns": {
          "value": {
            "id_session": "={{ $json.id_session }}",
            "email_apprenant": "={{ $json.email_apprenant }}",
            "questionnaire_chaud_envoye_le": "={{ $json.type_questionnaire === 'chaud' ? $json.envoye_le : $json.questionnaire_chaud_envoye_le }}",
            "questionnaire_froid_envoye_le": "={{ $json.type_questionnaire === 'froid' ? $json.envoye_le : $json.questionnaire_froid_envoye_le }}"
          },
          "schema": [
            {
              "id": "id_session",
              "type": "string",
              "display": true,
              "removed": false,
              "required": false,
              "displayName": "id_session",
              "defaultMatch": false,
              "canBeUsedToMatch": true
            },
            {
              "id": "email_apprenant",
              "type": "string",
              "display": true,
              "removed": false,
              "required": false,
              "displayName": "email_apprenant",
              "defaultMatch": false,
              "canBeUsedToMatch": true
            },
            {
              "id": "questionnaire_chaud_envoye_le",
              "type": "string",
              "display": true,
              "removed": false,
              "required": false,
              "displayName": "questionnaire_chaud_envoye_le",
              "defaultMatch": false,
              "canBeUsedToMatch": true
            },
            {
              "id": "questionnaire_froid_envoye_le",
              "type": "string",
              "display": true,
              "removed": false,
              "required": false,
              "displayName": "questionnaire_froid_envoye_le",
              "defaultMatch": false,
              "canBeUsedToMatch": true
            }
          ],
          "mappingMode": "defineBelow",
          "matchingColumns": [
            "id_session",
            "email_apprenant"
          ]
        },
        "options": {},
        "operation": "appendOrUpdate",
        "sheetName": {
          "__rl": true,
          "mode": "name",
          "value": "Sessions"
        },
        "documentId": {
          "__rl": true,
          "mode": "id",
          "value": "REMPLACER_PAR_ID_DU_GOOGLE_SHEET"
        }
      },
      "typeVersion": 4.5
    },
    {
      "id": "bea842be-9753-493b-a34d-bce7df999d76",
      "name": "Reponse au questionnaire",
      "type": "n8n-nodes-base.webhook",
      "position": [
        20,
        200
      ],
      "parameters": {
        "path": "qualiopi-reponse",
        "options": {},
        "httpMethod": "POST",
        "responseMode": "responseNode"
      },
      "typeVersion": 2,
      "webhookId": "1d121f0e-5d67-4932-a3be-f4b5dd9d2ad6",
      "onError": "continueRegularOutput"
    },
    {
      "id": "6347aff5-53e7-4182-a7aa-8d6ff8c5ae69",
      "name": "Calculer les indicateurs de satisfaction",
      "type": "n8n-nodes-base.code",
      "position": [
        240,
        200
      ],
      "parameters": {
        "jsCode": "// Normalise la reponse et calcule les indicateurs du dossier de preuves.\nconst SEUIL_ALERTE = 3;   // note sur 5 en dessous de laquelle on alerte\n\nreturn $input.all().map((item) => {\n  const body = item.json.body || item.json;\n  const notes = body.notes || {};\n\n  const valeurs = Object.values(notes)\n    .map((v) => Number(v))\n    .filter((v) => !isNaN(v));\n\n  const moyenne = valeurs.length\n    ? Math.round((valeurs.reduce((a, b) => a + b, 0) / valeurs.length) * 100) / 100\n    : null;\n\n  const reco = Number(body.recommandation);\n  const categorieNps = isNaN(reco) ? 'non renseigne' : reco >= 9 ? 'promoteur' : reco >= 7 ? 'passif' : 'detracteur';\n\n  return {\n    json: {\n      id_session: body.id_session || '',\n      type: body.type || 'chaud',\n      email_apprenant: body.email_apprenant || '',\n      note_contenu: notes.contenu || '',\n      note_animation: notes.animation || '',\n      note_organisation: notes.organisation || '',\n      note_objectifs: notes.atteinte_objectifs || '',\n      note_moyenne: moyenne,\n      recommandation: isNaN(reco) ? '' : reco,\n      categorie_nps: categorieNps,\n      commentaire: body.commentaire || '',\n      insatisfaction: moyenne !== null && moyenne < SEUIL_ALERTE,\n      recu_le: new Date().toISOString(),\n    },\n  };\n});"
      },
      "typeVersion": 2
    },
    {
      "id": "3fc84ecb-897d-45bc-abdc-c50a18f7615a",
      "name": "Archiver la reponse",
      "type": "n8n-nodes-base.googleSheets",
      "position": [
        460,
        200
      ],
      "parameters": {
        "columns": {
          "value": {
            "id_session": "={{ $json.id_session }}",
            "type": "={{ $json.type }}",
            "email_apprenant": "={{ $json.email_apprenant }}",
            "note_contenu": "={{ $json.note_contenu }}",
            "note_animation": "={{ $json.note_animation }}",
            "note_organisation": "={{ $json.note_organisation }}",
            "note_objectifs": "={{ $json.note_objectifs }}",
            "note_moyenne": "={{ $json.note_moyenne }}",
            "recommandation": "={{ $json.recommandation }}",
            "categorie_nps": "={{ $json.categorie_nps }}",
            "commentaire": "={{ $json.commentaire }}",
            "recu_le": "={{ $json.recu_le }}"
          },
          "schema": [
            {
              "id": "id_session",
              "type": "string",
              "display": true,
              "removed": false,
              "required": false,
              "displayName": "id_session",
              "defaultMatch": false,
              "canBeUsedToMatch": true
            },
            {
              "id": "type",
              "type": "string",
              "display": true,
              "removed": false,
              "required": false,
              "displayName": "type",
              "defaultMatch": false,
              "canBeUsedToMatch": true
            },
            {
              "id": "email_apprenant",
              "type": "string",
              "display": true,
              "removed": false,
              "required": false,
              "displayName": "email_apprenant",
              "defaultMatch": false,
              "canBeUsedToMatch": true
            },
            {
              "id": "note_contenu",
              "type": "string",
              "display": true,
              "removed": false,
              "required": false,
              "displayName": "note_contenu",
              "defaultMatch": false,
              "canBeUsedToMatch": true
            },
            {
              "id": "note_animation",
              "type": "string",
              "display": true,
              "removed": false,
              "required": false,
              "displayName": "note_animation",
              "defaultMatch": false,
              "canBeUsedToMatch": true
            },
            {
              "id": "note_organisation",
              "type": "string",
              "display": true,
              "removed": false,
              "required": false,
              "displayName": "note_organisation",
              "defaultMatch": false,
              "canBeUsedToMatch": true
            },
            {
              "id": "note_objectifs",
              "type": "string",
              "display": true,
              "removed": false,
              "required": false,
              "displayName": "note_objectifs",
              "defaultMatch": false,
              "canBeUsedToMatch": true
            },
            {
              "id": "note_moyenne",
              "type": "string",
              "display": true,
              "removed": false,
              "required": false,
              "displayName": "note_moyenne",
              "defaultMatch": false,
              "canBeUsedToMatch": true
            },
            {
              "id": "recommandation",
              "type": "string",
              "display": true,
              "removed": false,
              "required": false,
              "displayName": "recommandation",
              "defaultMatch": false,
              "canBeUsedToMatch": true
            },
            {
              "id": "categorie_nps",
              "type": "string",
              "display": true,
              "removed": false,
              "required": false,
              "displayName": "categorie_nps",
              "defaultMatch": false,
              "canBeUsedToMatch": true
            },
            {
              "id": "commentaire",
              "type": "string",
              "display": true,
              "removed": false,
              "required": false,
              "displayName": "commentaire",
              "defaultMatch": false,
              "canBeUsedToMatch": true
            },
            {
              "id": "recu_le",
              "type": "string",
              "display": true,
              "removed": false,
              "required": false,
              "displayName": "recu_le",
              "defaultMatch": false,
              "canBeUsedToMatch": true
            }
          ],
          "mappingMode": "defineBelow",
          "matchingColumns": []
        },
        "options": {},
        "operation": "append",
        "sheetName": {
          "__rl": true,
          "mode": "name",
          "value": "Reponses"
        },
        "documentId": {
          "__rl": true,
          "mode": "id",
          "value": "REMPLACER_PAR_ID_DU_GOOGLE_SHEET"
        }
      },
      "typeVersion": 4.5
    },
    {
      "id": "a92928b7-1c78-42e1-a7a5-a576e876e829",
      "name": "Insatisfaction detectee ?",
      "type": "n8n-nodes-base.if",
      "position": [
        680,
        200
      ],
      "parameters": {
        "options": {},
        "conditions": {
          "options": {
            "version": 2,
            "leftValue": "",
            "caseSensitive": true,
            "typeValidation": "loose"
          },
          "combinator": "and",
          "conditions": [
            {
              "id": "a7686cae-9fff-44d6-a6c9-b8720f05e233",
              "operator": {
                "type": "boolean",
                "operation": "true",
                "singleValue": true
              },
              "leftValue": "={{ $json.insatisfaction }}",
              "rightValue": ""
            }
          ]
        },
        "looseTypeValidation": true
      },
      "typeVersion": 2.2
    },
    {
      "id": "3cad77e1-6231-4726-abaf-3e5333f816a2",
      "name": "Alerter le referent qualite",
      "type": "n8n-nodes-base.gmail",
      "position": [
        900,
        100
      ],
      "parameters": {
        "sendTo": "qualite@votre-of.fr",
        "subject": "=Insatisfaction signalee - session {{ $json.id_session }}",
        "message": "=<p>Une r&eacute;ponse au questionnaire <strong>{{ $json.type }}</strong> de la session {{ $json.id_session }} affiche une moyenne de <strong>{{ $json.note_moyenne }}/5</strong>.</p><p><strong>Commentaire :</strong> {{ $json.commentaire }}</p><p>Conform&eacute;ment a l'indicateur 32, cette remont&eacute;e doit &ecirc;tre trait&eacute;e et trac&eacute;e dans le registre des r&eacute;clamations.</p>",
        "options": {
          "appendAttribution": false
        },
        "emailType": "html",
        "resource": "message",
        "operation": "send"
      },
      "typeVersion": 2.1,
      "webhookId": "48c7a3bd-e2ef-42f1-a60a-3c2b24f00e4d"
    },
    {
      "id": "81bdddb1-e480-4667-a110-a5ca6ade8fe5",
      "name": "Accuser reception de la reponse",
      "type": "n8n-nodes-base.respondToWebhook",
      "position": [
        1120,
        200
      ],
      "parameters": {
        "options": {},
        "respondWith": "json",
        "responseBody": "={{ JSON.stringify({ status: 'ok', message: 'Merci pour votre retour' }) }}"
      },
      "typeVersion": 1.1
    },
    {
      "id": "0cfd6cfd-bf4f-4748-a136-679689ddb040",
      "name": "Archivage mensuel",
      "type": "n8n-nodes-base.scheduleTrigger",
      "position": [
        -420,
        560
      ],
      "parameters": {
        "rule": {
          "interval": [
            {
              "field": "cronExpression",
              "expression": "0 5 1 * *"
            }
          ]
        }
      },
      "typeVersion": 1.2
    },
    {
      "id": "fdf0c2ff-6b4a-4371-ab3a-a68bb4416a18",
      "name": "Lire toutes les reponses",
      "type": "n8n-nodes-base.googleSheets",
      "position": [
        -200,
        560
      ],
      "parameters": {
        "options": {},
        "sheetName": {
          "__rl": true,
          "mode": "name",
          "value": "Reponses"
        },
        "documentId": {
          "__rl": true,
          "mode": "id",
          "value": "REMPLACER_PAR_ID_DU_GOOGLE_SHEET"
        }
      },
      "typeVersion": 4.5
    },
    {
      "id": "2048f6b4-c472-4561-a018-57d22ccc6295",
      "name": "Construire l'index du dossier de preuves",
      "type": "n8n-nodes-base.code",
      "position": [
        20,
        560
      ],
      "parameters": {
        "jsCode": "// Consolide les reponses du mois ecoule et calcule les indicateurs Qualiopi.\nconst maintenant = new Date();\nconst debutMois = new Date(maintenant.getFullYear(), maintenant.getMonth() - 1, 1);\nconst finMois = new Date(maintenant.getFullYear(), maintenant.getMonth(), 0, 23, 59, 59);\n\nconst lignes = $input.all().map((i) => i.json).filter((l) => {\n  const d = new Date(l.recu_le);\n  return !isNaN(d.getTime()) && d >= debutMois && d <= finMois;\n});\n\nconst notes = lignes.map((l) => Number(l.note_moyenne)).filter((n) => !isNaN(n));\nconst moyenne = notes.length ? Math.round((notes.reduce((a, b) => a + b, 0) / notes.length) * 100) / 100 : 0;\n\nconst promoteurs = lignes.filter((l) => l.categorie_nps === 'promoteur').length;\nconst detracteurs = lignes.filter((l) => l.categorie_nps === 'detracteur').length;\nconst nps = lignes.length ? Math.round(((promoteurs - detracteurs) / lignes.length) * 100) : 0;\n\nconst periode = debutMois.toISOString().slice(0, 7);\n\nconst entete = {\n  periode,\n  nb_reponses: lignes.length,\n  nb_chaud: lignes.filter((l) => l.type === 'chaud').length,\n  nb_froid: lignes.filter((l) => l.type === 'froid').length,\n  satisfaction_moyenne: moyenne,\n  nps,\n  genere_le: maintenant.toISOString(),\n};\n\n// Premiere ligne = synthese, puis le detail (une ligne par reponse).\nreturn [{ json: { ...entete, ligne: 'SYNTHESE' } }].concat(\n  lignes.map((l) => ({ json: { ...entete, ligne: 'DETAIL', ...l } }))\n);"
      },
      "typeVersion": 2
    },
    {
      "id": "43509600-d382-49e1-ac78-b3c57c7b6ad0",
      "name": "Exporter en CSV",
      "type": "n8n-nodes-base.convertToFile",
      "position": [
        240,
        560
      ],
      "parameters": {
        "options": {
          "fileName": "=dossier-preuves-{{ $json.periode }}.csv"
        },
        "operation": "csv"
      },
      "typeVersion": 1.1
    },
    {
      "id": "d9ad5780-889b-43d9-a022-261f48485cd1",
      "name": "Deposer l'archive",
      "type": "n8n-nodes-base.httpRequest",
      "position": [
        460,
        560
      ],
      "parameters": {
        "url": "https://votre-espace-archivage.exemple/upload",
        "method": "POST",
        "options": {},
        "sendBody": true,
        "contentType": "binaryData",
        "inputDataFieldName": "data"
      },
      "typeVersion": 4.2,
      "onError": "continueRegularOutput"
    },
    {
      "id": "c0392d85-af3a-46d7-ab52-18e3061649df",
      "name": "Notifier l'equipe qualite",
      "type": "n8n-nodes-base.gmail",
      "position": [
        680,
        560
      ],
      "parameters": {
        "sendTo": "qualite@votre-of.fr",
        "subject": "=Dossier de preuves Qualiopi - {{ $('Construire l\\'index du dossier de preuves').first().json.periode }}",
        "message": "=<p>L'archive mensuelle du dossier de preuves est disponible.</p><ul><li><strong>P&eacute;riode :</strong> {{ $('Construire l\\'index du dossier de preuves').first().json.periode }}</li><li><strong>R&eacute;ponses collect&eacute;es :</strong> {{ $('Construire l\\'index du dossier de preuves').first().json.nb_reponses }} (dont {{ $('Construire l\\'index du dossier de preuves').first().json.nb_froid }} a froid)</li><li><strong>Satisfaction moyenne :</strong> {{ $('Construire l\\'index du dossier de preuves').first().json.satisfaction_moyenne }}/5</li><li><strong>NPS :</strong> {{ $('Construire l\\'index du dossier de preuves').first().json.nps }}</li></ul><p>Indicateurs 30, 31 et 32 du r&eacute;f&eacute;rentiel national qualit&eacute;.</p>",
        "options": {
          "appendAttribution": false
        },
        "emailType": "html",
        "resource": "message",
        "operation": "send"
      },
      "typeVersion": 2.1,
      "webhookId": "af90468c-a777-4124-a107-f51645c13269"
    }
  ],
  "pinData": {},
  "connections": {
    "Chaque jour a 9h": {
      "main": [
        [
          {
            "node": "Lire les sessions terminees",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Lire les sessions terminees": {
      "main": [
        [
          {
            "node": "Determiner les questionnaires a envoyer",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Determiner les questionnaires a envoyer": {
      "main": [
        [
          {
            "node": "A chaud ou a froid ?",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "A chaud ou a froid ?": {
      "main": [
        [
          {
            "node": "Questionnaire a chaud",
            "type": "main",
            "index": 0
          }
        ],
        [
          {
            "node": "Questionnaire a froid",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Questionnaire a chaud": {
      "main": [
        [
          {
            "node": "Fusionner les envois",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Questionnaire a froid": {
      "main": [
        [
          {
            "node": "Fusionner les envois",
            "type": "main",
            "index": 1
          }
        ]
      ]
    },
    "Fusionner les envois": {
      "main": [
        [
          {
            "node": "Envoyer le questionnaire",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Envoyer le questionnaire": {
      "main": [
        [
          {
            "node": "Tracer l'envoi du questionnaire",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Reponse au questionnaire": {
      "main": [
        [
          {
            "node": "Calculer les indicateurs de satisfaction",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Calculer les indicateurs de satisfaction": {
      "main": [
        [
          {
            "node": "Archiver la reponse",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Archiver la reponse": {
      "main": [
        [
          {
            "node": "Insatisfaction detectee ?",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Insatisfaction detectee ?": {
      "main": [
        [
          {
            "node": "Alerter le referent qualite",
            "type": "main",
            "index": 0
          }
        ],
        [
          {
            "node": "Accuser reception de la reponse",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Alerter le referent qualite": {
      "main": [
        [
          {
            "node": "Accuser reception de la reponse",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Archivage mensuel": {
      "main": [
        [
          {
            "node": "Lire toutes les reponses",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Lire toutes les reponses": {
      "main": [
        [
          {
            "node": "Construire l'index du dossier de preuves",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Construire l'index du dossier de preuves": {
      "main": [
        [
          {
            "node": "Exporter en CSV",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Exporter en CSV": {
      "main": [
        [
          {
            "node": "Deposer l'archive",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Deposer l'archive": {
      "main": [
        [
          {
            "node": "Notifier l'equipe qualite",
            "type": "main",
            "index": 0
          }
        ]
      ]
    }
  },
  "active": false,
  "settings": {
    "executionOrder": "v1"
  },
  "versionId": "90095695-e07d-4bdc-a65d-62f17a3636c4",
  "meta": {
    "instanceId": "5f7c1a2b9d3e4f60a8b7c6d5e4f3021998af77bc12de34ff56aa7788bb99ccdd",
    "templateCredsSetupCompleted": true
  },
  "tags": []
}
