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
+
+
+
+
+ | No |
+ Waktu Cetak |
+ Petugas |
+ Jumlah Row |
+ Aksi |
+
+
+
+ @forelse(($printHistories ?? []) as $idx => $history)
+
+ | {{ $idx + 1 }} |
+ {{ $history['printed_at_label'] }} |
+ {{ $history['printed_by_name'] }} |
+ {{ $history['total_rows'] }} |
+
+
+ |
+
+ @empty
+
+ | Belum ada riwayat cetak. |
+
+ @endforelse
+
+
+
+
@@ -100,7 +135,7 @@
@endphp
|
-
+
|
@if($isPrinted)
@@ -145,14 +180,150 @@
var printOrientation = document.getElementById('printOrientation');
var sortStatus = document.getElementById('sortStatus');
var filterStatus = document.getElementById('filterStatus');
+ var printHistoryBody = document.getElementById('printHistoryBody');
var token = document.getElementById('token').value;
var markPrintedUrl = @json(route('markRekapPenerimaanSamplePrinted'));
+ var selectedTanggal = @json($tanggal);
+ var printHistories = @json($printHistories ?? []);
+ var printHistoryMap = {};
var appName = @json(config('global.namaapps'));
var appDomain = @json(config('global.domainapps'));
var appSubDomain = @json(config('global.subdomainapps'));
var appSubSubDomain = @json(config('global.subsubdomainapps'));
var appAddress = @json(config('global.addressapps'));
var petugasCetak = @json(Session('nama'));
+ printHistories.forEach(function(item) {
+ printHistoryMap[String(item.id)] = item.rows_payload || [];
+ });
+
+ function renderHistoryNumbers() {
+ if (!printHistoryBody) {
+ return;
+ }
+ var rows = printHistoryBody.querySelectorAll('tr[data-history-id]');
+ rows.forEach(function(row, idx) {
+ var firstCell = row.querySelector('td');
+ if (firstCell) {
+ firstCell.innerText = idx + 1;
+ }
+ });
+ }
+
+ function addHistoryRow(history) {
+ if (!printHistoryBody || !history) {
+ return;
+ }
+ var emptyRow = document.getElementById('emptyHistoryRow');
+ if (emptyRow) {
+ emptyRow.remove();
+ }
+
+ printHistoryMap[String(history.id)] = history.rows_payload || [];
+ var tr = document.createElement('tr');
+ tr.setAttribute('data-history-id', history.id);
+ tr.innerHTML = ''
+ + ' | 1 | '
+ + '' + (history.printed_at_label || '-') + ' | '
+ + '' + (history.printed_by_name || '-') + ' | '
+ + '' + (history.total_rows || 0) + ' | '
+ + ' | ';
+ 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 += '
'
+ + '| ' + (rowData.noregister || '') + ' | '
+ + '' + (rowData.nmpasien || '') + ' | '
+ + '' + (rowData.nofoto || '') + ' | '
+ + '' + (rowData.asalpasien || '') + ' | '
+ + '' + (rowData.daftar || '') + ' | '
+ + '' + (rowData.reques || '') + ' | '
+ + '' + (rowData.kd_spesimen || '') + ' | '
+ + '' + (rowData.nm_spesimen || '') + ' | '
+ + '' + (rowData.status || '') + ' | '
+ + '' + (rowData.tgldraft || '') + ' | '
+ + '' + (rowData.petugas || '') + ' | '
+ + '
';
+ });
+
+ var html = ''
+ + ''
+ + 'Cetak Rekap Penerimaan Sample'
+ + ''
+ + ''
+ + 'Rekapitulasi Penerimaan Sample {{$tanggal}}
'
+ + ''
+ + ''
+ + ''
+ + '| No.RM | '
+ + 'Nama | '
+ + 'No.Sample | '
+ + 'Asal Pasien | '
+ + 'Daftar | '
+ + 'Order | '
+ + 'Kode | '
+ + 'Spesimen | '
+ + 'Status | '
+ + 'Tanggal Terima | '
+ + 'Petugas | '
+ + '
'
+ + '' + rowsHtml + ''
+ + '
'
+ + '
@endpush