diff --git a/htdocs/app/Http/Controllers/FrontpageController.php b/htdocs/app/Http/Controllers/FrontpageController.php index 3b2f5f4e..333d00cd 100644 --- a/htdocs/app/Http/Controllers/FrontpageController.php +++ b/htdocs/app/Http/Controllers/FrontpageController.php @@ -1310,7 +1310,7 @@ class FrontpageController extends Controller } } public function registerApi(Request $request) { - //Log::info(' Incomming '.json_encode($request->input())); + Log::info(' Incomming '.json_encode($request->input())); $decodedData = $request->json()->all(); $norm = $decodedData['norm'] ?? null; $nama = $decodedData['nama'] ?? null; @@ -1325,41 +1325,33 @@ class FrontpageController extends Controller $bpjs = $decodedData['nobpjs'] ?? '0'; $drpeminta = $decodedData['drpeminta'] ?? null; $tlsasal = $decodedData['asalpasien'] ?? null; - //$rekues = $decodedData['layanan'] ?? null; + $diagnosa = $decodedData['diagnosa'] ?? null; $statusbayar = $decodedData['statusbayar'] ?? null; - $notransaksi = $decodedData['notransaksi'] ?? null; - $insurance = $decodedData['asuransi'] ?? 'UMM'; + $notransaksi = $decodedData['nomor_lab'] ?? null; + $insurance = $decodedData['jenispembayaran'] ?? 'UMM'; $klinis = $decodedData['klinis'] ?? null; $klinisi = $decodedData['klinisi'] ?? $drpeminta; - $rekues = $decodedData['kode'] ?? null; + $rekues = $decodedData['jenispemeriksaan'] ?? null; $nm_spesimen = $decodedData['spesimen'] ?? null; + $kd_spesimen = $decodedData['kodespesimen'] ?? null; $pengambilan = $decodedData['pengambilan'] ?? null; - $nmrs = $decodedData['namarspengirim'] ?? 'RSSA Malang'; + $nmrs = $decodedData['keteranganrujukan'] ?? 'RSSA Malang'; + $tanggalregis = $decodedData['tanggalregis'] ?? date('Y-m-d'); + $tanggalsampel = $decodedData['tanggalsampel'] ?? date('Y-m-d'); $telpon = str_replace('_', '', $nohap); - //$rekues = str_replace('_', ' ', $rekues); $tlsasal = str_replace('_', ' ', $tlsasal); $klinisi = str_replace('_', ' ', $klinisi); $nama = str_replace('_', ' ', $nama); $alamat = str_replace('_', ' ', $alamat); - $kd_spesimen = ''; $getkodespesimen= Organisms::where('name', $nm_spesimen)->where('kelompok', 'listkodespesimen')->first(); if (isset($getkodespesimen->category)){ $kd_spesimen= $getkodespesimen->category; } else { - $cekdulu = explode(' ', $nm_spesimen); - if (isset($cekdulu[1])){ - $kd_spesimen = str_replace('.', '', $cekdulu[0]); - } else { - foreach ($cekdulu as $kata) { - $kd_spesimen .= substr($kata, 0, 1); - } - } Organisms::create([ 'name' => $nm_spesimen, 'category' => $kd_spesimen, 'kelompok' => 'listkodespesimen' ]); - } $iddokter = ''; $ruangan = 1; @@ -1437,12 +1429,12 @@ class FrontpageController extends Controller $check = Poli::where('subpoli', $rekues)->first(); if (isset($check->id)){ $poli_id = $check->id; - $kd_spesimen= $check->subsubpoli; - $nm_spesimen= $check->modaliti; } else { $poli_id = Poli::insertGetId([ - 'poli' => 'Mikrobiologi', - 'subpoli' => $rekues, + 'poli' => 'Mikrobiologi', + 'subpoli' => $rekues, + 'subsubpoli' => $kd_spesimen, + 'modaliti' => $nm_spesimen, ]); } $nofoto = date('y').'-'.sprintf("% 06s", $noloket); @@ -1492,6 +1484,10 @@ class FrontpageController extends Controller 'asuransi' => $insurance, 'urgensi' => $urgensi, 'daftar' => $mulai, + 'diagnosa' => $diagnosa, + 'pengambilan' => $pengambilan, + 'tanggalregis' => $tanggalregis, + 'tanggalsampel' => $tanggalsampel, 'pendaftar' => $clientIpNumeric, 'nmpendaftar' => $clientIp, 'orderid' => $notransaksi, @@ -1501,7 +1497,7 @@ class FrontpageController extends Controller if (in_array($poli_id, $daftaridtcm)){ $genexpert = false; } else { - $genexpert = 1; + $genexpert = true; } Paslab::updateOrCreate( diff --git a/htdocs/database/migrations/2026_04_30_000011_alter_periksa_add_tglmrs_fields.php b/htdocs/database/migrations/2026_04_30_000011_alter_periksa_add_tglmrs_fields.php new file mode 100644 index 00000000..39cedf10 --- /dev/null +++ b/htdocs/database/migrations/2026_04_30_000011_alter_periksa_add_tglmrs_fields.php @@ -0,0 +1,38 @@ +date('tanggalregis')->nullable()->after('tgladendum'); + } + if (!Schema::hasColumn('periksa', 'tanggalsampel')) { + $table->date('tanggalsampel')->nullable()->after('tanggalregis'); + } + if (!Schema::hasColumn('periksa', 'pengambilan')) { + $table->string('pengambilan', 255)->nullable()->after('diagnosa2'); + } + }); + } + + public function down(): void + { + Schema::table('periksa', function (Blueprint $table) { + if (Schema::hasColumn('periksa', 'tanggalregis')) { + $table->dropColumn('tanggalregis'); + } + if (Schema::hasColumn('periksa', 'tanggalsampel')) { + $table->dropColumn('tanggalsampel'); + } + if (Schema::hasColumn('periksa', 'pengambilan')) { + $table->dropColumn('pengambilan'); + } + }); + } +}; diff --git a/listener/app.py b/listener/app.py index 1db1c656..91a9785c 100644 --- a/listener/app.py +++ b/listener/app.py @@ -450,29 +450,14 @@ def create_genexpert_rsp_z02_response(orders, incoming_hl7, ip_addr=None): print(f"[GENEXPERT] Payload order dilewati rnoreg={sample_id} karena assay kosong.") continue - first_name, last_name = split_patient_name(order.nama) - patient_name = sanitize_astm_field(f"{last_name}^{first_name}", uppercase=True, max_len=80, allow_component_sep=True) - dob = format_hl7_date(getattr(order, "tgllahir", None)) - sex = map_hl7_sex(getattr(order, "rjenis", "")) - address = sanitize_astm_field(getattr(order, "alamat", ""), max_len=120) - room = sanitize_astm_field(getattr(order, "ruangan", ""), uppercase=True, max_len=80) - doctor = sanitize_astm_field(getattr(order, "namadok", ""), max_len=80) - requested_test_name = sanitize_astm_field(getattr(order, "tes", ""), max_len=120) - specimen_type = sanitize_astm_field( - getattr(order, "nm_spesimen", "") or getattr(order, "kd_spesimen", "") or "ORH", - uppercase=True, - max_len=40 - ) - print( f"[GENEXPERT-DEBUG] Build RSP rnoreg={sample_id}, ip={ip_addr}, " f"patient_id={patient_id}, assay_code={assay_code}, assay_source={assay_source}, " - f"capability_match={capability_match}, patient_name='{patient_name}', dob='{dob}', " - f"sex='{sex}', room='{room}', doctor='{doctor}', specimen_type='{specimen_type}', " - f"requested_test_name='{requested_test_name}', query_name='{query_name}', query_tag='{query_tag}'" + f"capability_match={capability_match}, query_name='{query_name}', query_tag='{query_tag}', " + "profile='minimal-rsp-z02'" ) - segments.append(f"PID|{patient_idx}||{patient_id}||{patient_name}||{dob}|{sex}|||{address}") + segments.append(f"PID|{patient_idx}||{patient_id}") segments.append(f"ORC|NW|1|||||||{order_ts}") segments.append(f"OBR|1|||{assay_code}|||||||A") segments.append("TQ1|||||||||R") @@ -627,7 +612,7 @@ def debug_genexpert_order_message(hl7_message, ip_addr=None): print( f"[GENEXPERT-ORDER-DEBUG] ip={ip_addr}, seg=PID, patient_id='{current_pid}', " f"patient_name='{current_patient_name}', dob='{dob}', sex='{sex}', " - f"address='{address}', raw='{segment}'" + f"address='{address}', mode='minimal', raw='{segment}'" ) elif seg_type == "ORC": order_index = fields[2] if len(fields) > 2 else "" @@ -2105,6 +2090,8 @@ def handle_genexpert_client(conn, addr): log_genexpert_handshake(addr[0], "ETX-RX", detail=f"bytes={len(data)}") if b"\x04" in data: log_genexpert_handshake(addr[0], "EOT-RX", detail=f"bytes={len(data)}") + if b"\x15" in data: + log_genexpert_handshake(addr[0], "NAK-RX", detail=f"bytes={len(data)}") # --- 1. HANDLE HANDSHAKE (ENQ) --- # Jika alat kirim ENQ (\x05/♣), langsung balas ACK (\x06) @@ -2115,6 +2102,10 @@ def handle_genexpert_client(conn, addr): log_genexpert_handshake(addr[0], "ACK-TX", detail="reason=enq") # Hapus ENQ dari buffer agar tidak mengganggu buffer = buffer.replace(b'\x05', b'') + + if b'\x15' in buffer: + log_genexpert_handshake(addr[0], "NAK-BUFFER-CLEAR", detail=f"buffer_len={len(buffer)}") + buffer = buffer.replace(b'\x15', b'') # --- 2. CEK APAKAH PESAN SUDAH LENGKAP? --- # Kita cari tanda akhir pesan umum: @@ -2141,6 +2132,11 @@ def handle_genexpert_client(conn, addr): # --- 3. PROSES JIKA LENGKAP --- if msg_complete: + if end_marker_pos == 0 and buffer[:1] == b'\x04': + log_genexpert_handshake(addr[0], "EOT-CLEAR", detail="standalone-eot") + buffer = buffer[1:].lstrip(b'\r').lstrip(b'\n') + continue + # Ambil pesan dari awal sampai marker # (Gunakan slice sampai end_marker_pos+1 agar karakter penutup ikut terambil/dibuang) if end_marker_pos == -1: end_marker_pos = len(buffer)