{
  "info": {
    "_postman_id": "partner-integration-api-v1",
    "name": "Partner Integration API",
    "description": "Coleção completa para integração com a Partner Integration API.\n\n## Como usar\n1. Importe também o Environment (Homolog.postman_environment.json)\n2. Selecione o environment importado\n3. Preencha baseUrl, clientId e clientSecret no environment\n4. Execute \"Auth — Obter Token\" primeiro\n5. O token é salvo automaticamente na variável {{jwt}}\n6. Todas as demais requisições usam {{jwt}} automaticamente",
    "schema": "https://schema.getpostman.com/json/collection/v2.1.0/collection.json"
  },
  "variable": [],
  "item": [
    {
      "name": "Auth",
      "description": "Autenticação e obtenção de token JWT",
      "item": [
        {
          "name": "Obter Token",
          "event": [
            {
              "listen": "test",
              "script": {
                "exec": [
                  "if (pm.response.code === 200) {",
                  "    const body = pm.response.json();",
                  "    pm.environment.set('jwt', body.accessToken);",
                  "    pm.environment.set('tokenType', body.tokenType);",
                  "    console.log('Token salvo. Expira em ' + body.expiresIn + ' segundos.');",
                  "}"
                ],
                "type": "text/javascript"
              }
            }
          ],
          "request": {
            "method": "POST",
            "header": [
              {
                "key": "Content-Type",
                "value": "application/json"
              }
            ],
            "body": {
              "mode": "raw",
              "raw": "{\n  \"clientId\": \"{{clientId}}\",\n  \"clientSecret\": \"{{clientSecret}}\"\n}"
            },
            "url": {
              "raw": "{{baseUrl}}/api/v1/auth/token",
              "host": ["{{baseUrl}}"],
              "path": ["api", "v1", "auth", "token"]
            },
            "description": "Autentica o tenant e retorna um JWT Bearer Token.\n\nO token é salvo automaticamente na variável {{jwt}} após execução bem-sucedida."
          },
          "response": [
            {
              "name": "200 OK — Token obtido",
              "originalRequest": {
                "method": "POST",
                "body": {
                  "mode": "raw",
                  "raw": "{\n  \"clientId\": \"minha-assessoria\",\n  \"clientSecret\": \"senha-segura\"\n}"
                },
                "url": {
                  "raw": "{{baseUrl}}/api/v1/auth/token"
                }
              },
              "status": "OK",
              "code": 200,
              "_postman_previewlanguage": "json",
              "body": "{\n  \"accessToken\": \"eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9...\",\n  \"tokenType\": \"Bearer\",\n  \"expiresIn\": 3600\n}"
            }
          ]
        }
      ]
    },
    {
      "name": "Students",
      "description": "Sincronização de alunos",
      "item": [
        {
          "name": "Sync Incremental",
          "request": {
            "method": "POST",
            "header": [
              {
                "key": "Content-Type",
                "value": "application/json"
              },
              {
                "key": "Authorization",
                "value": "Bearer {{jwt}}"
              },
              {
                "key": "X-Correlation-Id",
                "value": "{{$guid}}",
                "description": "ID de rastreabilidade opcional"
              }
            ],
            "body": {
              "mode": "raw",
              "raw": "{\n  \"students\": [\n    {\n      \"canonicalStudentId\": \"ALUNO-001\",\n      \"wellhubMemberId\": null,\n      \"totalPassMemberId\": null,\n      \"status\": \"ACTIVE\"\n    },\n    {\n      \"canonicalStudentId\": \"ALUNO-002\",\n      \"wellhubMemberId\": \"WH-MEMBER-98765\",\n      \"totalPassMemberId\": null,\n      \"status\": \"ACTIVE\"\n    },\n    {\n      \"canonicalStudentId\": \"ALUNO-003\",\n      \"wellhubMemberId\": null,\n      \"totalPassMemberId\": \"TP-MEMBER-54321\",\n      \"status\": \"ACTIVE\"\n    }\n  ]\n}"
            },
            "url": {
              "raw": "{{baseUrl}}/api/v1/students/sync",
              "host": ["{{baseUrl}}"],
              "path": ["api", "v1", "students", "sync"]
            },
            "description": "Sincronização incremental — envie apenas alunos novos ou alterados.\n\nIdempotente: re-enviar os mesmos alunos é seguro."
          },
          "response": [
            {
              "name": "200 OK",
              "status": "OK",
              "code": 200,
              "_postman_previewlanguage": "json",
              "body": "{\n  \"total\": 3,\n  \"created\": 2,\n  \"updated\": 1,\n  \"deactivated\": 0,\n  \"results\": [\n    {\n      \"studentIdentityId\": \"550e8400-e29b-41d4-a716-446655440001\",\n      \"canonicalStudentId\": \"ALUNO-001\",\n      \"action\": \"CREATED\"\n    },\n    {\n      \"studentIdentityId\": \"550e8400-e29b-41d4-a716-446655440002\",\n      \"canonicalStudentId\": \"ALUNO-002\",\n      \"action\": \"CREATED\"\n    },\n    {\n      \"studentIdentityId\": \"550e8400-e29b-41d4-a716-446655440003\",\n      \"canonicalStudentId\": \"ALUNO-003\",\n      \"action\": \"UPDATED\"\n    }\n  ]\n}"
            }
          ]
        },
        {
          "name": "Full Sync",
          "request": {
            "method": "POST",
            "header": [
              {
                "key": "Content-Type",
                "value": "application/json"
              },
              {
                "key": "Authorization",
                "value": "Bearer {{jwt}}"
              },
              {
                "key": "X-Correlation-Id",
                "value": "{{$guid}}"
              }
            ],
            "body": {
              "mode": "raw",
              "raw": "{\n  \"students\": [\n    {\n      \"canonicalStudentId\": \"ALUNO-001\",\n      \"wellhubMemberId\": null,\n      \"totalPassMemberId\": null,\n      \"status\": \"ACTIVE\"\n    },\n    {\n      \"canonicalStudentId\": \"ALUNO-002\",\n      \"wellhubMemberId\": \"WH-MEMBER-98765\",\n      \"totalPassMemberId\": null,\n      \"status\": \"ACTIVE\"\n    },\n    {\n      \"canonicalStudentId\": \"ALUNO-003\",\n      \"wellhubMemberId\": null,\n      \"totalPassMemberId\": \"TP-MEMBER-54321\",\n      \"status\": \"INACTIVE\"\n    }\n  ]\n}"
            },
            "url": {
              "raw": "{{baseUrl}}/api/v1/students/sync/full",
              "host": ["{{baseUrl}}"],
              "path": ["api", "v1", "students", "sync", "full"]
            },
            "description": "Full Sync — use na primeira implantação ou para garantir consistência total da base de alunos.\n\nComportamento idêntico ao Sync Incremental, mas com intenção de enviar todos os alunos."
          },
          "response": []
        }
      ]
    },
    {
      "name": "Checkins",
      "description": "Registro e consulta de check-ins",
      "item": [
        {
          "name": "Registrar Check-in",
          "event": [
            {
              "listen": "test",
              "script": {
                "exec": [
                  "if (pm.response.code === 201 || pm.response.code === 200) {",
                  "    const body = pm.response.json();",
                  "    pm.environment.set('lastCheckinId', body.id);",
                  "    console.log('Check-in ID salvo: ' + body.id);",
                  "    if (body.isDuplicate) {",
                  "        console.log('DUPLICATA detectada — check-in não reprocessado');",
                  "    }",
                  "}"
                ],
                "type": "text/javascript"
              }
            }
          ],
          "request": {
            "method": "POST",
            "header": [
              {
                "key": "Content-Type",
                "value": "application/json"
              },
              {
                "key": "Authorization",
                "value": "Bearer {{jwt}}"
              },
              {
                "key": "X-Correlation-Id",
                "value": "{{$guid}}"
              }
            ],
            "body": {
              "mode": "raw",
              "raw": "{\n  \"source\": \"INTERNAL\",\n  \"partnerTransactionId\": \"TXN-{{$guid}}\",\n  \"externalStudentId\": \"ALUNO-001\",\n  \"occurredAt\": \"{{$isoTimestamp}}\"\n}"
            },
            "url": {
              "raw": "{{baseUrl}}/api/v1/checkins",
              "host": ["{{baseUrl}}"],
              "path": ["api", "v1", "checkins"]
            },
            "description": "Registra um check-in na plataforma.\n\n- 201 Created: novo check-in processado\n- 200 OK: duplicata detectada (isDuplicate: true)\n\nO ID do check-in é salvo automaticamente em {{lastCheckinId}}."
          },
          "response": [
            {
              "name": "201 Created — Check-in registrado",
              "status": "Created",
              "code": 201,
              "_postman_previewlanguage": "json",
              "body": "{\n  \"id\": \"3fa85f64-5717-4562-b3fc-2c963f66afa6\",\n  \"isDuplicate\": false\n}"
            },
            {
              "name": "200 OK — Duplicata",
              "status": "OK",
              "code": 200,
              "_postman_previewlanguage": "json",
              "body": "{\n  \"id\": \"3fa85f64-5717-4562-b3fc-2c963f66afa6\",\n  \"isDuplicate\": true\n}"
            }
          ]
        },
        {
          "name": "Consultar Check-in",
          "request": {
            "method": "GET",
            "header": [
              {
                "key": "Authorization",
                "value": "Bearer {{jwt}}"
              }
            ],
            "url": {
              "raw": "{{baseUrl}}/api/v1/checkins/{{lastCheckinId}}",
              "host": ["{{baseUrl}}"],
              "path": ["api", "v1", "checkins", "{{lastCheckinId}}"]
            },
            "description": "Consulta o status e detalhes de um check-in pelo ID.\n\nUsa {{lastCheckinId}} salvo automaticamente pelo Registrar Check-in.\nSubstitua pelo ID desejado para consultar qualquer check-in."
          },
          "response": [
            {
              "name": "200 OK — Check-in publicado",
              "status": "OK",
              "code": 200,
              "_postman_previewlanguage": "json",
              "body": "{\n  \"id\": \"3fa85f64-5717-4562-b3fc-2c963f66afa6\",\n  \"tenantId\": \"1a2b3c4d-0000-0000-0000-000000000001\",\n  \"source\": \"Internal\",\n  \"status\": \"PUBLISHED\",\n  \"partnerTransactionId\": \"TXN-2026-07-03-001\",\n  \"correlationId\": \"2b3c4d5e-aaaa-bbbb-cccc-000000000002\",\n  \"occurredAt\": \"2026-07-03T08:30:00Z\",\n  \"receivedAt\": \"2026-07-03T08:30:01.234Z\",\n  \"rejectionReason\": null\n}"
            },
            {
              "name": "200 OK — Aluno não encontrado",
              "status": "OK",
              "code": 200,
              "_postman_previewlanguage": "json",
              "body": "{\n  \"id\": \"3fa85f64-5717-4562-b3fc-2c963f66afa6\",\n  \"tenantId\": \"1a2b3c4d-0000-0000-0000-000000000001\",\n  \"source\": \"Internal\",\n  \"status\": \"REJECTED\",\n  \"partnerTransactionId\": \"TXN-2026-07-03-999\",\n  \"correlationId\": \"2b3c4d5e-aaaa-bbbb-cccc-000000000003\",\n  \"occurredAt\": \"2026-07-03T09:00:00Z\",\n  \"receivedAt\": \"2026-07-03T09:00:01.100Z\",\n  \"rejectionReason\": \"STUDENT_NOT_FOUND\"\n}"
            }
          ]
        }
      ]
    }
  ]
}
