{
  "info": {
    "name": "PAPEDA API BKDH & Portal",
    "description": "Uji API baca PAPEDA. Isi variabel baseUrl, token, dan bulan di tab Variables koleksi ini. Tanda tangan Ed25519 tidak bisa diperiksa di Postman; periksa dengan docs/bkdh/verifikasi.php.",
    "schema": "https://schema.getpostman.com/json/collection/v2.1.0/collection.json"
  },
  "auth": {
    "type": "bearer",
    "bearer": [
      {
        "key": "token",
        "value": "{{token}}",
        "type": "string"
      }
    ]
  },
  "variable": [
    {
      "key": "baseUrl",
      "value": "https://sdmtvripapua.com"
    },
    {
      "key": "token",
      "value": "pbk_ISI_TOKEN_DI_SINI"
    },
    {
      "key": "bulan",
      "value": "2026-10"
    }
  ],
  "item": [
    {
      "name": "1. Identitas (C1)",
      "event": [
        {
          "listen": "test",
          "script": {
            "type": "text/javascript",
            "exec": [
              "pm.test('Status 200', () => pm.response.to.have.status(200));",
              "pm.test('Content-Type application/json', () => pm.expect(pm.response.headers.get('Content-Type')).to.include('application/json'));",
              "const sig = pm.response.headers.get('X-Signature') || '';",
              "pm.test('Ada X-Signature (base64, 88 karakter)', () => pm.expect(sig).to.match(/^[A-Za-z0-9+/]{86}==$/));",
              "const d = pm.response.json();",
              "pm.test('X-Key-Id sama dengan key_id dokumen', () => pm.expect(pm.response.headers.get('X-Key-Id')).to.eql(d.key_id));",
              "pm.test('Kontrak identity v1 dari papeda', () => { pm.expect(d.contract).to.eql('identity'); pm.expect(d.contract_version).to.eql(1); pm.expect(d.source).to.eql('papeda'); });",
              "pm.test('Kunci dokumen sesuai urutan kontrak', () => pm.expect(Object.keys(d)).to.eql(['contract','contract_version','source','key_id','snapshot_id','sequence','generated_at','units','persons']));",
              "pm.test('Kolom setiap orang sesuai kontrak', () => d.persons.forEach(o => pm.expect(Object.keys(o)).to.eql(['external_id','number','number_type','employment_type','name','unit_code','active','effective_from'])));",
              "pm.test('Tidak ada data pribadi terlarang', () => { const t = pm.response.text().toLowerCase(); ['nik','tgllahir','tlp_peg','email','golongan','jabatan','alamat'].forEach(k => pm.expect(t).to.not.include('\"' + k)); });",
              "console.log('Identitas seq ' + d.sequence + ', ' + d.persons.length + ' orang, ' + d.units.length + ' unit. Tanda tangan diperiksa terpisah dengan verifikasi.php.');"
            ]
          }
        }
      ],
      "request": {
        "method": "GET",
        "header": [
          {
            "key": "Accept",
            "value": "application/json"
          }
        ],
        "url": {
          "raw": "{{baseUrl}}/api/bkdh/v1/identity",
          "host": [
            "{{baseUrl}}"
          ],
          "path": [
            "api",
            "bkdh",
            "v1",
            "identity"
          ]
        }
      }
    },
    {
      "name": "2. Jadwal bulanan (C2)",
      "event": [
        {
          "listen": "test",
          "script": {
            "type": "text/javascript",
            "exec": [
              "pm.test('Status 200', () => pm.response.to.have.status(200));",
              "pm.test('Ada X-Signature', () => pm.expect(pm.response.headers.get('X-Signature') || '').to.match(/^[A-Za-z0-9+/]{86}==$/));",
              "const d = pm.response.json();",
              "const bulan = pm.collectionVariables.get('bulan');",
              "const [th, bl] = bulan.split('-').map(Number);",
              "const jml = new Date(th, bl, 0).getDate();",
              "pm.test('Kontrak schedule bulan yang diminta', () => { pm.expect(d.contract).to.eql('schedule'); pm.expect(d.month).to.eql(bulan); });",
              "pm.test('Kunci dokumen sesuai urutan kontrak', () => pm.expect(Object.keys(d)).to.eql(['contract','contract_version','source','key_id','snapshot_id','sequence','generated_at','month','entries','holidays','office_working_days']));",
              "pm.test('Setiap orang punya ' + jml + ' hari berisi M/L/C/null', () => d.entries.forEach(e => { pm.expect(e.days.length).to.eql(jml); e.days.forEach(x => pm.expect([null,'M','L','C']).to.include(x)); }));",
              "pm.test('Tanggal merah berjenis sah', () => d.holidays.forEach(h => pm.expect(['NATIONAL','JOINT_LEAVE','REGIONAL']).to.include(h.kind)));",
              "console.log('Jadwal ' + d.month + ' seq ' + d.sequence + ', ' + d.entries.length + ' orang, ' + d.holidays.length + ' tanggal merah.');"
            ]
          }
        }
      ],
      "request": {
        "method": "GET",
        "header": [
          {
            "key": "Accept",
            "value": "application/json"
          }
        ],
        "url": {
          "raw": "{{baseUrl}}/api/bkdh/v1/schedule?month={{bulan}}",
          "host": [
            "{{baseUrl}}"
          ],
          "path": [
            "api",
            "bkdh",
            "v1",
            "schedule"
          ],
          "query": [
            {
              "key": "month",
              "value": "{{bulan}}"
            }
          ]
        }
      }
    },
    {
      "name": "3. Tanpa token -> 401",
      "event": [
        {
          "listen": "test",
          "script": {
            "type": "text/javascript",
            "exec": [
              "pm.test('Ditolak 401 tanpa token', () => pm.response.to.have.status(401));"
            ]
          }
        }
      ],
      "request": {
        "method": "GET",
        "header": [
          {
            "key": "Accept",
            "value": "application/json"
          }
        ],
        "url": {
          "raw": "{{baseUrl}}/api/bkdh/v1/identity",
          "host": [
            "{{baseUrl}}"
          ],
          "path": [
            "api",
            "bkdh",
            "v1",
            "identity"
          ]
        },
        "auth": {
          "type": "noauth"
        }
      }
    },
    {
      "name": "4. Bulan salah bentuk -> 400",
      "event": [
        {
          "listen": "test",
          "script": {
            "type": "text/javascript",
            "exec": [
              "pm.test('Ditolak 400', () => pm.response.to.have.status(400));"
            ]
          }
        }
      ],
      "request": {
        "method": "GET",
        "header": [
          {
            "key": "Accept",
            "value": "application/json"
          }
        ],
        "url": {
          "raw": "{{baseUrl}}/api/bkdh/v1/schedule?month=10-2026",
          "host": [
            "{{baseUrl}}"
          ],
          "path": [
            "api",
            "bkdh",
            "v1",
            "schedule"
          ],
          "query": [
            {
              "key": "month",
              "value": "10-2026"
            }
          ]
        }
      }
    },
    {
      "name": "5. Bulan belum terbit -> 404",
      "event": [
        {
          "listen": "test",
          "script": {
            "type": "text/javascript",
            "exec": [
              "pm.test('Ditolak 404', () => pm.response.to.have.status(404));"
            ]
          }
        }
      ],
      "request": {
        "method": "GET",
        "header": [
          {
            "key": "Accept",
            "value": "application/json"
          }
        ],
        "url": {
          "raw": "{{baseUrl}}/api/bkdh/v1/schedule?month=2099-01",
          "host": [
            "{{baseUrl}}"
          ],
          "path": [
            "api",
            "bkdh",
            "v1",
            "schedule"
          ],
          "query": [
            {
              "key": "month",
              "value": "2099-01"
            }
          ]
        }
      }
    }
  ]
}