Automatisez le suivi des absences mensuelles

Ce workflow n8n vous permet de suivre automatiquement les absences pour cause de congés ou de maladie à partir du calendrier Google. Chaque mois, il calcule et compile les absences du mois précédent, puis envoie un rapport détaillé par email à votre équipe paie. Cela garantit une gestion fluide et précise des ressources humaines tout en réduisant le temps passé sur les tâches administratives répétitives. Grâce à cette automatisation, vous pouvez vous concentrer sur des tâches à plus forte valeur ajoutée.

99,876 vues
33,027 copies

Documentation Complète

📋 Automatisez le suivi des absences mensuelles

💡 Description

Ce workflow n8n vous permet de suivre automatiquement les absences pour cause de congés ou de maladie à partir du calendrier Google. Chaque mois, il calcule et compile les absences du mois précédent, puis envoie un rapport détaillé par email à votre équipe paie. Cela garantit une gestion fluide et précise des ressources humaines tout en réduisant le temps passé sur les tâches administratives répétitives. Grâce à cette automatisation, vous pouvez vous concentrer sur des tâches à plus forte valeur ajoutée.

📈 Impact & ROI: Améliorez la précision et l'efficacité du suivi des absences, réduisez les erreurs humaines et optimisez le temps de votre équipe RH.

🚀 Fonctionnalités Clés

  • ✅ Automatisation du suivi des absences mensuelles
  • ✅ Rapport détaillé envoyé par email
  • ✅ Intégration avec Google Calendar
  • ✅ Amélioration de l'efficacité des processus RH

📊 Architecture Technique

13
Nodes
12
Connexions
2
Services

🔌 Services Intégrés

Google CalendarEmail

🔧 Composition du Workflow

NodeTypeDescription
Previous MonthdateTimeTraitement des données
1st of Every month at 8amcronTraitement des données
Check Summary for Illness or HolidayswitchTraitement des données
HolidaynoOpTraitement des données
IllnessnoOpTraitement des données
Filter Holiday DayssetTraitement des données
Filter Illness DayssetTraitement des données
MergemergeFusion de plusieurs branches de données
Get previous months eventsgoogleCalendarTraitement des données
Send email to payrollemailSendTraitement des données
Combine Holiday CountscodeTraitement des données
Combine Illness CountscodeTraitement des données
Build the message to sendcodeTraitement des données

📖 Guide d'Implémentation

  1. Import du workflow: Téléchargez le fichier JSON et importez-le dans votre instance n8n
  2. Configuration des credentials: Configurez les accès pour chaque service utilisé
  3. Personnalisation: Adaptez les paramètres selon vos besoins spécifiques
  4. Test: Exécutez le workflow en mode test pour vérifier le bon fonctionnement
  5. Activation: Activez le workflow pour une exécution automatique

🏷️ Tags

absencesautomatisationGoogle Calendar

Structure JSON

