Bridging Ketersediaan Kamar SIRS Online Dengan VB6

banner bridging ketersediaan kamar

 

Beberapa waktu lalu aku dikabari kepala instalasiku, sebut saja bosque biar kelihatan akrab gitu. "Ketersediaan kamar Siranap wes gak update otomatis, sek tak cek". Padahal kami sudah membuat web service untuk bridging Siranap. Setelah diusut ternyata entrian di Siranap sama dengan entrian di SIRS Online.

Aku langsung konfirm ke mas Dody Naftali. Di group telegram IT Jateng dan DIY++. Selain sebagai tetua, mas Dody adalah rujukan kami buat bertanya tentang segala bernama bridging simrs ke aplikasi kemkes. 

Ternyata sejak september 2020 aplikasi Siranap menggunakan entrian dari SIRS Online. Pantesan daftar ketersediaan bed di siranap kok nggak update perwaktu. Pantesan kemarin anak rekam medis nanyain bridging RS online, ternyata mereka disuruh update bed tiap hari wkwkwk.

Okey lets code 

Kalau kalian pernah membuat bridging Eklaim dan Vclaim, percayalah bridging ketersediaan bed SIMRS ke RS Online lebih mudah asal datanya sudah benar. 

Nah kan, yang sulit itu bukan bridgingnya, tapi collect datanya. Lalu memastikan datanya sudah benar sehingga laporan yang kita kirimkan sudah sesuai dengan keadaan sebenarnya.

Meski juknis bridging di RS Online sudah lengkap, tapi untuk bridging Ketersediaan kamar yang aku buat disini hanya untuk method update saja ya pren. Soalnya seperti yang sudah aku ceritain sebelumnya. Anak-anak rekam medis sudah memasukkan datanya setiap hari. Jadi aku tinggal meneruskan saja. 

Lebih mudah mana meneruskan atau membuat baru? sama saja sih. Tapi kita harus menghargai perjuangan mereka mengentry setiap hari. Hanya saja kendalanya kita harus membuat mapping nama ruangan, karena bisa jadi mereka waktu nulis nama ruangan nggak sesuai dengan nama ruangan yang ada di rumah sakit. Kalau memang seperti ini, solusinya paling gampang, hapus semua trus bikin data baru. Tapi lewat sirs/RS online saja. Tidak semua hal harus dibridgingkan kok.

Selain itu karena kebutuhan bridging disini lebih ke percepatan dan otomatisasi pengiriman data ketersediaan bed, Tambah ruangan/data kan nggak setiap hari dan hanya sekali waktu, nggak usah terlalu dipikirin. Meski membuat service ini juga nggak susah. Tapi kita fokus saja ke update data OK!

PERSIAPAN DATA

Ambil Data Ketersediaan kamar yang sudah dientry di RS ONLINE 

Sebelum membuat bridging dengan vb6, kita siapkan terlebih dahulu data apa saja yang akan kita kirim/update ke RS online. Untuk itu kita perlu mengambil data dari RS online. Kecuali kalau kamu mau bikin aplikasinya full service, user bisa tambah data baru dari aplikasi bridging. 

Untuk mengambil data, aku memakai php biar lebih mudah melihat data dan copy paste data.
perintahnya cukup simpel kok. kita bisa pakai perintah curl

