sigd/app/Http/Controllers/Activity/FormMitigasiController.php

778 lines
34 KiB
PHP

<?php
namespace App\Http\Controllers\Activity;
use App\Http\Controllers\Controller;
use App\Models\ActivityDataMitigation;
use App\Models\ActivityDataMitigationForm;
use App\Models\Kabupaten;
use App\Models\Kecamatan;
use App\Models\KegiatanMitigasi;
use App\Models\Kelurahan;
use App\Models\Mitigation;
use App\Models\MitigationRendahKarbonDaerah;
use App\Services\Activity\FormMitigasiService;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\Log;
use Illuminate\Support\Str;
use Illuminate\Support\Facades\DB;
use Illuminate\Support\Facades\Auth;
use Barryvdh\DomPDF\Facade\Pdf;
class FormMitigasiController extends Controller
{
protected $formMitigasiService;
// Helper to sanitize integer input (empty string or not numeric to null)
private function sanitizeInteger($value)
{
if ($value === null || $value === '' || !is_numeric($value)) return null;
return (int)$value;
}
private function parseListData($raw)
{
if (!$raw) return [];
// Hilangkan trailing koma sebelum ].
$raw = preg_replace('/,(\s*\])/', '$1', $raw);
$data = json_decode($raw, true);
return is_array($data) ? $data : [];
}
public function __construct(FormMitigasiService $formMitigasiService)
{
$this->formMitigasiService = $formMitigasiService;
}
public function thankYou(string $id)
{
$user = Auth::user();
$km = KegiatanMitigasi::findOrFail($id);
$data = [
'oleh' => $user ? $user->name : 'Guest',
'waktu' => $km->created_at->translatedFormat('l, d F Y, H:i'),
'nama' => $km->nama_kegiatan,
'tahun' => $km->tahun_kegiatan,
'sektor' => $km->sektor,
'subsektor' => $km->sub_sektor,
'target' => $km->target,
'satuan' => $km->satuan,
'penurunan' => $km->emission_factor,
];
return view('form.index-mitigasi-thankyou', compact('data', 'km'));
}
public function downloadPDF(string $id)
{
$user = Auth::user();
$km = KegiatanMitigasi::findOrFail($id);
$data = [
'oleh' => $user ? $user->name : 'Guest',
'waktu' => $km->created_at->translatedFormat('l, d F Y, H:i'),
'nama' => $km->nama_kegiatan,
'tahun' => $km->tahun_kegiatan,
'sektor' => $km->sektor,
'subsektor' => $km->sub_sektor,
'target' => $km->target,
'satuan' => $km->satuan,
'penurunan' => $km->emission_factor,
];
$pdf = PDF::loadView('form.index-mitigasi-pdf', compact('data'))
->setPaper('a4', 'portrait');
return $pdf->download('bukti-submission-'.$km->nama_kegiatan.'.pdf');
}
public function view(string $id)
{
$km = KegiatanMitigasi::with('sumberData')->findOrFail($id);
$forms = ActivityDataMitigationForm::where('kegiatan_mitigasi_id', $id)->get();
$sessionData = [
'tipe_kegiatan' => $km->tipe_kegiatan,
'tahun_kegiatan' => $km->tahun_kegiatan,
'sektor' => $km->sektor,
'sub_sektor' => $km->sub_sektor,
'kategori_perhitungan' => $km->kategori_perhitungan,
'kategori_sub_aktivitas' => $km->kategori_sub_aktivitas,
'mitigation_id' => $km->mitigation_id,
'tipe_laporan' => $km->tipe_laporan,
'nama_kegiatan' => $km->nama_kegiatan,
'informasi_lokasi_kegiatan' => $km->informasi_lokasi_kegiatan,
'jenis_kegiatan' => $km->jenis_kegiatan,
'pelaksana_kegiatan' => $km->pelaksana_kegiatan,
'pelaksana_kegiatan_rad' => $km->pelaksana_kegiatan_rad,
'nomenklatur_kemendagri' => $km->nomenklatur_kemendagri,
'target' => $km->target,
'satuan' => $km->satuan,
'realisasi' => $km->realisasi,
'sdg' => is_array($km->sdg) ? $km->sdg : (json_decode($km->sdg, true) ?? []),
'catatan' => $km->catatan,
'alokasi_apbn' => $km->alokasi_apbn,
'alokasi_apbd' => $km->alokasi_apbd,
'alokasi_swasta' => $km->alokasi_swasta,
'alokasi_sumber_dana_lain' => $km->alokasi_sumber_dana_lain,
'realisasi_apbn' => $km->realisasi_apbn,
'realisasi_apbd' => $km->realisasi_apbd,
'realisasi_swasta' => $km->realisasi_swasta,
'realisasi_sumber_dana_lain' => $km->realisasi_sumber_dana_lain,
'kabupaten_kota_location' => $km->kabupaten_kota_location,
'kecamatan_location' => $km->kecamatan_location,
'kelurahan_location' => $km->kelurahan_location,
'lat_location' => $km->lat_location,
'long_location' => $km->long_location,
'sumber_data' => $km->sumberData->map(fn($s) => [
'title' => $s->judul_sumber_reference,
'year' => $s->tahun_sumber_reference,
'link' => $s->link_sumber_reference,
])->toArray(),
'activity_forms' => $forms->mapWithKeys(function($f) {
$raw = $f->values_array;
if (is_string($raw)) {
$values = json_decode($raw, true) ?: [];
} elseif (is_array($raw)) {
$values = $raw;
} else {
$values = [$f->value];
}
$values = array_map('strval', $values);
return [
"activity_data_{$f->sequence}" => $values,
"unit_{$f->sequence}" => $f->unit,
];
})->toArray(),
];
return view('form.index-mitigasi-view', [
'sessionData' => $sessionData,
'id' => $id,
]);
}
public function edit(string $id, Request $request)
{
$km = KegiatanMitigasi::with('sumberData')->findOrFail($id);
$forms = ActivityDataMitigationForm::where('kegiatan_mitigasi_id', $id)->get();
$sessionData = [
'mitigation_id' => $km->mitigation_id,
'tipe_laporan' => $km->tipe_laporan,
'tipe_kegiatan' => $km->tipe_kegiatan,
'tahun_kegiatan' => $km->tahun_kegiatan,
'sektor' => $km->sektor,
'sub_sektor' => $km->sub_sektor,
'kategori_perhitungan' => $km->kategori_perhitungan,
'kategori_sub_aktivitas' => $km->kategori_sub_aktivitas,
'nama_kegiatan' => $km->nama_kegiatan,
'informasi_lokasi_kegiatan' => $km->informasi_lokasi_kegiatan,
'jenis_kegiatan' => $km->jenis_kegiatan,
'pelaksana_kegiatan' => $km->pelaksana_kegiatan,
'pelaksana_kegiatan_rad' => $km->pelaksana_kegiatan_rad,
'nomenklatur_kemendagri' => $km->nomenklatur_kemendagri,
'target' => $km->target,
'satuan' => $km->satuan,
'realisasi' => $km->realisasi,
'sdg' => json_decode($km->sdg, true) ?? [],
'catatan' => $km->catatan,
'alokasi_apbn' => $km->alokasi_apbn,
'alokasi_apbd' => $km->alokasi_apbd,
'alokasi_swasta' => $km->alokasi_swasta,
'alokasi_sumber_dana_lain' => $km->alokasi_sumber_dana_lain,
'realisasi_apbn' => $km->realisasi_apbn,
'realisasi_apbd' => $km->realisasi_apbd,
'realisasi_swasta' => $km->realisasi_swasta,
'realisasi_sumber_dana_lain' => $km->realisasi_sumber_dana_lain,
'kabupaten_kota_location' => $km->kabupaten_kota_location,
'kecamatan_location' => $km->kecamatan_location,
'kelurahan_location' => $km->kelurahan_location,
'lat_location' => $km->lat_location,
'long_location' => $km->long_location,
'sumber_data' => $km->sumberData->map(fn($s) => [
'title' => $s->judul_sumber_reference,
'year' => $s->tahun_sumber_reference,
'link' => $s->link_sumber_reference,
])->toArray(),
'activity_forms' => $forms->mapWithKeys(function($f) {
$raw = $f->values_array;
if (is_string($raw)) {
$values = json_decode($raw, true) ?: [];
} elseif (is_array($raw)) {
$values = $raw;
} else {
$values = [$f->value];
}
$values = array_map('strval', $values);
return [
"activity_data_{$f->sequence}" => $values,
"unit_{$f->sequence}" => $f->unit,
];
})->toArray(),
];
$request->session()->put('kegiatan_mitigasi', $sessionData);
$startYear = 2000;
$currentYear = now()->year;
$years = range($startYear, $currentYear);
rsort($years);
$sectors = KegiatanMitigasi::distinct()->pluck('sektor')->toArray();
return view('form.index-mitigasi-edit', [
'sessionData' => $sessionData,
'years' => $years,
'currentYear' => $currentYear,
'sectors' => $sectors,
'mitigation' => $km,
'readonly' => false
]);
}
protected function persistActivityForms(array $inputs, string $mitigationId, string $kegiatanMitigasiId)
{
$isMultipleMap = ActivityDataMitigation::where('mitigation_id', $mitigationId)
->pluck('is_multiple', 'sequence')
->toArray();
$typeMap = ActivityDataMitigation::where('mitigation_id', $mitigationId)
->pluck('type_emission_reduction', 'sequence')
->toArray();
foreach ($isMultipleMap as $sequence => $isMultiple) {
$unit = $inputs['unit_' . $sequence] ?? null;
$value = $inputs['activity_data_' . $sequence] ?? null;
$typeEmis = $typeMap[$sequence] ?? null;
if ($isMultiple) {
$clean = is_array($value) ? array_filter($value, fn($v) => $v !== null && $v !== '') : [];
if (!empty($clean)) {
ActivityDataMitigationForm::create([
'kegiatan_mitigasi_id' => $kegiatanMitigasiId,
'sequence' => $sequence,
'value' => null,
'values_array' => array_values($clean),
'unit' => $unit,
'mitigation_id' => $mitigationId,
'type_emission_reduction' => $typeEmis,
]);
}
} else {
$single = is_array($value) ? ($value[0] ?? null) : $value;
if ($single !== null && $single !== '') {
ActivityDataMitigationForm::create([
'kegiatan_mitigasi_id' => $kegiatanMitigasiId,
'sequence' => $sequence,
'value' => $single,
'values_array' => null,
'unit' => $unit,
'mitigation_id' => $mitigationId,
'type_emission_reduction' => $typeEmis,
]);
}
}
}
}
public function create(Request $request)
{
if ($request->has('reset')) {
$request->session()->forget('kegiatan_mitigasi');
}
$sessionData = $request->session()->get('kegiatan_mitigasi', []);
$startYear = 2000;
$currentYear = date('Y');
$years = range($startYear, $currentYear);
rsort($years);
return view('form.index-mitigasi', compact('sessionData', 'years', 'currentYear'));
}
public function update(Request $request, $id)
{
$kegiatanMitigasi = KegiatanMitigasi::with('sumberData')->findOrFail($id);
$sessionData = $request->session()->get('kegiatan_mitigasi');
if (empty($sessionData)) {
return response()->json([
'success' => false,
'message' => 'Data tidak lengkap, silakan lengkapi semua bagian.'
]);
}
try {
DB::transaction(function() use ($sessionData, $request, $kegiatanMitigasi) {
$kegiatanMitigasi->revisi = ($kegiatanMitigasi->revisi ?? 0) + 1;
$kegiatanMitigasi->update([
'tipe_kegiatan' => $sessionData['tipe_kegiatan'] ?? null,
'tahun_kegiatan' => $this->sanitizeInteger($sessionData['tahun_kegiatan'] ?? null),
'sektor' => $sessionData['sektor'] ?? null,
'sub_sektor' => $sessionData['sub_sektor'] ?? null,
'kategori_perhitungan' => $sessionData['kategori_perhitungan'] ?? null,
'kategori_sub_aktivitas' => $sessionData['kategori_sub_aktivitas'] ?? null,
'mitigation_id' => $sessionData['mitigation_id'] ?? null,
'tipe_laporan' => $sessionData['tipe_laporan'] ?? 'laporan',
'nama_kegiatan' => $sessionData['nama_kegiatan'] ?? null,
'informasi_lokasi_kegiatan' => $sessionData['informasi_lokasi_kegiatan'] ?? null,
'jenis_kegiatan' => $sessionData['jenis_kegiatan'] ?? null,
'pelaksana_kegiatan' => $sessionData['pelaksana_kegiatan'] ?? null,
'pelaksana_kegiatan_rad' => $sessionData['pelaksana_kegiatan_rad'] ?? null,
'nomenklatur_kemendagri' => $sessionData['nomenklatur_kemendagri'] ?? null,
'target' => $sessionData['target'] ?? null,
'satuan' => $sessionData['satuan'] ?? null,
'realisasi' => $sessionData['realisasi'] ?? null,
'sdg' => json_encode($sessionData['sdg'] ?? []),
'catatan' => $sessionData['catatan'] ?? null,
'alokasi_apbn' => $sessionData['alokasi_apbn'] ?? null,
'alokasi_apbd' => $sessionData['alokasi_apbd'] ?? null,
'alokasi_swasta' => $sessionData['alokasi_swasta'] ?? null,
'alokasi_sumber_dana_lain' => $sessionData['alokasi_sumber_dana_lain'] ?? null,
'realisasi_apbn' => $sessionData['realisasi_apbn'] ?? null,
'realisasi_apbd' => $sessionData['realisasi_apbd'] ?? null,
'realisasi_swasta' => $sessionData['realisasi_swasta'] ?? null,
'realisasi_sumber_dana_lain'=> $sessionData['realisasi_sumber_dana_lain'] ?? null,
'kabupaten_kota_location' => $sessionData['kabupaten_kota_location'] ?? null,
'kecamatan_location' => $sessionData['kecamatan_location'] ?? null,
'kelurahan_location' => $sessionData['kelurahan_location'] ?? null,
'lat_location' => $sessionData['lat_location'] ?? null,
'long_location' => $sessionData['long_location'] ?? null,
'updated_by' => auth()->check() ? auth()->user()->name : null,
]);
// Update sumber data (delete all, re-insert sanitized)
$kegiatanMitigasi->sumberData()->delete();
foreach($sessionData['sumber_data'] ?? [] as $s) {
$kegiatanMitigasi->sumberData()->create([
'id' => Str::uuid(),
'judul_sumber_reference' => trim($s['title'] ?? '') ?: null,
'tahun_sumber_reference' => $this->sanitizeInteger($s['year'] ?? null),
'link_sumber_reference' => trim($s['link'] ?? '') ?: null,
]);
}
ActivityDataMitigationForm::where('kegiatan_mitigasi_id', $kegiatanMitigasi->id)->delete();
$this->persistActivityForms($request->all(), $sessionData['mitigation_id'], $kegiatanMitigasi->id);
$this->formMitigasiService->calculateAndPersist($sessionData['mitigation_id'], $kegiatanMitigasi);
$request->session()->forget('kegiatan_mitigasi');
});
return response()->json([
'success' => true,
'redirect' => route('formMitigasi.thankYou', $id),
]);
} catch (\Exception $e) {
Log::error('Error updating data: ' . $e->getMessage());
return back()->with('error', 'Gagal mengupdate data. Silakan coba lagi.');
}
}
public function loadQuestion(Request $request)
{
$mitigation_id = $request->input('mitigation_id');
if (!Str::isUuid($mitigation_id)) {
return response()->json(['message' => 'Invalid mitigation ID'], 400);
}
$questions = ActivityDataMitigation::select(
'activity_data_mitigation.id',
'activity_data_mitigation.activity_data',
'activity_data_mitigation.unit',
'activity_data_mitigation.sequence',
'activity_data_mitigation.type',
'activity_data_mitigation.list_data',
'activity_data_mitigation.is_multiple',
'activity_data_mitigation.question_plus',
'activity_data_mitigation.ad_sequence',
'activity_data_mitigation.type_emission_reduction',
'activity_data_mitigation.is_required',
'activity_data_mitigation.title_group',
'activity_data_mitigation.keterangan',
'am.activity_desc as activity_desc',
'am.activity_type as title'
)
->join('activity.mitigation as am', 'activity_data_mitigation.mitigation_id', '=', 'am.id')
->where('activity_data_mitigation.mitigation_id', $mitigation_id)
->orderBy('activity_data_mitigation.sequence')
->get()
->map(function ($item) {
$dataMitigation = ActivityDataMitigation::with('units')
->find($item->id);
$units = $dataMitigation && $dataMitigation->units->isNotEmpty()
? $dataMitigation->units->pluck('unit')
: collect([$item->unit])->filter();
$category = $dataMitigation && $dataMitigation->units->isNotEmpty()
? $dataMitigation->units->pluck('category')
: collect([$item->unit])->filter();
return [
'id' => $item->id,
'sequence' => $item->sequence,
'activity_data' => $item->activity_data,
'units' => $units->values(),
'category' => $category->values(),
'type' => $item->type,
'choices' => $this->parseListData($item->list_data),
'is_multiple' => (bool)$item->is_multiple,
'is_required' => (bool)$item->is_required,
'question_plus' => $item->question_plus,
'ad_sequence' => $item->ad_sequence,
'type_emission_reduction' => $item->type_emission_reduction,
'activity_desc' => $item->activity_desc,
'title' => $item->title,
'title_group' => $item->title_group,
'keterangan' => $item->keterangan,
];
});
return response()->json($questions);
}
public function storePart1(Request $request)
{
$validated = $request->validate([
'tipe_kegiatan' => 'required|in:inti,pendukung,prasyarat',
'tahun_kegiatan' => 'required|integer|min:2000|max:' . date('Y'),
'sektor' => 'required|string',
'sub_sektor' => 'required|string',
'kategori_perhitungan' => 'required|string',
'kategori_sub_aktivitas' => 'sometimes|nullable|string',
'mitigation_id' => 'required|string'
]);
$sessionData = $request->session()->get('kegiatan_mitigasi');
$sessionArray = is_object($sessionData) ? $sessionData->toArray() : (array) $sessionData;
$mergedData = array_merge($sessionArray, $validated);
if ($request->filled('laporan')) {
$mergedData['tipe_laporan'] = $request->laporan;
} else {
$mergedData['tipe_laporan'] = $sessionArray['tipe_laporan'] ?? 'laporan';
}
$request->session()->put('kegiatan_mitigasi', $mergedData);
return response()->json(['success' => true]);
}
public function storePart2(Request $request)
{
$validated = $request->validate([
'nama_kegiatan' => 'required|string',
'informasi_lokasi_kegiatan' => 'required|string',
'jenis_kegiatan' => 'required|string|in:lokal,berkelanjutan',
'pelaksana_kegiatan' => 'nullable|string',
'pelaksana_kegiatan_rad' => 'nullable|string',
'nomenklatur_kemendagri' => 'nullable|string',
'target' => 'required|string',
'satuan' => 'required|string',
'realisasi' => 'nullable|string',
'sdg' => 'nullable|array',
'catatan' => 'nullable|string',
]);
$sessionData = $request->session()->get('kegiatan_mitigasi');
if (!$sessionData) {
return response()->json(['success' => false, 'message' => 'Silakan lengkapi bagian Informasi Umum terlebih dahulu']);
}
$updatedData = array_merge($sessionData, $validated);
$request->session()->put('kegiatan_mitigasi', $updatedData);
return response()->json(['success' => true]);
}
public function storePart3(Request $request)
{
$validated = $request->validate([
'alokasi_apbn' => 'nullable|string',
'alokasi_apbd' => 'nullable|string',
'alokasi_swasta' => 'nullable|string',
'alokasi_sumber_dana_lain' => 'nullable|string',
'realisasi_apbn' => 'nullable|string',
'realisasi_apbd' => 'nullable|string',
'realisasi_swasta' => 'nullable|string',
'realisasi_sumber_dana_lain' => 'nullable|string'
]);
$sessionData = $request->session()->get('kegiatan_mitigasi');
if (!$sessionData) {
return response()->json(['success' => false, 'message' => 'Silakan lengkapi bagian Informasi Umum terlebih dahulu']);
}
$updatedData = array_merge($sessionData, $validated);
$request->session()->put('kegiatan_mitigasi', $updatedData);
return response()->json(['success' => true]);
}
public function storePart4(Request $request)
{
try {
$validated = $request->validate([
'titleSourceReference' => 'nullable|array',
'titleSourceReference.*' => 'nullable|string|max:255',
'yearSourceReference' => 'nullable|array',
'yearSourceReference.*' => 'nullable|string|max:4',
'linkSourceReference' => 'nullable|array',
'linkSourceReference.*' => 'nullable|string|max:500',
]);
$sessionData = $request->session()->get('kegiatan_mitigasi', []);
if (empty($sessionData)) {
return response()->json([
'success' => false,
'message' => 'Silakan lengkapi bagian Informasi Umum terlebih dahulu.'
]);
}
$titles = $validated['titleSourceReference'] ?? [];
$years = $validated['yearSourceReference'] ?? [];
$links = $validated['linkSourceReference'] ?? [];
$max = max(count($titles), count($years), count($links));
$sumberDataList = [];
for ($i = 0; $i < $max; $i++) {
$sumberDataList[] = [
'title' => trim($titles[$i] ?? ''),
'year' => trim($years[$i] ?? ''),
'link' => trim($links[$i] ?? ''),
];
}
$updatedData = array_merge($sessionData, ['sumber_data' => $sumberDataList]);
$request->session()->put('kegiatan_mitigasi', $updatedData);
return response()->json(['success' => true]);
} catch (\Exception $e) {
Log::error('Error storePart4: '.$e->getMessage());
return response()->json([
'success' => false,
'message' => 'Terjadi error server: '.$e->getMessage()
]);
}
}
public function storePart5(Request $request)
{
$validated = $request->validate([
'kabupaten_kota_location' => 'nullable|string',
'kecamatan_location' => 'nullable|string',
'kelurahan_location' => 'nullable|string',
'lat_location' => 'nullable|string',
'long_location' => 'nullable|string'
]);
$sessionData = $request->session()->get('kegiatan_mitigasi');
if (!$sessionData) {
return response()->json(['success' => false, 'message' => 'Silakan lengkapi bagian Informasi Umum terlebih dahulu']);
}
$updatedData = array_merge($sessionData, $validated);
$request->session()->put('kegiatan_mitigasi', $updatedData);
return response()->json(['success' => true]);
}
public function storeFinal(Request $request)
{
$sessionData = $request->session()->get('kegiatan_mitigasi');
if (empty($sessionData)) {
return response()->json([
'success' => false,
'message' => 'Silakan lengkapi semua bagian terlebih dahulu'
]);
}
try {
$mitigasiId = Str::uuid()->toString();
DB::transaction(function() use ($sessionData, $request, $mitigasiId) {
$kegiatanMitigasi = KegiatanMitigasi::create([
'id' => $mitigasiId,
'tipe_kegiatan' => $sessionData['tipe_kegiatan'] ?? null,
'tahun_kegiatan' => $this->sanitizeInteger($sessionData['tahun_kegiatan'] ?? null),
'sektor' => $sessionData['sektor'] ?? null,
'sub_sektor' => $sessionData['sub_sektor'] ?? null,
'kategori_perhitungan' => $sessionData['kategori_perhitungan'] ?? null,
'kategori_sub_aktivitas' => $sessionData['kategori_sub_aktivitas'] ?? null,
'mitigation_id' => $sessionData['mitigation_id'] ?? null,
'tipe_laporan' => $sessionData['tipe_laporan'] ?? 'laporan',
'nama_kegiatan' => $sessionData['nama_kegiatan'] ?? null,
'informasi_lokasi_kegiatan' => $sessionData['informasi_lokasi_kegiatan'] ?? null,
'jenis_kegiatan' => $sessionData['jenis_kegiatan'] ?? null,
'pelaksana_kegiatan' => $sessionData['pelaksana_kegiatan'] ?? null,
'pelaksana_kegiatan_rad' => $sessionData['pelaksana_kegiatan_rad'] ?? null,
'nomenklatur_kemendagri' => $sessionData['nomenklatur_kemendagri'] ?? null,
'target' => $sessionData['target'] ?? null,
'satuan' => $sessionData['satuan'] ?? null,
'realisasi' => $sessionData['realisasi'] ?? null,
'sdg' => json_encode($sessionData['sdg'] ?? []),
'catatan' => $sessionData['catatan'] ?? null,
'alokasi_apbn' => $sessionData['alokasi_apbn'] ?? null,
'alokasi_apbd' => $sessionData['alokasi_apbd'] ?? null,
'alokasi_swasta' => $sessionData['alokasi_swasta'] ?? null,
'alokasi_sumber_dana_lain' => $sessionData['alokasi_sumber_dana_lain'] ?? null,
'realisasi_apbn' => $sessionData['realisasi_apbn'] ?? null,
'realisasi_apbd' => $sessionData['realisasi_apbd'] ?? null,
'realisasi_swasta' => $sessionData['realisasi_swasta'] ?? null,
'realisasi_sumber_dana_lain' => $sessionData['realisasi_sumber_dana_lain'] ?? null,
'kabupaten_kota_location'=> $sessionData['kabupaten_kota_location'] ?? null,
'kecamatan_location' => $sessionData['kecamatan_location'] ?? null,
'kelurahan_location' => $sessionData['kelurahan_location'] ?? null,
'lat_location' => $sessionData['lat_location'] ?? null,
'long_location' => $sessionData['long_location'] ?? null,
'created_by' => auth()->check() ? auth()->user()->name : null,
]);
collect($sessionData['sumber_data'] ?? [])
->filter(function($s) {
return
trim($s['title'] ?? '') !== '' ||
trim($s['year'] ?? '') !== '' ||
trim($s['link'] ?? '') !== '';
})
->each(function($s) use ($kegiatanMitigasi) {
$kegiatanMitigasi->sumberData()->create([
'id' => Str::uuid()->toString(),
'judul_sumber_reference' => trim($s['title'] ?? '') ?: null,
'tahun_sumber_reference' => $this->sanitizeInteger($s['year'] ?? null),
'link_sumber_reference' => trim($s['link'] ?? '') ?: null,
]);
});
$this->persistActivityForms($request->all(), $sessionData['mitigation_id'], $mitigasiId);
$this->formMitigasiService->calculateAndPersist($sessionData['mitigation_id'], $kegiatanMitigasi, $mitigasiId);
$request->session()->forget('kegiatan_mitigasi');
});
return response()->json([
'success' => true,
'redirect' => route('formMitigasi.thankYou', $mitigasiId),
]);
} catch (\Exception $e) {
Log::error('Error storing final data: ' . $e->getMessage());
return back()->with('error', 'Gagal menyimpan data. Silakan coba lagi.');
}
}
// ... fungsi getSectors, getSubSectors, getKategoriPerhitungan, getSubActivity, getAksiRAD, getKabkot, getKecamatan, getKelurahan tidak perlu diubah ...
public function getSectors()
{
$query = Mitigation::select('sector')
->where('is_active', true)
->distinct();
$result = $query->pluck('sector');
return response()->json($result);
}
public function getSubSectors(Request $request)
{
$param = $request->input('sector');
$query = Mitigation::select('sub_sector')
->where('sector', $param)
->where('is_active', true)
->distinct();
$result = $query->pluck('sub_sector');
return response()->json($result);
}
public function getKategoriPerhitungan(Request $request)
{
$param = $request->input('sub_sector');
$param2 = $request->input('sector');
$query = Mitigation::select('id', 'activity_type')
->where('sub_sector', $param)
->where('sector', $param2)
->where('is_active', true)
->distinct('activity_type')->get();
return response()->json($query);
}
public function getSubActivity(Request $request)
{
$param = $request->input('sub_sector');
$param2 = $request->input('sector');
$param3 = $request->input('activity');
$query = Mitigation::select('id', 'sub_activity', 'sub_activity_desc')
->where('sub_sector', $param)
->where('sector', $param2)
->where('activity_type', $param3)
->where('is_active', true)
->distinct('sub_activity')->get();
return response()->json($query);
}
public function getAksiRAD(Request $request)
{
$param = $request->input('sub_sector');
$data = MitigationRendahKarbonDaerah::select('sector', 'sub_sector', 'name')
->where('sub_sector', $param)
->distinct('name')->get();
$result = $data->map(function ($item) {
return "[" . $item->sector . " - " . $item->sub_sector . "] " . $item->name;
});
return response()->json($result);
}
public function getKabkot()
{
$query = Kabupaten::select('kabkot_id', 'kabkot_name')
->get();
return response()->json($query);
}
public function getKecamatan(Request $request)
{
$param = $request->input('kabkot_id');
$query = Kecamatan::select('kec_id', 'kec_name')
->where('kabkot_id', $param)
->get();
return response()->json($query);
}
public function getKelurahan(Request $request)
{
$kabkot_id = $request->input('kabkot_id');
$kec_id = $request->input('kec_id');
$query = Kelurahan::select('kel_id', 'kel_name')
->where('kabkot_id', $kabkot_id)
->where('kec_id', $kec_id)
->get();
return response()->json($query);
}
}