{
    "info": {
        "name": "API Merchant",
        "description": "Colección optimizada para la API Merchant. Incluye scripts de pre-request para Idempotency-Key y tests para autoguardado de Tokens.",
        "schema": "https://schema.getpostman.com/json/collection/v2.1.0/collection.json"
    },
    "item": [
        {
            "name": "Merchants",
            "item": [
                {
                    "name": "Registrarte como comercio",
                    "request": {
                        "method": "POST",
                        "header": [],
                        "url": {
                            "raw": "{{base_url}}/api/v1/merchants",
                            "host": [
                                "{{base_url}}"
                            ],
                            "path": [
                                "api",
                                "v1",
                                "merchants"
                            ]
                        },
                        "description": "Endpoint público para registro (Onboarding). Crea un nuevo merchant y devuelve su ID.",
                        "body": {
                            "mode": "raw",
                            "raw": "{\n  \"legalName\": \"Inversiones Spidi C.A.\",\n  \"taxId\": \"J-12345678-0\",\n  \"email\": \"admin@comercio.com\",\n  \"password\": \"string\",\n  \"phone\": \"+584141234567\",\n  \"address\": \"Av. Principal, Edif. Central\"\n}",
                            "options": {
                                "raw": {
                                    "language": "json"
                                }
                            }
                        }
                    },
                    "response": []
                },
                {
                    "name": "Iniciar Sesión como comercio",
                    "request": {
                        "method": "POST",
                        "header": [],
                        "url": {
                            "raw": "{{base_url}}/api/v1/merchants/auth/login",
                            "host": [
                                "{{base_url}}"
                            ],
                            "path": [
                                "api",
                                "v1",
                                "merchants",
                                "auth",
                                "login"
                            ]
                        },
                        "description": "Te permite intercambiar tus credenciales como por un token de acceso (JWT).",
                        "body": {
                            "mode": "raw",
                            "raw": "{\n  \"email\": \"[EMAIL_ADDRESS]\",\n  \"password\": \"[PASSWORD]\"\n}",
                            "options": {
                                "raw": {
                                    "language": "json"
                                }
                            }
                        }
                    },
                    "response": [],
                    "event": [
                        {
                            "listen": "test",
                            "script": {
                                "exec": [
                                    "if (pm.response.code === 200) {",
                                    "    var jsonData = pm.response.json();",
                                    "    var token = jsonData.accessToken || (jsonData.data && jsonData.data.accessToken) || jsonData.token;",
                                    "    if (token) {",
                                    "        pm.collectionVariables.set(\"token\", token);",
                                    "        console.log(\"Token actualizado automáticamente en variables de colección\");",
                                    "    }",
                                    "}"
                                ],
                                "type": "text/javascript"
                            }
                        }
                    ]
                },
                {
                    "name": "Generar OTP para Pairing",
                    "request": {
                        "method": "POST",
                        "header": [],
                        "url": {
                            "raw": "{{base_url}}/api/v1/merchants/:merchantId/pos-terminals/:serialNumber/pairing",
                            "host": [
                                "{{base_url}}"
                            ],
                            "path": [
                                "api",
                                "v1",
                                "merchants",
                                ":merchantId",
                                "pos-terminals",
                                ":serialNumber",
                                "pairing"
                            ],
                            "variable": [
                                {
                                    "key": "merchantId",
                                    "value": "uuid"
                                },
                                {
                                    "key": "serialNumber",
                                    "value": "string"
                                }
                            ]
                        },
                        "description": "Solicita vincular un sistema terminal con el Serial de Hardware y genera un código de activación (OTP).",
                        "body": {
                            "mode": "raw",
                            "raw": "{\n  \"serial\": \"string\"\n}",
                            "options": {
                                "raw": {
                                    "language": "json"
                                }
                            }
                        }
                    },
                    "response": []
                },
                {
                    "name": "Solicitar Pago",
                    "request": {
                        "method": "POST",
                        "header": [],
                        "url": {
                            "raw": "{{base_url}}/api/v1/merchants/:merchantId/transactions",
                            "host": [
                                "{{base_url}}"
                            ],
                            "path": [
                                "api",
                                "v1",
                                "merchants",
                                ":merchantId",
                                "transactions"
                            ],
                            "variable": [
                                {
                                    "key": "merchantId",
                                    "value": "uuid"
                                }
                            ]
                        },
                        "description": "Crea una transacción en el sistema. Nótese que las transacciones deben ser confirmadas; el hecho de que esté creada no significa que esté confirmada.",
                        "body": {
                            "mode": "raw",
                            "raw": "{\n  \"orderId\": \"3ddc4cfb-c09a-43de-92c1-e4a069732e90\",\n  \"amountReference\": \"100.001\",\n  \"currencyReference\": \"string\",\n  \"allowAmountChange\": false,\n  \"clientIdentification\": \"V14143800\",\n  \"terminalSerial\": \"98202003219630\",\n  \"deeplinkConfig\": {}\n}",
                            "options": {
                                "raw": {
                                    "language": "json"
                                }
                            }
                        }
                    },
                    "response": []
                },
                {
                    "name": "Consultar pago",
                    "request": {
                        "method": "GET",
                        "header": [],
                        "url": {
                            "raw": "{{base_url}}/api/v1/merchants/:merchantId/transactions/:orderId",
                            "host": [
                                "{{base_url}}"
                            ],
                            "path": [
                                "api",
                                "v1",
                                "merchants",
                                ":merchantId",
                                "transactions",
                                ":orderId"
                            ],
                            "variable": [
                                {
                                    "key": "merchantId",
                                    "value": "uuid"
                                },
                                {
                                    "key": "orderId",
                                    "value": "uuid"
                                }
                            ]
                        },
                        "description": "Consulta información sobre una transacción por medio de su ```id``` incluyendo el estado actual"
                    },
                    "response": []
                },
                {
                    "name": "Anular Pago",
                    "request": {
                        "method": "POST",
                        "header": [],
                        "url": {
                            "raw": "{{base_url}}/api/v1/merchants/:merchantId/transactions/:orderId/cancellation",
                            "host": [
                                "{{base_url}}"
                            ],
                            "path": [
                                "api",
                                "v1",
                                "merchants",
                                ":merchantId",
                                "transactions",
                                ":orderId",
                                "cancellation"
                            ],
                            "variable": [
                                {
                                    "key": "merchantId",
                                    "value": "uuid"
                                },
                                {
                                    "key": "orderId",
                                    "value": "uuid"
                                }
                            ]
                        },
                        "description": "Solicita la cancelación o anulación de una transacción. Si la transacción está en estado PENDING (no confirmada por el POS), pasa a CANCELED. Si la transacción está en estado PAID (ya confirmada por el POS), pasa a VOID_PENDING a la espera de la confirmación de anulación por parte del POS."
                    },
                    "response": []
                },
                {
                    "name": "Listar Cierres de Lote de Terminal",
                    "request": {
                        "method": "GET",
                        "header": [],
                        "url": {
                            "raw": "{{base_url}}/api/v1/merchants/:merchantId/pos-terminals/:serialNumber/settlements?page=1&size=20&sort=-closedAt",
                            "host": [
                                "{{base_url}}"
                            ],
                            "path": [
                                "api",
                                "v1",
                                "merchants",
                                ":merchantId",
                                "pos-terminals",
                                ":serialNumber",
                                "settlements"
                            ],
                            "variable": [
                                {
                                    "key": "merchantId",
                                    "value": "uuid"
                                },
                                {
                                    "key": "serialNumber",
                                    "value": "string"
                                }
                            ],
                            "query": [
                                {
                                    "key": "page",
                                    "value": "1",
                                    "description": "Número asociado a la página solicitada (Indizado desde 1)."
                                },
                                {
                                    "key": "size",
                                    "value": "20",
                                    "description": "Cantidad máxima de elementos por página."
                                },
                                {
                                    "key": "sort",
                                    "value": "-closedAt",
                                    "description": "Criterio de ordenamiento. Usar el prefijo `-` para orden descendente. Ejemplo: `-closedAt` o `+name`."
                                }
                            ]
                        },
                        "description": "Obtiene el historial de cierres de lote del terminal especificado para el comercio."
                    },
                    "response": []
                }
            ]
        },
        {
            "name": "Terminales",
            "item": [
                {
                    "name": "Activar dispositivo POS",
                    "request": {
                        "method": "POST",
                        "header": [],
                        "url": {
                            "raw": "{{base_url}}/api/v1/pos-terminals/:serialNumber/pairing/activate",
                            "host": [
                                "{{base_url}}"
                            ],
                            "path": [
                                "api",
                                "v1",
                                "pos-terminals",
                                ":serialNumber",
                                "pairing",
                                "activate"
                            ],
                            "variable": [
                                {
                                    "key": "serialNumber",
                                    "value": "string"
                                }
                            ]
                        },
                        "description": "Valida el código OTP ingresado en el punto de venta y genera el Secret Key del dispositivo.",
                        "body": {
                            "mode": "raw",
                            "raw": "{\n  \"serial\": \"string\",\n  \"code\": \"string\"\n}",
                            "options": {
                                "raw": {
                                    "language": "json"
                                }
                            }
                        }
                    },
                    "response": []
                },
                {
                    "name": "Listar pagos del POS",
                    "request": {
                        "method": "GET",
                        "header": [],
                        "url": {
                            "raw": "{{base_url}}/api/v1/pos-terminals/:serialNumber/transactions?status=",
                            "host": [
                                "{{base_url}}"
                            ],
                            "path": [
                                "api",
                                "v1",
                                "pos-terminals",
                                ":serialNumber",
                                "transactions"
                            ],
                            "variable": [
                                {
                                    "key": "serialNumber",
                                    "value": "string"
                                }
                            ],
                            "query": [
                                {
                                    "key": "status",
                                    "value": "",
                                    "description": "Filtro dinámico (LHS Brackets) para filtrar transacciones por estado. Ej: `?status=PENDING`"
                                }
                            ]
                        },
                        "description": "Listar pagos del POS",
                        "body": {
                            "mode": "raw",
                            "raw": "{\n  \"orderId\": \"3ddc4cfb-c09a-43de-92c1-e4a069732e90\",\n  \"amountReference\": \"100.001\",\n  \"currencyReference\": \"string\",\n  \"allowAmountChange\": false,\n  \"clientIdentification\": \"V14143800\",\n  \"terminalSerial\": \"98202003219630\",\n  \"deeplinkConfig\": {}\n}",
                            "options": {
                                "raw": {
                                    "language": "json"
                                }
                            }
                        }
                    },
                    "response": []
                },
                {
                    "name": "Consultar el estado de un pago desde el POS",
                    "request": {
                        "method": "GET",
                        "header": [],
                        "url": {
                            "raw": "{{base_url}}/api/v1/pos-terminals/:serialNumber/transactions/:orderId",
                            "host": [
                                "{{base_url}}"
                            ],
                            "path": [
                                "api",
                                "v1",
                                "pos-terminals",
                                ":serialNumber",
                                "transactions",
                                ":orderId"
                            ],
                            "variable": [
                                {
                                    "key": "serialNumber",
                                    "value": "string"
                                },
                                {
                                    "key": "orderId",
                                    "value": "uuid"
                                }
                            ]
                        },
                        "description": "Consulta información sobre una transacción por medio de su ```id``` incluyendo el estado actual"
                    },
                    "response": []
                },
                {
                    "name": "Confirmar Pago",
                    "request": {
                        "method": "POST",
                        "header": [],
                        "url": {
                            "raw": "{{base_url}}/api/v1/pos-terminals/:serialNumber/transactions/:orderId/commit",
                            "host": [
                                "{{base_url}}"
                            ],
                            "path": [
                                "api",
                                "v1",
                                "pos-terminals",
                                ":serialNumber",
                                "transactions",
                                ":orderId",
                                "commit"
                            ],
                            "variable": [
                                {
                                    "key": "serialNumber",
                                    "value": "string"
                                },
                                {
                                    "key": "orderId",
                                    "value": "uuid"
                                }
                            ]
                        },
                        "description": "Pasa una transacción que estaba en estado PENDING a PAID. Adicionalmente, si la orden fue cancelada (estado CANCELED) antes de la confirmación del POS, emitir esta llamada sobrescribirá la cancelación y confirmará el pago con estado PAID.",
                        "body": {
                            "mode": "raw",
                            "raw": "{\n  \"authorizationCode\": \"171599\",\n  \"processCode\": \"002000\",\n  \"commitAt\": \"string\",\n  \"amountReference\": \"100.001\",\n  \"terminalNumber\": \"98202003219630\",\n  \"trace\": \"000535\",\n  \"utcDate\": \"1007151715\",\n  \"cardTypeForRpt\": \"C\",\n  \"visOrMccCard\": \"MCC\",\n  \"batchNumber\": 3\n}",
                            "options": {
                                "raw": {
                                    "language": "json"
                                }
                            }
                        }
                    },
                    "response": []
                },
                {
                    "name": "Confirmar Anulación",
                    "request": {
                        "method": "POST",
                        "header": [],
                        "url": {
                            "raw": "{{base_url}}/api/v1/pos-terminals/:serialNumber/transactions/:orderId/cancellation/commit",
                            "host": [
                                "{{base_url}}"
                            ],
                            "path": [
                                "api",
                                "v1",
                                "pos-terminals",
                                ":serialNumber",
                                "transactions",
                                ":orderId",
                                "cancellation",
                                "commit"
                            ],
                            "variable": [
                                {
                                    "key": "serialNumber",
                                    "value": "string"
                                },
                                {
                                    "key": "orderId",
                                    "value": "uuid"
                                }
                            ]
                        },
                        "description": "Confirma la ejecución de la anulación."
                    },
                    "response": []
                },
                {
                    "name": "Listar Cierres",
                    "request": {
                        "method": "GET",
                        "header": [],
                        "url": {
                            "raw": "{{base_url}}/api/v1/pos-terminals/:serialNumber/settlements?page=1&size=20&sort=-closedAt",
                            "host": [
                                "{{base_url}}"
                            ],
                            "path": [
                                "api",
                                "v1",
                                "pos-terminals",
                                ":serialNumber",
                                "settlements"
                            ],
                            "variable": [
                                {
                                    "key": "serialNumber",
                                    "value": "string"
                                }
                            ],
                            "query": [
                                {
                                    "key": "page",
                                    "value": "1",
                                    "description": "Número asociado a la página solicitada (Indizado desde 1)."
                                },
                                {
                                    "key": "size",
                                    "value": "20",
                                    "description": "Cantidad máxima de elementos por página."
                                },
                                {
                                    "key": "sort",
                                    "value": "-closedAt",
                                    "description": "Criterio de ordenamiento. Usar el prefijo `-` para orden descendente. Ejemplo: `-closedAt` o `+name`."
                                }
                            ]
                        },
                        "description": "Obtiene el historial de cierres de lote."
                    },
                    "response": []
                },
                {
                    "name": "Crear Cierre",
                    "request": {
                        "method": "POST",
                        "header": [],
                        "url": {
                            "raw": "{{base_url}}/api/v1/pos-terminals/:serialNumber/settlements",
                            "host": [
                                "{{base_url}}"
                            ],
                            "path": [
                                "api",
                                "v1",
                                "pos-terminals",
                                ":serialNumber",
                                "settlements"
                            ],
                            "variable": [
                                {
                                    "key": "serialNumber",
                                    "value": "string"
                                }
                            ]
                        },
                        "description": "Con este endpoint el pos notifica el cierre del lote.",
                        "body": {
                            "mode": "raw",
                            "raw": "{\n  \"batchNumber\": 3,\n  \"transactionCount\": 12,\n  \"closedAt\": \"2023-04-04T15:26:51.187Z\",\n  \"currencyReference\": \"string\",\n  \"terminal\": {},\n  \"debitBatch\": \"string\"\n}",
                            "options": {
                                "raw": {
                                    "language": "json"
                                }
                            }
                        }
                    },
                    "response": []
                },
                {
                    "name": "Consultar Cierre",
                    "request": {
                        "method": "GET",
                        "header": [],
                        "url": {
                            "raw": "{{base_url}}/api/v1/pos-terminals/:serialNumber/settlements/:batchNumber",
                            "host": [
                                "{{base_url}}"
                            ],
                            "path": [
                                "api",
                                "v1",
                                "pos-terminals",
                                ":serialNumber",
                                "settlements",
                                ":batchNumber"
                            ],
                            "variable": [
                                {
                                    "key": "serialNumber",
                                    "value": "string"
                                },
                                {
                                    "key": "batchNumber",
                                    "value": "string"
                                }
                            ]
                        },
                        "description": "Obtiene la información detallada de un cierre específico."
                    },
                    "response": []
                }
            ]
        }
    ],
    "auth": {
        "type": "bearer",
        "bearer": [
            {
                "key": "token",
                "value": "{{token}}",
                "type": "string"
            }
        ]
    },
    "variable": [
        {
            "key": "base_url",
            "value": "https://sandbox.api.spuntodeventa.com",
            "type": "string"
        },
        {
            "key": "token",
            "value": "",
            "type": "string"
        }
    ],
    "event": [
        {
            "listen": "prerequest",
            "script": {
                "type": "text/javascript",
                "exec": [
                    "// Script Global: Agregar Idempotency-Key automáticamente a métodos que modifican datos",
                    "if (['POST', 'PATCH', 'PUT', 'DELETE'].includes(pm.request.method)) {",
                    "    if (!pm.request.headers.has(\"Idempotency-Key\")) {",
                    "        pm.request.headers.add({",
                    "            key: \"Idempotency-Key\",",
                    "            value: pm.variables.replaceIn('{{$guid}}') // Genera UUID v4",
                    "        });",
                    "        console.log(\"Idempotency-Key generado automáticamente\");",
                    "    }",
                    "}"
                ]
            }
        }
    ]
}