Voir le code JSON complet
{
    "meta": {
        "instanceId": "8c8c5237b8e37b006a7adce87f4369350c58e41f3ca9de16196d3197f69eabcd"
    },
    "nodes": [
        {
            "id": "6f869392-1501-49b9-be86-4b767f7ec597",
            "name": "Previous Month",
            "type": "n8n-nodes-base.dateTime",
            "position": [
                360,
                420
            ],
            "parameters": {
                "value": "={{Date()}}",
                "action": "calculate",
                "options": [],
                "duration": 1,
                "timeUnit": "months",
                "operation": "subtract"
            },
            "typeVersion": 1
        },
        {
            "id": "1446eb44-bd1e-4dad-9ecc-c2a1e8cb2ca6",
            "name": "1st of Every month at 8am",
            "type": "n8n-nodes-base.cron",
            "position": [
                180,
                420
            ],
            "parameters": {
                "triggerTimes": {
                    "item": [
                        {
                            "hour": 8,
                            "mode": "everyMonth"
                        }
                    ]
                }
            },
            "typeVersion": 1
        },
        {
            "id": "a044ac76-49d9-4046-b008-2b4adf6512b1",
            "name": "Check Summary for Illness or Holiday",
            "type": "n8n-nodes-base.switch",
            "position": [
                760,
                420
            ],
            "parameters": {
                "rules": {
                    "rules": [
                        {
                            "value2": "Holiday",
                            "operation": "contains"
                        },
                        {
                            "output": 1,
                            "value2": "Illness",
                            "operation": "contains"
                        }
                    ]
                },
                "value1": "={{$json[\"summary\"]}}",
                "dataType": "string"
            },
            "typeVersion": 1
        },
        {
            "id": "6b40beab-7938-4aaa-a8a8-7a1e364dc2de",
            "name": "Holiday",
            "type": "n8n-nodes-base.noOp",
            "position": [
                980,
                220
            ],
            "parameters": [],
            "typeVersion": 1
        },
        {
            "id": "b069f3ce-66d1-4f64-946b-f9fda27db46b",
            "name": "Illness",
            "type": "n8n-nodes-base.noOp",
            "position": [
                980,
                400
            ],
            "parameters": [],
            "typeVersion": 1
        },
        {
            "id": "5725626b-2bfd-47a0-947e-efd28f0c29fe",
            "name": "Filter Holiday Days",
            "type": "n8n-nodes-base.set",
            "position": [
                1180,
                220
            ],
            "parameters": {
                "values": {
                    "string": [
                        {
                            "name": "Name",
                            "value": "={{$json[\"description\"].split(\",\")[0]}}"
                        },
                        {
                            "name": "Days",
                            "value": "={{(new Date($json[\"end\"][\"date\"]).getTime() - new Date($json[\"start\"][\"date\"]).getTime()) \/ (1000 * 3600 * 24)}}"
                        },
                        {
                            "name": "Type",
                            "value": "Holiday"
                        }
                    ]
                },
                "options": [],
                "keepOnlySet": true
            },
            "typeVersion": 1
        },
        {
            "id": "3114eb4f-a5be-452c-9729-b94d2904eb4b",
            "name": "Filter Illness Days",
            "type": "n8n-nodes-base.set",
            "position": [
                1180,
                400
            ],
            "parameters": {
                "values": {
                    "string": [
                        {
                            "name": "Name",
                            "value": "={{$json[\"description\"].split(\",\")[0]}}"
                        },
                        {
                            "name": "Days",
                            "value": "={{(new Date($json[\"end\"][\"date\"]).getTime() - new Date($json[\"start\"][\"date\"]).getTime()) \/ (1000 * 3600 * 24)}}"
                        },
                        {
                            "name": "Type",
                            "value": "Illness"
                        }
                    ]
                },
                "options": [],
                "keepOnlySet": true
            },
            "typeVersion": 1
        },
        {
            "id": "04617849-c162-4af5-9634-ab8ffd925625",
            "name": "Merge",
            "type": "n8n-nodes-base.merge",
            "position": [
                1620,
                320
            ],
            "parameters": [],
            "typeVersion": 1
        },
        {
            "id": "daf227d9-938d-4110-9a47-5bf8bb661586",
            "name": "Get previous months events",
            "type": "n8n-nodes-base.googleCalendar",
            "position": [
                560,
                420
            ],
            "parameters": {
                "options": {
                    "timeMax": "={{new Date().toISOString()}}",
                    "timeMin": "={{$json[\"data\"]}}"
                },
                "calendar": "[Select Cal]",
                "operation": "getAll",
                "returnAll": true
            },
            "credentials": {
                "googleCalendarOAuth2Api": {
                    "id": "50",
                    "name": "Google Calendar account"
                }
            },
            "typeVersion": 1
        },
        {
            "id": "19ec862a-e71a-49f9-b799-26f73a410553",
            "name": "Send email to payroll",
            "type": "n8n-nodes-base.emailSend",
            "position": [
                1980,
                320
            ],
            "parameters": {
                "text": "={{$json[\"message\"]}}",
                "options": [],
                "subject": "Absences from last month",
                "toEmail": "payroll-team@mydomain.tld",
                "fromEmail": "n8n@mydomain.tld"
            },
            "credentials": {
                "smtp": {
                    "id": "16",
                    "name": "mailtrap"
                }
            },
            "typeVersion": 1
        },
        {
            "id": "5805b2e1-e723-4803-a7e0-8df5fd4cf84d",
            "name": "Combine Holiday Counts",
            "type": "n8n-nodes-base.code",
            "position": [
                1380,
                220
            ],
            "parameters": {
                "jsCode": "let names = $input.all().map(e => e.json.Name);\nlet unique_names = [...new Set(names)];\nlet results = [];\n\nfor (thisName of unique_names) {\n  let result = {\n    \"Name\": thisName,\n    \"Days\": 0,\n    \"Type\": \"Holiday\"\n  }\n\n  for (matching_item of $input.all().filter(e => e.json.Name === thisName)) {\n    result.Days += parseInt(matching_item.json.Days);\n  }\n  \n  results.push(result);\n}\n\nreturn results.map(e => { return {json: e} });"
            },
            "typeVersion": 1
        },
        {
            "id": "c30345ae-1a19-4453-a67b-eda71cb7326e",
            "name": "Combine Illness Counts",
            "type": "n8n-nodes-base.code",
            "position": [
                1380,
                400
            ],
            "parameters": {
                "jsCode": "let names = $input.all().map(e => e.json.Name);\nlet unique_names = [...new Set(names)];\nlet results = [];\n\nfor (thisName of unique_names) {\n  let result = {\n    \"Name\": thisName,\n    \"Days\": 0,\n    \"Type\": \"Illness\"\n  }\n\n  for (matching_item of $input.all().filter(e => e.json.Name === thisName)) {\n    result.Days += parseInt(matching_item.json.Days);\n  }\n  \n  results.push(result);\n}\n\nreturn results.map(e => { return {json: e} });"
            },
            "typeVersion": 1
        },
        {
            "id": "7bac2604-ca55-4300-a7a5-38fc96830ba6",
            "name": "Build the message to send",
            "type": "n8n-nodes-base.code",
            "position": [
                1800,
                320
            ],
            "parameters": {
                "jsCode": "let illnessMessage = \"\";\nlet holidayMessage = \"\";\nlet message = \"Here is a breakdown of absences for the last month.\\n\\n\";\n\n\/\/ Loop the input items\nfor (item of $input.all()) {\n  if (item.json.Type == \"Holiday\") {\n    holidayMessage += item.json.Name + \" had \" + item.json.Days + \" days\\n\";\n  }\n  if (item.json.Type == \"Illness\") {\n    illnessMessage += item.json.Name + \" had \" + item.json.Days + \" days\\n\";\n  }\n}\n\nif (holidayMessage != \"\") {\n  message += \"Holiday Events\\n\";\n  message += holidayMessage + \"\\n\";\n} else {\n  message += \"No Holiday Events\\n\";\n}\n\nif (illnessMessage != \"\") {\n  message += \"Illness Events\\n\";\n  message += illnessMessage;\n} else {\n  message += \"No Illness Events\\n\";\n}\n\n\/\/ Return our message\nreturn [{json: {message}}];"
            },
            "typeVersion": 1
        }
    ],
    "connections": {
        "Merge": {
            "main": [
                [
                    {
                        "node": "Build the message to send",
                        "type": "main",
                        "index": 0
                    }
                ]
            ]
        },
        "Holiday": {
            "main": [
                [
                    {
                        "node": "Filter Holiday Days",
                        "type": "main",
                        "index": 0
                    }
                ]
            ]
        },
        "Illness": {
            "main": [
                [
                    {
                        "node": "Filter Illness Days",
                        "type": "main",
                        "index": 0
                    }
                ]
            ]
        },
        "Previous Month": {
            "main": [
                [
                    {
                        "node": "Get previous months events",
                        "type": "main",
                        "index": 0
                    }
                ]
            ]
        },
        "Filter Holiday Days": {
            "main": [
                [
                    {
                        "node": "Combine Holiday Counts",
                        "type": "main",
                        "index": 0
                    }
                ]
            ]
        },
        "Filter Illness Days": {
            "main": [
                [
                    {
                        "node": "Combine Illness Counts",
                        "type": "main",
                        "index": 0
                    }
                ]
            ]
        },
        "Combine Holiday Counts": {
            "main": [
                [
                    {
                        "node": "Merge",
                        "type": "main",
                        "index": 0
                    }
                ]
            ]
        },
        "Combine Illness Counts": {
            "main": [
                [
                    {
                        "node": "Merge",
                        "type": "main",
                        "index": 1
                    }
                ]
            ]
        },
        "1st of Every month at 8am": {
            "main": [
                [
                    {
                        "node": "Previous Month",
                        "type": "main",
                        "index": 0
                    }
                ]
            ]
        },
        "Build the message to send": {
            "main": [
                [
                    {
                        "node": "Send email to payroll",
                        "type": "main",
                        "index": 0
                    }
                ]
            ]
        },
        "Get previous months events": {
            "main": [
                [
                    {
                        "node": "Check Summary for Illness or Holiday",
                        "type": "main",
                        "index": 0
                    }
                ]
            ]
        },
        "Check Summary for Illness or Holiday": {
            "main": [
                [
                    {
                        "node": "Holiday",
                        "type": "main",
                        "index": 0
                    }
                ],
                [
                    {
                        "node": "Illness",
                        "type": "main",
                        "index": 0
                    }
                ]
            ]
        }
    }
}