{
  "info": {
    "_postman_id": "6a7f2f4a-6f8c-4d1e-9c60-8bc9d7f4a101",
    "name": "Factly API Minimal",
    "description": "Coleccion minima para probar Factly API en sandbox o production con JSON. Requiere API key del tenant. Nota: encf es obligatorio en production y en sandbox QA DGII.",
    "schema": "https://schema.getpostman.com/json/collection/v2.1.0/collection.json"
  },
  "variable": [
    { "key": "base_url", "value": "http://app_factly" },
    { "key": "api_environment", "value": "sandbox" },
    { "key": "api_key", "value": "" },
    { "key": "document_id", "value": "" },
    { "key": "external_id", "value": "" },
    { "key": "idempotency_key", "value": "" },
    { "key": "encf", "value": "" },
    { "key": "issue_date", "value": "" },
    { "key": "sequence_expiration_date", "value": "2026-12-31" },
    { "key": "customer_name", "value": "Consumidor final" },
    { "key": "document_type", "value": "32" }
  ],
  "item": [
    {
      "name": "1. Catalogos - Tipos de documento",
      "request": {
        "method": "GET",
        "header": [
          { "key": "Authorization", "value": "Bearer {{api_key}}", "type": "text" }
        ],
        "url": {
          "raw": "{{base_url}}/api/public/v1/catalogs/document-types",
          "host": ["{{base_url}}"],
          "path": ["api", "public", "v1", "catalogs", "document-types"]
        },
        "description": "Lista tipos de documento soportados por Factly API."
      }
    },
    {
      "name": "2. Uso actual",
      "request": {
        "method": "GET",
        "header": [
          { "key": "Authorization", "value": "Bearer {{api_key}}", "type": "text" }
        ],
        "url": {
          "raw": "{{base_url}}/api/public/v1/{{api_environment}}/usage",
          "host": ["{{base_url}}"],
          "path": ["api", "public", "v1", "{{api_environment}}", "usage"]
        },
        "description": "Consulta el uso/cuota actual del tenant en el ambiente seleccionado."
      }
    },
    {
      "name": "3. Crear documento JSON",
      "event": [
        {
          "listen": "prerequest",
          "script": {
            "type": "text/javascript",
            "exec": [
              "var stamp = Date.now().toString();",
              "pm.collectionVariables.set('external_id', 'ext-' + stamp);",
              "pm.collectionVariables.set('idempotency_key', 'idem-' + stamp);",
              "pm.collectionVariables.set('issue_date', new Date().toISOString().slice(0, 10));"
            ]
          }
        },
        {
          "listen": "test",
          "script": {
            "type": "text/javascript",
            "exec": [
              "pm.test('Respuesta exitosa', function () {",
              "  pm.expect(pm.response.code).to.be.oneOf([200, 201]);",
              "});",
              "var json = {};",
              "try { json = pm.response.json(); } catch (e) { json = {}; }",
              "if (json.id) { pm.collectionVariables.set('document_id', String(json.id)); }"
            ]
          }
        }
      ],
      "request": {
        "method": "POST",
        "header": [
          { "key": "Authorization", "value": "Bearer {{api_key}}", "type": "text" },
          { "key": "Idempotency-Key", "value": "{{idempotency_key}}", "type": "text" },
          { "key": "Content-Type", "value": "application/json", "type": "text" }
        ],
        "body": {
          "mode": "raw",
          "raw": "{\n  \"externalId\": \"{{external_id}}\",\n  \"documentType\": \"{{document_type}}\",\n  \"encf\": \"{{encf}}\",\n  \"issueDate\": \"{{issue_date}}\",\n  \"fechaVencimientoSecuencia\": \"{{sequence_expiration_date}}\",\n  \"billingType\": \"CONTADO\",\n  \"currency\": \"DOP\",\n  \"customerName\": \"{{customer_name}}\",\n  \"customerDocument\": \"\",\n  \"customerDocumentType\": \"\",\n  \"lines\": [\n    {\n      \"description\": \"Producto de prueba API\",\n      \"qty\": 1,\n      \"unitPrice\": 1000,\n      \"taxRate\": 18,\n      \"discountAmount\": 0,\n      \"unidadMedida\": \"43\"\n    }\n  ]\n}"
        },
        "url": {
          "raw": "{{base_url}}/api/public/v1/{{api_environment}}/documents",
          "host": ["{{base_url}}"],
          "path": ["api", "public", "v1", "{{api_environment}}", "documents"]
        },
        "description": "Crea un documento API via JSON. Guarda document_id automaticamente para los requests siguientes. Si usas production o sandbox QA DGII, llena encf y sequence_expiration_date antes de enviar."
      }
    },
    {
      "name": "4. Consultar documento",
      "request": {
        "method": "GET",
        "header": [
          { "key": "Authorization", "value": "Bearer {{api_key}}", "type": "text" }
        ],
        "url": {
          "raw": "{{base_url}}/api/public/v1/{{api_environment}}/documents/{{document_id}}",
          "host": ["{{base_url}}"],
          "path": ["api", "public", "v1", "{{api_environment}}", "documents", "{{document_id}}"]
        },
        "description": "Obtiene el documento API completo."
      }
    },
    {
      "name": "5. Consultar estado",
      "request": {
        "method": "GET",
        "header": [
          { "key": "Authorization", "value": "Bearer {{api_key}}", "type": "text" }
        ],
        "url": {
          "raw": "{{base_url}}/api/public/v1/{{api_environment}}/documents/{{document_id}}/status",
          "host": ["{{base_url}}"],
          "path": ["api", "public", "v1", "{{api_environment}}", "documents", "{{document_id}}", "status"]
        },
        "description": "Consulta solo el estado resumido del documento API."
      }
    },
    {
      "name": "6. Descargar XML",
      "request": {
        "method": "GET",
        "header": [
          { "key": "Authorization", "value": "Bearer {{api_key}}", "type": "text" }
        ],
        "url": {
          "raw": "{{base_url}}/api/public/v1/{{api_environment}}/documents/{{document_id}}/xml",
          "host": ["{{base_url}}"],
          "path": ["api", "public", "v1", "{{api_environment}}", "documents", "{{document_id}}", "xml"]
        },
        "description": "Devuelve el XML del documento. En sandbox interno JSON es un preview XML."
      }
    },
    {
      "name": "7. Descargar PDF",
      "request": {
        "method": "GET",
        "header": [
          { "key": "Authorization", "value": "Bearer {{api_key}}", "type": "text" }
        ],
        "url": {
          "raw": "{{base_url}}/api/public/v1/{{api_environment}}/documents/{{document_id}}/pdf",
          "host": ["{{base_url}}"],
          "path": ["api", "public", "v1", "{{api_environment}}", "documents", "{{document_id}}", "pdf"]
        },
        "description": "Descarga el PDF preliminar o la RI final si ya fue aprobado."
      }
    },
    {
      "name": "8. Retry documento",
      "request": {
        "method": "POST",
        "header": [
          { "key": "Authorization", "value": "Bearer {{api_key}}", "type": "text" }
        ],
        "url": {
          "raw": "{{base_url}}/api/public/v1/{{api_environment}}/documents/{{document_id}}/retry",
          "host": ["{{base_url}}"],
          "path": ["api", "public", "v1", "{{api_environment}}", "documents", "{{document_id}}", "retry"]
        },
        "description": "Reintenta el documento cuando el estado lo permita."
      }
    },
    {
      "name": "9. Probar webhook",
      "request": {
        "method": "POST",
        "header": [
          { "key": "Authorization", "value": "Bearer {{api_key}}", "type": "text" }
        ],
        "url": {
          "raw": "{{base_url}}/api/public/v1/{{api_environment}}/webhooks/test",
          "host": ["{{base_url}}"],
          "path": ["api", "public", "v1", "{{api_environment}}", "webhooks", "test"]
        },
        "description": "Dispara un evento de prueba hacia los webhooks configurados para ese ambiente."
      }
    }
  ]
}
