Suivi de la documentation qualité et de la conformité

Avancé

Ceci est uncontenant 21 nœuds.Utilise principalement des nœuds comme If, Code, Slack, EmailSend, GoogleDrive. Utiliser Jotform et Google Workspace pour automatiser la documentation du contrôle qualité et la conformité en fabrication

Prérequis
  • Token Bot Slack ou URL Webhook
  • Informations d'identification Google Drive API
  • Informations d'identification Google Sheets API

Catégorie

-
Aperçu du workflow
Visualisation des connexions entre les nœuds, avec support du zoom et du déplacement
Exporter le workflow
Copiez la configuration JSON suivante dans n8n pour importer et utiliser ce workflow
{
  "id": "MAgkC5xPvs1oSfOG",
  "meta": {
    "instanceId": "277842713620d9f5554de3b1518b865a152c8c4db680008bd8aec536fc18b4a8"
  },
  "name": "Quality Control Documentation & Compliance Tracker",
  "tags": [
    {
      "id": "CWardZYJBmejoyC4",
      "name": "under review",
      "createdAt": "2025-10-09T18:43:37.031Z",
      "updatedAt": "2025-10-09T18:43:37.031Z"
    },
    {
      "id": "DP1soi5mjVldqSt2",
      "name": "Manufacturing",
      "createdAt": "2025-10-16T07:01:03.515Z",
      "updatedAt": "2025-10-16T07:01:03.515Z"
    },
    {
      "id": "YsSinivD5gbLQ0t9",
      "name": "Quality Control",
      "createdAt": "2025-10-16T07:01:03.524Z",
      "updatedAt": "2025-10-16T07:01:03.524Z"
    },
    {
      "id": "fVuzFMBZ0wHzY3en",
      "name": "Compliance",
      "createdAt": "2025-10-16T07:01:03.521Z",
      "updatedAt": "2025-10-16T07:01:03.521Z"
    }
  ],
  "nodes": [
    {
      "id": "8f4dabc5-b0f6-4f4b-8e07-aec5b456c963",
      "name": "Vérifier les Nouvelles Inspections",
      "type": "n8n-nodes-base.scheduleTrigger",
      "position": [
        -656,
        160
      ],
      "parameters": {
        "rule": {
          "interval": [
            {
              "field": "minutes",
              "minutesInterval": 15
            }
          ]
        }
      },
      "typeVersion": 1.1
    },
    {
      "id": "09bfd902-b390-418e-8b95-52f1e2b12853",
      "name": "Lire la File d'Attente d'Inspection",
      "type": "n8n-nodes-base.googleSheets",
      "position": [
        -448,
        160
      ],
      "parameters": {
        "sheetName": {
          "__rl": true,
          "mode": "list",
          "value": ""
        },
        "documentId": {
          "__rl": true,
          "mode": "list",
          "value": ""
        }
      },
      "typeVersion": 4
    },
    {
      "id": "9511a47d-58f0-4755-9f03-c36adfcffbe4",
      "name": "Traiter les Données d'Inspection",
      "type": "n8n-nodes-base.code",
      "position": [
        -256,
        256
      ],
      "parameters": {
        "mode": "runOnceForEachItem",
        "jsCode": "// Parse inspection data and determine compliance status\nconst item = $input.item.json;\n\n// Extract inspection details\nconst inspectionData = {\n  id: item.inspection_id || new Date().getTime().toString(),\n  timestamp: new Date().toISOString(),\n  product_name: item.product_name || item.answers?.product_name || '',\n  batch_number: item.batch_number || item.answers?.batch_number || '',\n  inspector_name: item.inspector_name || item.answers?.inspector_name || '',\n  inspection_type: item.inspection_type || item.answers?.inspection_type || 'Standard',\n  \n  // Measurement data\n  measurements: {\n    dimension_length: parseFloat(item.dimension_length || item.answers?.dimension_length || 0),\n    dimension_width: parseFloat(item.dimension_width || item.answers?.dimension_width || 0),\n    dimension_height: parseFloat(item.dimension_height || item.answers?.dimension_height || 0),\n    weight: parseFloat(item.weight || item.answers?.weight || 0),\n    temperature: parseFloat(item.temperature || item.answers?.temperature || 0)\n  },\n  \n  // Quality checks\n  visual_inspection: item.visual_inspection || item.answers?.visual_inspection || 'Pass',\n  surface_finish: item.surface_finish || item.answers?.surface_finish || 'Acceptable',\n  color_match: item.color_match || item.answers?.color_match || 'Yes',\n  defects_found: item.defects_found || item.answers?.defects_found || 'None',\n  \n  // Compliance calculation\n  specifications: {\n    length_min: 100,\n    length_max: 102,\n    width_min: 50,\n    width_max: 52,\n    height_min: 25,\n    height_max: 27,\n    weight_min: 450,\n    weight_max: 550\n  }\n};\n\n// Check compliance\nconst m = inspectionData.measurements;\nconst s = inspectionData.specifications;\n\nconst dimensionsCompliant = \n  m.dimension_length >= s.length_min && m.dimension_length <= s.length_max &&\n  m.dimension_width >= s.width_min && m.dimension_width <= s.width_max &&\n  m.dimension_height >= s.height_min && m.dimension_height <= s.height_max;\n\nconst weightCompliant = m.weight >= s.weight_min && m.weight <= s.weight_max;\n\nconst visualCompliant = \n  inspectionData.visual_inspection === 'Pass' &&\n  inspectionData.surface_finish === 'Acceptable' &&\n  inspectionData.color_match === 'Yes';\n\ninspectionData.compliance_status = \n  dimensionsCompliant && weightCompliant && visualCompliant ? 'PASS' : 'FAIL';\n\ninspectionData.non_conformities = [];\nif (!dimensionsCompliant) inspectionData.non_conformities.push('Dimensions out of spec');\nif (!weightCompliant) inspectionData.non_conformities.push('Weight out of spec');\nif (!visualCompliant) inspectionData.non_conformities.push('Visual inspection failed');\n\nreturn inspectionData;"
      },
      "typeVersion": 2
    },
    {
      "id": "5c1c11fe-848e-4951-9423-e86a0bb8b14b",
      "name": "Stocker dans Google Drive",
      "type": "n8n-nodes-base.googleDrive",
      "position": [
        -48,
        160
      ],
      "parameters": {
        "name": "=QC_Report_{{$json.batch_number}}_{{$json.id}}.json",
        "driveId": {
          "__rl": true,
          "mode": "list",
          "value": "My Drive"
        },
        "options": {},
        "folderId": {
          "__rl": true,
          "mode": "list",
          "value": "root",
          "cachedResultName": "/ (Root folder)"
        }
      },
      "typeVersion": 3
    },
    {
      "id": "32d6c442-d011-4dd4-8755-ed62277041b5",
      "name": "Journaliser dans la Feuille de Suivi",
      "type": "n8n-nodes-base.googleSheets",
      "position": [
        160,
        160
      ],
      "parameters": {
        "operation": "append",
        "sheetName": {
          "__rl": true,
          "mode": "list",
          "value": ""
        },
        "documentId": {
          "__rl": true,
          "mode": "list",
          "value": ""
        }
      },
      "typeVersion": 4
    },
    {
      "id": "8665c487-3083-4f39-b9de-69ad7bd68afd",
      "name": "Vérifier si Échec",
      "type": "n8n-nodes-base.if",
      "position": [
        -48,
        352
      ],
      "parameters": {
        "conditions": {
          "string": [
            {
              "value1": "={{$json.compliance_status}}",
              "value2": "FAIL"
            }
          ]
        }
      },
      "typeVersion": 1
    },
    {
      "id": "ae823af6-bfe5-4c77-8789-b5c27daf5327",
      "name": "Alerter l'Équipe Qualité",
      "type": "n8n-nodes-base.slack",
      "position": [
        160,
        464
      ],
      "webhookId": "d22990c8-4a80-46f8-8071-c6a7aedd2934",
      "parameters": {
        "text": "🚨 *Quality Control Alert*\n\nProduct: {{$json.product_name}}\nBatch: {{$json.batch_number}}\nStatus: *{{$json.compliance_status}}*\n\nNon-conformities:\n{{$json.non_conformities.join('\\n• ')}}",
        "otherOptions": {}
      },
      "typeVersion": 2.1
    },
    {
      "id": "e1e70d0c-4d12-4e10-85fc-b42a062451d2",
      "name": "Générer le Certificat",
      "type": "n8n-nodes-base.code",
      "position": [
        352,
        160
      ],
      "parameters": {
        "mode": "runOnceForEachItem",
        "jsCode": "// Generate HTML certificate of compliance\nconst data = $input.item.json;\n\nconst html = `\n<!DOCTYPE html>\n<html>\n<head>\n    <style>\n        body { font-family: Arial, sans-serif; margin: 40px; }\n        .header { text-align: center; margin-bottom: 30px; }\n        .certificate { border: 2px solid #333; padding: 30px; }\n        h1 { color: #2c5aa0; }\n        .details { margin: 20px 0; }\n        .signature { margin-top: 50px; }\n        .footer { text-align: center; margin-top: 30px; font-size: 12px; }\n    </style>\n</head>\n<body>\n    <div class=\"certificate\">\n        <div class=\"header\">\n            <h1>CERTIFICATE OF COMPLIANCE</h1>\n            <p>ISO 9001:2015 Quality Management System</p>\n        </div>\n        \n        <div class=\"details\">\n            <p><strong>Certificate No:</strong> ${data.id}</p>\n            <p><strong>Date:</strong> ${new Date(data.timestamp).toLocaleDateString()}</p>\n            <p><strong>Product:</strong> ${data.product_name}</p>\n            <p><strong>Batch Number:</strong> ${data.batch_number}</p>\n            <p><strong>Inspector:</strong> ${data.inspector_name}</p>\n            \n            <h3>Inspection Results</h3>\n            <table border=\"1\" style=\"width: 100%; border-collapse: collapse;\">\n                <tr>\n                    <th>Parameter</th>\n                    <th>Measured Value</th>\n                    <th>Specification</th>\n                    <th>Status</th>\n                </tr>\n                <tr>\n                    <td>Length (mm)</td>\n                    <td>${data.measurements.dimension_length}</td>\n                    <td>100-102</td>\n                    <td>${data.measurements.dimension_length >= 100 && data.measurements.dimension_length <= 102 ? '✓' : '✗'}</td>\n                </tr>\n                <tr>\n                    <td>Width (mm)</td>\n                    <td>${data.measurements.dimension_width}</td>\n                    <td>50-52</td>\n                    <td>${data.measurements.dimension_width >= 50 && data.measurements.dimension_width <= 52 ? '✓' : '✗'}</td>\n                </tr>\n                <tr>\n                    <td>Weight (g)</td>\n                    <td>${data.measurements.weight}</td>\n                    <td>450-550</td>\n                    <td>${data.measurements.weight >= 450 && data.measurements.weight <= 550 ? '✓' : '✗'}</td>\n                </tr>\n            </table>\n            \n            <h3>Compliance Status: ${data.compliance_status}</h3>\n        </div>\n        \n        <div class=\"signature\">\n            <p>_______________________</p>\n            <p>Quality Manager Signature</p>\n        </div>\n        \n        <div class=\"footer\">\n            <p>This certificate is electronically generated and valid without signature</p>\n        </div>\n    </div>\n</body>\n</html>\n`;\n\nreturn {\n  html: html,\n  filename: `Certificate_${data.batch_number}_${data.id}.html`\n};"
      },
      "typeVersion": 2
    },
    {
      "id": "622adac3-cd64-44d5-839e-dca015951252",
      "name": "Envoyer le Certificat par Email",
      "type": "n8n-nodes-base.emailSend",
      "position": [
        560,
        160
      ],
      "webhookId": "2f8295a5-2d25-49cb-b690-694a0ca8cd3a",
      "parameters": {
        "options": {
          "attachments": "={{$node['Generate Certificate'].json.html}}"
        },
        "subject": "Quality Certificate - Batch {{$json.batch_number}}",
        "toEmail": "={{$json.customer_email || 'customer@example.com'}}",
        "fromEmail": "quality@yourcompany.com"
      },
      "typeVersion": 2.1
    },
    {
      "id": "8bbe8307-48a8-4875-9e55-27988dc638af",
      "name": "Déclencheur du Rapport Quotidien",
      "type": "n8n-nodes-base.scheduleTrigger",
      "position": [
        -656,
        656
      ],
      "parameters": {
        "rule": {
          "interval": [
            {
              "triggerAtHour": 8
            }
          ]
        }
      },
      "typeVersion": 1.1
    },
    {
      "id": "1af14ece-11a2-44a0-a935-8cdbdc0cff3e",
      "name": "Obtenir les Données Quotidiennes",
      "type": "n8n-nodes-base.googleSheets",
      "position": [
        -448,
        656
      ],
      "parameters": {
        "sheetName": {
          "__rl": true,
          "mode": "list",
          "value": ""
        },
        "documentId": {
          "__rl": true,
          "mode": "list",
          "value": ""
        }
      },
      "typeVersion": 4
    },
    {
      "id": "91204a97-f66a-4d3f-bc34-f9b06b25e21f",
      "name": "Générer le Résumé",
      "type": "n8n-nodes-base.code",
      "position": [
        -256,
        656
      ],
      "parameters": {
        "jsCode": "// Generate daily compliance summary\nconst items = $input.all();\nconst today = new Date().toDateString();\n\nconst todaysInspections = items.filter(item => {\n  const itemDate = new Date(item.json.timestamp).toDateString();\n  return itemDate === today;\n});\n\nconst summary = {\n  date: today,\n  total_inspections: todaysInspections.length,\n  passed: todaysInspections.filter(i => i.json.compliance_status === 'PASS').length,\n  failed: todaysInspections.filter(i => i.json.compliance_status === 'FAIL').length,\n  pass_rate: 0,\n  products_inspected: [...new Set(todaysInspections.map(i => i.json.product_name))],\n  inspectors: [...new Set(todaysInspections.map(i => i.json.inspector_name))],\n  common_issues: {}\n};\n\nif (summary.total_inspections > 0) {\n  summary.pass_rate = ((summary.passed / summary.total_inspections) * 100).toFixed(1);\n}\n\n// Count non-conformities\ntodaysInspections.forEach(inspection => {\n  if (inspection.json.non_conformities) {\n    inspection.json.non_conformities.forEach(issue => {\n      summary.common_issues[issue] = (summary.common_issues[issue] || 0) + 1;\n    });\n  }\n});\n\nreturn summary;"
      },
      "typeVersion": 2
    },
    {
      "id": "4947aabe-e0be-4ea2-85f4-fa259b1f4290",
      "name": "Envoyer le Rapport Quotidien",
      "type": "n8n-nodes-base.slack",
      "position": [
        -48,
        656
      ],
      "webhookId": "e8a8d211-7f01-45d0-a16b-64675b98d59f",
      "parameters": {
        "text": "📊 *Daily Quality Report*\nDate: {{$json.date}}\n\n*Summary:*\n• Total Inspections: {{$json.total_inspections}}\n• Passed: {{$json.passed}} ✅\n• Failed: {{$json.failed}} ❌\n• Pass Rate: {{$json.pass_rate}}%\n\n*Products Inspected:*\n{{$json.products_inspected.join('\\n• ')}}",
        "otherOptions": {}
      },
      "typeVersion": 2.1
    },
    {
      "id": "151db029-c3da-4324-b523-014be9200479",
      "name": "Note",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        -944,
        112
      ],
      "parameters": {
        "width": 250,
        "height": 156,
        "content": "## 📥 INPUT SOURCES\n\n**Two ways to receive data:**\n- Form submissions\n- Scheduled checks"
      },
      "typeVersion": 1
    },
    {
      "id": "efd420c8-6496-4775-ae49-e9ddd0439deb",
      "name": "Note 2",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        -304,
        384
      ],
      "parameters": {
        "width": 200,
        "height": 152,
        "content": "## 🔄 PROCESSING\n\nCalculates compliance\nbased on specs"
      },
      "typeVersion": 1
    },
    {
      "id": "97aad2cd-f193-48d2-91c4-271a5c2d3a11",
      "name": "Note 3",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        -80,
        0
      ],
      "parameters": {
        "width": 372,
        "height": 136,
        "content": "## 💾 STORAGE\n\nSaves to Drive & tracking sheet"
      },
      "typeVersion": 1
    },
    {
      "id": "d214ceff-a286-4941-aa49-a2e8ccad92f4",
      "name": "Note 4",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        176,
        624
      ],
      "parameters": {
        "width": 180,
        "height": 136,
        "content": "## 🚨 ALERTS\n\nNotifies team\nfor failures only"
      },
      "typeVersion": 1
    },
    {
      "id": "76539b89-3dab-4804-b6f8-c2f4b5dac0ec",
      "name": "Note 5",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        336,
        320
      ],
      "parameters": {
        "width": 360,
        "height": 120,
        "content": "## 📋 DOCS\n\nGenerates & emails certificates"
      },
      "typeVersion": 1
    },
    {
      "id": "11a5eb71-0f1f-4d6e-8f40-11113c6513e0",
      "name": "Note 6",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        -912,
        688
      ],
      "parameters": {
        "width": 200,
        "height": 168,
        "content": "## 📊 DAILY REPORTS\n\nRuns at 8 AM\nSummarizes metrics"
      },
      "typeVersion": 1
    },
    {
      "id": "7191be65-1d4b-4ee1-8eb5-48dd0343c85a",
      "name": "Note1",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        -1008,
        384
      ],
      "parameters": {
        "width": 314,
        "height": 156,
        "content": "## 📥 MANUAL FORM\n\nJotform Trigger\n\nCreate your form for free on [Jotform using this link](https://www.jotform.com/?partner=mediajade)"
      },
      "typeVersion": 1
    },
    {
      "id": "db6112a6-2bfe-4242-b893-8c4ab757592b",
      "name": "Déclencheur Jotform",
      "type": "n8n-nodes-base.jotFormTrigger",
      "position": [
        -640,
        416
      ],
      "webhookId": "7ea0164b-ac9b-46b6-a7fa-bcd4003fe8cf",
      "parameters": {
        "form": "252815424602048"
      },
      "credentials": {
        "jotFormApi": {
          "id": "cOSh16Q5l4e0EB1A",
          "name": "Jotform jitesh@mediajade.com"
        }
      },
      "typeVersion": 1
    }
  ],
  "active": false,
  "pinData": {},
  "settings": {
    "executionOrder": "v1"
  },
  "versionId": "43118887-aa49-452b-81c1-4ad1fc98eabb",
  "connections": {
    "1af14ece-11a2-44a0-a935-8cdbdc0cff3e": {
      "main": [
        [
          {
            "node": "91204a97-f66a-4d3f-bc34-f9b06b25e21f",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "8665c487-3083-4f39-b9de-69ad7bd68afd": {
      "main": [
        [
          {
            "node": "ae823af6-bfe5-4c77-8789-b5c27daf5327",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "db6112a6-2bfe-4242-b893-8c4ab757592b": {
      "main": [
        [
          {
            "node": "9511a47d-58f0-4755-9f03-c36adfcffbe4",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "91204a97-f66a-4d3f-bc34-f9b06b25e21f": {
      "main": [
        [
          {
            "node": "4947aabe-e0be-4ea2-85f4-fa259b1f4290",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "8bbe8307-48a8-4875-9e55-27988dc638af": {
      "main": [
        [
          {
            "node": "1af14ece-11a2-44a0-a935-8cdbdc0cff3e",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "e1e70d0c-4d12-4e10-85fc-b42a062451d2": {
      "main": [
        [
          {
            "node": "622adac3-cd64-44d5-839e-dca015951252",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "32d6c442-d011-4dd4-8755-ed62277041b5": {
      "main": [
        [
          {
            "node": "e1e70d0c-4d12-4e10-85fc-b42a062451d2",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "09bfd902-b390-418e-8b95-52f1e2b12853": {
      "main": [
        [
          {
            "node": "9511a47d-58f0-4755-9f03-c36adfcffbe4",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "5c1c11fe-848e-4951-9423-e86a0bb8b14b": {
      "main": [
        [
          {
            "node": "32d6c442-d011-4dd4-8755-ed62277041b5",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "9511a47d-58f0-4755-9f03-c36adfcffbe4": {
      "main": [
        [
          {
            "node": "5c1c11fe-848e-4951-9423-e86a0bb8b14b",
            "type": "main",
            "index": 0
          },
          {
            "node": "8665c487-3083-4f39-b9de-69ad7bd68afd",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "8f4dabc5-b0f6-4f4b-8e07-aec5b456c963": {
      "main": [
        [
          {
            "node": "09bfd902-b390-418e-8b95-52f1e2b12853",
            "type": "main",
            "index": 0
          }
        ]
      ]
    }
  }
}
Foire aux questions

Comment utiliser ce workflow ?

Copiez le code de configuration JSON ci-dessus, créez un nouveau workflow dans votre instance n8n et sélectionnez "Importer depuis le JSON", collez la configuration et modifiez les paramètres d'authentification selon vos besoins.

Dans quelles scénarios ce workflow est-il adapté ?

Avancé

Est-ce payant ?

Ce workflow est entièrement gratuit et peut être utilisé directement. Veuillez noter que les services tiers utilisés dans le workflow (comme l'API OpenAI) peuvent nécessiter un paiement de votre part.

Informations sur le workflow
Niveau de difficulté
Avancé
Nombre de nœuds21
Catégorie-
Types de nœuds9
Description de la difficulté

Adapté aux utilisateurs avancés, avec des workflows complexes contenant 16+ nœuds

Auteur
Jitesh Dugar

Jitesh Dugar

@jiteshdugar

AI Automation Specialist - OpenAI, CRM & Automation Expert with a solid understanding of various tools that include Zapier, Make, Zoho CRM, Hubspot, Google Sheets, Airtable, Pipedrive, Google Analytics, and more.

Liens externes
Voir sur n8n.io

Partager ce workflow

Catégories

Catégories: 34