504 lines
17 KiB
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
|
|
]);
|
|
}
|
|
}
|