diff --git a/htdocs/app/Console/Commands/ProcessAstmMessages.php b/htdocs/app/Console/Commands/ProcessAstmMessages.php
index f10ebc2a..e087fec4 100644
--- a/htdocs/app/Console/Commands/ProcessAstmMessages.php
+++ b/htdocs/app/Console/Commands/ProcessAstmMessages.php
@@ -22,7 +22,7 @@ class ProcessAstmMessages extends Command
public function handle()
{
// Ambil data dari DataListener
- $dataListener = DataListiner::whereNull('processed')->get();
+ $dataListener = DataListiner::where('processed', '0')->orderBy('created_at', 'DESC')->get();
if ($dataListener) {
$jumlah = count($dataListener);
$pesan = $this->astmMessageService->processAstmMessages($dataListener);
diff --git a/htdocs/app/Http/Controllers/DokterController.php b/htdocs/app/Http/Controllers/DokterController.php
index d7fb4915..51728b9d 100644
--- a/htdocs/app/Http/Controllers/DokterController.php
+++ b/htdocs/app/Http/Controllers/DokterController.php
@@ -1080,6 +1080,7 @@ class DokterController extends Controller
]);
}
}
+ $jsondata = json_decode($jsondata, true);
if(is_array($jsondata) && count($jsondata) > 0){
foreach ($jsondata as $item){
RekapAntibiotik::updateOrCreate(
@@ -1102,9 +1103,9 @@ class DokterController extends Controller
$gentabel = RekapAntibiotik::where('orderid', $orderid)->get();
if (!empty($gentabel)){
$nomor = 1;
- $isidata = '
| No | Antibiotik | Value | S/I/R |
';
+ $isidata = $isidata.'
| No | Antibiotik | Value | S/I/R |
';
foreach($gentabel as $rtabel){
- $isidata = $isidata.'| '.$nomor.' | '.$rtabel->antibiotic.' | '.$rtabel->value.''.$rtabel->interpretation.' |
';
+ $isidata = $isidata.'| '.$nomor.' | '.$rtabel->resistance.' | '.$rtabel->value.' | '.$rtabel->interpretation.' |
';
$nomor++;
}
$isidata = $isidata.'
';
@@ -1328,10 +1329,10 @@ class DokterController extends Controller
$setval = $batasbawah;
}
if ($nomor == 1){
- $tabel = '| No | Antibiotik | Sub | Disc Content | S/I/R |
| '.$nomor.' | '.$getdata->antibiotik.' | '.$getdata->subantibiotik.' | '.$getdata->diskcontent.' | '.$setnilai.' |
';
+ $tabel = '| No | Antibiotik | Sub | Disc Content | S/I/R |
| '.$nomor.' | '.$getdata->antibiotik.' '.$getdata->subantibiotik.' | '.$getdata->diskcontent.' | '.$setnilai.' |
';
} else {
- $baris = '| '.$nomor.' | '.$getdata->antibiotik.' | '.$getdata->subantibiotik.' | '.$getdata->diskcontent.' | '.$setnilai.' |
';
+ $baris = '| '.$nomor.' | '.$getdata->antibiotik.' '.$getdata->subantibiotik.' | '.$getdata->diskcontent.' | '.$setnilai.' |
';
$tabel = str_replace('
', $baris, $tabelawal);
$tabel = $tabel.'';
}
@@ -1730,6 +1731,36 @@ class DokterController extends Controller
'antibiotikall' => $antibiotikall,
);
}
+ /*
+ $getsirab = SiraB::orderBy('family', 'ASC')->orderBy('spesies', 'ASC')->where('cek', '1')->get();
+ foreach($getsirab as $row){
+ $family = $row->family;
+ $spesies= $row->spesies;
+ $getallantibiotik = SiraB::where('family', $family)->where('spesies', $spesies)->get();
+ foreach ($getallantibiotik as $row2){
+ SiraB::updateOrCreate(
+ [
+ 'family' => $row->family,
+ 'spesies' => $row->spesies,
+ 'antibiotik' => $row2->antibiotik,
+ 'subantibiotik' => $row2->subantibiotik,
+ ],
+ [
+ 'diskcontent' => $row2->diskcontent,
+ 'batasatas' => $row2->batasatas,
+ 'midrange' => $row2->midrange,
+ 'batasbawah' => $row2->batasbawah,
+ 'sumber' => $row2->sumber,
+ 'kodedok' => $row2->kodedok,
+ 'atu' => $row2->atu,
+ 'kelompok' => $row2->kelompok,
+ 'glassreportname' => trim($row2->glassreportname),
+ 'cek' => '0',
+ ]
+ );
+ }
+ }
+ */
echo json_encode($arrayfiles);
} else if ($idpasien == 'Bakteri'){
$getsirab = Organisms::where('kelompok', 'biakankultur')->orderBy('category', 'ASC')->orderBy('name', 'ASC')->get();
diff --git a/htdocs/app/Http/Controllers/FrontpageController.php b/htdocs/app/Http/Controllers/FrontpageController.php
index 8804a60d..3cc188ed 100644
--- a/htdocs/app/Http/Controllers/FrontpageController.php
+++ b/htdocs/app/Http/Controllers/FrontpageController.php
@@ -762,6 +762,27 @@ class FrontpageController extends Controller
'orderid' => $notransaksi,
]);
$pesan = $nofoto;
+ DB::table('paslab')->insert([
+ 'rnoreg' => $nofoto,
+ 'nama' => $nama,
+ 'norm' => $noregister,
+ 'rtglast' => $mulai,
+ 'alamat' => $alamat,
+ 'rjenis' => $jk,
+ 'umur' => $usia,
+ 'namadok' => $klinisi,
+ 'ruangan' => 'Mikrobiologi',
+ 'tes' => $rekues,
+ 'alat' => 'ALL',
+ 'kd_spesimen' => $kd_spesimen,
+ 'nm_spesimen' => $nm_spesimen,
+ 'tgllahir' => $tgllahir,
+ 'flg_vitek1' => false,
+ 'flg_vitek2' => false,
+ 'flg_bd1' => false,
+ 'flg_bd2' => false,
+ 'flg_gxp' => false,
+ ]);
if ($kd_spesimen != '' AND $nm_spesimen != ''){
PendaftaranOnListiner::updateOrCreate(
[
@@ -786,16 +807,7 @@ class FrontpageController extends Controller
'nm_spesimen' => $nm_spesimen,
]
);
- $dataForLis = [
- 'nama' => $nama,
- 'noregister' => $noregister,
- 'nofoto' => $nofoto,
- 'kd_spesimen' => $kd_spesimen,
- 'nm_spesimen' => $nm_spesimen,
- 'tgllahir' => $tgllahir,
- 'jk' => $jk,
- ];
- $this->sendRegistrationToLis($dataForLis);
+
}
if ($pesan != ''){
return response()->json(['status' => 'Sukses', 'message' => $pesan], 201);
@@ -999,6 +1011,7 @@ class FrontpageController extends Controller
'flg_vitek2' => false,
'flg_bd1' => false,
'flg_bd2' => false,
+ 'flg_gxp' => false,
]);
if ($kd_spesimen != '' AND $nm_spesimen != ''){
PendaftaranOnListiner::updateOrCreate(
@@ -1398,6 +1411,30 @@ class FrontpageController extends Controller
'kd_spesimen' => $kd_spesimen,
'nm_spesimen' => $nm_spesimen,
]);
+ $ceksudah = DB::table('paslab')->where('rnoreg', $nofoto)->count();
+ if ($ceksudah == 0){
+ DB::table('paslab')->insert([
+ 'rnoreg' => $nofoto,
+ 'nama' => $nama,
+ 'norm' => $noregister,
+ 'rtglast' => $mulai,
+ 'alamat' => $alamat,
+ 'rjenis' => $jk,
+ 'umur' => $usia,
+ 'namadok' => $getdata->dokter ?? 'Unkown',
+ 'ruangan' => 'Mikrobiologi',
+ 'tes' => $rekues,
+ 'alat' => 'ALL',
+ 'kd_spesimen' => $kd_spesimen,
+ 'nm_spesimen' => $nm_spesimen,
+ 'tgllahir' => $tgllahir,
+ 'flg_vitek1' => false,
+ 'flg_vitek2' => false,
+ 'flg_bd1' => false,
+ 'flg_bd2' => false,
+ ]);
+ }
+
$pesan = $pesan.' Data Berhasil di Update';
if ($kd_spesimen != '' AND $nm_spesimen != ''){
PendaftaranOnListiner::updateOrCreate(
@@ -1423,6 +1460,7 @@ class FrontpageController extends Controller
'nm_spesimen' => $nm_spesimen,
]
);
+ /*
$dataForLis = [
'nama' => $nama,
'noregister' => $noregister,
@@ -1433,6 +1471,7 @@ class FrontpageController extends Controller
'jk' => $jk,
];
$this->sendRegistrationToLis($dataForLis);
+ */
}
if ($pesan != ''){
if ($file != '' AND $jenisgambar != ''){
@@ -1479,19 +1518,28 @@ class FrontpageController extends Controller
'nmexcutor' => Session('nama'),
]);
try {
- if ($modality == 'genexpert01' OR $modality == 'genexpert02' OR $modality == 'genexpert03'){
- $dataForLis = [
- 'nama' => $cekdata->nmpasien,
- 'noregister' => $cekdata->noregister,
- 'nofoto' => $cekdata->nofoto,
- 'kd_spesimen' => $cekdata->kd_spesimen,
- 'nm_spesimen' => $cekdata->nm_spesimen,
- 'tgllahir' => $cekdata->tgllahirpasien,
- 'jk' => $cekdata->jkpasien,
- ];
- $this->sendRegistrationToLis($dataForLis);
- } else {
- $pesan = 'Cannot send on Serial Port From Server';
+ $ceksudah = DB::table('paslab')->where('rnoreg', $nofoto)->count();
+ if ($ceksudah == 0){
+ DB::table('paslab')->insert([
+ 'rnoreg' => $nofoto,
+ 'nama' => $nama,
+ 'norm' => $cekdata->noregister,
+ 'rtglast' => $cekdata->mulai,
+ 'alamat' => $alamat,
+ 'rjenis' => $jk,
+ 'umur' => $cekdata->usia,
+ 'namadok' => $getdata->dokter ?? 'Unkown',
+ 'ruangan' => 'Mikrobiologi',
+ 'tes' => $cekdata->reques,
+ 'alat' => 'ALL',
+ 'kd_spesimen' => $cekdata->kd_spesimen,
+ 'nm_spesimen' => $cekdata->nm_spesimen,
+ 'tgllahir' => $cekdata->tgllahirpasien,
+ 'flg_vitek1' => false,
+ 'flg_vitek2' => false,
+ 'flg_bd1' => false,
+ 'flg_bd2' => false,
+ ]);
}
}catch (Exception $e) {
$pesan = $e->getMessage();
diff --git a/htdocs/app/Http/Controllers/ReportController.php b/htdocs/app/Http/Controllers/ReportController.php
index b91f11e1..7e6b2ef7 100644
--- a/htdocs/app/Http/Controllers/ReportController.php
+++ b/htdocs/app/Http/Controllers/ReportController.php
@@ -308,25 +308,34 @@ class ReportController extends Controller
}
}
public function genRekapAntibiotik(Request $request) {
- $data = [];
- $bulan = $request->input('bulan');
- $tahun = $request->input('tahun');
+ $data = [];
+ $bulan = $request->input('bulan');
+ $tahun = $request->input('tahun');
if ($tahun == '' OR is_null($tahun)){
- $getarray = explode('?', $bulan);
- $bulan = $getarray[0] ?? date('m');
- $tahun = $getarray[1] ?? date('Y');
- $bulan = str_replace('bulan=', '', $bulan);
- $tahun = str_replace('tahun=', '', $tahun);
- }
+ $getarray = explode('?', $bulan);
+ $bulan = $getarray[0] ?? date('m');
+ $tahun = $getarray[1] ?? date('Y');
+ $bulan = str_replace('bulan=', '', $bulan);
+ $tahun = str_replace('tahun=', '', $tahun);
+ }
if ($bulan == '' OR $bulan == 'ALL' OR $bulan == 'Pick Month') {
- $orderbydate = Periksa::whereYear('daftar', $tahun)->get();
- $jsonantibiotik = RekapAntibiotik::whereIn('orderid', $orderbydate->pluck('id'))->get()->groupBy('orderid');
+ $orderbydate = Periksa::whereYear('daftar', $tahun)->orderBy('daftar', 'asc')->get();
} else {
- $orderbydate = Periksa::whereMonth('daftar', $bulan)->whereYear('daftar', $tahun)->get();
- $jsonantibiotik = RekapAntibiotik::whereIn('orderid', $orderbydate->pluck('id'))->get()->groupBy('orderid');
+ $orderbydate = Periksa::whereMonth('daftar', $bulan)->whereYear('daftar', $tahun)->orderBy('daftar', 'asc')->get();
}
- return view('admin.rekapantibiotik', compact('orderbydate', 'jsonantibiotik', 'bulan', 'tahun'));
- }
+
+ $orderIds = $orderbydate->pluck('id');
+
+ $allAntibiotics = RekapAntibiotik::whereIn('orderid', $orderIds)->get();
+
+ $masterAntibioticList = $allAntibiotics->pluck('resistance')->unique()->sort()->values();
+
+ $jsonantibiotik = $allAntibiotics->groupBy('orderid')->map(function ($items) {
+ return $items->pluck('interpretation', 'resistance');
+ });
+
+ return view('admin.rekapantibiotik', compact('orderbydate', 'jsonantibiotik', 'bulan', 'tahun', 'masterAntibioticList'));
+ }
public function genGlassReport(Request $request) {
$data = [];
$bulan = $request->input('bulan');
diff --git a/htdocs/app/ResultOnListiner.php b/htdocs/app/ResultOnListiner.php
new file mode 100644
index 00000000..4a548391
--- /dev/null
+++ b/htdocs/app/ResultOnListiner.php
@@ -0,0 +1,15 @@
+json(['message' => 'Data berhasil diproses dan disimpan.']);
} else {
- if (!empty($mltrData)){
- Log::info("Trying parser MTRSL :", $mltrData);
- $parsedData = [];
- $parsedData['antibiotics'] = [];
- $antibiotic = '';
- $resistance = '';
- $value = '';
- $interpretation = '';
- $mulaikirim = 0;
- $resultSample = new ResultSample();
- foreach ($mltrData as $index => $field) {
- if ($field == 'ra'){
- if ($antibiotic != ''){
- $parsedData['antibiotics'][] = [
- 'antibiotic' => $antibiotic, // Antibiotik
- 'resistance' => $resistance, // Hasil Resistansi
- 'value' => $value, // Nilai
- 'interpretation'=> $interpretation // Interpretasi
- ];
- $antibiotic = '';
- $resistance = '';
- $value = '';
- $interpretation = '';
- } else {
- $mulaikirim = 1;
- }
- } else {
- if ($mulaikirim == 1){
- $antibiotic = substr($field, 2);
- $mulaikirim++;
- } else if ($mulaikirim == 2){
- $resistance = substr($field, 2);
- $mulaikirim++;
- } else if ($mulaikirim == 3){
- $value = substr($field, 2);
- $mulaikirim++;
- } else if ($mulaikirim == 4){
- $interpretation = substr($field, 2);
- $mulaikirim++;
- } else {
- $field = substr($field, 2);
- switch ($index) {
- case 0:
- $resultSample->sender_name = $alat;
- break;
- case 1:
- $resultSample->version_number = $field; // iiV2
- break;
- case 2:
- $resultSample->isolate_number = $field; // is000015F278BD
- break;
- case 4:
- $resultSample->patient_id = $field; // pi12009427
- break;
- case 5:
- $patientNames = explode(',', $field ?? null);
- if (count($patientNames) > 0) {
- $resultSample->patient_name_last = trim($patientNames[0]); // Last name
- }
- if (count($patientNames) > 1) {
- $resultSample->patient_name_first = trim($patientNames[1]); // First name
- }
- if (count($patientNames) > 2) {
- $resultSample->patient_name_middle = trim($patientNames[2]); // Middle name
- }
- break;
- case 6:
- $resultSample->address_street = $field; // plMANINJAU
- break;
- case 12:
- try {
- $resultSample->message_datetime = Carbon::parse($field)->format('Y-m-d') ?? null;
- }catch (Exception $e) {
- $resultSample->message_datetime = date('Y-m-d');
- }
- break;
- case 13:
- try {
- $resultSample->test_complete_datetime = Carbon::parse($field)->format('Y-m-d') ?? null;
- }catch (Exception $e) {
- $resultSample->test_complete_datetime = date('Y-m-d');
- }
- break;
- case 14:
- $resultSample->accession_number = substr($field, 6); // ci30112024.26859
- break;
- case 23:
- $resultSample->organism = $field; // o2Staphylococcus haemolyticus
- break;
+ if (!empty($mltrData)) {
+ Log::info("Trying robust parser for MTRSL:", $mltrData);
+
+ $resultSample = new ResultSample();
+ $antibioticResults = [];
+ $currentAntibiotic = [];
+
+ foreach ($mltrData as $field) {
+ if (strlen($field) < 2) continue; // Lewati field kosong
+
+ // 1. Identifikasi TAG dan VALUE dari setiap field
+ $tag = substr($field, 0, 2);
+ $value = substr($field, 2);
+
+ // 2. Gunakan SWITCH pada TAG, bukan pada INDEX
+ switch ($tag) {
+ // == Data Pasien & Sampel ==
+ case 'pi': $resultSample->patient_id = $value; break;
+ case 'pn':
+ $patientNames = explode(',', $value ?? null);
+ $resultSample->patient_name_last = trim($patientNames[0] ?? '');
+ $resultSample->patient_name_first = trim($patientNames[1] ?? '');
+ $resultSample->patient_name_middle = trim($patientNames[2] ?? '');
+ break;
+ case 'pl': $resultSample->address_street = $value; break;
+ case 'ci': $resultSample->accession_number = substr($value, 6); break;
+ case 'o2': $resultSample->organism = $value; break;
+
+ // Tanggal bisa memiliki tag s1, s3, dll. Sesuaikan jika perlu
+ case 's3':
+ try {
+ // Contoh parsing tanggal dari format Vitek: 08/25/2025
+ $resultSample->test_complete_datetime = Carbon::createFromFormat('m/d/Y', $value)->format('Y-m-d H:i:s');
+ } catch (Exception $e) {
+ $resultSample->test_complete_datetime = now();
}
- }
+ break;
+
+ // == Logika Cerdas untuk Blok Antibiotik ==
+ case 'ra':
+ // 'ra' adalah sinyal bahwa blok antibiotik SEBELUMNYA sudah selesai.
+ // Jika $currentAntibiotic tidak kosong, simpan ke hasil utama.
+ if (!empty($currentAntibiotic)) {
+ $antibioticResults[] = $currentAntibiotic;
+ }
+ // Reset untuk menampung data antibiotik yang baru.
+ $currentAntibiotic = [];
+ break;
+ case 'a1': $currentAntibiotic['antibiotic'] = $value; break; // Kode Antibiotik
+ case 'a2': $currentAntibiotic['resistance'] = $value; break; // Nama Antibiotik
+ case 'a3': $currentAntibiotic['value'] = $value; break; // Nilai MIC
+ case 'a4': $currentAntibiotic['interpretation'] = $value; break; // Interpretasi
+ case 'an':
+ // Jika 'an' ada, ini adalah interpretasi final, timpa yang sebelumnya.
+ $currentAntibiotic['interpretation'] = $value;
+ break;
+
+ // == Metadata Lainnya (opsional) ==
+ case 'ii': $resultSample->version_number = $value; break;
+ case 'is': $resultSample->isolate_number = $value; break;
}
}
-
- //$resultSample->specimen_type = $parsedData['specimen_type'] ?? null; // Could be inferred
- //$resultSample->test_id = $parsedData['test_id'] ?? null;
- // Result Record
-
- $resultSample->additional_result = json_encode($parsedData['antibiotics']);
+ // Penting: Simpan blok antibiotik TERAKHIR setelah loop selesai
+ if (!empty($currentAntibiotic)) {
+ $antibioticResults[] = $currentAntibiotic;
+ }
+
+ $resultSample->sender_name = $alat ?? 'VITEK'; // Pastikan var $alat ada
+ $resultSample->additional_result = json_encode($antibioticResults);
// Menyimpan data yang sudah diparse
$resultSample->save();
- Log::info("Data MTRL Berhasil di Parse dan di simpan ", $resultSample->toArray());
+ Log::info("Data MTRSL successfully parsed and saved.", $resultSample->toArray());
return response()->json(['message' => 'Data berhasil diproses dan disimpan.']);
} else {
$headerData = explode("|", $response);
diff --git a/htdocs/database/migrations/2024_11_14_093751_create_periksa_table.php b/htdocs/database/migrations/2024_11_14_093751_create_periksa_table.php
index dfcea1ce..f418dad0 100644
--- a/htdocs/database/migrations/2024_11_14_093751_create_periksa_table.php
+++ b/htdocs/database/migrations/2024_11_14_093751_create_periksa_table.php
@@ -50,7 +50,7 @@ return new class extends Migration
$table->string('nmanalis', 250)->nullable();
$table->string('nmexcutor', 250)->nullable();
$table->string('klinisi', 250)->nullable();
- $table->string('klinis', 250)->nullable();
+ $table->mediumText('klinis')->nullable();
$table->integer('poli_id')->nullable();
$table->text('keterangan')->nullable();
$table->text('kesimpulan')->nullable();
diff --git a/htdocs/resources/views/admin/rekapantibiotik.blade.php b/htdocs/resources/views/admin/rekapantibiotik.blade.php
index fbd4cd03..154551ce 100644
--- a/htdocs/resources/views/admin/rekapantibiotik.blade.php
+++ b/htdocs/resources/views/admin/rekapantibiotik.blade.php
@@ -37,9 +37,9 @@
bhp_antibiotiktambahan |
id_esbl |
id_mrsa |
- @if(isset($jsonantibiotik) && !empty($jsonantibiotik))
- @foreach($jsonantibiotik->first() as $antibiotic)
- {{ $antibiotic->antibiotic }} |
+ @if(isset($masterAntibioticList))
+ @foreach($masterAntibioticList as $antibioticName)
+ {{ strtoupper($antibioticName) }} |
@endforeach
@endif
@@ -72,12 +72,16 @@
{{ $data->bhp_antibiotiktambahan}} |
{{ $data->id_esbl}} |
{{ $data->id_mrsa}} |
- @if(isset($jsonantibiotik[$data->id]) && !empty($jsonantibiotik[$data->id]))
- @foreach($jsonantibiotik[$data->id] as $antibiotic)
- {{ $antibiotic->interpretation }} |
+ @php
+ $patientResults = $jsonantibiotik->get($data->id);
+ @endphp
+
+ @if(isset($masterAntibioticList))
+ @foreach($masterAntibioticList as $antibioticName)
+
+ {{ $patientResults[$antibioticName] ?? '-' }}
+ |
@endforeach
- @else
- |
@endif
@endforeach
diff --git a/htdocs/resources/views/dokter/pemeriksaan.blade.php b/htdocs/resources/views/dokter/pemeriksaan.blade.php
index 31ea13ba..2f3ce6ba 100644
--- a/htdocs/resources/views/dokter/pemeriksaan.blade.php
+++ b/htdocs/resources/views/dokter/pemeriksaan.blade.php
@@ -2069,6 +2069,7 @@
@push('script')