<?php
date_default_timezone_set('Asia/Jakarta');
$Xrsid = ""; //koders
$Xpass = ""; //password sirs
$currentDate = time();
$now = new DateTime();
$unixTime = $now->getTimestamp();
$url = "http://sirs.kemkes.go.id/fo/index.php/Fasyankes";
$header = array('X-rs-id:'.$Xrsid, 'X-Timestamp:'.$unixTime, 'X-pass:'.$Xpass);
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_HTTPHEADER, $header);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
$output = curl_exec($ch);
curl_close($ch);
//print_r($output);
// die();
$data = json_decode($output);
$data = $data->fasyankes;
$i = 0;
echo "<html>";
echo "<head>";
echo '<link rel="stylesheet" href="https://stackpath.bootstrapcdn.com/bootstrap/4.3.1/css/bootstrap.min.css" integrity="sha384-ggOyR0iXCbMQv3Xipma34MD+dH/1fQ784/j6cY/iJTQUOhcWr7x9JvoRxT2MZw1T" crossorigin="anonymous">';
echo "</head>";
echo "<body>";
echo '<table class="table"><thead><tr><th>IdTT</th><th>TT</th><th>RUANG</th><th>KODE SIRANAP</th><th>JUMLAH RUANG</th><th>TERPAKAI</th><th>PREPARE</th><th>PREPARE PLAN</th><th>KOSONG</th><th>COVID</th><th>ID_TT</th></tr></thead><Tbody>';
foreach($data as $row){
echo '<TR>';
echo '<td>'.$row->id_tt.'</td>';
echo '<td>'.$row->tt.'</td>';
echo '<td>'.$row->ruang.'</td>';
echo '<td>'.$row->kode_siranap.'</td>';
echo '<td>'.$row->jumlah_ruang.'</td>';
echo '<td>'.$row->terpakai.'</td>';
echo '<td>'.$row->prepare.'</td>';
echo '<td>'.$row->prepare_plan.'</td>';
echo '<td>'.$row->kosong.'</td>';
echo '<td>'.$row->covid.'</td>';
echo '<td>'.$row->id_t_tt.'</td>';
echo '</tr>';
}
echo '</tbody></table>';
echo "</body></html>";

   
    
beri nama filenya sesuka kamu, trus jalankan saja.

hasilnya terlihat seperti dibawah ini:
daftar ketersediaan kamar yang sudah dikirim ke RS Online
Daftar Ketersediaan Kamar Yang Sudah Dikirim Ke RS Online

 

Setelah mendapatkan data dari RS Online, sekarang kita petakan data tersebut ke sistem SIMRS. Cara paling mudah adalah buat query yang hasilnya sama dengan data yang mau dikirim.

Parameter yang dikirim:

  • KdKelas SIRS
  • NamaKelas
  • Nama Ruangan
  • Jumlah ruang
  • terpakai
  • kosong
  • prepare
  • prepare plan
  • covid

For information, bridging RS Online digunakan untuk mengirim semua data ketersediaan bed, namun banyak rumah sakit yang hanya melakukan bridging Covid saja. Kalau dari aku sih mending dibuat semua sekalian wong sudah support untuk semua ruang. 

Karena aku menggunakan SQL Server, aku menggunakan view supaya querynya menjadi lebih ringkas. 

Aku membuat 5 view yang kemudian digabungkan menjadi satu sehingga mejadi kuat dan solid. 1 view juga terdiri dari beberapa query sesuai dengan kebutuhan. 

Contoh viewku seperti ini:

Banyak ya hehe, tapi lebih enak buat maintenance sih, soalnya sudah aku pisah sesuai sub kategorynya. Kalau ada masalah di salah satu kategory, nggak perlu pusing untuk mencari dan memperbaikinya.

Contoh tampilan hasil query view, aku  contohkan data covid dan beberapa data isolasi:



eh iya, ini bagian headernya

 

Setelah querynya jadi, sekarang tinggal bikin aplikasi buat kirim ke webapi sirs. Kodingnya gampang kok, kalau kamu pernah bikin koneksi vb6 ke vclaim, percayalah bridging Sirs Online ini lebih mudah.

Struktur rest api Ketersediaan Kamar RS Online

1. mengunakan unix time

2.  header

3. post/get


Sekarang saatnya membuat aplikasinya:

Tambahkan Komponen winhttp

Sebelum mulai ngoding, tepatnya setelah membuka form dan berdoa. tambahkan terlebih dahulu komponen winhttp di bagian reference. 

Caranya adalah: 

klik Project->reference

kemudian cari Microsoft WinHTTP Service, version 5.1



Setelah komponen winhttp dimasukkan, visual basic 6mu sudah siap untuk beraksi. yoo yoo

