{
  "info": {
    "name": "Facturacion",
    "description": "Emision de comprobantes electronicos de UNA Empresa.\n\n## Credencial\n\nUsa la CREDENCIAL DE LA EMPRESA (company_client_id / company_client_secret), que se genera en el panel: Empresas -> icono del escudo -> Crear credencial. Cada Empresa tiene la suya y no sirve para las demas.\n\nLa credencial de la Cuenta (la de la coleccion \"Privadas\") NO puede facturar: responde 403. Y esta NO puede consultar RUC/DNI/establecimientos: tambien 403. Estan separadas a proposito.\n\nEl token se guarda en company_access_token, distinto del access_token de las consultas, para que ambas colecciones convivan sin pisarse.\n\n## Que se emite por donde\n\n- FACTURAS (tipo 01, serie F###): por POST /api/v2/cpe. Emision SINCRONA: se prepara, firma, empaqueta, transmite a SUNAT y solo se persiste con un resultado deterministico.\n- BOLETAS (tipo 03, serie B###): tambien por POST /api/v2/cpe, una a una, SINCRONA igual que Factura (mismo sendBill individual, misma respuesta en la misma llamada). El customer debe identificarse por DNI o sin documento, nunca por RUC. Agruparlas en un RESUMEN DIARIO (POST /api/v2/daily-summaries) sigue existiendo como via alternativa/agregada -carpeta 03-, pero ya NO es la unica forma de emitirlas.\n- NOTAS DE CREDITO/DEBITO (tipo 07/08): por POST /api/v2/cpe, exigen reference_document (el comprobante que corrigen, ya emitido por la misma Empresa) y reason_code (motivo, catalogo SUNAT 09/10). La serie debe empezar con el mismo prefijo (F/B) del documento referenciado -carpeta 06-.\n\n## Descarga de artifacts\n\nGET /api/v2/cpe/{uuid} solo trae flags de existencia. Los bytes reales (XML firmado, CDR) se descargan por separado -carpeta 07-.\n\n## Cuota\n\nDesde el sistema de planes, las rutas que construyen XML y lo transmiten (POST /api/v2/cpe, POST /api/v2/daily-summaries) descuentan de la cuota de la Empresa y responden 402 si no queda. Ver la carpeta \"05 - Errores esperados\".\n\nUn reintento con el mismo external_reference NO consume cuota: devuelve el comprobante ya emitido.\n\n## Antes de ejecutar\n\nAjusta en el environment:\n- company_client_id / company_client_secret\n- issuer_ruc: el RUC de TU empresa. Si no coincide con el de la credencial, 422.\n- factura_serie / factura_numero: la numeracion desde la que quieres seguir.",
    "schema": "https://schema.getpostman.com/json/collection/v2.1.0/collection.json"
  },
  "auth": {
    "type": "bearer",
    "bearer": [{ "key": "token", "value": "{{company_access_token}}", "type": "string" }]
  },
  "event": [
    {
      "listen": "prerequest",
      "script": {
        "type": "text/javascript",
        "exec": [
          "// Fechas al vuelo: SUNAT rechaza comprobantes con fecha futura,",
          "// y un ejemplo con la fecha escrita a mano caduca al dia siguiente.",
          "const pad = (n) => String(n).padStart(2, '0');",
          "const ymd = (d) => d.getFullYear() + '-' + pad(d.getMonth() + 1) + '-' + pad(d.getDate());",
          "",
          "const hoy = new Date();",
          "const ayer = new Date(hoy.getTime() - 86400000);",
          "const en30 = new Date(hoy.getTime() + 30 * 86400000);",
          "const en60 = new Date(hoy.getTime() + 60 * 86400000);",
          "",
          "pm.environment.set('hoy', ymd(hoy));",
          "pm.environment.set('ayer', ymd(ayer));",
          "pm.environment.set('en_30_dias', ymd(en30));",
          "pm.environment.set('en_60_dias', ymd(en60));",
          "",
          "if (!pm.environment.get('company_access_token')) {",
          "    console.warn('No hay company_access_token. Ejecuta primero \"token (empresa)\".');",
          "}"
        ]
      }
    }
  ],
  "item": [
    {
      "name": "01 - Autenticacion",
      "item": [
        {
          "name": "token (empresa)",
          "event": [
            {
              "listen": "test",
              "script": {
                "type": "text/javascript",
                "exec": [
                  "pm.test('Responde 200', () => pm.response.to.have.status(200));",
                  "",
                  "const body = pm.response.json();",
                  "",
                  "pm.test('Trae access_token', () => {",
                  "    pm.expect(body.data).to.have.property('access_token');",
                  "});",
                  "",
                  "if (body.data && body.data.access_token) {",
                  "    pm.environment.set('company_access_token', body.data.access_token);",
                  "    pm.environment.set('company_token_expires_at', body.data.expires_at);",
                  "    console.log('Token de empresa guardado. Vence: ' + body.data.expires_at);",
                  "}"
                ]
              }
            }
          ],
          "request": {
            "auth": { "type": "noauth" },
            "method": "POST",
            "header": [
              { "key": "Accept", "value": "application/json" },
              { "key": "Content-Type", "value": "application/json" }
            ],
            "body": {
              "mode": "raw",
              "raw": "{\n    \"client_id\": \"{{company_client_id}}\",\n    \"client_secret\": \"{{company_client_secret}}\"\n}"
            },
            "url": {
              "raw": "{{base_url}}/api/v1/auth/token",
              "host": ["{{base_url}}"],
              "path": ["api", "v1", "auth", "token"]
            },
            "description": "Mismo endpoint de token para todas las credenciales; lo que cambia es cual envias.\n\n- 200: token emitido, vence a los 60 min.\n- 422: falta client_id o client_secret.\n- 401: credenciales invalidas, integracion inactiva, o Empresa desactivada/eliminada."
          }
        },
        {
          "name": "context",
          "event": [
            {
              "listen": "test",
              "script": {
                "type": "text/javascript",
                "exec": [
                  "pm.test('Responde 200', () => pm.response.to.have.status(200));",
                  "",
                  "const data = pm.response.json().data || {};",
                  "",
                  "pm.test('El scope es company', () => {",
                  "    pm.expect(data.scope).to.eql('company');",
                  "});",
                  "",
                  "console.log('Empresa de la credencial: ' + JSON.stringify(data.company || data));"
                ]
              }
            }
          ],
          "request": {
            "method": "GET",
            "header": [{ "key": "Accept", "value": "application/json" }],
            "url": {
              "raw": "{{base_url}}/api/v1/auth/context",
              "host": ["{{base_url}}"],
              "path": ["api", "v1", "auth", "context"]
            },
            "description": "Confirma con que credencial estas autenticado y sobre que Empresa vas a emitir.\n\nSi scope viene como \"account\", estas con la credencial equivocada y todo lo de esta coleccion te dara 403."
          }
        },
        {
          "name": "revoke",
          "request": {
            "method": "POST",
            "header": [{ "key": "Accept", "value": "application/json" }],
            "url": {
              "raw": "{{base_url}}/api/v1/auth/revoke",
              "host": ["{{base_url}}"],
              "path": ["api", "v1", "auth", "revoke"]
            },
            "description": "Invalida el token actual de la Empresa. No toca la credencial: eso se hace desde el panel."
          }
        }
      ]
    },
    {
      "name": "01b - Aprovisionamiento SUNAT",
      "description": "Credenciales SOL, credenciales GRE y certificado digital de esta misma Empresa (mismo escritor de dominio que el panel, antes solo existian como modales en Empresas -> editar). Sin company_code: la Empresa se resuelve siempre desde la credencial, igual que la emision. Requisito previo para emitir en produccion (en beta no hace falta certificado).",
      "item": [
        {
          "name": "Guardar credenciales SOL",
          "event": [
            {
              "listen": "test",
              "script": {
                "type": "text/javascript",
                "exec": [
                  "if (pm.response.code === 200) {",
                  "    const data = pm.response.json().data || {};",
                  "    console.log('connected: ' + data.connected + ' | configured_at: ' + data.configured_at);",
                  "} else {",
                  "    console.warn(pm.response.code + ': ' + JSON.stringify(pm.response.json()));",
                  "}"
                ]
              }
            }
          ],
          "request": {
            "method": "PUT",
            "header": [
              { "key": "Accept", "value": "application/json" },
              { "key": "Content-Type", "value": "application/json" }
            ],
            "body": {
              "mode": "raw",
              "raw": "{\n    \"sol_username\": \"{{sol_username}}\",\n    \"sol_password\": \"{{sol_password}}\"\n}"
            },
            "url": {
              "raw": "{{base_url}}/api/v2/company/sunat-credentials",
              "host": ["{{base_url}}"],
              "path": ["api", "v2", "company", "sunat-credentials"]
            },
            "description": "Primer guardado: sol_username y sol_password obligatorios. Guardados posteriores: sol_password es opcional -si se omite o llega vacio, se conserva la clave actual-.\n\nsol_username no puede incluir el RUC concatenado (ej. 20123456789FACTURADOR): 422.\n\nLa respuesta nunca incluye sol_username ni sol_password, solo el estado: connected, is_configured, configured_at."
          }
        },
        {
          "name": "Cargar certificado digital",
          "event": [
            {
              "listen": "test",
              "script": {
                "type": "text/javascript",
                "exec": [
                  "if (pm.response.code === 200) {",
                  "    const data = pm.response.json().data || {};",
                  "    console.log('connected: ' + data.connected + ' | status: ' + data.status + ' | vence: ' + data.valid_until);",
                  "} else {",
                  "    console.warn(pm.response.code + ': ' + JSON.stringify(pm.response.json()));",
                  "}"
                ]
              }
            }
          ],
          "request": {
            "method": "POST",
            "header": [{ "key": "Accept", "value": "application/json" }],
            "body": {
              "mode": "formdata",
              "formdata": [
                { "key": "certificate_file", "type": "file", "src": [] },
                { "key": "certificate_password", "value": "{{certificate_password}}", "type": "text" }
              ]
            },
            "url": {
              "raw": "{{base_url}}/api/v2/company/digital-certificate",
              "host": ["{{base_url}}"],
              "path": ["api", "v2", "company", "digital-certificate"]
            },
            "description": "multipart/form-data: certificate_file (.pfx/.p12, maximo 5 MB) + certificate_password. Selecciona el archivo real en el campo certificate_file antes de enviar (Postman no permite precargar un path de archivo en un environment).\n\nValidacion profunda del contenido real: lectura PKCS#12 con la clave dada, presencia de certificado y de su clave privada. Reemplazo seguro: el certificado anterior se conserva integro si algo falla.\n\nLa respuesta nunca incluye disk, path ni certificate_password: trae connected, status (pending/not_yet_valid/expired/valid) y todos los metadatos publicos (serial_number, fingerprint_sha256, subject_name, issuer_name, valid_from, valid_until, days_until_expiration, uploaded_at)."
          }
        },
        {
          "name": "Guardar credenciales GRE",
          "event": [
            {
              "listen": "test",
              "script": {
                "type": "text/javascript",
                "exec": [
                  "if (pm.response.code === 200) {",
                  "    const data = pm.response.json().data || {};",
                  "    console.log('connected: ' + data.connected + ' | configured_at: ' + data.configured_at);",
                  "} else {",
                  "    console.warn(pm.response.code + ': ' + JSON.stringify(pm.response.json()));",
                  "}"
                ]
              }
            }
          ],
          "request": {
            "method": "PUT",
            "header": [
              { "key": "Accept", "value": "application/json" },
              { "key": "Content-Type", "value": "application/json" }
            ],
            "body": {
              "mode": "raw",
              "raw": "{\n    \"client_id\": \"{{gre_client_id}}\",\n    \"client_secret\": \"{{gre_client_secret}}\"\n}"
            },
            "url": {
              "raw": "{{base_url}}/api/v2/company/gre-credentials",
              "host": ["{{base_url}}"],
              "path": ["api", "v2", "company", "gre-credentials"]
            },
            "description": "Credenciales OAuth2 de la API REST GRE (Guia de Remision Electronica), generadas en el menu SOL de SUNAT -distintas del Usuario/Clave SOL, que ya se administra en 'Guardar credenciales SOL'-.\n\nPrimer guardado: client_id y client_secret obligatorios. Guardados posteriores: client_secret es opcional -si se omite o llega vacio, se conserva el actual-.\n\nLa respuesta nunca incluye client_id ni client_secret, solo el estado: connected, is_configured, configured_at."
          }
        },
        {
          "name": "Ficha de mi empresa",
          "request": {
            "method": "GET",
            "header": [{ "key": "Accept", "value": "application/json" }],
            "url": {
              "raw": "{{base_url}}/api/v2/company",
              "host": ["{{base_url}}"],
              "path": ["api", "v2", "company"]
            },
            "description": "Sin company_code: devuelve siempre la empresa de esta credencial, con indicadores seguros de configuracion tributaria, credenciales SOL y certificado digital."
          }
        }
      ]
    },
    {
      "name": "02 - Facturas (tipo 01)",
      "description": "POST /api/v2/cpe. Solo facturas: document_type_code 01 y serie F###.\n\nCada request guarda cpe_uuid y avanza factura_numero al emitir, para que puedas ejecutarlos en cadena sin editar nada.",
      "item": [
        {
          "name": "Factura al contado - un servicio gravado",
          "event": [
            {
              "listen": "prerequest",
              "script": {
                "type": "text/javascript",
                "exec": [
                  "// external_reference es TU identificador del comprobante.",
                  "// Repetirlo devuelve el mismo comprobante sin volver a emitir",
                  "// ni consumir cuota: es la clave de idempotencia.",
                  "pm.environment.set('external_reference', 'VTA-' + Date.now());"
                ]
              }
            },
            {
              "listen": "test",
              "script": {
                "type": "text/javascript",
                "exec": [
                  "const body = pm.response.json();",
                  "",
                  "if (pm.response.code === 403) {",
                  "    console.warn('403: esta ruta exige la credencial de la EMPRESA, no la de la Cuenta.');",
                  "}",
                  "",
                  "if (pm.response.code === 402) {",
                  "    console.warn('402 (' + body.code + '): ' + body.message);",
                  "}",
                  "",
                  "if (pm.response.code === 422) {",
                  "    console.warn('422: ' + JSON.stringify(body.errors || body.message));",
                  "}",
                  "",
                  "if (pm.response.code === 201 || pm.response.code === 200) {",
                  "    const data = body.data || {};",
                  "",
                  "    if (data.uuid) {",
                  "        pm.environment.set('cpe_uuid', data.uuid);",
                  "        pm.environment.set('ultima_external_reference', pm.environment.get('external_reference'));",
                  "        console.log('cpe_uuid guardado: ' + data.uuid);",
                  "    }",
                  "",
                  "    // Avanza la numeracion para el siguiente envio.",
                  "    const siguiente = parseInt(pm.environment.get('factura_numero') || '1', 10) + 1;",
                  "    pm.environment.set('factura_numero', String(siguiente));",
                  "",
                  "    console.log('Estado SUNAT: ' + (data.sunat_status || data.status || 'ver detalle'));",
                  "}",
                  "",
                  "pm.test('No es un error del cliente', () => {",
                  "    pm.expect([200, 201]).to.include(pm.response.code);",
                  "});"
                ]
              }
            }
          ],
          "request": {
            "method": "POST",
            "header": [
              { "key": "Accept", "value": "application/json" },
              { "key": "Content-Type", "value": "application/json" }
            ],
            "body": {
              "mode": "raw",
              "raw": "{\n    \"external_reference\": \"{{external_reference}}\",\n    \"document_type_code\": \"01\",\n    \"series\": \"{{factura_serie}}\",\n    \"number\": \"{{factura_numero}}\",\n    \"issue_date\": \"{{hoy}}\",\n    \"currency_code\": \"PEN\",\n    \"country_code\": \"PE\",\n    \"sunat_establishment_code\": \"0000\",\n    \"operation_type_code\": \"0101\",\n    \"issuer\": {\n        \"ruc\": \"{{issuer_ruc}}\"\n    },\n    \"customer\": {\n        \"document_type_code\": \"6\",\n        \"document_number\": \"20100047218\",\n        \"name\": \"BANCO DE CREDITO DEL PERU\",\n        \"address\": \"AV. CENTENARIO NRO. 156 URB. LAS LADERAS DE MELGAREJO - LA MOLINA - LIMA\"\n    },\n    \"items\": [\n        {\n            \"code\": \"SERV-001\",\n            \"description\": \"Servicio de desarrollo de software - agosto 2026\",\n            \"quantity\": \"1.00\",\n            \"unit_code\": \"ZZ\",\n            \"unit_value\": \"1500.00\",\n            \"line_value\": \"1500.00\",\n            \"igv_type_code\": \"10\",\n            \"igv_percentage\": \"18.00\",\n            \"igv_amount\": \"270.00\",\n            \"line_total\": \"1770.00\"\n        }\n    ],\n    \"totals\": {\n        \"taxable_amount\": \"1500.00\",\n        \"exonerated_amount\": \"0.00\",\n        \"unaffected_amount\": \"0.00\",\n        \"igv_amount\": \"270.00\",\n        \"total_amount\": \"1770.00\"\n    },\n    \"payment\": {\n        \"type\": \"contado\"\n    }\n}"
            },
            "url": {
              "raw": "{{base_url}}/api/v2/cpe",
              "host": ["{{base_url}}"],
              "path": ["api", "v2", "cpe"]
            },
            "description": "El caso mas comun: un servicio gravado con IGV, pagado al contado.\n\n## Como se arma\n\n- unit_value es SIN IGV. line_value = quantity x unit_value.\n- igv_type_code 10 = \"Gravado - Operacion Onerosa\" (catalogo 07 de SUNAT).\n- igv_amount = line_value x 18%. line_total = line_value + igv_amount.\n- unit_code sale del catalogo 03: NIU para bienes, ZZ para servicios.\n- totals.taxable_amount es la suma de los line_value gravados, sin IGV.\n- total_amount = taxable + exonerated + unaffected + igv.\n\nLos importes van como CADENA, no como numero: en coma flotante \"0.1 + 0.2\" no da \"0.30\", y un comprobante no admite ese margen.\n\n## Campos que NO se envian\n\ncompany_code se rechaza con 422: la empresa emisora la fija la credencial, no el cuerpo. Lo mismo con team_id, user_id, api_client_id y demas.\n\nissuer.ruc SI es obligatorio, y debe coincidir con el RUC de la empresa de la credencial.\n\n## Respuestas\n\n- 201: emitido. Un RECHAZO de SUNAT tambien llega como 201, con el estado dentro: es un desenlace valido, no un error HTTP.\n- 402: la empresa no tiene cuota. Ver \"05 - Errores esperados\".\n- 403: estas con la credencial de la Cuenta.\n- 422: validacion. El detalle viene en errors."
          }
        },
        {
          "name": "Factura al credito - dos cuotas",
          "event": [
            {
              "listen": "prerequest",
              "script": {
                "type": "text/javascript",
                "exec": [
                  "pm.environment.set('external_reference', 'VTA-CRED-' + Date.now());"
                ]
              }
            },
            {
              "listen": "test",
              "script": {
                "type": "text/javascript",
                "exec": [
                  "if (pm.response.code === 201 || pm.response.code === 200) {",
                  "    const data = pm.response.json().data || {};",
                  "    if (data.uuid) { pm.environment.set('cpe_uuid', data.uuid); }",
                  "",
                  "    const siguiente = parseInt(pm.environment.get('factura_numero') || '1', 10) + 1;",
                  "    pm.environment.set('factura_numero', String(siguiente));",
                  "} else {",
                  "    console.warn(pm.response.code + ': ' + JSON.stringify(pm.response.json()));",
                  "}"
                ]
              }
            }
          ],
          "request": {
            "method": "POST",
            "header": [
              { "key": "Accept", "value": "application/json" },
              { "key": "Content-Type", "value": "application/json" }
            ],
            "body": {
              "mode": "raw",
              "raw": "{\n    \"external_reference\": \"{{external_reference}}\",\n    \"document_type_code\": \"01\",\n    \"series\": \"{{factura_serie}}\",\n    \"number\": \"{{factura_numero}}\",\n    \"issue_date\": \"{{hoy}}\",\n    \"currency_code\": \"PEN\",\n    \"country_code\": \"PE\",\n    \"sunat_establishment_code\": \"0000\",\n    \"operation_type_code\": \"0101\",\n    \"issuer\": {\n        \"ruc\": \"{{issuer_ruc}}\"\n    },\n    \"customer\": {\n        \"document_type_code\": \"6\",\n        \"document_number\": \"20131312955\",\n        \"name\": \"SUPERINTENDENCIA NACIONAL DE ADUANAS Y DE ADMINISTRACION TRIBUTARIA\",\n        \"address\": \"AV. GARCILASO DE LA VEGA NRO. 1472 - LIMA\"\n    },\n    \"items\": [\n        {\n            \"code\": \"PROD-100\",\n            \"description\": \"Laptop 14 pulgadas 16GB RAM\",\n            \"quantity\": \"2.00\",\n            \"unit_code\": \"NIU\",\n            \"unit_value\": \"2500.00\",\n            \"line_value\": \"5000.00\",\n            \"igv_type_code\": \"10\",\n            \"igv_percentage\": \"18.00\",\n            \"igv_amount\": \"900.00\",\n            \"line_total\": \"5900.00\"\n        }\n    ],\n    \"totals\": {\n        \"taxable_amount\": \"5000.00\",\n        \"exonerated_amount\": \"0.00\",\n        \"unaffected_amount\": \"0.00\",\n        \"igv_amount\": \"900.00\",\n        \"total_amount\": \"5900.00\"\n    },\n    \"payment\": {\n        \"type\": \"credito\",\n        \"installments\": [\n            {\n                \"amount\": \"2950.00\",\n                \"due_date\": \"{{en_30_dias}}\"\n            },\n            {\n                \"amount\": \"2950.00\",\n                \"due_date\": \"{{en_60_dias}}\"\n            }\n        ]\n    }\n}"
            },
            "url": {
              "raw": "{{base_url}}/api/v2/cpe",
              "host": ["{{base_url}}"],
              "path": ["api", "v2", "cpe"]
            },
            "description": "Venta al credito. Cambia solo el bloque payment.\n\n- payment.type = \"credito\" obliga a enviar installments (1 a 36 cuotas).\n- La suma de las cuotas debe cuadrar con el total del comprobante.\n- due_date en formato Y-m-d.\n\nCon type = \"contado\" no se envian cuotas."
          }
        },
        {
          "name": "Factura mixta - gravado, exonerado e inafecto",
          "event": [
            {
              "listen": "prerequest",
              "script": {
                "type": "text/javascript",
                "exec": [
                  "pm.environment.set('external_reference', 'VTA-MIX-' + Date.now());"
                ]
              }
            },
            {
              "listen": "test",
              "script": {
                "type": "text/javascript",
                "exec": [
                  "if (pm.response.code === 201 || pm.response.code === 200) {",
                  "    const data = pm.response.json().data || {};",
                  "    if (data.uuid) { pm.environment.set('cpe_uuid', data.uuid); }",
                  "",
                  "    const siguiente = parseInt(pm.environment.get('factura_numero') || '1', 10) + 1;",
                  "    pm.environment.set('factura_numero', String(siguiente));",
                  "} else {",
                  "    console.warn(pm.response.code + ': ' + JSON.stringify(pm.response.json()));",
                  "}"
                ]
              }
            }
          ],
          "request": {
            "method": "POST",
            "header": [
              { "key": "Accept", "value": "application/json" },
              { "key": "Content-Type", "value": "application/json" }
            ],
            "body": {
              "mode": "raw",
              "raw": "{\n    \"external_reference\": \"{{external_reference}}\",\n    \"document_type_code\": \"01\",\n    \"series\": \"{{factura_serie}}\",\n    \"number\": \"{{factura_numero}}\",\n    \"issue_date\": \"{{hoy}}\",\n    \"currency_code\": \"PEN\",\n    \"country_code\": \"PE\",\n    \"sunat_establishment_code\": \"0000\",\n    \"operation_type_code\": \"0101\",\n    \"issuer\": {\n        \"ruc\": \"{{issuer_ruc}}\"\n    },\n    \"customer\": {\n        \"document_type_code\": \"6\",\n        \"document_number\": \"20100047218\",\n        \"name\": \"BANCO DE CREDITO DEL PERU\",\n        \"address\": \"AV. CENTENARIO NRO. 156 - LA MOLINA - LIMA\"\n    },\n    \"items\": [\n        {\n            \"code\": \"PROD-A\",\n            \"description\": \"Monitor 24 pulgadas\",\n            \"quantity\": \"3.00\",\n            \"unit_code\": \"NIU\",\n            \"unit_value\": \"600.00\",\n            \"line_value\": \"1800.00\",\n            \"igv_type_code\": \"10\",\n            \"igv_percentage\": \"18.00\",\n            \"igv_amount\": \"324.00\",\n            \"line_total\": \"2124.00\"\n        },\n        {\n            \"code\": \"LIB-001\",\n            \"description\": \"Libro tecnico de contabilidad\",\n            \"quantity\": \"5.00\",\n            \"unit_code\": \"NIU\",\n            \"unit_value\": \"80.00\",\n            \"line_value\": \"400.00\",\n            \"igv_type_code\": \"20\",\n            \"igv_percentage\": \"0.00\",\n            \"igv_amount\": \"0.00\",\n            \"line_total\": \"400.00\"\n        },\n        {\n            \"code\": \"TRA-001\",\n            \"description\": \"Servicio de transporte de carga internacional\",\n            \"quantity\": \"1.00\",\n            \"unit_code\": \"ZZ\",\n            \"unit_value\": \"950.00\",\n            \"line_value\": \"950.00\",\n            \"igv_type_code\": \"30\",\n            \"igv_percentage\": \"0.00\",\n            \"igv_amount\": \"0.00\",\n            \"line_total\": \"950.00\"\n        }\n    ],\n    \"totals\": {\n        \"taxable_amount\": \"1800.00\",\n        \"exonerated_amount\": \"400.00\",\n        \"unaffected_amount\": \"950.00\",\n        \"igv_amount\": \"324.00\",\n        \"total_amount\": \"3474.00\"\n    },\n    \"payment\": {\n        \"type\": \"contado\"\n    }\n}"
            },
            "url": {
              "raw": "{{base_url}}/api/v2/cpe",
              "host": ["{{base_url}}"],
              "path": ["api", "v2", "cpe"]
            },
            "description": "Tres regimenes de IGV en el mismo comprobante, que es donde suelen aparecer los descuadres.\n\nigv_type_code (catalogo 07 de SUNAT):\n- 10 = Gravado. Suma a taxable_amount y genera IGV.\n- 20 = Exonerado. Suma a exonerated_amount, IGV en cero.\n- 30 = Inafecto. Suma a unaffected_amount, IGV en cero.\n\nCada linea suma a SU total, y total_amount es la suma de los tres mas el IGV:\n1800 + 400 + 950 + 324 = 3474.\n\nSi los totales no cuadran con las lineas, la respuesta es 422 antes de llegar a SUNAT."
          }
        },
        {
          "name": "Reintento idempotente (no consume cuota)",
          "event": [
            {
              "listen": "prerequest",
              "script": {
                "type": "text/javascript",
                "exec": [
                  "// Reutiliza a proposito el external_reference del ultimo",
                  "// envio: eso es lo que se esta probando.",
                  "const previa = pm.environment.get('ultima_external_reference');",
                  "",
                  "if (!previa) {",
                  "    console.warn('Ejecuta primero \"Factura al contado\": de ahi sale la referencia a repetir.');",
                  "}"
                ]
              }
            },
            {
              "listen": "test",
              "script": {
                "type": "text/javascript",
                "exec": [
                  "pm.test('Devuelve el comprobante ya emitido', () => {",
                  "    pm.expect([200, 201]).to.include(pm.response.code);",
                  "});",
                  "",
                  "const data = pm.response.json().data || {};",
                  "",
                  "pm.test('Es el MISMO comprobante, no uno nuevo', () => {",
                  "    pm.expect(data.uuid).to.eql(pm.environment.get('cpe_uuid'));",
                  "});",
                  "",
                  "console.log('Reintento resuelto sin emitir de nuevo ni descontar cuota.');"
                ]
              }
            }
          ],
          "request": {
            "method": "POST",
            "header": [
              { "key": "Accept", "value": "application/json" },
              { "key": "Content-Type", "value": "application/json" }
            ],
            "body": {
              "mode": "raw",
              "raw": "{\n    \"external_reference\": \"{{ultima_external_reference}}\",\n    \"document_type_code\": \"01\",\n    \"series\": \"{{factura_serie}}\",\n    \"number\": \"{{factura_numero}}\",\n    \"issue_date\": \"{{hoy}}\",\n    \"currency_code\": \"PEN\",\n    \"country_code\": \"PE\",\n    \"sunat_establishment_code\": \"0000\",\n    \"operation_type_code\": \"0101\",\n    \"issuer\": {\n        \"ruc\": \"{{issuer_ruc}}\"\n    },\n    \"customer\": {\n        \"document_type_code\": \"6\",\n        \"document_number\": \"20100047218\",\n        \"name\": \"BANCO DE CREDITO DEL PERU\",\n        \"address\": \"AV. CENTENARIO NRO. 156 - LA MOLINA - LIMA\"\n    },\n    \"items\": [\n        {\n            \"code\": \"SERV-001\",\n            \"description\": \"Servicio de desarrollo de software - agosto 2026\",\n            \"quantity\": \"1.00\",\n            \"unit_code\": \"ZZ\",\n            \"unit_value\": \"1500.00\",\n            \"line_value\": \"1500.00\",\n            \"igv_type_code\": \"10\",\n            \"igv_percentage\": \"18.00\",\n            \"igv_amount\": \"270.00\",\n            \"line_total\": \"1770.00\"\n        }\n    ],\n    \"totals\": {\n        \"taxable_amount\": \"1500.00\",\n        \"exonerated_amount\": \"0.00\",\n        \"unaffected_amount\": \"0.00\",\n        \"igv_amount\": \"270.00\",\n        \"total_amount\": \"1770.00\"\n    },\n    \"payment\": {\n        \"type\": \"contado\"\n    }\n}"
            },
            "url": {
              "raw": "{{base_url}}/api/v2/cpe",
              "host": ["{{base_url}}"],
              "path": ["api", "v2", "cpe"]
            },
            "description": "Que hacer cuando se corta la red y no sabes si el comprobante llego.\n\nRespuesta: reenviar EXACTAMENTE el mismo external_reference. El sistema devuelve el comprobante ya emitido en lugar de emitir otro, y no descuenta cuota: el reintento ni siquiera llega al punto donde se registra el consumo.\n\nPor eso external_reference debe ser tu identificador estable de la venta, no un aleatorio nuevo en cada intento."
          }
        }
      ]
    },
    {
      "name": "02b - Boletas (tipo 03)",
      "description": "POST /api/v2/cpe. Boleta individual, sincrona -mismo pipeline que Factura, mismo sendBill, misma respuesta en la misma llamada-. No requiere pasar por Resumen Diario (carpeta 03, que sigue existiendo como alternativa/agregada).",
      "item": [
        {
          "name": "Boleta al contado - persona natural",
          "event": [
            {
              "listen": "prerequest",
              "script": {
                "type": "text/javascript",
                "exec": [
                  "pm.environment.set('external_reference', 'BOL-' + Date.now());"
                ]
              }
            },
            {
              "listen": "test",
              "script": {
                "type": "text/javascript",
                "exec": [
                  "if (pm.response.code === 201 || pm.response.code === 200) {",
                  "    const data = pm.response.json().data || {};",
                  "    if (data.document && data.document.uuid) {",
                  "        pm.environment.set('cpe_uuid', data.document.uuid);",
                  "        console.log('cpe_uuid guardado: ' + data.document.uuid);",
                  "    }",
                  "",
                  "    const siguiente = parseInt(pm.environment.get('boleta_numero') || '1', 10) + 1;",
                  "    pm.environment.set('boleta_numero', String(siguiente));",
                  "} else {",
                  "    console.warn(pm.response.code + ': ' + JSON.stringify(pm.response.json()));",
                  "}"
                ]
              }
            }
          ],
          "request": {
            "method": "POST",
            "header": [
              { "key": "Accept", "value": "application/json" },
              { "key": "Content-Type", "value": "application/json" }
            ],
            "body": {
              "mode": "raw",
              "raw": "{\n    \"external_reference\": \"{{external_reference}}\",\n    \"document_type_code\": \"03\",\n    \"series\": \"{{boleta_serie}}\",\n    \"number\": \"{{boleta_numero}}\",\n    \"issue_date\": \"{{hoy}}\",\n    \"currency_code\": \"PEN\",\n    \"country_code\": \"PE\",\n    \"sunat_establishment_code\": \"0000\",\n    \"operation_type_code\": \"0101\",\n    \"issuer\": {\n        \"ruc\": \"{{issuer_ruc}}\"\n    },\n    \"customer\": {\n        \"document_type_code\": \"1\",\n        \"document_number\": \"45678912\",\n        \"name\": \"Cliente Persona Natural\"\n    },\n    \"items\": [\n        {\n            \"code\": \"PROD-001\",\n            \"description\": \"Producto al menudeo\",\n            \"quantity\": \"1.00\",\n            \"unit_code\": \"NIU\",\n            \"unit_value\": \"100.00\",\n            \"line_value\": \"100.00\",\n            \"igv_type_code\": \"10\",\n            \"igv_percentage\": \"18.00\",\n            \"igv_amount\": \"18.00\",\n            \"line_total\": \"118.00\"\n        }\n    ],\n    \"totals\": {\n        \"taxable_amount\": \"100.00\",\n        \"exonerated_amount\": \"0.00\",\n        \"unaffected_amount\": \"0.00\",\n        \"igv_amount\": \"18.00\",\n        \"total_amount\": \"118.00\"\n    },\n    \"payment\": {\n        \"type\": \"contado\"\n    }\n}"
            },
            "url": {
              "raw": "{{base_url}}/api/v2/cpe",
              "host": ["{{base_url}}"],
              "path": ["api", "v2", "cpe"]
            },
            "description": "Mismo endpoint que Factura, document_type_code 03 y serie B### (patron ^B[A-Z0-9]{3}$; una serie F### aqui da 422).\n\ncustomer.document_type_code debe ser 1 (DNI) o 0 (sin documento) -nunca 6 (RUC), a diferencia de Factura.\n\nRespuesta identica en forma a la de Factura: 201, con el CDR de SUNAT en la misma llamada."
          }
        }
      ]
    },
    {
      "name": "03 - Boletas: Resumen Diario (tipo 03)",
      "description": "Via alternativa/agregada para declarar boletas (la carpeta 02b emite una a una, sincrona). SUNAT tambien las recibe agrupadas en un Resumen Diario, util para volumenes altos.\n\nEl envio es ASINCRONO: SUNAT devuelve un ticket y el resultado se consulta despues. Por eso hay un request de estado.",
      "item": [
        {
          "name": "Enviar resumen diario",
          "event": [
            {
              "listen": "prerequest",
              "script": {
                "type": "text/javascript",
                "exec": [
                  "pm.environment.set('external_reference', 'RC-' + Date.now());"
                ]
              }
            },
            {
              "listen": "test",
              "script": {
                "type": "text/javascript",
                "exec": [
                  "const body = pm.response.json();",
                  "",
                  "if (pm.response.code === 402) {",
                  "    console.warn('402 (' + body.code + '): ' + body.message);",
                  "}",
                  "",
                  "if (pm.response.code === 422) {",
                  "    console.warn('422: ' + JSON.stringify(body.errors || body.message));",
                  "}",
                  "",
                  "if (pm.response.code === 201 || pm.response.code === 200) {",
                  "    const data = body.data || {};",
                  "",
                  "    if (data.uuid) {",
                  "        pm.environment.set('daily_summary_uuid', data.uuid);",
                  "        console.log('daily_summary_uuid guardado: ' + data.uuid);",
                  "    }",
                  "",
                  "    // El correlativo es por dia: dos resumenes del mismo dia",
                  "    // no pueden repetirlo.",
                  "    const siguiente = parseInt(pm.environment.get('resumen_correlativo') || '1', 10) + 1;",
                  "    pm.environment.set('resumen_correlativo', String(siguiente));",
                  "",
                  "    console.log('Ticket SUNAT: ' + (data.sunat_ticket || 'ver detalle'));",
                  "}"
                ]
              }
            }
          ],
          "request": {
            "method": "POST",
            "header": [
              { "key": "Accept", "value": "application/json" },
              { "key": "Content-Type", "value": "application/json" }
            ],
            "body": {
              "mode": "raw",
              "raw": "{\n    \"external_reference\": \"{{external_reference}}\",\n    \"summary_date\": \"{{ayer}}\",\n    \"generation_date\": \"{{hoy}}\",\n    \"correlative\": \"{{resumen_correlativo}}\",\n    \"currency_code\": \"PEN\",\n    \"items\": [\n        {\n            \"document_type_code\": \"03\",\n            \"series\": \"B001\",\n            \"number\": \"1\",\n            \"issue_date\": \"{{ayer}}\",\n            \"customer\": {\n                \"document_type_code\": \"1\",\n                \"document_number\": \"45678912\"\n            },\n            \"currency_code\": \"PEN\",\n            \"condition_code\": \"1\",\n            \"taxable_amount\": \"100.00\",\n            \"exonerated_amount\": \"0.00\",\n            \"unaffected_amount\": \"0.00\",\n            \"igv_amount\": \"18.00\",\n            \"total_amount\": \"118.00\"\n        },\n        {\n            \"document_type_code\": \"03\",\n            \"series\": \"B001\",\n            \"number\": \"2\",\n            \"issue_date\": \"{{ayer}}\",\n            \"customer\": {\n                \"document_type_code\": \"1\",\n                \"document_number\": \"09876543\"\n            },\n            \"currency_code\": \"PEN\",\n            \"condition_code\": \"1\",\n            \"taxable_amount\": \"250.00\",\n            \"exonerated_amount\": \"0.00\",\n            \"unaffected_amount\": \"0.00\",\n            \"igv_amount\": \"45.00\",\n            \"total_amount\": \"295.00\"\n        },\n        {\n            \"document_type_code\": \"03\",\n            \"series\": \"B001\",\n            \"number\": \"3\",\n            \"issue_date\": \"{{ayer}}\",\n            \"customer\": {\n                \"document_type_code\": \"1\",\n                \"document_number\": \"71234567\"\n            },\n            \"currency_code\": \"PEN\",\n            \"condition_code\": \"1\",\n            \"taxable_amount\": \"0.00\",\n            \"exonerated_amount\": \"60.00\",\n            \"unaffected_amount\": \"0.00\",\n            \"igv_amount\": \"0.00\",\n            \"total_amount\": \"60.00\"\n        }\n    ]\n}"
            },
            "url": {
              "raw": "{{base_url}}/api/v2/daily-summaries",
              "host": ["{{base_url}}"],
              "path": ["api", "v2", "daily-summaries"]
            },
            "description": "Un resumen con tres boletas del dia anterior.\n\n## Campos de cabecera\n\n- summary_date: el dia AL QUE PERTENECEN las boletas. Todas las del resumen tienen que ser de ese dia.\n- generation_date: el dia en que se envia el resumen. Normalmente hoy.\n- correlative: numero de resumen dentro del dia de generacion. El primero del dia es 1; si mandas un segundo resumen el mismo dia, va 2.\n\n## Cada item\n\n- document_type_code 03 y serie B### (boleta). Una factura aqui da 422: las facturas van por /api/v2/cpe.\n- condition_code 1 = adicionar (la boleta se informa por primera vez). Es el caso normal.\n- customer.document_type_code: 1 = DNI, 6 = RUC, 0 = sin documento.\n- Los importes por boleta, no por linea: el resumen no lleva el detalle de productos.\n\n## Consumo de cuota\n\nEl resumen descuenta TANTAS unidades como boletas contenga, no una: son tres comprobantes emitidos, aunque viajen en un solo envio.\n\n## Respuesta\n\nSUNAT devuelve un TICKET, no el resultado: el procesamiento es asincrono. Guarda el uuid y consulta el estado con el siguiente request."
          }
        },
        {
          "name": "Consultar estado del resumen",
          "event": [
            {
              "listen": "test",
              "script": {
                "type": "text/javascript",
                "exec": [
                  "const data = (pm.response.json() || {}).data || {};",
                  "",
                  "console.log('Estado: ' + JSON.stringify(data.status || data));",
                  "",
                  "// 98 = en proceso. Hay que volver a preguntar mas tarde.",
                  "if (data.sunat_status_code === '98') {",
                  "    console.log('SUNAT sigue procesando. Vuelve a consultar en unos minutos.');",
                  "}"
                ]
              }
            }
          ],
          "request": {
            "method": "POST",
            "header": [{ "key": "Accept", "value": "application/json" }],
            "url": {
              "raw": "{{base_url}}/api/v2/daily-summaries/{{daily_summary_uuid}}/status-check",
              "host": ["{{base_url}}"],
              "path": ["api", "v2", "daily-summaries", "{{daily_summary_uuid}}", "status-check"]
            },
            "description": "Pregunta a SUNAT por el ticket del resumen.\n\nCodigos de estado de SUNAT:\n- 98: en proceso. Todavia no hay respuesta; hay que reintentar mas tarde.\n- 0: aceptado. Llega el CDR.\n- 99: rechazado, con el motivo dentro.\n\nEsta consulta NO consume cuota: el consumo se registro al enviar el resumen.\n\nEl sistema ademas reconcilia estos tickets solo, cada minuto, por tarea programada. Este endpoint sirve para forzar la consulta cuando la necesitas al momento."
          }
        },
        {
          "name": "Listar resumenes",
          "request": {
            "method": "GET",
            "header": [{ "key": "Accept", "value": "application/json" }],
            "url": {
              "raw": "{{base_url}}/api/v2/daily-summaries",
              "host": ["{{base_url}}"],
              "path": ["api", "v2", "daily-summaries"]
            },
            "description": "Resumenes de la Empresa de la credencial. Los de otras Empresas de la misma Cuenta no aparecen."
          }
        },
        {
          "name": "Detalle del resumen",
          "request": {
            "method": "GET",
            "header": [{ "key": "Accept", "value": "application/json" }],
            "url": {
              "raw": "{{base_url}}/api/v2/daily-summaries/{{daily_summary_uuid}}",
              "host": ["{{base_url}}"],
              "path": ["api", "v2", "daily-summaries", "{{daily_summary_uuid}}"]
            },
            "description": "Incluye el ticket, el estado y, si ya llego, el CDR de SUNAT."
          }
        }
      ]
    },
    {
      "name": "04 - Consulta de comprobantes",
      "item": [
        {
          "name": "Listar comprobantes",
          "request": {
            "method": "GET",
            "header": [{ "key": "Accept", "value": "application/json" }],
            "url": {
              "raw": "{{base_url}}/api/v2/cpe",
              "host": ["{{base_url}}"],
              "path": ["api", "v2", "cpe"]
            },
            "description": "Catalogo acotado a la Empresa de la credencial: los comprobantes de otras Empresas de la misma Cuenta no aparecen.\n\nNo consume cuota: solo emitir consume."
          }
        },
        {
          "name": "Detalle de comprobante",
          "request": {
            "method": "GET",
            "header": [{ "key": "Accept", "value": "application/json" }],
            "url": {
              "raw": "{{base_url}}/api/v2/cpe/{{cpe_uuid}}",
              "host": ["{{base_url}}"],
              "path": ["api", "v2", "cpe", "{{cpe_uuid}}"]
            },
            "description": "cpe_uuid lo guardan los request de emision. Trae el estado ante SUNAT y el CDR cuando existe."
          }
        }
      ]
    },
    {
      "name": "05 - Errores esperados",
      "description": "No son fallos: son respuestas que tu integracion tiene que saber manejar. Cada una se reproduce a proposito.",
      "item": [
        {
          "name": "402 - Sin cuota disponible",
          "event": [
            {
              "listen": "test",
              "script": {
                "type": "text/javascript",
                "exec": [
                  "if (pm.response.code === 402) {",
                  "    const body = pm.response.json();",
                  "    console.log('code: ' + body.code + ' | message: ' + body.message);",
                  "} else {",
                  "    console.log('Respondio ' + pm.response.code + ': esta empresa todavia tiene cuota.');",
                  "}"
                ]
              }
            }
          ],
          "request": {
            "method": "POST",
            "header": [
              { "key": "Accept", "value": "application/json" },
              { "key": "Content-Type", "value": "application/json" }
            ],
            "body": {
              "mode": "raw",
              "raw": "{\n    \"external_reference\": \"SIN-CUOTA-{{$timestamp}}\",\n    \"document_type_code\": \"01\",\n    \"series\": \"{{factura_serie}}\",\n    \"number\": \"{{factura_numero}}\",\n    \"issue_date\": \"{{hoy}}\",\n    \"currency_code\": \"PEN\",\n    \"country_code\": \"PE\",\n    \"sunat_establishment_code\": \"0000\",\n    \"operation_type_code\": \"0101\",\n    \"issuer\": {\n        \"ruc\": \"{{issuer_ruc}}\"\n    },\n    \"customer\": {\n        \"document_type_code\": \"6\",\n        \"document_number\": \"20100047218\",\n        \"name\": \"BANCO DE CREDITO DEL PERU\"\n    },\n    \"items\": [\n        {\n            \"description\": \"Prueba de cuota\",\n            \"quantity\": \"1.00\",\n            \"unit_code\": \"NIU\",\n            \"unit_value\": \"100.00\",\n            \"line_value\": \"100.00\",\n            \"igv_type_code\": \"10\",\n            \"igv_percentage\": \"18.00\",\n            \"igv_amount\": \"18.00\",\n            \"line_total\": \"118.00\"\n        }\n    ],\n    \"totals\": {\n        \"taxable_amount\": \"100.00\",\n        \"exonerated_amount\": \"0.00\",\n        \"unaffected_amount\": \"0.00\",\n        \"igv_amount\": \"18.00\",\n        \"total_amount\": \"118.00\"\n    },\n    \"payment\": {\n        \"type\": \"contado\"\n    }\n}"
            },
            "url": {
              "raw": "{{base_url}}/api/v2/cpe",
              "host": ["{{base_url}}"],
              "path": ["api", "v2", "cpe"]
            },
            "description": "El corte por cuota, que solo afecta a las dos rutas que construyen XML y lo envian a SUNAT: POST /api/v2/cpe y POST /api/v2/daily-summaries. Crear empresas, consultar catalogos o listar comprobantes no consumen nada.\n\nEs 402 y no 403 a proposito: las credenciales son correctas y el permiso tambien; lo que falta es plan.\n\nCuerpo de la respuesta:\n\n    {\n        \"success\": false,\n        \"message\": \"...\",\n        \"code\": \"no_plan\"\n    }\n\nValores de code:\n- no_plan: la empresa nunca tuvo plan.\n- plan_expired: vencio, y la cortesia tambien.\n- quota_exhausted: se acabaron los comprobantes. La cortesia NO cubre esto: cubre la fecha, nunca la cantidad.\n- plan_cancelled: el plan fue cancelado desde el panel.\n\nPara reproducirlo: en el panel, Empresas -> icono del plan -> Cancelar plan. O agota la cantidad de un plan pequeño.\n\nSe resuelve comprando o renovando el plan en \"Mis planes\"."
          }
        },
        {
          "name": "403 - Credencial de Cuenta intentando facturar",
          "event": [
            {
              "listen": "test",
              "script": {
                "type": "text/javascript",
                "exec": [
                  "pm.test('Responde 403', () => pm.response.to.have.status(403));",
                  "",
                  "console.log('Correcto: la credencial de la Cuenta no puede emitir.');"
                ]
              }
            }
          ],
          "request": {
            "auth": {
              "type": "bearer",
              "bearer": [{ "key": "token", "value": "{{access_token}}", "type": "string" }]
            },
            "method": "GET",
            "header": [{ "key": "Accept", "value": "application/json" }],
            "url": {
              "raw": "{{base_url}}/api/v2/cpe",
              "host": ["{{base_url}}"],
              "path": ["api", "v2", "cpe"]
            },
            "description": "Este request usa a proposito el access_token de la CUENTA (el de la coleccion \"Privadas\") contra una ruta de facturacion.\n\nEsperado: 403. La separacion es estricta en los dos sentidos: la credencial de Cuenta no factura, y la de Empresa no consulta RUC/DNI/establecimientos.\n\nEjecuta antes \"token (cuenta)\" en la coleccion Privadas para tener el access_token cargado."
          }
        },
        {
          "name": "422 - Enviando company_code",
          "event": [
            {
              "listen": "test",
              "script": {
                "type": "text/javascript",
                "exec": [
                  "pm.test('Responde 422', () => pm.response.to.have.status(422));",
                  "",
                  "const errors = (pm.response.json() || {}).errors || {};",
                  "",
                  "pm.test('El error señala company_code', () => {",
                  "    pm.expect(errors).to.have.property('company_code');",
                  "});",
                  "",
                  "console.log(JSON.stringify(errors.company_code));"
                ]
              }
            }
          ],
          "request": {
            "method": "POST",
            "header": [
              { "key": "Accept", "value": "application/json" },
              { "key": "Content-Type", "value": "application/json" }
            ],
            "body": {
              "mode": "raw",
              "raw": "{\n    \"company_code\": \"{{company_code}}\",\n    \"external_reference\": \"PROHIBIDO-{{$timestamp}}\",\n    \"document_type_code\": \"01\",\n    \"series\": \"{{factura_serie}}\",\n    \"number\": \"{{factura_numero}}\",\n    \"issue_date\": \"{{hoy}}\",\n    \"currency_code\": \"PEN\",\n    \"country_code\": \"PE\",\n    \"sunat_establishment_code\": \"0000\",\n    \"operation_type_code\": \"0101\",\n    \"issuer\": {\n        \"ruc\": \"{{issuer_ruc}}\"\n    },\n    \"customer\": {\n        \"document_type_code\": \"6\",\n        \"document_number\": \"20100047218\",\n        \"name\": \"BANCO DE CREDITO DEL PERU\"\n    },\n    \"items\": [\n        {\n            \"description\": \"Prueba\",\n            \"quantity\": \"1.00\",\n            \"unit_code\": \"NIU\",\n            \"unit_value\": \"100.00\",\n            \"line_value\": \"100.00\",\n            \"igv_type_code\": \"10\",\n            \"igv_percentage\": \"18.00\",\n            \"igv_amount\": \"18.00\",\n            \"line_total\": \"118.00\"\n        }\n    ],\n    \"totals\": {\n        \"taxable_amount\": \"100.00\",\n        \"exonerated_amount\": \"0.00\",\n        \"unaffected_amount\": \"0.00\",\n        \"igv_amount\": \"18.00\",\n        \"total_amount\": \"118.00\"\n    },\n    \"payment\": {\n        \"type\": \"contado\"\n    }\n}"
            },
            "url": {
              "raw": "{{base_url}}/api/v2/cpe",
              "host": ["{{base_url}}"],
              "path": ["api", "v2", "cpe"]
            },
            "description": "La empresa emisora la fija la CREDENCIAL, nunca el cuerpo del request. Mandar company_code se rechaza en vez de ignorarse, para que quede claro que ese campo no decide nada.\n\nOtros campos igualmente prohibidos: team_id, user_id, owner_id, api_client_id, scope, current_team_id, status, setup_status, provider, environment, sol_username."
          }
        }
      ]
    },
    {
      "name": "06 - Notas de Credito y Debito (tipo 07/08)",
      "description": "POST /api/v2/cpe. Mismo endpoint, con dos campos adicionales exigidos por forma: reference_document (el comprobante que la nota corrige, ya emitido por la MISMA Empresa) y reason_code (motivo, catalogo SUNAT 09 para credito / 10 para debito). Ejecuta primero una Factura o Boleta en las carpetas 02/02b: reference_document debe apuntar a un comprobante real.",
      "item": [
        {
          "name": "Nota de Credito sobre una Factura",
          "event": [
            {
              "listen": "prerequest",
              "script": {
                "type": "text/javascript",
                "exec": [
                  "pm.environment.set('external_reference', 'NC-' + Date.now());",
                  "",
                  "if (!pm.environment.get('factura_referenciada_numero')) {",
                  "    console.warn('Define factura_referenciada_serie/numero con un comprobante 01 ya emitido y aceptado (ver carpeta 02).');",
                  "}"
                ]
              }
            },
            {
              "listen": "test",
              "script": {
                "type": "text/javascript",
                "exec": [
                  "if (pm.response.code === 201 || pm.response.code === 200) {",
                  "    const data = pm.response.json().data || {};",
                  "    if (data.document && data.document.uuid) {",
                  "        console.log('Nota de Credito uuid: ' + data.document.uuid);",
                  "    }",
                  "    const siguiente = parseInt(pm.environment.get('nota_credito_numero') || '1', 10) + 1;",
                  "    pm.environment.set('nota_credito_numero', String(siguiente));",
                  "} else {",
                  "    console.warn(pm.response.code + ': ' + JSON.stringify(pm.response.json()));",
                  "}"
                ]
              }
            }
          ],
          "request": {
            "method": "POST",
            "header": [
              { "key": "Accept", "value": "application/json" },
              { "key": "Content-Type", "value": "application/json" }
            ],
            "body": {
              "mode": "raw",
              "raw": "{\n    \"external_reference\": \"{{external_reference}}\",\n    \"document_type_code\": \"07\",\n    \"series\": \"{{nota_credito_serie}}\",\n    \"number\": \"{{nota_credito_numero}}\",\n    \"issue_date\": \"{{hoy}}\",\n    \"currency_code\": \"PEN\",\n    \"country_code\": \"PE\",\n    \"sunat_establishment_code\": \"0000\",\n    \"operation_type_code\": \"0101\",\n    \"issuer\": {\n        \"ruc\": \"{{issuer_ruc}}\"\n    },\n    \"customer\": {\n        \"document_type_code\": \"6\",\n        \"document_number\": \"20100047218\",\n        \"name\": \"BANCO DE CREDITO DEL PERU\"\n    },\n    \"items\": [\n        {\n            \"code\": \"SERV-001\",\n            \"description\": \"Anulacion de servicio de desarrollo de software\",\n            \"quantity\": \"1.00\",\n            \"unit_code\": \"ZZ\",\n            \"unit_value\": \"1500.00\",\n            \"line_value\": \"1500.00\",\n            \"igv_type_code\": \"10\",\n            \"igv_percentage\": \"18.00\",\n            \"igv_amount\": \"270.00\",\n            \"line_total\": \"1770.00\"\n        }\n    ],\n    \"totals\": {\n        \"taxable_amount\": \"1500.00\",\n        \"exonerated_amount\": \"0.00\",\n        \"unaffected_amount\": \"0.00\",\n        \"igv_amount\": \"270.00\",\n        \"total_amount\": \"1770.00\"\n    },\n    \"payment\": {\n        \"type\": \"contado\"\n    },\n    \"reference_document\": {\n        \"document_type_code\": \"01\",\n        \"series\": \"{{factura_referenciada_serie}}\",\n        \"number\": \"{{factura_referenciada_numero}}\"\n    },\n    \"reason_code\": \"01\"\n}"
            },
            "url": {
              "raw": "{{base_url}}/api/v2/cpe",
              "host": ["{{base_url}}"],
              "path": ["api", "v2", "cpe"]
            },
            "description": "document_type_code 07, serie con prefijo F (mismo prefijo de la Factura referenciada -patron ^F[A-Z0-9]{3}$-).\n\nreference_document.series/number deben ser los de una Factura YA EMITIDA Y ACEPTADA por esta misma Empresa: un documento inexistente, ajeno, o de otro tipo (solo 01/03 se aceptan como referencia) responde 422.\n\nreason_code contra el catalogo SUNAT 09 (GET /api/v2/catalogos/09/items): 01 = Anulacion de la operacion, 02 = Anulacion por error en el RUC, 06 = Devolucion total, etc. Un codigo inactivo o inexistente responde 422.\n\nSi la serie no empieza con el prefijo correcto (F para Factura, B para Boleta), 422."
          }
        },
        {
          "name": "Nota de Debito sobre una Boleta",
          "event": [
            {
              "listen": "prerequest",
              "script": {
                "type": "text/javascript",
                "exec": [
                  "pm.environment.set('external_reference', 'ND-' + Date.now());",
                  "",
                  "if (!pm.environment.get('boleta_referenciada_numero')) {",
                  "    console.warn('Define boleta_referenciada_serie/numero con un comprobante 03 ya emitido y aceptado (ver carpeta 02b).');",
                  "}"
                ]
              }
            },
            {
              "listen": "test",
              "script": {
                "type": "text/javascript",
                "exec": [
                  "if (pm.response.code === 201 || pm.response.code === 200) {",
                  "    const data = pm.response.json().data || {};",
                  "    if (data.document && data.document.uuid) {",
                  "        console.log('Nota de Debito uuid: ' + data.document.uuid);",
                  "    }",
                  "    const siguiente = parseInt(pm.environment.get('nota_debito_numero') || '1', 10) + 1;",
                  "    pm.environment.set('nota_debito_numero', String(siguiente));",
                  "} else {",
                  "    console.warn(pm.response.code + ': ' + JSON.stringify(pm.response.json()));",
                  "}"
                ]
              }
            }
          ],
          "request": {
            "method": "POST",
            "header": [
              { "key": "Accept", "value": "application/json" },
              { "key": "Content-Type", "value": "application/json" }
            ],
            "body": {
              "mode": "raw",
              "raw": "{\n    \"external_reference\": \"{{external_reference}}\",\n    \"document_type_code\": \"08\",\n    \"series\": \"{{nota_debito_serie}}\",\n    \"number\": \"{{nota_debito_numero}}\",\n    \"issue_date\": \"{{hoy}}\",\n    \"currency_code\": \"PEN\",\n    \"country_code\": \"PE\",\n    \"sunat_establishment_code\": \"0000\",\n    \"operation_type_code\": \"0101\",\n    \"issuer\": {\n        \"ruc\": \"{{issuer_ruc}}\"\n    },\n    \"customer\": {\n        \"document_type_code\": \"1\",\n        \"document_number\": \"45678912\",\n        \"name\": \"Cliente Persona Natural\"\n    },\n    \"items\": [\n        {\n            \"code\": \"INT-001\",\n            \"description\": \"Interes por mora\",\n            \"quantity\": \"1.00\",\n            \"unit_code\": \"ZZ\",\n            \"unit_value\": \"20.00\",\n            \"line_value\": \"20.00\",\n            \"igv_type_code\": \"10\",\n            \"igv_percentage\": \"18.00\",\n            \"igv_amount\": \"3.60\",\n            \"line_total\": \"23.60\"\n        }\n    ],\n    \"totals\": {\n        \"taxable_amount\": \"20.00\",\n        \"exonerated_amount\": \"0.00\",\n        \"unaffected_amount\": \"0.00\",\n        \"igv_amount\": \"3.60\",\n        \"total_amount\": \"23.60\"\n    },\n    \"payment\": {\n        \"type\": \"contado\"\n    },\n    \"reference_document\": {\n        \"document_type_code\": \"03\",\n        \"series\": \"{{boleta_referenciada_serie}}\",\n        \"number\": \"{{boleta_referenciada_numero}}\"\n    },\n    \"reason_code\": \"01\"\n}"
            },
            "url": {
              "raw": "{{base_url}}/api/v2/cpe",
              "host": ["{{base_url}}"],
              "path": ["api", "v2", "cpe"]
            },
            "description": "document_type_code 08, serie con prefijo B (mismo prefijo de la Boleta referenciada).\n\nreason_code contra el catalogo SUNAT 10 (GET /api/v2/catalogos/10/items): motivos de Nota de Debito (interes por mora, aumento de valor, penalidades, etc.)."
          }
        }
      ]
    },
    {
      "name": "07 - Descarga de artifacts (XML/CDR)",
      "description": "GET /api/v2/cpe/{uuid} solo trae flags booleanos (artifacts.xml, artifacts.cdr, ...). Estas dos rutas devuelven los bytes reales. cpe_uuid lo guardan los request de emision de las carpetas 02/02b/06.",
      "item": [
        {
          "name": "Descargar XML firmado",
          "request": {
            "method": "GET",
            "header": [{ "key": "Accept", "value": "application/xml" }],
            "url": {
              "raw": "{{base_url}}/api/v2/cpe/{{cpe_uuid}}/xml",
              "host": ["{{base_url}}"],
              "path": ["api", "v2", "cpe", "{{cpe_uuid}}", "xml"]
            },
            "description": "El XML UBL 2.1 firmado (no el ZIP de transmision, no el XML sin firmar). Content-Type: application/xml, con Content-Disposition de descarga.\n\n404 si el uuid no existe, es ajeno, o el artifact fisico no esta disponible."
          }
        },
        {
          "name": "Descargar CDR (ZIP)",
          "request": {
            "method": "GET",
            "header": [{ "key": "Accept", "value": "application/zip" }],
            "url": {
              "raw": "{{base_url}}/api/v2/cpe/{{cpe_uuid}}/cdr",
              "host": ["{{base_url}}"],
              "path": ["api", "v2", "cpe", "{{cpe_uuid}}", "cdr"]
            },
            "description": "El ZIP oficial del CDR, exactamente como lo devolvio SUNAT. Content-Type: application/zip.\n\nEl CDR es el UNICO artifact opcional: un comprobante rechazado sin CDR (excepcion de servicio SUNAT, sin XML de respuesta) responde 404 con un mensaje distinto (\"Este comprobante no tiene un CDR disponible para descargar\"), no el generico de \"comprobante inexistente\"."
          }
        }
      ]
    },
    {
      "name": "08 - Guia de Remision (tipo 09)",
      "description": "POST /api/v2/dispatch-guides. Alcance: motivo de traslado libre, transporte privado o publico (segun transport_mode_code). Requiere credenciales GRE y SOL configuradas (ver '01b - Aprovisionamiento SUNAT'). A diferencia de Factura/Boleta, la respuesta trae un ticket (envio asincrono), no un CDR.",
      "item": [
        {
          "name": "Guia por venta - transporte privado",
          "event": [
            {
              "listen": "prerequest",
              "script": {
                "type": "text/javascript",
                "exec": [
                  "pm.environment.set('external_reference', 'GRE-' + Date.now());"
                ]
              }
            },
            {
              "listen": "test",
              "script": {
                "type": "text/javascript",
                "exec": [
                  "const body = pm.response.json();",
                  "",
                  "if (pm.response.code === 403) {",
                  "    console.warn('403: esta ruta exige la credencial de la EMPRESA, no la de la Cuenta.');",
                  "}",
                  "",
                  "if (pm.response.code === 409) {",
                  "    console.warn('409 (' + body.code + '): ' + body.message);",
                  "}",
                  "",
                  "if (pm.response.code === 422) {",
                  "    console.warn('422: ' + JSON.stringify(body.errors || body.message));",
                  "}",
                  "",
                  "if (pm.response.code === 201 || pm.response.code === 200) {",
                  "    const data = body.data || {};",
                  "    if (data.dispatch_guide) {",
                  "        pm.environment.set('dispatch_guide_uuid', data.dispatch_guide.uuid);",
                  "        console.log('ticket: ' + (data.provider ? data.provider.ticket : '') + ' | status: ' + data.dispatch_guide.status);",
                  "    }",
                  "}",
                  "",
                  "pm.test('No es un error del cliente', () => {",
                  "    pm.expect([200, 201]).to.include(pm.response.code);",
                  "});"
                ]
              }
            }
          ],
          "request": {
            "method": "POST",
            "header": [
              { "key": "Accept", "value": "application/json" },
              { "key": "Content-Type", "value": "application/json" }
            ],
            "body": {
              "mode": "raw",
              "raw": "{\n    \"external_reference\": \"{{external_reference}}\",\n    \"series\": \"T001\",\n    \"number\": \"1\",\n    \"issue_date\": \"{{hoy}}\",\n    \"country_code\": \"PE\",\n    \"sunat_establishment_code\": \"0000\",\n    \"transfer_reason_code\": \"01\",\n    \"transfer_description\": null,\n    \"gross_weight\": \"150.500\",\n    \"weight_unit_code\": \"KGM\",\n    \"total_packages\": 3,\n    \"transfer_start_date\": \"{{hoy}}\",\n    \"recipient\": {\n        \"document_type_code\": \"6\",\n        \"document_number\": \"20100047218\",\n        \"name\": \"BANCO DE CREDITO DEL PERU\"\n    },\n    \"departure\": {\n        \"ubigeo\": \"150101\",\n        \"address\": \"Av. Siempre Viva 123\"\n    },\n    \"arrival\": {\n        \"ubigeo\": \"150102\",\n        \"address\": \"Jr. Destino 456\"\n    },\n    \"vehicle\": {\n        \"plate\": \"ABC-123\",\n        \"circulation_permit\": null\n    },\n    \"drivers\": [\n        {\n            \"type\": \"Principal\",\n            \"document_type_code\": \"1\",\n            \"document_number\": \"45678912\",\n            \"first_name\": \"Juan\",\n            \"last_name\": \"Perez Quispe\",\n            \"license\": \"Q12345678\"\n        }\n    ],\n    \"items\": [\n        {\n            \"code\": \"PROD-001\",\n            \"description\": \"Producto de prueba\",\n            \"quantity\": \"10.000000\",\n            \"unit_code\": \"NIU\",\n            \"sunat_product_code\": null\n        }\n    ]\n}"
            },
            "url": {
              "raw": "{{base_url}}/api/v2/dispatch-guides",
              "host": ["{{base_url}}"],
              "path": ["api", "v2", "dispatch-guides"]
            },
            "description": "Motivo de traslado '01' (venta), transporte privado (transport_mode_code omitido = '02' por defecto): vehiculo y al menos un conductor propios de la empresa. Con transport_mode_code='02' explicito, vehicle/drivers son obligatorios y carrier se rechaza con 422 si se envia.\n\nserie con prefijo 'T' fijo (convencion oficial SUNAT para Guia Remitente).\n\ncompany_code no se envia: la empresa emisora la fija la credencial. Tampoco hay bloque 'issuer'.\n\n## Respuesta\n\nA diferencia de Factura/Boleta, esto es asincrono: 201 con status 'ticket_received' confirma que SUNAT acepto el envio para procesar, no un resultado tributario final. 'rejected' es un rechazo de validacion de forma, sin ticket.\n\n- 403: estas con la credencial de la Cuenta.\n- 409: credenciales GRE/SOL no configuradas, o conflicto de idempotencia.\n- 422: validacion. El detalle viene en errors."
          }
        },
        {
          "name": "Guia por venta - transporte publico (transportista tercero)",
          "event": [
            {
              "listen": "prerequest",
              "script": {
                "type": "text/javascript",
                "exec": [
                  "pm.environment.set('external_reference', 'GRE-' + Date.now());"
                ]
              }
            },
            {
              "listen": "test",
              "script": {
                "type": "text/javascript",
                "exec": [
                  "const body = pm.response.json();",
                  "",
                  "if (pm.response.code === 403) {",
                  "    console.warn('403: esta ruta exige la credencial de la EMPRESA, no la de la Cuenta.');",
                  "}",
                  "",
                  "if (pm.response.code === 409) {",
                  "    console.warn('409 (' + body.code + '): ' + body.message);",
                  "}",
                  "",
                  "if (pm.response.code === 422) {",
                  "    console.warn('422: ' + JSON.stringify(body.errors || body.message));",
                  "}",
                  "",
                  "if (pm.response.code === 201 || pm.response.code === 200) {",
                  "    const data = body.data || {};",
                  "    if (data.dispatch_guide) {",
                  "        pm.environment.set('dispatch_guide_uuid', data.dispatch_guide.uuid);",
                  "        console.log('ticket: ' + (data.provider ? data.provider.ticket : '') + ' | status: ' + data.dispatch_guide.status);",
                  "    }",
                  "}",
                  "",
                  "pm.test('No es un error del cliente', () => {",
                  "    pm.expect([200, 201]).to.include(pm.response.code);",
                  "});"
                ]
              }
            }
          ],
          "request": {
            "method": "POST",
            "header": [
              { "key": "Accept", "value": "application/json" },
              { "key": "Content-Type", "value": "application/json" }
            ],
            "body": {
              "mode": "raw",
              "raw": "{\n    \"external_reference\": \"{{external_reference}}\",\n    \"series\": \"T001\",\n    \"number\": \"2\",\n    \"issue_date\": \"{{hoy}}\",\n    \"country_code\": \"PE\",\n    \"sunat_establishment_code\": \"0000\",\n    \"transfer_reason_code\": \"01\",\n    \"transfer_description\": null,\n    \"gross_weight\": \"150.500\",\n    \"weight_unit_code\": \"KGM\",\n    \"total_packages\": 3,\n    \"transfer_start_date\": \"{{hoy}}\",\n    \"recipient\": {\n        \"document_type_code\": \"6\",\n        \"document_number\": \"20100047218\",\n        \"name\": \"BANCO DE CREDITO DEL PERU\"\n    },\n    \"departure\": {\n        \"ubigeo\": \"150101\",\n        \"address\": \"Av. Siempre Viva 123\"\n    },\n    \"arrival\": {\n        \"ubigeo\": \"150102\",\n        \"address\": \"Jr. Destino 456\"\n    },\n    \"transport_mode_code\": \"01\",\n    \"carrier\": {\n        \"document_type_code\": \"6\",\n        \"document_number\": \"20600000001\",\n        \"name\": \"Transportes El Rapido SAC\",\n        \"mtc_registration_number\": null\n    },\n    \"items\": [\n        {\n            \"code\": \"PROD-001\",\n            \"description\": \"Producto de prueba\",\n            \"quantity\": \"10.000000\",\n            \"unit_code\": \"NIU\",\n            \"sunat_product_code\": null\n        }\n    ]\n}"
            },
            "url": {
              "raw": "{{base_url}}/api/v2/dispatch-guides",
              "host": ["{{base_url}}"],
              "path": ["api", "v2", "dispatch-guides"]
            },
            "description": "transport_mode_code='01' (publico): carrier obligatorio (RUC/razon social del transportista tercero, mtc_registration_number opcional). vehicle/drivers se rechazan con 422 si se envian en este modo.\n\nMismas reglas de serie, company_code e issuer que el request de transporte privado.\n\n- 403: estas con la credencial de la Cuenta.\n- 409: credenciales GRE/SOL no configuradas, o conflicto de idempotencia.\n- 422: validacion (por ejemplo, vehicle/drivers enviados junto con transport_mode_code='01'). El detalle viene en errors."
          }
        },
        {
          "name": "Listar guias de remision",
          "request": {
            "method": "GET",
            "header": [{ "key": "Accept", "value": "application/json" }],
            "url": {
              "raw": "{{base_url}}/api/v2/dispatch-guides",
              "host": ["{{base_url}}"],
              "path": ["api", "v2", "dispatch-guides"]
            },
            "description": "Catalogo acotado a la Empresa de la credencial (nunca a las varias Empresas de una Cuenta, a diferencia de GET /api/v2/cpe). Filtros opcionales: status, search (uuid, serie-numero o external_reference exactos), issued_from/issued_to, received_from/received_to, sort, direction, page, per_page."
          }
        },
        {
          "name": "Detalle de guia de remision",
          "request": {
            "method": "GET",
            "header": [{ "key": "Accept", "value": "application/json" }],
            "url": {
              "raw": "{{base_url}}/api/v2/dispatch-guides/{{dispatch_guide_uuid}}",
              "host": ["{{base_url}}"],
              "path": ["api", "v2", "dispatch-guides", "{{dispatch_guide_uuid}}"]
            },
            "description": "dispatch_guide_uuid lo guarda automaticamente el request de emision. artifacts.cdr aqui confirma la existencia fisica del archivo (a diferencia del listado, que lo deriva de una columna sin tocar disco)."
          }
        },
        {
          "name": "Consultar estado del ticket",
          "event": [
            {
              "listen": "test",
              "script": {
                "type": "text/javascript",
                "exec": [
                  "if (pm.response.code === 200 || pm.response.code === 202) {",
                  "    const data = pm.response.json().data || {};",
                  "    console.log('status: ' + (data.dispatch_guide ? data.dispatch_guide.status : '') + ' | processing: ' + pm.response.json().processing);",
                  "} else {",
                  "    console.warn(pm.response.code + ': ' + JSON.stringify(pm.response.json()));",
                  "}"
                ]
              }
            }
          ],
          "request": {
            "method": "POST",
            "header": [{ "key": "Accept", "value": "application/json" }],
            "url": {
              "raw": "{{base_url}}/api/v2/dispatch-guides/{{dispatch_guide_uuid}}/status-check",
              "host": ["{{base_url}}"],
              "path": ["api", "v2", "dispatch-guides", "{{dispatch_guide_uuid}}", "status-check"]
            },
            "description": "Sin body. dispatch_guide_uuid lo guarda automaticamente el request anterior ('Guia por venta - transporte privado') al emitir.\n\nSolo se puede consultar una guia en status 'ticket_received'. Mientras SUNAT sigue procesando (cod_respuesta=98), responde 202 sin cambiar el estado -vuelve a consultar mas tarde, no hay webhooks-. Reconsultar un resultado ya final (accepted/ticket_rejected) es un replay: no vuelve a llamar a SUNAT.\n\ncdr.available indica si el CDR ya tiene bytes persistidos (GET .../cdr respondera 200) -no solo si SUNAT senalo ind_cdr_generado, que puede venir en true sin que arc_cdr se adjunte en esa respuesta puntual-.\n\n- 404: uuid inexistente, o guia de otra empresa.\n- 409 (gre_status_check_not_available): la guia nunca genero ticket (rejected en la emision), o SUNAT ya no tiene nada nuevo que consultar."
          }
        },
        {
          "name": "Descargar XML transmitido",
          "request": {
            "method": "GET",
            "header": [{ "key": "Accept", "value": "application/xml" }],
            "url": {
              "raw": "{{base_url}}/api/v2/dispatch-guides/{{dispatch_guide_uuid}}/xml",
              "host": ["{{base_url}}"],
              "path": ["api", "v2", "dispatch-guides", "{{dispatch_guide_uuid}}", "xml"]
            },
            "description": "El XML UBL 2.1 tal como se transmitio a SUNAT (bytes reales, sin firma -GRE no usa XMLDSig-). Content-Type: application/xml, con Content-Disposition de descarga.\n\nSiempre disponible tras la emision, en ambos desenlaces deterministas (ticket_received y rejected): SUNAT ya lo recibio de todas formas.\n\n404 si el uuid no existe o es de otra empresa."
          }
        },
        {
          "name": "Descargar CDR",
          "request": {
            "method": "GET",
            "header": [{ "key": "Accept", "value": "application/zip" }],
            "url": {
              "raw": "{{base_url}}/api/v2/dispatch-guides/{{dispatch_guide_uuid}}/cdr",
              "host": ["{{base_url}}"],
              "path": ["api", "v2", "dispatch-guides", "{{dispatch_guide_uuid}}", "cdr"]
            },
            "description": "El CDR tal como lo devolvio SUNAT (bytes reales). Content-Type: application/zip.\n\nEs el unico artifact opcional: responde 404 (gre_cdr_not_available) hasta que una consulta de estado ('Consultar estado del ticket') reciba el CDR de SUNAT adjunto en esa respuesta puntual."
          }
        }
      ]
    }
  ]
}
