diff --git a/htdocs/app/Http/Controllers/ReportController.php b/htdocs/app/Http/Controllers/ReportController.php index 2e797f2d..117ddd21 100644 --- a/htdocs/app/Http/Controllers/ReportController.php +++ b/htdocs/app/Http/Controllers/ReportController.php @@ -885,4 +885,63 @@ class ReportController extends Controller 'detail' => $periksa ]); } + public function markRekapPenerimaanSamplePrinted(Request $request) { + $userId = Session::get('id'); + $userNama = Session::get('nama'); + if (empty($userId)) { + return response()->json([ + 'status' => 'error', + 'message' => 'Session login tidak valid.' + ], 401); + } + + $ids = $request->input('ids', []); + if (!is_array($ids) || count($ids) === 0) { + return response()->json([ + 'status' => 'error', + 'message' => 'Data yang dipilih tidak valid.' + ], 422); + } + + $ids = collect($ids) + ->filter(function ($id) { + return is_numeric($id); + }) + ->map(function ($id) { + return intval($id); + }) + ->unique() + ->values() + ->toArray(); + + if (count($ids) === 0) { + return response()->json([ + 'status' => 'error', + 'message' => 'Data yang dipilih tidak valid.' + ], 422); + } + + $printableIds = Periksa::whereIn('id', $ids) + ->where(function ($query) { + $query->whereNull('ppdsjunior2') + ->orWhere('ppdsjunior2', '') + ->orWhere('ppdsjunior2', '0'); + }) + ->pluck('id') + ->toArray(); + + if (count($printableIds) > 0) { + Periksa::whereIn('id', $printableIds)->update([ + 'ppdsjunior2' => $userId, + 'updated_at' => date('Y-m-d H:i:s'), + ]); + } + + return response()->json([ + 'status' => 'success', + 'message' => 'Status cetak berhasil diperbarui.', + 'affected_ids'=> $printableIds, + 'printed_by' => $userNama + ]); + } } diff --git a/htdocs/resources/views/cetak/rekappenerimaansample.blade.php b/htdocs/resources/views/cetak/rekappenerimaansample.blade.php index 794525f8..06c69c84 100644 --- a/htdocs/resources/views/cetak/rekappenerimaansample.blade.php +++ b/htdocs/resources/views/cetak/rekappenerimaansample.blade.php @@ -1,5 +1,44 @@ @extends('base.layout') @section('content') +
@@ -8,19 +47,23 @@
Rekapitulasi Penerimaan Sample {{$tanggal}}