Buka form1, masukkan satu command button, beri nama cmdkirim misalnya.

kemudian buka kodenya. Tuliskan kode dibawah ini dibagian paling atas. 

 

Option Explicit
Private Type FILETIME
dwLowDateTime As Long
dwHighDateTime As Long
End Type
Private Type SYSTEMTIME
wYear As Integer
wMonth As Integer
wDayOfWeek As Integer
wDay As Integer
wHour As Integer
wMinute As Integer
wSecond As Integer
wMilliseconds As Integer
End Type
Private Declare Function FileTimeToLocalFileTime Lib "kernel32" (lpFileTime As FILETIME, lpLocalFileTime As FILETIME) As Long
Private Declare Function LocalFileTimeToFileTime Lib "kernel32" (lpLocalFileTime As FILETIME, lpFileTime As FILETIME) As Long
Private Declare Function FileTimeToSystemTime Lib "kernel32" (lpFileTime As FILETIME, lpSystemTime As SYSTEMTIME) As Long
Private Declare Function SystemTimeToFileTime Lib "kernel32" (lpSystemTime As SYSTEMTIME, lpFileTime As FILETIME) As Long
Dim Interval As Integer
Dim req As WinHttp.WinHttpRequest
Dim strSQL As String
Dim rs As ADODB.Recordset
Dim jml As Integer
Dim dbconn As ADODB.Connection
Dim strUser, strPassword As String
Dim hasil As String
Dim url As String
Dim NamaRuangan As String
Dim statcovid As String
Dim jmlruang As String
Dim statKirim As Boolean
Dim TotalKirim As Integer
Dim iPost As Integer

Nama-nama variable nya terserah kamu ya, sesuiakan saja dengan kebutuhanmu. 

Membuat Fungsi Untuk Menggenerate Unix Time

Saat ini banyak yang menggunakan unix time untuk timestamp, termasuk di RS online kita juga harus menggenerate unix time. Membuat unix time di bahasa pemrograman modern sangat mudah, PHP misalnya. Tapi tidak untuk visual basic 6. 

Setelah berlayar dilautan google dan mencari-cari, akhirnya aku dapatkan juga barisan puisi, eh barisan kode untuk menggenerate unix time di Visual Basic 6, berikut ini kodenya:
 

Private Function ConvertToTglUnix(tgl As Date) As String
ConvertToTglUnix = (tgl - DateSerial(1970, 1, 1)) * 86400
End Function
Private Function xtime(time As Date) As String
Dim the_date As Date
Dim system_time As SYSTEMTIME
Dim local_file_time As FILETIME
Dim utc_file_time As FILETIME
' Get the local time.
the_date = CDate(time)
' Convert it into a SYSTEMTIME.
DateToSystemTime the_date, system_time
' Convert it to a FILETIME.
SystemTimeToFileTime system_time, local_file_time
' Convert it to a UTC time.
LocalFileTimeToFileTime local_file_time, utc_file_time
' Convert it to a SYSTEMTIME.
FileTimeToSystemTime utc_file_time, system_time
' Convert it to a Date.
SystemTimeToDate system_time, the_date
' Display the result.
xtime = Format$(the_date)
End Function
' Convert a Date into a SYSTEMTIME.
Private Sub DateToSystemTime(ByVal the_date As Date, ByRef system_time As SYSTEMTIME)
With system_time
.wYear = Year(the_date)
.wMonth = Month(the_date)
.wDay = Day(the_date)
.wHour = Hour(the_date)
.wMinute = Minute(the_date)
.wSecond = Second(the_date)
End With
End Sub
'Convert a SYSTEMTIME into a Date.
Private Sub SystemTimeToDate(system_time As SYSTEMTIME, ByRef the_date As Date)
With system_time
'' The following doesn't work internationally.
'the_date = CDate( _
' Format$(.wMonth) & "/" & _
' Format$(.wDay) & "/" & _
' Format$(.wYear) & " " & _
' Format$(.wHour) & ":" & _
' Format$(.wMinute, "00") & ":" & _
' Format$(.wSecond, "00"))
' Thanks to Justin Starnes for the
' following internationalized version.
the_date = DateSerial(.wYear, .wMonth, .wDay) + _
TimeSerial(.wHour, .wMinute, .wSecond)
End With
End Sub
cuma buat konversi tanggal ke unix time saja sudah berbaris-baris gitu ya?  Berbeda dengan PHP, kamu bisa membuat konversi unix time hanya dalam 1 baris. Tapi visual basic 6 adalah jalan ninjaku menjadi programmer SIMRS, aku akan tetap menjalaninya dengan bahagia.

