Files
lpj/app/Http/Controllers/SurveyorController.php
2025-02-18 16:14:52 +07:00

3645 lines
139 KiB
PHP

<?php
namespace Modules\Lpj\Http\Controllers;
use App\Http\Controllers\Controller;
use Illuminate\Http\RedirectResponse;
use Illuminate\Http\Request;
use Illuminate\Http\JsonResponse;
use Illuminate\Support\Facades\Validator;
use Maatwebsite\Excel\Facades\Excel;
use Modules\Lpj\Exports\BasicDataSurveyorExport;
use Illuminate\Support\Facades\DB;
use Illuminate\Support\Facades\Auth;
use Illuminate\Support\Str;
use Barryvdh\DomPDF\Facade\Pdf;
use Illuminate\Support\Facades\Storage;
use Illuminate\Support\Carbon;
use Illuminate\Support\Facades\Mail;
use Illuminate\Http\Response;
use Modules\Lpj\Models\Debiture;
use Modules\Lpj\Models\Permohonan;
use Modules\Lpj\Models\Branch;
use Modules\Lpj\Models\Surveyor;
use Modules\Lpj\Models\BentukTanah;
use Modules\Lpj\Models\KonturTanah;
use Modules\Location\Models\Province;
use Modules\Location\Models\City;
use Modules\Location\Models\District;
use Modules\Location\Models\Village;
use Modules\Lpj\Models\PosisiKavling;
use Modules\Lpj\Models\KondisiFisikTanah;
use Modules\Lpj\Models\FotoObjekJaminan;
use Modules\Lpj\Models\Perizinan;
use Modules\Lpj\Models\KetinggianTanah;
use Modules\Lpj\Models\SifatBangunan;
use Modules\Lpj\Models\JenisJaminan;
use Modules\Lpj\Models\JenisBangunan;
use Modules\Lpj\Models\KondisiBangunan;
use Modules\Lpj\Models\SpekBangunan;
use Modules\Lpj\Models\SpekKategoritBangunan;
use Modules\Lpj\Models\SaranaPelengkap;
use Modules\Lpj\Models\ArahMataAngin;
use Modules\Lpj\Models\Analisa;
use Modules\Lpj\Models\Penilaian;
use Modules\Lpj\Models\PerkerasanJalan;
use Modules\Lpj\Models\AnalisaFakta;
use Modules\Lpj\Models\AnalisaLingkungan;
use Modules\Lpj\Models\AnalisaTanahBagunan;
use Modules\Lpj\Models\SpekBangunanAnalisa;
use Modules\Lpj\Models\Denah;
use Modules\Lpj\Models\FotoJaminan;
use Modules\Lpj\Models\Lingkungan;
use Modules\Lpj\Models\LantaiUnit;
use Modules\Lpj\Models\Teams;
use Modules\Lpj\Models\Lantai;
use Modules\Lpj\Models\Inspeksi;
use Modules\Lpj\Models\ViewUnit;
use Modules\Lpj\Models\JenisUnit;
use Modules\Lpj\Models\BentukUnit;
use Modules\Lpj\Models\PosisiUnit;
use Modules\Lpj\Models\TerletakArea;
use Modules\Lpj\Models\FasilitasObjek;
use Modules\Lpj\Models\MerupakanDaerah;
use Modules\Lpj\Models\ObjekJaminan;
use Modules\Lpj\Models\ModelAlatBerat;
use Modules\Lpj\Models\JenisPesawat;
use Modules\Lpj\Models\DokumenJaminan;
use Modules\Lpj\Models\DetailDokumenJaminan;
use Modules\Lpj\Models\JenisKapal;
use Modules\Lpj\Models\JenisKendaraan;
use Modules\Lpj\Models\RuteJaminan;
use Modules\Lpj\Models\HubunganPemilikJaminan;
use Modules\Lpj\Models\HubunganPenghuniJaminan;
use Modules\Lpj\Models\AnalisaUnit;
use Modules\Lpj\Models\GolonganMasySekitar;
use Modules\Lpj\Models\TingkatKeramaian;
use Modules\Lpj\Models\TujuanPenilaian;
use Modules\Lpj\Models\LaluLintasLokasi;
use Modules\Lpj\Models\SpekBagunanAnalisaDetail;
use Modules\Lpj\Http\Requests\SurveyorRequest;
use Modules\Lpj\Http\Requests\FormSurveyorRequest;
use Modules\Lpj\Emails\SendJadwalKunjunganEmail;
use App\Helpers\Lpj;
use Modules\Lpj\Models\Authorization;
class SurveyorController extends Controller
{
public $user;
public function index()
{
return view('lpj::surveyor.index');
}
/**
* Show the specified resource.
*/
public function show($id)
{
$permohonan = Permohonan::with([
'user',
'debiture.province',
'debiture.city',
'debiture.district',
'debiture.village',
'branch',
'tujuanPenilaian',
'penilaian',
'documents.jenisJaminan',
'documents',
])->findOrFail($id);
$surveyor = $id;
$branches = Branch::all();
$provinces = Province::all();
$bentukTanah = BentukTanah::all();
// Get all inspeksi data for this permohonan
if (strtolower($permohonan->tujuanPenilaian->name) == 'rap') {
$inspeksiData = Inspeksi::where('permohonan_id', $id)
->get()
->keyBy('dokument_id')
->map(function ($item) {
return [
'data_form' => json_decode($item->data_form, true),
'foto_form' => json_decode($item->foto_form, true)
];
});
} else {
$inspeksiData = Inspeksi::where('permohonan_id', $id)
->get()
->keyBy('dokument_id')
->map(function ($item) {
return [
'data_form' => json_decode($item->data_form, true),
'foto_form' => json_decode($item->foto_form, true),
'denah_form' => json_decode($item->denah_form, true),
'data_pembanding' => json_decode($item->data_pembanding, true),
];
});
}
return view('lpj::surveyor.detail', compact(
'permohonan',
'surveyor',
'branches',
'provinces',
'bentukTanah',
'inspeksiData'
));
}
/**
* Store form inspeksi.
*/
public function store(FormSurveyorRequest $request)
{
try {
// Validate request data
$validatedData = $request->validated();
// Get action specific rules and process data
$processedData = $this->getActionSpecificRules(
$validatedData,
$request->input('type'),
$request
);
$inspeksi = Inspeksi::where('permohonan_id', $request->input('permohonan_id'))
->where('dokument_id', $request->input('dokument_id'))
->first();
if ($inspeksi) {
// Jika data sudah ada, merge dengan data yang baru
$existingData = json_decode($inspeksi->data_form, true) ?: [];
$mergedData = $this->arrayMergeRecursive($existingData, $processedData);
// Update record
$inspeksi->update([
'data_form' => json_encode($mergedData),
'name' => $request->input('type')
]);
$responseData = $mergedData;
} else {
// Jika belum ada data, buat record baru
$inspeksi = Inspeksi::create([
'permohonan_id' => $request->input('permohonan_id'),
'dokument_id' => $request->input('dokument_id'),
'data_form' => json_encode($processedData),
'name' => $request->input('type')
]);
$responseData = $processedData;
}
return response()->json([
'success' => true,
'message' => 'Data berhasil disimpan',
'data' => $processedData
], 200);
} catch (\Exception $e) {
return response()->json([
'success' => false,
'message' => 'Gagal menyimpan data',
'error' => $e->getMessage()
], 500);
}
}
private function getActionSpecificRules($data, $action, $request): array
{
$allowedActions = [
'apartemen-kantor' => 'getUnitData',
'tanah' => 'getTanahData',
'bangunan' => 'getBangunanData',
'kapal' => 'getKapalData',
'kendaraan' => 'getKendaraanData',
'mesin' => 'getMesinData',
'pesawat' => 'getPesawatData',
'alat-berat' => 'getAlatBeratData',
'lingkungan' => 'getLingkunganData',
'fakta' => 'getFactData',
'rap' => 'getRapData',
];
$rules = [];
$hasAssetDescriptionRules = false;
$hasFactaData = false;
$pisah = array_filter(
explode(',', $action),
function ($act) use ($allowedActions) {
return isset($allowedActions[trim($act)]);
}
);
foreach ($pisah as $act) {
$act = trim($act);
$method = $allowedActions[$act];
$actionRules = $this->$method($data, $request);
$rules = array_merge($rules, $actionRules);
if (in_array($act, ['apartemen-kantor', 'tanah', 'bangunan', 'rap'])) {
$hasAssetDescriptionRules = true;
}
if (in_array($act, ['rap'])) {
$hasFactaData = true;
}
}
if ($hasAssetDescriptionRules) {
$rules = array_merge($rules, $this->getAssetData($data));
}
if ($hasFactaData) {
$rules = array_merge($rules, $this->getFactData($data, $request));
}
return $rules;
}
public function storeDenah(Request $request)
{
$validator = $request->validate([
'foto_denah.*' => 'nullable|file|mimes:jpg,jpeg,png,bmp,gif,webp,pdf',
'nama_denah.*' => 'nullable|string|max:255',
'luas_denah.*' => 'nullable|numeric',
'permohonan_id' => 'required|exists:permohonan,id',
'dokument_id' => 'required',
'nomor_registrasi' => 'required'
]);
if ($validator) {
try {
$denahs = [];
$inspeksi = Inspeksi::where('permohonan_id', $request->permohonan_id)
->where('dokument_id', $request->dokument_id)
->first();
$existingDenah = $inspeksi ? json_decode($inspeksi->denah_form ?? '[]', true) : [];
$existingDenahs = $existingDenah['denahs'] ?? [];
if ($request->has('nama_denah')) {
foreach ($request->nama_denah as $index => $namaDenah) {
$denahItem = [
'nama_denah' => $namaDenah,
'luas_denah' => $request->luas_denah[$index] ?? null
];
if ($request->hasFile('foto_denah') && isset($request->file('foto_denah')[$index])) {
$file = $request->file('foto_denah')[$index];
$denahItem['foto_denah'] = $this->uploadFile($file, 'foto_denah');
} elseif (isset($existingDenahs[$index]['foto_denah'])) {
$denahItem['foto_denah'] = $existingDenahs[$index]['foto_denah'];
}
$denahs[] = $denahItem;
}
}
if (empty($denahs) && !empty($existingDenahs)) {
$denahs = $existingDenahs;
}
$inspeksi = Inspeksi::firstOrNew([
'permohonan_id' => $request->permohonan_id,
'dokument_id' => $request->dokument_id
]);
// Update denah_form
$updatedDenah = ['denahs' => $denahs];
$inspeksi->denah_form = json_encode($updatedDenah);
$inspeksi->save();
return response()->json([
'success' => true,
'message' => 'Data berhasil disimpan',
'data' => $updatedDenah
], 200);
} catch (\Exception $e) {
\Log::error('Denah Store Error: ' . $e->getMessage());
return response()->json([
'success' => false,
'message' => 'Gagal menyimpan data: ' . $e->getMessage()
], 500);
}
}
}
public function storeFoto(Request $request)
{
$validatedData = $this->validateFotoRequest($request);
try {
$inspeksi = Inspeksi::firstOrNew([
'permohonan_id' => $request->input('permohonan_id'),
'dokument_id' => $request->input('dokument_id')
]);
// Get existing foto_form data if it exists
$existingData = $inspeksi->exists && $inspeksi->foto_form
? json_decode($inspeksi->foto_form, true)
: [];
if (!$this->isValidFormat($existingData)) {
$existingData = [];
}
// Upload berbagai jenis foto
$newFoto = $this->handleFileUpload($request, 'upload_foto', $existingData);
if (!empty($newFoto)) {
$inspeksi->foto_form = json_encode($existingData);
$inspeksi->save();
return response()->json([
'success' => true,
'message' => 'Data berhasil disimpan',
'path' => $newFoto[0]['path'],
], 200);
}
return response()->json([
'success' => false,
'message' => 'Tidak ada data untuk disimpan'
], 400);
} catch (Exception $e) {
return response()->json(['success' => false, 'message' => 'Failed to upload: ' . $e->getMessage()], 500);
}
}
/**
* Validasi apakah format JSON sesuai dengan yang diinginkan.
*
* @param array $data
* @return bool
*/
private function isValidFormat($data)
{
if (!isset($data['upload_foto']) || !is_array($data['upload_foto'])) {
return false;
}
return true;
}
public function updateFoto(Request $request)
{
try {
// Validasi input
$validated = $request->validate([
'permohonan_id' => 'required',
'dokument_id' => 'required|string',
'name' => 'required|string|max:255',
'description' => 'nullable|string',
'category' => 'required|string|max:255',
'sub' => 'nullable|string|max:255',
'path' => 'nullable|string',
]);
$inspeksi = Inspeksi::firstOrNew([
'permohonan_id' => $validated['permohonan_id'],
'dokument_id' => $validated['dokument_id'],
]);
$cleanRequestPath = str_replace('/storage/', '', $validated['path']);
$fotoForm = json_decode($inspeksi->foto_form, true) ?? [];
if (!isset($fotoForm['upload_foto'])) {
$fotoForm['upload_foto'] = [];
}
$existingIndex = null;
if (!empty($validated['path'])) {
foreach ($fotoForm['upload_foto'] as $index => $foto) {
if ($foto['path'] === $cleanRequestPath) {
$existingIndex = $index;
break;
}
}
}
// Siapkan data baru
$newFotoData = [
'name' => $validated['name'],
'description' => $validated['description'],
'category' => $validated['category'],
'sub' => $validated['sub'],
'path' => $cleanRequestPath,
'created_by' => Auth::user()->name,
'created_at' => now()->toDateTimeString(),
'updated_by' => Auth::user()->name,
'updated_at' => now()->toDateTimeString(),
];
if ($existingIndex !== null) {
$existingFoto = $fotoForm['upload_foto'][$existingIndex];
$fotoForm['upload_foto'][$existingIndex] = [
'name' => $validated['name'],
'description' => $validated['description'],
'category' => $validated['category'],
'sub' => $validated['sub'],
'path' => $cleanRequestPath,
'created_by' => $existingFoto['created_by'] ?? Auth::user()->name,
'created_at' => $existingFoto['created_at'] ?? now()->toDateTimeString(),
'updated_by' => Auth::user()->name,
'updated_at' => now()->toDateTimeString(),
];
} else {
$fotoForm['upload_foto'][] = $newFotoData;
}
// Simpan kembali data ke database
$inspeksi->foto_form = json_encode($fotoForm);
$inspeksi->save();
return response()->json([
'success' => true,
'message' => 'Data berhasil diperbarui.',
], 200);
} catch (\Exception $e) {
return response()->json([
'success' => false,
'message' => 'Gagal memperbarui data: ' . $e->getMessage(),
], 500);
}
}
private function handleFileUpload(Request $request, $paramName, &$formatFotojson)
{
if ($request->hasFile($paramName)) {
$files = $request->file($paramName);
// Pastikan $files adalah array
if (!is_array($files)) {
$files = [$files];
}
$formatFotoData = [];
$nomor_registrasi = $request->nomor_registrasi;
foreach ($files as $index => $file) {
$timestamp = time();
$originalName = $file->getClientOriginalName();
$extension = $file->getClientOriginalExtension();
// Validasi nama file
if (empty($originalName)) {
$originalName = "file_{$timestamp}";
}
$uniqueFileName = "{$timestamp}.{$extension}";
// Simpan file
$nomor_registrasi = $request->nomor_registrasi;
$path = $file->storeAs("surveyor/{$paramName}/{$nomor_registrasi}", $uniqueFileName, 'public');
$fotoData = [
'name' => pathinfo($originalName, PATHINFO_FILENAME),
'path' => $path,
'category' => 'lainnya',
'sub' => null,
'description' => null,
'created_by' => Auth::user()->name,
'created_at' => now()->toDateTimeString(),
];
$formatFotoData[] = $fotoData;
}
// Struktur JSON yang konsisten
if (!isset($formatFotojson[$paramName])) {
$formatFotojson[$paramName] = $formatFotoData;
} else {
$formatFotojson[$paramName] = array_merge(
$formatFotojson[$paramName] ?? [],
$formatFotoData
);
}
return $formatFotoData;
}
return [];
}
public function hapusFoto(Request $request)
{
try {
$permohonanId = $request->permohonan_id;
$dokumentId = $request->dokument_id;
$paramName = $request->param_name;
$cleanRequestPath = str_replace('/storage/', '', $request->path);
$inspeksi = Inspeksi::firstOrNew(
['permohonan_id' => $permohonanId, 'dokument_id' => $dokumentId]
);
$fotoForm = json_decode($inspeksi->foto_form, true);
if (isset($fotoForm[$paramName]) && is_array($fotoForm[$paramName])) {
// Filter foto yang tidak sesuai dengan path yang akan dihapus
$fotoForm[$paramName] = array_values(array_filter(
$fotoForm[$paramName],
function ($foto) use ($cleanRequestPath) {
if ($foto['path'] === $cleanRequestPath) {
// Hapus file dari storage
\Storage::disk('public')->delete($cleanRequestPath);
return false;
}
return true;
}
));
// Simpan kembali data ke database
$inspeksi->foto_form = json_encode($fotoForm);
$inspeksi->save();
return response()->json([
'success' => true,
'message' => 'Foto berhasil dihapus',
], 200);
}
// Jika parameter tidak ditemukan
return response()->json([
'success' => false,
'message' => 'Foto atau parameter tidak ditemukan',
], 400);
} catch (\Exception $e) {
return response()->json([
'success' => false,
'message' => $e->getMessage()
], 500);
}
}
// Metode untuk mendapatkan foto yang sudah diupload
public function getFoto(Request $request)
{
$permohonanId = $request->permohonan_id;
$dokumentId = $request->dokument_id;
$paramName = $request->param_name;
$inspeksi = Inspeksi::firstOrNew(
['permohonan_id' => $permohonanId, 'dokument_id' => $dokumentId]
);
// Decode foto_form
$fotoForm = json_decode($inspeksi->foto_form, true) ?? [];
// Cari foto berdasarkan param name
$fotos = $this->findFotoByParamName($fotoForm, $paramName);
$data = array_map(function ($foto) {
return [
'name' => $foto['name'] ?? 'Foto',
'path' => \Storage::url($foto['path'] ?? ''),
'category' => $foto['category'] ?? 'lainnya',
'sub' => $foto['sub'] ?? null,
'description' => $foto['description'] ?? null,
'upload_by' => $foto['upload_by'] ?? null,
];
}, $fotos);
return response()->json([
'fotos' => $data,
'success' => !empty($data),
]);
}
private function findFotoByParamName($fotoForm, $paramName)
{
// Mapping parameter name ke struktur JSON
if (isset($fotoForm[$paramName]) && is_array($fotoForm[$paramName])) {
return $fotoForm[$paramName]; // Kembalikan array foto jika ditemukan
}
// Jika parameter tidak ditemukan atau bukan array, kembalikan array kosong
return [];
}
private function processObjekJaminanPhotos(Request $request, array $existingPhotos = [])
{
$photoField = 'foto_objek';
$nameField = 'name_objek';
$descriptionField = 'deskripsi_objek';
// Mulai dengan data lama
$result = $existingPhotos;
if ($request->hasFile($photoField)) {
$newFiles = $request->file($photoField, []);
$newNames = $request->input($nameField, []);
$newDescriptions = $request->input($descriptionField, []);
foreach ($newFiles as $key => $file) {
// Cari atau buat entri berdasarkan nama objek
$existingIndex = $this->findObjekJaminanIndexByName($result, $newNames[$key]);
// Buat entri baru untuk file yang diunggah
$newPhotoEntry = [
$nameField => $newNames[$key],
$photoField => $this->uploadFile($file, $photoField . '.' . $key),
$descriptionField => $newDescriptions[$key] ?? '',
];
// Jika sudah ada, update; jika belum, tambahkan
if ($existingIndex !== false) {
// Hapus file lama jika ada
if (isset($result[$existingIndex][$photoField])) {
$this->deleteOfFile($result[$existingIndex][$photoField]);
}
$result[$existingIndex] = $newPhotoEntry;
} else {
$result[] = $newPhotoEntry;
}
}
}
// Pastikan array tetap terurut dengan benar
return array_values($result);
}
/**
* Cari index objek jaminan berdasarkan nama objek
*/
private function findObjekJaminanIndexByName(array $existingPhotos, string $name)
{
foreach ($existingPhotos as $index => $photo) {
if (isset($photo['name_objek']) && $photo['name_objek'] === $name) {
return $index;
}
}
return false;
}
public function hapusLantai(Request $request)
{
$permohonanId = $request->permohonan_id;
$dokumentId = $request->dokument_id;
// Normalisasi path foto
$cleanRequestPath = str_replace(['storage/', 'surveyor/'], '', $request->foto_path);
$inspeksi = Inspeksi::firstOrNew(
['permohonan_id' => $permohonanId, 'dokument_id' => $dokumentId]
);
$fotoLantaiUnit = json_decode($inspeksi->foto_form, true);
// Konversi lantai ke string untuk konsistensi
$lantai = (string)$request->lantai;
// Cek apakah lantai ada di array
$pat = null;
if (isset($fotoLantaiUnit['foto_lantai_unit'][$lantai])) {
// Filter foto, hapus foto yang sesuai
$fotoLantaiUnit['foto_lantai_unit'][$lantai] = array_filter(
$fotoLantaiUnit['foto_lantai_unit'][$lantai],
function ($foto) use ($cleanRequestPath) {
// Normalisasi path foto yang tersimpan
$storedPath = str_replace(['storage/', 'surveyor/'], '', $foto['path']);
// Jika path cocok, hapus file dari storage
if ($storedPath === $cleanRequestPath) {
// Hapus file dari storage dengan berbagai kemungkinan path
$possiblePaths = [
'storage/surveyor/lantai_unit/' . $cleanRequestPath,
'storage/surveyor/' . $cleanRequestPath,
'storage/' . $cleanRequestPath,
$cleanRequestPath
];
foreach ($possiblePaths as $path) {
if (Storage::disk('public')->exists($path)) {
Storage::disk('public')->delete($path);
break;
}
}
return false; // Hapus dari array
}
return true;
}
);
// Reset index array
$fotoLantaiUnit['foto_lantai_unit'][$lantai] = array_values($fotoLantaiUnit['foto_lantai_unit'][$lantai]);
// Hapus lantai jika tidak ada foto
if (empty($fotoLantaiUnit['foto_lantai_unit'][$lantai])) {
unset($fotoLantaiUnit['foto_lantai_unit'][$lantai]);
}
// Update inspeksi
$inspeksi->foto_form = json_encode($fotoLantaiUnit);
$inspeksi->save();
return response()->json([
'success' => true,
'foto_lantai_unit' => $pat
]);
}
return response()->json([
'success' => false,
'message' => 'gagal menghapus'
], 404);
}
private function generateUniqueFileName($file, $prefix = '')
{
$extension = $file->getClientOriginalExtension();
return $prefix . '_' . uniqid() . '.' . $extension;
}
private function deleteOfFile($filePath)
{
if ($filePath && Storage::exists($filePath)) {
Storage::delete($filePath);
}
}
/**
* Custom validation request for foto
*/
public function validateFotoRequest(Request $request)
{
$maxSize = getMaxFileSize('Foto');
return $request->validate([
'permohonan_id' => 'required',
'dokument_id' => 'required',
'nomor_registrasi' => 'required',
'foto_rute.*' => 'required|image|mimes:jpeg,png,jpg,gif,svg,webp,bmp,tiff,heic,heif|max:'. $maxSize,
]);
}
public function submitSurveyor($id)
{
try {
// Get button status check result
$buttonStatusCheck = $this->checkButtonStatus($id);
$buttonStatus = json_decode($buttonStatusCheck->getContent(), true);
// Check if button should be disabled
if ($buttonStatus['buttonDisable']) {
return response()->json([
'success' => false,
'message' => 'Form belum lengkap. Pastikan semua data telah diisi dengan benar.',
], 422);
}
// If validation passes, update permohonan status
$permohonan = Permohonan::findOrFail($id);
$permohonan->update([
'status' => 'survey-completed',
'submitted_at' => now()
]);
return response()->json([
'success' => true,
'message' => 'Form surveyor berhasil disubmit'
], 200);
} catch (\Exception $e) {
return response()->json([
'success' => false,
'message' => 'Terjadi kesalahan',
'error' => $e->getMessage()
], 500);
}
}
public function checkButtonStatus($id)
{
try {
// Get all inspeksi records for this permohonan
$inspeksiRecords = Inspeksi::with(['dokument.jenisJaminan'])
->where('permohonan_id', $id)
->get();
if ($inspeksiRecords->isEmpty()) {
return response()->json(['buttonDisable' => true]);
}
$rapComplete = false;
foreach ($inspeksiRecords as $inspeksi) {
if (strtolower($inspeksi->name) === 'rap') {
$dataForm = json_decode($inspeksi->data_form, true);
$fotoForm = json_decode($inspeksi->foto_form, true);
$isInvalid = empty($dataForm) &&
empty($fotoForm);
if ($isInvalid) {
return response()->json(['buttonDisable' => true]);
}
} else {
$dataForm = json_decode($inspeksi->data_form, true);
$fotoForm = json_decode($inspeksi->foto_form, true);
$denahForm = json_decode($inspeksi->denah_form, true);
$dataPembanding = json_decode($inspeksi->data_pembanding, true);
$jenisJaminan = $inspeksi->dokument->jenisJaminan->name ?? '';
$isTanahBangunan = !in_array(
strtoupper($jenisJaminan ?? ''),
['KAPAL', 'PESAWAT', 'KENDARAAN', 'ALAT BERAT', 'MESIN']
);
$isInvalid =
empty($dataForm) ||
empty($fotoForm) ||
(($isTanahBangunan && empty($denahForm)) ||
empty($dataPembanding));
if ($isInvalid) {
return response()->json(['buttonDisable' => true]);
}
}
}
// If we get here, all checks passed
return response()->json(['buttonDisable' => false]);
} catch (\Exception $e) {
return response()->json([
'error' => 'Something went wrong',
'message' => $e->getMessage(),
'buttonDisable' => true
], 500);
}
}
public function storeJadwal(Request $request)
{
try {
$validate = $request->validate([
'id' => 'required',
'waktu_penilaian' => 'required',
'deskripsi_penilaian' => 'required'
]);
$penilaian = Penilaian::findOrFail($validate['id']);
$emailData = [
'email' => $penilaian->permohonan->user->email,
'subject' => 'Jadwal Kunjungan',
'emailData' => $validate,
];
Mail::to($emailData['email'])->send(new SendJadwalKunjunganEmail($emailData, $penilaian->permohonan->nomor_resitrasi, $penilaian->permohonan->debiture));
if (Carbon::parse($validate['waktu_penilaian']) <= Carbon::parse($penilaian->tanggal_kunjungan)) {
return redirect()
->route('surveyor.index')
->with('error', 'Waktu penilaian harus lebih besar dari tanggal assign.');
}
$penilaian->update([
'waktu_penilaian' => $validate['waktu_penilaian'],
'deskripsi_penilaian' => $validate['deskripsi_penilaian'],
]);
return redirect()
->route('surveyor.index')
->with('success', 'Jadwal berhasil dibuat.');
} catch (\Exception $e) {
\Log::error('Error sending email: ' . $e->getMessage());
return redirect()
->route('surveyor.index')
->with('error', 'Internal Server Error: ' . $e->getMessage());
}
}
public function storeFreeze($id, Request $request)
{
try {
$permohonan = Permohonan::findOrFail($id);
Authorization::updateOrCreate([
'permohonan_id' => $permohonan->id,
'jenis' => 'sla'
], [
'request' => 'freeze',
'user_id' => Auth::user()->id
]);
return response()->json([
'success' => true,
'message' => 'Berhasil Kirim permintaan Request Freeaze ke So'
], 200);
} catch (\Exception $e) {
return response()->json([
'success' => false,
'message' => 'Terjadi kesalahan',
'error' => $e->getMessage()
], 500);
}
}
private function formatDataPembanding($request)
{
$dataPembanding = [];
$pembandingCount = count($request->input('address_pembanding', []));
$fotoPembanding = $request->file('foto_objek_pembanding') ?? [];
$existingData = null;
if ($request->has('permohonan_id') && $request->has('dokument_id')) {
$inspeksi = Inspeksi::where('permohonan_id', $request->input('permohonan_id'))
->where('dokument_id', $request->input('dokument_id'))
->first();
if ($inspeksi) {
$existingData = json_decode($inspeksi->data_pembanding, true) ?? [];
}
}
for ($i = 0; $i < $pembandingCount; $i++) {
$pembanding = $this->formatSinglePembanding($request, $i);
$existingFoto = null;
if ($existingData && isset($existingData['data_pembanding'][$i]['foto_objek'])) {
$existingFoto = $existingData['data_pembanding'][$i]['foto_objek'];
}
// Penanganan foto pembanding
if (isset($fotoPembanding[$i]) && $fotoPembanding[$i]->isValid()) {
$pembanding['foto_objek'] = $this->handleupdateOrDeleteFile(
$fotoPembanding[$i],
'pembanding',
"pembanding_{$i}"
);
} else {
$pembanding['foto_objek'] = $existingFoto;
}
$dataPembanding[] = $pembanding;
}
return $dataPembanding;
}
private function formatSinglePembanding($request, $index)
{
$tanahBangunanTypes = ['KAPAL', 'PESAWAT', 'KENDARAAN', 'ALAT BERAT', 'MESIN'];
$action = isset($request->action) ? strtoupper(str_replace('-', ' ', $request->action)) : '';
if (in_array($action, $tanahBangunanTypes)) {
$fields = [
'address', 'village_code', 'district_code', 'city_code', 'province_code',
'nama', 'type','warna','lokasi', 'total', 'diskon', 'harga_diskon',
'sumber_data', 'harga', 'tahun','transmisi','telepon',
'kordinat_lat', 'kordinat_lng', 'tahun_pembuatan','merek_buatan','kapasitas','power','kondisi'
];
} else {
$fields = [
'address', 'village_code', 'district_code', 'city_code', 'province_code',
'tahun', 'luas_tanah', 'luas_bangunan', 'tahun_bangunan',
'status_nara_sumber', 'harga', 'harga_diskon', 'diskon', 'total', 'nama_nara_sumber',
'peruntukan', 'penawaran', 'telepon','hak_properti',
'kordinat_lat', 'kordinat_lng', 'jenis_aset','foto_objek'
];
}
$pembanding = [];
foreach ($fields as $field) {
$inputName = "{$field}_pembanding";
$inputValue = $request->input($inputName);
// Pastikan input adalah array dan index valid
if (is_array($inputValue) && isset($inputValue[$index])) {
$value = $inputValue[$index];
// Format hanya untuk harga, harga_diskon, dan total
if (in_array($field, ['harga', 'harga_diskon', 'total'])) {
$value = preg_replace('/[^0-9]/', '', $value); // Hapus karakter non-angka
}
$pembanding[$field] = $value;
} else {
$pembanding[$field] = null;
}
}
return $pembanding;
}
private function handleupdateOrDeleteFile($file, $type, $prefix)
{
try {
if ($file) {
// Generate nama file unik
$fileName = $prefix . '_' . uniqid() . '_' . time() . '.' . $file->getClientOriginalExtension();
$path = "{$type}/" . date('Y/m');
Storage::makeDirectory("public/{$path}");
$filePath = $file->storeAs("public/{$path}", $fileName);
return str_replace('public/', '', $filePath);
}
return null;
} catch (\Exception $e) {
\Log::error('File upload error: ' . $e->getMessage());
throw new \Exception("Gagal mengupload file: " . $e->getMessage());
}
}
private function formatObjekPenilaian($request)
{
$fields = [
'address', 'village_code', 'district_code', 'city_code', 'province_code',
'luas_tanah', 'luas_tanah_bagunan', 'total', 'diskon', 'harga_diskon',
'status_nara_sumber', 'harga', 'nama_nara_sumber','hak_properti','telepon',
'kordinat_lat', 'kordinat_lng', 'jenis_aset','penawaran',
];
$inspeksi = Inspeksi::where('permohonan_id', $request->input('permohonan_id'))
->where('dokument_id', $request->input('dokument_id'))
->first();
if ($inspeksi) {
$needsSave = false;
// Handle foto_form
$fotoForm = json_decode($inspeksi->foto_form, true) ?: [];
if (!isset($fotoForm['object_jaminan'])) {
$fotoForm['object_jaminan'] = [['foto_objek' => null]];
$needsSave = true;
}
// Handle data_form
$dataForm = json_decode($inspeksi->data_form, true) ?: [];
// Inisialisasi struktur data jika belum ada
if ($request->filled('luas_tanah_bagunan')) {
if (!isset($dataForm['bangunan'])) {
$dataForm['bangunan'] = [];
}
if (!isset($dataForm['bangunan']['luas_tanah_bagunan'])) {
$dataForm['bangunan']['luas_tanah_bagunan'] = [];
}
$cekBanguan = isset($dataForm['bangunan']['luas_tanah_bagunan']['sesuai']) && $dataForm['bangunan']['luas_tanah_bagunan']['sesuai'] === 'sesuai'
? 'sesuai'
: 'tidak sesuai';
$dataForm['bangunan']['luas_tanah_bagunan'][$cekBanguan] = $request->input('luas_tanah_bagunan');
$needsSave = true;
}
if ($request->filled('luas_tanah')) {
if (!isset($dataForm['tanah'])) {
$dataForm['tanah'] = [];
}
if (!isset($dataForm['tanah']['luas_tanah'])) {
$dataForm['tanah']['luas_tanah'] = [];
}
$cekLuas = isset($dataForm['tanah']['luas_tanah']['sesuai']) && $dataForm['tanah']['luas_tanah']['sesuai'] === 'sesuai'
? 'sesuai'
: 'tidak sesuai';
$dataForm['tanah']['luas_tanah'][$cekLuas] = $request->input('luas_tanah');
$needsSave = true;
}
if (!isset($dataForm['asset'])) {
$dataForm['asset'] = [];
$needsSave = true;
}
// Update data dengan mempertahankan struktur sesuai/tidak sesuai
foreach ($fields as $field) {
if ($request->filled($field)) {
$newValue = $request->input($field);
if (in_array($field, ['harga', 'harga_diskon', 'total'])) {
$newValue = preg_replace('/[^0-9]/', '', $newValue);
}
// Fields untuk tanah
if (in_array($field, ['luas_tanah'])) {
// Pastikan struktur array ada sebelum diakses
if (!isset($dataForm['tanah']['luas_tanah'])) {
$dataForm['tanah']['luas_tanah'] = [];
}
$cekLuas = isset($dataForm['tanah']['luas_tanah']['sesuai']) && $dataForm['tanah']['luas_tanah']['sesuai'] === 'sesuai'
? 'sesuai'
: 'tidak sesuai';
$dataForm['tanah']['luas_tanah'][$cekLuas] = $newValue;
$needsSave = true;
}
// Fields untuk bangunan
elseif (in_array($field, ['luas_tanah_bagunan'])) {
if (!isset($dataForm['bangunan']['luas_tanah_bagunan'])) {
$dataForm['bangunan']['luas_tanah_bagunan'] = [];
}
$cekBanguan = isset($dataForm['bangunan']['luas_tanah_bagunan']['sesuai']) && $dataForm['bangunan']['luas_tanah_bagunan']['sesuai'] === 'sesuai'
? 'sesuai'
: 'tidak sesuai';
$dataForm['bangunan']['luas_tanah_bagunan'][$cekBanguan] = $newValue;
$needsSave = true;
}
// Fields untuk alamat dalam asset
// Fields untuk alamat dalam asset
elseif (in_array($field, ['address', 'village_code', 'district_code', 'city_code', 'province_code'])) {
if (!isset($dataForm['asset']['alamat'])) {
$dataForm['asset']['alamat'] = [
'sesuai' => [
'address' => '',
'village_code' => '',
'district_code' => '',
'city_code' => '',
'province_code' => ''
]
];
}
// Tentukan status alamat (sesuai/tidak sesuai)
$alamatStatus = isset($dataForm['asset']['alamat']['sesuai']) ? 'sesuai' : 'tidak sesuai';
// Update nilai dalam status yang ada
if (!isset($dataForm['asset']['alamat'][$alamatStatus])) {
$dataForm['asset']['alamat'][$alamatStatus] = [];
}
// Update nilai field yang sesuai
$dataForm['asset']['alamat'][$alamatStatus][$field] = $newValue;
}
// Jenis asset dalam asset
elseif ($field === 'jenis_asset') {
$assetStatus = $request->input('asset_status', 'sesuai');
$dataForm['asset']['jenis_asset'] = [
$assetStatus => $newValue
];
}
// Fields lainnya dalam asset
else {
if (!isset($dataForm['asset'][$field])) {
$dataForm['asset'][$field] = [];
}
$dataForm['asset'][$field] = $newValue;
}
$needsSave = true;
}
}
if ($needsSave) {
$inspeksi->foto_form = json_encode($fotoForm);
$inspeksi->data_form = json_encode($dataForm);
$inspeksi->save();
}
$existingFoto = $fotoForm['object_jaminan'][0]['foto_objek'] ?? null;
// Gabungkan data dari tanah, bangunan, dan asset
$objekPenilaian = array_merge(
['foto_objek' => $existingFoto],
$dataForm['tanah'] ?? [],
$dataForm['bangunan'] ?? [],
array_reduce($fields, function ($carry, $field) use ($request, $dataForm) {
if (isset($dataForm['asset'][$field])) {
if (is_array($dataForm['asset'][$field])) {
if (isset($dataForm['asset'][$field]['sesuai'])) {
$carry[$field] = $dataForm['asset'][$field]['sesuai'];
} elseif (isset($dataForm['asset'][$field]['tidak sesuai'])) {
$carry[$field] = $dataForm['asset'][$field]['tidak sesuai'];
}
} else {
$carry[$field] = $dataForm['asset'][$field];
}
} else {
$carry[$field] = $request->input($field);
}
return $carry;
}, [])
);
} else {
// Inisialisasi data baru
$objekPenilaian = array_reduce($fields, function ($carry, $field) use ($request) {
$carry[$field] = $request->input($field);
return $carry;
}, ['foto_objek' => null]);
}
return $objekPenilaian;
}
private function formatObjekPenilaiankendaraan($request)
{
$fields = [
'address', 'village_code', 'district_code', 'city_code', 'province_code',
'nama', 'type','warna','lokasi', 'total', 'diskon', 'harga_diskon',
'sumber_data', 'harga', 'tahun','transmisi','telepon',
'kordinat_lat', 'kordinat_lng', 'tahun_pembuatan','merek_buatan','kapasitas','power','kondisi'
];
$inspeksi = Inspeksi::where('permohonan_id', $request->input('permohonan_id'))
->where('dokument_id', $request->input('dokument_id'))
->first();
if ($inspeksi) {
$needsSave = false;
// Handle foto_form
$fotoForm = json_decode($inspeksi->foto_form, true) ?: [];
if (!isset($fotoForm['object_jaminan'])) {
$fotoForm['object_jaminan'] = [['foto_objek' => null]];
$needsSave = true;
}
// Handle data_form
$dataForm = json_decode($inspeksi->data_form, true) ?: [];
// Update data dengan mempertahankan struktur sesuai/tidak sesuai
foreach ($fields as $field) {
if ($request->filled($field)) {
$newValue = $request->input($field);
if (in_array($field, ['harga', 'harga_diskon', 'total'])) {
$newValue = preg_replace('/[^0-9]/', '', $newValue);
}
// Fields untuk alamat dalam asset
if (in_array($field, ['address', 'village_code', 'district_code', 'city_code', 'province_code'])) {
if (!isset($dataForm['alamat'])) {
$dataForm['alamat'] = [];
}
$alamatStatus = $dataForm['alamat'] == 'sesuai' ? 'sesuai' : 'tidak sesuai';
if (!isset($dataForm['alamat'][$alamatStatus])) {
$dataForm['alamat'][$alamatStatus] = [];
}
$dataForm['alamat'][$alamatStatus][$field] = $newValue;
} else {
if (!isset($dataForm[$field])) {
$dataForm[$field] = [];
}
$dataForm[$field] = $newValue;
}
$needsSave = true;
}
}
if ($needsSave) {
$inspeksi->foto_form = json_encode($fotoForm);
$inspeksi->data_form = json_encode($dataForm);
$inspeksi->save();
}
$existingFoto = $fotoForm['object_jaminan'][0]['foto_objek'] ?? null;
// Gabungkan data dari tanah, bangunan, dan asset
$objekPenilaian = array_merge(
['foto_objek' => $existingFoto],
array_reduce($fields, function ($carry, $field) use ($request, $dataForm) {
if (isset($dataForm[$field])) {
if (is_array($dataForm[$field])) {
if (isset($dataForm[$field]['sesuai'])) {
$carry[$field] = $dataForm[$field]['sesuai'];
} elseif (isset($dataForm[$field]['tidak sesuai'])) {
$carry[$field] = $dataForm[$field]['tidak sesuai'];
}
} else {
$carry[$field] = $dataForm[$field];
}
} else {
$carry[$field] = $request->input($field);
}
return $carry;
}, [])
);
} else {
// Inisialisasi data baru
$objekPenilaian = array_reduce($fields, function ($carry, $field) use ($request) {
$carry[$field] = $request->input($field);
return $carry;
}, ['foto_objek' => null]);
}
return $objekPenilaian;
}
private function saveInspeksi($formattedData)
{
$inspeksi = Inspeksi::updateOrCreate(
[
'permohonan_id' => $formattedData['permohonan_id'],
'dokument_id' => $formattedData['dokument_id']
],
[
'data_pembanding' => json_encode($formattedData),
'name' => $formattedData['type']
]
);
return $inspeksi;
}
public function storeDataPembanding(Request $request)
{
try {
DB::beginTransaction();
$maxSize = getMaxFileSize('Foto');
$validator = $request->validate([
'permohonan_id' => 'required|exists:permohonan,id',
'type' => 'required|string',
'dokument_id' => 'required',
'name_foto_objek' => 'nullable|string',
'nomor_registrasi' => 'required|string',
'foto_objek' => 'nullable|image|max:'.$maxSize,
'foto_objek_pembanding.*' => 'nullable|image|max:'.$maxSize,
]);
$tanahBangunanTypes = ['KAPAL', 'PESAWAT', 'KENDARAAN', 'ALAT BERAT', 'MESIN'];
$action = isset($request->action) ? strtoupper(str_replace('-', ' ', $request->action)) : '';
if (in_array($action, $tanahBangunanTypes)) {
$objekPenilaian = $this->formatObjekPenilaiankendaraan($request);
} else {
$objekPenilaian = $this->formatObjekPenilaian($request);
}
if ($request->hasFile('foto_objek')) {
$newFoto = $this->handleEditTampakDepan($request);
$objekPenilaian['foto_objek'] = $newFoto;
}
$formattedData = [
'permohonan_id' => $request->input('permohonan_id'),
'type' => $request->input('type'),
'dokument_id' => $request->input('dokument_id'),
'objek_penilaian' => $objekPenilaian,
'data_pembanding' => $this->formatDataPembanding($request)
];
$inspeksi = $this->saveInspeksi($formattedData);
DB::commit();
return response()->json([
'success' => true,
'message' => 'Data berhasil disimpan',
'data' => $formattedData
], 200);
} catch (\Exception $e) {
DB::rollBack();
return response()->json([
'success' => false,
'message' => 'Gagal menyimpan data: ' . $e->getMessage()
], 500);
}
}
public function handleEditTampakDepan(Request $request)
{
$nomor_registrasi = $request->nomor_registrasi;
// Ambil data inspeksi
$inspeksi = Inspeksi::where('permohonan_id', $request->input('permohonan_id'))
->where('dokument_id', $request->input('dokument_id'))
->firstOrFail();
// Bersihkan path dari request
$cleanRequestPath = str_replace('/storage/', '', $request['path']);
// Ambil foto_form dari inspeksi
$fotoForm = json_decode($inspeksi->foto_form, true) ?? [];
$fotoForm['upload_foto'] = $fotoForm['upload_foto'] ?? [];
$existingIndex = null;
if (!empty($request['path'])) {
foreach ($fotoForm['upload_foto'] as $index => $foto) {
if ($foto['path'] === $cleanRequestPath) {
$existingIndex = $index;
break;
}
}
}
if ($request->hasFile('foto_objek')) {
$file = $request->file('foto_objek');
$timestamp = time();
$originalName = $file->getClientOriginalName();
$extension = $file->getClientOriginalExtension();
// Validasi nama file
if (empty($originalName)) {
$originalName = "file_{$timestamp}";
}
$uniqueFileName = "{$timestamp}.{$extension}";
// Simpan file ke penyimpanan publik
$path = $file->storeAs("surveyor/upload_foto/{$nomor_registrasi}", $uniqueFileName, 'public');
// Data baru untuk foto
$newFotoData = [
'name' => $originalName,
'description' => null,
'category' => 'Tampak Depan',
'sub' => null,
'path' => $path,
'created_by' => Auth::user()->name,
'created_at' => now()->toDateTimeString(),
'updated_by' => Auth::user()->name,
'updated_at' => now()->toDateTimeString(),
];
// Update atau tambahkan data baru
if ($existingIndex !== null) {
$fotoForm['upload_foto'][$existingIndex] = $newFotoData;
} else {
$fotoForm['upload_foto'][] = $newFotoData;
}
// Simpan kembali data ke database
$inspeksi->foto_form = json_encode($fotoForm);
$inspeksi->save();
return $path;
}
}
/**
* Form inspeksi.
*/
public function formInspeksi(Request $request, $id)
{
$validated = $request->validate([
'dokument' => 'required',
'jenis_jaminan' => 'required'
]);
$dokumentId = $validated['dokument'];
$jaminanId = $validated['jenis_jaminan'];
$permohonan = $this->getPermohonanJaminanId($id, $dokumentId, $jaminanId);
$link_url_region = Teams::with('regions', 'teamsUsers')
->whereHas('teamsUsers', function ($query) {
$query->where('user_id', Auth::user()->id);
})->first();
$branches = Branch::all();
$provinces = Province::all();
$surveyor = $id;
$basicData = $this->getCommonData();
$inpeksi = Inspeksi::where('permohonan_id', $id)->where('dokument_id', $dokumentId)->first();
$forminspeksi = null;
if ($inpeksi) {
$forminspeksi = json_decode($inpeksi->data_form, true);
}
// Default: gunakan data dari debitur
$debitur = Debiture::find($permohonan->debiture_id);
$provinceCode = $debitur->province_code;
$cityCode = $debitur->city_code;
$districtCode = $debitur->district_code;
// Jika alamat tidak sesuai, override dengan kode dari alamat
$cekAlamat = $forminspeksi['asset']['alamat']['tidak sesuai'] ?? null;
if ($cekAlamat) {
$provinceCode = $cekAlamat['province_code'] ?? $provinceCode;
$cityCode = $cekAlamat['city_code'] ?? $cityCode;
$districtCode = $cekAlamat['district_code'] ?? $districtCode;
// Ambil data menggunakan kode yang telah ditentukan
}
$cities = City::where('province_code', $provinceCode)->get();
$districts = District::where('city_code', $cityCode)->get();
$villages = Village::where('district_code', $districtCode)->get();
if ($forminspeksi) {
if (isset($forminspeksi['alamat']['sesuai']['province_code'])) {
$cities = City::where('province_code', $forminspeksi['alamat']['sesuai']['province_code'])->get();
}
if (isset($forminspeksi['alamat']['sesuai']['city_code'])) {
$districts = District::where('city_code', $forminspeksi['alamat']['sesuai']['city_code'])->get();
}
if (isset($forminspeksi['alamat']['sesuai']['district_code'])) {
$villages = Village::where('district_code', $forminspeksi['alamat']['sesuai']['district_code'])->get();
}
}
return view('lpj::surveyor.components.inspeksi', compact(
'permohonan',
'surveyor',
'branches',
'provinces',
'debitur',
'cities',
'districts',
'villages',
'link_url_region',
'forminspeksi',
'basicData',
'cekAlamat'
));
}
/**
* Denah.
*/
public function denah(Request $request, $id)
{
$validated = $request->validate([
'dokument' => 'required',
'jenis_jaminan' => 'required'
]);
$dokumentId = $validated['dokument'];
$jaminanId = $validated['jenis_jaminan'];
$permohonan = $this->getPermohonanJaminanId($id, $dokumentId, $jaminanId);
$denah = null;
$inpeksi = Inspeksi::where('permohonan_id', $id)->where('dokument_id', $dokumentId)->first();
$formDenah = null;
if ($inpeksi) {
$formDenah = json_decode($inpeksi->denah_form, true);
}
// return response()->json($formDenah);
return view('lpj::surveyor.components.denah', compact('permohonan', 'denah', 'formDenah'));
}
/**
* Foto.
*/
public function foto(Request $request, $id)
{
$validated = $request->validate([
'dokument' => 'required',
'jenis_jaminan' => 'required'
]);
$dokumentId = $validated['dokument'];
$jaminanId = $validated['jenis_jaminan'];
$fotoObjekJaminan = FotoObjekJaminan::all();
$permohonan = $this->getPermohonanJaminanId($id, $dokumentId, $jaminanId);
$surveyor = $id;
$branches = Branch::all();
$provinces = Province::all();
$inpeksi = Inspeksi::where('permohonan_id', $id)->where('dokument_id', $dokumentId)->first();
$formFoto = null;
if ($inpeksi) {
$formFoto = json_decode($inpeksi->foto_form, true);
}
$fotoJaminan = null;
return view('lpj::surveyor.components.foto', compact('permohonan', 'surveyor', 'branches', 'provinces', 'fotoJaminan', 'formFoto', 'fotoObjekJaminan'));
}
/**
* Data pembanding.
*/
public function dataPembanding(Request $request, $id)
{
try {
// Ambil data permohonan dengan eager loading
$validated = $request->validate([
'dokument' => 'required',
'jenis_jaminan' => 'required'
]);
$dokumentId = $validated['dokument'];
$jaminanId = $validated['jenis_jaminan'];
$permohonan = $this->getPermohonanJaminanId($id, $dokumentId, $jaminanId);
// Ambil data inspeksi
$inspeksi = Inspeksi::where([
'permohonan_id' => $id,
'dokument_id' => $dokumentId
])->first();
// Inisialisasi variabel
$inspectionData = null;
$comparisons = null;
$fotoForm = null;
if ($inspeksi) {
$inspectionData = json_decode($inspeksi->data_form, true);
if (json_last_error() !== JSON_ERROR_NONE) {
throw new \Exception('Harap mengisi form inspeksi terlebih dahulu.');
}
if ($inspeksi->data_pembanding) {
$comparisons = json_decode($inspeksi->data_pembanding, true);
if (json_last_error() !== JSON_ERROR_NONE) {
throw new \Exception('Error decoding comparison data: ' . json_last_error_msg());
}
}
$fotoForm = json_decode($inspeksi->foto_form, true);
}
// Ambil data pendukung
$data = $this->getCommonData();
$provinces = Province::all();
$cities = City::where('province_code', $this->getCodeAlamat('province_code', $inspectionData))->get();
$districts = District::where('city_code', $this->getCodeAlamat('city_code', $inspectionData))->get();
$villages = Village::where('district_code', $this->getCodeAlamat('district_code', $inspectionData))->get();
return view('lpj::surveyor.components.data-pembanding', compact(
'permohonan',
'id',
'inspectionData',
'comparisons',
'data',
'jaminanId',
'fotoForm',
'cities',
'districts',
'villages',
'provinces',
'inspeksi'
));
} catch (\Exception $e) {
return redirect()
->back()
->with('error', 'Terjadi kesalahan saat memuat data: ' . $e->getMessage());
}
}
public function getCodeAlamat($code, $inspectionData)
{
$tanahBangunanTypes = ['KAPAL', 'PESAWAT', 'KENDARAAN', 'ALAT BERAT', 'MESIN'];
$action = isset($inspectionData['action']) ? strtoupper(str_replace('-', ' ', $inspectionData['action'])) : '';
if (in_array($action, $tanahBangunanTypes)) {
return $selectedProvince = $inspectionData['alamat']['sesuai'][$code] ?? null;
}
if (isset($inspectionData['asset'])) {
$cekAlamat = isset($inspectionData['asset']['alamat']['sesuai']) ? 'sesuai' : 'tidak sesuai';
$selectedProvince = $inspectionData['asset']['alamat'][$cekAlamat][$code] ?? null;
return $selectedProvince;
}
return null;
}
private function getHeader(string $type): array
{
return self::HEADERS[$type] ?? [];
}
public function data(Request $request)
{
$type = $request->route('type');
$header = $this->getHeader($request->route('type'));
return view('lpj::surveyor.data.index', compact('header'));
}
public function createData($type)
{
$spekKategoriBagunan = SpekKategoritBangunan::all();
$header = $this->getHeader($type);
return view('lpj::surveyor.data.form', compact('header', 'spekKategoriBagunan'));
}
public function storeData(SurveyorRequest $request, $type)
{
$validate = $request->validated();
if ($validate) {
try {
$type = $request->route('type');
$modelClass = $this->getModelClass($type);
if (!$modelClass) {
return redirect()
->route('basicdata.' . $type . '.index')
->with('error', 'Invalid type specified.');
}
if ($type == 'spek-bangunan') {
$validate['spek_kategori_bagunan_id'] = $request->spek_kategori_bagunan_id;
}
$data = array_merge($validate, ['status' => true]);
$modelClass::create($data);
return redirect()
->route('basicdata.' . $type . '.index')
->with('success', 'created successfully');
} catch (Exeception $e) {
return redirect()
->route('basicdata.' . $type . '.index')
->with('error', $th->getMessage());
}
}
}
public function editData($type, $id)
{
$dataMap = [
'bentuk-tanah' => ['Bentuk Tanah', 'bentuk-tanah', BentukTanah::class],
'kontur-tanah' => ['Kontur Tanah', 'kontur-tanah', KonturTanah::class],
'posisi-kavling' => ['Posisi Kavling', 'posisi-kavling', PosisiKavling::class],
'ketinggian-tanah' => ['Ketinggian Tanah', 'ketinggian-tanah', KetinggianTanah::class],
'kondisi-fisik-tanah' => ['Kondisi Fisik Tanah', 'kondisi-fisik-tanah', KondisiFisikTanah::class],
'jenis-bangunan' => ['Jenis Bangunan', 'jenis-bangunan', JenisBangunan::class],
'kondisi-bangunan' => ['Kondisi Bangunan', 'kondisi-bangunan', KondisiBangunan::class],
'sifat-bangunan' => ['Sifat Bangunan', 'sifat-bangunan', SifatBangunan::class],
'spek-bangunan' => ['Spek Bangunan', 'spek-bangunan', SpekBangunan::class],
'spek-kategori-bangunan' => ['Spek Kategori Bangunan', 'spek-kategori-bangunan', SpekKategoritBangunan::class],
'sarana-pelengkap' => ['Sarana Pelengkap', 'sarana-pelengkap', SaranaPelengkap::class],
'lantai-unit' => ['Lantai Unit', 'lantai-unit', Lantai::class],
'view-unit' => ['View Unit', 'view-unit', ViewUnit::class],
'gol-mas-sekitar' => ['Golongan Masyarakat Sekitar', 'gol-mas-sekitar', GolonganMasySekitar::class],
'jenis-pesawat' => ['Jenis Pasawat', 'jenis-pesawat', JenisPesawat::class],
'model-alat-berat' => ['Model Alat Berat', 'model-alat-berat', ModelAlatBerat::class],
'jenis-kapal' => ['Jenis Kapal', 'jenis-kapal', JenisKapal::class],
'jenis-kendaraan' => ['Jenis Kendaraan', 'jenis-kendaraan', JenisKendaraan::class],
'jenis-unit' => ['Jenis unit', 'jenis-unit', JenisUnit::class],
'terletak-area' => ['Terletak di Area', 'terletak-area', TerletakArea::class],
'merupakan-daerah' => ['Merupakan Daerah', 'merupakan-daerah', MerupakanDaerah::class],
'posisi-unit' => ['Posisi unit', 'posisi-unit', PosisiUnit::class],
'bentuk-unit' => ['Bentuk unit', 'bentuk-unit', BentukUnit::class],
'fasilitas-objek' => ['Fasilitas Umum Dekat Objek', 'fasilitas-objek', FasilitasObjek::class],
'foto-objek-jaminan' => ['Foto Objek Jaminan', 'foto-objek-jaminan', FotoObjekJaminan::class],
];
if (!array_key_exists($type, $dataMap)) {
return redirect()->back()->with('error', 'Invalid type specified.');
}
[$headers, $routeName, $modelClass] = $dataMap[$type];
$header = $dataMap[$type] ?? '';
$model = $modelClass::findOrFail($id);
$spekKategoriBagunan = null;
if ($type == 'spek-bangunan') {
$spekKategoriBagunan = SpekKategoritBangunan::all();
}
return view('lpj::surveyor.data.form', compact('header', 'model', 'spekKategoriBagunan'));
}
public function updateData(SurveyorRequest $request, $type, $id)
{
$validate = $request->validated();
if ($validate) {
$modelClass = $this->getModelClass($type);
if ($type == 'spek-bangunan') {
$validate['spek_kategori_bagunan_id'] = $request->spek_kategori_bagunan_id;
}
if ($type == 'foto-objek-jaminan') {
$validate['kategori'] = $request->kategori;
}
// Check if the provided type exists in the modelClasses
if (!$modelClass) {
return redirect()
->route('basicdata.' . $type . '.index')
->with('error', 'Invalid type specified.');
}
$model = $modelClass::findOrFail($id);
$model->update($validate);
// Redirect back with a success message
return redirect()
->route('basicdata.' . $type . '.index')
->with('success', 'Updated successfully');
}
}
public function update_analisa($id, Request $request)
{
try {
$permohonan = Permohonan::with([
'user',
'debiture.province',
'debiture.city',
'debiture.district',
'debiture.village',
'branch',
'tujuanPenilaian',
'penilaian',
'documents',
])->findOrFail($id);
$jenisAssetUpdated = false;
if ($request->input('types') == 'jenis_asset') {
$this->updateJenisAsset($permohonan, $request);
$jenisAssetUpdated = true;
}
if (in_array($request->input('types'), ['analisa_tanah', 'analisa_bangunan', 'analisa_unit'])) {
$key = match ($request->input('types')) {
'analisa_tanah' => 'luas_tanah',
'analisa_bangunan' => 'luas_bangunan',
'analisa_unit' => 'luas_unit',
};
$this->updateDetails($permohonan, $key, $request->input($key));
}
return response()->json([
'success' => true,
'message' => 'Data berhasil disimpan',
'jenis_asset' => $jenisAssetUpdated,
], 200);
} catch (\Exception $e) {
return response()->json(['error' => 'Something went wrong', 'message' => $e->getMessage()], 500);
}
}
private function updateJenisAsset($permohonan, $request)
{
$jenis_jaminan_id = $permohonan->documents->first()->jenis_jaminan_id;
DokumenJaminan::where('permohonan_id', $permohonan->id)
->where('jenis_jaminan_id', $jenis_jaminan_id)
->update([
'jenis_jaminan_id' => $request->input('jenis_asset'),
]);
}
private function updateDetails($permohonan, $key, $newValue)
{
$document = $permohonan->documents->first();
if (!$document) {
throw new \Exception("Document not found");
}
$detailsUpdate = DetailDokumenJaminan::where('dokumen_jaminan_id', $document->id)->first();
if (!$detailsUpdate) {
throw new \Exception("DetailDokumenJaminan not found");
}
$datas = json_decode($detailsUpdate->details, true) ?? [];
if (!is_scalar($newValue)) {
throw new \InvalidArgumentException("New value must be a scalar (string/number)");
}
// Update nilai berdasarkan kunci
if (array_key_exists($key, $datas)) {
$datas[$key] = $newValue;
} else {
throw new \Exception("Key '{$key}' not found in details");
}
// Simpan kembali ke database
$detailsUpdate->update([
'details' => json_encode($datas),
]);
}
public function dataForDatatables(Request $request)
{
if (is_null($this->user) || !$this->user->can('debitur.view')) {
// abort(403, 'Sorry! You are not allowed to view users.');
}
$query = Permohonan::query();
if ($request->has('search') && !empty($request->get('search'))) {
$search = $request->get('search');
$query->where(function ($q) use ($search) {
$q->where('nomor_registrasi', 'LIKE', '%' . $search . '%');
$q->orWhere('tanggal_permohonan', 'LIKE', '%' . $search . '%');
$q->orWhereRelation('user', 'name', 'LIKE', '%' . $search . '%');
$q->orWhereRelation('debiture', 'name', 'LIKE', '%' . $search . '%');
$q->orWhereRelation('tujuanPenilaian', 'name', 'LIKE', '%' . $search . '%');
$q->orWhereRelation('branch', 'name', 'LIKE', '%' . $search . '%');
$q->orWhere('status', 'LIKE', '%' . $search . '%');
});
}
$query->whereRaw('LOWER(status) IN (?, ?, ?, ?, ?, ? ,?,?)', ['assign', 'survey', 'proses-survey', 'request-reschedule', 'reschedule', 'rejected-reschedule', 'approved-reschedule', 'revisi-laporan' ]);
if (!Auth::user()->hasRole('administrator')) {
$query->whereHas('penilaian.userPenilai', function ($q) {
$q->where('user_id', Auth::user()->id);
$q->where('role', 'surveyor');
});
}
if ($request->has('sortOrder') && !empty($request->get('sortOrder'))) {
$order = $request->get('sortOrder');
$column = $request->get('sortField');
$query->orderBy($column, $order);
}
$totalRecords = $query->count();
$size = $request->get('size', 10);
if ($size == 0) {
$size = 10;
}
if ($request->has('page') && $request->has('size')) {
$page = $request->get('page', 1);
$offset = ($page - 1) * $size;
$query->skip($offset)->take($size);
}
$filteredRecords = $query->count();
$data = $query->with(['user', 'debiture', 'branch', 'tujuanPenilaian', 'jenisFasilitasKredit', 'penilaian'])->get();
$pageCount = ceil($totalRecords / $size);
$currentPage = max(1, $request->get('page', 1));
return response()->json([
'draw' => $request->get('draw'),
'recordsTotal' => $totalRecords,
'recordsFiltered' => $filteredRecords,
'pageCount' => $pageCount,
'page' => $currentPage,
'totalCount' => $totalRecords,
'data' => $data,
]);
}
public function dataForDatatablesData(Request $request, $type)
{
if (is_null($this->user) || !$this->user->can('jenis_aset.view')) {
//abort(403, 'Sorry! You are not allowed to view users.');
}
$models = [
'Bentuk Tanah' => BentukTanah::class,
'Kontur Tanah' => KonturTanah::class,
'Posisi Kavling' => PosisiKavling::class,
'Ketinggian Tanah' => KetinggianTanah::class,
'Kondisi Fisik Tanah' => KondisiFisikTanah::class,
'Jenis Bangunan' => JenisBangunan::class,
'Kondisi Bangunan' => KondisiBangunan::class,
'Sifat Bangunan' => SifatBangunan::class,
'Spek Kategori Bangunan' => SpekKategoritBangunan::class,
'Spek Bangunan' => SpekBangunan::class,
'Sarana Pelengkap' => SaranaPelengkap::class,
'Lalu Lintas Depan Lokasi' => LaluLintasLokasi::class,
'Tingkat Keramaian' => TingkatKeramaian::class,
'Golongan Masyarakat Sekitar' => GolonganMasySekitar::class,
'Lantai Unit' => Lantai::class,
'View Unit' => ViewUnit::class,
'Perkerasan jalan' => PerkerasanJalan::class,
'Jenis pesawat' => JenisPesawat::class,
'Model alat berat' => ModelAlatBerat::class,
'Jenis kapal' => JenisKapal::class,
'Jenis kendaraan' => JenisKendaraan::class,
'Terletak di Area' => TerletakArea::class,
'Posisi unit' => PosisiUnit::class,
'Bentuk unit' => BentukUnit::class,
'Fasilitas Umum Dekat Objek' => FasilitasObjek::class,
'Merupakan Daerah' => MerupakanDaerah::class,
'Jenis unit' => JenisUnit::class,
'Foto Objek Jaminan' => FotoObjekJaminan::class,
'Perizinan' => Perizinan::class,
];
if (array_key_exists($type, $models)) {
$query = $models[$type]::query();
} else {
throw new InvalidArgumentException("Invalid type: $type");
}
if ($request->has('search') && !empty($request->get('search'))) {
$search = $request->get('search');
$query->where(function ($q) use ($search) {
$q->where('code', 'LIKE', "%$search%");
$q->orWhere('name', 'LIKE', "%$search%");
});
}
// Apply sorting if provided
if ($request->has('sortOrder') && !empty($request->get('sortOrder'))) {
$order = $request->get('sortOrder');
$column = $request->get('sortField');
$query->orderBy($column, $order);
}
// Get the total count of records
$totalRecords = $query->count();
// Apply pagination if provided
if ($request->has('page') && $request->has('size')) {
$page = $request->get('page');
$size = $request->get('size');
$offset = ($page - 1) * $size; // Calculate the offset
$query->skip($offset)->take($size);
}
// Get the filtered count of records
$filteredRecords = $query->count();
// Get the data for the current page
if ($type == 'Spek Bangunan') {
$data = $query->with(['bangunanKategori'])->get();
} else {
$data = $query->get();
}
// Calculate the page count
$pageCount = ceil($totalRecords / $request->get('size'));
// Calculate the current page number
$currentPage = 0 + 1;
// Return the response data as a JSON object
return response()->json([
'draw' => $request->get('draw'),
'recordsTotal' => $totalRecords,
'recordsFiltered' => $filteredRecords,
'pageCount' => $pageCount,
'page' => $currentPage,
'totalCount' => $totalRecords,
'data' => $data,
]);
}
public function destroy($id, $type)
{
try {
$modelClass = $this->getModelClass($type);
if (!$modelClass) {
return response()->json(['success' => false, 'message' => 'Invalid type specified.'], 400);
}
$model = $modelClass::findOrFail($id);
$model->delete();
return response()->json(['success' => true, 'message' => 'deleted successfully']);
} catch (ModelNotFoundException $e) {
return response()->json(['success' => false, 'message' => 'not found.'], 404);
} catch (Exception $e) {
return response()->json(['success' => false, 'message' => 'Failed to delete.'], 500);
}
}
public function getPermohonanJaminanId($id, $dokumentId, $jaminanId)
{
return Permohonan::with([
'user',
'debiture.province',
'debiture.city',
'debiture.district',
'debiture.village',
'branch',
'tujuanPenilaian',
'penilaian',
'penawaran',
'debiture.documents' => function ($query) use ($dokumentId, $jaminanId) {
$query->where('id', $dokumentId)
->where('jenis_jaminan_id', $jaminanId);
}
])->findOrFail($id);
}
private function getModelClass(string $type): ?string
{
return $this->modelClasses[$type] ?? null;
}
private $modelClasses = [
'bentuk-tanah' => BentukTanah::class,
'kontur-tanah' => KonturTanah::class,
'posisi-kavling' => PosisiKavling::class,
'ketinggian-tanah' => KetinggianTanah::class,
'kondisi-fisik-tanah' => KondisiFisikTanah::class,
'jenis-bangunan' => JenisBangunan::class,
'kondisi-bangunan' => KondisiBangunan::class,
'sifat-bangunan' => SifatBangunan::class,
'sarana-pelengkap' => SaranaPelengkap::class,
'lalu-lintas-lokasi' => LaluLintasLokasi::class,
'tingkat-keramaian' => TingkatKeramaian::class,
'gol-mas-sekitar' => GolonganMasySekitar::class,
'spek-kategori-bangunan' => SpekKategoritBangunan::class,
'spek-bangunan' => SpekBangunan::class,
'lantai-unit' => Lantai::class,
'view-unit' => ViewUnit::class,
'jenis-pesawat' => JenisPesawat::class,
'model-alat-berat' => ModelAlatBerat::class,
'jenis-kapal' => JenisKapal::class,
'jenis-kendaraan' => JenisKendaraan::class,
'terletak-area' => TerletakArea::class,
'posisi-unit' => PosisiUnit::class,
'bentuk-unit' => BentukUnit::class,
'fasilitas-objek' => FasilitasObjek::class,
'merupakan-daerah' => MerupakanDaerah::class,
'jenis-unit' => JenisUnit::class,
'perkerasan-jalan' => PerkerasanJalan::class,
'foto-objek-jaminan' => FotoObjekJaminan::class,
'perizinan' => Perizinan::class
];
public function getCommonData()
{
return [
'branches' => Branch::all(),
'bentukTanah' => BentukTanah::all(),
'konturTanah' => KonturTanah::all(),
'posisiKavling' => PosisiKavling::all(),
'ketinggianTanah' => KetinggianTanah::all(),
'kondisiFisikTanah' => KondisiFisikTanah::all(),
'jenisBangunan' => JenisBangunan::all(),
'kondisiBangunan' => KondisiBangunan::all(),
'sifatBangunan' => SifatBangunan::all(),
'spekKategoriBangunan' => SpekKategoritBangunan::all(),
'spekBangunan' => SpekBangunan::all(),
'saranaPelengkap' => SaranaPelengkap::all(),
'arahMataAngin' => ArahMataAngin::all(),
'lantai' => Lantai::all(),
'viewUnit' => ViewUnit::all(),
'golMasySekitar' => GolonganMasySekitar::all(),
'tingkatKeramaian' => TingkatKeramaian::all(),
'laluLintasLokasi' => LaluLintasLokasi::all(),
'jenisPesawat' => JenisPesawat::all(),
'modelAlatBerat' => ModelAlatBerat::all(),
'jenisKapal' => JenisKapal::all(),
'jenisKendaraan' => JenisKendaraan::all(),
'terletakArea' => TerletakArea::all(),
'posisiUnit' => PosisiUnit::all(),
'bentukUnit' => BentukUnit::all(),
'fasilitasObjek' => FasilitasObjek::all(),
'merupakanDaerah' => MerupakanDaerah::all(),
'jenisUnit' => JenisUnit::all(),
'jenisJaminan' => JenisJaminan::all(),
'hubCadeb' => HubunganPemilikJaminan::all(),
'hubPenghuni' => HubunganPenghuniJaminan::all(),
'perkerasanJalan' => PerkerasanJalan::all(),
'terletakDiArea' => TerletakArea::all(),
'tujuanPenilaian' => TujuanPenilaian::all(),
'perizinan' => Perizinan::all(),
'foto' => FotoObjekJaminan::all()
];
}
private const HEADERS = [
'bentuk-tanah' => ['Bentuk Tanah', 'bentuk-tanah'],
'kontur-tanah' => ['Kontur Tanah', 'kontur-tanah'],
'posisi-kavling' => ['Posisi Kavling', 'posisi-kavling'],
'ketinggian-tanah' => ['Ketinggian Tanah', 'ketinggian-tanah'],
'kondisi-fisik-tanah' => ['Kondisi Fisik Tanah', 'kondisi-fisik-tanah'],
'jenis-bangunan' => ['Jenis Bangunan', 'jenis-bangunan'],
'kondisi-bangunan' => ['Kondisi Bangunan', 'kondisi-bangunan'],
'sifat-bangunan' => ['Sifat Bangunan', 'sifat-bangunan'],
'sarana-pelengkap' => ['Sarana Pelengkap', 'sarana-pelengkap'],
'lalu-lintas-lokasi' => ['Lalu Lintas Depan Lokasi', 'lalu-lintas-lokasi'],
'tingkat-keramaian' => ['Tingkat Keramaian', 'tingkat-keramaian'],
'gol-mas-sekitar' => ['Golongan Masyarakat Sekitar', 'gol-mas-sekitar'],
'spek-kategori-bangunan' => ['Spek Kategori Bangunan', 'spek-kategori-bangunan'],
'spek-bangunan' => ['Spek Bangunan', 'spek-bangunan'],
'lantai-unit' => ['Lantai Unit', 'lantai-unit'],
'view-unit' => ['View Unit', 'view-unit'],
'perkerasan-jalan' => ['Perkerasan jalan', 'perkerasan-jalan'],
'jenis-pesawat' => ['Jenis pesawat', 'jenis-pesawat'],
'model-alat-berat' => ['Model alat berat', 'model-alat-berat'],
'jenis-kapal' => ['Jenis kapal', 'jenis-kapal'],
'jenis-kendaraan' => ['Jenis kendaraan', 'jenis-kendaraan'],
'jenis-unit' => ['Jenis unit', 'jenis-unit'],
'terletak-area' => ['Terletak di Area', 'terletak-area'],
'merupakan-daerah' => ['Merupakan Daerah', 'merupakan-daerah'],
'posisi-unit' => ['Posisi unit', 'posisi-unit'],
'bentuk-unit' => ['Bentuk unit', 'bentuk-unit'],
'fasilitas-objek' => ['Fasilitas Umum Dekat Objek', 'fasilitas-objek'],
'foto-objek-jaminan' => ['Foto Objek Jaminan', 'foto-objek-jaminan'],
'perizinan' => ['Perizinan', 'perizinan'],
];
private function getAssetData(array $data): array
{
$alamatData = [
'address' => $data['address'] ?? null,
'village_code' => $data['village_code'] ?? null,
'district_code' => $data['district_code'] ?? null,
'city_code' => $data['city_code'] ?? null,
'province_code' => $data['province_code'] ?? null,
];
return [
'asset' => [
'debitur_perwakilan' => $data['debitur_perwakilan'] ?? [],
'jenis_asset' => [
$data['jenis_asset'] => ($data['jenis_asset'] === 'sesuai')
? $data['jenis_asset_name']
: ($data['jenis_asset_tidak_sesuai'] ?? null)
],
'alamat' => [
$data['alamat_sesuai'] => $alamatData
],
'hub_cadeb' => [
$data['hub_cadeb'] => ($data['hub_cadeb'] == 'sesuai') ? $data['hub_cadeb_sesuai'] : $data['hub_cadeb_tidak_sesuai']
],
'hub_cadeb_penghuni' => [
$data['hub_cadeb_penghuni'] => ($data['hub_cadeb_penghuni'] == 'sesuai') ? $data['hub_cadeb_penghuni_sesuai'] : $data['hub_penghuni_tidak_sesuai']
],
'pihak_bank' => $data['pihak_bank'] ?? null,
'kordinat_lng' => $data['kordinat_lng'] ?? null,
'kordinat_lat' => $data['kordinat_lat'] ?? null,
]
];
}
private function updateFormData(array &$dataForm, array $data, $inspeksi, string $section, string $key, string $sesuaiKey, string $tidakSesuaiKey): void
{
if (isset($dataForm[$section][$key])) {
$dataForm[$section][$key] = []; // Reset data
if ($data[$key] == 'sesuai') {
$dataForm[$section][$key]['sesuai'] = $data[$sesuaiKey] ?? null;
} elseif ($data[$key] == 'tidak sesuai') {
$dataForm[$section][$key]['tidak sesuai'] = $data[$tidakSesuaiKey] ?? null;
}
if ($inspeksi) {
$inspeksi->data_form = json_encode($dataForm);
$inspeksi->save();
}
} else {
$data[$key] = $this->getFieldData($data, $key, true);
}
}
private function getTanahData(array $data): array
{
$inspeksi = Inspeksi::where('permohonan_id', $data['permohonan_id'])->where('dokument_id', $data['dokument_id'])->first();
// Decode data_form dari inspeksi
$dataForm = $inspeksi ? json_decode($inspeksi->data_form, true) : [];
$this->updateFormData($dataForm, $data, $inspeksi, 'tanah', 'luas_tanah', 'luas_tanah_sesuai', 'luas_tanah_tidak_sesuai');
$this->updateFormData($dataForm, $data, $inspeksi, 'tanah', 'hadap_mata_angin', 'hadap_mata_angin_sesuai', 'hadap_mata_angin_tidak_sesuai');
// dd($dataForm);
return [
'tanah' => [
'luas_tanah' => $dataForm['tanah']['luas_tanah'] ?? $data['luas_tanah'],
'hadap_mata_angin' => $dataForm['tanah']['hadap_mata_angin'] ?? $data['hadap_mata_angin'],
'bentuk_tanah' => $this->getFieldData(
$data,
'bentuk_tanah',
false,
'lainnya'
),
'kontur_tanah' => $data['kontur_tanah'] ?? [],
'ketinggian_tanah' => [
'ketinggian' => $data['ketinggian_jalan'] ?? null,
'lebih_tinggi' => $data['ketinggian_lebih_tinggi'] ?? null,
'lebih_rendah' => $data['ketinggian_lebih_rendah'] ?? null
],
'kontur_jalan' => $data['kontur_jalan'] ?? null,
'ketinggian_jalan' => $data['ketinggian_jalan'] ?? [],
'posisi_kavling' => $this->getFieldData(
$data,
'posisi_kavling',
false,
'lainnya'
),
'tusuk_sate' => $data['tusuk_sate'] ?? null,
'lockland' => $data['lockland'] ?? null,
'kondisi_fisik_tanah' => $this->getFieldData(
$data,
'kondisi_fisik_tanah',
false,
'lainnya'
)
]
];
}
private function getBangunanData($data, $request): array
{
$data = $request->all();
$result = [];
foreach ($request->input('nama_bangunan') as $index => $buildingName) {
if (empty($buildingName)) {
continue;
} // Skip if building name is empty
$buildingData = [];
$buildingData['bagunan'] = $buildingName;
$specCategories = $request->input('spek_kategori_bangunan');
$buildingData['spek_kategori_bangunan'] = [];
if (!empty($specCategories)) {
foreach ($specCategories as $category) {
if (empty($category)) {
continue;
} // Skip empty categories
$specs = $request->input("spek_bangunan.{$index}.{$category}", []);
// Only add category if it has specifications
if (!empty($specs)) {
$buildingData['spek_kategori_bangunan'][$category] = $specs;
}
}
}
// Only add building data if it has specifications
if (!empty($buildingData['spek_kategori_bangunan'])) {
$result[] = $buildingData;
}
}
$inspeksi = Inspeksi::where('permohonan_id', $data['permohonan_id'])->where('dokument_id', $data['dokument_id'])->first();
// Decode data_form dari inspeksi
$dataForm = $inspeksi ? json_decode($inspeksi->data_form, true) : [];
$this->updateFormData($dataForm, $data, $inspeksi, 'bangunan', 'luas_tanah_bagunan', 'luas_tanah_bagunan_sesuai', 'luas_tanah_bagunan_tidak_sesuai');
return [
'bangunan' => [
'luas_tanah_bagunan' => $dataForm['bangunan']['luas_tanah_bagunan'] ?? $data['luas_tanah_bagunan'],
'jenis_bangunan' => $data['jenis_bangunan'] ?? null,
'kondisi_bangunan' => $data['kondisi_bangunan'] ?? null,
'sifat_bangunan' => $data['sifat_bangunan'] ?? null,
'sifat_bangunan_input' => $data['sifat_bangunan_input'] ?? null,
'spesifikasi_bangunan' => $result ?? null,
'sarana_pelengkap' => $data['sarana_pelengkap'] ?? null,
'sarana_pelengkap_input' => $data['sarana_pelengkap_input'] ?? null,
],
];
}
private function getLingkunganData($data, $request): array
{
return [
'lingkungan' => [
'jarak_jalan_utama' => $data['jarak_jalan_utama'] ?? null,
'jalan_linkungan' => $data['jalan_linkungan'] ?? null,
'jarak_cbd_point' => $data['jarak_cbd_point'] ?? null,
'nama_cbd_point' => $data['nama_cbd_point'] ?? null,
'lebar_perkerasan_jalan' => $data['lebar_perkerasan_jalan'] ?? null,
'perkerasan_jalan' => $this->getFieldData(
$data,
'perkerasan_jalan',
false,
'lainnya'
),
'lalu_lintas' => $data['lalu_lintas'] ?? null,
'gol_mas_sekitar' => $data['gol_mas_sekitar'] ?? null,
'tingkat_keramaian' => $data['tingkat_keramaian'] ?? null,
'terletak_diarea' => $this->getFieldData(
$data,
'terletak_diarea',
false,
'lainnya'
),
'disekitar_lokasi' => $data['disekitar_lokasi'] === 'yes' ? [
'kondisi' => $data['kondisi_bagunan_disekitar_lokasi'] ?? null,
'sifat' => $data['sifat_bagunan_disekitar_lokasi'] ?? null,
] : $data['disekitar_lokasi'],
'kondisi_bagunan_disekitar_lokasi' => $data['kondisi_bagunan_disekitar_lokasi'] ?? null,
'sifat_bagunan_disekitar_lokasi' => $data['sifat_bagunan_disekitar_lokasi'] ?? null,
'dekat_makam' => $data['dekat_makam'] ?? null,
'jarak_makam' => $data['jarak_makam'] ?? null,
'nama_makam' => $data['nama_makam'] ?? null,
'dekat_tps' => $data['dekat_tps'] ?? null,
'jarak_tps' => $data['jarak_tps'] ?? null,
'nama_tps' => $data['nama_tps'] ?? null,
'dekat_lainnya' => $data['dekat_lainnya'] ?? null,
'merupakan_daerah' => $data['merupakan_daerah'] ?? null,
'fasilitas_dekat_object' => $data['fasilitas_dekat_object'] ?? null,
'fasilitas_dekat_object_input' => $data['fasilitas_dekat_object_input'] ?? null,
]
];
}
private function getFactData($data, $request): array
{
$factData = [
'fakta' => [
'fakta_positif' => $data['fakta_positif'] ?? null,
'fakta_negatif' => $data['fakta_negatif'] ?? null,
'rute_menuju' => $data['rute_menuju'] ?? null,
'batas_batas' => $data['batas_batas'] ?? null,
'batas_batas_input' => $data['batas_batas_input'] ?? null,
'kondisi_lingkungan' => $data['kondisi_lingkungan'] ?? null,
'kondisi_lain_bangunan' => $data['kondisi_lain_bangunan'] ?? null,
'informasi_dokument' => $data['informasi_dokument'] ?? null,
'peruntukan' => $data['peruntukan'] ?? null,
'kdb' => $data['kdb'] ?? null,
'kdh' => $data['kdh'] ?? null,
'gsb' => $data['gsb'] ?? null,
'max_lantai' => $data['max_lantai'] ?? null,
'klb' => $data['klb'] ?? null,
'gss' => $data['gss'] ?? null,
'pelebaran_jalan' => $data['pelebaran_jalan'] ?? null,
'nama_petugas' => $data['nama_petugas'] ?? null,
'keterangan' => $data['keterangan'] ?? null,
]
];
$inspeksi = Inspeksi::where('permohonan_id', $request->input('permohonan_id'))->where('dokument_id', $request->input('dokument_id'))->first();
$fotoTypes = [
'foto_gistaru',
'foto_bhumi',
'foto_argis_region',
'foto_tempat'
];
if ($inspeksi) {
$dataForm = json_decode($inspeksi->data_form, true);
foreach ($fotoTypes as $fotoType) {
// Jika ada file baru diupload
if ($request->hasFile($fotoType)) {
$factData[$fotoType] = $this->updateOrDeleteFile($dataForm, $request, $fotoType);
} else {
$factData[$fotoType] = $dataForm[$fotoType] ?? null;
}
}
} else {
foreach ($fotoTypes as $fotoType) {
$factData[$fotoType] = $this->updateOrDeleteFile($data, $request, $fotoType);
}
}
return $factData;
}
private function getRapData($data, $request): array
{
$inspeksi = Inspeksi::where('permohonan_id', $request->input('permohonan_id'))
->where('dokument_id', $request->input('dokument_id'))
->first();
$dataForm = json_decode($inspeksi->data_form, true);
$perizinanData = isset($dataForm['perizinan']) ? $dataForm['perizinan'] : [];
if ($request->has('perizinan')) {
foreach ($request->perizinan as $key => $perizinanName) {
// Cek apakah ada file baru yang diupload
if ($request->hasFile("perizinan_file.{$key}")) {
// Jika ada file baru, tambahkan/update data
$file = $request->file("perizinan_file.{$key}");
$path = $file->store('perizinan', 'public');
// Cek apakah perizinan dengan nama yang sama sudah ada
$existingIndex = array_search($perizinanName, array_column($perizinanData, 'perizinan'));
if ($existingIndex !== false) {
// Update file untuk perizinan yang sudah ada
$perizinanData[$existingIndex] = [
'perizinan' => $perizinanName,
'perizinan_file' => $path
];
} else {
// Tambah perizinan baru
$perizinanData[] = [
'perizinan' => $perizinanName,
'perizinan_file' => $path
];
}
}
}
}
$data['perizinan'] = $perizinanData;
$partisiResult = [];
if (isset($data['partisi'])) {
foreach ($data['partisi'] as $name => $values) {
if (!empty($values['value'])) {
$partisiResult[$name] = [
'nama' => $values['nama'],
'value' => $values['value']
];
}
}
}
$brosurData = isset($dataForm['brosur_price_list']) ? $dataForm['brosur_price_list'] : [];
if ($request->has('brosur_price_list')) {
foreach ($request->brosur_price_list as $key => $jenis) {
// Cek apakah ada file baru yang diupload
if ($request->hasFile("brosur_price_list_file.{$key}")) {
// Jika ada file baru, tambahkan/update data
$file = $request->file("brosur_price_list_file.{$key}");
$path = $file->store('brosur-pricelist', 'public');
// Cek apakah jenis brosur yang sama sudah ada
$existingIndex = array_search($jenis, array_column($brosurData, 'jenis'));
if ($existingIndex !== false) {
// Update file untuk jenis yang sudah ada
$brosurData[$existingIndex] = [
'jenis' => $jenis,
'file_path' => $path
];
} else {
// Tambah jenis brosur baru
$brosurData[] = [
'jenis' => $jenis,
'file_path' => $path
];
}
}
}
}
$data['brosur_price_list'] = $brosurData;
$rapData = [
'perizinan' => $perizinanData ?? null,
'brosur_price_list' => $brosurData ?? null,
'pengalaman_developer' => $data['pengalaman_developer'] ?? null,
'developer_anggota' => $data['developer_anggota'] ?? null,
'lainnya_developer' => $data['lainnya_developer'] ?? null,
'kapan_mulai_dibangun' => $data['kapan_mulai_dibangun'] ?? null,
'kondisi_perumahan' => $data['kondisi_perumahan'] ?? null,
'progres_pembangunan' => $data['progres_pembangunan'] ?? null,
'kontraktor' => $data['kontraktor'] ?? null,
'lingkungan_sekitar' => $data['lingkungan_sekitar'] ?? null,
'komplek_disekitar' => $data['komplek_disekitar'] ?? null,
'pusat_keramaian' => $data['pusat_keramaian'] ?? null,
'transportasi_umum' => $data['transportasi_umum'] ?? null,
'lainnya_kondisi' => $data['lainnya_kondisi'] ?? null,
'partisi' => $partisiResult ?? null,
'jumlah_unit' => $data['jumlah_unit'] ?? null,
'batas_batas_perumahan' => $data['batas_batas_perumahan'] ?? null,
'fasus_fasum' => $data['fasus_fasum'] ?? null,
'progres_penjualan' => $data['progres_penjualan'] ?? null,
'harga_unit' => $data['harga_unit'] ?? null,
'target_market' => $data['target_market'] ?? null,
'kerjasama_dengan_bank' => $data['kerjasama_dengan_bank'] ?? null,
'rute_menuju_lokasi' => $data['rute_menuju_lokasi'] ?? null,
];
return $rapData;
}
private function updateOrDeleteFile($data, $request, $fileKey)
{
if ($request->hasFile($fileKey)) {
$file = $request->file($fileKey);
if ($file->isValid()) {
$fileName = time() . '_' . $file->getClientOriginalName();
$path = $file->storeAs("public/surveyor/{$request->type}", $fileName);
if ($path === false) {
throw new Exception("Failed to store file for {$fileKey}");
}
if (isset($data[$fileKey]) && $data[$fileKey]) {
$this->deleteFile($data[$fileKey]);
}
return str_replace('public/', '', $path);
} else {
throw new Exception("Invalid file upload for {$fileKey}");
}
} elseif (isset($data[$fileKey]) && $data[$fileKey]) {
return $data[$fileKey];
} else {
return null;
}
}
private function deleteFile($filePath)
{
$fullPath = storage_path('app/public/' . $filePath);
if (file_exists($fullPath)) {
unlink($fullPath);
}
}
private function getKapalData($data, $request): array
{
$alamatData = [
'village_code' => $data['village_code'] ?? null,
'district_code' => $data['district_code'] ?? null,
'city_code' => $data['city_code'] ?? null,
'province_code' => $data['province_code'] ?? null,
];
return [
'action' => $data['action'] ?? null,
'nama_wakil_debitur' => $data['nama_wakil_debitur'] ?? null,
'hub_calon_debitur' => $data['hub_calon_debitur'] ?? null,
'dermaga' => $data['dermaga'] ?? null,
'nama_jalan' => $data['nama_jalan'] ?? null,
'perumahan_gang' => $data['perumahan_gang'] ?? null,
'blok_nomor' => $data['blok_nomor'] ?? null,
'bandara' => $data['bandara'] ?? null,
'alamat' => [
'sesuai' => $alamatData
],
'jenis_kapal' => $data['jenis_kapal'] ?? null,
'jenis_kapal_lainnya' => $data['jenis_kapal_lainnya'] ?? null,
'size' => $data['size'] ?? null,
'kondisi' => $data['kondisi'] ?? null,
'klasifikasi' => $data['klasifikasi'] ?? null,
'nama_kapal' => $data['nama_kapal'] ?? null,
'pemilik_kapal' => $data['pemilik_kapal'] ?? null,
'bendera' => $data['bendera'] ?? null,
'nomor_selar' => $data['nomor_selar'] ?? null,
'kapal' => $data['kapal'] ?? null,
'galangan_kapal' => $data['galangan_kapal'] ?? null,
'kapal_shipyard' => $data['kapal_shipyard'] ?? null,
'tahun_pembuatan' => $data['tahun_pembuatan'] ?? null,
'tahun_launcing' => $data['tahun_launcing'] ?? null,
'dwt' => $data['dwt'] ?? null,
'lwt' => $data['lwt'] ?? null,
'gross_tonnage' => $data['gross_tonnage'] ?? null,
'net_tonnage' => $data['net_tonnage'] ?? null,
'tenaga_mesin' => $data['tenaga_mesin'] ?? null,
'loa' => $data['loa'] ?? null,
'lbp' => $data['lbp'] ?? null,
'beam' => $data['beam'] ?? null,
'depth' => $data['depth'] ?? null,
'draft' => $data['draft'] ?? null,
'lambung_kapal' => $data['lambung_kapal'] ?? null,
'dek' => $data['dek'] ?? null,
'struktur_rangka' => $data['struktur_rangka'] ?? null,
'palka' => $data['palka'] ?? null,
'pondasi_mesin' => $data['pondasi_mesin'] ?? null,
'area_mesin' => $data['area_mesin'] ?? null,
'cat_dan_korosi' => $data['cat_dan_korosi'] ?? null,
'sistem_pengelasan' => $data['sistem_pengelasan'] ?? null,
'deskripsi_struktur' => $data['deskripsi_struktur'] ?? null,
'sekoci' => $data['sekoci'] ?? null,
'jaket_pelampung' => $data['jaket_pelampung'] ?? null,
'alat_pemadaman' => $data['alat_pemadaman'] ?? null,
'rambu_darurat' => $data['rambu_darurat'] ?? null,
'sistem_alarm' => $data['sistem_alarm'] ?? null,
'sistem_pencegah' => $data['sistem_pencegah'] ?? null,
'kebakaran' => $data['kebakaran'] ?? null,
'lampu_darurat' => $data['lampu_darurat'] ?? null,
'deskripsi_peralatan' => $data['deskripsi_peralatan'] ?? null,
'gps' => $data['gps'] ?? null,
'radar' => $data['radar'] ?? null,
'radio_komunikasi' => $data['radio_komunikasi'] ?? null,
'lampu_navigasi' => $data['lampu_navigasi'] ?? null,
'sistem_kendali_otomatis' => $data['sistem_kendali_otomatis'] ?? null,
'kompas' => $data['kompas'] ?? null,
'deskripsi_navigasi' => $data['deskripsi_navigasi'] ?? null,
'mesin_utama' => $data['mesin_utama'] ?? null,
'mesin_bantu' => $data['mesin_bantu'] ?? null,
'pompa_pendingin' => $data['pompa_pendingin'] ?? null,
'sistem_pelumasan' => $data['sistem_pelumasan'] ?? null,
'propeller' => $data['propeller'] ?? null,
'sistem_kelistrikan' => $data['sistem_kelistrikan'] ?? null,
'deskripsi_mesin_penggerak' => $data['deskripsi_mesin_penggerak'] ?? null,
'lampu_navigasi' => $data['lampu_navigasi'] ?? null,
'sistem_penerangan' => $data['sistem_penerangan'] ?? null,
'sistem_panel_distribusi' => $data['sistem_panel_distribusi'] ?? null,
'kabel_perangkat' => $data['kabel_perangkat'] ?? null,
'deskripsi_kelistrikan' => $data['deskripsi_kelistrikan'] ?? null,
'kebersihan_dek_luar' => $data['kebersihan_dek_luar'] ?? null,
'tangki_limbah' => $data['tangki_limbah'] ?? null,
'sistem_pengelolaan_limbah' => $data['sistem_pengelolaan_limbah'] ?? null,
'pengelolaan_air_ballast' => $data['pengelolaan_air_ballast'] ?? null,
'deskripsi_kebersihan' => $data['deskripsi_kebersihan'] ?? null,
'fakta_positif' => $data['fakta_positif'] ?? null,
'fakta_negatif' => $data['fakta_negatif'] ?? null,
'analisa_makro' => $data['analisa_makro'] ?? null,
'kesimpulan' => $data['kesimpulan'] ?? null,
'catatan' => $data['catatan'] ?? null,
];
}
public function getKendaraanData($data, $request): array
{
$alamatData = [
'village_code' => $data['village_code'] ?? null,
'district_code' => $data['district_code'] ?? null,
'city_code' => $data['city_code'] ?? null,
'province_code' => $data['province_code'] ?? null,
];
return [
'action' => $data['action'] ?? null,
'tanggal_survey' => $data['tanggal_survey'] ?? null,
'nama_wakil' => $data['nama_wakil'] ?? null,
'hub_calon_debitur' => $data['hub_calon_debitur'] ?? null,
'nama_jalan' => $data['nama_jalan'] ?? null,
'perumahan_gang' => $data['perumahan_gang'] ?? null,
'blok_nomor' => $data['blok_nomor'] ?? null,
'alamat' => [
'sesuai' => $alamatData
],
'masa_stnk' => $data['masa_stnk'] ?? null,
'masa_pajak' => $data['masa_pajak'] ?? null,
'kendaraan' => $data['kendaraan'] ?? null,
'kendaraan_input' => $data['kendaraan_input'] ?? null,
'kondisi' => $data['kondisi'] ?? null,
'nomor_polisi' => $data['nomor_polisi'] ?? null,
'nomor_polis_tidak_sesuai' => $data['nomor_polis_tidak_sesuai'] ?? null,
'merek' => $data['merek'] ?? null,
'merek_tidak_sesuai' => $data['merek_tidak_sesuai'] ?? null,
'warna' => $data['warna'] ?? null,
'warna_tidak_sesuai' => $data['warna_tidak_sesuai'] ?? null,
'nomor_rangka' => $data['nomor_rangka'] ?? null,
'nomor_rangka_tidak_sesuai' => $data['nomor_rangka_tidak_sesuai'] ?? null,
'nomor_mesin' => $data['nomor_mesin'] ?? null,
'nomor_mesin_tidak_sesuai' => $data['nomor_mesin_tidak_sesuai'] ?? null,
'posisi_kilometer' => $data['posisi_kilometer'] ?? null,
'transmisi' => $data['transmisi'] ?? null,
'transmisi_input' => $data['transmisi_input'] ?? null,
'mesin_panel_instrument' => $data['mesin_panel_instrument'] ?? null,
'mesin_panel_instrument_input' => $data['mesin_panel_instrument_input'] ?? null,
'fungsi_mesin_panel_instrument' => $data['fungsi_mesin_panel_instrument'] ?? null,
'fungsi_mesin_panel_instrument_input' => $data['fungsi_mesin_panel_instrument_input'] ?? null,
'interior' => $data['interior'] ?? null,
'interior_input' => $data['interior_input'] ?? null,
'jumlah_pintu' => $data['jumlah_pintu'] ?? null,
'jumlah_pintu_input' => $data['jumlah_pintu_input'] ?? null,
'rangka_karoseri' => $data['rangka_karoseri'] ?? null,
'rangka_karoseri_input' => $data['rangka_karoseri_input'] ?? null,
'ban' => $data['ban'] ?? null,
'ban_input' => $data['ban_input'] ?? null,
'velg' => $data['velg'] ?? null,
'velg_input' => $data['velg_input'] ?? null,
'bamper_depan' => $data['bamper_depan'] ?? null,
'bamper_depan_input' => $data['bamper_depan_input'] ?? null,
'bamper_belakang' => $data['bamper_belakang'] ?? null,
'bamper_belakang_input' => $data['bamper_belakang_input'] ?? null,
'lampu_depan' => $data['lampu_depan'] ?? null,
'lampu_depan_input' => $data['lampu_depan_input'] ?? null,
'lampu_belakang' => $data['lampu_belakang'] ?? null,
'lampu_belakang_input' => $data['lampu_belakang_input'] ?? null,
'kaca_kendaraan' => $data['kaca_kendaraan'] ?? null,
'kaca_kendaraan_input' => $data['kaca_kendaraan_input'] ?? null,
'air_conditioner' => $data['air_conditioner'] ?? null,
'air_conditioner_input' => $data['air_conditioner_input'] ?? null,
'tape_radio_cd' => $data['tape_radio_cd'] ?? null,
'tape_radio_cd_input' => $data['tape_radio_cd_input'] ?? null,
'sensor_parkir' => $data['sensor_parkir'] ?? null,
'sensor_parkir_input' => $data['sensor_parkir_input'] ?? null,
'sensor_camera_recorder' => $data['sensor_camera_recorder'] ?? null,
'sensor_camera_recorder_input' => $data['sensor_camera_recorder_input'] ?? null,
'lcd' => $data['lcd'] ?? null,
'lcd_input' => $data['lcd_input'] ?? null,
'sabuk_keselamatan' => $data['sabuk_keselamatan'] ?? null,
'sabuk_keselamatan_input' => $data['sabuk_keselamatan_input'] ?? null,
'airbag' => $data['airbag'] ?? null,
'airbag_input' => $data['airbag_input'] ?? null,
'asuransi' => $data['asuransi'] ?? null,
'asuransi_input' => $data['asuransi_input'] ?? null,
'perusahaan_asuransi' => $data['perusahaan_asuransi'] ?? null,
'tahun_berakhir' => $data['tahun_berakhir'] ?? null,
'fakta_positif' => $data['fakta_positif'] ?? null,
'fakta_negatif' => $data['fakta_negatif'] ?? null,
'analisa_makro' => $data['analisa_makro'] ?? null,
'kesimpulan' => $data['kesimpulan'] ?? null,
'catatan' => $data['catatan'] ?? null,
];
}
public function getMesinData($data, $request): array
{
return [
'action' => $data['action'] ?? null,
'nama_wakil' => $data['nama_wakil'] ?? null,
'nama_jalan' => $data['nama_jalan'] ?? null,
'perumahan_gang' => $data['perumahan_gang'] ?? null,
'blok' => $data['blok'] ?? null,
'desa_kelurahan' => $data['desa_kelurahan'] ?? null,
'kecamatan' => $data['kecamatan'] ?? null,
'kota_madya' => $data['kota_madya'] ?? null,
'provinsi' => $data['provinsi'] ?? null,
'hub_calon_debitur' => $data['hub_calon_debitur'] ?? null,
'tipe_model' => $data['tipe_model'] ?? null,
'merek' => $data['merek'] ?? null,
'tahun_pembuatan' => $data['tahun_pembuatan'] ?? null,
'negara_pembuat' => $data['negara_pembuat'] ?? null,
'kondisi_mesin' => $data['kondisi_mesin'] ?? null,
'faktor_positif' => $data['faktor_positif'] ?? null,
'faktor_negatif' => $data['faktor_negatif'] ?? null,
'kesimpulan' => $data['kesimpulan'] ?? null,
'catatan' => $data['catatan'] ?? null,
];
}
public function getAlatBeratData($data, $request): array
{
$alamatData = [
'village_code' => $data['village_code'] ?? null,
'district_code' => $data['district_code'] ?? null,
'city_code' => $data['city_code'] ?? null,
'province_code' => $data['province_code'] ?? null,
];
return [
'action' => $data['action'] ?? null,
'tanggal_survey' => $data['tanggal_survey'] ?? null,
'nama_wakil' => $data['nama_wakil'] ?? null,
'hub_calon_debitur' => $data['hub_calon_debitur'] ?? null,
'dengan_wadeb' => $data['dengan_wadeb'] ?? null,
'nama_jalan' => $data['nama_jalan'] ?? null,
'perumahan_gang' => $data['perumahan_gang'] ?? null,
'blok_nomor' => $data['blok_nomor'] ?? null,
'alamat' => [
'sesuai' => $alamatData
],
'jenis_model' => $data['jenis_model'] ?? null,
'nomor_lambung' => $data['nomor_lambung'] ?? null,
'model_unit' => $data['model_unit'] ?? null,
'tahun_pembuatan' => $data['tahun_pembuatan'] ?? null,
'merk' => $data['merk'] ?? null,
'negara_pembuat' => $data['negara_pembuat'] ?? null,
'tahun_pembelian' => $data['tahun_pembelian'] ?? null,
'nomor_faktur' => $data['nomor_faktur'] ?? null,
'nomor_kontrak' => $data['nomor_kontrak'] ?? null,
'nama_pemilik' => $data['nama_pemilik'] ?? null,
'alamat_pemilik' => $data['alamat_pemilik'] ?? null,
'nomor_asuransi' => $data['nomor_asuransi'] ?? null,
'nomor_rangka' => $data['nomor_rangka'] ?? null,
'nomor_mesin' => $data['nomor_mesin'] ?? null,
'hour_mesters' => $data['hour_mesters'] ?? null,
'overhaul_mesin' => $data['overhaul_mesin'] ?? null,
'mesin_panel' => $data['mesin_panel'] ?? null,
'mesin_panel_input' => $data['mesin_panel_input'] ?? null,
'fungsi_panel' => $data['fungsi_panel'] ?? null,
'fungsi_panel_input' => $data['fungsi_panel_input'] ?? null,
'interior' => $data['interior'] ?? null,
'interior_input' => $data['interior_input'] ?? null,
'rangka_Karoseri' => $data['rangka_Karoseri'] ?? null,
'rangka_Karoseri_input' => $data['rangka_Karoseri_input'] ?? null,
'ban' => $data['ban'] ?? null,
'ban_input' => $data['ban_input'] ?? null,
'velg' => $data['velg'] ?? null,
'velg_input' => $data['velg_input'] ?? null,
'air_conditioner' => $data['air_conditioner'] ?? null,
'air_conditioner_input' => $data['air_conditioner_input'] ?? null,
'aksesoris' => $data['aksesoris'] ?? null,
'aksesoris_input' => $data['aksesoris_input'] ?? null,
'lcd' => $data['lcd'] ?? null,
'lcd_input' => $data['lcd_input'] ?? null,
'perlengkapan' => $data['perlengkapan'] ?? null,
'perlengkapan_input' => $data['perlengkapan_input'] ?? null,
'asuransi' => $data['asuransi'] ?? null,
'asuransi_input' => $data['asuransi_input'] ?? null,
'perusahaan_asuransi' => $data['perusahaan_asuransi'] ?? null,
'tahun_berakhir' => $data['tahun_berakhir'] ?? null,
'sensor_kamera' => $data['sensor_kamera'] ?? null,
'sabuk_keselamatan' => $data['sabuk_keselamatan'] ?? null,
'air_bag' => $data['air_bag'] ?? null,
'fakta_positif' => $data['fakta_positif'] ?? null,
'fakta_negatif' => $data['fakta_negatif'] ?? null,
'kesimpulan' => $data['kesimpulan'] ?? null,
'catatan' => $data['catatan'] ?? null,
];
}
private function getPesawatData($data, $request): array
{
$alamatData = [
'village_code' => $data['village_code'] ?? null,
'district_code' => $data['district_code'] ?? null,
'city_code' => $data['city_code'] ?? null,
'province_code' => $data['province_code'] ?? null,
];
return [
'action' => $data['action'] ?? null,
'tanggal_survey' => $data['tanggal_survey'] ?? null,
'nama_wakil' => $data['nama_wakil'] ?? null,
'hub_calon_debitur' => $data['hub_calon_debitur'] ?? null,
'nama_jalan' => $data['nama_jalan'] ?? null,
'perumahan_gang' => $data['perumahan_gang'] ?? null,
'blok_nomor' => $data['blok_nomor'] ?? null,
'bandara' => $data['bandara'] ?? null,
'alamat' => [
'sesuai' => $alamatData
],
'jenis_pesawat' => $data['jenis_pesawat'] ?? null,
'jenis_pesawat_lainnya' => $data['jenis_pesawat_lainnya'] ?? null,
'size' => $data['size'] ?? null,
'kondisi' => $data['kondisi'] ?? null,
'nama_pesawat' => $data['nama_pesawat'] ?? null,
'model' => $data['model'] ?? null,
'nomor_registrasi' => $data['nomor_registrasi'] ?? null,
'tahun_pembuatan' => $data['tahun_pembuatan'] ?? null,
'certificate_of_airworthines' => $data['certificate_of_airworthines'] ?? null,
'certificate_of_registration' => $data['certificate_of_registration'] ?? null,
'total_service_hours' => $data['total_service_hours'] ?? null,
'total_service_cycles' => $data['total_service_cycles'] ?? null,
'last_a_check' => $data['last_a_check'] ?? null,
'next_a_check' => $data['next_a_check'] ?? null,
'last_b_check' => $data['last_b_check'] ?? null,
'next_b_check' => $data['next_b_check'] ?? null,
'last_c_check' => $data['last_c_check'] ?? null,
'next_c_check' => $data['next_c_check'] ?? null,
'next_d_check' => $data['next_d_check'] ?? null,
'last_d_check' => $data['last_d_check'] ?? null,
'deskripsi_maintenence' => $data['deskripsi_maintenence'] ?? null,
'instrument_landing_system' => $data['instrument_landing_system'] ?? null,
'traffic_collision_avoidance_system' => $data['traffic_collision_avoidance_system'] ?? null,
'windshear' => $data['windshear'] ?? null,
'electronic_flight' => $data['electronic_flight'] ?? null,
'winglets' => $data['winglets'] ?? null,
'deskripsi_konfigurasi' => $data['deskripsi_konfigurasi'] ?? null,
'maksimal_penumpang' => $data['maksimal_penumpang'] ?? null,
'jumlah_kursi' => $data['jumlah_kursi'] ?? null,
'kursi_pramugari_pramugara' => $data['kursi_pramugari_pramugara'] ?? null,
'kartu_fitur_keselamatan' => $data['kartu_fitur_keselamatan'] ?? null,
'sabuk_pengaman' => $data['sabuk_pengaman'] ?? null,
'lampu_kabin' => $data['lampu_kabin'] ?? null,
'lampu_pintu_keluar' => $data['lampu_pintu_keluar'] ?? null,
'intercom_kabin' => $data['intercom_kabin'] ?? null,
'deskripsi_kabin' => $data['deskripsi_kabin'] ?? null,
'badan_pesawat' => $data['badan_pesawat'] ?? null,
'sayap_pesawat' => $data['sayap_pesawat'] ?? null,
'ekor_pesawat' => $data['ekor_pesawat'] ?? null,
'landing_gear' => $data['landing_gear'] ?? null,
'sistem_pengelasan' => $data['sistem_pengelasan'] ?? null,
'deskripsi_struktur' => $data['deskripsi_struktur'] ?? null,
'gps' => $data['gps'] ?? null,
'radar' => $data['radar'] ?? null,
'radio_komunikasi' => $data['radio_komunikasi'] ?? null,
'lampu_navigasi' => $data['lampu_navigasi'] ?? null,
'sistem_autopilot' => $data['sistem_autopilot'] ?? null,
'deskripsi_navigasi' => $data['deskripsi_navigasi'] ?? null,
'tangki_bahan_bakar' => $data['tangki_bahan_bakar'] ?? null,
'saluran_pipa_bahan_bakar' => $data['saluran_pipa_bahan_bakar'] ?? null,
'pompa_bahan_bakar' => $data['pompa_bahan_bakar'] ?? null,
'sistem_hidrolik_utama' => $data['sistem_hidrolik_utama'] ?? null,
'sistem_pendigin_hidrolik' => $data['sistem_pendigin_hidrolik'] ?? null,
'deskripsi_hidrolik' => $data['deskripsi_hidrolik'] ?? null,
'mesin_utama' => $data['mesin_utama'] ?? null,
'sistem_pendorong' => $data['sistem_pendorong'] ?? null,
'sistem_pendigin_mesin' => $data['sistem_pendigin_mesin'] ?? null,
'sistem_pelumasan' => $data['sistem_pelumasan'] ?? null,
'filter_dan_perangkat_pendukung' => $data['filter_dan_perangkat_pendukung'] ?? null,
'deskripsi_kondisi_mesin' => $data['deskripsi_kondisi_mesin'] ?? null,
'jaket_pelampung' => $data['jaket_pelampung'] ?? null,
'pintu_darurat' => $data['pintu_darurat'] ?? null,
'alat_pemadaman_kebakaran' => $data['alat_pemadaman_kebakaran'] ?? null,
'sistem_alaram_darurat' => $data['sistem_alaram_darurat'] ?? null,
'sekoci' => $data['sekoci'] ?? null,
'masker_oxigen' => $data['masker_oxigen'] ?? null,
'sabuk_pengaman' => $data['sabuk_pengaman'] ?? null,
'deskripsi_fungsi_keselamatan' => $data['deskripsi_fungsi_keselamatan'] ?? null,
'sistem_ventilasi_ac' => $data['sistem_ventilasi_ac'] ?? null,
'sistem_penerangan_kabin' => $data['sistem_penerangan_kabin'] ?? null,
'panel_informasi_penumpang' => $data['panel_informasi_penumpang'] ?? null,
'sistem_hiburan_kabin' => $data['sistem_hiburan_kabin'] ?? null,
'deskripsi_Interior' => $data['deskripsi_Interior'] ?? null,
// Validasi untuk faktor dan kesimpulan
'fakta_positif' => $data['fakta_positif'] ?? null,
'fakta_negatif' => $data['fakta_negatif'] ?? null,
'kesimpulan' => $data['kesimpulan'] ?? null,
'catatan' => $data['catatan'] ?? null,
];
}
private function getUnitData($data, $request): array
{
return [
'action' => $data['action'] ?? null,
'luas_unit' => $this->getFieldData(
$data,
'luas_unit',
true
),
'kondisi_unit' => $data['kondisi_unit'] ?? null,
'posisi_unit' => $data['posisi_unit'] ?? null,
'lantai' => $data['lantai'] ?? null,
'view' => $data['view'] ?? null,
'bentuk_unit' => $data['bentuk_unit'] ?? null,
];
}
/**
* Helper untuk upload file
*
* @param $file
* @param $type
* @return path name
*/
public function uploadFile($file, $type)
{
if (!$file->isValid()) {
throw new Exception("Invalid file upload for {$type}");
}
$fileName = time() . '_' . $file->getClientOriginalName();
$path = $file->storeAs("public/surveyor/{$type}", $fileName);
if ($path === false) {
throw new Exception("Failed to store file for {$type}");
}
return str_replace('public/', '', $path);
}
/**
* Helper untuk memetakan array dengan inputannya
*
* @param array $keys Array kunci
* @param array $values Array nilai/input
* @return array
*/
private function mapArrayWithInputs(array $keys, array $values): array
{
$result = [];
foreach ($keys as $key) {
// Jika checkbox dicentang, ambil nilai input yang sesuai
// Gunakan nilai dari $values berdasarkan nama checkbox
$result[$key] = $values[$key] ?? null;
}
return $result;
}
/**
* Helper method generic untuk mengambil data field
*
* @param array $data Array sumber data
* @param string $fieldName Nama field
* @param bool $checkKesesuaian Apakah perlu cek kesesuaian
* @param string|null $extraField Field tambahan (misal 'lainnya')
* @return array
*/
private function getFieldData(
array $data,
string $fieldName,
bool $checkKesesuaian = false,
?string $extraField = null
): array {
$result = [];
if ($checkKesesuaian) {
$isSesuai = ($data[$fieldName] ?? '') === 'sesuai';
$fieldKey = $isSesuai ? "{$fieldName}_sesuai" : "{$fieldName}_tidak_sesuai";
// Hanya simpan key yang dipilih
if ($isSesuai) {
$result['sesuai'] = $data[$fieldKey] ?? null;
} else {
$result['tidak sesuai'] = $data[$fieldKey] ?? null;
}
} else {
$result[$fieldName] = $data[$fieldName] ?? null;
if ($extraField) {
$result[$extraField] = $data["{$fieldName}_{$extraField}"] ?? null;
}
}
// Hapus key dengan nilai null untuk memastikan hanya key yang valid yang disimpan
return array_filter($result, fn ($value) => $value !== null);
}
public function export(string $type)
{
$modelClass = $this->getModelClass($type);
if (!$modelClass) {
return response()->json([
'message' => 'Invalid type provided.',
'available_types' => array_keys($this->modelClasses),
], 400);
}
// Return Excel download
return Excel::download(new BasicDataSurveyorExport($modelClass), $type . '.xlsx');
}
public function signatureStore(Request $request)
{
$validator = Validator::make($request->all(), [
'signature' => 'required',
'type' => 'required|in:penilai,cabang,debitur,kjjp',
'name' => 'nullable|string',
'document_id' => 'nullable|string'
]);
if ($validator->fails()) {
return response()->json([
'success' => false,
'message' => $validator->errors()->first()
], 422);
}
try {
$inspeksi = Inspeksi::where('permohonan_id', $request->input('permohonan_id'))
->where('dokument_id', $request->input('document_id'))
->first();
if (!$inspeksi) {
$inspeksi = new Inspeksi();
$inspeksi->permohonan_id = $request->input('permohonan_id');
$inspeksi->dokument_id = $request->input('document_id');
$inspeksi->data_form = json_encode([]); // Inisialisasi data_form kosong
$inspeksi->save();
}
// Decode data form yang ada
$dataForm = json_decode($inspeksi->data_form, true) ?: [];
// Inisialisasi array signature jika belum ada
if (!isset($dataForm['signature'])) {
$dataForm['signature'] = [];
}
// Simpan atau update signature berdasarkan type
$dataForm['signature'][$request->type] = [
'image' => $request->signature,
'name' => $request->name,
'created_at' => now()->toDateTimeString(),
'updated_at' => now()->toDateTimeString()
];
// Update data form di database
$inspeksi->data_form = json_encode($dataForm);
$inspeksi->save();
return response()->json([
'success' => true,
'message' => 'Tanda tangan berhasil disimpan'
]);
} catch (\Exception $e) {
return response()->json([
'success' => false,
'message' => 'Terjadi kesalahan: ' . $e->getMessage()
], 500);
}
}
public function signatureShow($type)
{
try {
$inspeksi = Inspeksi::where('permohonan_id', request()->input('permohonan_id'))
->where('dokument_id', request()->input('document_id'))
->first();
if (!$inspeksi) {
return response()->json([
'success' => false,
'message' => 'Data inspeksi tidak ditemukan',
'error_code' => '404'
], 404);
}
$dataForm = json_decode($inspeksi->data_form, true) ?: [];
if (isset($dataForm['signature'][$type])) {
return response()->json([
'success' => true,
'data' => [
'signature' => $dataForm['signature'][$type]['image'],
'type' => $type,
'name' => $dataForm['signature'][$type]['name'] ?? '',
'created_at' => $dataForm['signature'][$type]['created_at'],
'updated_at' => $dataForm['signature'][$type]['updated_at']
]
]);
}
return response()->json([
'success' => false,
'message' => 'Tanda tangan tidak ditemukan',
'error_code' => '404'
], 404);
} catch (\Exception $e) {
return response()->json([
'success' => false,
'message' => 'Terjadi kesalahan: ' . $e->getMessage(),
'error_code' => '500'
], 500);
}
}
public function signatureDestroy(Request $request)
{
try {
$validator = Validator::make($request->all(), [
'type' => 'required|in:penilai,cabang,debitur,kjjp'
]);
if ($validator->fails()) {
return response()->json([
'success' => false,
'message' => 'Validation error',
'errors' => $validator->errors()
], 422);
}
$inspeksi = Inspeksi::where('permohonan_id', $request->input('permohonan_id'))
->where('dokument_id', $request->input('document_id'))
->first();
if (!$inspeksi) {
return response()->json([
'success' => false,
'message' => 'Data inspeksi tidak ditemukan',
'error_code' => '404'
], 404);
}
$dataForm = json_decode($inspeksi->data_form, true) ?: [];
if (isset($dataForm['signature'][$request->type])) {
unset($dataForm['signature'][$request->type]);
$inspeksi->data_form = json_encode($dataForm);
$inspeksi->save();
return response()->json([
'success' => true,
'message' => 'Tanda tangan berhasil dihapus',
'data' => [
'type' => $request->type,
'deleted_at' => now()->toDateTimeString()
]
]);
}
return response()->json([
'success' => false,
'message' => 'Tanda tangan tidak ditemukan',
'error_code' => '404'
], 404);
} catch (\Exception $e) {
return response()->json([
'success' => false,
'message' => 'Terjadi kesalahan: ' . $e->getMessage(),
'error_code' => '500'
], 500);
}
}
private function arrayMergeRecursive($arr1, $arr2)
{
foreach ($arr2 as $key => $value) {
if (is_array($value) && isset($arr1[$key]) && is_array($arr1[$key])) {
$arr1[$key] = $this->arrayMergeRecursive($arr1[$key], $value);
} else {
// Jika nilai baru adalah null, pertahankan nilai lama
if (!is_null($value)) {
$arr1[$key] = $value;
} elseif (!isset($arr1[$key])) {
$arr1[$key] = $value;
}
}
}
return $arr1;
}
public function print_out_inspeksi($permohonan_id, $dokument_id, $jenis_jaminan_id)
{
// Ambil data permohonan dan data umum
$permohonan = $this->getPermohonanJaminanId($permohonan_id, $dokument_id, $jenis_jaminan_id);
$basicData = $this->getCommonData();
// Ambil data inspeksi
$inspeksi = Inspeksi::where('permohonan_id', $permohonan_id)
->where('dokument_id', $dokument_id)
->first();
if (!$inspeksi) {
// Redirect jika inspeksi tidak ditemukan
return redirect()->back()->with('error', 'Data inspeksi tidak ditemukan.');
}
$forminspeksi = json_decode($inspeksi->data_form, true);
if (!$forminspeksi) {
// Redirect jika data form inspeksi kosong
return redirect()->back()->with('error', 'Silahkan isi terlebih dahulu form inspeksi.');
}
$inputAddress = $forminspeksi['asset']['alamat']['sesuai'] ?? $forminspeksi['asset']['alamat']['tidak sesuai'] ?? [];
$alamat = [
'address' => $inputAddress['address'] ?? null,
'village_code' => getWilayahName($inputAddress['village_code'] ?? null, 'village'),
'district_code' => getWilayahName($inputAddress['district_code'] ?? null, 'district'),
'city_code' => getWilayahName($inputAddress['city_code'] ?? null, 'city'),
'province_code' => getWilayahName($inputAddress['province_code'] ?? null, 'province')
];
// Decode data form inspeksi
$forminspeksi = json_decode($inspeksi->data_form, true);
if (!$forminspeksi) {
// Redirect jika data form inspeksi kosong
return redirect()->back()->with('error', 'Silahkan isi terlebih dahulu form inspeksi.');
}
// Pilih template PDF berdasarkan nama inspeksi
$templateView = strtolower($inspeksi->name) === 'rap'
? 'lpj::surveyor.components.print-out.main'
: 'lpj::surveyor.components.print-out.main';
// Generate PDF
$pdf = PDF::loadView($templateView, compact('permohonan', 'basicData', 'forminspeksi', 'alamat'));
$pdf->setPaper('A4', 'portrait');
// Tentukan nama file PDF
$namaDebiture = $permohonan->debiture->name . '-' . $permohonan->nomor_registrasi;
$fileName = 'inspeksi-' . $namaDebiture . '-data.pdf';
return $pdf->download($fileName);
}
public function approveReschedule(Request $request, $id)
{
try {
// Validasi data yang diterima
$validatedData = $request->validate([
'permohonan_id' => 'required|exists:permohonan,id',
'nomor_registrasi' => 'required'
]);
// Memulai transaksi
DB::beginTransaction();
// Update status permohonan menjadi "reschedule"
$permohonan = Permohonan::findOrFail($validatedData['permohonan_id']);
$permohonan->update([
'status' => 'approved-reschedule',
]);
// Update data penilaian dengan waktu reschedule
$penilaian = Penilaian::findOrFail($id);
$penilaian->update([
'waktu_penilaian' => $penilaian->reschedule_date,
]);
// Commit transaksi
DB::commit();
return response()->json([
'status' => 'success',
'message' => 'Reschedule jadwal dengan nomor registrasi ' . $validatedData['nomor_registrasi'] . ' berhasil disetujui.',
]);
} catch (\Exception $e) {
// Rollback jika ada error
DB::rollBack();
return response()->json([
'status' => 'error',
'message' => 'Gagal menyetujui reschedule: ' . $e->getMessage(),
], 500);
}
}
/**
* Reject reschedule request.
*/
public function rejectReschedule(Request $request, $id)
{
try {
// Validasi data yang diterima
$validatedData = $request->validate([
'permohonan_id' => 'required|exists:permohonan,id',
'rejected_note' => 'required|string|max:255',
'nomor_registrasi' => 'required|string',
]);
// Memulai transaksi
DB::beginTransaction();
// Update status permohonan menjadi "rejected-reschedule"
$permohonan = Permohonan::findOrFail($validatedData['permohonan_id']);
$permohonan->update([
'status' => 'rejected-reschedule',
]);
// Update data penilaian dengan catatan penolakan
$penilaian = Penilaian::findOrFail($id);
$penilaian->update([
'rejected_note' => $validatedData['rejected_note'],
]);
// Commit transaksi
DB::commit();
return response()->json([
'status' => 'success',
'message' => 'Reschedule jadwal dengan nomor registrasi ' . $validatedData['nomor_registrasi'] . ' berhasil ditolak dengan alasan: ' . $validatedData['rejected_note'],
]);
} catch (\Exception $e) {
// Rollback jika ada error
DB::rollBack();
return response()->json([
'status' => 'error',
'message' => 'Gagal menolak reschedule: ' . $e->getMessage(),
], 500);
}
}
public function storeProsesSurvey(Request $request, $id)
{
try {
$validated = $request->validate([
'permohonan_id' => 'required|integer|exists:permohonan,id',
]);
$permohonan = Permohonan::findOrFail($id);
$permohonan->status = 'survey';
$permohonan->save();
// Berikan respons JSON
return response()->json([
'status' => 'success',
'message' => 'Status permohonan berhasil diubah menjadi "survey".',
]);
} catch (\Exception $e) {
// Tangani error
return response()->json([
'status' => 'error',
'message' => $e->getMessage(),
], 500);
}
}
}