205 lines
7.5 KiB
PHP
205 lines
7.5 KiB
PHP
<?php
|
|
|
|
namespace App\Http\Controllers;
|
|
|
|
use App\Models\Puskesmas;
|
|
use Illuminate\Http\Request;
|
|
use Illuminate\Support\Facades\DB;
|
|
use App\Models\AKI;
|
|
use App\Models\Tahun;
|
|
use Illuminate\Support\Facades\Log;
|
|
use App\Exports\GeneralExport;
|
|
use Maatwebsite\Excel\Facades\Excel;
|
|
|
|
class AKIController extends Controller
|
|
{
|
|
public function index(Request $request)
|
|
{
|
|
$filter = $request->input('filter_kecamatan');
|
|
$search = $request->input('search');
|
|
$filter_tahun = $request->input('filter_tahun', date('Y'));
|
|
$tahunOptions = Tahun::pluck('tahun', 'id_tahun')->toArray();
|
|
$AKI = AKI::with('puskesmas.kecamatan')
|
|
->when($filter_tahun, function ($query, $filter_tahun) {
|
|
$query->where('id_tahun', $filter_tahun);
|
|
})
|
|
->when($filter === 'Puskesmas', function ($query) use ($search) {
|
|
$query->when($search, function ($query, $search) {
|
|
$query->whereHas('puskesmas', function ($query) use ($search) {
|
|
$query->where('nama_puskesmas', 'like', "%$search%");
|
|
});
|
|
})
|
|
->select('data_aki.*')
|
|
->join('puskesmas', 'data_aki.id_puskesmas', '=', 'puskesmas.id_puskesmas');
|
|
})
|
|
->when($filter === 'Kecamatan', function ($query) use ($search) {
|
|
$query->join('puskesmas', 'data_aki.id_puskesmas', '=', 'puskesmas.id_puskesmas')
|
|
->join('tb_kecamatan', 'puskesmas.id_kecamatan', '=', 'tb_kecamatan.id_kecamatan')
|
|
->when($search, function ($query, $search) {
|
|
$query->where('tb_kecamatan.nama_kecamatan', 'like', "%$search%");
|
|
})
|
|
->groupBy('tb_kecamatan.id_kecamatan', 'tb_kecamatan.nama_kecamatan', 'data_aki.id_tahun')
|
|
->select(
|
|
'tb_kecamatan.id_kecamatan',
|
|
'tb_kecamatan.nama_kecamatan',
|
|
'data_aki.id_tahun',
|
|
DB::raw('SUM(data_aki.aki) as total_aki')
|
|
);
|
|
})
|
|
|
|
->get();
|
|
return view('AKI.index', compact('AKI', 'tahunOptions'));
|
|
}
|
|
|
|
public function create(Request $request)
|
|
{
|
|
$tahunAki = Tahun::whereDoesntHave('aki')->get();
|
|
$puskesmas = Puskesmas::all();
|
|
|
|
return view('aki.create', compact('tahunAki', 'puskesmas'));
|
|
}
|
|
|
|
public function store(Request $request)
|
|
{
|
|
$request->validate([
|
|
'id_tahun' => 'required|exists:tahun,id_tahun',
|
|
'id_puskesmas.*' => 'required|exists:puskesmas,id_puskesmas',
|
|
'id_kecamatan.*' => 'required|exists:tb_kecamatan,id_kecamatan',
|
|
'aki.*' => 'required|numeric|min:0',
|
|
]);
|
|
|
|
try {
|
|
foreach ($request->id_puskesmas as $index => $puskesmasId) {
|
|
$puskesmas = Puskesmas::find($puskesmasId);
|
|
if (!$puskesmas) {
|
|
continue;
|
|
}
|
|
|
|
$akiValue = $request->aki[$puskesmasId] ?? null;
|
|
if ($akiValue === null) {
|
|
Log::error('Nilai AKI tidak ditemukan atau tidak valid', [
|
|
'id_puskesmas' => $puskesmas->id_puskesmas,
|
|
'id_kecamatan' => $request->id_kecamatan[$index],
|
|
'id_tahun' => $request->id_tahun,
|
|
]);
|
|
continue;
|
|
}
|
|
|
|
AKI::create([
|
|
'id_puskesmas' => $puskesmas->id_puskesmas,
|
|
'id_kecamatan' => $request->id_kecamatan[$index],
|
|
'id_tahun' => $request->id_tahun,
|
|
'aki' => $akiValue,
|
|
]);
|
|
|
|
$idKecamatan = $request->id_kecamatan[$index];
|
|
$grandTotalAki = AKI::where('id_kecamatan', $idKecamatan)->sum('aki');
|
|
|
|
DB::table('kmeans_aki')->updateOrInsert(
|
|
['id_kecamatan' => $idKecamatan],
|
|
[
|
|
'grand_total_aki' => $grandTotalAki,
|
|
'id_cluster' => null,
|
|
'created_at' => now(),
|
|
'updated_at' => now(),
|
|
]
|
|
);
|
|
}
|
|
|
|
return redirect()->route('aki.index')->with('success', 'Data AKI berhasil disimpan.');
|
|
} catch (\Exception $e) {
|
|
Log::error("Terjadi kesalahan saat menyimpan data AKI: " . $e->getMessage());
|
|
return redirect()->route('aki.create')->with('error', 'Terjadi kesalahan saat menyimpan data.');
|
|
}
|
|
}
|
|
|
|
public function edit($id_data_aki)
|
|
{
|
|
$AKI = AKI::findOrFail($id_data_aki);
|
|
|
|
return view('aki.edit', compact('AKI'));
|
|
}
|
|
public function update(Request $request, $id_data_aki)
|
|
{
|
|
$request->validate([
|
|
'aki' => 'required|numeric|min:0',
|
|
]);
|
|
|
|
try {
|
|
$AKI = AKI::findOrFail($id_data_aki);
|
|
|
|
$AKI->update([
|
|
'aki' => $request->aki,
|
|
]);
|
|
|
|
Log::info('Data AKI berhasil diperbarui:', [
|
|
'id_data_aki' => $id_data_aki,
|
|
'aki' => $request->aki,
|
|
]);
|
|
|
|
return redirect()->route('aki.index')->with('success', 'Data AKI berhasil diperbarui.');
|
|
} catch (\Exception $e) {
|
|
Log::error('Terjadi kesalahan saat memperbarui data AKI:', ['message' => $e->getMessage()]);
|
|
|
|
return redirect()->route('aki.edit', $id_data_aki)->with('error', 'Terjadi kesalahan saat memperbarui data.');
|
|
}
|
|
}
|
|
public function export()
|
|
{
|
|
$sheets = [];
|
|
$tahunData = Tahun::all();
|
|
|
|
foreach ($tahunData as $tahun) {
|
|
$akiData = AKI::where('id_tahun', $tahun->id_tahun)
|
|
->with('puskesmas.kecamatan')
|
|
->get()
|
|
->map(function ($aki) {
|
|
return [
|
|
'Puskesmas' => $aki->puskesmas->nama_puskesmas,
|
|
'Kecamatan' => $aki->puskesmas->kecamatan->nama_kecamatan,
|
|
'Jumlah AKI' => $aki->aki,
|
|
];
|
|
});
|
|
$sheets[] = new class($akiData, ['Puskesmas', 'Kecamatan', 'Jumlah AKI'], $tahun->tahun) implements \Maatwebsite\Excel\Concerns\FromCollection, \Maatwebsite\Excel\Concerns\WithHeadings, \Maatwebsite\Excel\Concerns\WithTitle {
|
|
protected $data;
|
|
protected $headings;
|
|
protected $tahun;
|
|
|
|
public function __construct($data, $headings, $tahun)
|
|
{
|
|
$this->data = $data;
|
|
$this->headings = $headings;
|
|
$this->tahun = $tahun;
|
|
}
|
|
|
|
public function collection()
|
|
{
|
|
return collect($this->data);
|
|
}
|
|
|
|
public function headings(): array
|
|
{
|
|
return $this->headings;
|
|
}
|
|
|
|
public function title(): string
|
|
{
|
|
return $this->tahun;
|
|
}
|
|
};
|
|
}
|
|
return Excel::download(new class($sheets) implements \Maatwebsite\Excel\Concerns\WithMultipleSheets {
|
|
protected $sheets;
|
|
|
|
public function __construct($sheets)
|
|
{
|
|
$this->sheets = $sheets;
|
|
}
|
|
|
|
public function sheets(): array
|
|
{
|
|
return $this->sheets;
|
|
}
|
|
}, 'aki_data.xlsx');
|
|
}
|
|
} |