Files
cpone_midleware/README.md

7.3 KiB

CPONE Middleware Go

Service Go untuk endpoint:

GET /api/cpone/paket
GET /api/cpone/paket/{id}
Authorization: Bearer <your-secure-token>

GET /api/cpone/layanan?page=1
Authorization: Bearer <your-secure-token>
X-RS-Code: <kode-rs>

GET /api/cpone/perusahaan?search=&page=1
GET /api/cpone/perusahaan/{id}
GET /api/cpone/perusahaan/{id}/group-tarif?group_tarif_id=
Authorization: Bearer <your-secure-token>
X-RS-Code: <kode-rs>

GET /api/cpone/doctors?search=&DokterID_in=&page=1&per_page=15
GET /api/doctors?search=&DokterID_in=&page=1&per_page=15
Authorization: Bearer <your-secure-token>
X-RS-Code: <kode-rs>

Endpoint ini menampilkan daftar dokter aktif dari HIS. Parameter `search` hanya
mencari berdasarkan nama dokter atau kode dokter (`DokterID`).

GET /api/cpone/tarif-kerjasama?search=&perusahaan_id=&tarif_id=&page=1&per_page=15
Authorization: Bearer <your-secure-token>

GET /api/cpone/tarif-kerjasama/{id}?group_tarif_id=&active=N&effective_date=2026-08-22
Authorization: Bearer <your-secure-token>

GET /api/cpone/periode-tarif
Authorization: Bearer <your-secure-token>
X-RS-Code: <kode-rs>

Endpoint ini menampilkan seluruh periode tarif dari HIS dengan `NA = 'N'`.

GET /api/cpone/periode-tarif/{PeriodeTarifID}?search=&page=1
Authorization: Bearer <your-secure-token>
X-RS-Code: <kode-rs>

Endpoint ini mengambil detail seluruh tarif layanan dari tabel dinamis
`harga_layanan_{PeriodeTarifID}` beserta layanan, departemen, dan kelas tarif.
Parameter `search` mencari berdasarkan `LayananID` atau `NamaLayanan`; hasil
dipaginasi 20 data per halaman.

GET /api/cpone/layanan-mapping-harga?periodeTarifID=10&layananID=6413,6414,1309
Authorization: Bearer <your-secure-token>

POST /api/cpone/patients/lab-registration
Authorization: Bearer <your-secure-token>
Content-Type: application/json

POST /api/cpone/patients/lab-registration/{regId}/services
Authorization: Bearer <your-secure-token>
Content-Type: application/json

POST /api/cpone/patients/lab-registration/{regId}/packages
Authorization: Bearer <your-secure-token>
Content-Type: application/json

POST /api/cpone/patients/medrec
Authorization: Bearer <your-secure-token>
Content-Type: application/json

Format payload dan response dibuat mengikuti controller PHP CPONE terkait.

Contoh payload pembuatan pasien HIS:

{
  "nama": "BUDI SANTOS",
  "jenis_kelamin": "L",
  "tgl_lahir": "1990-01-15",
  "jenis_nomer_sosial": "KTP",
  "nomer_sosial": "3174011501900001",
  "telepon": "081234567890",
  "ponsel": "081234567890",
  "email": "budi@example.com",
  "tempat_lahir": "JAKARTA",
  "alamat": "JL. CONTOH NO. 1",
  "propinsi": "DKI JAKARTA",
  "kabupaten": "JAKARTA",
  "kecamatan": "KECAMATAN CONTOH",
  "kelurahan": "KELURAHAN CONTOH",
  "kode_pos": "12345",
  "perusahaan_id": "PE260700001",
  "nik_karyawan": "TSB2026002",
  "dependant_id": "D001",
  "nama_karyawan": "BUDI SANTOS",
  "channel": "CPONE"
}

Endpoint mengembalikan created, already_exists, atau possible_duplicate sesuai hasil pemeriksaan identitas dan kemiripan data pasien di HIS.

Registrasi pasien umum/MCU menggunakan endpoint berikut. Jika medrec_id belum diisi dan pasien tidak ditemukan, caller dapat membuat pasien melalui endpoint medrec lalu mengulangi request registrasi. departemen_id dapat dikosongkan; middleware akan memakai CPONE_DEPARTEMEN_ID dari .env.

POST /api/cpone/patients/registration
Authorization: Bearer <your-secure-token>
X-RS-Code: <kode-rs>
Content-Type: application/json
{
  "medrec_id": "00001234",
  "nik": "317xxxxxxxxxxxx",
  "tgl_lahir": "1988-03-03",
  "tanggal": "2026-09-07",
  "dokter_id": "D260900003",
  "jenis_pasien_id": "1",
  "jenis_reg_id": 2,
  "periode_tarif_id": "10",
  "perusahaan_id": "",
  "asuransi_id": "",
  "group_tarif_id": "0",
  "nomer_polis": "",
  "kelas_id": "Default",
  "channel": "CPONE"
}

