Baca Juga : Perbedaan Web Application dan Website, Emang Beda?
Apa itu eclaim?
Eclaim merupakan sebuah aplikasi yang dikeluarkan oleh kementrian kesehatan yang berguna rumah sakit untuk mengajukan claim pasien ke bpjs. Aplikasi ini menghasilkan kode bedasarkan diagnosa penyakit dan tindakan yang diberikan kepada pasien. Guna meningkatkan efektivitas pelayanan claim pasien, INACBG juga menyediakan fasilitas bridging data. Bridging data data INACBG ini tidak begitu rumit, hal pertama yang harus dilakukan yaitu men-generate enkripsi key yang terdapat didalam aplikasi
//mssql server connection
$serverName = "192.000.0.0\DEV";
$database = " ";
$uid = ' ';
$pwd = ' ';
$connectionInfo = array("UID" => $uid, "PWD" => $pwd, "Database" => $database);
$conn = sqlsrv_connect($serverName, $connectionInfo);
Setelah berhasil men-generate enkripsi key anda dapat langsung membuat source code untuk melakukan koneksi dengan INACBG. Koneksi dengan INACBG menggunakan consid, secretkey yang diberikan khusus dari bpjs dan link server aplikasi INACBG. Tidak lupa saya juga membuat koneksi dengan database aplikasi SIMRS.
Dari SIMRS saya akan mengirimkan data ke webservice INACBG saya akan menggunakan method POST untuk mengirim data claim pasien, untuk mengirim data claim webservice INACBG hanya memberikan bridging dengan service POST SEP pasien . Maka dari itu hal pertama saya harus membuat query untuk mendapatkan data pasien berupa nomor sep, nomor bpjs, tgl_masuk, tgl_pulang, jenis_rawat, kelas_rawat, indicator icu, lama rawat icu, jam pemakaian ventilator, indicator naik kelas/tidak, tarif rumah sakit yang meliputi prosedur non bedah, prosedur bedah, konsultasi, tenaga ahli, keperawatan, penunjnag, radiologi, laboratorium, pelayanan_darah, rehabilitasi, kamar, rawat_intensif, obat, obat kronis, obat kemo, alkes, bmhp, sewa alat, tarif poli eksekutif, nama dokter dpjp, id penjamin, nama penjamin.
$ws=sqlsrv_query($conn,"SELECT BillingPenjaminHeader.NoBilling, PersonsInPartners.MedicalRecordNumber, Pasien.Nama, Pasien.DateofBirth, Pasien.Gender, BillingPenjaminHeader.NoMember1 AS NoBPJS, BillingPenjaminHeader.NoSEP, BillingPenjaminHeader.TanggalMasuk, BillingPenjaminHeader.TanggalKeluar, BillingPenjaminHeader.TipePerawatanKey, dbo.PersonsInInsurance.KelasBPJS, CASE WHEN SisPilihan.Nama = 'Dipulangkan' THEN '1' WHEN SisPilihan.Nama = 'Dirawat inap' THEN '2' WHEN SisPilihan.Nama = 'Dirujuk ke rawat jalan tingkat lanjut' THEN '2' WHEN SisPilihan.Nama= 'Dirujuk ke RS lain' THEN '2' WHEN SisPilihan.Nama = 'Pulang atas permintaan sendiri' THEN '3' WHEN SisPilihan.Nama = 'Datang sudah meninggal' THEN '4' WHEN SisPilihan.Nama = 'Lain-lain' THEN '5' WHEN SisPilihan.Nama = 'Meninggal' THEN '4' ELSE '0' END AS CaraPulang, Dokter.Nama AS Dokter, SUM(CASE WHEN dbo.ItemMaster.NamaItem LIKE '%ICU' AND dbo.ItemMaster.KodeItem LIKE 'C%' THEN dbo.BillingPenjaminDetail.Jumlah ELSE 0 END) AS ICU, SUM(CASE WHEN dbo.ItemMaster.NamaItem LIKE 'VENTILATOR%' THEN dbo.BillingPenjaminDetail.Jumlah ELSE 0 END) AS VENTILATOR
FROM dbo.Person AS Dokter RIGHT OUTER JOIN dbo.BillingPenjaminDetail LEFT OUTER JOIN dbo.ItemMaster ON dbo.BillingPenjaminDetail.KodeItem = dbo.ItemMaster.KodeItem RIGHT OUTER JOIN dbo.BillingPenjaminHeader AS BillingPenjaminHeader INNER JOIN dbo.BillingPenjaminSubHeader ON BillingPenjaminHeader.NoBilling = dbo.BillingPenjaminSubHeader.NoBilling LEFT OUTER JOIN dbo.PersonsInPartners AS PersonsInPartners INNER JOIN dbo.Person AS Pasien ON PersonsInPartners.PersonKey = Pasien.PersonKey INNER JOIN dbo.PersonsInInsurance ON Pasien.PersonKey = dbo.PersonsInInsurance.PersonKey ON BillingPenjaminHeader.PersonKeyPatient = Pasien.PersonKey ON dbo.BillingPenjaminDetail.NoReferensi = dbo.BillingPenjaminSubHeader.NoReferensi ON Dokter.PersonKey = BillingPenjaminHeader.DokterKey LEFT OUTER JOIN dbo.SisPilihan AS SisPilihan ON BillingPenjaminHeader.IdAlasanKeluar = SisPilihan.rNo
GROUP BY BillingPenjaminHeader.NoBilling, PersonsInPartners.MedicalRecordNumber, Pasien.Nama, Pasien.DateofBirth, Pasien.Gender, BillingPenjaminHeader.NoMember1, BillingPenjaminHeader.NoSEP, BillingPenjaminHeader.TanggalMasuk, BillingPenjaminHeader.TanggalKeluar, BillingPenjaminHeader.TipePerawatanKey, BillingPenjaminHeader.KelasHarga, SisPilihan.Nama, BillingPenjaminHeader.PartnerKeyInsurance, Dokter.Nama, dbo.PersonsInInsurance.KelasBPJS,BillingPenjaminHeader.TotalTagihan
HAVING (BillingPenjaminHeader.PartnerKeyInsurance = 244) AND (BillingPenjaminHeader.TanggalMasuk >= CONVERT(varchar, getdate(), 102)) AND (BillingPenjaminHeader.TotalTagihan > 0) ORDER By BillingPenjaminHeader.NoSEP ASC");
Query untuk mendapat data pasien berupa nomor_sep, nomor bpjs, tgl masuk, tgl keluar, tipe perawatan, kelas bpjs, indicator icu, lama pemakaian ventilator, dokter dpjp, nama pasien, tanggal lahir, cara pulang saya menggunakan query sebagai berikut:
if(is_null($data['TanggalKeluar'])){
$tgl_keluar =$data['TanggalMasuk']->format('Y-m-d H:i:s');
}else{
$tgl_keluar = $data['TanggalKeluar']->format('Y-m-d H:i:s');
}
if(is_null($data['DateofBirth'])){
$tgl_lahir = ".date('Y-m-d H:i:s').";
}else{
$tgl_lahir = $data['DateofBirth']->format('Y-m-d H:i:s');
}
Untuk pasien rawat jalan, tanggal keluar tidak terisi di dalam database maka dibuat source code untuk mengirim tanggal keluar agar tidak kosong. Berikut source code untuk tanggal keluar.
if($gender == "L"){
$Jenkel='1';
}else{
$Jenkel='2';
}
Begitu juga dengan jenis kelamin, karena di simr jenis kelamin berisi L atau P tapi di webservice jenis kelamin berisi 1 atau 2. Maka, membuat mapping jenis kelamin, berikut source codenya. :
//mssql query pnb
$tsql = "SELECT SUM(BillingPenjaminDetail.Harga) AS pnb
FROM dbo.BillingPenjaminHeader AS BillingPenjaminHeader INNER JOIN dbo.BillingPenjaminSubHeader AS BillingPenjaminSubHeader ON BillingPenjaminHeader.NoBilling = BillingPenjaminSubHeader.NoBilling INNER JOIN dbo.BillingPenjaminDetail AS BillingPenjaminDetail ON BillingPenjaminSubHeader.NoReferensi = BillingPenjaminDetail.NoReferensi INNER JOIN dbo.ItemMaster AS ItemMaster ON BillingPenjaminDetail.KodeItem = ItemMaster.KodeItem
WHERE (BillingPenjaminHeader.NoSEP = '$nosep') AND (ItemMaster.NamaItem NOT LIKE '%KONSUL%' AND ItemMaster.NamaItem NOT LIKE '%VISITE%' AND ItemMaster.NamaItem NOT LIKE '%PENGAWAS%') AND (ItemMaster.KodeItem LIKE 'D%' OR ItemMaster.KodeItem LIKE 'I%' OR ItemMaster.KodeItem LIKE 'K%' OR ItemMaster.KodeItem LIKE 'U%') ";
$stmt = sqlsrv_query($conn, $tsql);
$pnb = sqlsrv_fetch_array($stmt);
$procedure_non_bedah=$pnb["pnb"];
Untuk tarif rumah sakit, juga di buat mappingan tagihan karena data yang ada di dalam database SIMRS ada beberapa perbedaan. Berikut beberapa contoh mappingan data tagihan rumah sakit yang akan di post ke webservice INACBG
a. Mapping data prosedur non bedah
b. Mapping data obat
//mssql query obat
$tsql = "SELECT SUM(BillingPenjaminDetail.totalhargadijamin) AS obat
FROM dbo.BillingPenjaminHeader AS BillingPenjaminHeader INNER JOIN dbo.BillingPenjaminSubHeader AS BillingPenjaminSubHeader ON BillingPenjaminHeader.NoBilling = BillingPenjaminSubHeader.NoBilling INNER JOIN dbo.BillingPenjaminDetail AS BillingPenjaminDetail ON BillingPenjaminSubHeader.NoReferensi = BillingPenjaminDetail.NoReferensi INNER JOIN dbo.ItemMaster AS ItemMaster ON BillingPenjaminDetail.KodeItem = ItemMaster.KodeItem
WHERE (BillingPenjaminHeader.NoSEP = '$nosep') AND (ItemMaster.KodeItem LIKE 'F0101%' OR
ItemMaster.KodeItem LIKE 'F0102%' OR
ItemMaster.KodeItem LIKE 'F0104%' OR
ItemMaster.KodeItem LIKE 'F0199%' OR
ItemMaster.KodeItem LIKE 'F02%' OR
ItemMaster.KodeItem LIKE 'Q%') AND (ItemMaster.KodeItem NOT IN ('F01010088', 'F01010089', 'F01010090', 'F01010240', 'F01010281', 'F01010283', 'F01010289', 'F01010398', 'F01010401',
'F01010402', 'F01020216', 'F01020599','F01030081', 'F01020600', 'F01020601', 'F01020621', 'F01020622', 'F01020695', 'F01020696', 'F01020697', 'F01021829', 'F01021866', 'F01021946',
'F01021947', 'F01021948', 'F01022010', 'F01022140','F01020232' , 'F01021177' , 'F01021947' , 'F0103%' , 'F03010005' , 'F03010535' , 'F03010606'))";
$stmt = sqlsrv_query($conn, $tsql);
$obt = sqlsrv_fetch_array($stmt);
$obat=$obt["obat"];
Jika seluruh query data telah dibuat, maka saya lanjut ke modul webservice INACBG, saya mulai dengan registrasi data pasien yang belum terdaftar dalam aplikasi inacbg
//registrasi pasien jika belum terdaftar
$json_request = <<<EOT
{
"metadata": {
"method": "new_claim"
},
"data": {
"nomor_kartu": "$nobpjs",
"nomor_sep":"$nosep",
"nomor_rm":"$norm",
"nama_pasien":"$nama_pasien",
"tgl_lahir":"$tgl_lahir",
"gender":"$Jenkel"
}
}
EOT;
// membuat json juga dapat menggunakan json_encode:
$ws_query["metadata"]["method"] = "new_claim";
$ws_query["data"]["nomor_kartu"] = "$nobpjs";
$ws_query["data"]["nomor_sep"] = "$nosep";
$ws_query["data"]["nomor_rm"] = "$norm";
$ws_query["data"]["nama_pasien"] = "$nama_pasien";
$ws_query["data"]["tgl_lahir"] = "$tgl_lahir";
$ws_query["data"]["gender"] = "$Jenkel";
$json_request = json_encode($ws_query);
// data yang akan dikirimkan dengan method POST adalah encrypted:
$payload = inacbg_encrypt($json_request,$key);
// tentukan Content-Type pada http header
$header = array("Content-Type: application/x-www-form-urlencoded");
// url server aplikasi E-Klaim,
$url = "http://192.000.0.00/E-Klaim/ws.php?/new_claim";
// setup curl
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_HTTPHEADER,$header);
curl_setopt($ch, CURLOPT_TIMEOUT, 3);
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
curl_setopt($ch, CURLOPT_HEADER, 0);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_POST, 1);
curl_setopt($ch, CURLOPT_POSTFIELDS, $payload);
$response = curl_exec($ch);
// terlebih dahulu hilangkan "----BEGIN ENCRYPTED DATA----\r\n"
// dan hilangkan "----END ENCRYPTED DATA----\r\n" dari response
$first = strpos($response, "\n")+1;
$last = strrpos($response, "\n")-1;
$response = substr($response, $first,strlen($response) - $first - $last);
$first,
strlen($response) - $first - $last);
// decrypt dengan fungsi inacbg_decrypt
$response = inacbg_decrypt($response,$key);
// hasil decrypt adalah format json, ditranslate kedalam array
$msg = json_decode($response,true);
//print_r($err);
print_r($response);
// close cURL resource, and free up system resources
curl_close($ch);
// decrypt dengan fungsi inacbg_decrypt
$response = inacbg_decrypt($response,$key);
// hasil decrypt adalah format json, ditranslate kedalam array
$msg = json_decode($response,true);
//print_r($err);
print_r($response);
// close cURL resource, and free up system resources
curl_close($ch);
//json query
$json_request = <<<EOT
{
"metadata": {
"method": "set_claim_data",
"nomor_sep":"$nosep"
},
"data": {
"nomor_sep":"$nosep",
"nomor_kartu": "$nobpjs",
"tgl_masuk":"$tgl_masuk",
"tgl_pulang":"$tgl_keluar",
"jenis_rawat":"$jenisRawat",
"kelas_rawat":"$kelas_perawatan",
"icu_los":"$indikator_icu",
"ventilator_hour":"$jam_ventilator",
"tarif_rs":{
"prosedur_non_bedah":"$procedure_non_bedah",
"prosedur_bedah":"$procedure_bedah",
"konsultasi":"$konsultasi",
"tenaga_ahli":"0",
"keperawatan":"$keperawatan",
"penunjang":"$penunjang",
"radiologi":"$radiologi",
"laboratorium":"$laboratorium",
"pelayanan_darah":"$pelayanan_darah",
"rehabilitasi":"$rehabilitasi",
"kamar":"$kamar",
"rawat_intensif":"$rawat_intensif",
"obat":"$obat",
"obat_kronis":"$obat_kronis",
"obat_kemoterapi":"$obat_kemotherapi",
"alkes":"$alkes",
"bmhp":"$bmhp",
"sewa_alat":"$sewa_alat" },
Jika di sudah dilanjutkan dengan post data nomor sep pasien untuk memasukkan claim ke aplikasi INACBG.
"nama_dokter":"$dokter_dpjp",
"kode_tarif":"CS",
"payor_id":"3",
"payor_cd":"JKN",
"coder_nik":"xxxxxxx"
}
}
EOT;
// data yang akan dikirimkan dengan method POST adalah encrypted:
$payload = inacbg_encrypt($json_request,$key);
// tentukan Content-Type pada http header
$header = array("Content-Type: application/x-www-form-urlencoded");
// url server aplikasi E-Klaim,
// silakan disesuaikan instalasi masing-masing
$url = "http://192.000.0.00/E-Klaim/ws.php?/set_claim_data";
// setup curl
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_HTTPHEADER,$header);
curl_setopt($ch, CURLOPT_TIMEOUT, 3);
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
curl_setopt($ch, CURLOPT_HEADER, 0);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_POST, 1);
curl_setopt($ch, CURLOPT_POSTFIELDS, $payload);
$response = curl_exec($ch);
// terlebih dahulu hilangkan "----BEGIN ENCRYPTED DATA----\r\n"
// dan hilangkan "----END ENCRYPTED DATA----\r\n" dari response
$first = strpos($response, "\n")+1;
$last = strrpos($response, "\n")-1;
$response = substr($response,
$first,
strlen($response) - $first - $last);
// decrypt dengan fungsi inacbg_decrypt
$response = inacbg_decrypt($response,$key);
// hasil decrypt adalah format json, ditranslate kedalam array
$msg = json_decode($response,true);
//print_r($err);
print_r($response);
// close cURL resource, and free up system resources
curl_close($ch);
Berikut contoh respon json data yang berhasil terkirim dilihat menggunakan aplikasi json viewer (http://jsonviewer.stack.hu/)
{"metadata":{"code":200,"message":"Ok"},"response":{"patient_id":"xxx","admission_id":xx,"hospital_admission_id":xxx\}\}" }}