{
  "name": "DeCAred · Pedidos → borradores de DeCA",
  "nodes": [
    {
      "parameters": {
        "content": "## Pedidos → borradores de DeCA\n\nLee una hoja de Google con una fila por pedido y crea un borrador en DeCAred. La oficina lo revisa y lo emite.\n\nColumnas: `pedido`, `fecha_servicio` (AAAA-MM-DD, hoy o posterior), `origen`, `destino` y, si quieres, `nif_cargador`, `matricula`, `nif_conductor`, `mercancia`, `peso_kg`, `observaciones`. El cargador, el vehículo y el conductor deben existir en la agenda.\n\n**Clave de API.** Crea una credencial *Header Auth* llamada «Clave de API de DeCAred»:\n- Name: `Authorization`\n- Value: `Bearer dcr_…` (tu clave de DeCAred → Más → Integraciones)\n\n**Permiso de la clave:** `drafts:write`. Las claves generales de lectura y escritura ya lo incluyen.\n\nEs seguro repetirlo: la columna `pedido` evita duplicados. Si cambias los datos de un pedido ya enviado, DeCAred lo rechaza (`external_reference_conflict`) y no toca lo que ya creó. Ese pedido y cualquier otra fila rechazada aparecen en «Pedidos para revisar», con el motivo. Conecta ahí un aviso (correo, Slack…) si quieres enterarte sin abrir n8n.",
        "height": 640,
        "width": 480,
        "color": 4
      },
      "id": "5a88a79a-c777-5c38-b30f-9d868c262605",
      "name": "Nota",
      "type": "n8n-nodes-base.stickyNote",
      "typeVersion": 1,
      "position": [
        -520,
        -200
      ]
    },
    {
      "parameters": {
        "rule": {
          "interval": [
            {
              "field": "hours"
            }
          ]
        }
      },
      "id": "25c3b631-63be-52bb-bf57-c40dd0671c70",
      "name": "Cada hora",
      "type": "n8n-nodes-base.scheduleTrigger",
      "typeVersion": 1.2,
      "position": [
        0,
        0
      ]
    },
    {
      "parameters": {
        "documentId": {
          "__rl": true,
          "mode": "url",
          "value": ""
        },
        "sheetName": {
          "__rl": true,
          "mode": "name",
          "value": "Hoja 1"
        },
        "options": {}
      },
      "id": "cc19a9c2-8c39-5ef6-ac31-17622e476503",
      "name": "Pedidos de la hoja",
      "type": "n8n-nodes-base.googleSheets",
      "typeVersion": 4.5,
      "position": [
        220,
        0
      ],
      "credentials": {
        "googleSheetsOAuth2Api": {
          "id": "",
          "name": "Google Sheets"
        }
      }
    },
    {
      "parameters": {
        "method": "POST",
        "url": "https://decared.com/api/v1/drafts",
        "authentication": "genericCredentialType",
        "genericAuthType": "httpHeaderAuth",
        "options": {},
        "sendBody": true,
        "specifyBody": "json",
        "jsonBody": "={{ JSON.stringify({\n  external_reference: String($json.pedido),\n  shipper_nif: $json.nif_cargador || undefined,\n  vehicle_plate: $json.matricula || undefined,\n  driver_nif: $json.nif_conductor || undefined,\n  service_date: $json.fecha_servicio,\n  observations: $json.observaciones || undefined,\n  shipments: [{\n    origin: $json.origen,\n    destination: $json.destino,\n    goods: $json.mercancia || undefined,\n    weight: $json.peso_kg ? Number($json.peso_kg) : undefined,\n  }],\n}) }}"
      },
      "id": "99eb29c6-5294-5ea6-9577-700df07c41fa",
      "name": "Crear borrador",
      "type": "n8n-nodes-base.httpRequest",
      "typeVersion": 4.2,
      "position": [
        440,
        0
      ],
      "credentials": {
        "httpHeaderAuth": {
          "id": "",
          "name": "Clave de API de DeCAred"
        }
      },
      "onError": "continueErrorOutput"
    },
    {
      "parameters": {
        "jsCode": "// Una fila por cada pedido que DeCAred no aceptó, con el motivo para revisarla.\nreturn $input.all().map(({ json }) => {\n  const texto = json.error?.message ?? String(json.error ?? '');\n  const m = /^(\\d{3}) - (\".*\")$/s.exec(texto);\n  let respuesta = {};\n  try { respuesta = m ? JSON.parse(JSON.parse(m[2])) : {}; } catch (e) {}\n  return { json: {\n    pedido: json.pedido,\n    http: m ? Number(m[1]) : null,\n    codigo: respuesta.code ?? null,\n    motivo: respuesta.message ?? texto,\n    que_hacer: respuesta.code === 'external_reference_conflict'\n      ? 'Este pedido ya se envió con otros datos. Revisa en DeCAred el borrador o documento existente: no se ha cambiado nada.'\n      : 'Corrige la fila: se volverá a intentar en la próxima ejecución.',\n    request_id: respuesta.request_id ?? null,\n  } };\n});"
      },
      "id": "f67f988a-8baa-5bdc-bbdf-6aac946029f6",
      "name": "Pedidos para revisar",
      "type": "n8n-nodes-base.code",
      "typeVersion": 2,
      "position": [
        660,
        120
      ]
    }
  ],
  "connections": {
    "Cada hora": {
      "main": [
        [
          {
            "node": "Pedidos de la hoja",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Pedidos de la hoja": {
      "main": [
        [
          {
            "node": "Crear borrador",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Crear borrador": {
      "main": [
        [],
        [
          {
            "node": "Pedidos para revisar",
            "type": "main",
            "index": 0
          }
        ]
      ]
    }
  },
  "settings": {
    "executionOrder": "v1"
  },
  "meta": {
    "templateCredsSetupCompleted": false
  },
  "pinData": {}
}
