MIF_E31231302_WEBSITE/app/Http/Controllers/Api/SkriningController.php

504 lines
17 KiB
PHP

<?php
namespace App\Http\Controllers\Api;
use App\Http\Controllers\Controller;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\DB;
use Carbon\Carbon;
use Maatwebsite\Excel\Facades\Excel;
use App\Exports\SkriningExport;
class SkriningController extends Controller
{
public function indexWeb(Request $request)
{
$status = $request->query('hasil_skrining');
$fasyankes_filter = $request->query('fasyankes');
$tgl_mulai = $request->query('tgl_mulai');
$tgl_selesai = $request->query('tgl_selesai');
$search = $request->query('search');
$role = session('role');
$fasyankes_petugas = session('fasyankes');
$fasyankes_list = DB::table('fasyankes')
->select('nama_fasyankes')
->distinct()
->get();
// FIX UTAMA: WAJIB LEFT JOIN
$query = DB::table('skrining')
->leftJoin('users', 'skrining.id_user', '=', 'users.id_user')
->select(
'skrining.*',
DB::raw("COALESCE(users.nama_lengkap, 'Pengguna Umum') as nama_lengkap"),
'users.nik',
'users.alamat',
'users.no_telp',
'users.jenis_kelamin',
'users.tgl_lahir',
'users.nama_fasyankes'
);
// FILTER KEAMANAN
if ($role !== 'super_admin') {
if (empty($fasyankes_petugas)) {
$petugas = DB::table('petugas')
->leftJoin('fasyankes', 'petugas.id_fasyankes', '=', 'fasyankes.id_fasyankes')
->where('petugas.id_petugas', session('petugas_id'))
->select('fasyankes.nama_fasyankes')
->first();
if ($petugas && !empty($petugas->nama_fasyankes)) {
$fasyankes_petugas = $petugas->nama_fasyankes;
}
}
if (empty($fasyankes_petugas)) {
$query->whereRaw('1 = 0');
} else {
$query->where('users.nama_fasyankes', 'like', '%' . trim($fasyankes_petugas) . '%');
}
} else {
if (!empty($fasyankes_filter)) {
$query->where('users.nama_fasyankes', 'like', '%' . trim($fasyankes_filter) . '%');
}
}
// FILTER STATUS
if (!empty($status)) {
$query->where('skrining.hasil_skrining', $status);
}
// FILTER TANGGAL
if (!empty($tgl_mulai) && !empty($tgl_selesai)) {
$query->whereDate('skrining.tgl_skrining', '>=', $tgl_mulai)
->whereDate('skrining.tgl_skrining', '<=', $tgl_selesai);
}
// FILTER SEARCH
if (!empty($search)) {
$query->where(function ($q) use ($search) {
$q->where('users.nama_lengkap', 'like', "%{$search}%")
->orWhere('users.nik', 'like', "%{$search}%");
});
}
$skrining = $query->orderBy('skrining.tgl_skrining', 'desc')
->paginate(20)
->appends($request->all());
return view('skrining', compact('skrining', 'fasyankes_list'));
}
public function store(Request $request)
{
$request->validate([
'id_user' => 'required',
'hasil_skrining' => 'required'
]);
try {
// ===================================================
// CEK SKRINING TERAKHIR (BATAS 1 BULAN)
// ===================================================
$skriningTerakhir = DB::table('skrining')
->where('id_user', $request->id_user)
->orderBy('tgl_skrining', 'desc')
->first();
if ($skriningTerakhir) {
$tanggalTerakhir = Carbon::parse(
$skriningTerakhir->tgl_skrining
);
$bolehSkriningLagi = $tanggalTerakhir
->copy()
->addMonth();
if (Carbon::now()->lt($bolehSkriningLagi)) {
return response()->json([
'status' => 'warning',
'message' => 'Skrining hanya dapat dilakukan 1 bulan sekali.',
'next_skrining' => $bolehSkriningLagi
->translatedFormat('d F Y')
], 403);
}
}
// ===================================================
// SIMPAN DATA SKRINING
// ===================================================
DB::table('skrining')->insert([
'id_user' => $request->id_user,
'tgl_skrining' => Carbon::now(),
'jwb_batuk' => $request->jwb_batuk,
'jwb_batuk_lain' => $request->jwb_batuk_lain,
'jwb_berat_badan' => $request->jwb_berat_badan,
'jwb_demam' => $request->jwb_demam,
'jwb_keringat_malam' => $request->jwb_keringat_malam,
'jwb_pembesaran_kelenjar' => $request->jwb_pembesaran_kelenjar,
'hasil_skrining' => $request->hasil_skrining,
]);
return response()->json([
'status' => 'success',
'message' => 'Data berhasil disimpan'
], 201);
} catch (\Exception $e) {
return response()->json([
'status' => 'error',
'message' => $e->getMessage()
], 500);
}
}
/**
* UNTUK MOBILE (API: Ambil Riwayat Per User)
*/
public function index(Request $request)
{
$id_user = $request->query('id_user');
if (!$id_user) {
return response()->json([
'message' => 'ID User tidak ditemukan'
], 400);
}
$riwayat = DB::table('skrining')
->where('id_user', $id_user)
->orderBy('tgl_skrining', 'desc')
->get();
return response()->json($riwayat, 200);
}
public function export(Request $request)
{
// 1. Ambil data identitas dari Session
$role_user = session('role');
$fasyankes_user = session('fasyankes');
// 2. Ambil parameter filter dari Request
$hasil_skrining = $request->query('hasil_skrining');
$fasyankes_filter = $request->query('fasyankes');
$tgl_mulai = $request->query('tgl_mulai');
$tgl_selesai = $request->query('tgl_selesai');
$search = $request->query('search');
// 3. Bangun Query Utama
$query = DB::table('skrining')
->leftJoin('users', 'skrining.id_user', '=', 'users.id_user')
->select(
'users.nama_lengkap',
'users.nik',
'users.alamat',
'users.no_telp',
'users.nama_fasyankes',
'skrining.tgl_skrining',
'skrining.hasil_skrining',
'skrining.jwb_batuk',
'skrining.jwb_keringat_malam',
'skrining.jwb_demam',
'skrining.jwb_batuk_lain',
'skrining.jwb_pembesaran_kelenjar',
'skrining.jwb_berat_badan'
);
// ===================================================
// FILTER KEAMANAN EXPORT
// ===================================================
if ($role_user !== 'super_admin') {
if (empty($fasyankes_user)) {
$query->whereRaw('1 = 0');
} else {
$query->where('users.nama_fasyankes', $fasyankes_user);
}
} else {
if (!empty($fasyankes_filter)) {
$query->where('users.nama_fasyankes', $fasyankes_filter);
}
}
// ===================================================
// FILTER PENCARIAN
// ===================================================
if (!empty($hasil_skrining)) {
$query->where('skrining.hasil_skrining', $hasil_skrining);
}
if (!empty($tgl_mulai) && !empty($tgl_selesai)) {
$query->whereDate('skrining.tgl_skrining', '>=', $tgl_mulai)
->whereDate('skrining.tgl_skrining', '<=', $tgl_selesai);
}
if (!empty($search)) {
$query->where(function ($q) use ($search) {
$q->where('users.nama_lengkap', 'like', "%{$search}%")
->orWhere('users.nik', 'like', "%{$search}%");
});
}
// 6. Eksekusi Query
$results = $query->orderBy('skrining.tgl_skrining', 'desc')->get();
// 7. Export Excel (.xls)
$filename = "Laporan_Skrining_" . date('Ymd_His') . ".xls";
header("Content-Type: application/vnd.ms-excel");
header("Content-Disposition: attachment; filename=\"$filename\"");
header("Pragma: no-cache");
header("Expires: 0");
echo '<table border="1">';
echo '<tr>
<th style="background-color:#c40000; color:white;">Nama Pasien</th>
<th style="background-color:#c40000; color:white;">NIK</th>
<th style="background-color:#c40000; color:white;">Alamat</th>
<th style="background-color:#c40000; color:white;">No. Telp</th>
<th style="background-color:#c40000; color:white;">Fasyankes</th>
<th style="background-color:#c40000; color:white;">Tgl Skrining</th>
<th style="background-color:#c40000; color:white;">Hasil</th>
<th style="background-color:#f2f2f2;">Batuk</th>
<th style="background-color:#f2f2f2;">Batuk Lain</th>
<th style="background-color:#f2f2f2;">Keringat Malam</th>
<th style="background-color:#f2f2f2;">Demam</th>
<th style="background-color:#f2f2f2;">BB Turun</th>
<th style="background-color:#f2f2f2;">Pembesaran Kelenjar</th>
</tr>';
if ($results->count() > 0) {
foreach ($results as $row) {
echo '<tr>
<td>' . $row->nama_lengkap . '</td>
<td>' . "'" . $row->nik . '</td>
<td>' . $row->alamat . '</td>
<td>' . $row->no_telp . '</td>
<td>' . ($row->nama_fasyankes ?? '-') . '</td>
<td>' . date('d/m/Y H:i', strtotime($row->tgl_skrining)) . '</td>
<td>' . $row->hasil_skrining . '</td>
<td>' . ($row->jwb_batuk == 1 ? 'Ya' : 'Tidak') . '</td>
<td>' . ($row->jwb_batuk_lain == 1 ? 'Ya' : 'Tidak') . '</td>
<td>' . ($row->jwb_keringat_malam == 1 ? 'Ya' : 'Tidak') . '</td>
<td>' . ($row->jwb_demam == 1 ? 'Ya' : 'Tidak') . '</td>
<td>' . ($row->jwb_berat_badan == 1 ? 'Ya' : 'Tidak') . '</td>
<td>' . ($row->jwb_pembesaran_kelenjar == 1 ? 'Ya' : 'Tidak') . '</td>
</tr>';
}
} else {
echo '<tr><td colspan="13" style="text-align:center;">Data tidak ditemukan</td></tr>';
}
echo '</table>';
// 8. Log Aktivitas
DB::table('log_aktivitas')->insert([
'id_petugas' => session('petugas_id'),
'aktivitas' => 'Export Excel Data Skrining',
'created_at' => now(),
'updated_at' => now()
]);
exit;
}
public function jadikanPasien(Request $request, $id)
{
$dataSkrining = DB::table('skrining')
->leftJoin('users', 'skrining.id_user', '=', 'users.id_user')
->where('skrining.id_skrining', $id)
->select(
'skrining.id_skrining',
'skrining.id_user',
'users.nama_lengkap',
'users.nik',
'users.nama_fasyankes'
)
->first();
if (!$dataSkrining) {
return response()->json([
'message' => 'Data skrining tidak ditemukan!'
], 404);
}
if (!$dataSkrining->id_user) {
return response()->json([
'message' => 'User skrining tidak valid!'
], 422);
}
// VALIDASI DATA MEDIS SAJA
$request->validate([
'tgl_mulai' => 'required|date|before_or_equal:today',
'tgl_estimasi_selesai' => 'required|date',
'jam_minum' => 'required',
'diagnosa' => 'nullable|string',
]);
// CEK APAKAH SUDAH ADA DI PASIEN_MEDIS
$cekPasienMedis = DB::table('pasien_medis')
->where('id_user', $dataSkrining->id_user)
->first();
if ($cekPasienMedis) {
return response()->json([
'status' => 'warning',
'message' => $dataSkrining->nama_lengkap . ' sudah menjadi pasien.'
], 409);
}
if ($request->hasFile('file_lab')) {
foreach ($request->file('file_lab') as $file) {
$path = $file->store('lab', 'public');
DB::table('file_pasien')->insert([
'id_user' => $dataSkrining->id_user,
'nama_file' => $file->getClientOriginalName(),
'path_file' => $path,
'created_at' => now(),
'updated_at' => now(),
]);
}
}
if ($cekPasienMedis) {
return response()->json([
'status' => 'warning',
'message' => $dataSkrining->nama_lengkap . ' sudah menjadi pasien.'
], 409);
}
// SUPER ADMIN BOLEH SET FASYANKES
$namaFasyankesFix = $dataSkrining->nama_fasyankes;
if (session('role') === 'super_admin') {
if (!empty($request->nama_fasyankes)) {
$namaFasyankesFix = $request->nama_fasyankes;
}
}
try {
DB::transaction(function () use ($request, $dataSkrining, $namaFasyankesFix) {
// UPDATE ROLE USERS -> PASIEN
DB::table('users')
->where('id_user', $dataSkrining->id_user)
->update([
'role' => 'pasien',
'nama_fasyankes' => $namaFasyankesFix,
'updated_at' => now()
]);
// INSERT PASIEN MEDIS (COPY ID_USER)
DB::table('pasien_medis')->insert([
'id_user' => $dataSkrining->id_user,
'pengobatan_ke' => 1,
'diagnosa' => $request->diagnosa,
'tgl_mulai_pengobatan' => $request->tgl_mulai,
'tgl_estimasi_selesai' => $request->tgl_estimasi_selesai,
'jam_minum' => $request->jam_minum,
'status_kesehatan' => 'Masih Proses',
]);
// LOG AKTIVITAS
DB::table('log_aktivitas')->insert([
'id_petugas' => session('petugas_id'),
'aktivitas' => 'Menjadikan pasien dari skrining ID ' . $dataSkrining->id_skrining . ' (User ID ' . $dataSkrining->id_user . ')',
'created_at' => now(),
'updated_at' => now()
]);
});
return response()->json([
'message' => 'Berhasil menjadikan pasien!'
]);
} catch (\Exception $e) {
return response()->json([
'message' => 'Gagal simpan: ' . $e->getMessage()
], 500);
}
}
/**
* Hapus skrining (khusus super admin)
*/
public function destroy($id)
{
if (session('role') !== 'super_admin') {
return response()->json([
'message' => 'Akses ditolak!'
], 403);
}
$dataSkrining = DB::table('skrining')
->join('users', 'skrining.id_user', '=', 'users.id_user')
->where('skrining.id_skrining', $id)
->select(
'skrining.id_skrining',
'users.nama_lengkap'
)
->first();
if (!$dataSkrining) {
return response()->json([
'message' => 'Data skrining tidak ditemukan!'
], 404);
}
DB::table('skrining')
->where('id_skrining', $id)
->delete();
DB::table('log_aktivitas')->insert([
'id_petugas' => session('petugas_id'),
'aktivitas' =>
'Menghapus data skrining milik ' .
$dataSkrining->nama_lengkap,
'created_at' => now(),
'updated_at' => now()
]);
return response()->json([
'message' => 'Berhasil menghapus data skrining'
]);
}
public function cekPasien($id_user = null)
{
// Validasi pencegahan jika Javascript mengirim parameter yang rusak/kosong
if (!$id_user || $id_user === 'null' || $id_user === 'undefined') {
return response()->json([
'exists' => false
]);
}
// Cek keberadaan di database
$exists = DB::table('pasien_medis')
->where('id_user', $id_user)
->exists();
return response()->json([
'exists' => $exists
]);
}
}