778 lines
34 KiB
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);
|
|
}
|
|
}
|