From 5f37ce8def766514e00793e2a5c055f4f58eb110 Mon Sep 17 00:00:00 2001 From: Dwi Swandhana Date: Fri, 6 Mar 2026 12:58:40 +0700 Subject: [PATCH] update --- .../Http/Controllers/FrontpageController.php | 11 +- .../app/Http/Controllers/ReportController.php | 82 ++++- .../app/RekapPenerimaanSamplePrintHistory.php | 11 + ...enerimaan_sample_print_histories_table.php | 34 +++ .../cetak/rekappenerimaansample.blade.php | 280 +++++++++++++----- 5 files changed, 333 insertions(+), 85 deletions(-) create mode 100644 htdocs/app/RekapPenerimaanSamplePrintHistory.php create mode 100644 htdocs/database/migrations/2026_03_06_000007_create_rekap_penerimaan_sample_print_histories_table.php diff --git a/htdocs/app/Http/Controllers/FrontpageController.php b/htdocs/app/Http/Controllers/FrontpageController.php index 9da6addd..023f89f2 100644 --- a/htdocs/app/Http/Controllers/FrontpageController.php +++ b/htdocs/app/Http/Controllers/FrontpageController.php @@ -89,13 +89,10 @@ class FrontpageController extends Controller 'poli.subpoli', 'poli.modaliti2' ) - ->where(function($q) { - $q->whereNull('periksa.status') - ->orWhere(function($sub) { - $sub->where('periksa.status', '<>', 'Selesai') - ->where('periksa.status', 'not like', 'Dibatalkan%'); - }); - }) + ->whereNotNull('periksa.status') + ->where('periksa.status', '<>', '') + ->whereRaw('LOWER(periksa.status) <> ?', ['selesai']) + ->whereRaw('LOWER(periksa.status) not like ?', ['%dibatalkan%']) ->whereNotNull('periksa.daftar') ->orderBy('periksa.daftar', 'ASC') ->get(); diff --git a/htdocs/app/Http/Controllers/ReportController.php b/htdocs/app/Http/Controllers/ReportController.php index 213d4e42..8ebe9a89 100644 --- a/htdocs/app/Http/Controllers/ReportController.php +++ b/htdocs/app/Http/Controllers/ReportController.php @@ -14,6 +14,7 @@ use App\Jadwalperiksa; use App\Riwayat; use App\RekapAntibiotik; use App\Organisms; +use App\RekapPenerimaanSamplePrintHistory; use DateTime; use Carbon\Carbon; use Session; @@ -880,9 +881,30 @@ class ReportController extends Controller if ($periksa->count() == 0) { return response()->json([]); } + $histories = RekapPenerimaanSamplePrintHistory::whereDate('tanggal', $tanggal) + ->orderBy('printed_at', 'DESC') + ->orderBy('id', 'DESC') + ->get() + ->map(function ($h) { + $rowIds = json_decode($h->row_ids, true); + $rowsPayload = json_decode($h->rows_payload, true); + return [ + 'id' => $h->id, + 'printed_by_id' => $h->printed_by_id, + 'printed_by_name' => $h->printed_by_name, + 'printed_at' => $h->printed_at, + 'printed_at_label' => $h->printed_at ? Carbon::parse($h->printed_at)->format('Y-m-d H:i:s') : '-', + 'row_ids' => is_array($rowIds) ? $rowIds : [], + 'rows_payload' => is_array($rowsPayload) ? $rowsPayload : [], + 'total_rows' => is_array($rowIds) ? count($rowIds) : 0, + ]; + }) + ->values(); + return view('cetak.rekappenerimaansample', [ 'tanggal' => $tanggal, - 'detail' => $periksa + 'detail' => $periksa, + 'printHistories' => $histories ]); } public function markRekapPenerimaanSamplePrinted(Request $request) { @@ -920,6 +942,8 @@ class ReportController extends Controller 'message' => 'Data yang dipilih tidak valid.' ], 422); } + $tanggal = $request->input('tanggal'); + $tanggal = !empty($tanggal) ? $tanggal : null; $printableIds = Periksa::whereIn('id', $ids) ->where(function ($query) { @@ -929,18 +953,72 @@ class ReportController extends Controller ->pluck('id') ->toArray(); + if (count($printableIds) === 0) { + return response()->json([ + 'status' => 'error', + 'message' => 'Semua data yang dipilih sudah pernah dicetak.' + ], 422); + } + + $rowsToPrint = Periksa::whereIn('id', $printableIds) + ->orderBy('id', 'ASC') + ->get() + ->map(function ($row) { + $petugas = trim(($row->nmppdsmiddle2 ?? '').' '.($row->nmppdsjunior2 ?? '')); + return [ + 'id' => $row->id, + 'noregister' => $row->noregister ?? '', + 'nmpasien' => $row->nmpasien ?? '', + 'nofoto' => $row->nofoto ?? '', + 'asalpasien' => $row->asalpasien ?? '', + 'daftar' => $row->daftar ?? '', + 'reques' => $row->reques ?? '', + 'kd_spesimen' => $row->kd_spesimen ?? '', + 'nm_spesimen' => $row->nm_spesimen ?? '', + 'status' => $row->status ?? '', + 'tgldraft' => $row->tgldraft ?? '', + 'petugas' => $petugas, + ]; + }) + ->values() + ->toArray(); + if (count($printableIds) > 0) { Periksa::whereIn('id', $printableIds)->update([ 'ppdsjunior2' => $userId, + 'nmppdsjunior2' => $userNama, 'updated_at' => date('Y-m-d H:i:s'), ]); } + $history = RekapPenerimaanSamplePrintHistory::create([ + 'tanggal' => $tanggal, + 'printed_by_id' => $userId, + 'printed_by_name' => $userNama, + 'printed_at' => Carbon::now()->format('Y-m-d H:i:s'), + 'row_ids' => json_encode(array_values($printableIds)), + 'rows_payload' => json_encode($rowsToPrint), + 'created_at' => date('Y-m-d H:i:s'), + 'updated_at' => date('Y-m-d H:i:s'), + ]); + + $historyResponse = [ + 'id' => $history->id, + 'printed_by_id' => $history->printed_by_id, + 'printed_by_name' => $history->printed_by_name, + 'printed_at' => $history->printed_at, + 'printed_at_label' => Carbon::parse($history->printed_at)->format('Y-m-d H:i:s'), + 'row_ids' => $printableIds, + 'rows_payload' => $rowsToPrint, + 'total_rows' => count($printableIds), + ]; + return response()->json([ 'status' => 'success', 'message' => 'Status cetak berhasil diperbarui.', 'affected_ids'=> $printableIds, - 'printed_by' => $userNama + 'printed_by' => $userNama, + 'history' => $historyResponse ]); } } diff --git a/htdocs/app/RekapPenerimaanSamplePrintHistory.php b/htdocs/app/RekapPenerimaanSamplePrintHistory.php new file mode 100644 index 00000000..e3498744 --- /dev/null +++ b/htdocs/app/RekapPenerimaanSamplePrintHistory.php @@ -0,0 +1,11 @@ +id(); + $table->date('tanggal')->nullable(); + $table->integer('printed_by_id')->nullable(); + $table->string('printed_by_name', 250)->nullable(); + $table->timestamp('printed_at')->nullable(); + $table->text('row_ids')->nullable(); + $table->longText('rows_payload')->nullable(); + $table->timestamp('created_at')->useCurrent(); + $table->timestamp('updated_at')->useCurrent(); + }); + } + + /** + * Reverse the migrations. + */ + public function down(): void + { + Schema::dropIfExists('rekap_penerimaan_sample_print_histories'); + } +}; diff --git a/htdocs/resources/views/cetak/rekappenerimaansample.blade.php b/htdocs/resources/views/cetak/rekappenerimaansample.blade.php index 5e2106ed..ca826afd 100644 --- a/htdocs/resources/views/cetak/rekappenerimaansample.blade.php +++ b/htdocs/resources/views/cetak/rekappenerimaansample.blade.php @@ -63,6 +63,41 @@ +
+
Riwayat Cetak
+
+ + + + + + + + + + + + @forelse(($printHistories ?? []) as $idx => $history) + + + + + + + + @empty + + + + @endforelse + +
NoWaktu CetakPetugasJumlah RowAksi
{{ $idx + 1 }}{{ $history['printed_at_label'] }}{{ $history['printed_by_name'] }}{{ $history['total_rows'] }} + +
Belum ada riwayat cetak.
+
+
@@ -100,7 +135,7 @@ @endphp ' + + '' + + '' + + '' + + ''; + if (printHistoryBody.firstChild) { + printHistoryBody.insertBefore(tr, printHistoryBody.firstChild); + } else { + printHistoryBody.appendChild(tr); + } + renderHistoryNumbers(); + } + + function openPrintWindowFromRows(printedRows) { + if (!printedRows || printedRows.length === 0) { + alert('Data riwayat cetak tidak ditemukan.'); + return; + } + + var now = new Date(); + var orientation = printOrientation ? printOrientation.value : 'landscape'; + var tanggalCetak = now.toLocaleString('id-ID', { + year: 'numeric', + month: '2-digit', + day: '2-digit', + hour: '2-digit', + minute: '2-digit', + second: '2-digit' + }); + + var printWindow = window.open('', '_blank'); + if (!printWindow) { + alert('Pop-up diblokir browser. Izinkan pop-up untuk mencetak.'); + return; + } + + var rowsHtml = ''; + printedRows.forEach(function(rowData) { + rowsHtml += '' + + '' + + '' + + '' + + '' + + '' + + '' + + '' + + '' + + '' + + '' + + '' + + ''; + }); + + var html = '' + + '' + + 'Cetak Rekap Penerimaan Sample' + + '' + + '
' + + '

