Merge branch 'staging' of https://git.putrakuningan.com/daengdeni/lpj into andydev
This commit is contained in:
74
app/Exports/KertasKerjaExport.php
Normal file
74
app/Exports/KertasKerjaExport.php
Normal file
@@ -0,0 +1,74 @@
|
||||
<?php
|
||||
|
||||
namespace Modules\Lpj\Exports;
|
||||
|
||||
use Maatwebsite\Excel\Concerns\FromCollection;
|
||||
use Maatwebsite\Excel\Concerns\WithColumnFormatting;
|
||||
use Maatwebsite\Excel\Concerns\WithHeadings;
|
||||
use Maatwebsite\Excel\Concerns\WithMapping;
|
||||
use PhpOffice\PhpSpreadsheet\Style\NumberFormat;
|
||||
|
||||
class KertasKerjaExport implements WithColumnFormatting, WithHeadings, FromCollection, WithMapping
|
||||
{
|
||||
protected $data;
|
||||
|
||||
public function __construct($data)
|
||||
{
|
||||
$this->data = $data;
|
||||
}
|
||||
|
||||
public function collection()
|
||||
{
|
||||
return collect([
|
||||
[
|
||||
'Pendekatan pasar',
|
||||
'Nama Pemilik Aset',
|
||||
'',
|
||||
],
|
||||
[
|
||||
'Metode Perbandingan Data Pasar',
|
||||
'Nama Pemberi Tugas: ',
|
||||
'',
|
||||
'',
|
||||
],
|
||||
[
|
||||
'Tanggal Penilaian: ',
|
||||
'Lokasi: ',
|
||||
'',
|
||||
'',
|
||||
],
|
||||
[
|
||||
'No.',
|
||||
'Objek Penilaian',
|
||||
'Data Pembanding 1',
|
||||
'Data Pembanding 2',
|
||||
'Data Pembanding 3'
|
||||
],
|
||||
]);
|
||||
}
|
||||
|
||||
// Tambahkan method map()
|
||||
public function map($row): array
|
||||
{
|
||||
return $row;
|
||||
|
||||
}
|
||||
|
||||
public function headings(): array
|
||||
{
|
||||
return [];
|
||||
}
|
||||
|
||||
public function columnFormats(): array
|
||||
{
|
||||
return [
|
||||
'A' => NumberFormat::FORMAT_NUMBER,
|
||||
'C' => NumberFormat::FORMAT_NUMBER,
|
||||
'D' => NumberFormat::FORMAT_NUMBER,
|
||||
'F' => NumberFormat::FORMAT_NUMBER,
|
||||
'G' => NumberFormat::FORMAT_NUMBER,
|
||||
'P' => NumberFormat::FORMAT_DATE_DATETIME,
|
||||
'Q' => NumberFormat::FORMAT_DATE_DATETIME
|
||||
];
|
||||
}
|
||||
}
|
||||
@@ -6,7 +6,9 @@ use Illuminate\Http\Request;
|
||||
use Modules\Lpj\Models\Permohonan;
|
||||
use Modules\Lpj\Models\Inspeksi;
|
||||
use App\Http\Controllers\Controller;
|
||||
|
||||
use Illuminate\Support\Facades\Auth;
|
||||
use Maatwebsite\Excel\Facades\Excel;
|
||||
use Modules\Lpj\Exports\KertasKerjaExport;
|
||||
class PenilaiController extends Controller
|
||||
{
|
||||
public $user;
|
||||
@@ -22,7 +24,8 @@ class PenilaiController extends Controller
|
||||
/**
|
||||
* Show the form for creating a new resource.
|
||||
*/
|
||||
public function lampiran($id){
|
||||
public function lampiran($id)
|
||||
{
|
||||
$permohonan = Permohonan::with('debiture.documents')->find($id);
|
||||
|
||||
$jaminanId = $permohonan->debiture->documents->first()->jenis_jaminan_id;
|
||||
@@ -36,7 +39,7 @@ class PenilaiController extends Controller
|
||||
|
||||
|
||||
return view('lpj::penilai.lampiran', compact('permohonan', 'formFoto'));
|
||||
}
|
||||
}
|
||||
|
||||
public function create()
|
||||
{
|
||||
@@ -93,21 +96,26 @@ class PenilaiController extends Controller
|
||||
}
|
||||
|
||||
// Retrieve data from the database
|
||||
$query = Permohonan::query()->where('status', '=', 'done');
|
||||
$query = Permohonan::query();
|
||||
|
||||
// Apply search filter if provided
|
||||
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->orWhereRelation('debiture', 'name', 'LIKE', '%' . $search . '%');
|
||||
$q->orWhereRelation('branch', 'name', 'LIKE', '%' . $search . '%');
|
||||
$q->orWhereRelation('user', 'name', 'LIKE', '%' . $search . '%');
|
||||
$q->orWhereRelation('tujuanPenilaian', 'name', 'LIKE', '%' . $search . '%');
|
||||
$q->orWhereRelation('jenisfasilitasKredit', 'name', 'LIKE', '%' . $search . '%');
|
||||
$columns = ['nomor_registrasi', 'debiture.name', 'branch.name', 'user.name', 'tujuanPenilaian.name', 'jenisfasilitasKredit.name'];
|
||||
|
||||
$query->where(function ($q) use ($search, $columns) {
|
||||
foreach ($columns as $column) {
|
||||
$q->orWhereRelation(explode('.', $column)[0], explode('.', $column)[1], 'LIKE', '%' . $search . '%');
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
// Apply whereHas to check penilai_id, role, and user_id specifically for 'penilai' role
|
||||
$query->whereHas('penilaian.userPenilai', function ($q) {
|
||||
$q->where('role', 'penilai') // Ensure the role is 'penilai'
|
||||
->where('user_id', 12); // Ganti dengan Auth::user()->id jika dinamis
|
||||
});
|
||||
|
||||
// Apply sorting if provided
|
||||
if ($request->has('sortOrder') && !empty($request->get('sortOrder'))) {
|
||||
$order = $request->get('sortOrder');
|
||||
@@ -122,7 +130,7 @@ class PenilaiController extends Controller
|
||||
if ($request->has('page') && $request->has('size')) {
|
||||
$page = $request->get('page');
|
||||
$size = $request->get('size');
|
||||
$offset = ($page - 1) * $size; // Calculate the offset
|
||||
$offset = ($page - 1) * $size;
|
||||
|
||||
$query->skip($offset)->take($size);
|
||||
}
|
||||
@@ -131,13 +139,20 @@ class PenilaiController extends Controller
|
||||
$filteredRecords = $query->count();
|
||||
|
||||
// Get the data for the current page
|
||||
$data = $query->with(['user', 'debiture', 'branch', 'tujuanPenilaian', 'jenisfasilitasKredit'])->get();
|
||||
$data = $query->with([
|
||||
'user',
|
||||
'debiture',
|
||||
'branch',
|
||||
'tujuanPenilaian',
|
||||
'jenisfasilitasKredit',
|
||||
'penilaian.userPenilai' // Ensure this relation is included
|
||||
])->get();
|
||||
|
||||
// Calculate the page count
|
||||
$pageCount = ceil($totalRecords / $request->get('size'));
|
||||
|
||||
// Calculate the current page number
|
||||
$currentPage = 0 + 1;
|
||||
$currentPage = $request->get('page', 1);
|
||||
|
||||
// Return the response data as a JSON object
|
||||
return response()->json([
|
||||
@@ -150,4 +165,134 @@ class PenilaiController extends Controller
|
||||
'data' => $data,
|
||||
]);
|
||||
}
|
||||
|
||||
public function kertas_kerja()
|
||||
{
|
||||
$data = [
|
||||
[
|
||||
'Pendekatan pasar',
|
||||
'Nama Pemilik Aset',
|
||||
'',
|
||||
],
|
||||
[
|
||||
'Metode Perbandingan Data Pasar',
|
||||
'Nama Pemberi Tugas: ',
|
||||
'',
|
||||
'',
|
||||
],
|
||||
[
|
||||
'Tanggal Penilaian: ',
|
||||
'Lokasi: ',
|
||||
'',
|
||||
'',
|
||||
],
|
||||
[
|
||||
'No.',
|
||||
'Objek Penilaian',
|
||||
'Data Pembanding 1',
|
||||
'Data Pembanding 2',
|
||||
'Data Pembanding 3'
|
||||
],[
|
||||
'1',
|
||||
'Jenis Aset',
|
||||
'Pembanding 1',
|
||||
'Pembanding 1',
|
||||
'Pembanding 1'
|
||||
],
|
||||
[
|
||||
'2',
|
||||
'Luas Tanah',
|
||||
'Pembanding 2',
|
||||
'Pembanding 2',
|
||||
'Pembanding 2'
|
||||
],
|
||||
[
|
||||
'3',
|
||||
'Penawaran/Transaksi',
|
||||
'',
|
||||
'Pembanding 3',
|
||||
'Pembanding 3'
|
||||
],
|
||||
[
|
||||
'4',
|
||||
'Harga penawaran/Transaksi',
|
||||
'',
|
||||
'Pembanding 3',
|
||||
'Pembanding 3'
|
||||
],[
|
||||
'5',
|
||||
'Nomor Telepon',
|
||||
'',
|
||||
'Pembanding 3',
|
||||
'Pembanding 3'
|
||||
],
|
||||
[
|
||||
'6',
|
||||
'Estimasi Harga Transaksi',
|
||||
'',
|
||||
'Pembanding 3',
|
||||
'Pembanding 3'
|
||||
],
|
||||
[
|
||||
'7',
|
||||
'Nama Nara sumber',
|
||||
'',
|
||||
'Pembanding 3',
|
||||
'Pembanding 3'
|
||||
],
|
||||
[
|
||||
'8',
|
||||
'Status Nara sumber',
|
||||
'',
|
||||
'Pembanding 3',
|
||||
'Pembanding 3'
|
||||
],
|
||||
[
|
||||
'9',
|
||||
'Waktu Penawaran/Transaksi',
|
||||
'',
|
||||
'Pembanding 3',
|
||||
'Pembanding 3'
|
||||
],
|
||||
[
|
||||
'10',
|
||||
'Titik GPS',
|
||||
'',
|
||||
'Pembanding 3',
|
||||
],
|
||||
[
|
||||
'11',
|
||||
'Alamat',
|
||||
'',
|
||||
'Pembanding 3',
|
||||
'Pembanding 3'
|
||||
],
|
||||
[
|
||||
'12',
|
||||
'Jarak Pembanding dengan Objek (m)',
|
||||
'',
|
||||
'Pembanding 3',
|
||||
'Pembanding 3'
|
||||
],
|
||||
[
|
||||
'13',
|
||||
'Estimasi Rangking Tanah',
|
||||
'',
|
||||
'Pembanding 3',
|
||||
'Pembanding 3'
|
||||
],
|
||||
[
|
||||
'14',
|
||||
'Estimasi Rangking Bangunan',
|
||||
'',
|
||||
'Pembanding 3',
|
||||
'Pembanding 3'
|
||||
]
|
||||
|
||||
];
|
||||
return Excel::download(new KertasKerjaExport($data), 'kertas-kerja.xlsx');
|
||||
}
|
||||
|
||||
|
||||
|
||||
}
|
||||
|
||||
@@ -298,10 +298,15 @@ class PenilaianController extends Controller
|
||||
$q->orWhere('status', 'LIKE', '%' . $search . '%');
|
||||
});
|
||||
}
|
||||
|
||||
$query->whereIn('status', ['registered', 'registrasi-final']);
|
||||
$query->whereHas('region.teams.teamsUsers.user', function ($q) {
|
||||
$q->where('id', Auth::user()->id);
|
||||
});
|
||||
|
||||
// Filter berdasarkan role
|
||||
if (Auth::user()->roles[0]->name !== 'administrator') {
|
||||
$query->whereHas('region.teams.teamsUsers.user', function ($q) {
|
||||
$q->where('id', Auth::user()->id);
|
||||
});
|
||||
}
|
||||
|
||||
if ($request->has('sortOrder') && !empty($request->get('sortOrder'))) {
|
||||
$order = $request->get('sortOrder');
|
||||
|
||||
@@ -5,6 +5,7 @@ namespace Modules\Lpj\Http\Controllers;
|
||||
use App\Http\Controllers\Controller;
|
||||
use Illuminate\Http\RedirectResponse;
|
||||
use Illuminate\Http\Request;
|
||||
use Illuminate\Support\Facades\Validator;
|
||||
use Maatwebsite\Excel\Facades\Excel;
|
||||
use Modules\Lpj\Exports\BasicDataSurveyorExport;
|
||||
use Illuminate\Support\Facades\DB;
|
||||
@@ -21,6 +22,7 @@ use Modules\Lpj\Models\PosisiKavling;
|
||||
use Modules\Lpj\Models\KondisiFisikTanah;
|
||||
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;
|
||||
@@ -56,7 +58,7 @@ use Modules\Lpj\Models\DetailDokumenJaminan;
|
||||
use Modules\Lpj\Models\JenisKapal;
|
||||
use Modules\Lpj\Models\JenisKendaraan;
|
||||
use Modules\Lpj\Models\RuteJaminan;
|
||||
use Modules\Lpj\Models\JenisJaminan;
|
||||
|
||||
use Modules\Lpj\Models\HubunganPemilikJaminan;
|
||||
use Modules\Lpj\Models\HubunganPenghuniJaminan;
|
||||
use Modules\Lpj\Models\AnalisaUnit;
|
||||
@@ -97,12 +99,12 @@ class SurveyorController extends Controller
|
||||
'penilaian',
|
||||
'documents.jenisJaminan',
|
||||
])->findOrFail($id);
|
||||
|
||||
|
||||
$surveyor = $id;
|
||||
$branches = Branch::all();
|
||||
$provinces = Province::all();
|
||||
$bentukTanah = BentukTanah::all();
|
||||
|
||||
|
||||
// Get all inspeksi data for this permohonan
|
||||
$inspeksiData = Inspeksi::where('permohonan_id', $id)
|
||||
->get()
|
||||
@@ -115,7 +117,8 @@ class SurveyorController extends Controller
|
||||
'data_pembanding' => json_decode($item->data_pembanding, true),
|
||||
];
|
||||
});
|
||||
|
||||
|
||||
|
||||
return view('lpj::surveyor.detail', compact(
|
||||
'permohonan',
|
||||
'surveyor',
|
||||
@@ -125,7 +128,7 @@ class SurveyorController extends Controller
|
||||
'inspeksiData'
|
||||
));
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Store form inspeksi.
|
||||
*/
|
||||
@@ -134,10 +137,10 @@ class SurveyorController extends Controller
|
||||
try {
|
||||
// Validate request data
|
||||
$validatedData = $request->validated();
|
||||
|
||||
|
||||
// Get action specific rules and process data
|
||||
$processedData = $this->getActionSpecificRules(
|
||||
$validatedData,
|
||||
$validatedData,
|
||||
$request->input('type'),
|
||||
$request
|
||||
);
|
||||
@@ -264,19 +267,19 @@ class SurveyorController extends Controller
|
||||
'foto_lantai_lainnya' => ['foto_lantai_lainnya', 'name_lantai_lainnya'],
|
||||
'foto_rute_lainnya' => ['foto_rute_lainnya', 'name_rute_lainnya'],
|
||||
];
|
||||
|
||||
|
||||
$inspeksi = Inspeksi::firstOrNew([
|
||||
'permohonan_id' => $request->input('permohonan_id'),
|
||||
'jenis_jaminan_id' => $request->input('jenis_jaminan_id')
|
||||
]);
|
||||
|
||||
|
||||
// Get existing foto_form data if it exists
|
||||
$existingData = $inspeksi->exists && $inspeksi->foto_form
|
||||
? json_decode($inspeksi->foto_form, true)
|
||||
$existingData = $inspeksi->exists && $inspeksi->foto_form
|
||||
? json_decode($inspeksi->foto_form, true)
|
||||
: [];
|
||||
|
||||
|
||||
$formatFotojson = $existingData; // Start with existing data
|
||||
|
||||
|
||||
// Process each photo category
|
||||
foreach ($photoCategories as $category => $fields) {
|
||||
// Only update if new files are provided
|
||||
@@ -288,7 +291,7 @@ class SurveyorController extends Controller
|
||||
$formatFotojson[$category] = $this->processPhotoCategory($request, $fields);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
// Process single files
|
||||
$singleFiles = ['foto_basement', 'foto_gerbang', 'pendamping'];
|
||||
foreach ($singleFiles as $file) {
|
||||
@@ -300,7 +303,7 @@ class SurveyorController extends Controller
|
||||
$formatFotojson[$file] = $this->uploadFile($request->file($file), $file);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
// Update record
|
||||
$inspeksi->foto_form = json_encode($formatFotojson);
|
||||
$inspeksi->save();
|
||||
@@ -340,34 +343,34 @@ class SurveyorController extends Controller
|
||||
}
|
||||
|
||||
private function categoryHasNewFiles(Request $request, array $fields): bool
|
||||
{
|
||||
$photoField = $fields[0]; // First element is usually the photo field
|
||||
return $request->hasFile($photoField) ||
|
||||
(is_array($request->file($photoField)) && count($request->file($photoField)) > 0);
|
||||
}
|
||||
|
||||
private function deleteFilesForCategory($categoryData)
|
||||
{
|
||||
if (!is_array($categoryData)) {
|
||||
return;
|
||||
{
|
||||
$photoField = $fields[0]; // First element is usually the photo field
|
||||
return $request->hasFile($photoField) ||
|
||||
(is_array($request->file($photoField)) && count($request->file($photoField)) > 0);
|
||||
}
|
||||
|
||||
foreach ($categoryData as $item) {
|
||||
if (isset($item['foto'])) {
|
||||
$this->deleteOfFile($item['foto']);
|
||||
private function deleteFilesForCategory($categoryData)
|
||||
{
|
||||
if (!is_array($categoryData)) {
|
||||
return;
|
||||
}
|
||||
|
||||
foreach ($categoryData as $item) {
|
||||
if (isset($item['foto'])) {
|
||||
$this->deleteOfFile($item['foto']);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
private function deleteOfFile($filePath)
|
||||
{
|
||||
if ($filePath && Storage::exists($filePath)) {
|
||||
Storage::delete($filePath);
|
||||
private function deleteOfFile($filePath)
|
||||
{
|
||||
if ($filePath && Storage::exists($filePath)) {
|
||||
Storage::delete($filePath);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
/**
|
||||
* Custom validation request for foto
|
||||
@@ -377,7 +380,7 @@ private function deleteOfFile($filePath)
|
||||
return $request->validate([
|
||||
'permohonan_id' => 'required',
|
||||
'jenis_jaminan_id' => 'required',
|
||||
'pendamping' => 'required|image|mimes:jpeg,png,jpg,gif,svg|max:2048',
|
||||
'pendamping' => 'nullable|image|mimes:jpeg,png,jpg,gif,svg|max:2048',
|
||||
'foto_objek.*' => 'required|image|mimes:jpeg,png,jpg,gif,svg|max:2048',
|
||||
'name_objek.*' => 'required|string|max:255',
|
||||
'foto_lingkungan.*' => 'required|image|mimes:jpeg,png,jpg,gif,svg|max:2048',
|
||||
@@ -399,40 +402,40 @@ private function deleteOfFile($filePath)
|
||||
}
|
||||
|
||||
public function submitSurveyor($id)
|
||||
{
|
||||
try {
|
||||
// Get button status check result
|
||||
$buttonStatusCheck = $this->checkButtonStatus($id);
|
||||
$buttonStatus = json_decode($buttonStatusCheck->getContent(), true);
|
||||
{
|
||||
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']) {
|
||||
// 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' => 'done',
|
||||
'submitted_at' => now()
|
||||
]);
|
||||
|
||||
return response()->json([
|
||||
'success' => true,
|
||||
'message' => 'Form surveyor berhasil disubmit'
|
||||
], 200);
|
||||
|
||||
} catch (\Exception $e) {
|
||||
return response()->json([
|
||||
'success' => false,
|
||||
'message' => 'Form belum lengkap. Pastikan semua data telah diisi dengan benar.',
|
||||
], 422);
|
||||
'message' => 'Terjadi kesalahan',
|
||||
'error' => $e->getMessage()
|
||||
], 500);
|
||||
}
|
||||
|
||||
// If validation passes, update permohonan status
|
||||
// $permohonan = Permohonan::findOrFail($id);
|
||||
// $permohonan->update([
|
||||
// 'status' => 'done',
|
||||
// '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);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
|
||||
@@ -442,41 +445,41 @@ private function deleteOfFile($filePath)
|
||||
try {
|
||||
// Get all inspeksi records for this permohonan
|
||||
$inspeksiRecords = Inspeksi::where('permohonan_id', $id)->get();
|
||||
|
||||
|
||||
if ($inspeksiRecords->isEmpty()) {
|
||||
return response()->json(['buttonDisable' => true]);
|
||||
}
|
||||
|
||||
|
||||
foreach ($inspeksiRecords as $inspeksi) {
|
||||
$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);
|
||||
|
||||
|
||||
// Get jenis jaminan to check if it needs denah
|
||||
$jenisJaminan = JenisJaminan::find($inspeksi->jenis_jaminan_id);
|
||||
$isTanahBangunan = !in_array(
|
||||
strtoupper($jenisJaminan->name ?? ''),
|
||||
strtoupper($jenisJaminan->name ?? ''),
|
||||
['KAPAL', 'PESAWAT', 'KENDARAAN', 'ALAT BERAT']
|
||||
);
|
||||
|
||||
|
||||
// Check if required forms are empty or incomplete
|
||||
if (empty($dataForm) || empty($fotoForm)) {
|
||||
return response()->json(['buttonDisable' => true]);
|
||||
}
|
||||
|
||||
|
||||
if ($isTanahBangunan && empty($denahForm)) {
|
||||
return response()->json(['buttonDisable' => true]);
|
||||
}
|
||||
|
||||
|
||||
if (empty($dataPembanding)) {
|
||||
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',
|
||||
@@ -485,7 +488,7 @@ private function deleteOfFile($filePath)
|
||||
], 500);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
@@ -548,41 +551,146 @@ private function deleteOfFile($filePath)
|
||||
}
|
||||
|
||||
|
||||
public function storeDataPembanding(Request $request)
|
||||
public function storeFreeze() {
|
||||
|
||||
}
|
||||
|
||||
|
||||
private function formatDataPembanding($request)
|
||||
{
|
||||
$data = $request->all();
|
||||
if (!$data) {
|
||||
return response()->json(['success' => false, 'message' => 'Invalid data'], 400);
|
||||
$dataPembanding = [];
|
||||
$pembandingCount = count($request->input('alamat_pembanding', []));
|
||||
|
||||
for ($i = 0; $i < $pembandingCount; $i++) {
|
||||
$pembanding = $this->formatSinglePembanding($request, $i);
|
||||
|
||||
// Perbaikan penanganan foto pembanding
|
||||
$fotoKey = "foto_objek_pembanding_{$i}"; // Sesuaikan dengan nama field di form
|
||||
if ($request->hasFile($fotoKey)) {
|
||||
$pembanding['foto_objek'] = $this->handleFileUpload(
|
||||
$request->file($fotoKey),
|
||||
'pembanding',
|
||||
"pembanding_{$i}"
|
||||
);
|
||||
}
|
||||
|
||||
$dataPembanding[] = $pembanding;
|
||||
}
|
||||
|
||||
return $dataPembanding;
|
||||
}
|
||||
|
||||
private function handleFileUpload($file, $folder, $prefix)
|
||||
{
|
||||
if (!$file) {
|
||||
return null;
|
||||
}
|
||||
|
||||
try {
|
||||
// Buat nama file yang unik
|
||||
$extension = $file->getClientOriginalExtension();
|
||||
$fileName = $prefix . '_' . time() . '_' . uniqid() . '.' . $extension;
|
||||
|
||||
// Pastikan folder exists
|
||||
$path = storage_path("app/public/{$folder}");
|
||||
if (!File::exists($path)) {
|
||||
File::makeDirectory($path, 0777, true);
|
||||
}
|
||||
|
||||
// Simpan file
|
||||
$file->storeAs("public/{$folder}", $fileName);
|
||||
|
||||
// Log untuk debugging
|
||||
\Log::info("File berhasil disimpan: {$folder}/{$fileName}");
|
||||
|
||||
return $fileName;
|
||||
} catch (\Exception $e) {
|
||||
\Log::error("Error saat upload file: " . $e->getMessage());
|
||||
throw $e;
|
||||
}
|
||||
}
|
||||
|
||||
private function formatSinglePembanding($request, $index)
|
||||
{
|
||||
$fields = [
|
||||
'alamat', 'desa', 'kecamatan', 'kabupaten', 'provinsi',
|
||||
'tahun', 'luas_tanah', 'luas_bangunan', 'tahun_bangunan',
|
||||
'status_nara_sumber', 'harga', 'nama_nara_sumber',
|
||||
'peruntukan', 'penawaran_transaksi', 'nomor_tlp',
|
||||
'kordinat_lat', 'kordinat_lng', 'jenis_aset',
|
||||
];
|
||||
|
||||
$pembanding = [];
|
||||
foreach ($fields as $field) {
|
||||
$inputName = "{$field}_pembanding";
|
||||
$pembanding[$field] = $request->input($inputName)[$index] ?? null;
|
||||
}
|
||||
|
||||
// Inisialisasi foto_objek sebagai null
|
||||
$pembanding['foto_objek'] = null;
|
||||
|
||||
return $pembanding;
|
||||
}
|
||||
|
||||
public function storeDataPembanding(Request $request)
|
||||
{
|
||||
try {
|
||||
DB::beginTransaction();
|
||||
|
||||
// $action = $request->input('type');
|
||||
// $rules = $this->getActionSpecificRules($data, $action, $request);
|
||||
$validator = $request->validate([
|
||||
'permohonan_id' => 'required|exists:permohonan,id',
|
||||
'type' => 'required|string',
|
||||
'jenis_jaminan_id' => 'required',
|
||||
'foto_objek' => 'nullable|image|max:2048',
|
||||
'foto_objek_pembanding_*' => 'nullable|image|max:2048',
|
||||
]);
|
||||
|
||||
$inspeksi = Inspeksi::where('permohonan_id', $request->input('permohonan_id'))->where('jenis_jaminan_id', $request->input('jenis_jaminan_id'))->first();
|
||||
|
||||
if (!$inspeksi) {
|
||||
Inspeksi::create([
|
||||
'permohonan_id' => $request->input('permohonan_id'),
|
||||
'data_pembanding' => json_encode($data),
|
||||
'name' => $request->input('type'),
|
||||
'jenis_jaminan_id' => $request->input('jenis_jaminan_id'),
|
||||
]);
|
||||
} else {
|
||||
$inspeksi->update(['data_pembanding' => json_encode($data)]);
|
||||
if ($validator->fails()) {
|
||||
return response()->json([
|
||||
'success' => false,
|
||||
'message' => 'Validasi gagal',
|
||||
'errors' => $validator->errors()
|
||||
], 422);
|
||||
}
|
||||
|
||||
$objekPenilaian = $this->formatObjekPenilaian($request);
|
||||
if ($request->hasFile('foto_objek')) {
|
||||
$objekPenilaian['foto_objek'] = $this->handleFileUpload(
|
||||
$request->file('foto_objek'),
|
||||
'pembanding',
|
||||
'objek_penilaian'
|
||||
);
|
||||
}
|
||||
|
||||
$formattedData = [
|
||||
'permohonan_id' => $request->input('permohonan_id'),
|
||||
'type' => $request->input('type'),
|
||||
'jenis_jaminan_id' => $request->input('jenis_jaminan_id'),
|
||||
'objek_penilaian' => $objekPenilaian,
|
||||
'data_pembanding' => $this->formatDataPembanding($request)
|
||||
];
|
||||
|
||||
$inspeksi = $this->saveInspeksi($formattedData);
|
||||
|
||||
DB::commit();
|
||||
|
||||
return response()->json(['success' => true, 'message' => 'Data saved successfully', 'data' => json_encode($data)], 200);
|
||||
} catch (Exception $e) {
|
||||
return response()->json([
|
||||
'success' => true,
|
||||
'message' => 'Data berhasil disimpan',
|
||||
'data' => $formattedData
|
||||
], 200);
|
||||
|
||||
} catch (\Exception $e) {
|
||||
DB::rollBack();
|
||||
return response()->json(['success' => false, 'message' => 'Failed to save data: ' . $e->getMessage()], 500);
|
||||
return response()->json([
|
||||
'success' => false,
|
||||
'message' => 'Gagal menyimpan data: ' . $e->getMessage()
|
||||
], 500);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
|
||||
/**
|
||||
* Form inspeksi.
|
||||
*/
|
||||
@@ -737,8 +845,9 @@ private function deleteOfFile($filePath)
|
||||
|
||||
public function dataPembanding($id, $jaminanId)
|
||||
{
|
||||
$permohonan = Permohonan::with(
|
||||
[
|
||||
try {
|
||||
// Ambil data permohonan dengan eager loading
|
||||
$permohonan = Permohonan::with([
|
||||
'user',
|
||||
'debiture.province',
|
||||
'debiture.city',
|
||||
@@ -747,28 +856,65 @@ private function deleteOfFile($filePath)
|
||||
'branch',
|
||||
'tujuanPenilaian',
|
||||
'penilaian'
|
||||
],
|
||||
)->findOrFail($id);
|
||||
$surveyor = $id;
|
||||
$branches = Branch::all();
|
||||
$provinces = Province::all();
|
||||
])->findOrFail($id);
|
||||
|
||||
$data = $this->getCommonData();
|
||||
// Ambil data inspeksi
|
||||
$inspeksi = Inspeksi::where([
|
||||
'permohonan_id' => $id,
|
||||
'jenis_jaminan_id' => $jaminanId
|
||||
])->first();
|
||||
|
||||
$inpeksi = Inspeksi::where('permohonan_id', $id)->where('jenis_jaminan_id', $jaminanId)->first();
|
||||
$forminspeksi = null;
|
||||
if ($inpeksi) {
|
||||
$forminspeksi = $inpeksi;
|
||||
// $forminspeksi = json_decode($inpeksi->data_form, true);
|
||||
// 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('Error decoding inspection data: ' . json_last_error_msg());
|
||||
}
|
||||
|
||||
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();
|
||||
$branches = Branch::all();
|
||||
$provinces = Province::all();
|
||||
|
||||
return view('lpj::surveyor.components.data-pembanding', compact(
|
||||
'permohonan',
|
||||
'id',
|
||||
'branches',
|
||||
'provinces',
|
||||
'inspectionData',
|
||||
'comparisons',
|
||||
'data',
|
||||
'jaminanId',
|
||||
'fotoForm'
|
||||
));
|
||||
|
||||
} catch (\Exception $e) {
|
||||
return redirect()
|
||||
->back()
|
||||
->with('error', 'Terjadi kesalahan saat memuat data: ' . $e->getMessage());
|
||||
}
|
||||
|
||||
// return response()->json($forminspeksi);
|
||||
return view('lpj::surveyor.components.data-pembanding', compact('permohonan', 'surveyor', 'branches', 'provinces', 'forminspeksi', 'data'));
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
private function getHeader(string $type): array
|
||||
{
|
||||
return self::HEADERS[$type] ?? [];
|
||||
@@ -1276,8 +1422,7 @@ private function deleteOfFile($filePath)
|
||||
'fasilitasObjek' => FasilitasObjek::all(),
|
||||
'merupakanDaerah' => MerupakanDaerah::all(),
|
||||
'jenisUnit' => JenisUnit::all(),
|
||||
|
||||
|
||||
'jenisJaminan' => JenisJaminan::all(),
|
||||
];
|
||||
}
|
||||
|
||||
@@ -1338,14 +1483,14 @@ private function deleteOfFile($filePath)
|
||||
$data,
|
||||
'hub_cadeb',
|
||||
true
|
||||
)
|
||||
)
|
||||
],
|
||||
'hub_cadeb_penghuni' => [
|
||||
$data['hub_cadeb_penghuni'] => $this->getFieldData(
|
||||
$data,
|
||||
'hub_cadeb_penghuni',
|
||||
true
|
||||
)
|
||||
)
|
||||
],
|
||||
|
||||
'kordinat_lng' => $data['kordinat_lng'] ?? null,
|
||||
@@ -1407,23 +1552,23 @@ private function deleteOfFile($filePath)
|
||||
$data = $request->all();
|
||||
$result = [];
|
||||
|
||||
foreach ($data['nama_bagunan'] as $index => $bangunan) {
|
||||
$bangunanData = [
|
||||
'bangunan' => $bangunan,
|
||||
'kategori' => []
|
||||
];
|
||||
// foreach ($data['nama_bangunan'] as $index => $bangunan) {
|
||||
// $bangunanData = [
|
||||
// 'bangunan' => $bangunan,
|
||||
// 'kategori' => []
|
||||
// ];
|
||||
|
||||
foreach ($data['spek_kategori_bangunan'] as $kategoriIndex => $kategori) {
|
||||
if (isset($data['spek_bangunan'][$kategori])) {
|
||||
$bangunanData['kategori'][] = [
|
||||
'kategori' => $kategori,
|
||||
'spesifikasi' => $data['spek_bangunan'][$kategori]
|
||||
];
|
||||
}
|
||||
}
|
||||
// foreach ($data['spek_kategori_bangunan'] as $kategoriIndex => $kategori) {
|
||||
// if (isset($data['spek_bangunan'][$kategori])) {
|
||||
// $bangunanData['kategori'][] = [
|
||||
// 'kategori' => $kategori,
|
||||
// 'spesifikasi' => $data['spek_bangunan'][$kategori]
|
||||
// ];
|
||||
// }
|
||||
// }
|
||||
|
||||
$result[] = $bangunanData;
|
||||
}
|
||||
// $result[] = $bangunanData;
|
||||
// }
|
||||
|
||||
return [
|
||||
'bangunan' => [
|
||||
@@ -1459,7 +1604,10 @@ private function deleteOfFile($filePath)
|
||||
'gol_mas_sekitar' => $data['gol_mas_sekitar'] ?? null,
|
||||
'tingkat_keramaian' => $data['tingkat_keramaian'] ?? null,
|
||||
'terletak_diarea' => $data['terletak_diarea'] ?? null,
|
||||
'disekitar_lokasi' => $data['disekitar_lokasi'] ?? null,
|
||||
'disekitar_lokasi' => $data['disekitar_lokasi'] === 'yes' ? [
|
||||
'kondisi' => $data['kondisi_bagunan_disekitar_lokasi'] ?? null,
|
||||
'sifat' => $data['sifat_bagunan_disekitar_lokasi'] ?? null,
|
||||
] : $data['disekitar_lokasi'],
|
||||
'kondisi_bangunan_sekitar' => $data['kondisi_bangunan_sekitar'] ?? null,
|
||||
'sifat_bangunan_sekitar' => $data['sifat_bangunan_sekitar'] ?? null,
|
||||
'dekat_makam' => $data['dekat_makam'] ?? null,
|
||||
@@ -1917,7 +2065,6 @@ private function deleteOfFile($filePath)
|
||||
'luas_unit',
|
||||
true
|
||||
),
|
||||
'jenis_unit' => $data['jenis_unit'] ?? null,
|
||||
'kondisi_unit' => $data['kondisi_unit'] ?? null,
|
||||
'posisi_unit' => $data['posisi_unit'] ?? null,
|
||||
'lantai' => $data['lantai'] ?? null,
|
||||
|
||||
@@ -104,7 +104,7 @@ class FormSurveyorRequest extends FormRequest
|
||||
'kondisi_bangunan' => 'nullable',
|
||||
'sifat_bangunan' => 'required|array',
|
||||
'sifat_bangunan_input' => 'nullable|array',
|
||||
'nama_bagunan' => 'required',
|
||||
'nama_bagunan' => 'required|nullable',
|
||||
'spek_kategori_bangunan.*' => 'required',
|
||||
'spek_bangunan.*' => 'required',
|
||||
'sarana_pelengkap' => 'required',
|
||||
@@ -122,7 +122,6 @@ class FormSurveyorRequest extends FormRequest
|
||||
'luas_unit' => 'required',
|
||||
'luas_unit_sesuai' => 'nullable',
|
||||
'luas_unit_tidak_sesuai' => 'nullable',
|
||||
'jenis_unit' => 'required|array',
|
||||
'kondisi_unit' => 'required|array',
|
||||
'posisi_unit' => 'required|array',
|
||||
'lantai' => 'required|array',
|
||||
@@ -150,8 +149,8 @@ class FormSurveyorRequest extends FormRequest
|
||||
'tingkat_keramaian' => 'nullable',
|
||||
'terletak_diarea' => 'nullable',
|
||||
'disekitar_lokasi' => 'nullable',
|
||||
'kondisi_bangunan_sekitar' => 'nullable',
|
||||
'sifat_bangunan_sekitar' => 'nullable',
|
||||
'kondisi_bagunan_disekitar_lokasi' => 'nullable',
|
||||
'sifat_bagunan_disekitar_lokasi' => 'nullable',
|
||||
'dekat_makam' => 'nullable',
|
||||
'jarak_makam' => 'nullable',
|
||||
'nama_makam' => 'nullable',
|
||||
@@ -521,7 +520,7 @@ class FormSurveyorRequest extends FormRequest
|
||||
'jenis_asset_tidak_sesuai' => 'nullable',
|
||||
'alamat_sesuai' => 'required',
|
||||
'alamat_tidak_sesuai' => 'nullable',
|
||||
|
||||
|
||||
'hub_cadeb' => 'required',
|
||||
'hub_cadeb_sesuai' => 'nullable',
|
||||
'hub_cadeb_tidak_sesuai' => 'nullable',
|
||||
|
||||
@@ -14,7 +14,7 @@ class Inspeksi extends Model
|
||||
/**
|
||||
* The attributes that are mass assignable.
|
||||
*/
|
||||
protected $fillable = ['data_form', 'foto_form', 'denah_form','permohonan_id', 'name', 'status', 'authorized_status', 'authorized_at', 'authorized_by', 'created_by', 'updated_by', 'deleted_by','jenis_jaminan_id'];
|
||||
protected $fillable = ['data_form', 'foto_form', 'denah_form','permohonan_id', 'name', 'status', 'authorized_status', 'authorized_at', 'authorized_by', 'created_by', 'updated_by', 'deleted_by','jenis_jaminan_id','data_pembanding'];
|
||||
|
||||
public function permohonan()
|
||||
{
|
||||
|
||||
@@ -23,4 +23,8 @@ class Regions extends Model
|
||||
public function teams(){
|
||||
return $this->hasMany(Teams::class, 'regions_id', 'id');
|
||||
}
|
||||
|
||||
public function penilaiTeam(){
|
||||
return $this->hasMany(PenilaianTeam::class, 'team_id', 'id');
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user