{
  "info": {
    "_postman_id": "30b929a6-885c-472a-92e2-2f321faa179a",
    "name": "LNSW Pengangkut - Manual Billing & Idempotency Test Suite",
    "description": "Postman collection komprehensif untuk pengujian alur manual request billing, evaluasi kelayakan (inquiry-billing), serta skenario negative cases & boundary testing pada modul Pengangkut Core.",
    "schema": "https://schema.getpostman.com/json/collection/v2.1.0/collection.json"
  },
  "variable": [
    {
      "key": "baseUrl",
      "value": "https://demo-backend.insw.go.id/pengangkut/api",
      "type": "string"
    },
    {
      "key": "singleBillingBaseUrl",
      "value": "https://demo-backend.insw.go.id/single-billing",
      "type": "string"
    },
    {
      "key": "apiKey",
      "value": "dSGZSMBOtdh4dWLYwW7qT38nVroknMHn",
      "type": "string"
    },
    {
      "key": "bearerToken",
      "value": "KZ6IlAA4NxocmCozKC71xaYymS7sMAgM_94h0gftFnG",
      "type": "string"
    },
    {
      "key": "singleBillingToken",
      "value": "9kuq3cU3AXa5XGPV2Pyec1kGZesDJPxX",
      "type": "string"
    },
    {
      "key": "inswKemenhubKey",
      "value": "xxx",
      "type": "string"
    },
    {
      "key": "inswKemenkesKey",
      "value": "xxx",
      "type": "string"
    },
    {
      "key": "billingKemenhubKey",
      "value": "xxx",
      "type": "string"
    },
    {
      "key": "billingKemenkesKey",
      "value": "xxx",
      "type": "string"
    },
    {
      "key": "serviceNumber",
      "value": "102019B83694C",
      "type": "string"
    },
    {
      "key": "serviceNumberKedatangan",
      "value": "101019543877B",
      "type": "string"
    },
    {
      "key": "invalidServiceNumber",
      "value": "1029999999999",
      "type": "string"
    },
    {
      "key": "idempotencyKey",
      "value": "",
      "type": "string"
    },
    {
      "key": "kodeBilling",
      "value": "820260710740418",
      "type": "string"
    }
  ],
  "item": [
    {
      "name": "1. Simulasi Data Prasyarat (Data Seeding)",
      "item": [
        {
          "name": "1. Simulasi Approval LK3 Kemenhub",
          "request": {
            "method": "POST",
            "header": [
              {
                "key": "Content-Type",
                "value": "application/json"
              },
              {
                "key": "insw-kemenhub-key",
                "value": "{{inswKemenhubKey}}"
              }
            ],
            "body": {
              "mode": "raw",
              "raw": "{\n  \"no_aju\": \"{{serviceNumber}}\",\n  \"tipe\": \"LK3\",\n  \"nomor_layanan\": \"BDN.IDMAK.2609.000140\",\n  \"status\": 2,\n  \"message\": \"\",\n  \"nomor_produk\": \"SL003.IDMAK.0926.000142\",\n  \"waktu_approve\": \"2026-09-09 11:10:22\",\n  \"link_produk\": \"https://simpadu-inaportnet.dephub.go.id/index.php/document/pdfs/lk3_nakhoda/SL003.DN.IDMAK.2609.000139\",\n  \"kode_dermaga\": \"\"\n}"
            },
            "url": {
              "raw": "{{baseUrl}}/warta-kapal/send/putResponse",
              "host": [
                "{{baseUrl}}"
              ],
              "path": [
                "warta-kapal",
                "send",
                "putResponse"
              ]
            },
            "description": "Simulasi kirim respon approval LK3 dari Kemenhub (doc=7, status=2)."
          },
          "response": []
        },
        {
          "name": "2. Simulasi Tagihan Inaportnet (Kemenhub - KL 022)",
          "request": {
            "method": "POST",
            "header": [
              {
                "key": "Content-Type",
                "value": "application/json"
              }
            ],
            "body": {
              "mode": "raw",
              "raw": "{\n  \"simponi_req\": {\n    \"method\": \"billingcode\",\n    \"key\": \"{{billingKemenhubKey}}\",\n    \"data\": [\n      {\n        \"header\": [\n          \"{{serviceNumber}}\",\n          \"INV.IDMAK.2609.000003\",\n          \"\",\n          null,\n          \"022\",\n          \"04\",\n          \"413439\",\n          \"F\",\n          \"1\",\n          834660,\n          \"Labuh-PU-PT. JELAJAH LAUT NUSANTARA\",\n          \"413439\",\n          \"014844831042001\"\n        ],\n        \"detail\": [\n          [\n            \"Labuh-PU-PT. JELAJAH LAUT NUSANTARA\",\n            \"000401\",\n            \"201615C\",\n            \"425513\",\n            90,\n            9274,\n            \"Per GT/15 Hari\",\n            834660,\n            \"19\",\n            \"51\",\n            0\n          ]\n        ]\n      },\n      {\n        \"header\": [\n          \"{{serviceNumber}}\",\n          \"INV.IDMAK.2609.000009\",\n          \"\",\n          null,\n          \"022\",\n          \"04\",\n          \"287473\",\n          \"F\",\n          \"1\",\n          175000,\n          \"VTS-PU-IDMAK-PT. JELAJAH LAUT NUSANTARA\",\n          \"287473\",\n          \"014844831042001\"\n        ],\n        \"detail\": [\n          [\n            \"VTS-PU-IDMAK-PT. JELAJAH LAUT NUSANTARA\",\n            \"000930\",\n            \"201615C\",\n            \"425517\",\n            175000,\n            1,\n            \"Per Kapal\",\n            175000,\n            \"19\",\n            \"51\",\n            0\n          ]\n        ]\n      }\n    ]\n  }\n}"
            },
            "url": {
              "raw": "{{baseUrl}}/tagihan",
              "host": [
                "{{baseUrl}}"
              ],
              "path": [
                "tagihan"
              ]
            },
            "description": "Injeksi data tagihan Warta Kapal Kemenhub (KL 022) ke sistem."
          },
          "response": []
        },
        {
          "name": "3. Simulasi Tagihan Sinkarkes (Kemenkes - KL 024)",
          "request": {
            "method": "POST",
            "header": [
              {
                "key": "Content-Type",
                "value": "application/json"
              }
            ],
            "body": {
              "mode": "raw",
              "raw": "{\n  \"simponi_req\": {\n    \"method\": \"billingcode\",\n    \"key\": \"{{billingKemenkesKey}}\",\n    \"data\": {\n      \"header\": [\n        \"{{serviceNumber}}\",\n        \"58830\",\n        \"SIxxxxx\",\n        \"2026-09-08 07:23:44\",\n        \"024\",\n        \"05\",\n        \"416145\",\n        \"F\",\n        \"1\",\n        85000,\n        \"PT JELAJAH LAUT NUSANTARA\",\n        \"416145\",\n        \"014844831042001\"\n      ],\n      \"detail\": [\n        [\n          \"PT JELAJAH LAUT NUSANTARA\",\n          \"001111\",\n          \"2024045\",\n          \"425314\",\n          85000,\n          1,\n          \"Per Pemeriksaan Per Kapal\",\n          85000,\n          \"19\",\n          \"51\"\n        ]\n      ]\n    }\n  }\n}"
            },
            "url": {
              "raw": "{{baseUrl}}/tagihan",
              "host": [
                "{{baseUrl}}"
              ],
              "path": [
                "tagihan"
              ]
            },
            "description": "Injeksi data tagihan Sinkarkes Kemenkes (KL 024) ke sistem."
          },
          "response": []
        },
        {
          "name": "4. Simulasi Tagihan Sinkarkes Kedatangan (Kemenkes - KL 024)",
          "request": {
            "method": "POST",
            "header": [
              {
                "key": "Content-Type",
                "value": "application/json"
              }
            ],
            "body": {
              "mode": "raw",
              "raw": "{\n  \"simponi_req\": {\n    \"method\": \"billingcode\",\n    \"key\": \"{{billingKemenkesKey}}\",\n    \"data\": {\n      \"header\": [\n        \"{{serviceNumberKedatangan}}\",\n        \"58830\",\n        \"SIxxxxx\",\n        \"2026-09-08 07:23:44\",\n        \"024\",\n        \"05\",\n        \"416145\",\n        \"F\",\n        \"1\",\n        85000,\n        \"PT JELAJAH LAUT NUSANTARA\",\n        \"416145\",\n        \"014844831042001\"\n      ],\n      \"detail\": [\n        [\n          \"PT JELAJAH LAUT NUSANTARA\",\n          \"001111\",\n          \"2024045\",\n          \"425314\",\n          85000,\n          1,\n          \"Per Pemeriksaan Per Kapal\",\n          85000,\n          \"19\",\n          \"51\"\n        ]\n      ]\n    }\n  }\n}"
            },
            "url": {
              "raw": "{{baseUrl}}/tagihan",
              "host": [
                "{{baseUrl}}"
              ],
              "path": [
                "tagihan"
              ]
            },
            "description": "Injeksi data tagihan Sinkarkes Kemenkes (KL 024) kedatangan ke sistem."
          },
          "response": []
        },
        {
          "name": "5. Simulasi Pembayaran Lunas Single Billing (activeinquiry_v2)",
          "event": [
            {
              "listen": "prerequest",
              "script": {
                "exec": [
                  "// ==================================================================",
                  "// Pre-request Script: Simulasi Callback Simponi DJA activeinquiry_v2",
                  "// Mengisi variabel dinamis pada body request pada setiap eksekusi",
                  "// ==================================================================",
                  "",
                  "function getRandomString(length) {",
                  "    var chars = 'ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789';",
                  "    var result = '';",
                  "    for (var i = 0; i < length; i++) {",
                  "        result += chars.charAt(Math.floor(Math.random() * chars.length));",
                  "    }",
                  "    return result;",
                  "}",
                  "",
                  "function getRandomNumeric(length) {",
                  "    var result = '';",
                  "    for (var i = 0; i < length; i++) {",
                  "        result += Math.floor(Math.random() * 10).toString();",
                  "    }",
                  "    return result;",
                  "}",
                  "",
                  "function formatDate(d) {",
                  "    var pad = function(n) { return (n < 10 ? '0' + n : n); };",
                  "    return d.getFullYear() + '-' + pad(d.getMonth() + 1) + '-' + pad(d.getDate()) + ' ' + pad(d.getHours()) + ':' + pad(d.getMinutes()) + ':' + pad(d.getSeconds());",
                  "}",
                  "",
                  "function formatDateZero(d) {",
                  "    var pad = function(n) { return (n < 10 ? '0' + n : n); };",
                  "    return d.getFullYear() + '-' + pad(d.getMonth() + 1) + '-' + pad(d.getDate()) + ' 00:00:00';",
                  "}",
                  "",
                  "var now = new Date();",
                  "var pad = function(n) { return (n < 10 ? '0' + n : n); };",
                  "var ymd = '' + now.getFullYear() + pad(now.getMonth() + 1) + pad(now.getDate());",
                  "",
                  "// [0] ID Tagihan / Trx Simponi DJA (7 digit random)",
                  "pm.variables.set('simponiIdBilling', Math.floor(1000000 + Math.random() * 9000000).toString());",
                  "",
                  "// [1] Trx ID INSW / ID Billing Single Billing (timestamp + 11 digit random)",
                  "pm.variables.set('simponiTrxIdInsw', ymd + getRandomNumeric(11));",
                  "",
                  "// [2] Kode Billing: Diambil otomatis dari variabel collection {{kodeBilling}}",
                  "if (!pm.variables.get('kodeBilling') && !pm.collectionVariables.get('kodeBilling')) {",
                  "    pm.collectionVariables.set('kodeBilling', '820260710740418');",
                  "}",
                  "",
                  "// [3] NTPN (16 karakter alphanumeric uppercase)",
                  "pm.variables.set('simponiNtpn', getRandomString(16));",
                  "",
                  "// [4] NTB / Ref Bank (12 digit angka)",
                  "pm.variables.set('simponiNtb', getRandomNumeric(12));",
                  "",
                  "// [5] Tanggal & Jam Pembayaran (Current Timestamp YYYY-MM-DD HH:mm:ss)",
                  "pm.variables.set('simponiTglJamBayar', formatDate(now));",
                  "",
                  "// [8] Tanggal Buku / Tanggal Setor Kas Negara (YYYY-MM-DD 00:00:00)",
                  "pm.variables.set('simponiTglBuku', formatDateZero(now));"
                ],
                "type": "text/javascript"
              }
            }
          ],
          "request": {
            "method": "POST",
            "header": [
              {
                "key": "Content-Type",
                "value": "application/json"
              },
              {
                "key": "Authorization",
                "value": "Bearer {{singleBillingToken}}"
              }
            ],
            "body": {
              "mode": "raw",
              "raw": "{\n  \"simponi_req\": {\n    \"method\": \"activeinquiry_v2\",\n    \"data\": [\n      \"{{simponiIdBilling}}\",\n      \"{{simponiTrxIdInsw}}\",\n      \"{{kodeBilling}}\",\n      \"{{simponiNtpn}}\",\n      \"{{simponiNtb}}\",\n      \"{{simponiTglJamBayar}}\",\n      \"520008000990\",\n      \"7015\",\n      \"{{simponiTglBuku}}\"\n    ]\n  }\n}"
            },
            "url": {
              "raw": "{{singleBillingBaseUrl}}/dja/activeinquiry_v2",
              "host": [
                "{{singleBillingBaseUrl}}"
              ],
              "path": [
                "dja",
                "activeinquiry_v2"
              ]
            },
            "description": "Simulasi callback pelunasan pembayaran dari Simponi DJA ke Layanan Single Billing (fl_paid = true, status lunas). Seluruh nilai di-generate dinamis via Pre-request Script dan kode billing target terikat pada variabel {{kodeBilling}}."
          },
          "response": []
        }
      ]
    },
    {
      "name": "2. Positive Case (Happy Path)",
      "item": [
        {
          "name": "1. GET Inquiry Billing (Eligible)",
          "request": {
            "method": "GET",
            "header": [
              {
                "key": "Authorization",
                "value": "Bearer {{bearerToken}}"
              }
            ],
            "url": {
              "raw": "{{baseUrl}}/inquiry-billing?serviceNumber={{serviceNumber}}",
              "host": [
                "{{baseUrl}}"
              ],
              "path": [
                "inquiry-billing"
              ],
              "query": [
                {
                  "key": "serviceNumber",
                  "value": "{{serviceNumber}}"
                }
              ]
            },
            "description": "Mengecek status kelayakan (eligibility) pengajuan billing. Ekspektasi: is_eligible = true."
          },
          "response": []
        },
        {
          "name": "2. POST Generate Idempotency Key (Valid)",
          "event": [
            {
              "listen": "test",
              "script": {
                "exec": [
                  "if (pm.response.code === 200) {",
                  "    var jsonData = pm.response.json();",
                  "    if (jsonData && jsonData.data && jsonData.data.idempotency_key) {",
                  "        pm.collectionVariables.set('idempotencyKey', jsonData.data.idempotency_key);",
                  "        console.log('Idempotency key successfully set to:', jsonData.data.idempotency_key);",
                  "    }",
                  "}"
                ],
                "type": "text/javascript"
              }
            }
          ],
          "request": {
            "method": "POST",
            "header": [
              {
                "key": "Content-Type",
                "value": "application/json"
              },
              {
                "key": "Authorization",
                "value": "Bearer {{bearerToken}}"
              }
            ],
            "body": {
              "mode": "raw",
              "raw": "{\n  \"type\": \"GENERATE_BILLING\",\n  \"serviceNumber\": \"{{serviceNumber}}\"\n}"
            },
            "url": {
              "raw": "{{baseUrl}}/generate-idempotency-key",
              "host": [
                "{{baseUrl}}"
              ],
              "path": [
                "generate-idempotency-key"
              ]
            },
            "description": "Membuat single-use idempotency key (TTL 5 menit). Skrip pengujian otomatis menyimpan key ke variabel collection."
          },
          "response": []
        },
        {
          "name": "3. POST Request Billing (Valid Key)",
          "event": [
            {
              "listen": "test",
              "script": {
                "exec": [
                  "if (pm.response.code === 200) {",
                  "    var jsonData = pm.response.json();",
                  "    if (jsonData && jsonData.data) {",
                  "        var kb = jsonData.data.kode_billing || jsonData.data.kodeBilling || (jsonData.data.billing && jsonData.data.billing.kode_billing);",
                  "        if (kb) {",
                  "            pm.collectionVariables.set('kodeBilling', kb);",
                  "            console.log('Kode billing captured & set to collection variable:', kb);",
                  "        }",
                  "    }",
                  "}"
                ],
                "type": "text/javascript"
              }
            }
          ],
          "request": {
            "method": "POST",
            "header": [
              {
                "key": "Content-Type",
                "value": "application/json"
              },
              {
                "key": "Authorization",
                "value": "Bearer {{bearerToken}}"
              },
              {
                "key": "x-idempotency-key",
                "value": "{{idempotencyKey}}"
              }
            ],
            "body": {
              "mode": "raw",
              "raw": "{\n  \"serviceNumber\": \"{{serviceNumber}}\"\n}"
            },
            "url": {
              "raw": "{{baseUrl}}/request-billing",
              "host": [
                "{{baseUrl}}"
              ],
              "path": [
                "request-billing"
              ]
            },
            "description": "Eksekusi manual request billing dengan idempotency key valid. Menghasilkan kode billing dari Simponi dan otomatis menyimpan kode billing ke variabel collection."
          },
          "response": []
        }
      ]
    },
    {
      "name": "3. Negative Case - Validation & Authorization Errors",
      "item": [
        {
          "name": "1. GET Inquiry Billing - Missing Query serviceNumber",
          "request": {
            "method": "GET",
            "header": [
              {
                "key": "Authorization",
                "value": "Bearer {{bearerToken}}"
              }
            ],
            "url": {
              "raw": "{{baseUrl}}/inquiry-billing",
              "host": [
                "{{baseUrl}}"
              ],
              "path": [
                "inquiry-billing"
              ]
            },
            "description": "Uji validasi query parameter serviceNumber kosong. Ekspektasi: 400 Bad Request (Validation Failed)."
          },
          "response": []
        },
        {
          "name": "2. GET Inquiry Billing - Data Not Found",
          "request": {
            "method": "GET",
            "header": [
              {
                "key": "Authorization",
                "value": "Bearer {{bearerToken}}"
              }
            ],
            "url": {
              "raw": "{{baseUrl}}/inquiry-billing?serviceNumber={{invalidServiceNumber}}",
              "host": [
                "{{baseUrl}}"
              ],
              "path": [
                "inquiry-billing"
              ],
              "query": [
                {
                  "key": "serviceNumber",
                  "value": "{{invalidServiceNumber}}"
                }
              ]
            }
          },
          "response": []
        },
        {
          "name": "3. POST Generate Idempotency Key - Invalid Action Type",
          "request": {
            "method": "POST",
            "header": [
              {
                "key": "Content-Type",
                "value": "application/json"
              },
              {
                "key": "Authorization",
                "value": "Bearer {{bearerToken}}"
              }
            ],
            "body": {
              "mode": "raw",
              "raw": "{\n  \"type\": \"INVALID_ACTION_TYPE\",\n  \"serviceNumber\": \"{{serviceNumber}}\"\n}"
            },
            "url": {
              "raw": "{{baseUrl}}/generate-idempotency-key",
              "host": [
                "{{baseUrl}}"
              ],
              "path": [
                "generate-idempotency-key"
              ]
            },
            "description": "Uji pembentukan idempotency key dengan tipe aksi yang tidak diizinkan. Ekspektasi: 400 Bad Request."
          },
          "response": []
        },
        {
          "name": "4. POST Generate Idempotency Key - Missing Authorization Header",
          "request": {
            "method": "POST",
            "header": [
              {
                "key": "Content-Type",
                "value": "application/json"
              }
            ],
            "body": {
              "mode": "raw",
              "raw": "{\n  \"type\": \"GENERATE_BILLING\",\n  \"serviceNumber\": \"{{serviceNumber}}\"\n}"
            },
            "url": {
              "raw": "{{baseUrl}}/generate-idempotency-key",
              "host": [
                "{{baseUrl}}"
              ],
              "path": [
                "generate-idempotency-key"
              ]
            },
            "description": "Uji pembuatan idempotency key tanpa header Authorization. Ekspektasi: 401 Unauthorized / 400 Bad Request."
          },
          "response": []
        }
      ]
    },
    {
      "name": "4. Negative Case - Ineligibility & Business Logic Errors",
      "item": [
        {
          "name": "1. POST Request Billing - Duplicate Submission (Active Unexpired Billing)",
          "request": {
            "method": "POST",
            "header": [
              {
                "key": "Content-Type",
                "value": "application/json"
              },
              {
                "key": "Authorization",
                "value": "Bearer {{bearerToken}}"
              },
              {
                "key": "x-idempotency-key",
                "value": "00000000-0000-0000-0000-000000000000"
              }
            ],
            "body": {
              "mode": "raw",
              "raw": "{\n  \"serviceNumber\": \"{{serviceNumber}}\"\n}"
            },
            "url": {
              "raw": "{{baseUrl}}/request-billing",
              "host": [
                "{{baseUrl}}"
              ],
              "path": [
                "request-billing"
              ]
            },
            "description": "Uji request billing saat kode billing sudah aktif/diterbitkan. Ekspektasi: 400 Bad Request (Billing atas nomor aju ... belum kedaluwarsa atau masih berlaku)."
          },
          "response": []
        },
        {
          "name": "2. POST Request Billing - Service Number Ineligible",
          "request": {
            "method": "POST",
            "header": [
              {
                "key": "Content-Type",
                "value": "application/json"
              },
              {
                "key": "Authorization",
                "value": "Bearer {{bearerToken}}"
              },
              {
                "key": "x-idempotency-key",
                "value": "00000000-0000-0000-0000-000000000000"
              }
            ],
            "body": {
              "mode": "raw",
              "raw": "{\n  \"serviceNumber\": \"{{invalidServiceNumber}}\"\n}"
            },
            "url": {
              "raw": "{{baseUrl}}/request-billing",
              "host": [
                "{{baseUrl}}"
              ],
              "path": [
                "request-billing"
              ]
            },
            "description": "Uji request billing untuk nomor aju yang tidak memenuhi prasyarat LK3/Tagihan. Ekspektasi: 400 Bad Request."
          },
          "response": []
        }
      ]
    },
    {
      "name": "5. Negative Case - Idempotency & Security Boundary Errors",
      "item": [
        {
          "name": "1. POST Request Billing - Missing x-idempotency-key Header",
          "request": {
            "method": "POST",
            "header": [
              {
                "key": "Content-Type",
                "value": "application/json"
              },
              {
                "key": "Authorization",
                "value": "Bearer {{bearerToken}}"
              }
            ],
            "body": {
              "mode": "raw",
              "raw": "{\n  \"serviceNumber\": \"{{serviceNumber}}\"\n}"
            },
            "url": {
              "raw": "{{baseUrl}}/request-billing",
              "host": [
                "{{baseUrl}}"
              ],
              "path": [
                "request-billing"
              ]
            },
            "description": "Uji pengiriman request billing tanpa menyertakan header x-idempotency-key. Ekspektasi: 400 Bad Request (Header x-idempotency-key wajib disertakan)."
          },
          "response": []
        },
        {
          "name": "2. POST Request Billing - Fake / Non-Existent Idempotency Key",
          "request": {
            "method": "POST",
            "header": [
              {
                "key": "Content-Type",
                "value": "application/json"
              },
              {
                "key": "Authorization",
                "value": "Bearer {{bearerToken}}"
              },
              {
                "key": "x-idempotency-key",
                "value": "99999999-9999-9999-9999-999999999999"
              }
            ],
            "body": {
              "mode": "raw",
              "raw": "{\n  \"serviceNumber\": \"{{serviceNumber}}\"\n}"
            },
            "url": {
              "raw": "{{baseUrl}}/request-billing",
              "host": [
                "{{baseUrl}}"
              ],
              "path": [
                "request-billing"
              ]
            },
            "description": "Uji pengiriman request billing dengan idempotency key palsu/tidak terdaftar di Redis. Ekspektasi: 400 Bad Request (Idempotency key tidak valid atau sudah kedaluwarsa...)."
          },
          "response": []
        },
        {
          "name": "3. POST Request Billing - Service Number Payload Mismatch",
          "request": {
            "method": "POST",
            "header": [
              {
                "key": "Content-Type",
                "value": "application/json"
              },
              {
                "key": "Authorization",
                "value": "Bearer {{bearerToken}}"
              },
              {
                "key": "x-idempotency-key",
                "value": "{{idempotencyKey}}"
              }
            ],
            "body": {
              "mode": "raw",
              "raw": "{\n  \"serviceNumber\": \"1029999999999\"\n}"
            },
            "url": {
              "raw": "{{baseUrl}}/request-billing",
              "host": [
                "{{baseUrl}}"
              ],
              "path": [
                "request-billing"
              ]
            },
            "description": "Uji pengiriman request billing dimana serviceNumber di body tidak cocok dengan serviceNumber yang didaftarkan saat generate key. Ekspektasi: 400 Bad Request (Idempotency Key tidak valid!)."
          },
          "response": []
        },
        {
          "name": "4. POST Request Billing - Re-use / Replay Attack (Already Consumed Key)",
          "request": {
            "method": "POST",
            "header": [
              {
                "key": "Content-Type",
                "value": "application/json"
              },
              {
                "key": "Authorization",
                "value": "Bearer {{bearerToken}}"
              },
              {
                "key": "x-idempotency-key",
                "value": "{{idempotencyKey}}"
              }
            ],
            "body": {
              "mode": "raw",
              "raw": "{\n  \"serviceNumber\": \"{{serviceNumber}}\"\n}"
            },
            "url": {
              "raw": "{{baseUrl}}/request-billing",
              "host": [
                "{{baseUrl}}"
              ],
              "path": [
                "request-billing"
              ]
            },
            "description": "Menguji keamanan replay attack / double submission dengan mengulang request billing menggunakan key yang sudah terpakai. Ekspektasi: 400 Bad Request."
          },
          "response": []
        }
      ]
    }
  ]
}