' + (appName || '') + '

' + + '
' + (appDomain || '') + '
' + + '
' + (appSubDomain || '') + ', ' + (appSubSubDomain || '') + '
' + + '
' + (appAddress || '') + '
' + + '
' + + '
Rekapitulasi Penerimaan Sample {{$tanggal}}
' + + '
' + + '
Tanggal Cetak: ' + tanggalCetak + '
' + + '
Petugas: ' + (petugasCetak || '-') + '
' + + '
' + + '
- + 1' + (history.printed_at_label || '-') + '' + (history.printed_by_name || '-') + '' + (history.total_rows || 0) + '
' + (rowData.noregister || '') + '' + (rowData.nmpasien || '') + '' + (rowData.nofoto || '') + '' + (rowData.asalpasien || '') + '' + (rowData.daftar || '') + '' + (rowData.reques || '') + '' + (rowData.kd_spesimen || '') + '' + (rowData.nm_spesimen || '') + '' + (rowData.status || '') + '' + (rowData.tgldraft || '') + '' + (rowData.petugas || '') + '
' + + '' + + '' + + '' + + '' + + '' + + '' + + '' + + '' + + '' + + '' + + '' + + '' + + '' + + '' + rowsHtml + '' + + '
No.RMNamaNo.SampleAsal PasienDaftarOrderKodeSpesimenStatusTanggal TerimaPetugas
' + + ' @endpush