{
  "info": {
    "_postman_id": "8a1249e7-7bac-45db-8760-2db1f1d8cc7e",
    "name": "LNSW Pengangkut - Split Billing Module Test Suite",
    "description": "Postman collection komprehensif untuk pengujian endpoint POST /split-billing (Pre-Billing Multi-KL Bypass & Post-Billing Void-Reset), otorisasi admin (groupGa 00, 07, 20), validasi skema array bypass_targets[], serta guard bisnis (total-bypass prevention & billing lunas guard) selaras 100% dengan QA Playbook Skenario 1 s.d. 9.",
    "schema": "https://schema.getpostman.com/json/collection/v2.1.0/collection.json"
  },
  "variable": [
    {
      "key": "baseUrl",
      "value": "https://dev-backend.insw.go.id/pengangkut/api",
      "type": "string"
    },
    {
      "key": "adminToken",
      "value": "KZ6IlAA4NxocmCozKC71xaYymS7sMAgM_94h0gftFnG",
      "type": "string"
    },
    {
      "key": "nonAdminToken",
      "value": "REGULAR_USER_TOKEN_EXAMPLE",
      "type": "string"
    },
    {
      "key": "serviceNumber",
      "value": "102202409010001",
      "type": "string"
    },
    {
      "key": "arrivalServiceNumber",
      "value": "101202409010001",
      "type": "string"
    }
  ],
  "item": [
    {
      "name": "1. Positive Case (Happy Path)",
      "item": [
        {
          "name": "Skenario 1 — Pre-Billing Baseline: Bypass Sinkarkes Full",
          "request": {
            "method": "POST",
            "header": [
              {
                "key": "Content-Type",
                "value": "application/json"
              },
              {
                "key": "Authorization",
                "value": "Bearer {{adminToken}}"
              }
            ],
            "body": {
              "mode": "raw",
              "raw": "{\n  \"service_number\": \"102202409010001\",\n  \"bypass_targets\": [\n    {\n      \"kode_kl\": \"024\"\n    }\n  ],\n  \"keterangan\": \"Bypass Sinkarkes penuh agar tagihan Inaport dapat terbit terlebih dahulu\"\n}"
            },
            "url": {
              "raw": "{{baseUrl}}/split-billing",
              "host": [
                "{{baseUrl}}"
              ],
              "path": [
                "split-billing"
              ]
            },
            "description": "Mem-bypass seluruh tagihan Sinkarkes (024) baik kedatangan maupun keberangkatan sebelum kode billing terbit, sehingga hanya tagihan Inaport (022) yang diproses."
          },
          "response": []
        },
        {
          "name": "Skenario 2 — Pre-Billing Placeholder: Bypass Sinkarkes Sebelum Data Landing di DB",
          "request": {
            "method": "POST",
            "header": [
              {
                "key": "Content-Type",
                "value": "application/json"
              },
              {
                "key": "Authorization",
                "value": "Bearer {{adminToken}}"
              }
            ],
            "body": {
              "mode": "raw",
              "raw": "{\n  \"service_number\": \"102202409010002\",\n  \"bypass_targets\": [\n    {\n      \"kode_kl\": \"024\"\n    }\n  ],\n  \"keterangan\": \"Pre-bypass Sinkarkes sebelum data terkirim ke DB\"\n}"
            },
            "url": {
              "raw": "{{baseUrl}}/split-billing",
              "host": [
                "{{baseUrl}}"
              ],
              "path": [
                "split-billing"
              ]
            },
            "description": "Memastikan sistem berhasil membuat baris placeholder BYPASSED ketika admin melakukan split sebelum K/L Sinkarkes mengirimkan tagihan."
          },
          "response": []
        },
        {
          "name": "Skenario 3 — Pre-Billing Multi-KL Split: 022 & 024 Kedatangan",
          "request": {
            "method": "POST",
            "header": [
              {
                "key": "Content-Type",
                "value": "application/json"
              },
              {
                "key": "Authorization",
                "value": "Bearer {{adminToken}}"
              }
            ],
            "body": {
              "mode": "raw",
              "raw": "{\n  \"service_number\": \"102202409010003\",\n  \"bypass_targets\": [\n    {\n      \"kode_kl\": \"022\"\n    },\n    {\n      \"kode_kl\": \"024\",\n      \"jenis_pengajuan\": \"kedatangan\"\n    }\n  ],\n  \"keterangan\": \"Tagihan Inaport dan Sinkarkes Kedatangan dibayar mandiri\"\n}"
            },
            "url": {
              "raw": "{{baseUrl}}/split-billing",
              "host": [
                "{{baseUrl}}"
              ],
              "path": [
                "split-billing"
              ]
            },
            "description": "Mem-bypass tagihan multi-instansi (Inaport 022 dan Sinkarkes Kedatangan 024) secara bersamaan sebelum billing terbit."
          },
          "response": []
        },
        {
          "name": "Skenario 4 — Post-Billing Baseline: Void & Reset Bypass Sinkarkes Full",
          "request": {
            "method": "POST",
            "header": [
              {
                "key": "Content-Type",
                "value": "application/json"
              },
              {
                "key": "Authorization",
                "value": "Bearer {{adminToken}}"
              }
            ],
            "body": {
              "mode": "raw",
              "raw": "{\n  \"service_number\": \"102202409010004\",\n  \"bypass_targets\": [\n    {\n      \"kode_kl\": \"024\"\n    }\n  ],\n  \"keterangan\": \"Void billing gabungan untuk memisahkan seluruh tagihan Karantina\"\n}"
            },
            "url": {
              "raw": "{{baseUrl}}/split-billing",
              "host": [
                "{{baseUrl}}"
              ],
              "path": [
                "split-billing"
              ]
            },
            "description": "Membatalkan kode billing gabungan (Inaport + Sinkarkes) yang sudah terbit di Single Billing, lalu mereset tagihan sehingga hanya tagihan Inaport yang siap diterbitkan ulang."
          },
          "response": []
        },
        {
          "name": "Skenario 5 — Post-Billing Void & Reset Parsial: Bypass Sinkarkes Keberangkatan",
          "request": {
            "method": "POST",
            "header": [
              {
                "key": "Content-Type",
                "value": "application/json"
              },
              {
                "key": "Authorization",
                "value": "Bearer {{adminToken}}"
              }
            ],
            "body": {
              "mode": "raw",
              "raw": "{\n  \"service_number\": \"102202409010005\",\n  \"bypass_targets\": [\n    {\n      \"kode_kl\": \"024\",\n      \"jenis_pengajuan\": \"keberangkatan\"\n    }\n  ],\n  \"keterangan\": \"Bypass Sinkarkes Keberangkatan pasca billing terbit\"\n}"
            },
            "url": {
              "raw": "{{baseUrl}}/split-billing",
              "host": [
                "{{baseUrl}}"
              ],
              "path": [
                "split-billing"
              ]
            },
            "description": "Membatalkan kode billing aktif dan mereset tagihan dengan hanya mem-bypass Sinkarkes Keberangkatan, sedangkan Inaport dan Sinkarkes Kedatangan tetap diproses pada billing baru."
          },
          "response": []
        },
        {
          "name": "Variasi — Pre-Billing Specific id_tagihan_hdr Bypass",
          "request": {
            "method": "POST",
            "header": [
              {
                "key": "Content-Type",
                "value": "application/json"
              },
              {
                "key": "Authorization",
                "value": "Bearer {{adminToken}}"
              }
            ],
            "body": {
              "mode": "raw",
              "raw": "{\n  \"service_number\": \"{{serviceNumber}}\",\n  \"bypass_targets\": [\n    {\n      \"kode_kl\": \"022\",\n      \"id_tagihan_hdr\": [105]\n    }\n  ],\n  \"keterangan\": \"Bypass tagihan Warta spesifik header 105 dibayar mandiri\"\n}"
            },
            "url": {
              "raw": "{{baseUrl}}/split-billing",
              "host": [
                "{{baseUrl}}"
              ],
              "path": [
                "split-billing"
              ]
            },
            "description": "Melakukan bypass tagihan K/L berdasarkan array id_tagihan_hdr spesifik."
          },
          "response": []
        }
      ]
    },
    {
      "name": "2. Negative Case (Validation, Auth, & Business Rule Testing)",
      "item": [
        {
          "name": "Skenario 6 — Guard Total-Bypass Ditolak",
          "request": {
            "method": "POST",
            "header": [
              {
                "key": "Content-Type",
                "value": "application/json"
              },
              {
                "key": "Authorization",
                "value": "Bearer {{adminToken}}"
              }
            ],
            "body": {
              "mode": "raw",
              "raw": "{\n  \"service_number\": \"{{serviceNumber}}\",\n  \"bypass_targets\": [\n    {\n      \"kode_kl\": \"022\"\n    },\n    {\n      \"kode_kl\": \"024\"\n    }\n  ],\n  \"keterangan\": \"Mencoba bypass seluruh tagihan pada batch aktif\"\n}"
            },
            "url": {
              "raw": "{{baseUrl}}/split-billing",
              "host": [
                "{{baseUrl}}"
              ],
              "path": [
                "split-billing"
              ]
            },
            "description": "Uji penolakan guard saat seluruh tagihan di-bypass. Minimal 1 tagihan wajib ACTIVE agar dapat re-billing. Ekspektasi: 400 Bad Request."
          },
          "response": []
        },
        {
          "name": "Skenario 7 — Guard Billing Lunas (Paid) Ditolak",
          "request": {
            "method": "POST",
            "header": [
              {
                "key": "Content-Type",
                "value": "application/json"
              },
              {
                "key": "Authorization",
                "value": "Bearer {{adminToken}}"
              }
            ],
            "body": {
              "mode": "raw",
              "raw": "{\n  \"service_number\": \"{{serviceNumber}}\",\n  \"bypass_targets\": [\n    {\n      \"kode_kl\": \"024\",\n      \"jenis_pengajuan\": \"keberangkatan\"\n    }\n  ],\n  \"keterangan\": \"Mencoba split billing padahal kode billing induk sudah lunas\"\n}"
            },
            "url": {
              "raw": "{{baseUrl}}/split-billing",
              "host": [
                "{{baseUrl}}"
              ],
              "path": [
                "split-billing"
              ]
            },
            "description": "Uji penolakan split billing jika billing induk sudah lunas (fl_paid = true). Ekspektasi: 400 Bad Request."
          },
          "response": []
        },
        {
          "name": "Skenario 8 — Otorisasi Non-Admin (RBAC Security)",
          "request": {
            "method": "POST",
            "header": [
              {
                "key": "Content-Type",
                "value": "application/json"
              },
              {
                "key": "Authorization",
                "value": "Bearer {{nonAdminToken}}"
              }
            ],
            "body": {
              "mode": "raw",
              "raw": "{\n  \"service_number\": \"{{serviceNumber}}\",\n  \"bypass_targets\": [\n    {\n      \"kode_kl\": \"024\"\n    }\n  ],\n  \"keterangan\": \"Percobaan akses split billing dari akun non-admin\"\n}"
            },
            "url": {
              "raw": "{{baseUrl}}/split-billing",
              "host": [
                "{{baseUrl}}"
              ],
              "path": [
                "split-billing"
              ]
            },
            "description": "Uji akses endpoint /split-billing menggunakan akun bukan admin (tanpa groupGa 00, 07, 20). Ekspektasi: 403 Forbidden."
          },
          "response": []
        },
        {
          "name": "Skenario 9 — Validasi Nomor Aju Bukan Keberangkatan (Non-102)",
          "request": {
            "method": "POST",
            "header": [
              {
                "key": "Content-Type",
                "value": "application/json"
              },
              {
                "key": "Authorization",
                "value": "Bearer {{adminToken}}"
              }
            ],
            "body": {
              "mode": "raw",
              "raw": "{\n  \"service_number\": \"{{arrivalServiceNumber}}\",\n  \"bypass_targets\": [\n    {\n      \"kode_kl\": \"024\"\n    }\n  ],\n  \"keterangan\": \"Mengirimkan nomor aju kedatangan prefix 101\"\n}"
            },
            "url": {
              "raw": "{{baseUrl}}/split-billing",
              "host": [
                "{{baseUrl}}"
              ],
              "path": [
                "split-billing"
              ]
            },
            "description": "Uji split billing dengan nomor aju selain prefix 102 (misal kedatangan 101). Ekspektasi: 400 Bad Request."
          },
          "response": []
        }
      ]
    },
    {
      "name": "3. Boundary & Schema Validation Tests",
      "item": [
        {
          "name": "1. Empty bypass_targets Array (400 Bad Request)",
          "request": {
            "method": "POST",
            "header": [
              {
                "key": "Content-Type",
                "value": "application/json"
              },
              {
                "key": "Authorization",
                "value": "Bearer {{adminToken}}"
              }
            ],
            "body": {
              "mode": "raw",
              "raw": "{\n  \"service_number\": \"{{serviceNumber}}\",\n  \"bypass_targets\": [],\n  \"keterangan\": \"Array bypass_targets kosong\"\n}"
            },
            "url": {
              "raw": "{{baseUrl}}/split-billing",
              "host": [
                "{{baseUrl}}"
              ],
              "path": [
                "split-billing"
              ]
            },
            "description": "Uji validasi dengan array bypass_targets kosong. Ekspektasi: 400 Bad Request."
          },
          "response": []
        },
        {
          "name": "2. Invalid Enum kode_kl (400 Bad Request)",
          "request": {
            "method": "POST",
            "header": [
              {
                "key": "Content-Type",
                "value": "application/json"
              },
              {
                "key": "Authorization",
                "value": "Bearer {{adminToken}}"
              }
            ],
            "body": {
              "mode": "raw",
              "raw": "{\n  \"service_number\": \"{{serviceNumber}}\",\n  \"bypass_targets\": [\n    {\n      \"kode_kl\": \"015\"\n    }\n  ],\n  \"keterangan\": \"Mengirim kode_kl selain 022 dan 024\"\n}"
            },
            "url": {
              "raw": "{{baseUrl}}/split-billing",
              "host": [
                "{{baseUrl}}"
              ],
              "path": [
                "split-billing"
              ]
            },
            "description": "Uji validasi kode_kl tidak diizinkan. Ekspektasi: 400 Bad Request."
          },
          "response": []
        },
        {
          "name": "3. Short keterangan (400 Bad Request)",
          "request": {
            "method": "POST",
            "header": [
              {
                "key": "Content-Type",
                "value": "application/json"
              },
              {
                "key": "Authorization",
                "value": "Bearer {{adminToken}}"
              }
            ],
            "body": {
              "mode": "raw",
              "raw": "{\n  \"service_number\": \"{{serviceNumber}}\",\n  \"bypass_targets\": [\n    {\n      \"kode_kl\": \"024\"\n    }\n  ],\n  \"keterangan\": \"test\"\n}"
            },
            "url": {
              "raw": "{{baseUrl}}/split-billing",
              "host": [
                "{{baseUrl}}"
              ],
              "path": [
                "split-billing"
              ]
            },
            "description": "Uji validasi keterangan kurang dari 5 karakter. Ekspektasi: 400 Bad Request."
          },
          "response": []
        },
        {
          "name": "4. Invalid id_tagihan_hdr Format (400 Bad Request)",
          "request": {
            "method": "POST",
            "header": [
              {
                "key": "Content-Type",
                "value": "application/json"
              },
              {
                "key": "Authorization",
                "value": "Bearer {{adminToken}}"
              }
            ],
            "body": {
              "mode": "raw",
              "raw": "{\n  \"service_number\": \"{{serviceNumber}}\",\n  \"bypass_targets\": [\n    {\n      \"kode_kl\": \"022\",\n      \"id_tagihan_hdr\": [-1]\n    }\n  ],\n  \"keterangan\": \"Mengirimkan id_tagihan_hdr bernilai negatif\"\n}"
            },
            "url": {
              "raw": "{{baseUrl}}/split-billing",
              "host": [
                "{{baseUrl}}"
              ],
              "path": [
                "split-billing"
              ]
            },
            "description": "Uji validasi id_tagihan_hdr bernilai negatif atau bukan integer positif. Ekspektasi: 400 Bad Request."
          },
          "response": []
        },
        {
          "name": "5. Invalid jenis_pengajuan Enum (400 Bad Request)",
          "request": {
            "method": "POST",
            "header": [
              {
                "key": "Content-Type",
                "value": "application/json"
              },
              {
                "key": "Authorization",
                "value": "Bearer {{adminToken}}"
              }
            ],
            "body": {
              "mode": "raw",
              "raw": "{\n  \"service_number\": \"{{serviceNumber}}\",\n  \"bypass_targets\": [\n    {\n      \"kode_kl\": \"024\",\n      \"jenis_pengajuan\": \"transit\"\n    }\n  ],\n  \"keterangan\": \"Mengirimkan jenis_pengajuan selain kedatangan atau keberangkatan\"\n}"
            },
            "url": {
              "raw": "{{baseUrl}}/split-billing",
              "host": [
                "{{baseUrl}}"
              ],
              "path": [
                "split-billing"
              ]
            },
            "description": "Uji validasi jenis_pengajuan enum yang tidak valid. Ekspektasi: 400 Bad Request."
          },
          "response": []
        },
        {
          "name": "6. Pre-Billing Bypass Rejected saat Billing Terbit (fl_billing = true)",
          "request": {
            "method": "POST",
            "header": [
              {
                "key": "Content-Type",
                "value": "application/json"
              },
              {
                "key": "Authorization",
                "value": "Bearer {{adminToken}}"
              }
            ],
            "body": {
              "mode": "raw",
              "raw": "{\n  \"service_number\": \"{{serviceNumber}}\",\n  \"bypass_targets\": [\n    {\n      \"kode_kl\": \"024\"\n    }\n  ],\n  \"keterangan\": \"Mencoba pre-billing bypass padahal billing sudah terbit\"\n}"
            },
            "url": {
              "raw": "{{baseUrl}}/split-billing",
              "host": [
                "{{baseUrl}}"
              ],
              "path": [
                "split-billing"
              ]
            },
            "description": "Uji penolakan bypass pre-billing ketika fl_billing sudah bernilai true. Ekspektasi: 400 Bad Request."
          },
          "response": []
        },
        {
          "name": "7. Target id_tagihan_hdr Not Found in Active Batch (400 Bad Request)",
          "request": {
            "method": "POST",
            "header": [
              {
                "key": "Content-Type",
                "value": "application/json"
              },
              {
                "key": "Authorization",
                "value": "Bearer {{adminToken}}"
              }
            ],
            "body": {
              "mode": "raw",
              "raw": "{\n  \"service_number\": \"{{serviceNumber}}\",\n  \"bypass_targets\": [\n    {\n      \"kode_kl\": \"022\",\n      \"id_tagihan_hdr\": [999999]\n    }\n  ],\n  \"keterangan\": \"Mengirimkan id_tagihan_hdr yang tidak terdaftar di batch aktif\"\n}"
            },
            "url": {
              "raw": "{{baseUrl}}/split-billing",
              "host": [
                "{{baseUrl}}"
              ],
              "path": [
                "split-billing"
              ]
            },
            "description": "Uji penolakan ketika id_tagihan_hdr yang dikirim tidak terdaftar di batch aktif transaksi. Ekspektasi: 400 Bad Request."
          },
          "response": []
        }
      ]
    }
  ]
}