# IntĂ©gration Twenty CRM dans le Widget Devoirs ## 📋 Vue d'ensemble Le widget "Devoirs" affiche maintenant les tĂąches en retard provenant de **deux sources** : 1. **Leantime** (agilite.slm-lab.net) 2. **Twenty CRM** (mediation.slm-lab.net) Les tĂąches sont combinĂ©es, filtrĂ©es (uniquement celles en retard), triĂ©es par date d'Ă©chĂ©ance, et limitĂ©es Ă  7 tĂąches. --- ## 🔧 Configuration Requise ### Variables d'Environnement Ajoutez les variables suivantes Ă  votre fichier `.env.local` (dĂ©veloppement) ou Ă  vos variables d'environnement de production : ```env # Twenty CRM API Configuration TWENTY_CRM_API_URL=https://mediation.slm-lab.net/graphql TWENTY_CRM_API_KEY=your_api_key_here TWENTY_CRM_URL=https://mediation.slm-lab.net ``` **OĂč obtenir la clĂ© API :** 1. Connectez-vous Ă  Twenty CRM (mediation.slm-lab.net) 2. Allez dans **Settings → APIs & Webhooks** 3. Cliquez sur **"+ Create key"** 4. Donnez un nom Ă  la clĂ© (ex: "NeahStable Widget") 5. Copiez la clĂ© (elle ne sera affichĂ©e qu'une seule fois) --- ## 📁 Fichiers Créés/ModifiĂ©s ### Nouveau Fichier - **`app/api/twenty-crm/tasks/route.ts`** - Endpoint API pour rĂ©cupĂ©rer les tĂąches Twenty CRM ### Fichiers ModifiĂ©s - **`components/flow.tsx`** - Widget Devoirs modifiĂ© pour combiner les deux sources --- ## 🔄 Flow de Fonctionnement ### 1. RĂ©cupĂ©ration des TĂąches Le widget fait **deux appels API en parallĂšle** : ```typescript const [leantimeResponse, twentyCrmResponse] = await Promise.allSettled([ fetch('/api/leantime/tasks'), fetch('/api/twenty-crm/tasks'), ]); ``` **Avantages :** - ✅ Appels parallĂšles = plus rapide - ✅ `Promise.allSettled` = si une source Ă©choue, l'autre continue de fonctionner - ✅ Pas de dĂ©pendance entre les deux sources ### 2. Transformation des TĂąches Twenty CRM Les tĂąches Twenty CRM sont transformĂ©es pour correspondre au format Leantime : ```typescript { id: `twenty-${task.id}`, // PrĂ©fixe pour Ă©viter les conflits headline: task.title, dateToFinish: task.dueAt, projectName: 'Twenty CRM', source: 'twenty-crm', // Identifiant de source url: `${TWENTY_CRM_URL}/object/activity/${task.id}`, // Lien direct // ... autres champs } ``` ### 3. Filtrage et Tri 1. **Filtrage :** Uniquement les tĂąches avec date d'Ă©chĂ©ance **avant aujourd'hui** (en retard) 2. **Tri :** Par date d'Ă©chĂ©ance (plus anciennes en premier) 3. **Limite :** Maximum 7 tĂąches affichĂ©es ### 4. Affichage - Les tĂąches Twenty CRM sont identifiĂ©es par un badge "(Twenty CRM)" - Le lien pointe vers la page de la tĂąche dans Twenty CRM - Le format d'affichage est identique pour les deux sources --- ## 🔍 Structure de l'API Twenty CRM ### Endpoint GraphQL **URL :** `https://mediation.slm-lab.net/graphql` **MĂ©thode :** POST **Headers :** ``` Authorization: Bearer YOUR_API_KEY Content-Type: application/json ``` ### RequĂȘte GraphQL ```graphql query GetOverdueTasks { findManyActivities( filter: { type: { eq: Task } completedAt: { is: NULL } dueAt: { lt: "2026-01-15T00:00:00Z" } } orderBy: { dueAt: AscNullsLast } ) { edges { node { id title body dueAt completedAt type assigneeId assignee { id firstName lastName email } } } } } ``` **Filtres appliquĂ©s :** - `type: { eq: Task }` - Uniquement les tĂąches (pas les autres activitĂ©s) - `completedAt: { is: NULL }` - Uniquement les tĂąches non complĂ©tĂ©es - `dueAt: { lt: "..." }` - Uniquement les tĂąches avec date d'Ă©chĂ©ance avant aujourd'hui --- ## 🐛 DĂ©pannage ### Erreur : "TWENTY_CRM_API_URL is not set" **Solution :** Ajoutez `TWENTY_CRM_API_URL` Ă  vos variables d'environnement. ### Erreur : "TWENTY_CRM_API_KEY is not set" **Solution :** Ajoutez `TWENTY_CRM_API_KEY` Ă  vos variables d'environnement. ### Erreur : "401 Unauthorized" **Causes possibles :** - ClĂ© API invalide ou expirĂ©e - ClĂ© API mal copiĂ©e (espaces, caractĂšres invisibles) - Permissions insuffisantes sur la clĂ© API **Solution :** 1. VĂ©rifiez que la clĂ© API est correctement copiĂ©e 2. RĂ©gĂ©nĂ©rez la clĂ© API dans Twenty CRM 3. VĂ©rifiez les permissions de la clĂ© API ### Erreur : "GraphQL errors from Twenty CRM" **Causes possibles :** - Structure de la requĂȘte GraphQL incorrecte - Version de Twenty CRM incompatible - SchĂ©ma GraphQL diffĂ©rent selon le workspace **Solution :** 1. VĂ©rifiez la documentation de votre version de Twenty CRM 2. Testez la requĂȘte GraphQL directement dans l'interface GraphQL de Twenty CRM 3. Ajustez la requĂȘte selon votre schĂ©ma ### Aucune tĂąche Twenty CRM n'apparaĂźt **VĂ©rifications :** 1. ✅ VĂ©rifiez qu'il existe des tĂąches en retard dans Twenty CRM 2. ✅ VĂ©rifiez que les tĂąches ont une date d'Ă©chĂ©ance (`dueAt`) 3. ✅ VĂ©rifiez que les tĂąches ne sont pas complĂ©tĂ©es (`completedAt` est NULL) 4. ✅ VĂ©rifiez les logs du serveur pour voir les erreurs Ă©ventuelles --- ## 📊 Logs et Debug ### Logs Backend Tous les logs sont prĂ©fixĂ©s avec `[TWENTY_CRM_TASKS]` : ```typescript logger.debug('[TWENTY_CRM_TASKS] Fetching tasks from Twenty CRM', {...}); logger.error('[TWENTY_CRM_TASKS] Failed to fetch tasks', {...}); ``` ### Logs Frontend Le widget affiche dans la console : - Nombre de tĂąches Leantime rĂ©cupĂ©rĂ©es - Nombre de tĂąches Twenty CRM rĂ©cupĂ©rĂ©es - Total combinĂ© - TĂąches triĂ©es avec leur source --- ## 🔄 Alternatives si GraphQL ne fonctionne pas Si la requĂȘte GraphQL ne fonctionne pas avec votre version de Twenty CRM, vous pouvez utiliser l'API REST : ### Option 1 : API REST (si disponible) ```typescript const response = await fetch(`${process.env.TWENTY_CRM_API_URL}/api/activities`, { method: 'GET', headers: { 'Authorization': `Bearer ${process.env.TWENTY_CRM_API_KEY}`, }, }); ``` ### Option 2 : Ajuster la requĂȘte GraphQL La structure exacte peut varier. Consultez la documentation de votre instance Twenty CRM ou utilisez l'explorateur GraphQL intĂ©grĂ©. --- ## ✅ Checklist de DĂ©ploiement - [ ] Variables d'environnement configurĂ©es : - [ ] `TWENTY_CRM_API_URL` - [ ] `TWENTY_CRM_API_KEY` - [ ] `TWENTY_CRM_URL` (optionnel, pour les liens) - [ ] ClĂ© API créée dans Twenty CRM - [ ] Permissions de la clĂ© API vĂ©rifiĂ©es - [ ] Test de l'endpoint `/api/twenty-crm/tasks` effectuĂ© - [ ] VĂ©rification que les tĂąches apparaissent dans le widget - [ ] Logs vĂ©rifiĂ©s pour dĂ©tecter d'Ă©ventuelles erreurs --- ## 📝 Notes - Les tĂąches Twenty CRM sont prĂ©fixĂ©es avec `twenty-` dans leur ID pour Ă©viter les conflits - Le widget continue de fonctionner mĂȘme si une seule source Ă©choue (grace Ă  `Promise.allSettled`) - Le cache Redis n'est pas encore implĂ©mentĂ© pour Twenty CRM (peut ĂȘtre ajoutĂ© plus tard) - La requĂȘte GraphQL peut nĂ©cessiter des ajustements selon votre version de Twenty CRM