Endpoint ini idempoten untuk pasien, tanggal, departemen, dan dokter yang sama; registrasi aktif yang sudah ada dikembalikan dengan status already_registered_visit.

Contoh payload registrasi laboratorium:

{
  "medrec_id": "00001234",
  "tanggal": "2026-08-18",
  "departemen_id": "LAB",
  "dokter_id": "DR01",
  "dokter_pengirim_id": "DR02",
  "perujuk": null,
  "jenis_pasien_id": "0",
  "periode_tarif_id": 10,
  "kelas_id": "Default",
  "shift_harian_id": null,
  "diagnosa_kerja": "Pemeriksaan laboratorium",
  "catatan": null,
  "channel": "CPONE"
}

dokter_pengirim_id atau perujuk wajib diisi. Endpoint ini membuat registrasi laboratorium tanpa layanan, sama seperti PatientController::registerLab; layanan ditambahkan melalui endpoint terpisah.

Contoh payload penambahan layanan:

{
  "layanan": [
    {
      "layanan_id": "6413",
      "jumlah": 1,
      "cito": false,
      "markup_cito": 0,
      "catatan": null
    }
  ],
  "channel": "CPONE"
}

Harga, diskon publik, share, unit cost, layanan multiple, dan spesimen diambil langsung dari master HIS. Layanan yang sudah ada akan dilewati dan dilaporkan melalui skipped_layanan_ids.

Contoh payload penambahan Paket Dispenser HIS:

{
  "paket_id": "DISP-260800011",
  "cito": false,
  "markup_cito": 0,
  "catatan": "",
  "channel": "CPONE"
}

Paket harus aktif, disetujui, berlaku untuk rawat jalan, dan belum memiliki layanan yang sama pada registrasi. Request ulang untuk paket yang sudah masuk bersifat idempoten dan tidak membuat transaksi ganda.

Config

Setiap instalasi CPONE hanya terhubung ke satu database HIS. Copy .env.example menjadi .env, lalu isi kode instance dan koneksi MySQL HIS:

APP_HOST=0.0.0.0
APP_PORT=8080
CPONE_RS_CODE=AWALBROS_DEV
CPONE_DEPARTEMEN_ID=08_01
CPONE_DB_HOST=127.0.0.1
CPONE_DB_PORT=3306
CPONE_DB_DATABASE=nama_database_his
CPONE_DB_USERNAME=cpone
CPONE_DB_PASSWORD=
CPONE_BEARER_TOKEN=replace-with-a-secure-token

CPONE_DB_* adalah koneksi database HIS, bukan database management CPONE. Password hanya dibaca dari .env; aplikasi tidak menyimpan kredensial database ke database lain.

CPONE_DEPARTEMEN_ID adalah DepartemenID HIS yang digunakan untuk registrasi laboratorium. Nilai ini diambil dari konfigurasi, sehingga tidak perlu dikirim di payload endpoint registrasi.

Semua endpoint bisnis tetap membutuhkan header:

X-RS-Code: PRIMAYA_BEKASI_BARAT

Sebagai alternatif dapat memakai query ?kode_rs=AWALBROS_DEV. Header memiliki prioritas lebih tinggi daripada query. Kode tersebut hanya divalidasi terhadap CPONE_RS_CODE; kode tidak digunakan untuk memilih database.

Request tanpa kode mengembalikan 422, sedangkan kode untuk instance rumah sakit lain mengembalikan 403. Response sukses tetap mengembalikan header X-RS-Code.

Payload POST /api/cpone/patients/medrec tidak lagi membutuhkan field rs. Nilai KodeRS untuk kebutuhan internal HIS diisi dari CPONE_RS_CODE.

Run

cd cpone-middleware
go mod tidy
go run ./cmd/server

SQLC

File sqlc.yaml, sqlc/schema.sql, dan sqlc/query.sql sudah disiapkan.

Catatan penting: sqlc tidak bisa menerima nama tabel dinamis seperti harga_layanan_{periodeTarifID}. Implementasi runtime saat ini tetap memakai database/sql untuk menyusun nama tabel setelah periodeTarifID divalidasi angka, sama seperti PHP memakai HargaLayanan::makeTableName(). Kalau semua periode ingin digenerate oleh sqlc, buat query konkret per tabel periode, misalnya harga_layanan_10, harga_layanan_11, dan seterusnya.