Sub Prosedure Kirim ke SIRS

Sekarang saatnya membuat modul untuk kirim ketersediaan kamar RS online. Kodingannya seperti berikut ini:
Private Function kirimSirs(id_tt, NamaRuangan, jumlahruang, jmlkamar, terpakai, prepare, prepareplan, covid As String) As Boolean
On Error GoTo ErrorNda
Dim unixtime As String
Dim url As String
Dim xUserrs As String
Dim xPassrs As String
Dim tPost As String
Dim req As WinHttp.WinHttpRequest
Dim hasil As String
unixtime = ConvertToTglUnix(xtime(Now))
url = "http://sirs.kemkes.go.id/fo/index.php/Fasyankes"
xUserrs = "" 'Username SIRS
xPassrs = "" 'Password SIRS
'tPost = "id_tt=" & id_tt & "&ruang=" & NamaRuangan & "&jumlah_ruang=" & jumlahruang & "&jumlah=" & jmlkamar & "&terpakai=" & terpakai & "&prepare=" & prepare & "&prepare_plan=" & prepareplan & "&covid=" & covid
tPost = "{$$id_tt$$:$$" & id_tt & "$$,$$ruang$$:$$" & NamaRuangan & "$$,$$jumlah_ruang$$:$$" & jumlahruang & "$$,$$jumlah$$:$$" & jmlkamar & "$$,$$terpakai$$:$$" & terpakai & "$$,$$prepare$$:$$" & prepare & "$$,$$prepare_plan$$:$$" & prepareplan & "$$,$$covid$$:$$" & covid & "$$}"
tPost = Replace(tPost, "$$", """")
Set req = New WinHttp.WinHttpRequest
req.Open "PUT", url
req.SetRequestHeader "X-rs-id", xUserrs
req.SetRequestHeader "X-Timestamp", unixtime
req.SetRequestHeader "X-pass", xPassrs
req.SetRequestHeader "Content-Type", "application/json"
req.Send tPost
hasil = req.ResponseText
If hasil = "" Then
kirimSirs = False
Else
kirimSirs = True
txtresult.Text = txtresult.Text & vbNewLine & Now() & " " & hasil
End If
Exit Function
ErrorNda:
kirimSirs = False
Exit Function
End Function


kunci dari kodingan diatas adalah di winhttp. winhttp adalah komponen dari visual basic 6 yang digunakan untuk melakukan http request. Seperti yang aku, kamu dan kalian tahu. Rest Service adalah teknik pertukaran data dengan memanfaatkan http verb baik itu get, post, put maupun delete. Semua fungsi itu bisa dilakukan dengan winhttp. Kalau untuk koneksi ke winhttp, visual basic 6 lebih mudah. Tapi tidak untuk json-nya. Butuh sedikit trik untuk mengolah Json. Tapi kalau untuk pengiriman json, biasanya aku akalin tuh kode,  tanda petik 2 atau double quote aku ganti dengan karakter yang jarang dipakai. Setelah itu aku replace dengan double quote pakai perintah replace. 

Selain dengan replace karakter, bisa juga dengan keyascii double quotes. Koding is tentang bagaimana memperoleh hasil yang diinginkan. Apapun caranya minumnya tetap teh botol sosro, eh malah ngiklan.

Isi Kodingan Tombol Kirim

Sekarang tinggal bikin kodingan di tombol kirimnya. Seperti yang aku jelasin diatas sekali, data ketersediaan kamar diambil dari query yang dibuat sedemikian rupa hingga tidak membutuhkan data logic lainnya. kalaupun butuh logic jangan banyak-banyak dan susah-susah. Query punyaku juga masih disesuaikan lagi sih, soalnya nama kamar yang dikirim sama anak-anak RM berbeda dengan master ruangan SIMRS, kemudian status covid, menghilangkan namaruangan juga aku buat logicnya di vb6 sih, pokoknya kalau ribet diquerym baru Visual Basic 6 beraksi.

Private Sub cmdKirim_Click()
On Error Resume Next
TotalKirim = 0
iPost = 0
txtresult.Text = ""
Call openConnection(dbconn)
strSQL = "select * from V_KetersediaanKamarSIRSNew2020 order by KelasSIRS"
Call msubRecFO(rs, strSQL, dbconn)
statcovid = "0"
jmlruang = "0"
TotalKirim = rs.RecordCount
rs.MoveFirst
For i = 1 To rs.RecordCount
statKirim = False
Do While statKirim = False
statKirim = kirimSirs(rs.Fields("KelasSIRS").Value, rs.Fields("NamaRuangan").Value, rs.Fields("jmlruang").Value, rs.Fields("jmlkamar").Value, rs.Fields("terpakai").Value, rs.Fields("prepare").Value, rs.Fields("prepare_plan").Value, rs.Fields("covid").Value)
Loop
iPost = iPost + 1
If i = rs.RecordCount Then
rs.MoveNext
Else
Exit For
End If
Next i
Exit Sub
End Sub

TESTING

Sekarang tinggal testing saja nih, eh iya tadi aku lupa menambahkan textbox buat ngambil parameter kiriman, aku pribadi lebih suka ngetest sambil debug sih. Terserah kalian deh mau ngetes pakai cara apa.

SHOW CASE

Terus terang pas bikin kodingan ini aku copy paste beberapa potongan dari kodinganku yang sudah diimplementasikan. Tampilannya seperti dibawah ini:

 

tertarik membuat bridging ketersediaan kamar? cuzz langsung saja dibikin. Feel free to ask, kalau  ingin menyampaikan terima kasih silahkan tuliskan di kolom komentar. Tapi kalau mau bertanya atau ada kendala lebih baik lewat japri. Insyaallah kalau cuma bertanya, konsultasi atau tracing error gratis kok.

Terima kasih sudah mampir

 

 

 

 

 


19 comments for "Bridging Ketersediaan Kamar SIRS Online Dengan VB6"

  1. Replies
    1. Memang nggak ada, tinggal dikopas atau ditulis ulang kodenya. Insyaallah lebih bermanfaat dari pada langsung download

      Delete
  2. Terima kasih kang,
    tetapi ane terdapat error pada baris 24
    $dbconn = getKoneksi();
    pada file getEntrianrs.php

    ReplyDelete
    Replies
    1. diilangin saja mas, kodenya nggak kepakai kok. Nanti habis jumatan tak edit

      Delete
  3. mas martin.. permisi, sya mau bertanya ...
    untuk dokumentasi bridging resmi (rsonline) yang paling update itu dimana yah? soalnya saya programmer baru yang ketinggalan info hehe. digoogle banyak dokumentasi bridging rsonline, tetapi yang paling bisa ya di post ini. di google x-pass nya ad yang di encrypt md5, ada juga yang x-timestampnya ada yang dikurangi 10 menit, tapi malah yg bisa disini.

    ReplyDelete
    Replies
    1. dokumentasi ada di rsonline mas, login saja di rs online di menu kiri bawah. sekarang sudah tidak pakai encrypt md5

      Delete
  4. mas, untuk yg vclaim v.2 kan ada tambahan user key lagi. bagaimana codingnya ya ?

    ReplyDelete
    Replies
    1. sama saja mas, cuma beda diheader ditambahi userkey

      Delete

Post a Comment