diff --git a/htdocs/app/Http/Controllers/DokterController.php b/htdocs/app/Http/Controllers/DokterController.php index 65cdc75e..8ec53320 100644 --- a/htdocs/app/Http/Controllers/DokterController.php +++ b/htdocs/app/Http/Controllers/DokterController.php @@ -10,7 +10,7 @@ use Illuminate\Support\Facades\Http; use Illuminate\Support\Facades\Log; use Illuminate\Support\Facades\Storage; -use App\Poli; +use App\Poli; use App\Periksa; use App\DataListiner; use App\Dokter; @@ -37,17 +37,6 @@ use App\CriticalValueSample; use App\Paslab; use App\SIMBHPReport; use Carbon\Carbon; -use Aranyasen\HL7\Message; -use Aranyasen\HL7\Connection; -use Aranyasen\HL7\Segment; -use Aranyasen\HL7\Segments\MSH; -use Aranyasen\HL7\Segments\PV1; -use Aranyasen\HL7\Segments\OBR; -use Aranyasen\HL7\Segments\ORC; -use Aranyasen\HL7\Segments\PID; -use Aranyasen\HL7\Segments\OBX; -use Aranyasen\HL7\Segments\NTE; -use Aranyasen\HL7\Segments\EVN; use DateTime; use Validator; use File; @@ -58,14 +47,10 @@ use PDFCREATOR; use PhpOffice\PhpSpreadsheet\Spreadsheet; use PhpOffice\PhpSpreadsheet\Writer\Xlsx; -define( 'API_ACCESS_KEY', 'AAAA6YBXh1k:APA91bFL0q7QAXQGohXMpTwHco79f13C8PFk1Oo8kKhg1JerOulT9-37dxyP8X5ibABI0NuQ4ZsVxKQKCt7HuR7lUdJJuB-hTVnBmOUIBYfBlHb-Lcp6aGkj4erfF7J__A5hufXjF8Vt' ); class DokterController extends Controller { - protected $lisServiceUrl; - public function __construct() { - $this->lisServiceUrl = env('LIS_SERVICE_URL', 'http://10.10.120.14:6002'); - } + protected static function genSurat($id, $tabel){ if ($tabel == 'dengan kop' OR $tabel == 'PDF'){ $kopsurat = url('/kopsurat.png'); @@ -3238,230 +3223,6 @@ class DokterController extends Controller } } echo $cetak; - } - public function exsendTomany(Request $request) { - $data = []; - $iddokter = $request->input('set01'); - $modality = $request->input('set02'); - $worklist = $request->input('set03'); - $idcetak = $request->input('set04'); - $sukses = 0; - $error = ''; - $emailbody = ''; - - foreach($idcetak as $idperiksa){ - $periksa = Periksa::where('id', $idperiksa)->first(); - if (isset($periksa->id)){ - $idpasien = $periksa->pasien_id; - $keterangan = $periksa->keterangan; - $daftar = $periksa->daftar; - $idruang = $periksa->ruangan_id; - $kamar = $periksa->ruangan; - $urgensi = $periksa->urgensi; - $idpoli = $periksa->poli_id; - $statuse = $periksa->status; - $noregister = $periksa->noregister; - $asalpasien = $periksa->asalpasien; - $reques = $periksa->reques; - $asuransi = $periksa->asuransi; - $foto = $periksa->foto; - $analis= $periksa->analis; - $nofoto = $periksa->nofoto; - $namapoli = $periksa->getRuangan->poli ?? 'Deleted Data Ruang'; - - if (is_null($analis)){ - Periksa::where('id', $idperiksa)->update([ - 'analis' => Session('id'), - 'nmanalis' => Session('nama'), - 'foto' => date("Y-m-d H:i:s") - ]); - } - $today = date("YmdHi"); - $tanggal = date("Y-m-d H:i"); - $dokter = 'Dokter Penanggung Jawab'; - $arrayttl = explode("-", $nofoto); - $jenis = $arrayttl[0]; - $jk = $periksa->jkpasien; - $tgllahir = $periksa->tgllahirpasien; - $kota = ''; - $alamat = $periksa->alamatpasien; - $nama = $periksa->nmpasien; - $norm = $periksa->noregister; - $poli = $periksa->getPoli->poli ?? 'EMI Primary'; - $tengah = ''; - $blakang = ''; - $tgllahir = str_replace('-', '', $tgllahir); - $arrayttl = explode(" ", $nama); - $fname = iconv("UTF-8", "tis-620", $arrayttl[0]); - if (isset($arrayttl[1])){ - $tengah = iconv("UTF-8", "tis-620", $arrayttl[1]); - } - if (isset($arrayttl[2])){ - $blakang = iconv("UTF-8", "tis-620", $arrayttl[2]); - } else { - $blakang = $tengah; - $tengah = ''; - } - $daftar = str_replace(':', '', $daftar); - $tanggal = str_replace('-', '', $daftar); - $tanggal = str_replace(' ', '', $tanggal); - $berita = ''; - //PV1.2 = value nya I (Inpatient), O (Outpatient), E (Emergency). - if ($urgensi == 'Elective'){ $urgensi = 'INPATIENT'; $prioritas = 'Routine'; } - else if ($urgensi == 'CITO'){ $urgensi = 'EMERGENCY'; $prioritas = 'Cito'; } - else { $urgensi = 'OUTPATIENT'; $prioritas = 'Routine'; } - - if ($jk == 'L'){ $panggilan = 'TN'; $jk = 'M'; } - else if ($jk == 'P') { $panggilan = 'NY'; $jk = 'F'; } - else { $panggilan = 'UNK'; $jk = 'O'; } - $panggilan = ''; - if ($blakang == ''){ $blakang = $fname; } - if ($worklist == 'pacs'){ - $getsetting = Setting::where('id', '1')->first(); - $pacsaddr = $getsetting->pacs; - $port = $getsetting->port; - $recievingfas = 'OESEND_PROD'; - $portupdate = '10020'; - } else { - $getsetting = Worklist::where('id', $worklist)->first(); - if (isset($getsetting->ipaddress)){ - $pacsaddr = $getsetting->ipaddress; - $port = $getsetting->portnumber; - $portupdate = $getsetting->portnumber; - $recievingfas = $getsetting->aetitle; - } else{ - $getsetting = Setting::where('id', '1')->first(); - $pacsaddr = $getsetting->pacs; - $port = $getsetting->port; - $recievingfas = 'OESEND_PROD'; - $portupdate = '10020'; - } - } - if (is_null($foto)){ - $msg = new Message(); - $msh = new MSH(); - //$msh->setField(1, '|'); - //$msh->setField(2, '^~\&'); - $msh->setField(3, 'RIS'); - $msh->setField(4, 'RSSA MALANG'); - //$msh->setField(5, $recievingfas); - $msh->setField(5, 'OESEND_PROD'); - $msh->setField(6, 'EMR'); - $msh->setField(7, $today); - $msh->setField(9, ['ORM', 'O01']); - $msg->addSegment($msh); - - $pid = new PID(); - $pid->setField(2, [$norm, '', '11', $poli]); - $pid->setField(3, [$norm, 'C', '11', $jenis]); - $pid->setPatientName([$blakang, $fname, $tengah, $panggilan]); - $pid->setField(7, $tgllahir); - $pid->setField(8, $jk); - $pid->setField(10, 'IN'); - $pid->setField(18, [$idperiksa, '', 'M11', 'Visit']); - $pid->setField(19, 'IN'); - $msg->addSegment($pid); - - $pv1 = new PV1(); - $pv1->setField(2, $urgensi); - $pv1->setField(3, [$jenis,'','', $kamar]); - $pv1->setField(10, $poli); - $pv1->setField(18, $asuransi); - $pv1->setField(19, [$idperiksa, '', 'M11', 'Visit']); - $pv1->setField(44, $today); - $msg->addSegment($pv1); - - $orc = new ORC(); - $orc->setField(1, 'NW'); - $orc->setField(2, [$nofoto, $poli]); - $orc->setField(3, [$nofoto, $poli]); - $orc->setField(5, 'SC'); - $orc->setField(7, ['', '', '', '', '', $prioritas]); - $orc->setField(15, $today); - //$orc->setField(16, $klinis); - $orc->setField(17, 'Radiologi RSSA'); - $msg->addSegment($orc); - - $obr = new OBR(); - $obr->setField(2, [$nofoto, $poli]); - $obr->setField(3, [$nofoto, $poli]); - $obr->setField(4, [$modality, $reques, $poli]); - $obr->setField(5, $prioritas); - $obr->setField(6, $today); - $obr->setField(16, [$iddokter, $dokter]); - $obr->setField(18, $nofoto); - $obr->setField(19, $modality); - $obr->setField(21, $modality); - $obr->setField(24, $modality); - $obr->setField(27, ['1', 'once', $tanggal, $prioritas]); - $obr->setField(36, $today); - $msg->addSegment($obr); - try { - $connection = new Connection($pacsaddr, $port); - $ack = $connection->send($msg); - $sukses++; - $emailbody = $emailbody.'
Pasien atas nama '.$nama.' Dengan Order Pemeriksaan '.$reques.' Dari '.$asalpasien.' Terkirim ke Modality'; - }catch (Exception $e) { - $result = $e->getMessage(); - $error = $error.$result.'
'; - } - } else { - $msg = new Message(); - $msh = new MSH(); - $msh->setField(3, 'RIS'); - $msh->setField(4, 'RSSA MALANG'); - $msh->setField(5, 'OESEND_PROD'); - $msh->setField(6, 'EMR'); - $msh->setField(7, $today); - $msh->setField(9, ['ADT', 'A08']); - $msg->addSegment($msh); - - $evn = new EVN(); - $evn->setField(1, 'A01'); - $evn->setField(2, $tanggal); - $evn->setField(5, $recievingfas); - $evn->setField(6, 'NV44I0'); - $msg->addSegment($evn); - - $pid = new PID(); - $pid->setField(2, [$norm, '', '11', $poli]); - $pid->setField(3, [$norm, 'C', '11', $jenis]); - $pid->setPatientName([$blakang, $fname, $tengah, $panggilan]); - $pid->setField(7, $tgllahir); - $pid->setField(8, $jk); - $pid->setField(10, 'IN'); - $pid->setField(18, [$idperiksa, '', 'M11', 'Visit']); - $pid->setField(19, 'IN'); - $msg->addSegment($pid); - - $pv1 = new PV1(); - $pv1->setField(2, $urgensi); - $pv1->setField(3, [$jenis,'','', $kamar]); - $pv1->setField(10, $poli); - $pv1->setField(18, $asuransi); - $pv1->setField(19, [$idperiksa, '', 'M11', 'Visit']); - $pv1->setField(44, $today); - $msg->addSegment($pv1); - try { - $port = '10020'; - $connection = new Connection($pacsaddr, $port); - $ack = $connection->send($msg); - $sukses++; - }catch (Exception $e) { - $result = $e->getMessage(); - $error = $error.$result.'
'; - } - } - } - } - if ($error == ''){ - - return response()->json(['icon' => 'success', 'warna' => '#5ba035', 'status' => 'Success', 'message' => 'Data Saved
'.$error]); - return back(); - } else { - return response()->json(['icon' => 'error', 'warna' => '#bf441d', 'status' => 'Error..!!', 'message' => $error]); - return back(); - } } public function exsendToinsitu(Request $request) { $data = []; diff --git a/htdocs/app/Http/Controllers/PasienController.php b/htdocs/app/Http/Controllers/PasienController.php index 1af69a98..e5d26791 100644 --- a/htdocs/app/Http/Controllers/PasienController.php +++ b/htdocs/app/Http/Controllers/PasienController.php @@ -106,7 +106,7 @@ class PasienController extends Controller } else { try { $client = new Client(); - $res = $client->request('GET', 'http://10.10.123.204/api/account/pasien', ['query' => ['limit' => 10, 'nomedis' => $norm]]); + $res = $client->request('GET', 'https://gomed.rssa.my.id/api/account/pasien', ['query' => ['limit' => 10, 'nomedis' => $norm]]); $response_data = json_decode($res->getBody()->getContents()); if (isset($response_data->response[0])) { $hasil = $response_data->response[0]; diff --git a/htdocs/routes/web.php b/htdocs/routes/web.php index 50aecd6a..32378623 100644 --- a/htdocs/routes/web.php +++ b/htdocs/routes/web.php @@ -95,8 +95,8 @@ Route::group(['middleware' => 'project.ipg'], function() { Route::post('dashboard/early-warning/{id}/cancel', [FrontpageController::class, 'cancelEarlyWarning'])->name('dashboard.earlyWarning.cancel'); Route::get('dokter/getlisttem', [DokterController::class, 'getListtem'])->name('getListTemplate'); Route::get('dokter/getlistppds', [DokterController::class, 'getListppds'])->name('getlistppds'); - Route::post('dokter/getadendum', [DokterController::class, 'getAdendum'])->name('getadendum'); - Route::post('dokter/store', [DokterController::class, 'store']); + Route::post('dokter/getadendum', [DokterController::class, 'getAdendum'])->name('getadendum'); + Route::post('dokter/store', [DokterController::class, 'store']); Route::post('dokter/getdokter', [DokterController::class, 'getDokter'])->name('getDokter'); Route::post('dokter/update', [DokterController::class, 'update']); Route::post('dokter/delete', [DokterController::class, 'delete'])->name('deleteDokter'); @@ -119,7 +119,6 @@ Route::group(['middleware' => 'project.ipg'], function() { Route::post('dokter/exprintform', [DokterController::class, 'exprintForm'])->name('exprintform'); Route::post('dokter/exprintlabelsimrs', [DokterController::class, 'exprintLabelSIMRS'])->name('exprintlabelSIMRS'); Route::post('dokter/exprintformsimrs', [DokterController::class, 'exprintFormSIMRS'])->name('exprintformSIMRS'); - Route::post('dokter/exsendtomany', [DokterController::class, 'exsendTomany'])->name('exsendtomany'); Route::post('dokter/exsendtoinsitu', [DokterController::class, 'exsendToinsitu'])->name('exsendtoinsitu'); Route::post('dokter/getListadendum', [DokterController::class, 'getListadendum'])->name('getListadendum'); Route::post('dokter/exprinttandaterima', [DokterController::class, 'exTandaTerima'])->name('exTandaTerima'); diff --git a/listener/app.py b/listener/app.py index 7d2e8347..4ea456b7 100644 --- a/listener/app.py +++ b/listener/app.py @@ -154,10 +154,10 @@ DEVICE_CONFIGS = [ 'port': 'COM6', 'baud_rate': 9600, 'device_type': 'vitek', 'alat_name': 'Vitek 1', 'protocol': 'serial', 'flag_column': 'flg_vitek1' }, - { - 'port': 'COM4', 'baud_rate': 9600, 'device_type': 'vitek', 'alat_name': 'Vitek 2', - 'protocol': 'serial', 'flag_column': 'flg_vitek2' - }, + #{ + # 'port': 'COM4', 'baud_rate': 9600, 'device_type': 'vitek', 'alat_name': 'Vitek 2', + # 'protocol': 'serial', 'flag_column': 'flg_vitek2' + #}, { 'port': 'COM5', 'baud_rate': 9600, 'device_type': 'bd', 'alat_name': 'BACTEC', 'protocol': 'serial', 'flag_column': 'flg_bd1' @@ -366,6 +366,24 @@ def format_hl7_date(value): digits = re.sub(r"[^0-9]", "", text) return digits[:8] if len(digits) >= 8 else "" +def format_hl7_datetime(value): + if not value: + return "" + if isinstance(value, datetime.datetime): + return value.strftime("%Y%m%d%H%M%S") + if isinstance(value, datetime.date): + return value.strftime("%Y%m%d") + text = str(value).strip() + digits = re.sub(r"[^0-9]", "", text) + if len(digits) >= 14: + return digits[:14] + return digits[:8] if len(digits) >= 8 else "" + +def build_hl7_segment(segment_name, fields): + max_field = max(fields.keys()) if fields else 0 + values = [str(fields.get(index, "")) for index in range(1, max_field + 1)] + return f"{segment_name}|" + "|".join(values) + def map_hl7_sex(value): text = str(value or "").strip().upper() if not text: @@ -1890,10 +1908,17 @@ def send_order_to_myla_astm(conn, order, peer_ip): def create_myla_hl7_order_message(order, msg_control_id): timestamp = datetime.datetime.now().strftime('%Y%m%d%H%M%S') + order_timestamp = format_hl7_datetime(getattr(order, "rtglast", None)) or timestamp + patient_birth_date = format_hl7_date(getattr(order, "tgllahir", None)) + patient_admit_date = format_hl7_date(getattr(order, "rtglast", None)) sample_id = sanitize_astm_field(order.rnoreg, uppercase=True, max_len=32) or "000000" pid_norm = sanitize_astm_field(order.norm, uppercase=True, max_len=32) or f"PID{sample_id}" - test_code = sanitize_astm_field(order.tes, uppercase=True, max_len=40) or "ID" - specimen_code = sanitize_astm_field(order.kd_spesimen, uppercase=True, max_len=20) or "URC" + first_name, last_name = split_patient_name(order.nama) + patient_name = f"{last_name}^{first_name}".strip("^") + room = sanitize_astm_field(getattr(order, "ruangan", "") or "RSSA", uppercase=True, max_len=30) + test_code_raw = sanitize_astm_field(order.tes, uppercase=True, max_len=40) + test_code = test_code_raw if test_code_raw in {"BC", "ID", "SU"} else "ID" + specimen_code = sanitize_astm_field(order.kd_spesimen, uppercase=True, max_len=20) or "KULTUR URINE" # Sesuaikan pattern ID seperti contoh vendor (SPE/AWOS + accession). compact_id = re.sub(r"[^A-Z0-9]", "", sample_id) or "000000" @@ -1904,15 +1929,36 @@ def create_myla_hl7_order_message(order, msg_control_id): f"MSH|^~\\&|LIS|LAB|MYLA|BMX|{timestamp}||OML^O33^OML_O33|{msg_control_id}|P|2.5.1" f"|||NE|AL||UNICODE UTF-8" ) - pid = f"PID|||{pid_norm}" - pv1 = "PV1||O" - spm = f"SPM|1|{spm_id}||{specimen_code}^{specimen_code}^99BMx|||||||P^^HL70369||||||{timestamp}" - sac = f"SAC|||{spm_id}" - # ORC.9 wajib ada; ikuti contoh MyLA: ORC|NW|||||||| - orc = f"ORC|NW||||||||{timestamp}" - tq1 = "TQ1|||||||||R^^HL7048" - obr = f"OBR|1|{obr_order_id}||{test_code}^{test_code}^99BMx" - return f"{msh}\r{pid}\r{pv1}\r{spm}\r{sac}\r{orc}\r{tq1}\r{obr}\r" + pid = build_hl7_segment("PID", { + 3: pid_norm, + 5: patient_name, + 7: patient_birth_date, + }) + pv1 = build_hl7_segment("PV1", { + 2: "O", + 3: f"{room}^^^RSSA", + 44: patient_admit_date, + }) + spm = build_hl7_segment("SPM", { + 1: "1", + 2: spm_id, + 4: f"{specimen_code}^{specimen_code}^99BMx", + 11: "P^Patient^HL70369", + 17: order_timestamp, + }) + orc = build_hl7_segment("ORC", { + 1: "NW", + 9: order_timestamp, + }) + tq1 = build_hl7_segment("TQ1", { + 9: "R^Routine^HL70485", + }) + obr = build_hl7_segment("OBR", { + 1: "1", + 2: obr_order_id, + 4: f"{test_code}^{test_code}^99BMx", + }) + return f"{msh}\r{pid}\r{pv1}\r{spm}\r{orc}\r{tq1}\r{obr}\r" def process_myla_hl7_message(conn, hl7_str, peer_ip): incoming_control_id = ""