- - - +
+ + + +
+
+ @@ -37,9 +80,19 @@ @foreach($detail as $r) - + @php + $isPrinted = !empty($r['ppdsjunior2']) && $r['ppdsjunior2'] != '0'; + @endphp + + @@ -51,7 +104,7 @@ -
Keterangan Cetak No.RM Nama No.Sample
- + + {{ $r['noregister'] }} {{ $r['nmpasien'] }}{{ $r['nm_spesimen'] }} {{ $r['status'] }} {{ $r['tgldraft'] }} + @php $petugas = ''; if ($r['nmppdsmiddle2'] != '') { @@ -68,6 +121,7 @@
+
@@ -85,6 +139,8 @@ var table = document.getElementById('penerimaansamplereport'); var checkAllRows = document.getElementById('checkAllRows'); var printOrientation = document.getElementById('printOrientation'); + var token = document.getElementById('token').value; + var markPrintedUrl = @json(route('markRekapPenerimaanSamplePrinted')); var appName = @json(config('global.namaapps')); var appDomain = @json(config('global.domainapps')); var appSubDomain = @json(config('global.subdomainapps')); @@ -92,14 +148,30 @@ var appAddress = @json(config('global.addressapps')); var petugasCetak = @json(Session('nama')); + function updateCheckAllState() { + if (!table || !checkAllRows) { + return; + } + var rowChecks = table.querySelectorAll('tbody .row-check:not(:disabled)'); + var checkedRows = table.querySelectorAll('tbody .row-check:not(:disabled):checked'); + checkAllRows.checked = rowChecks.length > 0 && rowChecks.length === checkedRows.length; + } + if (checkAllRows && table) { checkAllRows.addEventListener('change', function() { - var rowChecks = table.querySelectorAll('tbody .row-check'); + var rowChecks = table.querySelectorAll('tbody .row-check:not(:disabled)'); rowChecks.forEach(function(cb) { cb.checked = checkAllRows.checked; }); }); + + table.addEventListener('change', function(e) { + if (e.target && e.target.classList.contains('row-check')) { + updateCheckAllState(); + } + }); } + updateCheckAllState(); document.getElementById('btnexport').addEventListener('click', function() { var table = document.getElementById('penerimaansamplereport'); @@ -118,13 +190,19 @@ var selectedRows = table.querySelectorAll('tbody tr'); var printedRows = []; + var selectedIds = []; + var selectedRowElements = []; selectedRows.forEach(function(row) { var rowCheck = row.querySelector('.row-check'); if (rowCheck && rowCheck.checked) { var cells = row.querySelectorAll('td'); + var rowId = parseInt(row.getAttribute('data-id'), 10); + if (!isNaN(rowId)) { + selectedIds.push(rowId); + selectedRowElements.push(row); + } printedRows.push([ - cells[1] ? cells[1].innerText : '', cells[2] ? cells[2].innerText : '', cells[3] ? cells[3].innerText : '', cells[4] ? cells[4].innerText : '', @@ -134,89 +212,133 @@ cells[8] ? cells[8].innerText : '', cells[9] ? cells[9].innerText : '', cells[10] ? cells[10].innerText : '', - cells[11] ? cells[11].innerText : '' + cells[11] ? cells[11].innerText : '', + cells[12] ? cells[12].innerText : '' ]); } }); - if (printedRows.length === 0) { + if (printedRows.length === 0 || selectedIds.length === 0) { alert('Pilih minimal satu baris untuk dicetak.'); 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' - }); + $.post(markPrintedUrl, { ids: selectedIds, _token: token }, function(resp) { + if (!resp || resp.status !== 'success') { + alert((resp && resp.message) ? resp.message : 'Gagal memperbarui status cetak.'); + return; + } - 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.forEach(function(value) { - rowsHtml += '' + value + ''; + var affectedIds = Array.isArray(resp.affected_ids) ? resp.affected_ids : []; + var affectedMap = {}; + affectedIds.forEach(function(id) { + affectedMap[String(id)] = true; }); - rowsHtml += ''; + + selectedRowElements.forEach(function(row) { + var id = row.getAttribute('data-id'); + if (affectedMap[id]) { + row.classList.add('printed-row'); + var rowCheck = row.querySelector('.row-check'); + if (rowCheck) { + rowCheck.checked = false; + rowCheck.disabled = true; + } + var statusCell = row.querySelector('.print-status-cell'); + if (statusCell) { + statusCell.innerHTML = 'Sudah Dicetak'; + } + var petugasCell = row.querySelector('.petugas-cell'); + if (petugasCell && (!petugasCell.innerText || petugasCell.innerText.trim() === '')) { + petugasCell.innerText = resp.printed_by || petugasCetak || '-'; + } + } + }); + + checkAllRows.checked = false; + updateCheckAllState(); + + 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.forEach(function(value) { + rowsHtml += '' + value + ''; + }); + rowsHtml += ''; + }); + + var html = '' + + '' + + 'Cetak Rekap Penerimaan Sample' + + '' + + '
' + + '

' + (appName || '') + '

' + + '
' + (appDomain || '') + '
' + + '
' + (appSubDomain || '') + ', ' + (appSubSubDomain || '') + '
' + + '
' + (appAddress || '') + '
' + + '
' + + '
Rekapitulasi Penerimaan Sample {{$tanggal}}
' + + '
' + + '
Tanggal Cetak: ' + tanggalCetak + '
' + + '
Petugas: ' + (petugasCetak || '-') + '
' + + '
' + + '' + + '' + + '' + + '' + + '' + + '' + + '' + + '' + + '' + + '' + + '' + + '' + + '' + + '' + + '' + rowsHtml + '' + + '
No.RMNamaNo.SampleAsal PasienDaftarOrderKodeSpesimenStatusTanggal TerimaPetugas
' + + ' diff --git a/htdocs/routes/web.php b/htdocs/routes/web.php index 6c841a07..dc4638de 100644 --- a/htdocs/routes/web.php +++ b/htdocs/routes/web.php @@ -138,6 +138,7 @@ Route::group(['middleware' => 'project.ipg'], function() { Route::get('znreport', [ReportController::class, 'genZNreport']); Route::get('tatreport', [ReportController::class, 'genTATreport']); Route::get('reportpenerimaansample', [ReportController::class, 'genRekapPenerimaanSample']); + Route::post('reportpenerimaansample/mark-printed', [ReportController::class, 'markRekapPenerimaanSamplePrinted'])->name('markRekapPenerimaanSamplePrinted'); Route::get('/glass-report/export', [ReportController::class, 'exportGlassReport'])->name('exportGlassReport'); Route::get('rekap-antibiotik/export', [ReportController::class, 'exportRekapAntibiotik'])->name('exportRekapAntibiotik'); Route::get('list', [ListController::class, 'index']);