{
  "id": "portfolio-justificatifs-v1",
  "name": "Lot de justificatifs validés → exports CSV",
  "nodes": [
    { "parameters": { "httpMethod": "POST", "path": "portfolio-outbox-v1", "responseMode": "onReceived", "options": {} }, "id": "trigger", "name": "Déclenchement local", "type": "n8n-nodes-base.webhook", "typeVersion": 2, "position": [0, 0], "webhookId": "portfolio-outbox-v1" },
    { "parameters": { "method": "POST", "url": "={{ $env.SUPABASE_URL + '/rest/v1/rpc/claim_workflow_events' }}", "sendHeaders": true, "headerParameters": { "parameters": [{ "name": "apikey", "value": "={{ $env.SUPABASE_SERVER_KEY }}" }, { "name": "Authorization", "value": "={{ 'Bearer ' + $env.SUPABASE_SERVER_KEY }}" }] }, "sendBody": true, "contentType": "raw", "rawContentType": "application/json", "body": "{\"batch_size\":3}", "options": {} }, "id": "claim", "name": "Réclamer les tickets", "type": "n8n-nodes-base.httpRequest", "typeVersion": 4.2, "position": [220, 0] },
    { "parameters": { "jsCode": "const fail = $('Déclenchement local').first().json.query?.fail === '1'; const quote = (value) => '\"' + String(value ?? '').replaceAll('\"', '\"\"') + '\"'; const headers = ['commerce','date','total_ttc','tva','paiement','statut']; const crypto = require('crypto'); return $input.all().filter(({json:event}) => event.id).map(({json:event}) => { const values = [event.payload.merchant,event.payload.document_date,event.payload.total_ttc,event.payload.vat,event.payload.payment_method,'confirmee']; const csv = headers.join(',') + '\\n' + values.map(quote).join(',') + '\\n'; return {json:{event_id:event.id, fail, csv, checksum:crypto.createHash('sha256').update(csv).digest('hex')}}; });" }, "id": "prepare", "name": "Construire les lignes CSV", "type": "n8n-nodes-base.code", "typeVersion": 2, "position": [440, 0] },
    { "parameters": { "conditions": { "options": { "caseSensitive": true, "leftValue": "", "typeValidation": "strict" }, "conditions": [{ "id": "controlled", "leftValue": "={{ $json.fail }}", "rightValue": true, "operator": { "type": "boolean", "operation": "true", "singleValue": true } }], "combinator": "and" }, "options": {} }, "id": "branch", "name": "Panne contrôlée ?", "type": "n8n-nodes-base.if", "typeVersion": 2.2, "position": [660, 0] },
    { "parameters": { "method": "POST", "url": "={{ $env.SUPABASE_URL + '/rest/v1/rpc/fail_workflow_event' }}", "sendHeaders": true, "headerParameters": { "parameters": [{ "name": "apikey", "value": "={{ $env.SUPABASE_SERVER_KEY }}" }, { "name": "Authorization", "value": "={{ 'Bearer ' + $env.SUPABASE_SERVER_KEY }}" }] }, "sendBody": true, "contentType": "raw", "rawContentType": "application/json", "body": "={{ JSON.stringify({event: $json.event_id}) }}", "options": {} }, "id": "failure", "name": "Consigner et reprendre", "type": "n8n-nodes-base.httpRequest", "typeVersion": 4.2, "position": [880, -120] },
    { "parameters": { "method": "POST", "url": "={{ $env.SUPABASE_URL + '/rest/v1/rpc/complete_workflow_event' }}", "sendHeaders": true, "headerParameters": { "parameters": [{ "name": "apikey", "value": "={{ $env.SUPABASE_SERVER_KEY }}" }, { "name": "Authorization", "value": "={{ 'Bearer ' + $env.SUPABASE_SERVER_KEY }}" }] }, "sendBody": true, "contentType": "raw", "rawContentType": "application/json", "body": "={{ JSON.stringify({event: $json.event_id, csv: $json.csv, checksum: $json.checksum}) }}", "options": {} }, "id": "complete", "name": "Persister les exports", "type": "n8n-nodes-base.httpRequest", "typeVersion": 4.2, "position": [880, 120] }
  ],
  "connections": {
    "Déclenchement local": { "main": [[{ "node": "Réclamer les tickets", "type": "main", "index": 0 }]] },
    "Réclamer les tickets": { "main": [[{ "node": "Construire les lignes CSV", "type": "main", "index": 0 }]] },
    "Construire les lignes CSV": { "main": [[{ "node": "Panne contrôlée ?", "type": "main", "index": 0 }]] },
    "Panne contrôlée ?": { "main": [[{ "node": "Consigner et reprendre", "type": "main", "index": 0 }], [{ "node": "Persister les exports", "type": "main", "index": 0 }]] }
  },
  "active": true,
  "settings": { "executionOrder": "v1", "saveDataErrorExecution": "none", "saveDataSuccessExecution": "none", "saveManualExecutions": false },
  "versionId": "b6620833-9ad7-4e5d-8f2e-5c2fa489a82e",
  "meta": { "templateCredsSetupCompleted": true },
  "tags": []
}
