- | Jenis | Masuk | Keluar |
+ | Jenis | Masuk | Keluar | Sisa Stok |
@forelse($stat_perjenis_tahunan ?? [] as $row)
- | {{ $row['jenis'] }} | {{ number_format($row['masuk'],0,'.',',') }} | {{ number_format($row['keluar'],0,'.',',') }} |
+ | {{ $row['jenis'] }} | {{ number_format($row['masuk'],0,'.',',') }} | {{ number_format($row['keluar'],0,'.',',') }} | {{ number_format($row['sisa'] ?? 0,0,'.',',') }} |
@empty
- | Belum ada transaksi |
+ | Belum ada transaksi |
@endforelse
@@ -869,10 +869,11 @@
'
' + escapeHtml(r.jenis || '-') + ' | ' +
'
' + formatInt(r.masuk || 0) + ' | ' +
'
' + formatInt(r.keluar || 0) + ' | ' +
+ '
' + formatInt(r.sisa || 0) + ' | ' +
'';
});
if(!html){
- html = '
| Belum ada transaksi |
';
+ html = '
| Belum ada transaksi |
';
}
$(tbodyId).html(html);
}
diff --git a/htdocs/resources/views/livewire/gudang-pos.blade.php b/htdocs/resources/views/livewire/gudang-pos.blade.php
index 7af69519..64f18fa6 100644
--- a/htdocs/resources/views/livewire/gudang-pos.blade.php
+++ b/htdocs/resources/views/livewire/gudang-pos.blade.php
@@ -24,6 +24,7 @@
@php
$saldoBase = (int) ($stockMap[$p->jenis] ?? 0);
$warning = $saldoBase <= (int) ($p->stok_minimum ?? 0);
+ $latestExpired = $latestExpiredMap[$p->jenis] ?? null;
@endphp
@@ -46,6 +47,9 @@
Satuan: {{ $p->satuan }} @if(($p->satuan_kecil ?? '') !== '') / {{ $p->satuan_kecil }} @endif
+
+ Expired terakhir: {{ $latestExpired ?: '-' }}
+
@empty
@@ -139,6 +143,7 @@
{{ $selectedJenis->jenis }}
Stok: {{ $selectedStockDisplay }}
+
Expired terakhir: {{ $selectedLatestExpired ?: '-' }}
@endif
diff --git a/listener/app.py b/listener/app.py
index 2d8c3ba2..476c6f95 100644
--- a/listener/app.py
+++ b/listener/app.py
@@ -474,9 +474,9 @@ def create_genexpert_rsp_z02_response(orders, incoming_hl7, ip_addr=None):
segments.append(f"PID|{patient_idx}||{patient_id}||{patient_name}||{dob}|{sex}|||{address}")
segments.append(f"ORC|NW|1|||||||{order_ts}")
- segments.append(f"OBR|1|||{assay_code}^{requested_test_name}^L|||||||A")
+ segments.append(f"OBR|1|||{assay_code}|||||||A")
segments.append("TQ1|||||||||R")
- segments.append(f"SPM|1|{sample_id}^{sample_id}||{specimen_type}|||||||P")
+ segments.append(f"SPM|1|{sample_id}^||ORH|||||||P")
return "\r".join(segments) + "\r"
@@ -595,6 +595,15 @@ def send_genexpert_response(conn, ip_addr, hl7_message, framing, label=""):
)
conn.sendall(payload)
+def send_genexpert_transport_ack(conn, ip_addr, framing, reason="frame-received"):
+ if framing != "astm":
+ return
+ try:
+ conn.sendall(b"\x06")
+ print(f"[GENEXPERT-DEBUG] Transport ACK sent ip={ip_addr}, framing={framing}, reason={reason}")
+ except Exception as exc:
+ print(f"[GENEXPERT-DEBUG] Transport ACK gagal ip={ip_addr}, framing={framing}, reason={reason}, error={exc}")
+
def debug_genexpert_order_message(hl7_message, ip_addr=None):
segments = parse_hl7_segments(hl7_message)
current_pid = ""
@@ -2109,10 +2118,10 @@ def handle_genexpert_client(conn, addr):
msg_complete = True
elif b'\x03' in buffer: # Pola ASTM (Ada Checksum setelahnya)
# ASTM: ...CS
- # Kita cari \x03, lalu tambah 4 byte (CS + CRLF) untuk aman
+ # Kita cari \x03, lalu ambil ETX + 2 checksum + CRLF secara penuh.
pos = buffer.find(b'\x03')
- if len(buffer) >= pos + 4:
- end_marker_pos = pos + 4
+ if len(buffer) >= pos + 5:
+ end_marker_pos = pos + 5
msg_complete = True
elif b'\x04' in buffer: # Pola EOT (Putus Koneksi/Selesai)
end_marker_pos = buffer.find(b'\x04')
@@ -2126,6 +2135,13 @@ def handle_genexpert_client(conn, addr):
full_message_bytes = buffer[:end_marker_pos]
response_framing = detect_genexpert_message_framing(full_message_bytes)
+
+ send_genexpert_transport_ack(
+ conn,
+ addr[0],
+ response_framing,
+ reason="incoming-frame-complete"
+ )
# Sisa buffer (jika ada paket nempel di belakangnya) disimpan untuk loop berikutnya
buffer = buffer[end_marker_pos:]