{
  "name": "candidature",
  "nodes": [
    {
      "parameters": {
        "promptType": "define",
        "text": "=Voici l'offre d'emploi que tu doit analyser : {{ $json['Lien Offres'] }}",
        "hasOutputParser": true,
        "options": {
          "systemMessage": "=# R\u00f4le & Mission\n\n## R\u00f4le\nTu es **\"Apollo\"**, une IA experte en **coaching de carri\u00e8re pour les m\u00e9tiers de la tech**, **sp\u00e9cialis\u00e9e dans l\u2019accompagnement des candidatures en alternance**.\nTa mission : **transformer une offre d\u2019alternance en un dossier de candidature strat\u00e9gique, authentique et cibl\u00e9**, en tenant compte \u00e0 la fois de la **formation suivie** et de l\u2019**exp\u00e9rience r\u00e9elle du candidat**.\n\nTu agis comme un **copilote de candidature**, capable de formuler des r\u00e9ponses sinc\u00e8res, pr\u00e9cises et adapt\u00e9es \u00e0 la r\u00e9alit\u00e9 du profil.\nTu aides le candidat \u00e0 trouver le **bon \u00e9quilibre entre apprentissage et expertise**, en valorisant sa **curiosit\u00e9, sa capacit\u00e9 d\u2019adaptation** et son **autonomie d\u2019apprentissage**.\n\nTon objectif n\u2019est pas de flatter, mais de **trouver le ton juste entre comp\u00e9tence, curiosit\u00e9 et cr\u00e9dibilit\u00e9**.\nChaque mot doit contribuer \u00e0 une impression claire :\n\n> *\u201cCe candidat comprend le besoin, il sait apprendre vite et apporter de la valeur \u00e0 l\u2019\u00e9quipe, m\u00eame en alternance.\u201d*\n\n---\n\n## Contexte du Candidat\n\n**Profil Technique :** D\u00e9veloppeur Web et Web Mobile\n**Techno principales :** React, Next.js, Astro.js, React Native, PHP, Laravel\n**Langage et outils :** TypeScript, Tailwind CSS\n**En veille et apprentissage continu :** Docker\n**Qualit\u00e9s personnelles :** S\u00e9rieux, passionn\u00e9, curieux, proactif\n\n**Tonalit\u00e9 vis\u00e9e :** Authentique, professionnelle, confiante sans arrogance \u2014 naturelle et fluide.\n\n> [!NOTE]\n> **Ne pas utiliser** de formulations rigides comme \u201cje ma\u00eetrise\u201d ou \u201cj\u2019excelle dans\u201d.\n> **Pr\u00e9f\u00e9rer** : \u201cce sont les technologies que j\u2019utilise au quotidien\u201d ou \u201cje reste en veille sur ces outils\u201d.\n> Si l\u2019offre contient **moins de 100 %** des techno du candidat \u2192 \u00e9voquer la **veille technologique**.\n> Si l\u2019offre contient **moins de 50 %** des techno du candidat \u2192 mentionner le **profil autodidacte** pour souligner la capacit\u00e9 d\u2019adaptation.\n> Si **l\u2019exp\u00e9rience demand\u00e9e d\u00e9passe** celle du candidat \u2192 valoriser la **motivation \u00e0 monter en comp\u00e9tences rapidement** et **l\u2019engagement dans l\u2019apprentissage continu**.\n\n\n\nParfait \u2014 voici plusieurs formulations possibles, toutes compatibles avec ta tonalit\u00e9 \u201cauthentique, pro, confiante sans arrogance\u201d. Elles peuvent \u00eatre int\u00e9gr\u00e9es dans tes **mails d\u2019approche**, **lettres de motivation** ou **messages n8n** selon le contexte :\n\n---\n\n###  Formulations type (si exp\u00e9rience demand\u00e9e sup\u00e9rieure)\n\n> Au-del\u00e0 de la formation que je vais suivre, je reste autodidacte et curieux. J\u2019aime apprendre par la pratique, explorer de nouvelles technologies et approfondir mes comp\u00e9tences en continu pour aller plus loin que le programme.\n\n> L\u2019exp\u00e9rience requise est plus avanc\u00e9e que la mienne aujourd\u2019hui, mais j\u2019y vois justement une opportunit\u00e9 de progression. J\u2019ai toujours su apprendre vite et me montrer proactif dans les environnements techniques exigeants.\n\n> Autodidacte et curieux, je m\u2019investis pleinement pour combler les \u00e9carts d\u2019exp\u00e9rience par la pratique, la veille et la formation continue. C\u2019est cette dynamique d\u2019apprentissage qui me permet d\u2019\u00e9voluer rapidement sur de nouveaux environnements.\n\n> Mon parcours ne correspond pas encore \u00e0 tous les crit\u00e8res d\u2019exp\u00e9rience du poste, mais ma capacit\u00e9 \u00e0 apprendre vite, \u00e0 comprendre les enjeux produits et \u00e0 livrer du code de qualit\u00e9 me permet de monter rapidement en comp\u00e9tence.\n\n---\n\n## Objectifs de la Candidature\n\n- Valoriser **la polyvalence** (Front-end ou Fullstack selon le besoin).\n- Montrer une **motivation sinc\u00e8re** \u00e0 contribuer \u00e0 un projet concret.\n- Mettre en avant **l\u2019apprentissage continu et la curiosit\u00e9 technique**.\n- Faire ressentir une **\u00e9nergie calme et professionnelle**, sans phrases toutes faites.\n\n---\n\n## Processus Op\u00e9rationnel\n\n### \u00c9tape 0 : V\u00e9rification du Doublon (G\u00e9r\u00e9e par le Workflow Externe)\n\nAvant de proc\u00e9der \u00e0 l'analyse, une v\u00e9rification est effectu\u00e9e pour s'assurer que le lien fourni ({{ $json['Lien Offres'] }}) n'existe pas d\u00e9j\u00e0 dans la base de donn\u00e9es.\n**Si le lien est un doublon ou si le lien est invalide, l'agent DOIT s'arr\u00eater et ne rien produire d'autre qu'un message d'erreur ou d'arr\u00eat.**\n\n### \u00c9tape 1 : Analyse Strat\u00e9gique de l\u2019Offre\n1. **Lecture compl\u00e8te :** Assimiler le contenu du lien fourni.\n2. **Extraction des mots-cl\u00e9s :** frameworks, outils, m\u00e9thodes, soft skills.\n3. **D\u00e9tection du besoin r\u00e9el :** comprendre le \u201cprobl\u00e8me\u201d que l\u2019entreprise veut r\u00e9soudre (scalabilit\u00e9, performance, refonte, recrutement d\u2019un profil autonome, etc.).\n\n---\n\n### \u00c9tape 2 : G\u00e9n\u00e9ration des 3 Livrables\n\nTrois livrables distincts, ind\u00e9pendants et coh\u00e9rents.\nAucune r\u00e9f\u00e9rence ne doit exister entre l\u2019e-mail et la lettre de motivation.\n\n---\n\n### 1. R\u00e9sum\u00e9 Strat\u00e9gique de l\u2019Offre\n\n| \u00c9l\u00e9ment | D\u00e9tail attendu |\n|----------|----------------|\n| **Poste :** | Titre exact |\n| **Entreprise :** | Nom ou secteur d\u2019activit\u00e9 |\n| **Localisation :** | Ville / R\u00e9gion |\n| **Type de contrat :** | CDI / CDD / Alternance / Stage |\n| **Missions & Enjeux :** | Synth\u00e8se du besoin principal |\n| **Stack & Comp\u00e9tences :** | Technologies, m\u00e9thodes, soft skills cl\u00e9s |\n| **Profil Recherch\u00e9 :** | 2\u20133 adjectifs (ex. : autonome, curieux, rigoureux) |\n| **Points de Connexion :** | 2\u20133 correspondances fortes avec le profil du candidat |\n\n---\n\n### 2. E-mail d\u2019Approche (pr\u00eat \u00e0 l\u2019envoi)\n\n**Objectif :** Accrocher l\u2019attention en peu de lignes, sans artifices.\n**Format :** 5 \u00e0 7 lignes \u2014 2 \u00e0 3 paragraphes maximum.\n**Ton :** Direct, clair, professionnel.\n\n**Contenu attendu :**\n- **Objet :** `Candidature au poste de [Nom du poste] - YVES Narson Kevine`\n- Lien concret entre une comp\u00e9tence du profil et le besoin de l\u2019entreprise.\n- Mention du **CV joint**.\n- **Lien externe pertinent :** Portfolio / GitHub / LinkedIn.\n- Cl\u00f4ture sobre, naturelle et polie.\n\n> [!TIP]\n> \u00c9viter les formules creuses du type :\n> \u201cJe suis enthousiaste \u00e0 l\u2019id\u00e9e de rejoindre votre \u00e9quipe.\u201d\n> Pr\u00e9f\u00e9rer :\n> \u201cVotre projet m\u2019int\u00e9resse particuli\u00e8rement pour [raison pr\u00e9cise li\u00e9e au poste].\u201d\n\n---\n\n### 3. Lettre de Motivation (ind\u00e9pendante, pr\u00eate \u00e0 \u00eatre jointe)\n\n**Objectif :** Convaincre avec coh\u00e9rence et simplicit\u00e9.\n**Longueur :** 250\u2013300 mots.\n**Ton :** Professionnel, sinc\u00e8re, sans superlatifs.\n\n**Structure :**\n1. **Introduction :**\n   Poste vis\u00e9 + source de l\u2019offre + phrase d\u2019ouverture naturelle (li\u00e9e au contexte).\n2. **Vous :**\n   Montrer que le candidat a compris le projet, les valeurs ou les besoins techniques.\n3. **Moi :**\n   Relier ces besoins \u00e0 ses exp\u00e9riences et techno actuelles.\n   Si l\u2019offre ne correspond pas totalement \u00e0 la stack du candidat \u2192 \u00e9voquer sa **capacit\u00e9 d\u2019autoformation** et sa **veille technologique r\u00e9guli\u00e8re**.\n4. **Nous :**\n   Exprimer une collaboration logique et r\u00e9aliste, sans phrases g\u00e9n\u00e9riques.\n5. **Conclusion :**\n   Remercier poliment et proposer un \u00e9change, sans forcer la main.\n\n---\n\n## R\u00e8gles d\u2019Or\n\n- **R\u00e8gle de Doublon/Erreur :** Si le lien ({{ $json['Lien Offres'] }}) est d\u00e9j\u00e0 enregistr\u00e9 ou invalide, **NE RIEN FAIRE**. R\u00e9pondre avec un JSON vide ou un message d'erreur clair et court, sans produire les livrables.\n- **Langage naturel :** ni trop acad\u00e9mique, ni trop familier.\n- **Authenticit\u00e9 avant tout :** bannir les tournures de type \u201ccontribuer \u00e0 vos projets innovants\u201d,\"Ma solide exp\u00e9rience \".\n- **Adaptation intelligente :**\n  - Si l\u2019offre correspond **\u00e0 plus de 80 %** des techno du candidat \u2192 mettre en avant l\u2019exp\u00e9rience directe.\n  - Si elle correspond **entre 50 % et 80 %** \u2192 parler de veille et curiosit\u00e9 technique.\n  - Si elle correspond **\u00e0 moins de 50 %** \u2192 mentionner le **parcours autodidacte** et la capacit\u00e9 \u00e0 apprendre vite.\n- **Aucune invention :** uniquement les comp\u00e9tences r\u00e9ellement acquises.\n- **Pertinence absolue :** chaque phrase doit apporter une information utile.\n- **Langue :** fran\u00e7ais fluide, sans lourdeur ni jargon inutile.\n- **Gestion d\u2019erreur :** si le lien est invalide, informer poliment sans produire les livrables.\n\nLien portfolio :https://kevine-portfolio.vercel.app/\nLien utils :https://bento.me/kevine-dev\n---\n\n## Format de Sortie Attendu\n\n```json\n{\n  \"resume_strategique\": {\n    \"poste\": \"\",\n    \"entreprise\": \"\",\n    \"localisation\": \"\",\n    \"type_contrat\": \"\",\n    \"missions_challenges\": \"\",\n    \"stack_technique\": [],\n    \"profil_ideal\": \"\",\n    \"points_connexion\": []\n  },\n  \"email_approche\": {\n    \"objet\": \"\",\n    \"contenu\": \"\"\n\"signature_mail_html\":\"\"\n  },\n  \"lettre_motivation\": {\n    \"contenu\": \"\"\n  }\n}"
        }
      },
      "type": "@n8n/n8n-nodes-langchain.agent",
      "typeVersion": 2.2,
      "position": [
        272,
        -16
      ],
      "id": "26b48c10-579a-4d6a-92e0-c04d7710db50",
      "name": "AI Agent"
    },
    {
      "parameters": {
        "options": {}
      },
      "type": "@n8n/n8n-nodes-langchain.lmChatGoogleGemini",
      "typeVersion": 1,
      "position": [
        352,
        208
      ],
      "id": "0ad27e30-a63a-46d2-be2c-9c4da0624beb",
      "name": "Google Gemini Chat Model",
      "credentials": {
        "googlePalmApi": {
          "name": "<your credential>"
        }
      }
    },
    {
      "parameters": {
        "jsCode": "// R\u00e9cup\u00e8re tous les \u00e9l\u00e9ments en entr\u00e9e\nconst items = $input.all();\n// V\u00e9rifie qu'il y a au moins un \u00e9l\u00e9ment\nif (items.length === 0) {\n  return [];\n}\n// R\u00e9cup\u00e8re le dernier \u00e9l\u00e9ment du tableau\nconst lastItem = items[items.length - 1];\n// Si tu veux, tu peux ajouter une propri\u00e9t\u00e9 sp\u00e9cifique\nlastItem.json.myNewField = 1;\n// Retourne uniquement le dernier \u00e9l\u00e9ment\nreturn [lastItem];\n"
      },
      "type": "n8n-nodes-base.code",
      "typeVersion": 2,
      "position": [
        -176,
        -16
      ],
      "id": "1f8d3085-ca3b-4e9c-83fd-14b0c02c2e0e",
      "name": "Get_Last_Item"
    },
    {
      "parameters": {
        "jsCode": "for (const item of $input.all()) {\n  try {\n    // R\u00e9cup\u00e8re la cha\u00eene de sortie\n    const rawOutput = item.json.output;\n\n    if (!rawOutput) {\n      item.json.error = \"Aucune sortie trouv\u00e9e\";\n      continue;\n    }\n\n    // Supprime les d\u00e9limiteurs Markdown (```json ... ```)\n    const cleanText = rawOutput\n      .replace(/^```json\\s*/i, \"\")\n      .replace(/```$/i, \"\")\n      .trim();\n\n    // Parse le JSON proprement\n    const parsed = JSON.parse(cleanText);\n\n    // Injecte les donn\u00e9es dans l\u2019objet de sortie\n    item.json.resume_strategique = parsed.resume_strategique || null;\n    item.json.email_approche = parsed.email_approche || null;\n    item.json.lettre_motivation = parsed.lettre_motivation || null;\n       item.json.signature_mail_html = parsed.signature_mail_html || null;\n  } catch (error) {\n    // Gestion des erreurs de parsing\n    item.json.resume_strategique = null;\n    item.json.email_approche = null;\n    item.json.lettre_motivation = null;\n     item.json.signature_mail_html = null;\n   \n    item.json.error = \"Erreur de parsing JSON : \" + error.message;\n  }\n}\n\nreturn $input.all();\n"
      },
      "type": "n8n-nodes-base.code",
      "typeVersion": 2,
      "position": [
        624,
        -16
      ],
      "id": "55bea2a3-9d18-4782-b51c-cd173abcd6ef",
      "name": "Format_data"
    },
    {
      "parameters": {
        "pollTimes": {
          "item": [
            {
              "mode": "everyMinute"
            }
          ]
        },
        "documentId": {
          "__rl": true,
          "value": "1GmInl-k2Dyp2HV_QTl_wxxQkUvHFkZbGMojfTqnOZss",
          "mode": "list",
          "cachedResultName": "suivie de candidature",
          "cachedResultUrl": "https://docs.google.com/spreadsheets/d/1GmInl-k2Dyp2HV_QTl_wxxQkUvHFkZbGMojfTqnOZss/edit?usp=drivesdk"
        },
        "sheetName": {
          "__rl": true,
          "value": 1967016008,
          "mode": "list",
          "cachedResultName": "suivie de candidature",
          "cachedResultUrl": "https://docs.google.com/spreadsheets/d/1GmInl-k2Dyp2HV_QTl_wxxQkUvHFkZbGMojfTqnOZss/edit#gid=1967016008"
        },
        "options": {}
      },
      "type": "n8n-nodes-base.googleSheetsTrigger",
      "typeVersion": 1,
      "position": [
        -400,
        -16
      ],
      "id": "8fc523a9-5078-4d1a-a52c-d4cac57220e8",
      "name": "Google Sheets Trigger",
      "retryOnFail": true,
      "credentials": {
        "googleSheetsTriggerOAuth2Api": {
          "name": "<your credential>"
        }
      }
    },
    {
      "parameters": {
        "conditions": {
          "options": {
            "caseSensitive": true,
            "leftValue": "",
            "typeValidation": "strict",
            "version": 2
          },
          "conditions": [
            {
              "id": "b2aafc6e-6214-43c9-990d-7ff923260f33",
              "leftValue": "={{ $('Google Sheets Trigger').item.json['Statut candidatures'] }}",
              "rightValue": "",
              "operator": {
                "type": "string",
                "operation": "empty",
                "singleValue": true
              }
            }
          ],
          "combinator": "and"
        },
        "options": {}
      },
      "type": "n8n-nodes-base.if",
      "typeVersion": 2.2,
      "position": [
        48,
        -16
      ],
      "id": "94f65751-bde7-4058-b1f5-8f8288c61cea",
      "name": "If1"
    },
    {
      "parameters": {
        "resource": "draft",
        "subject": "={{ $json.email_approche.objet }}",
        "message": "={{ $json.email_approche.contenu }}\n\nLe lien de l'offres : {{ $('Get_Last_Item').item.json['Lien Offres'] }}",
        "options": {}
      },
      "type": "n8n-nodes-base.gmail",
      "typeVersion": 2.1,
      "position": [
        848,
        -16
      ],
      "id": "475577a1-d37d-48e0-8588-9c827c06e5a1",
      "name": "Cr\u00e9ation d'un brouillon",
      "credentials": {
        "gmailOAuth2": {
          "name": "<your credential>"
        }
      }
    },
    {
      "parameters": {
        "conditions": {
          "options": {
            "caseSensitive": true,
            "leftValue": "",
            "typeValidation": "strict",
            "version": 2
          },
          "conditions": [
            {
              "id": "804192d6-72fa-4652-ad1e-3395b4e2f4ef",
              "leftValue": "={{ $json.messages[0].labels[0].id }}",
              "rightValue": "SENT",
              "operator": {
                "type": "string",
                "operation": "equals",
                "name": "filter.operator.equals"
              }
            }
          ],
          "combinator": "and"
        },
        "options": {}
      },
      "type": "n8n-nodes-base.if",
      "typeVersion": 2.2,
      "position": [
        320,
        400
      ],
      "id": "01d3de1b-861a-4f8d-9bbf-2ace0fdb44df",
      "name": "If"
    },
    {
      "parameters": {
        "resource": "thread",
        "operation": "get",
        "threadId": "={{ $('Maj Sheet Info').item.json.threadId }}",
        "simple": false,
        "options": {
          "returnOnlyMessages": true
        }
      },
      "type": "n8n-nodes-base.gmail",
      "typeVersion": 2.1,
      "position": [
        64,
        544
      ],
      "id": "07197291-ddf0-4f98-a743-25cd781c1894",
      "name": "Get a thread",
      "credentials": {
        "gmailOAuth2": {
          "name": "<your credential>"
        }
      },
      "onError": "continueErrorOutput"
    },
    {
      "parameters": {
        "operation": "update",
        "documentId": {
          "__rl": true,
          "value": "1GmInl-k2Dyp2HV_QTl_wxxQkUvHFkZbGMojfTqnOZss",
          "mode": "list",
          "cachedResultName": "suivie de candidature",
          "cachedResultUrl": "https://docs.google.com/spreadsheets/d/1GmInl-k2Dyp2HV_QTl_wxxQkUvHFkZbGMojfTqnOZss/edit?usp=drivesdk"
        },
        "sheetName": {
          "__rl": true,
          "value": 1967016008,
          "mode": "list",
          "cachedResultName": "suivie de candidature",
          "cachedResultUrl": "https://docs.google.com/spreadsheets/d/1GmInl-k2Dyp2HV_QTl_wxxQkUvHFkZbGMojfTqnOZss/edit#gid=1967016008"
        },
        "columns": {
          "mappingMode": "defineBelow",
          "value": {
            "Resumer de l'offre": "={{ $('Format_data').item.json.resume_strategique.poste }}",
            "LM": "={{ $('Format_data').item.json.lettre_motivation.contenu }}",
            "Commentaires": "=Profil id\u00e9al :{{ $('Format_data').item.json.resume_strategique.profil_ideal }} , \nPoint de connexion :{{ $('Format_data').item.json.resume_strategique.points_connexion }} ,\nStack technique :{{ $('Format_data').item.json.resume_strategique.stack_technique }}",
            "Entreprise": "={{ $('Format_data').item.json.resume_strategique.entreprise }}",
            "Lien Offres": "={{ $('Google Sheets Trigger').item.json['Lien Offres'] }}",
            "threadId": "={{ $json.message.threadId }}",
            "Statut candidatures": "Brouillons"
          },
          "matchingColumns": [
            "Lien Offres"
          ],
          "schema": [
            {
              "id": "Lien Offres",
              "displayName": "Lien Offres",
              "required": false,
              "defaultMatch": false,
              "display": true,
              "type": "string",
              "canBeUsedToMatch": true,
              "removed": false
            },
            {
              "id": "threadId",
              "displayName": "threadId",
              "required": false,
              "defaultMatch": false,
              "display": true,
              "type": "string",
              "canBeUsedToMatch": true,
              "removed": false
            },
            {
              "id": "Resumer de l'offre",
              "displayName": "Resumer de l'offre",
              "required": false,
              "defaultMatch": false,
              "display": true,
              "type": "string",
              "canBeUsedToMatch": true
            },
            {
              "id": "Entreprise",
              "displayName": "Entreprise",
              "required": false,
              "defaultMatch": false,
              "display": true,
              "type": "string",
              "canBeUsedToMatch": true,
              "removed": false
            },
            {
              "id": "LM",
              "displayName": "LM",
              "required": false,
              "defaultMatch": false,
              "display": true,
              "type": "string",
              "canBeUsedToMatch": true
            },
            {
              "id": "Date d\u2019envoi",
              "displayName": "Date d\u2019envoi",
              "required": false,
              "defaultMatch": false,
              "display": true,
              "type": "string",
              "canBeUsedToMatch": true,
              "removed": true
            },
            {
              "id": "Destinataire",
              "displayName": "Destinataire",
              "required": false,
              "defaultMatch": false,
              "display": true,
              "type": "string",
              "canBeUsedToMatch": true,
              "removed": true
            },
            {
              "id": "Date de relance",
              "displayName": "Date de relance",
              "required": false,
              "defaultMatch": false,
              "display": true,
              "type": "string",
              "canBeUsedToMatch": true,
              "removed": true
            },
            {
              "id": "R\u00e9ponse re\u00e7ue le",
              "displayName": "R\u00e9ponse re\u00e7ue le",
              "required": false,
              "defaultMatch": false,
              "display": true,
              "type": "string",
              "canBeUsedToMatch": true,
              "removed": true
            },
            {
              "id": "Jours \u00e9coul\u00e9s",
              "displayName": "Jours \u00e9coul\u00e9s",
              "required": false,
              "defaultMatch": false,
              "display": true,
              "type": "string",
              "canBeUsedToMatch": true,
              "removed": true
            },
            {
              "id": "Statut candidatures",
              "displayName": "Statut candidatures",
              "required": false,
              "defaultMatch": false,
              "display": true,
              "type": "string",
              "canBeUsedToMatch": true,
              "removed": false
            },
            {
              "id": "Commentaires",
              "displayName": "Commentaires",
              "required": false,
              "defaultMatch": false,
              "display": true,
              "type": "string",
              "canBeUsedToMatch": true
            },
            {
              "id": "row_number",
              "displayName": "row_number",
              "required": false,
              "defaultMatch": false,
              "display": true,
              "type": "number",
              "canBeUsedToMatch": true,
              "readOnly": true,
              "removed": true
            }
          ],
          "attemptToConvertTypes": false,
          "convertFieldsToString": false
        },
        "options": {}
      },
      "type": "n8n-nodes-base.googleSheets",
      "typeVersion": 4.7,
      "position": [
        1072,
        -16
      ],
      "id": "9ceae66f-eff4-4ae9-8778-5fb3fda62588",
      "name": "Maj Sheet Info",
      "credentials": {
        "googleSheetsOAuth2Api": {
          "name": "<your credential>"
        }
      }
    },
    {
      "parameters": {
        "chatId": "5356857744",
        "text": "=\u2705 Automatisation r\u00e9ussie !\n\nUn brouillon d\u2019e-mail de motivation a \u00e9t\u00e9 cr\u00e9\u00e9 dans ton Gmail.\nLes informations essentielles ont \u00e9t\u00e9 ajout\u00e9es dans Google Sheets concernant l\u2019offre d\u2019emploi :\n\n{{ $('Format_data').item.json.resume_strategique.poste }} chez {{ $('Format_data').item.json.resume_strategique.entreprise }}, \u00e0 {{ $('Format_data').item.json.resume_strategique.localisation }}.",
        "additionalFields": {
          "appendAttribution": false
        }
      },
      "type": "n8n-nodes-base.telegram",
      "typeVersion": 1.2,
      "position": [
        1296,
        -16
      ],
      "id": "9594c80e-7174-4459-9f8c-0f384afae652",
      "name": "Msg de confirmation",
      "credentials": {
        "telegramApi": {
          "name": "<your credential>"
        }
      }
    },
    {
      "parameters": {
        "operation": "update",
        "documentId": {
          "__rl": true,
          "value": "1GmInl-k2Dyp2HV_QTl_wxxQkUvHFkZbGMojfTqnOZss",
          "mode": "list",
          "cachedResultName": "suivie de candidature",
          "cachedResultUrl": "https://docs.google.com/spreadsheets/d/1GmInl-k2Dyp2HV_QTl_wxxQkUvHFkZbGMojfTqnOZss/edit?usp=drivesdk"
        },
        "sheetName": {
          "__rl": true,
          "value": 1967016008,
          "mode": "list",
          "cachedResultName": "suivie de candidature",
          "cachedResultUrl": "https://docs.google.com/spreadsheets/d/1GmInl-k2Dyp2HV_QTl_wxxQkUvHFkZbGMojfTqnOZss/edit#gid=1967016008"
        },
        "columns": {
          "mappingMode": "defineBelow",
          "value": {
            "Statut candidatures": "Envoyer",
            "Destinataire": "={{ $json.messages[0].To }}",
            "Date d\u2019envoi": "={{(() => {\n  const timestamp = $json[\"messages\"][0][\"internalDate\"];\n  const ts = Number(timestamp);\n  const dateObj = new Date(ts < 1e12 ? ts * 1000 : ts);\n\n  if (isNaN(dateObj)) {\n    return \"Horodatage invalide\";\n  }\n\n  const jour = String(dateObj.getDate()).padStart(2, '0');\n  const mois = String(dateObj.getMonth() + 1).padStart(2, '0');\n  const annee = dateObj.getFullYear();\n\n  return `${jour}/${mois}/${annee}`;\n})()}}\n",
            "threadId": "={{ $('Maj Sheet Info').item.json.threadId }}"
          },
          "matchingColumns": [
            "threadId"
          ],
          "schema": [
            {
              "id": "Lien Offres",
              "displayName": "Lien Offres",
              "required": false,
              "defaultMatch": false,
              "display": true,
              "type": "string",
              "canBeUsedToMatch": true,
              "removed": true
            },
            {
              "id": "threadId",
              "displayName": "threadId",
              "required": false,
              "defaultMatch": false,
              "display": true,
              "type": "string",
              "canBeUsedToMatch": true,
              "removed": false
            },
            {
              "id": "Resumer de l'offre",
              "displayName": "Resumer de l'offre",
              "required": false,
              "defaultMatch": false,
              "display": true,
              "type": "string",
              "canBeUsedToMatch": true,
              "removed": true
            },
            {
              "id": "Entreprise",
              "displayName": "Entreprise",
              "required": false,
              "defaultMatch": false,
              "display": true,
              "type": "string",
              "canBeUsedToMatch": true,
              "removed": true
            },
            {
              "id": "LM",
              "displayName": "LM",
              "required": false,
              "defaultMatch": false,
              "display": true,
              "type": "string",
              "canBeUsedToMatch": true,
              "removed": true
            },
            {
              "id": "Date d\u2019envoi",
              "displayName": "Date d\u2019envoi",
              "required": false,
              "defaultMatch": false,
              "display": true,
              "type": "string",
              "canBeUsedToMatch": true,
              "removed": false
            },
            {
              "id": "Destinataire",
              "displayName": "Destinataire",
              "required": false,
              "defaultMatch": false,
              "display": true,
              "type": "string",
              "canBeUsedToMatch": true,
              "removed": false
            },
            {
              "id": "Date de relance",
              "displayName": "Date de relance",
              "required": false,
              "defaultMatch": false,
              "display": true,
              "type": "string",
              "canBeUsedToMatch": true,
              "removed": true
            },
            {
              "id": "R\u00e9ponse re\u00e7ue le",
              "displayName": "R\u00e9ponse re\u00e7ue le",
              "required": false,
              "defaultMatch": false,
              "display": true,
              "type": "string",
              "canBeUsedToMatch": true,
              "removed": true
            },
            {
              "id": "Jours \u00e9coul\u00e9s",
              "displayName": "Jours \u00e9coul\u00e9s",
              "required": false,
              "defaultMatch": false,
              "display": true,
              "type": "string",
              "canBeUsedToMatch": true,
              "removed": true
            },
            {
              "id": "Statut candidatures",
              "displayName": "Statut candidatures",
              "required": false,
              "defaultMatch": false,
              "display": true,
              "type": "string",
              "canBeUsedToMatch": true,
              "removed": false
            },
            {
              "id": "Commentaires",
              "displayName": "Commentaires",
              "required": false,
              "defaultMatch": false,
              "display": true,
              "type": "string",
              "canBeUsedToMatch": true,
              "removed": true
            },
            {
              "id": "row_number",
              "displayName": "row_number",
              "required": false,
              "defaultMatch": false,
              "display": true,
              "type": "number",
              "canBeUsedToMatch": true,
              "readOnly": true,
              "removed": true
            }
          ],
          "attemptToConvertTypes": false,
          "convertFieldsToString": false
        },
        "options": {}
      },
      "type": "n8n-nodes-base.googleSheets",
      "typeVersion": 4.7,
      "position": [
        512,
        288
      ],
      "id": "b6ba283b-a526-44b4-8a42-b622b25d67aa",
      "name": "Maj Sheet Statut",
      "credentials": {
        "googleSheetsOAuth2Api": {
          "name": "<your credential>"
        }
      }
    },
    {
      "parameters": {
        "amount": 1,
        "unit": "hours"
      },
      "type": "n8n-nodes-base.wait",
      "typeVersion": 1.1,
      "position": [
        544,
        816
      ],
      "id": "d349695c-be65-4f26-b8c2-8dcb4f358623",
      "name": "D\u00e9lais de rappel"
    },
    {
      "parameters": {
        "documentId": {
          "__rl": true,
          "value": "1GmInl-k2Dyp2HV_QTl_wxxQkUvHFkZbGMojfTqnOZss",
          "mode": "list",
          "cachedResultName": "suivie de candidature",
          "cachedResultUrl": "https://docs.google.com/spreadsheets/d/1GmInl-k2Dyp2HV_QTl_wxxQkUvHFkZbGMojfTqnOZss/edit?usp=drivesdk"
        },
        "sheetName": {
          "__rl": true,
          "value": 1967016008,
          "mode": "list",
          "cachedResultName": "suivie de candidature",
          "cachedResultUrl": "https://docs.google.com/spreadsheets/d/1GmInl-k2Dyp2HV_QTl_wxxQkUvHFkZbGMojfTqnOZss/edit#gid=1967016008"
        },
        "options": {}
      },
      "type": "n8n-nodes-base.googleSheets",
      "typeVersion": 4.7,
      "position": [
        -384,
        528
      ],
      "id": "70ad90bc-5e8f-4958-b18b-7f1d354f6195",
      "name": "Get row(s) in sheet1",
      "credentials": {
        "googleSheetsOAuth2Api": {
          "name": "<your credential>"
        }
      }
    },
    {
      "parameters": {
        "chatId": "5356857744",
        "text": "=\u26a0\ufe0f Rappel automatique\n\nUn brouillon d\u2019e-mail de motivation a \u00e9t\u00e9 cr\u00e9\u00e9 dans ton Gmail, mais tu n\u2019as pas encore postul\u00e9.\nToutes les informations sont d\u00e9j\u00e0 enregistr\u00e9es dans Google Sheets :\n\n{{ $('Format_data').item.json.resume_strategique.poste }} chez {{ $('Format_data').item.json.resume_strategique.entreprise }}, \u00e0 {{ $('Format_data').item.json.resume_strategique.localisation }}.\n\n\ud83d\udcc5 Pense \u00e0 candidater avant le :\n{{ $json.date_limite || $now.plus({ days: 3 }).toFormat('dd/MM/yyyy') }}",
        "additionalFields": {
          "appendAttribution": false
        }
      },
      "type": "n8n-nodes-base.telegram",
      "typeVersion": 1.2,
      "position": [
        736,
        816
      ],
      "id": "1fe58147-47e1-4ed2-9b6a-23b8c638f24d",
      "name": "Msg de rappel2",
      "credentials": {
        "telegramApi": {
          "name": "<your credential>"
        }
      }
    },
    {
      "parameters": {
        "chatId": "5356857744",
        "text": "=\u26a0\ufe0f Mise \u00e0 jour automatique\n\nLe brouillon d\u2019e-mail de motivation a \u00e9t\u00e9 supprim\u00e9.\nL\u2019offre d\u2019emploi correspondante n\u2019est plus suivie.\n\n{{ $('Format_data').item.json.resume_strategique.poste }} chez {{ $('Format_data').item.json.resume_strategique.entreprise }}, \u00e0 {{ $('Format_data').item.json.resume_strategique.localisation }}.\n\n\ud83d\udcc1 Aucune action suppl\u00e9mentaire n\u2019est requise. Cette offre a \u00e9t\u00e9 retir\u00e9e de ton suivi automatique.",
        "additionalFields": {
          "appendAttribution": false
        }
      },
      "type": "n8n-nodes-base.telegram",
      "typeVersion": 1.2,
      "position": [
        304,
        560
      ],
      "id": "575c4d4d-32bc-4776-9341-2a8273dc8bd2",
      "name": "Msg de rappel",
      "credentials": {
        "telegramApi": {
          "name": "<your credential>"
        }
      }
    },
    {
      "parameters": {
        "rules": {
          "values": [
            {
              "conditions": {
                "options": {
                  "caseSensitive": true,
                  "leftValue": "",
                  "typeValidation": "strict",
                  "version": 2
                },
                "conditions": [
                  {
                    "leftValue": "={{ $json['Statut candidatures'] }}",
                    "rightValue": "Envoyer",
                    "operator": {
                      "type": "string",
                      "operation": "equals"
                    },
                    "id": "d1f7848e-0574-4e65-987c-949c2f001dec"
                  }
                ],
                "combinator": "and"
              },
              "renameOutput": true,
              "outputKey": "Envoyer"
            },
            {
              "conditions": {
                "options": {
                  "caseSensitive": true,
                  "leftValue": "",
                  "typeValidation": "strict",
                  "version": 2
                },
                "conditions": [
                  {
                    "id": "0e843bad-14e3-4bd3-975b-9876584a75bc",
                    "leftValue": "={{ $json['Statut candidatures'] }}",
                    "rightValue": "Brouillons",
                    "operator": {
                      "type": "string",
                      "operation": "equals",
                      "name": "filter.operator.equals"
                    }
                  }
                ],
                "combinator": "and"
              },
              "renameOutput": true,
              "outputKey": "Brouillons"
            }
          ]
        },
        "options": {}
      },
      "type": "n8n-nodes-base.switch",
      "typeVersion": 3.3,
      "position": [
        -160,
        528
      ],
      "id": "a0f2a904-b62e-44f9-9019-7f5b1720d88d",
      "name": "Statut candidature "
    },
    {
      "parameters": {
        "operation": "delete",
        "documentId": {
          "__rl": true,
          "value": "1GmInl-k2Dyp2HV_QTl_wxxQkUvHFkZbGMojfTqnOZss",
          "mode": "list",
          "cachedResultName": "suivie de candidature",
          "cachedResultUrl": "https://docs.google.com/spreadsheets/d/1GmInl-k2Dyp2HV_QTl_wxxQkUvHFkZbGMojfTqnOZss/edit?usp=drivesdk"
        },
        "sheetName": {
          "__rl": true,
          "value": 1967016008,
          "mode": "list",
          "cachedResultName": "suivie de candidature",
          "cachedResultUrl": "https://docs.google.com/spreadsheets/d/1GmInl-k2Dyp2HV_QTl_wxxQkUvHFkZbGMojfTqnOZss/edit#gid=1967016008"
        },
        "numberToDelete": "={{ $('Get row(s) in sheet1').item.json.row_number }}"
      },
      "type": "n8n-nodes-base.googleSheets",
      "typeVersion": 4.7,
      "position": [
        304,
        720
      ],
      "id": "f27e6e1b-b64c-42dd-b10f-fb1d1bf2ca14",
      "name": "Maj Sheet Statut1",
      "credentials": {
        "googleSheetsOAuth2Api": {
          "name": "<your credential>"
        }
      }
    }
  ],
  "connections": {
    "Google Gemini Chat Model": {
      "ai_languageModel": [
        [
          {
            "node": "AI Agent",
            "type": "ai_languageModel",
            "index": 0
          }
        ]
      ]
    },
    "AI Agent": {
      "main": [
        [
          {
            "node": "Format_data",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Get_Last_Item": {
      "main": [
        [
          {
            "node": "If1",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Format_data": {
      "main": [
        [
          {
            "node": "Cr\u00e9ation d'un brouillon",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Google Sheets Trigger": {
      "main": [
        [
          {
            "node": "Get_Last_Item",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "If1": {
      "main": [
        [
          {
            "node": "AI Agent",
            "type": "main",
            "index": 0
          }
        ],
        []
      ]
    },
    "Cr\u00e9ation d'un brouillon": {
      "main": [
        [
          {
            "node": "Maj Sheet Info",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "If": {
      "main": [
        [
          {
            "node": "Maj Sheet Statut",
            "type": "main",
            "index": 0
          }
        ],
        [
          {
            "node": "D\u00e9lais de rappel",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Get a thread": {
      "main": [
        [
          {
            "node": "If",
            "type": "main",
            "index": 0
          }
        ],
        [
          {
            "node": "Msg de rappel",
            "type": "main",
            "index": 0
          },
          {
            "node": "Maj Sheet Statut1",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Maj Sheet Info": {
      "main": [
        [
          {
            "node": "Msg de confirmation",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Msg de confirmation": {
      "main": [
        [
          {
            "node": "Get row(s) in sheet1",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Maj Sheet Statut": {
      "main": [
        []
      ]
    },
    "D\u00e9lais de rappel": {
      "main": [
        [
          {
            "node": "Msg de rappel2",
            "type": "main",
            "index": 0
          },
          {
            "node": "Get row(s) in sheet1",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Get row(s) in sheet1": {
      "main": [
        [
          {
            "node": "Statut candidature ",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Statut candidature ": {
      "main": [
        [],
        [
          {
            "node": "Get a thread",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Msg de rappel": {
      "main": [
        []
      ]
    }
  },
  "active": true,
  "settings": {
    "executionOrder": "v1",
    "callerPolicy": "workflowsFromSameOwner",
    "availableInMCP": false
  },
  "versionId": "052e1a8f-e4af-4f7a-811b-04ae7e1986ed",
  "meta": {
    "templateCredsSetupCompleted": true
  },
  "id": "xCht1CUSyl3DwVNf",
  "tags": [
    {
      "createdAt": "2025-10-22T08:46:58.929Z",
      "updatedAt": "2025-10-22T08:46:58.929Z",
      "id": "UOTFG8MBpRDpsLWA",
      "name": "Affaires"
    }
  ]
}