Merge branch 'staging' of https://git.putrakuningan.com/daengdeni/lpj into tender

This commit is contained in:
2024-11-06 17:47:20 +07:00
79 changed files with 5441 additions and 1199 deletions

View File

@@ -35,28 +35,41 @@ class ActivityController extends Controller
// Ambil user yang sedang login // Ambil user yang sedang login
$user = auth()->user(); $user = auth()->user();
$roles = $user->load('roles'); $roles = $user->load('roles');
$regionId = null;
// Cek apakah user memiliki role 'senior officer' // Inisialisasi regionId dan teamId sebagai null agar bisa dinamis
if ($roles->roles->pluck('name')->contains('senior officer')) { $regionId = null;
$regionId = TeamsUsers::with('team.regions') $teamId = null;
if ($roles->roles->pluck('name')->contains('senior-officer')) {
$userTeam = TeamsUsers::with('team')
->where('user_id', $user->id) ->where('user_id', $user->id)
->first()?->team->regions_id; ->first();
$regionId = $userTeam?->team->regions_id;
$teamId = $userTeam?->teams_id;
} }
$teamsActivity = TeamsUsers::with(['user', 'team', 'team.regions']) $teamsActivity = TeamsUsers::with(['user', 'team', 'team.regions', 'user.roles'])
->whereHas('team', function ($q) use ($regionId) { ->whereHas('team', function ($q) use ($regionId, $teamId) {
if ($regionId) { if ($regionId) {
$q->where('regions_id', $regionId); $q->where('regions_id', $regionId);
} }
if ($teamId) {
$q->where('id', $teamId); // Hanya tim yang sama
}
}) })
->where('user_id', '!=', $user->id) ->where('user_id', '!=', $user->id)
->whereHas('user.roles', function ($query) {
// Filter hanya peran 'surveyor' atau 'surveyor-penilai'
$query->whereIn('name', ['surveyor', 'surveyor-penilai']);
})
->get(); ->get();
return view('lpj::activity.progres_activity.index', compact('teamsActivity')); return view('lpj::activity.progres_activity.index', compact('teamsActivity'));
} }
public function senior() public function senior()
{ {
return view('lpj::activity.senior_officer.index'); return view('lpj::activity.senior_officer.index');
@@ -106,6 +119,10 @@ class ActivityController extends Controller
* Update the specified resource in storage. * Update the specified resource in storage.
*/public function dataForDatatables(Request $request) */public function dataForDatatables(Request $request)
{ {
$user = auth()->user();
// Check permissions // Check permissions
if (is_null($this->user) || !$this->user->can('debitur.view')) { if (is_null($this->user) || !$this->user->can('debitur.view')) {
// abort(403, 'Sorry! You are not allowed to view users.'); // abort(403, 'Sorry! You are not allowed to view users.');
@@ -157,7 +174,23 @@ class ActivityController extends Controller
$filteredRecords = $query->count(); $filteredRecords = $query->count();
// Get data // Get data
$data = $query->with(['user', 'debiture', 'branch', 'tujuanPenilaian'])->get();
$data = null;
$userRole = $user->roles[0]->name ?? null;
if (in_array($userRole, ['surveyor', 'surveyor-penilai'])) {
$data = $query->with(['user', 'debiture', 'branch', 'tujuanPenilaian', 'penilaian',])
->whereHas('penilaian.userPenilai', function ($q) use ($user) {
$q->where('user_id', $user->id);
})
->get();
} else {
$data = $query->with(['user', 'debiture', 'branch', 'tujuanPenilaian'])
->get();
}
// Calculate total pages // Calculate total pages
$pageCount = ceil($totalRecords / $request->get('size', 10)); $pageCount = ceil($totalRecords / $request->get('size', 10));
@@ -194,13 +227,23 @@ class ActivityController extends Controller
public function dataTablesForActivity(Request $request, $id) public function dataTablesForActivity(Request $request, $id)
{ {
if (is_null($this->user) || !$this->user->can('debitur.view')) {
// abort(403, 'Sorry! You are not allowed to view users.');
}
// Query Penilaian dengan relasi yang diperlukan // Query Penilaian dengan relasi yang diperlukan
$query = Penilaian::with(['permohonan', 'permohonan.debiture', 'permohonan.tujuanPenilaian']) $query = Penilaian::with([
->where(function($q) use ($id) { 'permohonan',
$q->where('surveyor_id', $id) 'permohonan.debiture',
->orWhere('penilaian_id', $id) 'permohonan.tujuanPenilaian',
->orWhere('penilai_surveyor_id', $id); 'permohonan.debiture.documents.jenisJaminan',
}); 'userPenilai'
])
->whereHas('userPenilai', function ($q) use ($id) {
$q->where('user_id', $id);
});
// Filter pencarian // Filter pencarian
if ($request->has('search') && !empty($request->get('search'))) { if ($request->has('search') && !empty($request->get('search'))) {

View File

@@ -18,6 +18,8 @@
use Modules\Lpj\Models\JenisJaminan; use Modules\Lpj\Models\JenisJaminan;
use Modules\Lpj\Models\JenisLegalitasJaminan; use Modules\Lpj\Models\JenisLegalitasJaminan;
use Modules\Lpj\Models\PemilikJaminan; use Modules\Lpj\Models\PemilikJaminan;
use Illuminate\Http\JsonResponse;
use Illuminate\Support\Collection;
use ZipArchive; use ZipArchive;
class DokumenJaminanController extends Controller class DokumenJaminanController extends Controller
@@ -223,55 +225,64 @@
$document = DokumenJaminan::find($jaminan); $document = DokumenJaminan::find($jaminan);
$document->update($validate); $document->update($validate);
// Get existing detail documents
$existingDetails = DetailDokumenJaminan::where('dokumen_jaminan_id', $document->id)->get()->keyBy('id');
if ($request->detail_dokumen_jaminan_id) { if($request->jenis_legalitas_jaminan_id){
foreach ($request->detail_dokumen_jaminan_id as $key => $value) { foreach($request->jenis_legalitas_jaminan_id as $key => $value){
if (isset($request->dokumen_jaminan[$key])) { $detailData = [
$file = $request->dokumen_jaminan[$key]; 'dokumen_jaminan_id' => $document->id,
if ($file) { 'jenis_legalitas_jaminan_id' => $value,
$file_name = $file->getClientOriginalName(); 'name' => $request->name[$key],
} 'keterangan' => $request->keterangan[$key],
];
if (isset($file_name)) { $dokumenJaminan = [];
$file->storeAs( if (isset($request->dokumen_jaminan[$key]) && is_array($request->dokumen_jaminan[$key])) {
'public/jaminan/' . $debitur->id . '/' . $document->id . '/', foreach($request->dokumen_jaminan[$key] as $file) {
$file_name, if ($file) {
); $file_name = $file->getClientOriginalName();
$file->storeAs(
$detail = [ 'public/jaminan/' . $debitur->id . '/' . $document->id . '/',
'dokumen_jaminan_id' => $document->id, $file_name
'jenis_legalitas_jaminan_id' => $request->jenis_legalitas_jaminan_id[$key],
'dokumen_jaminan' => 'jaminan/' . $debitur->id . '/' . $document->id . '/' . $file_name,
'name' => $request->name[$key],
'keterangan' => $request->keterangan[$key],
];
if (isset($request->detail_dokumen_jaminan_id[$key])) {
$detailDocument = DetailDokumenJaminan::find(
$request->detail_dokumen_jaminan_id[$key],
); );
$dokumenJaminan[] = 'jaminan/' . $debitur->id . '/' . $document->id . '/' . $file_name;
$detailDocument->update($detail);
$detailDocument->save();
} }
} }
} else { }
$detail = [
'dokumen_jaminan_id' => $document->id,
'jenis_legalitas_jaminan_id' => $request->jenis_legalitas_jaminan_id[$key],
'name' => $request->name[$key],
'keterangan' => $request->keterangan[$key],
];
if (isset($request->detail_dokumen_jaminan_id[$key])) { if (!empty($dokumenJaminan)) {
$detailDocument = DetailDokumenJaminan::find( $detailData['dokumen_jaminan'] = json_encode($dokumenJaminan);
$request->detail_dokumen_jaminan_id[$key], }
);
$detailDocument->update($detail); if (isset($request->detail_dokumen_jaminan_id[$key])) {
$detailId = $request->detail_dokumen_jaminan_id[$key];
$detailDocument = $existingDetails->get($detailId);
if ($detailDocument) {
// Merge new files with existing ones
if (!empty($dokumenJaminan)) {
$existingFiles = json_decode($detailDocument->dokumen_jaminan, true) ?: [];
$mergedFiles = array_merge($existingFiles, $dokumenJaminan);
$detailData['dokumen_jaminan'] = json_encode($mergedFiles);
}
$detailDocument->update($detailData);
$existingDetails->forget($detailId);
} }
} else {
DetailDokumenJaminan::create($detailData);
} }
} }
} }
// Delete any remaining existing details that weren't updated
foreach ($existingDetails as $detail) {
$files = json_decode($detail->dokumen_jaminan, true) ?: [];
foreach ($files as $file) {
Storage::delete('public/' . $file);
}
$detail->delete();
}
DB::commit(); DB::commit();
return redirect()->route('debitur.jaminan.index', $id)->with( return redirect()->route('debitur.jaminan.index', $id)->with(
'success', 'success',
@@ -290,13 +301,29 @@
) { ) {
$document = DokumenJaminan::find($jaminan); $document = DokumenJaminan::find($jaminan);
$details = DetailDokumenJaminan::where('dokumen_jaminan_id', $document->id)->get(); $details = DetailDokumenJaminan::where('dokumen_jaminan_id', $document->id)->get();
$debitur = Debiture::find($document->debiture_id); $debitur = Debiture::find($document->debiture_id);
$provinces = Province::all(); $provinces = Province::all();
$cities = City::where('province_code', $document->province_code)->get(); $cities = City::where('province_code', $document->province_code)->get();
$districts = District::where('city_code', $document->city_code)->get(); $districts = District::where('city_code', $document->city_code)->get();
$villages = Village::where('district_code', $document->district_code)->get(); $villages = Village::where('district_code', $document->district_code)->get();
$jenisJaminan = JenisJaminan::all(); $jenisJaminan = JenisJaminan::all();
$jenisLegalitasJaminan = JenisLegalitasJaminan::all(); $jenisLegalitasJaminan = JenisLegalitasJaminan::all();
$_jenisJaminan = JenisJaminan::find($document->jenis_jaminan_id);
$legalitasJaminan = json_decode($_jenisJaminan->jenis_legalitas_jaminan_id, true);
$currentLegalitasJaminan = JenisLegalitasJaminan::whereIn('id',$document->detail->pluck('jenis_legalitas_jaminan_id')->toArray())->get();
// Remove values from $legalitasJaminan that are in $currentLegalitasJaminan
$legalitasJaminan = array_diff($legalitasJaminan, $currentLegalitasJaminan->pluck('code')->toArray());
$legalitas = JenisLegalitasJaminan::whereIn('code', $legalitasJaminan)->get();
$pemilikJaminan = PemilikJaminan::where('debiture_id', $document->debiture_id)->get(); $pemilikJaminan = PemilikJaminan::where('debiture_id', $document->debiture_id)->get();
$hubunganPemilik = HubunganPemilikJaminan::all(); $hubunganPemilik = HubunganPemilikJaminan::all();
@@ -314,6 +341,7 @@
'villages', 'villages',
'pemilikJaminan', 'pemilikJaminan',
'hubunganPemilik', 'hubunganPemilik',
'legalitas'
), ),
); );
} }
@@ -350,12 +378,16 @@
if ($zip->open($zipFilePath, ZipArchive::CREATE) === true) { if ($zip->open($zipFilePath, ZipArchive::CREATE) === true) {
foreach ($documents as $document) { foreach ($documents as $document) {
$filePath = storage_path('app/public/' . $document->dokumen_jaminan); $files = is_array(json_decode($document->dokumen_jaminan)) ? json_decode($document->dokumen_jaminan) : [$document->dokumen_jaminan];
if (file_exists($filePath)) {
$zip->addFile($filePath, basename($filePath)); foreach ($files as $file) {
} else { $filePath = storage_path('app/public/' . $file);
// Log or display an error message for missing files if (file_exists($filePath)) {
return redirect()->back()->with('error', 'File not found: ' . $filePath); $zip->addFile($filePath, basename($filePath));
} else {
// Log or display an error message for missing files
return redirect()->back()->with('error', 'File not found: ' . $filePath);
}
} }
} }
$zip->close(); $zip->close();
@@ -379,10 +411,11 @@
{ {
$dokumen = request()->get('dokumen'); $dokumen = request()->get('dokumen');
$document = DetailDokumenJaminan::find($dokumen); $document = DetailDokumenJaminan::find($dokumen);
return response()->download(storage_path('app/public/' . $document->dokumen_jaminan)); $file = is_array(json_decode($document->dokumen_jaminan)) ? json_decode($document->dokumen_jaminan) : [$document->dokumen_jaminan];
return response()->download(storage_path('app/public/' . $file[request()->get('index')]));
} }
public function legalitasJaminan($id, $jaminan) public function legalitasJaminan($id)
{ {
$jenisJaminan = JenisJaminan::find($id); $jenisJaminan = JenisJaminan::find($id);
$legalitasJaminan = $jenisJaminan->jenis_legalitas_jaminan_id; $legalitasJaminan = $jenisJaminan->jenis_legalitas_jaminan_id;
@@ -390,4 +423,60 @@
$legalitas = JenisLegalitasJaminan::whereIn('code', json_decode($legalitasJaminan, true))->get(); $legalitas = JenisLegalitasJaminan::whereIn('code', json_decode($legalitasJaminan, true))->get();
echo json_encode($legalitas); echo json_encode($legalitas);
} }
public function getLegalitasJaminan($id = 10, $jenisJaminanId = 1) : JsonResponse
{
$jenisJaminan = JenisJaminan::findOrFail($jenisJaminanId);
$legalitasJaminan = $jenisJaminan->jenis_legalitas_jaminan_id;
$newLegalitasJaminan = JenisLegalitasJaminan::whereIn('code', json_decode($legalitasJaminan, true))->get();
$existingLegalitas = [];
$newLegalitas = [];
// Create a set of new jenis_legalitas_jaminan_ids for quick lookup
$newLegalitasIds = $newLegalitasJaminan->pluck('id')->toArray();
if($id>0) {
$document = DokumenJaminan::findOrFail($id);
if ($document && $document->detail) {
foreach ($document->detail as $detail) {
// Only include existing legalitas if its id is in the new set
if (in_array($detail->jenis_legalitas_jaminan_id, $newLegalitasIds)) {
$existingLegalitas[] = [
'id' => $detail->id,
'jenis_legalitas_jaminan_id' => $detail->jenis_legalitas_jaminan_id,
'name' => $detail->jenisLegalitasJaminan->name,
'dokumen_jaminan' => json_decode($detail->dokumen_jaminan) ?? $detail->dokumen_jaminan,
'custom_field' => $detail->jenisLegalitasJaminan->custom_field,
'custom_field_type' => $detail->jenisLegalitasJaminan->custom_field_type,
'details' => $detail->details,
'keterangan' => $detail->keterangan,
'is_existing' => true
];
}
}
}
}
foreach ($newLegalitasJaminan as $legalitas) {
if (!Collection::make($existingLegalitas)->contains('jenis_legalitas_jaminan_id', $legalitas->id)) {
$newLegalitas[] = [
'id' => null,
'jenis_legalitas_jaminan_id' => $legalitas->id,
'name' => $legalitas->name,
'dokumen_jaminan' => null,
'custom_field' => $legalitas->custom_field,
'custom_field_type' => $legalitas->custom_field_type,
'details' => null,
'keterangan' => null,
'is_existing' => false
];
}
}
$combinedLegalitas = array_merge($existingLegalitas, $newLegalitas);
return response()->json($combinedLegalitas);
}
} }

View File

@@ -42,7 +42,7 @@ class OtorisasiPenawaranController extends Controller
$query =PenawaranTender::query() $query =PenawaranTender::query()
->select('penawaran.*',DB::raw("CONCAT(DATE_FORMAT(penawaran.start_date, '%d %M %Y'), ' - ', DATE_FORMAT(penawaran.end_date, '%d %M %Y')) AS date_range"), 'tujuan_penilaian_kjpp.name as tujuan_penilaian_kjpp_name') ->select('penawaran.*',DB::raw("CONCAT(DATE_FORMAT(penawaran.start_date, '%d %M %Y'), ' - ', DATE_FORMAT(penawaran.end_date, '%d %M %Y')) AS date_range"), 'tujuan_penilaian_kjpp.name as tujuan_penilaian_kjpp_name')
->leftJoin('tujuan_penilaian_kjpp', 'tujuan_penilaian_kjpp.id','=','penawaran.tujuan_penilaian_kjpp_id') ->leftJoin('tujuan_penilaian_kjpp', 'tujuan_penilaian_kjpp.id','=','penawaran.tujuan_penilaian_kjpp_id')
->where('penawaran.status','=','persetujuan-penawaran') ->where('penawaran.status','=','proposal-tender')
->withCount('penawarandetails'); ->withCount('penawarandetails');
// Apply search filter if provided // Apply search filter if provided
@@ -114,7 +114,7 @@ class OtorisasiPenawaranController extends Controller
if (request()->ajax()) { if (request()->ajax()) {
$id = $request->id; $id = $request->id;
$penawaran = PenawaranTender::where('status','=','persetujuan-penawaran')->find($id); $penawaran = PenawaranTender::where('status','=','proposal-tender')->find($id);
if ($penawaran) { if ($penawaran) {
$penawarandetailLogs = PenawaranDetailTenderLog::where('penawaran_id',$id) $penawarandetailLogs = PenawaranDetailTenderLog::where('penawaran_id',$id)

View File

@@ -5,14 +5,18 @@ namespace Modules\Lpj\Http\Controllers;
use App\Http\Controllers\Controller; use App\Http\Controllers\Controller;
use Exception; use Exception;
use Illuminate\Http\Request; use Illuminate\Http\Request;
use Illuminate\Support\Facades\DB;
use Modules\Lpj\Http\Requests\PenilaianRequest; use Modules\Lpj\Http\Requests\PenilaianRequest;
use Modules\Lpj\Models\JenisPenilaian; use Modules\Lpj\Models\JenisPenilaian;
use Modules\Lpj\Models\Penilaian; use Modules\Lpj\Models\Penilaian;
use Modules\Lpj\Models\PenilaianTeam;
use Modules\Lpj\Models\Permohonan; use Modules\Lpj\Models\Permohonan;
use Modules\Lpj\Models\StatusPermohonan; use Modules\Lpj\Models\StatusPermohonan;
use Modules\Lpj\Models\Teams; use Modules\Lpj\Models\Teams;
use Modules\Lpj\Models\Regions;
use Modules\Lpj\Models\TeamsUsers; use Modules\Lpj\Models\TeamsUsers;
use Modules\Usermanagement\Models\User; use Modules\Usermanagement\Models\User;
use Illuminate\Support\Facades\Auth;
class PenilaianController extends Controller class PenilaianController extends Controller
{ {
@@ -37,16 +41,95 @@ class PenilaianController extends Controller
if ($validatedData) { if ($validatedData) {
try { try {
$penilaian = Penilaian::create($validatedData); DB::beginTransaction();
$penilaian = Penilaian::create($validatedData);
$validatedData['penilaian_id'] = $penilaian->id;
$teams_ids = [];
$user_ids = [];
$roles = [];
if ($validatedData['surveyor_id'] === 'pilih_dari_region') {
$surveyor_region_id = $validatedData['surveyor_region_id'];
// Hapus team_id sebelumnya di Permohonan jika ada
$permohonan = Permohonan::where('nomor_registrasi', $request->nomor_registrasi)->first();
if ($permohonan) {
$permohonan->update([
'region_id' => $surveyor_region_id,
]);
}
$teams_ids[] = $surveyor_region_id;
$user_ids[] = null;
$roles[] = 'surveyor';
} else {
$permohonan = Permohonan::where('nomor_registrasi', $request->nomor_registrasi)->first();
$teams_ids[] = $validatedData['teams_id'];
if (isset($validatedData['penilai_surveyor_id'])) {
$user_ids[] = $validatedData['penilai_surveyor_id'];
} else {
$user_ids[] = $validatedData['surveyor_id'];
}
$roles[] = 'surveyor';
}
if ($validatedData['penilai_id'] === 'pilih_dari_region') {
$penilaian_region_id = $validatedData['penilai_region_id'];
// Hapus team_id sebelumnya di Permohonan jika ada
$permohonan = Permohonan::where('nomor_registrasi', $request->nomor_registrasi)->first();
if ($permohonan) {
$permohonan->update([
'region_id' => $penilaian_region_id,
]);
}
$teams_ids[] = $penilaian_region_id;
$user_ids[] = null;
$roles[] = 'penilai';
} else {
$permohonan = Permohonan::where('nomor_registrasi', $request->nomor_registrasi)->first();
$teams_ids[] = $validatedData['teams_id'];
if (isset($validatedData['penilai_surveyor_id'])) {
$user_ids[] = $validatedData['penilai_surveyor_id'];
}else {
$user_ids[] = $validatedData['penilai_id'];
}
$roles[] = 'penilai';
}
foreach ($teams_ids as $key => $teams_id) {
PenilaianTeam::create([
'penilaian_id' => $validatedData['penilaian_id'],
'team_id' => $teams_id,
'user_id' => $user_ids[$key],
'role' => $roles[$key],
]);
}
if ($validatedData['surveyor_id'] === 'pilih_dari_region' || $validatedData['penilai_id'] === 'pilih_dari_region') {
$status = 'registered';
} else {
$status = 'assign';
}
$permohonan = Permohonan::where('nomor_registrasi', $request->nomor_registrasi);
$permohonan->update([ $permohonan->update([
'status' => 'assign', 'status' => $status,
]); ]);
DB::commit();
return redirect()->route('penilaian.index')->with('success', 'Penilaian berhasil disimpan'); return redirect()->route('penilaian.index')->with('success', 'Penilaian berhasil disimpan');
} catch (Exception $e) { } catch (Exception $e) {
DB::rollBack();
return redirect()->route('penilaian.index')->with('error', $e->getMessage()); return redirect()->route('penilaian.index')->with('error', $e->getMessage());
} }
} }
@@ -63,22 +146,43 @@ class PenilaianController extends Controller
/** /**
* Update the specified resource in storage. * Update the specified resource in storage.
*/ */
public function update(PenilaianRequest $request, $id) public function update(Request $request, $id)
{ {
$validate = $request->validated(); try {
if ($validate) { DB::beginTransaction();
try { $penilaian = Penilaian::where('nomor_registrasi', $request->nomor_registrasi)->first();
$penilaian = Penilaian::where('nomor_registrasi', $request->nomor_registrasi)->firstOrFail();
$penilaian->update($validate); $penilaianId = $penilaian->id;
$permohonan = Permohonan::where('nomor_registrasi', $request->nomor_registrasi);
$permohonan->update([ $penilainTeam = PenilaianTeam::where('penilaian_id', $penilaianId)->get();
'status' => 'assign',
]);
foreach ($penilainTeam as $item) {
if ($item->role === 'surveyor' && $item->user_id === null) {
$item->update([
'user_id' => $request->surveyor_id,
'role' => 'surveyor',
]);
}
if ($item->role === 'penilai' && $item->user_id === null) {
$item->update([
'user_id' => $request->penilai_id,
'role' => 'penilai',
]);
}
return redirect()->route('penilaian.index', $id)->with('success', 'Penilaian berhasil diubah');
} catch (Exception $e) {
return redirect()->route('penilaian.index', $id)->with('error', $e->getMessage());
} }
$permohonan = Permohonan::where('nomor_registrasi', $request->nomor_registrasi);
$permohonan->update([
'status' => 'assign',
]);
DB::commit();
return redirect()->route('penilaian.index')->with('success', 'Penilaian berhasil disimpan');
} catch (Exception $e) {
DB::rollBack();
return redirect()->route('penilaian.index')->with('error', $e->getMessage());
} }
} }
@@ -87,42 +191,66 @@ class PenilaianController extends Controller
*/ */
public function assignment($id) public function assignment($id)
{ {
$permohonan = Permohonan::with( $permohonan = Permohonan::with([
[ 'user',
'user', 'debiture.province',
'debiture.province', 'debiture.city',
'debiture.city', 'debiture.district',
'debiture.district', 'debiture.village',
'debiture.village', 'branch',
'branch', 'tujuanPenilaian',
'tujuanPenilaian', ])->findOrFail($id);
],
)->findOrFail($id);
$idPenilaian = $permohonan->jenis_penilaian_id; $idPenilaian = $permohonan->jenis_penilaian_id;
$idRegion = $permohonan->region_id; $idRegion = $permohonan->region_id;
$jenisPenilaian = JenisPenilaian::find($idPenilaian); $jenisPenilaian = JenisPenilaian::find($idPenilaian);
$userTeam = Teams::with(['regions', 'teamsUsers.user'])
->whereHas('regions', function ($q) use ($idRegion) {
$q->where('id', $idRegion);
})
->get();
$teamPenilai = Teams::with(['regions', 'teamsUsers', 'teamsUsers.user', ]) $teamPenilai = $userTeam->flatMap(function ($team) {
->whereHas('regions', function ($q) use ($idRegion) { return $team->teamsUsers->filter(function ($teamUser) {
$q->where('id', $idRegion); return $teamUser->user->roles->contains(function ($role) {
})->get(); return $role->name === 'surveyor' || $role->name === 'surveyor-penilai';
});
})->map(function ($teamUser) {
return $teamUser->user;
});
})->unique('id');
$existingTeamIds = $teamPenilai->pluck('id')->toArray();
$updateTeamPenilai = Teams::with(['regions', 'teamsUsers', 'teamsUsers.user'])
->whereNotIn('id', $existingTeamIds)
->get();
$regionName = null; $regionName = null;
foreach ($teamPenilai as $item) { foreach ($userTeam as $item) {
$regionName = $item->regions; $regionName = $item->regions;
} }
// $regionName = $userTeam->first()?->regions->name;
// dd($teamPenilai);
$penilaian = Penilaian::where('nomor_registrasi', $permohonan->nomor_registrasi)->first(); $penilaian = Penilaian::where('nomor_registrasi', $permohonan->nomor_registrasi)->first();
return view('lpj::penilaian.form', compact('permohonan', 'teamPenilai', 'jenisPenilaian', 'penilaian', 'regionName'));
}
$penilaianTeam = collect();
if ($penilaian && $penilaian->id) {
$penilaianTeam = PenilaianTeam::where('penilaian_id', $penilaian->id)->get();
}
// return response()->json([
// 'penilaianTeam' => $penilaianTeam
// ]);
return view('lpj::penilaian.form', compact('permohonan', 'teamPenilai', 'jenisPenilaian', 'penilaian', 'regionName', 'updateTeamPenilai', 'penilaianTeam'));
}
/** /**
* Remove the specified resource from storage. * Remove the specified resource from storage.
*/ */
@@ -160,8 +288,9 @@ class PenilaianController extends Controller
public function dataForDatatables(Request $request) public function dataForDatatables(Request $request)
{ {
if (is_null($this->user) || !$this->user->can('debitur.view')) { if (is_null($this->user) || !$this->user->can('debitur.view')) {
// abort(403, 'Sorry! You are not allowed to view users.');
} }
$query = Permohonan::query(); $query = Permohonan::query();
@@ -180,6 +309,9 @@ class PenilaianController extends Controller
} }
$query->whereRaw('LOWER(status) = ?', ['registered']); $query->whereRaw('LOWER(status) = ?', ['registered']);
$query->whereHas('region.teams.teamsUsers.user', function ($q) {
$q->where('id', Auth::user()->id);
});
if ($request->has('sortOrder') && !empty($request->get('sortOrder'))) { if ($request->has('sortOrder') && !empty($request->get('sortOrder'))) {
$order = $request->get('sortOrder'); $order = $request->get('sortOrder');
@@ -202,7 +334,7 @@ class PenilaianController extends Controller
} }
$filteredRecords = $query->count(); $filteredRecords = $query->count();
$data = $query->with(['user', 'debiture', 'branch', 'tujuanPenilaian'])->get(); $data = $query->with(['user', 'debiture', 'branch', 'tujuanPenilaian', 'region.teams.teamsUsers.user'])->get();
$pageCount = ceil($totalRecords / $size); $pageCount = ceil($totalRecords / $size);
@@ -222,7 +354,8 @@ class PenilaianController extends Controller
public function otorisator(Request $request){ public function otorisator(Request $request)
{
$type = $request->route('type'); $type = $request->route('type');
$header = ''; $header = '';
@@ -248,7 +381,8 @@ class PenilaianController extends Controller
return view('lpj::penilaian.otorisator.index', compact('header')); return view('lpj::penilaian.otorisator.index', compact('header'));
} }
public function show($id){ public function show($id)
{
$permohonan = Permohonan::find($id); $permohonan = Permohonan::find($id);
@@ -272,7 +406,10 @@ class PenilaianController extends Controller
$status = 'proses paparan'; $status = 'proses paparan';
break; break;
case 'Pembayaran': case 'Pembayaran':
$status = 'proses pembayaran'; $status = 'proses';
break;
case 'Pembatalan':
$status = 'order';
break; break;
default: default:
$status = ''; $status = '';
@@ -298,7 +435,11 @@ class PenilaianController extends Controller
if (!empty($otorisator)) { if (!empty($otorisator)) {
$query->whereRaw('LOWER(status) = ?', [strtolower($status)]); if ($status == 'proses') {
$query->whereIn('status_bayar', ['sudah_bayar', 'belum_bayar']);
} else {
$query->whereRaw('LOWER(status) = ?', [strtolower($status)]);
}
} }
// Sorting berdasarkan sortField dan sortOrder // Sorting berdasarkan sortField dan sortOrder

View File

@@ -33,25 +33,20 @@
public function store(PermohonanRequest $request) public function store(PermohonanRequest $request)
{ {
$validate = $request->validated(); $validate = $request->validated();
if ($validate) { if ($validate) {
try { try {
// Save to database // Save to database
Permohonan::create($validate); Permohonan::create($validate);
return redirect() return redirect()
->route('permohonan.index') ->route('permohonan.index')->with('success', 'Permohonan created successfully');
->with('success', 'Permohonan created successfully');
} catch (Exception $e) { } catch (Exception $e) {
return redirect() return redirect()
->route('permohonan.create') ->route('permohonan.create')->with('error', 'Failed to create permohonan' . $e->getMessage());
->with('error', 'Failed to create permohonan' . $e->getMessage());
} }
} else { } else {
return redirect() return redirect()
->route('permohonan.create') ->route('permohonan.create')->with('success', 'error naon iye')->withInput();
->with('success', 'error naon iye')
->withInput();
} }
} }
@@ -113,19 +108,20 @@
public function update(PermohonanRequest $request, $id) public function update(PermohonanRequest $request, $id)
{ {
$validate = $request->validated(); $validate = $request->validated();
if ($validate) { if ($validate) {
try { try {
// Update in database // Update in database
$permohonan = Permohonan::find($id); $permohonan = Permohonan::find($id);
if ($permohonan->status == 'revisi') {
$validate['status'] = 'order';
}
$permohonan->update($validate); $permohonan->update($validate);
return redirect() return redirect()
->route('permohonan.index') ->route('permohonan.index')->with('success', 'Permohonan updated successfully');
->with('success', 'Permohonan updated successfully');
} catch (Exception $e) { } catch (Exception $e) {
return redirect() return redirect()
->route('permohonan.edit', $id) ->route('permohonan.edit', $id)->with('error', 'Failed to update permohonan');
->with('error', 'Failed to update permohonan');
} }
} }
} }
@@ -313,11 +309,12 @@
return view('lpj::permohonan.show', compact('permohonan')); return view('lpj::permohonan.show', compact('permohonan'));
} }
public function print($id){ public function print($id)
{
$permohonan = Permohonan::find($id); $permohonan = Permohonan::find($id);
return view('lpj::permohonan.print', compact('permohonan')); return view('lpj::permohonan.print', compact('permohonan'));
// $pdf = Pdf::loadView('lpj::permohonan.print', compact('permohonan')); // $pdf = Pdf::loadView('lpj::permohonan.print', compact('permohonan'));
// return $pdf->stream(); // return $pdf->stream();
} }
} }

View File

@@ -75,7 +75,7 @@ class ProsesPenawaranController extends Controller
// Get the data for the current page // Get the data for the current page
//$data = $query->with(['user', 'debiture', 'branch', 'tujuanPenilaian'])->get(); //$data = $query->with(['user', 'debiture', 'branch', 'tujuanPenilaian'])->get();
$data = $query->with(['tujuanPenilaianKJPP'])->get(); $data = $query->with(['tujuanPenilaianKJPP','permohonan','permohonan.debiture'])->get();
// Calculate the page count // Calculate the page count
$pageCount = ceil($totalRecords / $request->get('size')); $pageCount = ceil($totalRecords / $request->get('size'));
@@ -267,20 +267,15 @@ class ProsesPenawaranController extends Controller
{ {
DB::beginTransaction(); DB::beginTransaction();
try { try {
$dataPenawaran = ['status' => 'persetujuan-penawaran', $_updatestatus = ['status' => 'proposal-tender',
'updated_by' => Auth::id(),
'updated_at' => now()
];
$dataPermohonan = ['status' => 'persetujuan-penawaran',
'updated_by' => Auth::id(), 'updated_by' => Auth::id(),
'updated_at' => now() 'updated_at' => now()
]; ];
$permohonan = Permohonan::where('nomor_registrasi','=', $penawaran->nomor_registrasi)->first(); $permohonan = Permohonan::where('nomor_registrasi','=', $penawaran->nomor_registrasi)->first();
$penawaran->update($dataPenawaran); $penawaran->update($_updatestatus);
$permohonan->update($dataPermohonan); $permohonan->update($_updatestatus);
DB::commit(); DB::commit();

View File

@@ -41,7 +41,7 @@ class ProsesPenawaranUlangController extends Controller
$query =PenawaranTender::query() $query =PenawaranTender::query()
->select('penawaran.*',DB::raw("CONCAT(DATE_FORMAT(penawaran.start_date, '%d %M %Y'), ' - ', DATE_FORMAT(penawaran.end_date, '%d %M %Y')) AS date_range"), 'tujuan_penilaian_kjpp.name as tujuan_penilaian_kjpp_name') ->select('penawaran.*',DB::raw("CONCAT(DATE_FORMAT(penawaran.start_date, '%d %M %Y'), ' - ', DATE_FORMAT(penawaran.end_date, '%d %M %Y')) AS date_range"), 'tujuan_penilaian_kjpp.name as tujuan_penilaian_kjpp_name')
->leftJoin('tujuan_penilaian_kjpp', 'tujuan_penilaian_kjpp.id','=','penawaran.tujuan_penilaian_kjpp_id') ->leftJoin('tujuan_penilaian_kjpp', 'tujuan_penilaian_kjpp.id','=','penawaran.tujuan_penilaian_kjpp_id')
->where('penawaran.status','=','persetujuan-penawaran') ->where('penawaran.status','=','proposal-tender')
->withCount('penawarandetails'); ->withCount('penawarandetails');
// Apply search filter if provided // Apply search filter if provided
@@ -118,7 +118,7 @@ class ProsesPenawaranUlangController extends Controller
if (request()->ajax()) { if (request()->ajax()) {
$id = $request->id; $id = $request->id;
$penawaran = PenawaranTender::where('status','=','persetujuan-penawaran')->find($id); $penawaran = PenawaranTender::where('status','=','proposal-tender')->find($id);
if ($penawaran) { if ($penawaran) {
$penawrandetails = PenawaranDetailTender::where('penawaran_id','=',$id) $penawrandetails = PenawaranDetailTender::where('penawaran_id','=',$id)

View File

@@ -167,6 +167,8 @@
$dataku['jenis_penilaian_id'] =$request->jenis_penilaian; $dataku['jenis_penilaian_id'] =$request->jenis_penilaian;
$dataku['region_id'] =$request->region; $dataku['region_id'] =$request->region;
$dataku['status'] = 'registered'; $dataku['status'] = 'registered';
if($request->catatan2)
$dataku['registrasi_catatan'] =$request->catatan2;
} }
else else
{ {

View File

@@ -27,6 +27,7 @@ use Exception;
use Illuminate\Support\Facades\Validator; use Illuminate\Support\Facades\Validator;
use Illuminate\Support\Facades\Auth; use Illuminate\Support\Facades\Auth;
use Illuminate\Support\Facades\DB; use Illuminate\Support\Facades\DB;
use Illuminate\Support\Facades\Storage;
use Modules\Lpj\Models\PenawaranTender; use Modules\Lpj\Models\PenawaranTender;
@@ -87,7 +88,7 @@ use Modules\Lpj\Models\PenawaranTender;
// Get the data for the current page // Get the data for the current page
//$data = $query->with(['user', 'debiture', 'branch', 'tujuanPenilaian'])->get(); //$data = $query->with(['user', 'debiture', 'branch', 'tujuanPenilaian'])->get();
$data = $query->get(); $data = $query->with(['permohonan'])->get();
// dd($data); // dd($data);
$i=0; $i=0;
foreach($data as $obj) foreach($data as $obj)
@@ -135,6 +136,13 @@ use Modules\Lpj\Models\PenawaranTender;
public function show($id) public function show($id)
{ {
$permohonan = Permohonan::find($id); $permohonan = Permohonan::find($id);
if($permohonan->dokumen)
{
$pdfSPK_path = Storage::url($permohonan->dokumen);
$permohonan->dokumen = $pdfSPK_path;
$permohonan->dokumen = '| <a download href="'. $pdfSPK_path.'" class="badge badge-sm badge-outline" target="_blank">Dokumen SPK.pdf &nbsp;&nbsp;<i class="ki-filled ki-cloud-download"></i></a>';
}
return view('lpj::registrasifinal.show', compact('id','permohonan')); return view('lpj::registrasifinal.show', compact('id','permohonan'));
} }
@@ -165,6 +173,12 @@ use Modules\Lpj\Models\PenawaranTender;
$penawaran->status = $penawaranString; $penawaran->status = $penawaranString;
} }
if($datas->dokumen)
{
$pdfSPK_path = Storage::url($datas->dokumen);
$datas->dokumen = $pdfSPK_path;
}
$data['status'] = 'success'; $data['status'] = 'success';
$data['regions'] = $regions; $data['regions'] = $regions;
$data['penawaran'] = $penawaran; $data['penawaran'] = $penawaran;

View File

@@ -1,14 +1,22 @@
<?php <?php
namespace Modules\Lpj\Http\Controllers; namespace Modules\Lpj\Http\Controllers;
use App\Http\Controllers\Controller; use Carbon\Carbon;
use Exception; use App\Http\Controllers\Controller;
use Illuminate\Http\Request; use Barryvdh\DomPDF\Facade\Pdf; // https://github.com/barryvdh/laravel-dompdf
use Maatwebsite\Excel\Facades\Excel; use Exception;
// use Modules\Lpj\Exports\TujuanPenilaianExport; use Illuminate\Http\Request;
// use Modules\Lpj\Http\Requests\TujuanPenilaianRequest; use Maatwebsite\Excel\Facades\Excel;
// use Modules\Lpj\Models\TujuanPenilaian; // use Modules\Lpj\Exports\TujuanPenilaianExport;
// use Modules\Lpj\Http\Requests\TujuanPenilaianRequest;
// use Modules\Lpj\Models\TujuanPenilaian;
use Modules\Lpj\Models\PenawaranTender;
use Illuminate\Support\Facades\DB;
use Modules\Lpj\Models\Permohonan;
use Illuminate\Http\JsonResponse;
use Illuminate\Support\Facades\Storage;
use Illuminate\Support\Facades\Auth;
class SpkController extends Controller class SpkController extends Controller
{ {
@@ -19,10 +27,215 @@
return view('lpj::spk.index'); return view('lpj::spk.index');
} }
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.');
}
// Retrieve data from the database
$query =Permohonan::query()->with(['penawaran','penawaran.tujuanPenilaianKjpp'])
->where('permohonan.status','=','spk');
// 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->orWhere('penawaran.tanggal_permohonan', 'LIKE', '%' . $search . '%');
$q->orWhere('status', '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
//$data = $query->with(['user', 'debiture', 'branch', 'tujuanPenilaian'])->get();
$data = $query->get();
$i=0;
foreach($data as $obj)
{
if($obj->tanggal_penilaian_sebelumnya)
{
$data[$i]->tanggal_penilaian_sebelumnya = Carbon::parse($obj->tanggal_penilaian_sebelumnya)->format('d F Y H:i:s');
}
if($obj->biaya_kjpp_sebelumnya)
{
$data[$i]->biaya_kjpp_sebelumnya = formatRupiah($obj->biaya_kjpp_sebelumnya);
}
// date_range
if($obj->start_date && $obj->end_date)
{
$data[$i]->date_range = Carbon::parse($obj->start_date)->format('d M Y').' - '.Carbon::parse($obj->end_date)->format('d M Y');
}
$i++;
}
// 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 viewSpk() public function viewSpk()
{ {
// return Excel::download(new TujuanPenilaianExport, 'tujuan_penilaian.xlsx'); // return Excel::download(new TujuanPenilaianExport, 'tujuan_penilaian.xlsx');
return view('lpj::spk.view'); return view('lpj::spk.view');
} }
public function show($id)
{
$penawaran = PenawaranTender::find($id);
// return view('lpj::spk.show', compact('id','permohonan'));
}
public function edit($id)
{
$penawaran = PenawaranTender::leftJoin('detail_penawaran', 'detail_penawaran.penawaran_id','=','penawaran.id')
->leftJoin('jenis_laporan', 'jenis_laporan.id','=','penawaran.jenis_laporan_id')
->leftJoin('kjpp', 'kjpp.id','=','detail_penawaran.kjpp_rekanan_id')
->where('detail_penawaran.status','=',1)
->where('penawaran.id','=', $id)
->select('penawaran.*', 'detail_penawaran.attachment as attachmentku',
'detail_penawaran.biaya_penawaran as detail_penawaran_biaya_penawaran',
'kjpp.name as kjpp_name',
'kjpp.address as kjpp_address',
'jenis_laporan.name as jenis_laporan_name'
)->first();
$permohonan = Permohonan::where('nomor_registrasi','=',$penawaran->nomor_registrasi)
->leftJoin('dokumen_jaminan', 'dokumen_jaminan.permohonan_id','=','permohonan.id')
->leftJoin('jenis_jaminan', 'jenis_jaminan.id','=','dokumen_jaminan.jenis_jaminan_id')
->select('permohonan.*', 'jenis_jaminan.name as jenis_jaminan_name',
'dokumen_jaminan.address as dokumen_jaminan_address');
$data = $permohonan->with(['user', 'debiture', 'branch', 'tujuanPenilaian'])->first();
return view('lpj::spk.edit', compact('data', 'penawaran'));
}
public function update(Request $request, $id): JsonResponse
{
// init
$data1 = array();
$dataPermohonan = array();
// data
$penawaran = PenawaranTender::leftJoin('detail_penawaran', 'detail_penawaran.penawaran_id','=','penawaran.id')
->leftJoin('jenis_laporan', 'jenis_laporan.id','=','penawaran.jenis_laporan_id')
->leftJoin('kjpp', 'kjpp.id','=','detail_penawaran.kjpp_rekanan_id')
->where('detail_penawaran.status','=',1)
->where('penawaran.id','=', $id)
->select('penawaran.*', 'detail_penawaran.attachment as attachmentku',
'kjpp.name as kjpp_name',
'kjpp.address as kjpp_address',
'jenis_laporan.name as jenis_laporan_name'
)->first();
$permohonan = Permohonan::where('nomor_registrasi','=',$penawaran->nomor_registrasi)
->leftJoin('dokumen_jaminan', 'dokumen_jaminan.permohonan_id','=','permohonan.id')
->leftJoin('jenis_jaminan', 'jenis_jaminan.id','=','dokumen_jaminan.jenis_jaminan_id')
->select('permohonan.*', 'jenis_jaminan.name as jenis_jaminan_name');
$data = $permohonan->with(['user', 'debiture', 'branch', 'tujuanPenilaian'])->first();
$folderPath = 'uploads/spk/';
$extension = '.pdf';
$newFileName = "SPK_".$penawaran->nomor_registrasi."_".Auth::user()->id."_".time(). $extension;
$newFileNameWithPath = $folderPath . $newFileName;
// update table permohonan
$dataPermohonan=['dokumen' => $newFileNameWithPath];
$data->update($dataPermohonan);
// update table permohonan
// pdf path
$spkpenawaran_path = Storage::url($newFileNameWithPath);
$pdf =Pdf::loadView('lpj::spk.documentSPK', compact('data', 'penawaran'));
$content = $pdf->download()->getOriginalContent();
Storage::put('public/'.$newFileNameWithPath,$content);
$data1['status'] = 'success';
$data1['spkpenawaran_path'] = $spkpenawaran_path;
$data1['message']['message_success'] = array('Generate SPK PDF successfully');
return response()->json($data1);
}
public function dokumennya()
{
// return view('lpj::spk.dokumennya');
$id="3";
$penawaran = PenawaranTender::leftJoin('detail_penawaran', 'detail_penawaran.penawaran_id','=','penawaran.id')
->leftJoin('jenis_laporan', 'jenis_laporan.id','=','penawaran.jenis_laporan_id')
->leftJoin('kjpp', 'kjpp.id','=','detail_penawaran.kjpp_rekanan_id')
->where('detail_penawaran.status','=',1)
->where('penawaran.id','=', $id)
->select('penawaran.*', 'detail_penawaran.attachment as attachmentku',
'detail_penawaran.biaya_penawaran as detail_penawaran_biaya_penawaran',
'kjpp.name as kjpp_name',
'kjpp.address as kjpp_address',
'jenis_laporan.name as jenis_laporan_name'
)->first();
$permohonan = Permohonan::where('nomor_registrasi','=',$penawaran->nomor_registrasi)
->leftJoin('dokumen_jaminan', 'dokumen_jaminan.permohonan_id','=','permohonan.id')
->leftJoin('jenis_jaminan', 'jenis_jaminan.id','=','dokumen_jaminan.jenis_jaminan_id')
->select('permohonan.*', 'jenis_jaminan.name as jenis_jaminan_name',
'dokumen_jaminan.address as dokumen_jaminan_address');
$data = $permohonan->with(['user', 'debiture', 'branch', 'tujuanPenilaian'])->first();
return view('lpj::spk.dokumennya', compact('data', 'penawaran'));
}
public function download($id) {
$document = Permohonan::find($id);
return response()->download(storage_path('app/public/' .$document->dokumen));
}
} }

View File

@@ -6,6 +6,7 @@ use App\Http\Controllers\Controller;
use Illuminate\Http\RedirectResponse; use Illuminate\Http\RedirectResponse;
use Illuminate\Http\Request; use Illuminate\Http\Request;
use Illuminate\Support\Facades\DB; use Illuminate\Support\Facades\DB;
use Illuminate\Support\Facades\Auth;
use Illuminate\Http\Response; use Illuminate\Http\Response;
use Modules\Lpj\Models\Permohonan; use Modules\Lpj\Models\Permohonan;
use Modules\Lpj\Models\Branch; use Modules\Lpj\Models\Branch;
@@ -32,9 +33,14 @@ use Modules\Lpj\Models\Denah;
use Modules\Lpj\Models\FotoJaminan; use Modules\Lpj\Models\FotoJaminan;
use Modules\Lpj\Models\Lingkungan; use Modules\Lpj\Models\Lingkungan;
use Modules\Lpj\Models\LantaiUnit; use Modules\Lpj\Models\LantaiUnit;
use Modules\Lpj\Models\Lantai;
use Modules\Lpj\Models\ViewUnit;
use Modules\Lpj\Models\ObjekJaminan; use Modules\Lpj\Models\ObjekJaminan;
use Modules\Lpj\Models\RuteJaminan; use Modules\Lpj\Models\RuteJaminan;
use Modules\Lpj\Models\AnalisaUnit; use Modules\Lpj\Models\AnalisaUnit;
use Modules\Lpj\Models\GolonganMasySekitar;
use Modules\Lpj\Models\TingkatKeramaian;
use Modules\Lpj\Models\LaluLintasLokasi;
use Modules\Lpj\Models\SpekBagunanAnalisaDetail; use Modules\Lpj\Models\SpekBagunanAnalisaDetail;
use Modules\Lpj\Http\Requests\SurveyorRequest; use Modules\Lpj\Http\Requests\SurveyorRequest;
use Modules\Lpj\Http\Requests\FormSurveyorRequest; use Modules\Lpj\Http\Requests\FormSurveyorRequest;
@@ -42,6 +48,7 @@ use Modules\Lpj\Http\Requests\FormSurveyorRequest;
class SurveyorController extends Controller class SurveyorController extends Controller
{ {
public $user; public $user;
/** /**
* Display a listing of the resource. * Display a listing of the resource.
*/ */
@@ -113,6 +120,8 @@ class SurveyorController extends Controller
->where('permohonan_id', $id) ->where('permohonan_id', $id)
->get(); ->get();
return view('lpj::surveyor.detail', compact( return view('lpj::surveyor.detail', compact(
'buttonDisable', 'buttonDisable',
'fotojaminan', 'fotojaminan',
@@ -508,6 +517,11 @@ class SurveyorController extends Controller
$query->whereRaw('LOWER(status) = ?', ['assign']); $query->whereRaw('LOWER(status) = ?', ['assign']);
$query->whereHas('region.teams.teamsUsers.user', function ($q) {
$q->where('id', Auth::user()->id);
});
if ($request->has('sortOrder') && !empty($request->get('sortOrder'))) { if ($request->has('sortOrder') && !empty($request->get('sortOrder'))) {
$order = $request->get('sortOrder'); $order = $request->get('sortOrder');
$column = $request->get('sortField'); $column = $request->get('sortField');
@@ -552,6 +566,8 @@ class SurveyorController extends Controller
{ {
$permohonan = $this->getPermohonanJaminanId($id, $jaminanId); $permohonan = $this->getPermohonanJaminanId($id, $jaminanId);
$branches = Branch::all(); $branches = Branch::all();
$provinces = Province::all(); $provinces = Province::all();
@@ -570,6 +586,11 @@ class SurveyorController extends Controller
$spekBangunan = SpekBangunan::all(); $spekBangunan = SpekBangunan::all();
$saranaPelengkap = SaranaPelengkap::all(); $saranaPelengkap = SaranaPelengkap::all();
$arahMataAngin = ArahMataAngin::all(); $arahMataAngin = ArahMataAngin::all();
$lantai = Lantai::all();
$viewUnit = ViewUnit::all();
$golMasySekitar = GolonganMasySekitar::all();
$tingkatKeramaian = TingkatKeramaian::all();
$laluLintasLokasi = LaluLintasLokasi::all();
$analisa = Analisa::with('analisaTanahBangunan', 'analisaLingkungan', 'analisaFakta', 'jenisJaminan') $analisa = Analisa::with('analisaTanahBangunan', 'analisaLingkungan', 'analisaFakta', 'jenisJaminan')
@@ -597,6 +618,11 @@ class SurveyorController extends Controller
'spekBangunan', 'spekBangunan',
'saranaPelengkap', 'saranaPelengkap',
'arahMataAngin', 'arahMataAngin',
'lantai',
'viewUnit',
'golMasySekitar',
'tingkatKeramaian',
'laluLintasLokasi'
)); ));
} }
@@ -625,10 +651,6 @@ class SurveyorController extends Controller
$provinces = Province::all(); $provinces = Province::all();
$fotoJaminan = FotoJaminan::with(['objekJaminan', 'lantaiUnit' ,'ruteJaminan', 'lingkungan'])->where('permohonan_id', $id)->where('jenis_jaminan_id', $jaminanId)->first(); $fotoJaminan = FotoJaminan::with(['objekJaminan', 'lantaiUnit' ,'ruteJaminan', 'lingkungan'])->where('permohonan_id', $id)->where('jenis_jaminan_id', $jaminanId)->first();
// return response()->json([
// 'data' => $fotoJaminan,
// ]);
return view('lpj::surveyor.components.foto', compact('permohonan', 'surveyor', 'branches', 'provinces', 'fotoJaminan')); return view('lpj::surveyor.components.foto', compact('permohonan', 'surveyor', 'branches', 'provinces', 'fotoJaminan'));
} }
@@ -658,25 +680,18 @@ class SurveyorController extends Controller
} }
private function getHeader(string $type): array
{
return self::HEADERS[$type] ?? [];
}
public function data(Request $request) public function data(Request $request)
{ {
$type = $request->route('type'); $type = $request->route('type');
$header = $this->getHeader($request->route('type'));
$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'],
];
$header = $headers[$type] ?? '';
return view('lpj::surveyor.data.index', compact('header')); return view('lpj::surveyor.data.index', compact('header'));
} }
@@ -684,21 +699,9 @@ class SurveyorController extends Controller
public function createData($type) public function createData($type)
{ {
$headers = [ $spekKategoriBagunan = SpekKategoritBangunan::all();
'bentuk-tanah' => ['Bentuk Tanah', 'bentuk-tanah'], $header = $this->getHeader($type);
'kontur-tanah' => ['Kontur Tanah', 'kontur-tanah'], return view('lpj::surveyor.data.form', compact('header', 'spekKategoriBagunan'));
'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'],
];
$header = $headers[$type] ?? '';
return view('lpj::surveyor.data.form', compact('header'));
} }
@@ -708,37 +711,37 @@ class SurveyorController extends Controller
$validate = $request->validated(); $validate = $request->validated();
if ($validate) { if ($validate) {
$type = $request->route('type'); try {
$type = $request->route('type');
$modelClasses = [ $modelClass = $this->getModelClass($type);
'bentuk-tanah' => BentukTanah::class,
'kontur-tanah' => KonturTanah::class,
'posisi-kavling' => PosisiKavling::class,
'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,
];
if (!array_key_exists($type, $modelClasses)) { if (!$modelClass) {
return redirect() return redirect()
->route('basicdata.'. $type .'.index') ->route('basicdata.'. $type .'.index')
->with('error', 'Invalid type specified.'); ->with('error', 'Invalid type specified.');
} }
$modelClass = $modelClasses[$type]; if ($type == 'spek-bangunan') {
$data = $request->all(); $validate['spek_kategori_bagunan_id'] = $request->spek_kategori_bagunan_id;
$data['status'] = true;
}
$data = array_merge($validate, ['status' => true]);
$modelClass::create($data); $modelClass::create($data);
return redirect() return redirect()
->route('basicdata.' . $type .'.index') ->route('basicdata.' . $type .'.index')
->with('success', 'created successfully'); ->with('success', 'created successfully');
} catch (Exeception $e) {
return response()->json(array('error' => $e->getMessage()), 400);
// return redirect()
// ->route('basicdata.' . $type .'.index')
// ->with('error', $th->getMessage());
}
} }
} }
@@ -757,6 +760,9 @@ class SurveyorController extends Controller
'spek-bangunan' => ['Spek Bangunan', 'spek-bangunan', SpekBangunan::class], 'spek-bangunan' => ['Spek Bangunan', 'spek-bangunan', SpekBangunan::class],
'spek-kategori-bangunan' => ['Spek Kategori Bangunan', 'spek-kategori-bangunan', SpekKategoritBangunan::class], 'spek-kategori-bangunan' => ['Spek Kategori Bangunan', 'spek-kategori-bangunan', SpekKategoritBangunan::class],
'sarana-pelengkap' => ['Sarana Pelengkap', 'sarana-pelengkap', SaranaPelengkap::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],
]; ];
@@ -769,7 +775,13 @@ class SurveyorController extends Controller
$header = $dataMap[$type] ?? ''; $header = $dataMap[$type] ?? '';
$model = $modelClass::findOrFail($id); $model = $modelClass::findOrFail($id);
return view('lpj::surveyor.data.form', compact('header', 'model')); if ($type == 'spek-bangunan') {
$spekKategoriBagunan = SpekKategoritBangunan::all();
}
return view('lpj::surveyor.data.form', compact('header', 'model', 'spekKategoriBagunan'));
} }
@@ -777,26 +789,22 @@ class SurveyorController extends Controller
{ {
$validate = $request->validated(); $validate = $request->validated();
if ($validate) { if ($validate) {
$modelClasses = [ $modelClass = $this->getModelClass($type);
'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,
]; if ($type == 'spek-bangunan') {
$validate['spek_kategori_bagunan_id'] = $request->spek_kategori_bagunan_id;
}
// Check if the provided type exists in the modelClasses // Check if the provided type exists in the modelClasses
if (!array_key_exists($type, $modelClasses)) { if (!$modelClass) {
return redirect() return redirect()
->route('basicdata.' . $type . '.index') ->route('basicdata.' . $type . '.index')
->with('error', 'Invalid type specified.'); ->with('error', 'Invalid type specified.');
} }
$modelClass = $modelClasses[$type];
$model = $modelClass::findOrFail($id); $model = $modelClass::findOrFail($id);
$model->update($validate); $model->update($validate);
@@ -817,8 +825,6 @@ class SurveyorController extends Controller
//abort(403, 'Sorry! You are not allowed to view users.'); //abort(403, 'Sorry! You are not allowed to view users.');
} }
// Retrieve data from the database
$models = [ $models = [
'Bentuk Tanah' => BentukTanah::class, 'Bentuk Tanah' => BentukTanah::class,
'Kontur Tanah' => KonturTanah::class, 'Kontur Tanah' => KonturTanah::class,
@@ -828,9 +834,14 @@ class SurveyorController extends Controller
'Jenis Bangunan' => JenisBangunan::class, 'Jenis Bangunan' => JenisBangunan::class,
'Kondisi Bangunan' => KondisiBangunan::class, 'Kondisi Bangunan' => KondisiBangunan::class,
'Sifat Bangunan' => SifatBangunan::class, 'Sifat Bangunan' => SifatBangunan::class,
// 'Spek Kategori Bangunan' => SpekKategoritBangunan::class, 'Spek Kategori Bangunan' => SpekKategoritBangunan::class,
// 'Spek Bangunan' => SpekBangunan::class, 'Spek Bangunan' => SpekBangunan::class,
'Sarana Pelengkap' => SaranaPelengkap::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,
]; ];
@@ -840,8 +851,6 @@ class SurveyorController extends Controller
throw new InvalidArgumentException("Invalid type: $type"); throw new InvalidArgumentException("Invalid type: $type");
} }
// Apply search filter if provided
if ($request->has('search') && !empty($request->get('search'))) { if ($request->has('search') && !empty($request->get('search'))) {
$search = $request->get('search'); $search = $request->get('search');
$query->where(function ($q) use ($search) { $query->where(function ($q) use ($search) {
@@ -897,24 +906,13 @@ class SurveyorController extends Controller
{ {
try { try {
$modelClasses = [ $modelClass = $this->getModelClass($type);
'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,
];
if (!$modelClass) {
if (!array_key_exists($type, $modelClasses)) {
return response()->json(['success' => false, 'message' => 'Invalid type specified.'], 400); return response()->json(['success' => false, 'message' => 'Invalid type specified.'], 400);
} }
$modelClass = $modelClasses[$type];
$model = $modelClass::findOrFail($id); $model = $modelClass::findOrFail($id);
$model->delete(); $model->delete();
@@ -948,6 +946,55 @@ class SurveyorController extends Controller
->findOrFail($id); ->findOrFail($id);
} }
public function submitSurveyor(Request $request, $id)
{
$permohonan = Permohonan::find($id);
$permohonan->update([
'status' => 'done',
]);
return redirect()
->route('surveyor.index')
->with('success', 'form surveyor submitted successfully');
}
public function validateSubmit(){
}
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,
];
private function getCommonData() private function getCommonData()
{ {
return [ return [
@@ -964,21 +1011,34 @@ class SurveyorController extends Controller
'spekKategoriBangunan' => SpekKategoritBangunan::all(), 'spekKategoriBangunan' => SpekKategoritBangunan::all(),
'spekBangunan' => SpekBangunan::all(), 'spekBangunan' => SpekBangunan::all(),
'saranaPelengkap' => SaranaPelengkap::all(), 'saranaPelengkap' => SaranaPelengkap::all(),
'arahMataAngin' => ArahMataAngin::all() 'arahMataAngin' => ArahMataAngin::all(),
'lantai' => Lantai::all(),
'viewUnit' => ViewUnit::all(),
'golMasySekitar' => GolonganMasySekitar::all(),
'tingkatKeramaian' => TingkatKeramaian::all(),
'laluLintasLokasi' => LaluLintasLokasi::all(),
]; ];
} }
public function submitSurveyor(Request $request, $id) private const HEADERS = [
{ 'bentuk-tanah' => ['Bentuk Tanah', 'bentuk-tanah'],
$permohonan = Permohonan::find($id); 'kontur-tanah' => ['Kontur Tanah', 'kontur-tanah'],
$permohonan->update([ 'posisi-kavling' => ['Posisi Kavling', 'posisi-kavling'],
'status' => 'done', 'ketinggian-tanah' => ['Ketinggian Tanah', 'ketinggian-tanah'],
]); 'kondisi-fisik-tanah' => ['Kondisi Fisik Tanah', 'kondisi-fisik-tanah'],
return redirect() 'jenis-bangunan' => ['Jenis Bangunan', 'jenis-bangunan'],
->route('surveyor.index') 'kondisi-bangunan' => ['Kondisi Bangunan', 'kondisi-bangunan'],
->with('success', 'form surveyor submitted successfully'); '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'],
];
} }

View File

@@ -31,20 +31,25 @@ class TeamsController extends Controller
* Show the form for creating a new resource. * Show the form for creating a new resource.
*/ */
public function create() public function create()
{ {
// cek region apakah sudah ada di tabel teams $regionTeam = Teams::pluck('regions_id')->toArray();
$regionTeam = Teams::pluck('regions_id')->toArray();
$region = Regions::whereNotIn('id', $regionTeam)->get();
// cek user apakah sudah ada di tabel teams_users $regions = Regions::whereNotIn('id', $regionTeam)->get();
$userTeam = TeamsUsers::pluck('user_id')->toArray();
$user = User::whereNotIn('id', $userTeam)
->with('roles')
->get();
return view('lpj::teams.form', compact('region', 'user')); $userTeam = TeamsUsers::pluck('user_id')->toArray();
} $usersWithRole = User::whereNotIn('id', $userTeam)
->with('roles') // Eager load roles
->get();
$user = $usersWithRole->filter(function ($user) {
return $user->roles->contains(function ($role) {
return $role->name === 'surveyor' || $role->name === 'surveyor-penilai' || $role->name === 'senior-officer';
});
});
return view('lpj::teams.form', compact('regions', 'user'));
}
/** /**
* Store a newly created resource in storage. * Store a newly created resource in storage.
@@ -97,16 +102,23 @@ class TeamsController extends Controller
{ {
$teams = Teams::find($id); $teams = Teams::find($id);
$regions = Regions::all();
$region = Regions::all();
$usedUsers = TeamsUsers::where('teams_id', '!=', $id)->pluck('user_id')->toArray(); $usedUsers = TeamsUsers::where('teams_id', '!=', $id)->pluck('user_id')->toArray();
$user = User::whereNotIn('id', $usedUsers) $usersWithRole = User::whereNotIn('id', $usedUsers)
->with('roles') ->with('roles')
->get(); ->get();
$user = $usersWithRole->filter(function ($user) {
return $user->roles->contains(function ($role) {
return $role->name === 'surveyor' || $role->name === 'surveyor-penilai' || $role->name === 'senior-officer';
});
});
// Ambil user yang sudah ada di tim ini // Ambil user yang sudah ada di tim ini
$selectedUsers = $teams->teamsUsers->pluck('user_id')->toArray(); $selectedUsers = $teams->teamsUsers->pluck('user_id')->toArray();
return view('lpj::teams.form', compact('teams', 'region', 'user', 'selectedUsers')); return view('lpj::teams.form', compact('teams', 'regions', 'user', 'selectedUsers'));
} }
/** /**

View File

@@ -33,11 +33,16 @@ class PenilaianRequest extends FormRequest
'tanggal_kunjungan' => 'required|max:255', 'tanggal_kunjungan' => 'required|max:255',
'status' => 'required|string', 'status' => 'required|string',
'nomor_registrasi' => 'required|string', 'nomor_registrasi' => 'required|string',
'surveyor_id' => 'nullable|required_without:penilai_surveyor_id',
'penilaian_id' => 'nullable|required_without:penilai_surveyor_id', 'surveyor_id' => 'nullable|required_without_all:penilai_surveyor_id,surveyor_region_id,penilai_region_id,penilai_id',
'penilai_surveyor_id' => 'nullable|required_without_all:surveyor_id,penilaian_id', 'penilai_id' => 'nullable|required_without_all:penilai_surveyor_id,surveyor_region_id,penilai_region_id,surveyor_id',
'penilai_surveyor_id' => 'nullable',
'surveyor_region_id' => 'nullable|required_without_all:penilai_surveyor_id,penilai_region_id,penilai_id,surveyor_id',
'penilai_region_id' => 'nullable|required_without_all:penilai_surveyor_id,surveyor_region_id,penilai_id,surveyor_id',
'keterangan' => 'nullable', 'keterangan' => 'nullable',
]; ];
} }

View File

@@ -17,10 +17,10 @@
'nomor_registrasi' => 'nullable|string|max:10', 'nomor_registrasi' => 'nullable|string|max:10',
'tanggal_permohonan' => 'nullable|date', 'tanggal_permohonan' => 'nullable|date',
'user_id' => 'nullable|exists:users,id', 'user_id' => 'nullable|exists:users,id',
'branch_id' => 'required|exists:branches,id', 'branch_id' => 'nullable|exists:branches,id',
'tujuan_penilaian_id' => 'required|exists:tujuan_penilaian,id', 'tujuan_penilaian_id' => 'required|exists:tujuan_penilaian,id',
'debiture_id' => 'required|exists:debitures,id', 'debiture_id' => 'required|exists:debitures,id',
'status' => 'required|string', 'status' => 'nullable|string',
'jenis_fasilitas_kredit_id' => 'required|exists:jenis_fasilitas_kredit,id', 'jenis_fasilitas_kredit_id' => 'required|exists:jenis_fasilitas_kredit,id',
'nilai_plafond_id' => 'required|exists:nilai_plafond,id', 'nilai_plafond_id' => 'required|exists:nilai_plafond,id',
'status_bayar' => 'required|string', 'status_bayar' => 'required|string',
@@ -49,6 +49,7 @@
'tanggal_permohonan' => date('Y-m-d'), 'tanggal_permohonan' => date('Y-m-d'),
'user_id' => auth()->user()->id, 'user_id' => auth()->user()->id,
'branch_id' => auth()->user()->branch_id, 'branch_id' => auth()->user()->branch_id,
'status' => 'order'
]); ]);
} }
} }

View File

@@ -4,62 +4,138 @@ namespace Modules\Lpj\Http\Requests;
use Illuminate\Foundation\Http\FormRequest; use Illuminate\Foundation\Http\FormRequest;
use Illuminate\Validation\Rule;
class SurveyorRequest extends FormRequest class SurveyorRequest extends FormRequest
{ {
/** /**
* Get the validation rules that apply to the request. * Table mapping for different actionszz
*/ */
public function rules() private const TABLE_MAPPING = [
: array 'bentuk-tanah' => 'bentuk_tanah',
{ 'kontur-tanah' => 'kontur_tanah',
'posisi-kavling' => 'posisi_kavling',
$action = $this->input('action'); 'ketinggian-tanah' => 'ketinggian_tanah',
'kondisi-fisik-tanah' => 'kondisi_fisik_tanah',
$uniqueTable = [ 'kondisi-bangunan' => 'kondisi_bangunan',
'bentuk-tanah' => 'bentuk_tanah', 'jenis-bangunan' => 'jenis_bangunan',
'kontur-tanah' => 'kontur_tanah', 'sifat-bangunan' => 'sifat_bangunan',
'posisi-kavling' => 'posisi_kavling', 'sarana-pelengkap' => 'sarana_pelengkap',
'ketinggian-tanah' => 'ketinggian_tanah', 'lalu-lintas-lokasi' => 'lalu_lintas_lokasi',
'kondisi-fisik-tanah' => 'kondisi_fisik_tanah', 'tingkat-keramaian' => 'tingkat_keramaian',
'kondisi-bangunan' => 'kondisi_bangunan', 'gol-mas-sekitar' => 'gol_mas_sekitar',
'jenis-bangunan' => 'jenis_bangunan', 'spek-kategori-bangunan' => 'spek_kategori_bangunan',
'sifat-bangunan' => 'sifat_bangunan', 'spek-bangunan' => 'spek_bangunan',
'sarana-pelengkap' => 'sarana_pelengkap', 'lantai-unit' => 'lantai',
'lalu_lintas_lokasi' => 'lalu_lintas_lokasi', 'view-unit' => 'view_unit',
'tingkat-keramaian' => 'tingkat_keramaian', ];
];
$rules = [
'name' => 'required|max:255',
];
$id = $this->route('id');
if ($this->method() == 'PUT' || $this->method() == 'PATCH') {
$rules['code'] = 'required|max:50|unique:' . $uniqueTable[$action] . ',code,' . $id;
} else {
$rules['code'] = 'required|max:50|unique:' . $uniqueTable[$action] . ',code';
}
return $rules;
}
/** /**
* Determine if the user is authorized to make this request. * Determine if the user is authorized to make this request.
*/ */
public function authorize() public function authorize(): bool
: bool
{ {
return true; return true;
} }
protected function prepareForValidation() /**
* Get the validation rules that apply to the request.
*/
public function rules(): array
{
return array_merge(
$this->getBaseRules(),
$this->getActionSpecificRules(),
$this->getCodeValidationRules()
);
}
/**
* Get base validation rules
*/
private function getBaseRules(): array
{
return [
'name' => 'required|max:255',
];
}
/**
* Get action specific validation rules
*/
private function getActionSpecificRules(): array
{
$action = $this->input('action');
return match ($action) {
'spek-bangunan' => [
'spek_kategori_bangunan_id' => [
'required',
],
],
// Add more action specific rules here
default => [],
};
}
/**
* Get code validation rules
*/
private function getCodeValidationRules(): array
{
$action = $this->input('action');
$table = self::TABLE_MAPPING[$action] ?? null;
if (!$table) {
return [];
}
$rules = ['required', 'max:50'];
if ($this->isMethod('PUT') || $this->isMethod('PATCH')) {
$rules[] = Rule::unique($table, 'code')->ignore($this->route('id'));
} else {
$rules[] = Rule::unique($table, 'code');
}
return ['code' => $rules];
}
/**
* Prepare the data for validation.
*/
protected function prepareForValidation(): void
{ {
$this->merge([ $this->merge([
'status' => true, 'status' => true,
]); ]);
} }
/**
* Get custom messages for validator errors.
*/
public function messages(): array
{
return [
'name.required' => 'Nama harus diisi',
'name.max' => 'Nama tidak boleh lebih dari 255 karakter',
'code.required' => 'Kode harus diisi',
'code.max' => 'Kode tidak boleh lebih dari 50 karakter',
'code.unique' => 'Kode sudah digunakan',
'spek_kategori_bangunan_id.required' => 'Kategori bangunan harus dipilih',
];
}
/**
* Get custom attributes for validator errors.
*/
public function attributes(): array
{
return [
'name' => 'Nama',
'code' => 'Kode',
'spek_kategori_bangunan_id' => 'Kategori Bangunan',
];
}
} }

View File

@@ -10,10 +10,12 @@ class GolonganMasySekitar extends Model
{ {
use HasFactory; use HasFactory;
protected $table = 'gol_mas_sekitar';
/** /**
* The attributes that are mass assignable. * The attributes that are mass assignable.
*/ */
protected $fillable = []; protected $fillable = ['code', 'name', 'status'];
protected static function newFactory(): GolonganMasySekitarFactory protected static function newFactory(): GolonganMasySekitarFactory
{ {

View File

@@ -14,7 +14,7 @@ class KondisiBangunan extends Model
/** /**
* The attributes that are mass assignable. * The attributes that are mass assignable.
*/ */
protected $fillable = []; protected $fillable = ['code','name'];
protected static function newFactory(): KondisiBangunanFactory protected static function newFactory(): KondisiBangunanFactory
{ {

23
app/Models/Lantai.php Normal file
View File

@@ -0,0 +1,23 @@
<?php
namespace Modules\Lpj\Models;
use Illuminate\Database\Eloquent\Model;
use Illuminate\Database\Eloquent\Factories\HasFactory;
use Modules\Lpj\Database\Factories\LokasiUnitFactory;
class Lantai extends Model
{
use HasFactory;
protected $table = 'lantai';
/**
* The attributes that are mass assignable.
*/
protected $fillable = ['name', 'code', 'status', 'authorized_status', 'authorized_at', 'authorized_by', 'created_by', 'updated_by', 'deleted_by'];
protected static function newFactory(): LokasiUnitFactory
{
//return LokasiUnitFactory::new();
}
}

View File

@@ -32,9 +32,9 @@ class PenawaranTender extends Model
} }
// menambahkan relasi tujuan penilaian KJPP // menambahkan relasi tujuan penilaian KJPP
public function tujuanPenilaianKJPP() public function tujuanPenilaianKjpp()
{ {
return $this->hasMany(TujuanPenilaianKJPP::class, 'id', 'tujuan_penilaian_kjpp_id'); return $this->belongsTo(TujuanPenilaianKJPP::class, 'tujuan_penilaian_kjpp_id','id');
} }
public function permohonan() public function permohonan()
@@ -46,4 +46,6 @@ class PenawaranTender extends Model
{ {
return $this->belongsTo(JenisLaporan::class, 'jenis_laporan_id', 'id'); return $this->belongsTo(JenisLaporan::class, 'jenis_laporan_id', 'id');
} }
} }

View File

@@ -17,7 +17,7 @@ class Penilaian extends Model
*/ */
protected $table = 'penilaian'; protected $table = 'penilaian';
protected $fillable = [ protected $fillable = [
'jenis_penilaian_id', 'teams_id', 'tanggal_kunjungan', 'keterangan','nomor_registrasi','penilaian_id','surveyor_id','penilai_surveyor_id', 'jenis_penilaian_id', 'penilaian_id', 'tanggal_kunjungan', 'keterangan','nomor_registrasi',
'status', 'authorized_status', 'authorized_at', 'authorized_by', 'created_at', 'status', 'authorized_status', 'authorized_at', 'authorized_by', 'created_at',
'created_by', 'updated_at', 'updated_by', 'deleted_at', 'deleted_by' 'created_by', 'updated_at', 'updated_by', 'deleted_at', 'deleted_by'
]; ];
@@ -39,23 +39,12 @@ class Penilaian extends Model
public function userPenilai() public function userPenilai()
{ {
return $this->belongsTo(User::class, 'penilaian_id', 'id'); return $this->hasMany(PenilaianTeam::class, 'penilaian_id', 'id');
} }
public function userSurveyor()
{
return $this->belongsTo(User::class, 'surveyor_id', 'id');
}
public function userPenilaiSurveyor()
{
return $this->belongsTo(User::class, 'penilai_surveyor_id', 'id');
}
public function permohonan() public function permohonan()
{ {
return $this->belongsTo(Permohonan::class, 'nomor_registrasi', 'nomor_registrasi'); return $this->belongsTo(Permohonan::class, 'nomor_registrasi', 'nomor_registrasi');
} }
} }

View File

@@ -0,0 +1,39 @@
<?php
namespace Modules\Lpj\Models;
use Illuminate\Database\Eloquent\Model;
use Illuminate\Database\Eloquent\Factories\HasFactory;
use Modules\Lpj\Database\Factories\PenilaianTeamFactory;
class PenilaianTeam extends Model
{
use HasFactory;
protected $table = 'penilaian_team';
/**
* The attributes that are mass assignable.
*/
protected $fillable = ['penilaian_id', 'team_id', 'user_id','role'];
public function userPenilaiTeam()
{
return $this->belongsTo(User::class, 'user_id', 'id');
}
public function team(){
return $this->belongsTo(Team::class, 'team_id', 'id');
}
public function penilaian(){
return $this->hasMany(Penilaian::class, 'penilaian_id', 'id');
}
protected static function newFactory(): PenilaianTeamFactory
{
//return PenilaianTeamFactory::new();
}
}

View File

@@ -84,4 +84,13 @@ class Permohonan extends Base
{ {
return $this->hasMany(PenawaranTender::class, 'nomor_registrasi'); return $this->hasMany(PenawaranTender::class, 'nomor_registrasi');
} }
public function region()
{
return $this->belongsTo(Regions::class, 'region_id');
}
public function penawaran(){
return $this->belongsTo(PenawaranTender::class, 'nomor_registrasi', 'nomor_registrasi');
}
} }

View File

@@ -15,7 +15,7 @@ class SpekBangunan extends Model
/** /**
* The attributes that are mass assignable. * The attributes that are mass assignable.
*/ */
protected $fillable = []; protected $fillable = ['code','name','status','spek_kategori_bangunan_id','authorized_status'];

View File

@@ -14,7 +14,7 @@ class SpekKategoritBangunan extends Model
/** /**
* The attributes that are mass assignable. * The attributes that are mass assignable.
*/ */
protected $fillable = []; protected $fillable = ['code','name','status','authorized_status'];
public function bangunan() public function bangunan()

View File

@@ -30,8 +30,8 @@ class Teams extends Model
return $this->hasMany(TeamsUsers::class, 'teams_id', 'id'); return $this->hasMany(TeamsUsers::class, 'teams_id', 'id');
} }
public function penilaian(){ public function penilaianTeam(){
return $this->hasMany(Penilaian::class, 'teams_id', 'id'); return $this->hasMany(PenilaianTeam::class, 'team_id', 'id');
} }

View File

@@ -10,6 +10,7 @@ class TingkatKeramaian extends Model
{ {
use HasFactory; use HasFactory;
protected $table = 'tingkat_keramaian';
/** /**
* The attributes that are mass assignable. * The attributes that are mass assignable.
*/ */

23
app/Models/ViewUnit.php Normal file
View File

@@ -0,0 +1,23 @@
<?php
namespace Modules\Lpj\Models;
use Illuminate\Database\Eloquent\Model;
use Illuminate\Database\Eloquent\Factories\HasFactory;
use Modules\Lpj\Database\Factories\ViewUnitFactory;
class ViewUnit extends Model
{
use HasFactory;
protected $table = 'view_unit';
/**
* The attributes that are mass assignable.
*/
protected $fillable = ['name', 'status', 'authorized_status', 'authorized_at', 'authorized_by', 'code'];
protected static function newFactory(): ViewUnitFactory
{
//return ViewUnitFactory::new();
}
}

View File

@@ -17,6 +17,7 @@ return new class extends Migration
$table->unsignedBigInteger('permohonan_id'); $table->unsignedBigInteger('permohonan_id');
$table->foreign('permohonan_id')->references('id')->on('permohonan'); $table->foreign('permohonan_id')->references('id')->on('permohonan');
$table->string('luas'); $table->string('luas');
$table->unsignedBigInteger('jenis_jaminan_id');
$table->char('authorized_status', 1)->nullable(); $table->char('authorized_status', 1)->nullable();
$table->timestamp('authorized_at')->nullable(); $table->timestamp('authorized_at')->nullable();
$table->unsignedBigInteger('authorized_by')->nullable(); $table->unsignedBigInteger('authorized_by')->nullable();

View File

@@ -18,7 +18,7 @@ return new class () extends Migration {
$table->string('foto_denah'); $table->string('foto_denah');
$table->string('luas'); $table->string('luas');
$table->unsignedBigInteger('jenis_jaminan_id');
$table->char('authorized_status', 1)->nullable(); $table->char('authorized_status', 1)->nullable();
$table->timestamp('authorized_at')->nullable(); $table->timestamp('authorized_at')->nullable();
$table->unsignedBigInteger('authorized_by')->nullable(); $table->unsignedBigInteger('authorized_by')->nullable();

View File

@@ -16,7 +16,7 @@ return new class () extends Migration {
$table->foreign('permohonan_id')->references('id')->on('permohonan'); $table->foreign('permohonan_id')->references('id')->on('permohonan');
$table->string('pendamping'); $table->string('pendamping');
$table->unsignedBigInteger('jenis_jaminan_id');
$table->char('authorized_status', 1)->nullable(); $table->char('authorized_status', 1)->nullable();
$table->timestamp('authorized_at')->nullable(); $table->timestamp('authorized_at')->nullable();
$table->unsignedBigInteger('authorized_by')->nullable(); $table->unsignedBigInteger('authorized_by')->nullable();

View File

@@ -19,6 +19,7 @@ return new class () extends Migration {
$table->string('name'); $table->string('name');
$table->string('foto_objek'); $table->string('foto_objek');
$table->unsignedBigInteger('jenis_jaminan_id');
$table->char('authorized_status', 1)->nullable(); $table->char('authorized_status', 1)->nullable();
$table->timestamp('authorized_at')->nullable(); $table->timestamp('authorized_at')->nullable();
$table->unsignedBigInteger('authorized_by')->nullable(); $table->unsignedBigInteger('authorized_by')->nullable();

View File

@@ -0,0 +1,37 @@
<?php
use Illuminate\Database\Migrations\Migration;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Support\Facades\Schema;
return new class extends Migration
{
/**
* Run the migrations.
*/
public function up(): void
{
Schema::create('lantai', function (Blueprint $table) {
$table->id();
$table->string('code')->unique()->index();
$table->string('name');
$table->boolean('status')->default(true);
$table->char('authorized_status', 1)->nullable();
$table->timestamps();
$table->timestamp('authorized_at')->nullable();
$table->unsignedBigInteger('authorized_by')->nullable();
$table->softDeletes();
$table->unsignedBigInteger('created_by')->nullable();
$table->unsignedBigInteger('updated_by')->nullable();
$table->unsignedBigInteger('deleted_by')->nullable();
});
}
/**
* Reverse the migrations.
*/
public function down(): void
{
Schema::dropIfExists('lokasi_unit');
}
};

View File

@@ -0,0 +1,36 @@
<?php
use Illuminate\Database\Migrations\Migration;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Support\Facades\Schema;
return new class () extends Migration {
/**
* Run the migrations.
*/
public function up(): void
{
Schema::create('view_unit', function (Blueprint $table) {
$table->id();
$table->string('code')->unique()->index();
$table->string('name');
$table->boolean('status')->default(true);
$table->char('authorized_status', 1)->nullable();
$table->timestamps();
$table->timestamp('authorized_at')->nullable();
$table->unsignedBigInteger('authorized_by')->nullable();
$table->softDeletes();
$table->unsignedBigInteger('created_by')->nullable();
$table->unsignedBigInteger('updated_by')->nullable();
$table->unsignedBigInteger('deleted_by')->nullable();
});
}
/**
* Reverse the migrations.
*/
public function down(): void
{
Schema::dropIfExists('view_unit');
}
};

View File

@@ -0,0 +1,37 @@
<?php
use Illuminate\Database\Migrations\Migration;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Support\Facades\Schema;
return new class extends Migration
{
/**
* Run the migrations.
*/
public function up(): void
{
Schema::create('kategori_jenis_aset', function (Blueprint $table) {
$table->id();
$table->string('name');
$table->string('code');
$table->boolean('status')->default(true);
$table->char('authorized_status', 1)->nullable();
$table->timestamps();
$table->timestamp('authorized_at')->nullable();
$table->unsignedBigInteger('authorized_by')->nullable();
$table->softDeletes();
$table->unsignedBigInteger('created_by')->nullable();
$table->unsignedBigInteger('updated_by')->nullable();
$table->unsignedBigInteger('deleted_by')->nullable();
});
}
/**
* Reverse the migrations.
*/
public function down(): void
{
Schema::dropIfExists('kategori_jenis_aset');
}
};

View File

@@ -0,0 +1,38 @@
<?php
use Illuminate\Database\Migrations\Migration;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Support\Facades\Schema;
return new class extends Migration
{
/**
* Run the migrations.
*/
public function up(): void
{
Schema::table('penilaian', function (Blueprint $table) {
$table->dropColumn('teams_id');
$table->dropColumn('surveyor_id');
$table->dropColumn('penilaian_id');
$table->dropColumn('penilai_surveyor_id');
});
}
/**
* Reverse the migrations.
*/
public function down(): void
{
Schema::table('penilaian', function (Blueprint $table) {
$table->foreignIdFor(Teams::class);
$table->foreignIdFor(User::class);
});
}
};

View File

@@ -0,0 +1,38 @@
<?php
use Illuminate\Database\Migrations\Migration;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Support\Facades\Schema;
return new class () extends Migration {
/**
* Run the migrations.
*/
public function up(): void
{
Schema::create('penilaian_team', function (Blueprint $table) {
$table->id();
$table->unsignedBigInteger('penilaian_id');
$table->unsignedBigInteger('team_id');
$table->unsignedBigInteger('user_id');
$table->string('role');
$table->boolean('status')->default(true);
$table->char('authorized_status', 1)->nullable();
$table->timestamps();
$table->timestamp('authorized_at')->nullable();
$table->unsignedBigInteger('authorized_by')->nullable();
$table->softDeletes();
$table->unsignedBigInteger('created_by')->nullable();
$table->unsignedBigInteger('updated_by')->nullable();
$table->unsignedBigInteger('deleted_by')->nullable();
});
}
/**
* Reverse the migrations.
*/
public function down(): void
{
Schema::dropIfExists('penilai_team');
}
};

View File

@@ -0,0 +1,38 @@
<?php
use Illuminate\Database\Migrations\Migration;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Support\Facades\Schema;
return new class extends Migration
{
/**
* Run the migrations.
*/
public function up(): void
{
Schema::create('kategori_form_analisa_inspeksi', function (Blueprint $table) {
$table->id();
$table->string('name');
$table->string('code');
$table->foreign('kategori_jenis_aset_id')->references('id')->on('kategori_jenis_aset');
$table->boolean('status')->default(true);
$table->char('authorized_status', 1)->nullable();
$table->timestamps();
$table->timestamp('authorized_at')->nullable();
$table->unsignedBigInteger('authorized_by')->nullable();
$table->softDeletes();
$table->unsignedBigInteger('created_by')->nullable();
$table->unsignedBigInteger('updated_by')->nullable();
$table->unsignedBigInteger('deleted_by')->nullable();
});
}
/**
* Reverse the migrations.
*/
public function down(): void
{
Schema::dropIfExists('kategori_form_analisa_inspeksi');
}
};

View File

@@ -0,0 +1,28 @@
<?php
use Illuminate\Database\Migrations\Migration;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Support\Facades\Schema;
return new class extends Migration
{
/**
* Run the migrations.
*/
public function up(): void
{
Schema::create('label_name_inspeksi', function (Blueprint $table) {
$table->id();
$table->timestamps();
});
}
/**
* Reverse the migrations.
*/
public function down(): void
{
Schema::dropIfExists('label_name_inspeksi');
}
};

View File

@@ -89,6 +89,15 @@
} }
] ]
}, },
{
"title": "SPK",
"path": "spk",
"icon": "ki-filled ki-file-added text-lg",
"classes": "",
"attributes": [],
"permission": "",
"roles": ["administrator", "admin"]
},
{ {
"title": "Registrasi Final", "title": "Registrasi Final",
"path": "registrasifinal", "path": "registrasifinal",
@@ -141,7 +150,7 @@
"classes": "", "classes": "",
"attributes": [], "attributes": [],
"permission": "", "permission": "",
"roles": ["senior-officer"] "roles": ["administrator","senior-officer"]
}, },
{ {
"title": "Otorisator", "title": "Otorisator",
@@ -150,7 +159,7 @@
"classes": "", "classes": "",
"attributes": [], "attributes": [],
"permission": "", "permission": "",
"roles": ["senior-officer"], "roles": ["administrator","senior-officer"],
"sub": [ "sub": [
{ {
"title": "Pelaporan", "title": "Pelaporan",
@@ -158,7 +167,7 @@
"classes": "", "classes": "",
"attributes": [], "attributes": [],
"permission": "", "permission": "",
"roles": ["senior-officer"] "roles": ["administrator","senior-officer"]
}, },
{ {
"title": "Pembayaran", "title": "Pembayaran",
@@ -166,7 +175,7 @@
"classes": "", "classes": "",
"attributes": [], "attributes": [],
"permission": "", "permission": "",
"roles": ["senior-officer"] "roles": ["administrator","senior-officer"]
}, },
{ {
"title": "Pembatalan", "title": "Pembatalan",
@@ -174,7 +183,7 @@
"classes": "", "classes": "",
"attributes": [], "attributes": [],
"permission": "", "permission": "",
"roles": ["senior-officer"] "roles": ["administrator","senior-officer"]
}, },
{ {
"title": "SLA", "title": "SLA",
@@ -182,7 +191,7 @@
"classes": "", "classes": "",
"attributes": [], "attributes": [],
"permission": "", "permission": "",
"roles": ["senior-officer"] "roles": ["administrator","senior-officer"]
} }
] ]
}, },
@@ -193,7 +202,7 @@
"classes": "", "classes": "",
"attributes": [], "attributes": [],
"permission": "", "permission": "",
"roles": ["surveyor"] "roles": ["administrator","surveyor"]
}, },
{ {
@@ -218,7 +227,7 @@
"classes": "", "classes": "",
"attributes": [], "attributes": [],
"permission": "", "permission": "",
"roles": ["surveyor"] "roles": ["administrator","surveyor"]
}, },
{ {
"title": "Laporan", "title": "Laporan",
@@ -430,12 +439,12 @@
"roles": ["administrator", "admin"] "roles": ["administrator", "admin"]
}, },
{ {
"title": "Bentuk Tanah", "title": "Bentuk",
"path": "basicdata.bentuk-tanah", "path": "basicdata.bentuk-tanah",
"classes": "", "classes": "",
"attributes": [], "attributes": [],
"permission": "", "permission": "",
"roles": ["surveyor"] "roles": ["administrator","surveyor"]
}, },
{ {
"title": "Kontur Tanah", "title": "Kontur Tanah",
@@ -443,7 +452,7 @@
"classes": "", "classes": "",
"attributes": [], "attributes": [],
"permission": "", "permission": "",
"roles": ["surveyor"] "roles": ["administrator","surveyor"]
}, },
{ {
"title": "Posisi Kavling", "title": "Posisi Kavling",
@@ -451,7 +460,7 @@
"classes": "", "classes": "",
"attributes": [], "attributes": [],
"permission": "", "permission": "",
"roles": ["surveyor"] "roles": ["administrator","surveyor"]
}, },
{ {
"title": "Ketinggian Tanah", "title": "Ketinggian Tanah",
@@ -459,7 +468,7 @@
"classes": "", "classes": "",
"attributes": [], "attributes": [],
"permission": "", "permission": "",
"roles": ["surveyor"] "roles": ["administrator","surveyor"]
}, },
{ {
"title": "Kondisi Fisik Tanah", "title": "Kondisi Fisik Tanah",
@@ -467,7 +476,7 @@
"classes": "", "classes": "",
"attributes": [], "attributes": [],
"permission": "", "permission": "",
"roles": ["surveyor"] "roles": ["administrator","surveyor"]
}, },
{ {
"title": "Jenis Bangunan", "title": "Jenis Bangunan",
@@ -475,7 +484,7 @@
"classes": "", "classes": "",
"attributes": [], "attributes": [],
"permission": "", "permission": "",
"roles": ["surveyor"] "roles": ["administrator","surveyor"]
}, },
{ {
"title": "Kondisi Bangunan", "title": "Kondisi Bangunan",
@@ -483,7 +492,7 @@
"classes": "", "classes": "",
"attributes": [], "attributes": [],
"permission": "", "permission": "",
"roles": ["surveyor"] "roles": ["administrator","surveyor"]
}, },
{ {
"title": "Sifat Bangunan", "title": "Sifat Bangunan",
@@ -491,7 +500,7 @@
"classes": "", "classes": "",
"attributes": [], "attributes": [],
"permission": "", "permission": "",
"roles": ["surveyor"] "roles": ["administrator","surveyor"]
}, },
{ {
@@ -500,8 +509,67 @@
"classes": "", "classes": "",
"attributes": [], "attributes": [],
"permission": "", "permission": "",
"roles": ["surveyor"] "roles": ["administrator","surveyor"]
} },
{
"title": "Lalu Lintas Sekitar",
"path": "basicdata.lalu-lintas-lokasi",
"classes": "",
"attributes": [],
"permission": "",
"roles": ["administrator","surveyor"]
},
{
"title": "Tingkat Keramaian",
"path": "basicdata.tingkat-keramaian",
"classes": "",
"attributes": [],
"permission": "",
"roles": ["administrator","surveyor"]
},
{
"title": "Masyarakat Sekitar",
"path": "basicdata.gol-mas-sekitar",
"classes": "",
"attributes": [],
"permission": "",
"roles": ["administrator","surveyor"]
},
{
"title": "Lantai Unit",
"path": "basicdata.lantai-unit",
"classes": "",
"attributes": [],
"permission": "",
"roles": ["administrator","surveyor"]
},
{
"title": "View unit",
"path": "basicdata.view-unit",
"classes": "",
"attributes": [],
"permission": "",
"roles": ["administrator","surveyor"]
},
{
"title": "Spesifikasi Bangunan",
"path": "basicdata.spek-bangunan",
"classes": "",
"attributes": [],
"permission": "",
"roles": ["administrator","surveyor"]
},
{
"title": "Kategori Speksikasi Bangunan",
"path": "basicdata.spek-kategori-bangunan",
"classes": "",
"attributes": [],
"permission": "",
"roles": ["administrator","surveyor"]
}
] ]
} }
], ],

View File

@@ -46,14 +46,14 @@
@php @php
$sortedTeamsActivity = $teamsActivity->sortBy(function ($item) { $sortedTeamsActivity = $teamsActivity->sortBy(function ($item) {
return $item->team->penilaian
->filter(function ($penilaian) use ($item) { return $item->team->penilaianTeam
return $penilaian->penilaian_id == $item->user->id || ->filter(function ($penilaianTeam) use ($item) {
$penilaian->surveyor_id == $item->user->id || return $penilaianTeam->user_id == $item->user->id;
$penilaian->penilai_surveyor_id == $item->user->id;
}) })
->count(); ->count();
}); });
@endphp @endphp
@foreach ($sortedTeamsActivity as $index => $item) @foreach ($sortedTeamsActivity as $index => $item)
@@ -70,11 +70,9 @@
<th class="min-w-[150px]"> <th class="min-w-[150px]">
<span class="text-base text-gray-900 font-normal"> <span class="text-base text-gray-900 font-normal">
@php @php
$totalTasks = $item->team->penilaian $totalTasks = $item->team->penilaianTeam
->filter(function ($penilaian) use ($item) { ->filter(function ($penilaianTeam) use ($item) {
return $penilaian->penilaian_id == $item->user->id || return $penilaianTeam->user_id == $item->user->id;
$penilaian->surveyor_id == $item->user->id ||
$penilaian->penilai_surveyor_id == $item->user->id;
}) })
->count(); ->count();
@endphp @endphp
@@ -156,8 +154,6 @@
const apiUrl = accordion.querySelector('.card-grid').getAttribute( const apiUrl = accordion.querySelector('.card-grid').getAttribute(
'data-api-url'); 'data-api-url');
console.log("This is the API URL: " + apiUrl);
const dataTableOptions = { const dataTableOptions = {
apiEndpoint: apiUrl, apiEndpoint: apiUrl,
pageSize: 5, pageSize: 5,
@@ -180,7 +176,7 @@
}, },
jenis_asset: { jenis_asset: {
title: 'Jenis Asset', title: 'Jenis Asset',
render: (item, data) => `${data.jenis_asset || ''}`, render: (item, data) => `${data.permohonan.debiture.documents.map(d => d.jenis_jaminan.name) || ''}`,
}, },
jenis_report: { jenis_report: {
title: 'Jenis Report', title: 'Jenis Report',

View File

@@ -69,16 +69,28 @@
</td> </td>
</tr> </tr>
<tr> <tr>
<td class="py-3 max-w-[100px]"> <td class="py-3 max-w-[100px] align-top" >
Dokumen Jaminan Dokumen Jaminan
</td> </td>
<td class="py-3 text-gray-700 text-2sm font-normal"> <td class="py-3 text-gray-700 text-2sm font-normal">
@if(isset($detail->dokumen_jaminan)) @if(isset($detail->dokumen_jaminan))
@if(in_array(Auth::user()->roles[0]->name,['administrator','pemohon-eo'])) @php
<a href="{{ route('debitur.jaminan.download',['id'=>$permohonan->debiture->id,'dokumen'=>$detail->id]) }}" class="badge badge-sm badge-outline mt-2 badge-info"><i class="ki-filled ki-cloud-download mr-2"></i> Download</a> $dokumen_jaminan = is_array(json_decode($detail->dokumen_jaminan)) ? json_decode($detail->dokumen_jaminan) : [$detail->dokumen_jaminan];
) @endif @endphp
<span class="badge badge-sm badge-outline badge-warning mt-2" onclick="viewPDF('{{ Storage::url($detail->dokumen_jaminan) }}')"><i class="ki-filled ki-eye mr-2"></i>Preview</span> @foreach($dokumen_jaminan as $index => $dokumen)
@if(in_array(Auth::user()->roles[0]->name,['administrator','pemohon-eo']))
<a href="{{ route('debitur.jaminan.download', ['id' => $permohonan->debiture->id, 'dokumen' => $detail->id, 'index' => $index]) }}"
class="badge badge-sm badge-outline mt-2 mr-2">
{{ basename($dokumen) }}
<i class="ki-filled ki-cloud-download"></i>
</a>
@endif
<span class="badge badge-sm badge-outline badge-warning mt-2" onclick="viewPDF('{{ Storage::url($dokumen_jaminan[$index]) }}')"><i class="ki-filled ki-eye mr-2"></i>Preview</span>
<br>
@endforeach
@endif @endif
</td> </td>
</tr> </tr>
<tr> <tr>

View File

@@ -132,41 +132,57 @@
@enderror @enderror
</div> </div>
</div> </div>
<div id="doctainer" class="grid gap-5">
@if(isset($document->id)) @if(isset($document->id))
@foreach($document->detail as $detail) @php $n = 0; @endphp
<input type="hidden" name="detail_dokumen_jaminan_id[]" value="{{ $detail->id }}"> @foreach($document->detail as $detail)
<div class="flex items-baseline flex-wrap lg:flex-nowrap gap-2.5"> <input type="hidden" name="detail_dokumen_jaminan_id[]" value="{{ $detail->id }}">
<label class="form-label max-w-56 font-bold"> <div class="flex items-baseline flex-wrap lg:flex-nowrap gap-2.5">
{{ $loop->index + 1 }}. {{ $detail->jenisLegalitasJaminan->name }} <label class="form-label max-w-56 font-bold">
</label> {{ $n + 1 }}. {{ $detail->jenisLegalitasJaminan->name }}
<input type="hidden" name="jenis_legalitas_jaminan_id[]" value=" {{ $detail->jenis_legalitas_jaminan_id }}"> </label>
</div> <input type="hidden" name="jenis_legalitas_jaminan_id[]" value=" {{ $detail->jenis_legalitas_jaminan_id }}">
<div class="flex items-baseline flex-wrap lg:flex-nowrap gap-2.5">
<label class="form-label max-w-56">
Nama Dokumen
</label>
<div class="flex flex-wrap items-baseline w-full">
<input class="input " type="text" id="name" name="name[]" value="{{ $detail->name ?? "" }}" placeholder="Nama Dokumen">
</div> </div>
</div>
<div class="flex items-baseline flex-wrap lg:flex-nowrap gap-2.5"> <div class="flex items-baseline flex-wrap lg:flex-nowrap gap-2.5">
<label class="form-label max-w-56"> <label class="form-label max-w-56">
Dokumen Jaminan Nama Dokumen
</label> </label>
<div class="flex flex-wrap items-baseline w-full"> <div class="flex flex-wrap items-baseline w-full">
<input class="file-input" type="file" name="dokumen_jaminan[]" value=""> <input class="input " type="text" id="name" name="name[]" value="{{ $detail->name ?? "" }}" placeholder="Nama Dokumen">
@if(isset($detail->dokumen_jaminan)) </div>
<a href="{{ route('debitur.jaminan.download',['id'=>$debitur->id,'dokumen'=>$detail->id]) }}" class="badge badge-sm badge-outline mt-2">{{ basename($detail->dokumen_jaminan) }}
<i class="ki-filled ki-cloud-download"></i></a>
@endif
</div> </div>
</div>
@if($detail->details) <div class="flex items-baseline flex-wrap lg:flex-nowrap gap-2.5">
@php $custom_field = json_decode($detail->details,true) @endphp <label class="form-label max-w-56">
Dokumen Jaminan
</label>
<div class="flex flex-wrap items-baseline w-full">
<div class="flex flex-col w-full gap-2" id="file-container-{{$n}}">
<div class="flex items-center gap-2">
<input class="file-input" type="file" name="dokumen_jaminan[{{ $n }}][]" multiple>
<button type="button" class="btn btn-primary w-[100px] text-center" onclick="addFileInput({{ $n }})">Add More</button>
</div>
<div id="additional-files-{{ $n }}"></div>
</div>
@if(isset($detail->dokumen_jaminan))
@php
$dokumen_jaminan = is_array(json_decode($detail->dokumen_jaminan)) ? json_decode($detail->dokumen_jaminan) : [$detail->dokumen_jaminan];
@endphp
@foreach($dokumen_jaminan as $index => $dokumen)
<a href="{{ route('debitur.jaminan.download', ['id' => $debitur->id, 'dokumen' => $detail->id, 'index' => $index]) }}"
class="badge badge-sm badge-outline mt-2 mr-2">
{{ basename($dokumen) }}
<i class="ki-filled ki-cloud-download"></i>
</a>
@endforeach
@endif
</div>
</div>
@if($detail->details)
@php $custom_field = json_decode($detail->details,true) @endphp
<div class="flex items-baseline flex-wrap lg:flex-nowrap gap-2.5"> <div class="flex items-baseline flex-wrap lg:flex-nowrap gap-2.5">
<label class="form-label max-w-56 capitalize"> <label class="form-label max-w-56 capitalize">
{{ str_replace('_',' ',$detail->jenisLegalitasJaminan->custom_field) }} {{ str_replace('_',' ',$detail->jenisLegalitasJaminan->custom_field) }}
@@ -175,21 +191,103 @@
<input class="input" type="text" name="custom_field[][$detail->jenisLegalitasJaminan->custom_field]" value="{{ $custom_field[$detail->jenisLegalitasJaminan->custom_field] }}"> <input class="input" type="text" name="custom_field[][$detail->jenisLegalitasJaminan->custom_field]" value="{{ $custom_field[$detail->jenisLegalitasJaminan->custom_field] }}">
</div> </div>
</div> </div>
@endif @else
@if($detail->jenisLegalitasJaminan->custom_field)
<div class="flex items-baseline flex-wrap lg:flex-nowrap gap-2.5">
<label class="form-label max-w-56 capitalize">
{{ str_replace('_',' ',$detail->jenisLegalitasJaminan->custom_field) }}
</label>
<div class="flex flex-wrap items-baseline w-full">
@if($detail->jenisLegalitasJaminan->custom_field_type === "text")
<input class="input" type="text" name="custom_field[][{{$detail->jenisLegalitasJaminan->custom_field}}]" placeholder="... M2">
@elseif($detail->jenisLegalitasJaminan->custom_field_type === "number")
<input class="input" type="number" name="custom_field[][{{$detail->jenisLegalitasJaminan->custom_field}}]" placeholder="... M2">
@elseif($detail->jenisLegalitasJaminan->custom_field_type === "date")
<input class="input" type="date" name="custom_field[][{{$detail->jenisLegalitasJaminan->custom_field}}]" placeholder="... M2">
@elseif($detail->jenisLegalitasJaminan->custom_field_type === "textarea")
<textarea class="textarea" rows="3" name="custom_field[][{{$detail->jenisLegalitasJaminan->custom_field}}]" placeholder="... M2"></textarea>
@else
<input class="input" type="text" name="custom_field[][{{$detail->jenisLegalitasJaminan->custom_field}}]" placeholder="... M2">
@endif
</div>
</div>
@endif
@endif
<div class="flex items-baseline flex-wrap lg:flex-nowrap gap-2.5"> <div class="flex items-baseline flex-wrap lg:flex-nowrap gap-2.5">
<label class="form-label max-w-56"> <label class="form-label max-w-56">
Keterangan Keterangan
</label> </label>
<div class="flex flex-wrap items-baseline w-full"> <div class="flex flex-wrap items-baseline w-full">
<textarea class="textarea" rows="3" type="number" name="keterangan[]">{{ $detail->keterangan ?? "" }}</textarea> <textarea class="textarea" rows="3" type="number" name="keterangan[]">{{ $detail->keterangan ?? "" }}</textarea>
</div>
</div>
@php $n++; @endphp
@endforeach
@foreach($legalitas as $item)
<div class="flex items-baseline flex-wrap lg:flex-nowrap gap-2.5">
<label class="form-label max-w-56 font-bold">
{{ $n + 1 }}. {{ $item->name }}
</label>
<input type="hidden" name="jenis_legalitas_jaminan_id[]" value=" {{ $item->id }}">
</div> </div>
</div>
@endforeach
@else
<div id="doctainer" class="grid gap-5">
</div> <div class="flex items-baseline flex-wrap lg:flex-nowrap gap-2.5">
<label class="form-label max-w-56">
Nama Dokumen
</label>
<div class="flex flex-wrap items-baseline w-full">
<input class="input " type="text" id="name" name="name[]" value="" placeholder="Nama Dokumen">
</div>
</div>
<div class="flex items-baseline flex-wrap lg:flex-nowrap gap-2.5">
<label class="form-label max-w-56">
Dokumen Jaminan
</label>
<div class="flex flex-wrap items-baseline w-full">
<div class="flex flex-col w-full gap-2" id="file-container-{{$n}}">
<div class="flex items-center gap-2">
<input class="file-input" type="file" name="dokumen_jaminan[{{ $n }}][]" multiple>
<button type="button" class="btn btn-primary w-[100px] text-center" onclick="addFileInput({{ $n }})">Add More</button>
</div>
<div id="additional-files-{{ $n }}"></div>
</div>
</div>
</div>
@if($item->custom_field)
<div class="flex items-baseline flex-wrap lg:flex-nowrap gap-2.5">
<label class="form-label max-w-56 capitalize">
{{ str_replace('_',' ',$item->custom_field) }}
</label>
<div class="flex flex-wrap items-baseline w-full">
@if($item->custom_field_type === "text")
<input class="input" type="text" name="custom_field[][{{$item->custom_field}}]" placeholder="... M2">
@elseif($item->custom_field_type === "number")
<input class="input" type="number" name="custom_field[][{{$item->custom_field}}]" placeholder="... M2">
@elseif($item->custom_field_type === "date")
<input class="input" type="date" name="custom_field[][{{$item->custom_field}}]" placeholder="... M2">
@elseif($item->custom_field_type === "textarea")
<textarea class="textarea" rows="3" name="custom_field[][{{$item->custom_field}}]" placeholder="... M2"></textarea>
@else
<input class="input" type="text" name="custom_field[][{{$item->custom_field}}]" placeholder="... M2">
@endif
</div>
</div>
@endif
<div class="flex items-baseline flex-wrap lg:flex-nowrap gap-2.5">
<label class="form-label max-w-56">
Keterangan
</label>
<div class="flex flex-wrap items-baseline w-full">
<textarea class="textarea" rows="3" type="number" name="keterangan[]"></textarea>
</div>
</div>
@php $n++; @endphp
@endforeach
</div>
@endif @endif
<div class="flex items-baseline flex-wrap lg:flex-nowrap gap-2.5"> <div class="flex items-baseline flex-wrap lg:flex-nowrap gap-2.5">
@@ -311,13 +409,13 @@
@push('scripts') @push('scripts')
{{--Pemilik Jaminan--}} {{--Pemilik Jaminan--}}
<script> <script>
document.addEventListener("DOMContentLoaded", function() { document.addEventListener("DOMContentLoaded", function () {
const namaSertifikatDiv = document.getElementById("nama_sertifikat"); const namaSertifikatDiv = document.getElementById("nama_sertifikat");
// Function to add delete event listeners to existing buttons // Function to add delete event listeners to existing buttons
function addDeleteListeners() { function addDeleteListeners() {
document.querySelectorAll(".delete-button").forEach(button => { document.querySelectorAll(".delete-button").forEach(button => {
button.addEventListener("click", function() { button.addEventListener("click", function () {
this.closest(".flex.items-baseline.flex-wrap.lg\\:flex-nowrap.gap-2\\.5.mb-5").remove(); this.closest(".flex.items-baseline.flex-wrap.lg\\:flex-nowrap.gap-2\\.5.mb-5").remove();
}); });
}); });
@@ -326,7 +424,7 @@
// Add delete listeners to existing buttons // Add delete listeners to existing buttons
addDeleteListeners(); addDeleteListeners();
document.getElementById("tambah_sertifikat").addEventListener("click", function() { document.getElementById("tambah_sertifikat").addEventListener("click", function () {
const newDiv = document.createElement("div"); const newDiv = document.createElement("div");
newDiv.className = "flex items-baseline flex-wrap lg:flex-nowrap gap-2.5 mb-5"; newDiv.className = "flex items-baseline flex-wrap lg:flex-nowrap gap-2.5 mb-5";
newDiv.innerHTML = ` newDiv.innerHTML = `
@@ -367,11 +465,14 @@
<script> <script>
function getLegalitasJaminan() { function getLegalitasJaminan() {
var legalitasJaminan = document.getElementById("jenis_jaminan_id").value; var legalitasJaminan = document.getElementById("jenis_jaminan_id").value;
var url = "/basic-data/jenis-jaminan/legalitas/" + legalitasJaminan; var documentId = "{{ $document->id ?? "0" }}";
var debiturId = "{{ $debitur->id }}";
var url = `/basic-data/jenis-jaminan/legalitas/${documentId}/${legalitasJaminan}`;
fetch(url, { fetch(url, {
method: "GET", method: "GET",
headers: { headers: {
"Content-Type": "application/json" "Content-Type": "application/json",
"X-Requested-With": "XMLHttpRequest"
} }
}) })
.then(response => { .then(response => {
@@ -385,66 +486,128 @@
doctainer.innerHTML = ""; doctainer.innerHTML = "";
data.forEach((item, index) => { data.forEach((item, index) => {
doctainer.innerHTML += ` doctainer.innerHTML += `
<div class="flex items-baseline flex-wrap lg:flex-nowrap gap-2.5"> <div class="flex items-baseline flex-wrap lg:flex-nowrap gap-2.5">
<label class="form-label max-w-56 font-bold"> <label class="form-label max-w-56 font-bold">
${index + 1}. ${item.name} ${index + 1}. ${item.name}
</label> </label>
<input type="hidden" name="jenis_legalitas_jaminan_id[]" value="${item.id}"> <input type="hidden" name="jenis_legalitas_jaminan_id[]" value="${item.jenis_legalitas_jaminan_id}">
</div> ${item.is_existing ? `<input type="hidden" name="detail_dokumen_jaminan_id[]" value="${item.id}">` : ''}
<div class="flex items-baseline flex-wrap lg:flex-nowrap gap-2.5">
<label class="form-label max-w-56">
Nama Dokumen
</label>
<div class="flex flex-wrap items-baseline w-full">
<input class="input " type="text" id="name" name="name[]" value="" placeholder="Nama Dokumen">
</div> </div>
</div>
<div class="flex items-baseline flex-wrap lg:flex-nowrap gap-2.5"> <div class="flex items-baseline flex-wrap lg:flex-nowrap gap-2.5">
<label class="form-label max-w-56"> <label class="form-label max-w-56">
Dokumen Jaminan Nama Dokumen
</label> </label>
<div class="flex flex-wrap items-baseline w-full"> <div class="flex flex-wrap items-baseline w-full">
<input class="file-input" type="file" name="dokumen_jaminan[]" value=""> <input class="input" type="text" name="name[]" value="${item.name || ''}" placeholder="Nama Dokumen">
</div>
</div> </div>
</div>
${item.custom_field && item.custom_field.length > 0 ? ` <div class="flex items-baseline flex-wrap lg:flex-nowrap gap-2.5">
<div class="flex items-baseline flex-wrap lg:flex-nowrap gap-2.5"> <label class="form-label max-w-56">
<label class="form-label max-w-56 capitalize"> Dokumen Jaminan
${item.custom_field.replace(/_/g, " ")} </label>
</label> <div class="flex flex-wrap items-baseline w-full" id="file-container-${index}">
<div class="flex flex-wrap items-baseline w-full"> ${item.dokumen_jaminan ? renderExistingFiles(item.dokumen_jaminan, debiturId, item.id) : ''}
${item.custom_field_type === "text" ? ` <div class="flex items-center gap-2 my-2 w-full">
<input class="input" type="text" name="custom_field[][${item.custom_field}]"> <input class="file-input" type="file" name="dokumen_jaminan[${index}][]" multiple>
` : item.custom_field_type === "number" ? ` <button type="button" class="btn btn-primary w-[100px] text-center" onclick="addFileInput(${index})">Add File</button>
<input class="input" type="number" name="custom_field[][${item.custom_field}]"> </div>
` : item.custom_field_type === "date" ? ` </div>
<input class="input" type="date" name="custom_field[][${item.custom_field}]">
` : item.custom_field_type === "textarea" ? `
<textarea class="textarea" rows="3" name="custom_field[][${item.custom_field}]"></textarea>
` : `
<input class="input" type="text" name="custom_field[][${item.custom_field}]">
`}
</div> </div>
</div>
` : ""}
<div class="flex items-baseline flex-wrap lg:flex-nowrap gap-2.5"> ${item.custom_field ? `
<label class="form-label max-w-56"> <div class="flex items-baseline flex-wrap lg:flex-nowrap gap-2.5">
Keterangan <label class="form-label max-w-56 capitalize">
</label> ${item.custom_field.replace(/_/g, " ")}
<div class="flex flex-wrap items-baseline w-full"> </label>
<textarea class="textarea" rows="3" type="number" name="keterangan[]"></textarea> <div class="flex flex-wrap items-baseline w-full">
${getCustomFieldInput(item.custom_field_type, item.custom_field, item.details)}
</div>
</div> </div>
</div>`; ` : ''}
<div class="flex items-baseline flex-wrap lg:flex-nowrap gap-2.5">
<label class="form-label max-w-56">
Keterangan
</label>
<div class="flex flex-wrap items-baseline w-full">
<textarea class="textarea" rows="3" name="keterangan[]">${item.keterangan || ''}</textarea>
</div>
</div>
`;
}); });
}) })
.catch(error => { .catch(error => console.error('Error:', error));
console.error("Error:", error); }
// Handle the error here
}); function renderExistingFiles(dokumenJaminan, debiturId, itemId) {
if (typeof dokumenJaminan === 'string') {
return `
<a href="/debitur/${debiturId}/jaminan/download?dokumen=${itemId}" class="badge badge-sm badge-outline mt-2 mr-2">
${dokumenJaminan.split('/').pop()}
<i class="ki-filled ki-cloud-download"></i>
</a>
`;
} else if (Array.isArray(dokumenJaminan)) {
return dokumenJaminan.map(file => `
<a href="/debitur/${debiturId}/jaminan/download?dokumen=${itemId}&file=${encodeURIComponent(file)}" class="badge badge-sm badge-outline mt-2 mr-2">
${file.split('/').pop()}
<i class="ki-filled ki-cloud-download"></i>
</a>
`).join('');
}
return '';
}
function addFileInput(index) {
const container = document.getElementById(`file-container-${index}`);
const newInput = document.createElement('div');
newInput.className = 'flex items-center gap-2 mb-2 w-full';
newInput.innerHTML = `
<input class="file-input" type="file" name="dokumen_jaminan[${index}][]" multiple>
<button type="button" class="btn btn-danger w-[100px] text-center" onclick="removeFileInput(this)">Remove</button>
`;
container.appendChild(newInput);
}
function removeFileInput(button) {
button.closest('.flex.items-center.gap-2.mb-2').remove();
}
function renderExistingFiles(dokumenJaminan, debiturId, itemId) {
if (typeof dokumenJaminan === 'string') {
return `
<a href="/debitur/${debiturId}/jaminan/download?dokumen=${itemId}" class="badge badge-sm badge-outline mt-2">
${dokumenJaminan.split('/').pop()}
<i class="ki-filled ki-cloud-download"></i>
</a>
`;
} else if (Array.isArray(dokumenJaminan)) {
return dokumenJaminan.map(file => `
<a href="/debitur/${debiturId}/jaminan/download?dokumen=${itemId}&file=${file}" class="badge badge-sm badge-outline mt-2 mr-2">
${file.split('/').pop()}
<i class="ki-filled ki-cloud-download"></i>
</a>
`).join('');
}
return '';
}
function getCustomFieldInput(type, fieldName, value) {
value = value ? JSON.parse(value)[fieldName] || '' : '';
switch (type) {
case "text":
return `<input class="input" type="text" name="custom_field[][${fieldName}]" value="${value}">`;
case "number":
return `<input class="input" type="number" name="custom_field[][${fieldName}]" value="${value}">`;
case "date":
return `<input class="input" type="date" name="custom_field[][${fieldName}]" value="${value}">`;
case "textarea":
return `<textarea class="textarea" rows="3" name="custom_field[][${fieldName}]">${value}</textarea>`;
default:
return `<input class="input" type="text" name="custom_field[][${fieldName}]" value="${value}">`;
}
} }
</script> </script>
@endpush @endpush

View File

@@ -183,15 +183,14 @@
<label class="form-label max-w-56"> <label class="form-label max-w-56">
Penilai yang Dilakukan oleh Penilai yang Dilakukan oleh
</label> </label>
<input type="hidden" name="nomor_registrasi" <input type="hidden" name="nomor_registrasi"
value="{{ $penilaian->nomor_registrasi ?? $permohonan->nomor_registrasi }}"> value="{{ $penilaian->nomor_registrasi ?? $permohonan->nomor_registrasi }}">
<div class="flex flex-wrap items-baseline w-full"> <div class="flex flex-wrap items-baseline w-full">
<input class="input" <input class="input" type="hidden" name="jenis_penilaian_id"
type="hidden" name="jenis_penilaian_id" value="{{ $jenisPenilaian->id }}" value="{{ $jenisPenilaian->id }}">
>
<input class="input @error('jenis_penilaian_id') border-danger bg-danger-light @enderror" <input class="input @error('jenis_penilaian_id') border-danger bg-danger-light @enderror"
type="text" value="{{ $jenisPenilaian->name }}" type="text" value="{{ $jenisPenilaian->name }}" readonly>
readonly>
@error('jenis_penilaian_id') @error('jenis_penilaian_id')
<em class="alert text-danger text-sm">{{ $message }}</em> <em class="alert text-danger text-sm">{{ $message }}</em>
@enderror @enderror
@@ -203,9 +202,7 @@
Tim Penilai yang di tunjuk Tim Penilai yang di tunjuk
</label> </label>
<div class="flex flex-wrap items-baseline w-full"> <div class="flex flex-wrap items-baseline w-full">
<input class="input" <input class="input" type="hidden" name="teams_id" value="{{ $regionName->id }}">
type="hidden" name="teams_id" value="{{ $regionName->id }}"
>
<input class="input @error('teams_id') border-danger bg-danger-light @enderror" <input class="input @error('teams_id') border-danger bg-danger-light @enderror"
type="text" value="{{ $regionName->name }}" readonly> type="text" value="{{ $regionName->name }}" readonly>
@error('teams_id') @error('teams_id')
@@ -214,62 +211,217 @@
</div> </div>
</div> </div>
<div class="flex items-baseline flex-wrap lg:flex-nowrap gap-2.5"> {{-- @php
var_dump($penilaianTeam);
@endphp --}}
<div
class="flex items-baseline flex-wrap lg:flex-nowrap gap-2.5 {{ $penilaianTeam->isEmpty() ? '' : 'hidden' }}">
<label class="form-label max-w-56"> <label class="form-label max-w-56">
Surveyor yang di tunjuk Pilih Surveyor dan Penilai
</label> </label>
<div class="flex flex-wrap items-baseline w-full"> <div class="flex flex-wrap items-baseline w-full">
<select id="surveyor_id" name="surveyor_id" <div class="input-group w-full">
class="tomselect input @error('surveyor_id') border-danger bg-danger-light @enderror w-full"> <select id="surveyor_selection" name="surveyor_selection"
<option value="">Pilih Surveyor</option> class="tomselect input @error('surveyor_selection') border-danger bg-danger-light @enderror w-full">
@foreach ($teamPenilai->first()->teamsUsers as $item) <option value="">Pilih Surveyor dan Penilai</option>
<option value="{{ $item->user->id }}">{{ $item->user->name }}</option> <option value="penilai_dan_surveyor">Penilai dan Surveyor Sama</option>
@endforeach <option value="berbeda">Berbeda</option>
</select> </select>
</div>
@error('surveyor_id') @error('surveyor_selection')
<em class="alert text-danger text-sm">{{ $message }}</em> <em class="alert text-danger text-sm">{{ $message }}</em>
@enderror @enderror
</div> </div>
</div> </div>
<div class="flex items-baseline flex-wrap lg:flex-nowrap gap-2.5"> <div id="same_surveyor_penilai" class="hidden">
<label class="form-label max-w-56"> <div class="flex items-baseline flex-wrap lg:flex-nowrap gap-2.5">
Penilai yang di tunjuk <label class="form-label max-w-56">
</label> Surveyor dan Penilai yang di tunjuk
<div class="flex flex-wrap items-baseline w-full"> </label>
<select id="penilaian_id" name="penilaian_id" <div class="flex flex-wrap items-baseline w-full">
class="input tomselect @error('penilaian_id') border-danger bg-danger-light @enderror w-full"> <div class="input-group w-full">
<option value="">Pilih Penilai</option> <select id="penilai_surveyor_id" name="penilai_surveyor_id"
@foreach ($teamPenilai->first()->teamsUsers as $item) class="input tomselect @error('penilai_surveyor_id') border-danger bg-danger-light @enderror w-full">
<option value="{{ $item->user->id }}">{{ $item->user->name }}</option> <option value="">Pilih Surveyor dan Penilai</option>
@endforeach @foreach ($teamPenilai as $item)
</select> <option value="{{ $item->id }}">{{ $item->name }}</option>
@error('penilaian_id') @endforeach
<em class="alert text-danger text-sm">{{ $message }}</em> </select>
@enderror </div>
@error('penilai_surveyor_id')
<em class="alert text-danger text-sm">{{ $message }}</em>
@enderror
</div>
</div> </div>
</div> </div>
<div class="flex items-baseline flex-wrap lg:flex-nowrap gap-2.5">
<label class="form-label max-w-56"> <div id="different_surveyor_penilai" class="{{ $penilaianTeam->isNotEmpty() ? '' : 'hidden' }}">
Surveyor dan penilai yang di tunjuk <div class="grid gap-2.5">
</label>
<div class="flex flex-wrap items-baseline w-full"> @if (
<select id="penilai_surveyor_id" name="penilai_surveyor_id" $penilaianTeam->isNotEmpty() &&
class="input tomselect @error('penilai_surveyor_id') border-danger bg-danger-light @enderror w-full"> $penilaianTeam->contains(fn($item) => $item->role == 'surveyor' && is_null($item->user_id))
<option value="">Pilih Surveyor dan Penilai</option> )
@foreach ($teamPenilai->first()->teamsUsers as $item) <div id="surveyorId" class="flex items-baseline flex-wrap lg:flex-nowrap gap-2.5">
<option value="{{ $item->user->id }}">{{ $item->user->name }}</option> <label class="form-label max-w-56">
@endforeach Surveyor yang di tunjuk
</select> </label>
@error('penilai_surveyor_id') <div class="flex flex-wrap items-baseline w-full">
<em class="alert text-danger text-sm">{{ $message }}</em> <div class="input-group w-full">
@enderror <select id="surveyor_id" name="surveyor_id"
class="tomselect input @error('surveyor_id') border-danger bg-danger-light @enderror w-full">
<option value="">Pilih Surveyor</option>
@foreach ($teamPenilai as $item)
<option value="{{ $item->id }}">{{ $item->name }}</option>
@endforeach
@if ($penilaianTeam->isEmpty())
<option value="pilih_dari_region">pilih dari region berdeda
</option>
@endif
</select>
</div>
@error('surveyor_id')
<em class="alert text-danger text-sm">{{ $message }}</em>
@enderror
</div>
</div>
@elseif($penilaianTeam->isEmpty())
<div id="surveyorId" class="flex items-baseline flex-wrap lg:flex-nowrap gap-2.5">
<label class="form-label max-w-56">
Surveyor yang di tunjuk
</label>
<div class="flex flex-wrap items-baseline w-full">
<div class="input-group w-full">
<select id="surveyor_id" name="surveyor_id"
class="tomselect input @error('surveyor_id') border-danger bg-danger-light @enderror w-full">
<option value="">Pilih Surveyor</option>
@foreach ($teamPenilai as $item)
<option value="{{ $item->id }}">{{ $item->name }}</option>
@endforeach
@if ($penilaianTeam->isEmpty())
<option value="pilih_dari_region">pilih dari region berdeda
</option>
@endif
</select>
</div>
@error('surveyor_id')
<em class="alert text-danger text-sm">{{ $message }}</em>
@enderror
</div>
</div>
@endif
<div id="surveyorRegion" class="hidden items-baseline flex-wrap lg:flex-nowrap gap-2.5">
<label class="form-label max-w-56">
Pilih Region
</label>
<div class="flex flex-wrap items-baseline w-full">
<div class="input-group w-full">
<select id="surveyor_region_id" name="surveyor_region_id"
class="tomselect input @error('surveyor_region_id') border-danger bg-danger-light @enderror w-full">
<option value="">Pilih Region</option>
@if (isset($updateTeamPenilai))
@foreach ($updateTeamPenilai as $item)
<option value="{{ $item->regions->id }}">
{{ $item->regions->name }}</option>
@endforeach
@endif
</select>
</div>
@error('surveyor_region_id')
<em class="alert text-danger text-sm">{{ $message }}</em>
@enderror
</div>
</div>
@if (
$penilaianTeam->isNotEmpty() &&
$penilaianTeam->contains(fn($item) => $item->role == 'penilai' && is_null($item->user_id))
)
<div id="penilaiId" class="flex items-baseline flex-wrap lg:flex-nowrap gap-2.5">
<label class="form-label max-w-56">
Penilai yang di tunjuk
</label>
<div class="flex flex-wrap items-baseline w-full">
<div class="input-group w-full">
<select id="penilai_id" name="penilai_id"
class="input tomselect @error('penilai_id') border-danger bg-danger-light @enderror w-full">
<option value="">Pilih Penilai</option>
@foreach ($teamPenilai as $item)
<option value="{{ $item->id }}">{{ $item->name }}</option>
@endforeach
@if ($penilaianTeam->isEmpty())
<option value="pilih_dari_region">pilih dari region berdeda
</option>
@endif
</select>
</div>
@error('penilai_id')
<em class="alert text-danger text-sm">{{ $message }}</em>
@enderror
</div>
</div>
@elseif($penilaianTeam->isEmpty())
<div id="penilaiId" class="flex items-baseline flex-wrap lg:flex-nowrap gap-2.5">
<label class="form-label max-w-56">
Penilai yang di tunjuk
</label>
<div class="flex flex-wrap items-baseline w-full">
<div class="input-group w-full">
<select id="penilai_id" name="penilai_id"
class="input tomselect @error('penilai_id') border-danger bg-danger-light @enderror w-full">
<option value="">Pilih Penilai</option>
@foreach ($teamPenilai as $item)
<option value="{{ $item->id }}">{{ $item->name }}</option>
@endforeach
@if ($penilaianTeam->isEmpty())
<option value="pilih_dari_region">pilih dari region berdeda
</option>
@endif
</select>
</div>
@error('penilai_id')
<em class="alert text-danger text-sm">{{ $message }}</em>
@enderror
</div>
</div>
@endif
<div id="penilaiRegion" class="hidden items-baseline flex-wrap lg:flex-nowrap gap-2.5">
<label class="form-label max-w-56">
Pilih Region
</label>
<div class="flex flex-wrap items-baseline w-full">
<div class="input-group w-full">
<select id="penilai_region_id" name="penilai_region_id"
class="tomselect input @error('penilai_region_id') border-danger bg-danger-light @enderror w-full">
<option value="">Pilih Region</option>
@if (isset($updateTeamPenilai))
@foreach ($updateTeamPenilai as $item)
<option value="{{ $item->regions->id }}">
{{ $item->regions->name }}</option>
@endforeach
@endif
</select>
</div>
@error('penilai_region_id')
<em class="alert text-danger text-sm">{{ $message }}</em>
@enderror
</div>
</div>
</div> </div>
</div> </div>
<div class="flex items-baseline flex-wrap lg:flex-nowrap gap-2.5"> <div class="flex items-baseline flex-wrap lg:flex-nowrap gap-2.5">
<label class="form-label max-w-56"> <label class="form-label max-w-56">
Jadwal Kunjungan Jadwal Kunjungan
@@ -307,16 +459,9 @@
Revisi Revisi
</button> </button>
</div> </div>
</form> </form>
</div> </div>
</div> </div>
</div> </div>
@@ -376,8 +521,57 @@
</div> </div>
@endsection @endsection
@push('scripts') @push('scripts')
<script> <script>
document.getElementById('surveyor_selection').addEventListener('change', function() {
const selectedValue = this.value;
const sameSurveyorPenilai = document.getElementById('same_surveyor_penilai');
const differentSurveyorPenilai = document.getElementById('different_surveyor_penilai');
if (selectedValue === 'penilai_dan_surveyor') {
sameSurveyorPenilai.classList.remove('hidden');
differentSurveyorPenilai.classList.add('hidden');
} else if (selectedValue === 'berbeda') {
sameSurveyorPenilai.classList.add('hidden');
differentSurveyorPenilai.classList.remove('hidden');
} else {
sameSurveyorPenilai.classList.add('hidden');
differentSurveyorPenilai.classList.add('hidden');
}
});
document.getElementById('surveyor_id').addEventListener('change', function() {
const selectedValue = this.value;
const surveyorRegion = document.getElementById('surveyorRegion');
if (selectedValue === 'pilih_dari_region') {
surveyorRegion.classList.remove('hidden');
surveyorRegion.classList.add('flex');
} else {
surveyorRegion.classList.add('hidden');
}
});
document.getElementById('penilai_id').addEventListener('change', function() {
const selectedValue = this.value;
const penilaiRegion = document.getElementById('penilaiRegion');
if (selectedValue === 'pilih_dari_region') {
penilaiRegion.classList.remove('hidden');
penilaiRegion.classList.add('flex');
} else {
penilaiRegion.classList.add('hidden');
}
});
document.addEventListener('DOMContentLoaded', function() { document.addEventListener('DOMContentLoaded', function() {
const revisiForm = document.getElementById('revisiForm'); const revisiForm = document.getElementById('revisiForm');
const btnSubmit = document.getElementById('btnSubmit'); const btnSubmit = document.getElementById('btnSubmit');

View File

@@ -1,8 +1,8 @@
@extends('layouts.main') @extends('layouts.main')
{{-- @section('breadcrumbs') @section('breadcrumbs')
{{ Breadcrumbs::render('penilaian') }} {{ Breadcrumbs::render('otorisator.'. strtolower($header)) }}
@endsection --}} @endsection
@section('content') @section('content')
<div class="w-full grid gap-5 lg:gap-7.5 mx-auto"> <div class="w-full grid gap-5 lg:gap-7.5 mx-auto">
@@ -57,10 +57,7 @@
<span class="sort"> <span class="sort-label"> Tujuan Penilaian </span> <span class="sort"> <span class="sort-label"> Tujuan Penilaian </span>
<span class="sort-icon"> </span> </span> <span class="sort-icon"> </span> </span>
</th> </th>
<th class="min-w-[150px]" data-datatable-column="status">
<span class="sort"> <span class="sort-label"> Status </span>
<span class="sort-icon"> </span> </span>
</th>
<th class="min-w-[50px] text-center" data-datatable-column="actions">Action</th> <th class="min-w-[50px] text-center" data-datatable-column="actions">Action</th>
</tr> </tr>
</thead> </thead>
@@ -86,10 +83,48 @@
@push('scripts') @push('scripts')
<script>
function otorisator(){
Swal.fire({
title: 'Are you sure?',
text: "You won't be able to revert this!",
icon: 'warning',
showCancelButton: true,
confirmButtonColor: '#3085d6',
cancelButtonColor: '#d33',
confirmButtonText: 'Yes!'
}).then((result) => {
if (result.isConfirmed) {
$.ajaxSetup({
headers: {
'X-CSRF-TOKEN': '{{ csrf_token() }}'
}
});
$.ajax(`permohonan/${data}`, {
type: 'POST'
}).then((response) => {
swal.fire('eddited!', 'Pelaporan has been edited.', 'success').then(() => {
window.location.reload();
});
}).catch((error) => {
console.error('Error:', error);
Swal.fire('Error!', 'An error occurred while file.', 'error');
});
}
})
}
</script>
<script type="module"> <script type="module">
const element = document.querySelector('#permohonan-table'); const element = document.querySelector('#permohonan-table');
const searchInput = document.getElementById('search'); const searchInput = document.getElementById('search');
const apiUrl = element.getAttribute('data-api-url'); const apiUrl = element.getAttribute('data-api-url');
const dataTableOptions = { const dataTableOptions = {
apiEndpoint: apiUrl, apiEndpoint: apiUrl,
@@ -135,9 +170,6 @@
return `${data.tujuan_penilaian.name}`; return `${data.tujuan_penilaian.name}`;
}, },
}, },
status: {
title: 'Status'
},
actions: { actions: {
title: 'Status', title: 'Status',
render: (item, data) => { render: (item, data) => {

View File

@@ -146,7 +146,7 @@
</div> </div>
<div class="card"> <div class="card">
<form action="{{ route('authorization.update', $permohonan->id) }}" method="POST"> <form id="approveForm" action="{{ route('authorization.update', $permohonan->id) }}" method="POST">
<input type="hidden" name="_method" value="PUT"> <input type="hidden" name="_method" value="PUT">
@csrf @csrf
<div class="card-body lg:py-7.5"> <div class="card-body lg:py-7.5">
@@ -160,14 +160,34 @@
</div> </div>
</div> </div>
<div class="card-footer flex justify-end"> <div class="card-footer flex justify-end">
<button type="submit" name="status" value="preregister" class="btn btn-success"> <button onclick="return otorisator()" type="button" name="status" value="preregister" class="btn btn-success">
Approve Approve
</button> </button>
<button type="submit" name="status" value="revisi" class="btn btn-warning ml-3">
Revisi
</button>
</div> </div>
</form> </form>
</div> </div>
</div> </div>
@endsection @endsection
@push('scripts')
<script>
function otorisator(){
Swal.fire({
title: 'Are you sure?',
text: "You won't be able to revert this!",
icon: 'warning',
showCancelButton: true,
confirmButtonColor: '#3085d6',
cancelButtonColor: '#d33',
confirmButtonText: 'Yes!'
}).then((result) => {
if (result.isConfirmed) {
document.getElementById('approveForm').submit();
}
})
}
</script>
@endpush

View File

@@ -34,6 +34,7 @@
<form action="{{ isset($permohonan->id) ? route('permohonan.update', $permohonan) : route('permohonan.store') }}" method="POST" class="grid gap-5" enctype="multipart/form-data"> <form action="{{ isset($permohonan->id) ? route('permohonan.update', $permohonan) : route('permohonan.store') }}" method="POST" class="grid gap-5" enctype="multipart/form-data">
@if(isset($permohonan->id)) @if(isset($permohonan->id))
@method('PUT') @method('PUT')
<input type="hidden" name="id" value="{{ $permohonan->id }}">
@endif @endif
@csrf @csrf
@@ -52,19 +53,14 @@
Tujuan Penilaian Tujuan Penilaian
</label> </label>
<div class="flex flex-wrap items-baseline w-full"> <div class="flex flex-wrap items-baseline w-full">
<select class="input tomselect w-full @error('branch_id') border-danger bg-danger-light @enderror" name="tujuan_penilaian_id" id="tujuan_penilaian_id"> <select class="input tomselect w-full @error('tujuan_penilaian_id') border-danger bg-danger-light @enderror" name="tujuan_penilaian_id" id="tujuan_penilaian_id">
<option value="">Pilih Tujuan Penilaian</option> <option value="">Pilih Tujuan Penilaian</option>
@if(isset($tujuanPenilaian)) @if(isset($tujuanPenilaian))
@foreach($tujuanPenilaian as $row) @foreach($tujuanPenilaian as $row)
@if(isset($permohonan)) <option value="{{ $row->id }}"
<option value="{{ $row->id }}" {{ isset($permohonan->tujuan_penilaian_id) && $permohonan->tujuan_penilaian_id == $row->id?'selected' : '' }}> {{ (old('tujuan_penilaian_id') == $row->id) || (isset($permohonan) && $permohonan->tujuan_penilaian_id == $row->id) ? 'selected' : '' }}>
{{ $row->name }} {{ $row->name }}
</option> </option>
@else
<option value="{{ $row->id }}">
{{ $row->name }}
</option>
@endif
@endforeach @endforeach
@endif @endif
</select> </select>
@@ -83,19 +79,14 @@
<option value="">Pilih Fasilitas Kredit</option> <option value="">Pilih Fasilitas Kredit</option>
@if(isset($fasilitasKredit)) @if(isset($fasilitasKredit))
@foreach($fasilitasKredit as $row) @foreach($fasilitasKredit as $row)
@if(isset($permohonan)) <option value="{{ $row->id }}"
<option value="{{ $row->id }}" {{ isset($permohonan->jenis_fasilitas_kredit_id) && $permohonan->jenis_fasilitas_kredit_id == $row->id ?'selected' : '' }}> {{ (old('jenis_fasilitas_kredit_id') == $row->id) || (isset($permohonan) && $permohonan->jenis_fasilitas_kredit_id == $row->id) ? 'selected' : '' }}>
{{ $row->name }} {{ $row->name }}
</option> </option>
@else
<option value="{{ $row->id }}">
{{ $row->name }}
</option>
@endif
@endforeach @endforeach
@endif @endif
</select> </select>
@error('status') @error('jenis_fasilitas_kredit_id')
<em class="alert text-danger text-sm">{{ $message }}</em> <em class="alert text-danger text-sm">{{ $message }}</em>
@enderror @enderror
</div> </div>
@@ -107,22 +98,17 @@
</label> </label>
<div class="flex flex-wrap items-baseline w-full"> <div class="flex flex-wrap items-baseline w-full">
<select class="input tomselect w-full @error('nilai_plafond_id') border-danger bg-danger-light @enderror" name="nilai_plafond_id" id="nilai_plafond_id"> <select class="input tomselect w-full @error('nilai_plafond_id') border-danger bg-danger-light @enderror" name="nilai_plafond_id" id="nilai_plafond_id">
<option value="">Pilih Nilai Flafond</option> <option value="">Pilih Nilai Plafond</option>
@if(isset($plafond)) @if(isset($plafond))
@foreach($plafond as $row) @foreach($plafond as $row)
@if(isset($permohonan)) <option value="{{ $row->id }}"
<option value="{{ $row->id }}" {{ isset($permohonan->nilai_plafond_id) && $permohonan->nilai_plafond_id == $row->id ?'selected' : '' }}> {{ (old('nilai_plafond_id') == $row->id) || (isset($permohonan) && $permohonan->nilai_plafond_id == $row->id) ? 'selected' : '' }}>
{{ $row->name }} {{ $row->name }}
</option> </option>
@else
<option value="{{ $row->id }}">
{{ $row->name }}
</option>
@endif
@endforeach @endforeach
@endif @endif
</select> </select>
@error('status') @error('nilai_plafond_id')
<em class="alert text-danger text-sm">{{ $message }}</em> <em class="alert text-danger text-sm">{{ $message }}</em>
@enderror @enderror
</div> </div>
@@ -135,10 +121,10 @@
<div class="flex flex-wrap items-baseline w-full"> <div class="flex flex-wrap items-baseline w-full">
<select class="input tomselect w-full @error('status_bayar') border-danger bg-danger-light @enderror" name="status_bayar" id="status_bayar"> <select class="input tomselect w-full @error('status_bayar') border-danger bg-danger-light @enderror" name="status_bayar" id="status_bayar">
<option value="">Pilih Status Bayar</option> <option value="">Pilih Status Bayar</option>
<option {{ $permohonan->status_bayar=="sudah_bayar" ? 'selected' : '' }} value="sudah_bayar">Sudah Bayar</option> <option value="sudah_bayar" {{ (old('status_bayar') == 'sudah_bayar') || (isset($permohonan) && $permohonan->status_bayar == 'sudah_bayar') ? 'selected' : '' }}>Sudah Bayar</option>
<option {{ $permohonan->status_bayar=="belum_bayar" ? 'selected' : '' }} value="belum_bayar">Belum Bayar</option> <option value="belum_bayar" {{ (old('status_bayar') == 'belum_bayar') || (isset($permohonan) && $permohonan->status_bayar == 'belum_bayar') ? 'selected' : '' }}>Belum Bayar</option>
</select> </select>
@error('status') @error('status_bayar')
<em class="alert text-danger text-sm">{{ $message }}</em> <em class="alert text-danger text-sm">{{ $message }}</em>
@enderror @enderror
</div> </div>
@@ -149,12 +135,16 @@
Nilai NJOP Nilai NJOP
</label> </label>
<div class="flex flex-wrap items-baseline w-full"> <div class="flex flex-wrap items-baseline w-full">
<input class="input @error('nilai_njop') border-danger bg-danger-light @enderror" type="text" name="nilai_njop" value="{{ $permohonan->nilai_njop ?? '' }}"> <input class="input @error('nilai_njop') border-danger bg-danger-light @enderror"
type="text"
name="nilai_njop"
value="{{ old('nilai_njop', $permohonan->nilai_njop ?? '') }}">
@error('nilai_njop') @error('nilai_njop')
<em class="alert text-danger text-sm">{{ $message }}</em> <em class="alert text-danger text-sm">{{ $message }}</em>
@enderror @enderror
</div> </div>
</div> </div>
@if($permohonan->status=='revisi') @if($permohonan->status=='revisi')
<div class="flex items-baseline flex-wrap lg:flex-nowrap gap-2.5"> <div class="flex items-baseline flex-wrap lg:flex-nowrap gap-2.5">
Catatan : <br> Catatan : <br>
@@ -211,19 +201,14 @@
Tujuan Penilaian Tujuan Penilaian
</label> </label>
<div class="flex flex-wrap items-baseline w-full"> <div class="flex flex-wrap items-baseline w-full">
<select class="input tomselect w-full @error('branch_id') border-danger bg-danger-light @enderror" name="tujuan_penilaian_id" id="tujuan_penilaian_id"> <select class="input tomselect w-full @error('tujuan_penilaian_id') border-danger bg-danger-light @enderror" name="tujuan_penilaian_id" id="tujuan_penilaian_id">
<option value="">Pilih Tujuan Penilaian</option> <option value="">Pilih Tujuan Penilaian</option>
@if(isset($tujuanPenilaian)) @if(isset($tujuanPenilaian))
@foreach($tujuanPenilaian as $row) @foreach($tujuanPenilaian as $row)
@if(isset($permohonan)) <option value="{{ $row->id }}"
<option value="{{ $row->id }}" {{ isset($permohonan->tujuan_penilaian_id) && $permohonan->tujuan_penilaian_id == $row->id?'selected' : '' }}> {{ (old('tujuan_penilaian_id') == $row->id) || (isset($permohonan) && $permohonan->tujuan_penilaian_id == $row->id) ? 'selected' : '' }}>
{{ $row->name }} {{ $row->name }}
</option> </option>
@else
<option value="{{ $row->id }}">
{{ $row->name }}
</option>
@endif
@endforeach @endforeach
@endif @endif
</select> </select>
@@ -242,19 +227,14 @@
<option value="">Pilih Fasilitas Kredit</option> <option value="">Pilih Fasilitas Kredit</option>
@if(isset($fasilitasKredit)) @if(isset($fasilitasKredit))
@foreach($fasilitasKredit as $row) @foreach($fasilitasKredit as $row)
@if(isset($permohonan)) <option value="{{ $row->id }}"
<option value="{{ $row->id }}" {{ isset($permohonan->jenis_fasilitas_kredit_id) && $permohonan->jenis_fasilitas_kredit_id == $row->id ?'selected' : '' }}> {{ (old('jenis_fasilitas_kredit_id') == $row->id) || (isset($permohonan) && $permohonan->jenis_fasilitas_kredit_id == $row->id) ? 'selected' : '' }}>
{{ $row->name }} {{ $row->name }}
</option> </option>
@else
<option value="{{ $row->id }}">
{{ $row->name }}
</option>
@endif
@endforeach @endforeach
@endif @endif
</select> </select>
@error('status') @error('jenis_fasilitas_kredit_id')
<em class="alert text-danger text-sm">{{ $message }}</em> <em class="alert text-danger text-sm">{{ $message }}</em>
@enderror @enderror
</div> </div>
@@ -266,22 +246,17 @@
</label> </label>
<div class="flex flex-wrap items-baseline w-full"> <div class="flex flex-wrap items-baseline w-full">
<select class="input tomselect w-full @error('nilai_plafond_id') border-danger bg-danger-light @enderror" name="nilai_plafond_id" id="nilai_plafond_id"> <select class="input tomselect w-full @error('nilai_plafond_id') border-danger bg-danger-light @enderror" name="nilai_plafond_id" id="nilai_plafond_id">
<option value="">Pilih Nilai Flafond</option> <option value="">Pilih Nilai Plafond</option>
@if(isset($plafond)) @if(isset($plafond))
@foreach($plafond as $row) @foreach($plafond as $row)
@if(isset($permohonan)) <option value="{{ $row->id }}"
<option value="{{ $row->id }}" {{ isset($permohonan->nilai_plafond_id) && $permohonan->nilai_plafond_id == $row->id ?'selected' : '' }}> {{ (old('nilai_plafond_id') == $row->id) || (isset($permohonan) && $permohonan->nilai_plafond_id == $row->id) ? 'selected' : '' }}>
{{ $row->name }} {{ $row->name }}
</option> </option>
@else
<option value="{{ $row->id }}">
{{ $row->name }}
</option>
@endif
@endforeach @endforeach
@endif @endif
</select> </select>
@error('status') @error('nilai_plafond_id')
<em class="alert text-danger text-sm">{{ $message }}</em> <em class="alert text-danger text-sm">{{ $message }}</em>
@enderror @enderror
</div> </div>
@@ -294,10 +269,10 @@
<div class="flex flex-wrap items-baseline w-full"> <div class="flex flex-wrap items-baseline w-full">
<select class="input tomselect w-full @error('status_bayar') border-danger bg-danger-light @enderror" name="status_bayar" id="status_bayar"> <select class="input tomselect w-full @error('status_bayar') border-danger bg-danger-light @enderror" name="status_bayar" id="status_bayar">
<option value="">Pilih Status Bayar</option> <option value="">Pilih Status Bayar</option>
<option value="sudah_bayar">Sudah Bayar</option> <option value="sudah_bayar" {{ (old('status_bayar') == 'sudah_bayar') || (isset($permohonan) && $permohonan->status_bayar == 'sudah_bayar') ? 'selected' : '' }}>Sudah Bayar</option>
<option value="belum_bayar">Belum Bayar</option> <option value="belum_bayar" {{ (old('status_bayar') == 'belum_bayar') || (isset($permohonan) && $permohonan->status_bayar == 'belum_bayar') ? 'selected' : '' }}>Belum Bayar</option>
</select> </select>
@error('status') @error('status_bayar')
<em class="alert text-danger text-sm">{{ $message }}</em> <em class="alert text-danger text-sm">{{ $message }}</em>
@enderror @enderror
</div> </div>
@@ -308,41 +283,16 @@
Nilai NJOP Nilai NJOP
</label> </label>
<div class="flex flex-wrap items-baseline w-full"> <div class="flex flex-wrap items-baseline w-full">
<input class="input @error('nilai_njop') border-danger bg-danger-light @enderror" type="text" name="nilai_njop" value="{{ $permohonan->nilai_njop ?? '' }}"> <input class="input @error('nilai_njop') border-danger bg-danger-light @enderror"
type="text"
name="nilai_njop"
value="{{ old('nilai_njop', $permohonan->nilai_njop ?? '') }}">
@error('nilai_njop') @error('nilai_njop')
<em class="alert text-danger text-sm">{{ $message }}</em> <em class="alert text-danger text-sm">{{ $message }}</em>
@enderror @enderror
</div> </div>
</div> </div>
<div class="flex items-baseline flex-wrap lg:flex-nowrap gap-2.5">
<label class="form-label max-w-56">
Status Permohonan
</label>
<div class="flex flex-wrap items-baseline w-full">
<select class="input tomselect w-full @error('status') border-danger bg-danger-light @enderror" name="status" id="status">
<option value="">Pilih Status Permohonan</option>
@if(isset($status))
@foreach($status as $row)
@if(isset($permohonan))
<option value="{{ $row->slug }}" {{ isset($permohonan->status) && $permohonan->status == $row->slug ?'selected' : '' }}>
{{ $row->name }}
</option>
@else
<option value="{{ $row->slug }}">
{{ $row->name }}
</option>
@endif
@endforeach
@endif
</select>
@error('status')
<em class="alert text-danger text-sm">{{ $message }}</em>
@enderror
</div>
</div>
<div class="flex justify-end"> <div class="flex justify-end">
<button type="submit" class="btn btn-primary"> <button type="submit" class="btn btn-primary">
Save Save

View File

@@ -38,8 +38,8 @@
<span class="sort"> <span class="sort-label"> Nomor Registrasi </span> <span class="sort"> <span class="sort-label"> Nomor Registrasi </span>
<span class="sort-icon"> </span> </span> <span class="sort-icon"> </span> </span>
</th> </th>
<th class="min-w-[150px]" data-datatable-column="code"> <th class="min-w-[150px]" data-datatable-column="debiture">
<span class="sort"> <span class="sort-label"> Kode Penawaran </span> <span class="sort"> <span class="sort-label"> Nama Debitur </span>
<span class="sort-icon"> </span> </span> <span class="sort-icon"> </span> </span>
</th> </th>
<th class="min-w-[150px]" data-datatable-column="start_date"> <th class="min-w-[150px]" data-datatable-column="start_date">
@@ -132,8 +132,16 @@
'nomor_registrasi': { 'nomor_registrasi': {
title: 'Nomor Registrasi', title: 'Nomor Registrasi',
}, },
code: { debiture: {
title: 'Kode Penawaran', title: 'Nama Debitur',
render: (item, data) => {
if(data.permohonan) {
return `${data.permohonan.debiture.name}`;
}
return "-";
}
}, },
start_date: { start_date: {
title: 'Tanggal Penawaran', title: 'Tanggal Penawaran',

View File

@@ -72,7 +72,7 @@
markup +='<td valign="top"><div class="input-group"><span class="inputku btn btn-input" id="{{$route[1]}}_rp_'+value.id+'">Rp.</span><input type="text" disabled="" style="text-align: right;" onkeydown="return numbersonly(this, event);" onkeyup="javascript:tandaPemisahTitik(this);" class="inputku input" id="{{$route[1]}}_biayaPenawaran_'+value.id+'" name="{{$route[1]}}_biayaPenawaran_'+value.id+'"></div><em id="{{$route[1]}}_biayaPenawaran_msg_'+value.id+'" class="alert text-danger text-sm"></em></td>'; markup +='<td valign="top"><div class="input-group"><span class="inputku btn btn-input" id="{{$route[1]}}_rp_'+value.id+'">Rp.</span><input type="text" disabled="" style="text-align: right;" onkeydown="return numbersonly(this, event);" onkeyup="javascript:tandaPemisahTitik(this);" class="inputku input" id="{{$route[1]}}_biayaPenawaran_'+value.id+'" name="{{$route[1]}}_biayaPenawaran_'+value.id+'"></div><em id="{{$route[1]}}_biayaPenawaran_msg_'+value.id+'" class="alert text-danger text-sm"></em></td>';
markup +='<td><input type="file" disabled="" class="inputku file-input" id="{{$route[1]}}_dokumenPersetujuan_'+value.id+'" name="{{$route[1]}}_dokumenPersetujuan_'+value.id+'" accept="application/pdf" /><em id="{{$route[1]}}_dokumenPersetujuan_msg_'+value.id+'" class="alert text-danger text-sm"></em>'+htmlDokumenPersetujuanDownload+'</td>'; markup +='<td><input type="file" disabled="" class="inputku file-input" id="{{$route[1]}}_dokumenPersetujuan_'+value.id+'" name="{{$route[1]}}_dokumenPersetujuan_'+value.id+'" accept="application/pdf" /><em id="{{$route[1]}}_dokumenPersetujuan_msg_'+value.id+'" class="alert text-danger text-sm"></em>'+htmlDokumenPersetujuanDownload+'</td>';
markup +='<td><div class="flex flex-nowrap justify-center">'; markup +='<td><div class="flex flex-nowrap justify-center">';
markup +='<a disabled="" class="btn btn-sm btn-icon btn-clear btn-info" href="javascript:void(0)" id="{{$route[1]}}_icon_update_'+value.id+'" title="Proses Penawaran '+kjppName+'" onclick="updateData('+value.id+','+value.kjpp_rekanan_id+',\''+kjppName+'\')"><i class="ki-outline ki-notepad-edit"></i></a>'; markup +='<a disabled="" class="btn btn-sm btn-icon btn-clear btn-info" href="javascript:void(0)" id="{{$route[1]}}_icon_update_'+value.id+'" title="Proses Penawaran '+kjppName+'" onclick="updateData('+value.id+','+value.kjpp_rekanan_id+',\''+kjppName+'\')"><i class="ki-outline ki-bookmark"></i></a>';
markup +='<a disabled="" class="delete btn btn-sm btn-icon btn-clear btn-danger" id="{{$route[1]}}_icon_delete_'+value.id+'" onclick="deleteData('+value.id+',\''+kjppName+'\')" title="Hapus Proses Penawaran '+kjppName+'"><i class="ki-outline ki-trash"></i></a>'; markup +='<a disabled="" class="delete btn btn-sm btn-icon btn-clear btn-danger" id="{{$route[1]}}_icon_delete_'+value.id+'" onclick="deleteData('+value.id+',\''+kjppName+'\')" title="Hapus Proses Penawaran '+kjppName+'"><i class="ki-outline ki-trash"></i></a>';
markup +='<label class="switch"><input name="{{$route[1]}}_check_'+value.id+'" id="{{$route[1]}}_check_'+value.id+'" onclick="switchProses('+value.id+')" type="checkbox" value="0"/><span class="switch-label">Proses</span></label></div></td>'; markup +='<label class="switch"><input name="{{$route[1]}}_check_'+value.id+'" id="{{$route[1]}}_check_'+value.id+'" onclick="switchProses('+value.id+')" type="checkbox" value="0"/><span class="switch-label">Proses</span></label></div></td>';
markup += '</tr>'; markup += '</tr>';

View File

@@ -77,7 +77,7 @@
markup +='<td valign="top"><div class="input-group"><span class="inputku btn btn-input" id="{{$route[1]}}_rp_'+value.id+'">Rp.</span><input type="text" disabled="" style="text-align: right;" onkeydown="return numbersonly(this, event);" onkeyup="javascript:tandaPemisahTitik(this);" class="inputku input" id="{{$route[1]}}_biayaPenawaran_'+value.id+'" name="{{$route[1]}}_biayaPenawaran_'+value.id+'"></div><em id="{{$route[1]}}_biayaPenawaran_msg_'+value.id+'" class="alert text-danger text-sm"></em></td>'; markup +='<td valign="top"><div class="input-group"><span class="inputku btn btn-input" id="{{$route[1]}}_rp_'+value.id+'">Rp.</span><input type="text" disabled="" style="text-align: right;" onkeydown="return numbersonly(this, event);" onkeyup="javascript:tandaPemisahTitik(this);" class="inputku input" id="{{$route[1]}}_biayaPenawaran_'+value.id+'" name="{{$route[1]}}_biayaPenawaran_'+value.id+'"></div><em id="{{$route[1]}}_biayaPenawaran_msg_'+value.id+'" class="alert text-danger text-sm"></em></td>';
markup +='<td><input type="file" disabled="" class="inputku file-input" id="{{$route[1]}}_dokumenPersetujuan_'+value.id+'" name="{{$route[1]}}_dokumenPersetujuan_'+value.id+'" accept="application/pdf" /><em id="{{$route[1]}}_dokumenPersetujuan_msg_'+value.id+'" class="alert text-danger text-sm"></em>'+htmlDokumenPersetujuanDownload+'</td>'; markup +='<td><input type="file" disabled="" class="inputku file-input" id="{{$route[1]}}_dokumenPersetujuan_'+value.id+'" name="{{$route[1]}}_dokumenPersetujuan_'+value.id+'" accept="application/pdf" /><em id="{{$route[1]}}_dokumenPersetujuan_msg_'+value.id+'" class="alert text-danger text-sm"></em>'+htmlDokumenPersetujuanDownload+'</td>';
markup +='<td><div class="flex flex-nowrap justify-center">'; markup +='<td><div class="flex flex-nowrap justify-center">';
markup +='<a disabled="" class="btn btn-sm btn-icon btn-clear btn-info" href="javascript:void(0)" id="{{$route[1]}}_icon_update_'+value.id+'" title="Proses Penawaran '+kjppName+'" onclick="updateData('+value.id+','+value.kjpp_rekanan_id+',\''+kjppName+'\')"><i class="ki-outline ki-notepad-edit"></i></a>'; markup +='<a disabled="" class="btn btn-sm btn-icon btn-clear btn-info" href="javascript:void(0)" id="{{$route[1]}}_icon_update_'+value.id+'" title="Proses Penawaran '+kjppName+'" onclick="updateData('+value.id+','+value.kjpp_rekanan_id+',\''+kjppName+'\')"><i class="ki-outline ki-bookmark"></i></a>';
markup +='<a disabled="" class="delete btn btn-sm btn-icon btn-clear btn-danger" id="{{$route[1]}}_icon_delete_'+value.id+'" onclick="deleteData('+value.id+',\''+kjppName+'\')" title="Hapus Proses Penawaran '+kjppName+'"><i class="ki-outline ki-trash"></i></a>'; markup +='<a disabled="" class="delete btn btn-sm btn-icon btn-clear btn-danger" id="{{$route[1]}}_icon_delete_'+value.id+'" onclick="deleteData('+value.id+',\''+kjppName+'\')" title="Hapus Proses Penawaran '+kjppName+'"><i class="ki-outline ki-trash"></i></a>';
markup +='<label class="switch"><input name="{{$route[1]}}_check_'+value.id+'" id="{{$route[1]}}_check_'+value.id+'" onclick="switchProses('+value.id+')" type="checkbox" value="0"/><span class="switch-label">Proses</span></label></div></td>'; markup +='<label class="switch"><input name="{{$route[1]}}_check_'+value.id+'" id="{{$route[1]}}_check_'+value.id+'" onclick="switchProses('+value.id+')" type="checkbox" value="0"/><span class="switch-label">Proses</span></label></div></td>';
markup += '</tr>'; markup += '</tr>';

View File

@@ -83,6 +83,15 @@
<em id="{{$route[0]}}_region_msg" class="alert text-danger text-sm"></em> <em id="{{$route[0]}}_region_msg" class="alert text-danger text-sm"></em>
</div> </div>
</div> </div>
<div id="{{ $route[0] }}_div_catatan2" class="flex items-baseline flex-wrap lg:flex-nowrap gap-2.5">
<label class="form-label max-w-56">
Catatan
</label>
<div class="flex flex-wrap items-baseline w-full">
<textarea class="inputku textarea" name="{{$route[0]}}_catatan2" id="{{$route[0]}}_catatan2" placeholder="Catatan..." rows="6"></textarea>
<em id="{{$route[0]}}_catatan2_msg" class="alert text-danger text-sm"></em>
</div>
</div>
<div class="flex justify-end"> <div class="flex justify-end">
<button type="button" class="btn btn-primary" id="toEdit"> <button type="button" class="btn btn-primary" id="toEdit">
Save Save

View File

@@ -13,6 +13,7 @@
$("#{{ $route[0] }}_div_jenis_pilihan").show(); $("#{{ $route[0] }}_div_jenis_pilihan").show();
$("#{{ $route[0] }}_div_catatan").hide(); $("#{{ $route[0] }}_div_catatan").hide();
$("#{{ $route[0] }}_div_region").hide(); $("#{{ $route[0] }}_div_region").hide();
$("#{{ $route[0] }}_div_catatan2").show();
// prepare data // prepare data
setData(); setData();
} }
@@ -94,12 +95,14 @@
$("#{{ $route[0] }}_div_jenis_pilihan").show(); $("#{{ $route[0] }}_div_jenis_pilihan").show();
$("#{{ $route[0] }}_catatan").val(''); $("#{{ $route[0] }}_catatan").val('');
$("#{{ $route[0] }}_div_catatan").hide(); $("#{{ $route[0] }}_div_catatan").hide();
$("#{{ $route[0] }}_div_catatan2").show();
} }
else else
{ {
$("#{{$route[0]}}_jenis_penilaian option[value=0]").prop('selected', true); $("#{{$route[0]}}_jenis_penilaian option[value=0]").prop('selected', true);
$("#{{ $route[0] }}_div_jenis_pilihan").hide(); $("#{{ $route[0] }}_div_jenis_pilihan").hide();
$("#{{ $route[0] }}_div_catatan").show(); $("#{{ $route[0] }}_div_catatan").show();
$("#{{ $route[0] }}_div_catatan2").hide();
} }
}); });
@@ -115,6 +118,7 @@
let jenis_penilaian = $("#{{$route[0]}}_jenis_penilaian").val(); let jenis_penilaian = $("#{{$route[0]}}_jenis_penilaian").val();
let region = $("#{{$route[0]}}_region").val(); let region = $("#{{$route[0]}}_region").val();
let catatan = $("#{{$route[0]}}_catatan").val(); let catatan = $("#{{$route[0]}}_catatan").val();
let catatan2 = $("#{{$route[0]}}_catatan2").val();
if(jenis_penilaian==0) if(jenis_penilaian==0)
jenis_penilaian=''; jenis_penilaian='';
@@ -129,6 +133,7 @@
input_data.jenis_penilaian= jenis_penilaian; input_data.jenis_penilaian= jenis_penilaian;
input_data.region= region; input_data.region= region;
input_data.catatan = catatan; input_data.catatan = catatan;
input_data.catatan2 = catatan2;
let useURL= '{{ route($route[0].'.update', $id) }}'; let useURL= '{{ route($route[0].'.update', $id) }}';
$.ajax({ $.ajax({

View File

@@ -199,7 +199,7 @@
<em id="{{$route[0]}}_catatan_msg" class="alert text-danger text-sm"></em> <em id="{{$route[0]}}_catatan_msg" class="alert text-danger text-sm"></em>
</div> </div>
</div> </div>
<div id="{{ $route[0] }}_div_region" class="flex items-baseline flex-wrap lg:flex-nowrap gap-2.5 mt-5"> <div id="{{ $route[0] }}_div_region" class="flex items-baseline flex-wrap lg:flex-nowrap gap-2.5">
<label class="form-label max-w-56"> <label class="form-label max-w-56">
Region Region
</label> </label>
@@ -209,6 +209,15 @@
</select> </select>
<em id="{{$route[0]}}_region_msg" class="alert text-danger text-sm"></em> <em id="{{$route[0]}}_region_msg" class="alert text-danger text-sm"></em>
</div> </div>
</div><br />
<div id="{{ $route[0] }}_div_catatan2" class="flex items-baseline flex-wrap lg:flex-nowrap gap-2.5">
<label class="form-label max-w-56">
Catatan
</label>
<div class="flex flex-wrap items-baseline w-full">
<textarea class="inputku textarea" name="{{$route[0]}}_catatan2" id="{{$route[0]}}_catatan2" placeholder="Catatan..." rows="6"></textarea>
<em id="{{$route[0]}}_catatan2_msg" class="alert text-danger text-sm"></em>
</div>
</div> </div>
<div class="flex justify-end mt-5"> <div class="flex justify-end mt-5">
<button type="button" class="btn btn-primary" id="toEdit"> <button type="button" class="btn btn-primary" id="toEdit">

View File

@@ -69,7 +69,7 @@
</label> </label>
<div class="flex flex-wrap items-baseline w-full"> <div class="flex flex-wrap items-baseline w-full">
<em id="" class="alert text-danger text-sm"></em> <em id="" class="alert text-danger text-sm"></em>
<div class="flex items-center justify-between flex-wrap my-2.5 gap-2"><a href="javascript:void(0)" class="badge badge-sm badge-outline">SPK_Dokumen.pdf &nbsp;&nbsp;<i class="ki-filled ki-cloud-download"></i></a></div> <div class="flex items-center justify-between flex-wrap my-2.5 gap-2"><a download id="pdfSPK" class="badge badge-sm badge-outline" target="_blank">Dokumen SPK.pdf &nbsp;&nbsp;<i class="ki-filled ki-cloud-download"></i></a></div>
</div> </div>
</div> </div>
<div id="{{ $route[0] }}_div_region" class="flex items-baseline flex-wrap lg:flex-nowrap gap-2.5"> <div id="{{ $route[0] }}_div_region" class="flex items-baseline flex-wrap lg:flex-nowrap gap-2.5">

View File

@@ -133,10 +133,10 @@
title: 'Status', title: 'Status',
render: (item, data) => { render: (item, data) => {
return `<div class="flex flex-nowrap justify-center"> return `<div class="flex flex-nowrap justify-center">
<a onclick="showRegistrasiFinal(${data.id})" class="btn btn-sm btn-icon btn-clear btn-primary" title="Detail"> <a onclick="showRegistrasiFinal(${data.permohonan.id})" class="btn btn-sm btn-icon btn-clear btn-primary" title="Detail">
<i class="ki-outline ki-eye"></i> <i class="ki-outline ki-eye"></i>
</a> </a>
<a class="btn btn-sm btn-icon btn-clear btn-info" title="Proses Penawaran" href="registrasifinal/${data.id}/edit"> <a class="btn btn-sm btn-icon btn-clear btn-info" title="Proses Penawaran" href="registrasifinal/${data.permohonan.id}/edit">
<i class="ki-outline ki-notepad-edit"></i> <i class="ki-outline ki-notepad-edit"></i>
</a> </a>
</div>`; </div>`;

View File

@@ -43,6 +43,8 @@
$("#textCodePenawaran").text(response.penawaran.code); $("#textCodePenawaran").text(response.penawaran.code);
$("#textStatusPenawaran").text(response.penawaran.status); $("#textStatusPenawaran").text(response.penawaran.status);
setRegionList(response.regions,0); setRegionList(response.regions,0);
// alert(response.datas.dokumen);
$("#pdfSPK").attr("href", response.datas.dokumen);
// success // success
// var message = response.message; // var message = response.message;

View File

@@ -45,10 +45,9 @@
Tujan Permohonan: Tujan Permohonan:
</h3> </h3>
<span class="text-2sm text-gray-700"> <span class="text-2sm text-gray-700">
{{ $permohonan->tujuanPenilaian->name }} {{ $permohonan->tujuanPenilaian->name }} {!! $permohonan->dokumen !!}
</span> </span>
</div> </div>
</div> </div>
</div> </div>

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

View File

@@ -1,27 +1,26 @@
@extends('layouts.main') @extends('layouts.main')
@section('breadcrumbs') @section('breadcrumbs')
{{ Breadcrumbs::render('basicdata.tujuan-penilaian') }} {{ Breadcrumbs::render('spk') }}
@endsection @endsection
@section('content') @section('content')
<div class="grid"> <div class="grid">
<div class="card card-grid min-w-full" data-datatable="false" data-datatable-page-size="5" data-datatable-state-save="false" id="tujuan-penilaian-table" data-api-url="{{ route('basicdata.tujuan-penilaian.datatables') }}"> <div class="card card-grid min-w-full" data-datatable="false" data-datatable-page-size="5" data-datatable-state-save="false" id="spk-table" data-api-url="{{ route('spk.datatables') }}">
<div class="card-header py-5 flex-wrap"> <div class="card-header py-5 flex-wrap">
<h3 class="card-title"> <h3 class="card-title">
SPK Menu Daftar SPK
</h3> </h3>
<div class="flex flex-wrap gap-2 lg:gap-5"> <div class="flex flex-wrap gap-2 lg:gap-5">
<div class="flex"> <div class="flex">
<label class="input input-sm"> <i class="ki-filled ki-magnifier"> </i> <label class="input input-sm"> <i class="ki-filled ki-magnifier"> </i>
<input placeholder="Search Doc SPK" id="search" type="text" value=""> <input placeholder="Search SPK" id="search" type="text" value="">
</label> </label>
</div> </div>
<!-- <div class="flex flex-wrap gap-2.5"> <div class="flex flex-wrap gap-2.5">
<div class="h-[24px] border border-r-gray-200"></div> <div class="h-[24px] border border-r-gray-200"></div>
<a class="btn btn-sm btn-light" href="{{ route('basicdata.tujuan-penilaian.export') }}"> Export to Excel </a> <a class="btn btn-sm btn-light" href="#"> Export to Excel </a>
<a class="btn btn-sm btn-primary" href="{{ route('basicdata.tujuan-penilaian.create') }}"> Tambah Tujuan Penilaian </a> </div>
</div> -->
</div> </div>
</div> </div>
<div class="card-body"> <div class="card-body">
@@ -32,12 +31,28 @@
<th class="w-14"> <th class="w-14">
<input class="checkbox checkbox-sm" data-datatable-check="true" type="checkbox"/> <input class="checkbox checkbox-sm" data-datatable-check="true" type="checkbox"/>
</th> </th>
<th class="min-w-[250px]" data-datatable-column="code"> <th class="min-w-[150px]" data-datatable-column="nomor_registrasi">
<span class="sort"> <span class="sort-label"> No SPK </span> <span class="sort"> <span class="sort-label"> Nomor Registrasi </span>
<span class="sort-icon"> </span> </span> <span class="sort-icon"> </span> </span>
</th> </th>
<th class="min-w-[250px]" data-datatable-column="name"> <th class="min-w-[150px]" data-datatable-column="code">
<span class="sort"> <span class="sort-label"> Perihal </span> <span class="sort"> <span class="sort-label"> Kode Penawaran </span>
<span class="sort-icon"> </span> </span>
</th>
<th class="min-w-[150px]" data-datatable-column="start_date">
<span class="sort"> <span class="sort-label"> Tanggal Penawaran </span>
<span class="sort-icon"> </span> </span>
</th>
<th class="min-w-[150px]" data-datatable-column="tujuan_penilaian_kjpp_id">
<span class="sort"> <span class="sort-label"> Tujuan Penilaian </span>
<span class="sort-icon"> </span> </span>
</th>
<th class="min-w-[150px]" data-datatable-column="nama_kjpp_sebelumnya">
<span class="sort"> <span class="sort-label">KJPP Data</span>
<span class="sort-icon"> </span> </span>
</th>
<th class="min-w-[150px]" data-datatable-column="status">
<span class="sort"> <span class="sort-label"> Status </span>
<span class="sort-icon"> </span> </span> <span class="sort-icon"> </span> </span>
</th> </th>
<th class="min-w-[50px] text-center" data-datatable-column="actions">Action</th> <th class="min-w-[50px] text-center" data-datatable-column="actions">Action</th>
@@ -62,87 +77,131 @@
@endsection @endsection
@push('scripts') @push('scripts')
<script src="https://cdn.jsdelivr.net/npm/sweetalert2@11"></script> <script type="text/javascript">
<script type="text/javascript"> function spkShow(regId)
function deleteData(data) { {
Swal.fire({ var url = "{{ url('show') }}/"+regId;
title: 'Are you sure?', $(location).attr('href',url);
text: "You won't be able to revert this!", }
icon: 'warning',
showCancelButton: true,
confirmButtonColor: '#3085d6',
cancelButtonColor: '#d33',
confirmButtonText: 'Yes, delete it!'
}).then((result) => {
if (result.isConfirmed) {
$.ajaxSetup({
headers: {
'X-CSRF-TOKEN': '{{ csrf_token() }}'
}
});
$.ajax(`basic-data/tujuan-penilaian/${data}`, { function spkCreate(regId)
type: 'DELETE' {
}).then((response) => { var url1 = "/spk/"+regId+"/edit";
swal.fire('Deleted!', 'User has been deleted.', 'success').then(() => { var url = "{{ url('/') }}"+url1;
window.location.reload(); $(location).attr('href',url);
}); }
}).catch((error) => {
console.error('Error:', error);
Swal.fire('Error!', 'An error occurred while deleting the file.', 'error');
});
}
})
}
</script>
<script type="module">
const element = document.querySelector('#tujuan-penilaian-table');
const searchInput = document.getElementById('search');
const apiUrl = element.getAttribute('data-api-url'); function formatTanggalIndonesia(dateString) {
const dataTableOptions = { const date = new Date(dateString);
apiEndpoint: apiUrl, const day = date.getDate().toString().padStart(2, '0');
pageSize: 5, const monthNames = ['Januari', 'Februari', 'Maret', 'April', 'Mei', 'Juni', 'Juli', 'Agustus', 'September', 'Oktober', 'November', 'Desember'];
columns: { const month = monthNames[date.getMonth()];
select: { const year = date.getFullYear();
render: (item, data, context) => { return `${day} ${month} ${year}`;
const checkbox = document.createElement('input'); }
checkbox.className = 'checkbox checkbox-sm'; </script>
checkbox.type = 'checkbox'; <script type="module">
checkbox.value = data.id.toString(); const element = document.querySelector('#spk-table');
checkbox.setAttribute('data-datatable-row-check', 'true'); const searchInput = document.getElementById('search');
return checkbox.outerHTML.trim();
}, const apiUrl = element.getAttribute('data-api-url');
const dataTableOptions = {
apiEndpoint: apiUrl,
pageSize: 5,
columns: {
select: {
render: (item, data, context) => {
const checkbox = document.createElement('input');
checkbox.className = 'checkbox checkbox-sm';
checkbox.type = 'checkbox';
checkbox.value = data.id.toString();
checkbox.setAttribute('data-datatable-row-check', 'true');
return checkbox.outerHTML.trim();
}, },
code: {
title: 'Code',
},
name: {
title: 'Tujuan Penilaian',
},
actions: {
title: 'Status',
render: (item, data) => {
return `<div class="flex flex-nowrap justify-center">
<a class="btn btn-sm btn-icon btn-clear btn-info" href="basic-data/tujuan-penilaian/${data.id}/edit">
<i class="ki-outline ki-notepad-edit"></i>
</a>
<a onclick="deleteData(${data.id})" class="delete btn btn-sm btn-icon btn-clear btn-danger">
<i class="ki-outline ki-trash"></i>
</a>
</div>`;
},
}
}, },
}; 'nomor_registrasi': {
title: 'Nomor Registrasi',
},
code: {
title: 'Kode Penawaran',
render: (item, data) => {
if(data.penawaran) {
return `${data.penawaran.code}`;
}
let dataTable = new KTDataTable(element, dataTableOptions); return '-';
// Custom search functionality },
searchInput.addEventListener('input', function () { },
const searchValue = this.value.trim(); date_range: {
dataTable.search(searchValue, true); title: 'Tanggal Penawaran',
render: (item, data) => {
const startDate = formatTanggalIndonesia(data.penawaran.start_date);
const endDate = formatTanggalIndonesia(data.penawaran.end_date);
return `${startDate} - ${endDate}`;
},
},
tujuan_penilaian_kjpp_name: {
title: 'Tujuan Penilaian',
render: (item, data) => {
if(data.penawaran.tujuan_penilaian_kjpp) {
return `${data.penawaran.tujuan_penilaian_kjpp.name}`;
}
}); return '-';
</script> },
},
nama_kjpp_sebelumnya: {
title: 'Nama KJPP Terpilih',
render: (item, data) => {
return `${data.penawaran.nama_kjpp_sebelumnya}`+'<br />'
+`${data.penawaran.biaya_kjpp_sebelumnya}`+'<br /> '
+`${data.penawaran.tanggal_penilaian_sebelumnya}`;
},
},
status: {
title: 'Status',
render: (item, data) => {
return `${data.penawaran.status}`.toUpperCase();
},
},
actions: {
title: 'Status',
render: (item, data) => {
var spkShow ='';
var spkCreate='';
if(!data.dokumen)
{
spkCreate=`<a class="btn btn-sm btn-icon btn-clear btn-info" title="Proses Penawaran" onclick="spkCreate(${data.penawaran.id})" >
<i class="ki-outline ki-notepad-edit"></i>
</a>`;
}
else
{
spkShow =`<div class="flex flex-nowrap justify-center">
<a href="/spk/${data.id}/download" class="btn btn-sm btn-icon btn-clear btn-primary" title="Download SPK">
<i class="ki-filled ki-cloud-download"></i>
</a> `;
spkCreate=`<a class="btn btn-sm btn-icon btn-clear btn-info" title="Buat SPK" onclick="spkCreate(${data.penawaran.id})" >
<i class="ki-outline ki-notepad-edit"></i>
</a>`;
}
return `<div class="flex flex-nowrap justify-center">`
+spkShow+spkCreate+
`</div>`;
},
}
},
};
let dataTable = new KTDataTable(element, dataTableOptions);
// Custom search functionality
searchInput.addEventListener('input', function () {
const searchValue = this.value.trim();
dataTable.search(searchValue, true);
});
</script>
@endpush @endpush

View File

@@ -0,0 +1,39 @@
@push('scripts')
@include('lpj::assetsku.includenya')
<script type="text/javascript">
function buildSPKPDF(penawaran_id) {
Swal.fire({
title: 'Are you sure?',
text: "Yakin Generate SPK ke PDF?",
icon: 'warning',
showCancelButton: true,
confirmButtonColor: '#3085d6',
cancelButtonColor: '#d33',
confirmButtonText: 'Yes'
}).then((result) => {
if (result.isConfirmed) {
$.ajaxSetup({
headers: {
'X-CSRF-TOKEN': '{{ csrf_token() }}'
}
});
$.ajax(`spk/${penawaran_id}`, {
type: 'PUT'
}).then((response) => {
// alert('ok Sukses');
swal.fire('Success!', 'File SPK berhasil di generate.', 'success').then(() => {
// window.location.reload();
});
$('#download-button').removeAttr('disabled');
$("#download-button").attr("href", response.spkpenawaran_path);
}).catch((error) => {
console.error('Error:', error);
Swal.fire('Error!', 'An error occurred while generate the PDF file.', 'error');
});
}
})
}
</script>
@endpush

View File

@@ -0,0 +1,192 @@
<div class=""max-w-4xl mx-auto bg-white rounded-lg shadow-md overflow-hidden">
<div class="py-4 px-6">
<h1 class="text-md font-medium text-gray-900">Identitas Debitur</h1>
</div>
<div class="flex items-baseline flex-wrap lg:flex-nowrap gap-2.5">
<label class="form-label max-w-56">Hubungan Calon Debitur</label>
<div class="flex flex-wrap items-baseline w-full">
<input type="text" name="bentuk_tanah" class="input"
placeholder="Masukkan Hubungan Calon Debitur">
@error('bentuk_tanah')
<em class="alert text-danger text-sm">{{ $message }}</em>
@enderror
</div>
</div>
<div class="py-4 px-6">
<h1 class="text-md font-medium text-gray-900">Lokasi Jaminan</h1>
</div>
<div class="grid gap-5">
@php
$inputDataLoaksi = [];
$inputDataLoaksi = [
['label' => 'Nama Jalan', 'index' => 0],
['label' => 'Perumahan/Gang', 'index' => 1],
['label' => 'Blok/Nomor', 'index' => 2],
['label' => 'Desa/Kelurahan', 'index' => 3],
['label' => 'Kecamatan', 'index' => 4],
['label' => 'Kota/Kotamadya', 'index' => 5],
['label' => 'Provinsi', 'index' => 6]
];
@endphp
@if (count($inputDataLoaksi) > 0)
@foreach ($inputDataLoaksi as $item)
<!-- Nomor Lambung -->
<div class="flex items-baseline flex-wrap lg:flex-nowrap gap-2.5">
<label class="form-label max-w-56">{{ $item['label'] }}</label>
<div class="flex flex-wrap items-baseline w-full">
<input type="text" name="bentuk_tanah" class="input"
placeholder="Masukkan {{ $item['label'] }}">
@error('bentuk_tanah')
<em class="alert text-danger text-sm">{{ $message }}</em>
@enderror
</div>
</div>
@endforeach
@endif
</div>
</div>
<div class=""max-w-4xl mx-auto bg-white rounded-lg shadow-md overflow-hidden">
<div class="py-4 px-6">
<h1 class="text-md font-medium text-gray-900">Data Data Jaminan</h1>
</div>
<div class="grid gap-5">
<div class="flex items-baseline flex-wrap lg:flex-nowrap gap-2.5">
<label class="form-label max-w-56">Model</label>
<div class="flex flex-wrap items-baseline w-full">
<select class="input tomselect w-full @error('hadapMataAngin') border-danger bg-danger-light @enderror"
name="hadapMataAngin">
<option value="">Select Model Kendaraan </option>
@if (isset($arahMataAngin))
@foreach ($arahMataAngin as $item)
<option value="{{ $item->name }}"
{{ old('hadapMataAngin') == $item->name ? 'selected' : '' }}>{{ $item->name }}
</option>
@endforeach
@endif
</select>
@error('hadapMataAngin')
<em class="alert text-danger text-sm">{{ $message }}</em>
@enderror
</div>
</div>
@php
$inputDataJaminan = [];
$inputDataJaminan = [
['label' => 'Nomor Lambung', 'index' => 0],
['label' => 'Model Unit', 'index' => 1],
['label' => 'Tahun Pembuatan', 'index' => 2],
['label' => 'Merk', 'index' => 3],
['label' => 'Negara Pembuat', 'index' => 4],
['label' => 'Tahun Pembelian', 'index' => 5],
['label' => 'Nomor Faktur/Invoice', 'index' => 6],
['label' => 'Nomor Kontrak Pembelian', 'index' => 7],
['label' => 'Nama Pemilik', 'index' => 8],
['label' => 'Alamaat Pemilik', 'index' => 9],
['label' => 'Nomor Asuransi', 'index' => 10],
['label' => 'Nomor Rangka', 'index' => 11],
['label' => 'Nomor Mesin', 'index' => 12],
['label' => 'Hour Mesin', 'index' => 13],
['label' => 'Overhaul Mesin', 'index' => 14],
];
@endphp
@if (count($inputDataJaminan) > 0)
@foreach ($inputDataJaminan as $item)
<!-- Nomor Lambung -->
<div class="flex items-baseline flex-wrap lg:flex-nowrap gap-2.5">
<label class="form-label max-w-56">{{ $item['label'] }}</label>
<div class="flex flex-wrap items-baseline w-full">
<input type="text" name="bentuk_tanah" class="input"
placeholder="Masukkan {{ $item['label'] }}">
@error('bentuk_tanah')
<em class="alert text-danger text-sm">{{ $message }}</em>
@enderror
</div>
</div>
@endforeach
@endif
</div>
</div>
<div class=""max-w-4xl mx-auto bg-white rounded-lg shadow-md overflow-hidden">
<div class="py-4 px-6">
<h1 class="text-md font-medium text-gray-900">Kondisi Objek Jaminan</h1>
</div>
<div class="grid gap-5">
<div class="flex items-baseline flex-wrap lg:flex-nowrap gap-2.5">
<label class="form-label max-w-56">Model</label>
<div class="flex flex-wrap items-baseline w-full">
<select class="input tomselect w-full @error('hadapMataAngin') border-danger bg-danger-light @enderror"
name="hadapMataAngin">
<option value="">Select Model Kendaraan </option>
@if (isset($arahMataAngin))
@foreach ($arahMataAngin as $item)
<option value="{{ $item->name }}"
{{ old('hadapMataAngin') == $item->name ? 'selected' : '' }}>{{ $item->name }}
</option>
@endforeach
@endif
</select>
@error('hadapMataAngin')
<em class="alert text-danger text-sm">{{ $message }}</em>
@enderror
</div>
</div>
@php
$kondisiObjeck = [];
$kondisiObjeck = [
['label' => 'Mesin dan Panel Instrument', 'index' => 0],
['label' => 'Fungsi mesin dan panel instrument', 'index' => 1],
['label' => 'Interior (jok, dll)', 'index' => 2],
['label' => 'Rangka dan Karoseri', 'index' => 3],
['label' => 'Ban', 'index' => 4],
['label' => 'Velg', 'index' => 5],
['label' => 'Air Conditioner', 'index' => 6],
['label' => 'Aksesoris Tambahan lainnya', 'index' => 7],
['label' => 'LCD', 'index' => 8],
['label' => 'Perlengkapan Keamanan', 'index' => 9],
['label' => 'Asuransi', 'index' => 10],
];
@endphp
@if (count($kondisiObjeck) > 0)
@foreach ($kondisiObjeck as $item)
<!-- Nomor Lambung -->
<div class="flex items-baseline flex-wrap lg:flex-nowrap gap-2.5">
<label class="form-label max-w-56">{{ $item['label'] }}</label>
<div class="flex flex-wrap items-baseline w-full">
<input type="text" name="bentuk_tanah" class="input"
placeholder="Masukkan {{ $item['label'] }}">
@error('bentuk_tanah')
<em class="alert text-danger text-sm">{{ $message }}</em>
@enderror
</div>
</div>
@endforeach
@endif
</div>
</div>

View File

@@ -1,5 +1,5 @@
<div class=""max-w-4xl mx-auto bg-white rounded-lg shadow-md overflow-hidden"> <div class=""max-w-4xl mx-auto bg-white rounded-lg shadow-md overflow-hidden">
<div class="bg-blue-600 text-white py-4 px-6"> <div class=" py-4 px-6">
<h1 class="text-md font-medium text-gray-900">Analisa Unit</h1> <h1 class="text-md font-medium text-gray-900">Analisa Unit</h1>
</div> </div>
<div class="grid gap-5"> <div class="grid gap-5">
@@ -104,8 +104,8 @@
class="input tomselect w-full @error('lantai') border-danger bg-danger-light @enderror" class="input tomselect w-full @error('lantai') border-danger bg-danger-light @enderror"
name="lantai"> name="lantai">
<option value="">Select Lantai</option> <option value="">Select Lantai</option>
@if (isset($posisiKavling)) @if (isset($lantai))
@foreach ($posisiKavling as $item) @foreach ($lantai as $item)
<option value="{{ $item->name }}" {{ old('lantai', isset($analisa) && optional($analisa->analisaUnit)->lantai) == $item->name ? 'selected' : '' }}>{{ $item->name }}</option> <option value="{{ $item->name }}" {{ old('lantai', isset($analisa) && optional($analisa->analisaUnit)->lantai) == $item->name ? 'selected' : '' }}>{{ $item->name }}</option>
@endforeach @endforeach
@endif @endif
@@ -126,8 +126,8 @@
class="input tomselect w-full @error('view') border-danger bg-danger-light @enderror" class="input tomselect w-full @error('view') border-danger bg-danger-light @enderror"
name="view"> name="view">
<option value="">Select View</option> <option value="">Select View</option>
@if (isset($kondisiFisikTanah)) @if (isset($viewUnit))
@foreach ($kondisiFisikTanah as $item) @foreach ($viewUnit as $item)
<option value="{{ $item->name }}" {{ old('view', isset($analisa) && optional($analisa->analisaUnit)->view) == $item->name ? 'selected' : '' }}>{{ $item->name }}</option> <option value="{{ $item->name }}" {{ old('view', isset($analisa) && optional($analisa->analisaUnit)->view) == $item->name ? 'selected' : '' }}>{{ $item->name }}</option>
@endforeach @endforeach
@endif @endif
@@ -146,8 +146,8 @@
class="input tomselect w-full @error('bentuk_unit') border-danger bg-danger-light @enderror" class="input tomselect w-full @error('bentuk_unit') border-danger bg-danger-light @enderror"
name="bentuk_unit"> name="bentuk_unit">
<option value="">Select Bentuk Unit</option> <option value="">Select Bentuk Unit</option>
@if (isset($kondisiFisikTanah)) @if (isset($bentukTanah))
@foreach ($kondisiFisikTanah as $item) @foreach ($bentukTanah as $item)
<option value="{{ $item->name }}" {{ old('bentuk_unit', isset($analisa) && optional($analisa->analisaUnit)->bentuk_unit) == $item->name ? 'selected' : '' }}>{{ $item->name }}</option> <option value="{{ $item->name }}" {{ old('bentuk_unit', isset($analisa) && optional($analisa->analisaUnit)->bentuk_unit) == $item->name ? 'selected' : '' }}>{{ $item->name }}</option>
@endforeach @endforeach
@endif @endif

View File

@@ -0,0 +1,232 @@
{{-- @if ($analisaType == 'tanah_bangunan') --}}
<div class=" bg-white rounded-lg shadow-md overflow-hidden">
<div class="y-4 px-6">
<h1 class="text-md font-medium text-gray-900">Analisa Bangunan</h1>
</div>
<div class="grid gap-5">
<div class="flex items-baseline flex-wrap lg:flex-nowrap gap-2.5">
<label class="form-label max-w-56">Luas Tanah</label>
<div class="flex flex-wrap items-baseline w-full">
<div class="grid grid-cols-2 md:grid-cols-3 gap-4 mt-2">
<label class="form-label flex items-center gap-3 text-nowrap">
<input type="radio" class="radio" name="luas_tanah_bagunan" value="sesuai"
{{ old('luas_tanah_bagunan') == 'sesuai' ? 'checked' : '' }}>
<span class="ml-2">Sesuai</span>
</label>
<label class="form-label flex items-center gap-2.5 text-nowrap">
<input type="radio" class="radio" name="luas_tanah_bagunan" value="tidak sesuai"
{{ old('luas_tanah_bagunan') == 'tidak sesuai' ? 'checked' : '' }}>
<span class="ml-2">Tidak Sesuai</span>
</label>
</div>
@error('luas_tanah_bagunan')
<em class="alert text-danger text-sm">{{ $message }}</em>
@enderror
</div>
</div>
<!-- Jenis Bangunan -->
<div class="flex items-baseline flex-wrap lg:flex-nowrap gap-2.5">
<label class="form-label max-w-56">Jenis Bangunan</label>
<div class="flex flex-wrap items-baseline w-full">
<select
class="input tomselect w-full @error('jenis_bangunan') border-danger bg-danger-light @enderror"
name="jenis_bangunan">
<option value="">Select Jenis Bangunan</option>
@if (isset($jenisBangunan))
@foreach ($jenisBangunan as $item)
<option value="{{ $item->name }}"
{{ old('jenis_bangunan', isset($analisa) && optional($analisa->analisaTanahBangunan)->jenis_bangunan) == $item->name ? 'selected' : '' }}>{{ $item->name }}
</option>
@endforeach
@endif
</select>
@error('jenis_bangunan')
<em class="alert text-danger text-sm">{{ $message }}</em>
@enderror
</div>
</div>
<!-- Kondisi Bangunan -->
<div class="flex items-baseline flex-wrap lg:flex-nowrap gap-2.5">
<label class="form-label max-w-56">Kondisi Bangunan</label>
<div class="flex flex-wrap items-baseline w-full">
<select
class="input tomselect w-full @error('kondisi_bangunan') border-danger bg-danger-light @enderror"
name="kondisi_bangunan">
<option value="">Select Kondisi Bangunan</option>
@if (isset($kondisiBangunan))
@foreach ($kondisiBangunan as $item)
<option value="{{ $item->name }}"
{{ old('kondisi_bangunan', isset($analisa) && optional($analisa->analisaTanahBangunan)->kondisi_bangunan) == $item->name ? 'selected' : '' }}>{{ $item->name }}
</option>
@endforeach
@endif
</select>
@error('kondisi_bangunan')
<em class="alert text-danger text-sm">{{ $message }}</em>
@enderror
</div>
</div>
<!-- Sifat Bangunan -->
<div class="flex items-baseline flex-wrap lg:flex-nowrap gap-2.5">
<label class="form-label max-w-56"> Sifat Bangunan</label>
<div class="flex flex-wrap items-baseline w-full">
<select
class="input tomselect w-full @error('sifat_bangunan') border-danger bg-danger-light @enderror"
name="sifat_bangunan">
<option value="">Select Sifat Bangunan</option>
@if (isset($sifatBangunan))
@foreach ($sifatBangunan as $item)
<option value="{{ $item->name }}"
{{ old('sifat_bangunan', isset($analisa) && optional($analisa->analisaTanahBangunan)->sifat_bangunan) == $item->name ? 'selected' : '' }}>{{ $item->name }}
</option>
@endforeach
@endif
</select>
@error('sifat_bangunan')
<em class="alert text-danger text-sm">{{ $message }}</em>
@enderror
</div>
</div>
<!-- Spek Bangunan -->
<div class="gap-2.5">
<div class="flex items-baseline flex-wrap lg:flex-nowrap gap-2.5">
<label class="form-label max-w-56">Spek Bangunan</label>
<div class="flex flex-wrap items-baseline w-full" id="spek-bangunan-container">
<div class="spek-bangunan w-full gap-4">
<input type="hidden" name="nama_bagunan[]" value="Bangunan">
<div class="grid grid-cols-2 md:grid-cols-3 gap-4 mt-2 w-full">
@if (@isset($spekKategoriBagunan))
@foreach ($spekKategoriBagunan as $item)
<div>
<label
class="form-label flex items-center gap-3 text-nowrap">{{ $item->name }}</label>
<div class="flex flex-wrap items-baseline w-full">
<select
class="input tomselect w-full @error('name') border-danger bg-danger-light @enderror"
name="name[]">
<option value="">Select {{ $item->name }}</option>
@foreach ($spekBangunan as $spek)
@if ($spek->spek_kategori_bangunan_id == $item->id)
<option value="{{ $spek->name }}"
{{ old('name') == $spek->name ? 'selected' : '' }}>
{{ $spek->name }}
</option>
@endif
@endforeach
</select>
@error('name')
<em class="alert text-danger text-sm">{{ $message }}</em>
@enderror
</div>
</div>
@endforeach
@endif
</div>
<button type="button"
class="mt-2 btn btn-danger btn-outline btn-xs delete-button">Hapus</button>
</div>
</div>
</div>
<div class="flex justify-end">
<button class="btn btn-xs btn-primary" type="button" id="addBagunan">
tambah bangunan
<i class="ki-filled ki-plus"></i>
</button>
</div>
</div>
<!-- Sarana pelengkap -->
<div class="flex items-baseline flex-wrap lg:flex-nowrap gap-2.5">
<label class="form-label max-w-56">Sarana pelengkap</label>
<div class="flex flex-wrap items-baseline w-full">
<select
class="input tomselect w-full @error('sarana_pelengkap') border-danger bg-danger-light @enderror"
name="sarana_pelengkap">
<option value="">Select Posisi Kavling</option>
@if (isset($saranaPelengkap))
@foreach ($saranaPelengkap as $item)
<option value="{{ $item->name }}"
{{ old('sarana_pelengkap', isset($analisa) && optional($analisa->analisaTanahBangunan)->sarana_pelengkap) == $item->name ? 'selected' : '' }}>{{ $item->name }}
</option>
@endforeach
@endif
</select>
@error('sarana_pelengkap')
<em class="alert text-danger text-sm">{{ $message }}</em>
@enderror
</div>
</div>
</div>
</div>
{{-- @endif --}}
@push('scripts')
<script>
const spekBangunanContainer = document.getElementById('spek-bangunan-container');
function updateDeleteButtonsVisibility() {
const allDeleteButtons = spekBangunanContainer.querySelectorAll('.delete-button');
// Only show the delete buttons if there are more than one form
allDeleteButtons.forEach(button => {
if (spekBangunanContainer.querySelectorAll('.spek-bangunan').length > 1) {
button.style.display = 'inline-block';
} else {
button.style.display = 'none';
}
});
}
document.getElementById('addBagunan').addEventListener('click', function() {
const newDiv = spekBangunanContainer.querySelector('.spek-bangunan').cloneNode(true);
// Clear the selected values of the cloned input fields
newDiv.querySelectorAll('select').forEach(select => {
select.value = '';
});
// Append the cloned div to the container
spekBangunanContainer.appendChild(newDiv);
// Add event listener to the delete button in the cloned div
newDiv.querySelector('.delete-button').addEventListener('click', function() {
spekBangunanContainer.removeChild(newDiv);
updateDeleteButtonsVisibility();
});
// Update delete buttons visibility
updateDeleteButtonsVisibility();
});
// Initial delete button visibility
updateDeleteButtonsVisibility();
// Add delete functionality to the initial form
spekBangunanContainer.querySelectorAll('.delete-button').forEach(button => {
button.addEventListener('click', function() {
const spekBangunan = this.closest('.spek-bangunan');
// Make sure not to delete the last remaining form
if (spekBangunanContainer.querySelectorAll('.spek-bangunan').length > 1) {
spekBangunan.remove();
updateDeleteButtonsVisibility();
}
});
});
</script>
@endpush

View File

@@ -5,6 +5,7 @@
@endsection --}} @endsection --}}
@section('content') @section('content')
<div class="w-full grid gap-5 lg:gap-7.5 mx-auto"> <div class="w-full grid gap-5 lg:gap-7.5 mx-auto">
<div class="card min-w-full"> <div class="card min-w-full">
<div class="card min-w-full"> <div class="card min-w-full">
@@ -120,7 +121,6 @@
</div> </div>
<div class="card"> <div class="card">
<div class="card-body"> <div class="card-body">
<form action="{{ route('surveyor.storeFoto') }}" method="POST" class="grid gap-5" <form action="{{ route('surveyor.storeFoto') }}" method="POST" class="grid gap-5"
@@ -167,6 +167,8 @@
} }
@endphp @endphp
<input type="hidden" name="analisa_type" value="{{ $analisaType }}"> <input type="hidden" name="analisa_type" value="{{ $analisaType }}">
<div class="bg-white rounded-lg shadow-md"> <div class="bg-white rounded-lg shadow-md">
<div class="bg-blue-600 text-white py-4 px-6 flex items-center justify-between"> <div class="bg-blue-600 text-white py-4 px-6 flex items-center justify-between">
<h1 class="text-md font-medium text-gray-900">Rute Menuju Lokasi</h1> <h1 class="text-md font-medium text-gray-900">Rute Menuju Lokasi</h1>
@@ -177,25 +179,33 @@
@if (isset($fotoJaminan)) @if (isset($fotoJaminan))
@foreach ($fotoJaminan->ruteJaminan as $item) @foreach ($fotoJaminan->ruteJaminan as $item)
@if (isset($item->foto_rute))
<img src="{{ asset('storage/' . old('foto_rute', $item->foto_rute)) }}"
alt="Gambar Pendamping" style="width: 12rem;">
@endif
<div id="inputContainerRute" style="margin-top: 10px"> <div id="inputContainerRute" style="margin-top: 10px">
<div class="flex w-full items-center justify-center gap-4 mb-4"> <div class="flex w-full items-center justify-center gap-4 mb-4">
<label class="form-label max-w-56"> <label class="form-label max-w-56">
<span class="form-label">Foto Rute Menuju Lokasi</span> <span class="form-label">Foto Rute Menuju Lokasi</span>
</label> </label>
<div class="w-full grid gap-5"> <div class="w-full grid gap-5">
@if (isset($item->foto_rute))
<img src="{{ asset('storage/' . old('foto_rute', $item->foto_rute)) }}" <div class="input-group w-full flex gap-2">
alt="Gambar Pendamping" style="width: 12rem;"> <input class="name_rute" type="hidden" name="name_rute[]" value="rute">
@endif <input id="inputRute" type="file" name="foto_rute[]"
<input class="name_rute" type="hidden" name="name_rute[]" value="rute"> class="file-input file-input-bordered w-full" accept="image/*"
<input id="inputRute" type="file" name="foto_rute[]" capture="camera">
class="file-input file-input-bordered w-full" accept="image/*" capture="camera"> <button type="button" id="btnCamera" class="btn btn-light"
<button type="button" class="btn btn-danger btn-sm delete-btn" data-modal-toggle="#cameraModal">
style="display: none;" id="btnDelete"> <i class="ki-outline ki-abstract-33"></i> Camera
<i class="ki-filled ki-trash"></i> </button>
</button> </div>
</div>
<button type="button" class="btn btn-danger btn-sm delete-btn"
style="display: none;" id="btnDelete">
<i class="ki-filled ki-trash"></i>
</button>
</div>
</div> </div>
@error('foto_rute.*') @error('foto_rute.*')
<span class="alert text-danger text-sm">{{ $message }}</span> <span class="alert text-danger text-sm">{{ $message }}</span>
@@ -211,9 +221,17 @@
<label class="form-label max-w-56"> <label class="form-label max-w-56">
<span class="form-label">Foto Rute Menuju Lokasi</span> <span class="form-label">Foto Rute Menuju Lokasi</span>
</label> </label>
<input class="name_rute" type="hidden" name="name_rute[]" value="rute">
<input id="inputRute" type="file" name="foto_rute[]" <div class="input-group w-full flex gap-2">
class="file-input file-input-bordered w-full" accept="image/*" capture="camera"> <input class="name_rute" type="hidden" name="name_rute[]" value="rute">
<input id="inputRute" type="file" name="foto_rute[]"
class="file-input file-input-bordered w-full" accept="image/*"
capture="camera">
<button type="button" id="btnCamera" class="btn btn-light"
data-modal-toggle="#cameraModal">
<i class="ki-outline ki-abstract-33"></i> Camera
</button>
</div>
<button type="button" class="btn btn-danger btn-sm delete-btn" <button type="button" class="btn btn-danger btn-sm delete-btn"
style="display: none;" id="btnDelete"> style="display: none;" id="btnDelete">
<i class="ki-filled ki-trash"></i> <i class="ki-filled ki-trash"></i>
@@ -231,7 +249,7 @@
<div class="bg-white rounded-lg shadow-md"> <div class="bg-white rounded-lg shadow-md">
<div class="bg-blue-600 text-white py-4 px-6 flex items-center justify-between"> <div class=" text-white py-4 px-6 flex items-center justify-between">
<h1 class="text-md font-medium text-gray-900">Objek Jaminan</h1> <h1 class="text-md font-medium text-gray-900">Objek Jaminan</h1>
</div> </div>
@php @php
@@ -267,9 +285,16 @@
alt="{{ $view['label'] }}" class="mb-2 w-48 h-auto" alt="{{ $view['label'] }}" class="mb-2 w-48 h-auto"
style="width: 12rem;"> style="width: 12rem;">
@endif @endif
<input type="file" name="foto_objek[]" <div class="input-group w-full flex gap-2">
class="file-input file-input-bordered w-full" accept="image/*" <input type="file" name="foto_objek[]"
capture="camera"> class="file-input file-input-bordered w-full" accept="image/*"
capture="camera">
<button type="button" id="btnCamera" class="btn btn-light"
data-modal-toggle="#cameraModal">
<i class="ki-outline ki-abstract-33"></i> Camera
</button>
</div>
<textarea name="name_objek[]" class="textarea" rows="3" placeholder="Deskripsi">{{ isset($fotoJaminan) && isset($fotoJaminan->objekJaminan[$view['index']]) ? str_replace($view['label'] . ': ', '', $fotoJaminan->objekJaminan[$view['index']]->name_objek) : '' }}</textarea> <textarea name="name_objek[]" class="textarea" rows="3" placeholder="Deskripsi">{{ isset($fotoJaminan) && isset($fotoJaminan->objekJaminan[$view['index']]) ? str_replace($view['label'] . ': ', '', $fotoJaminan->objekJaminan[$view['index']]->name_objek) : '' }}</textarea>
</div> </div>
</div> </div>
@@ -289,7 +314,7 @@
<div class="flex flex-wrap gap-4 w-full"> <div class="flex flex-wrap gap-4 w-full">
<div class="bg-blue-600 text-white py-4 px-6 flex items-center justify-between w-full"> <div class=" text-white py-4 px-6 flex items-center justify-between w-full">
<label class="form-label"> <label class="form-label">
<span class="form-label">Lantai</span> <span class="form-label">Lantai</span>
</label> </label>
@@ -336,10 +361,16 @@
<label class="form-label max-w-56"> <label class="form-label max-w-56">
<span class="form-label">Foto Lantai 1</span> <span class="form-label">Foto Lantai 1</span>
</label> </label>
<input type="hidden" name="name_lantai_unit[]" value="lantai"> <div class="input-group w-full flex gap-2">
<input id="inputLantai" type="file" name="foto_lantai_unit[]" <input type="hidden" name="name_lantai_unit[]" value="lantai">
class="file-input file-input-bordered w-full" accept="image/*" <input id="inputLantai" type="file" name="foto_lantai_unit[]"
capture="camera"> class="file-input file-input-bordered w-full" accept="image/*"
capture="camera">
<button type="button" id="btnCamera" class="btn btn-light"
data-modal-toggle="#cameraModal">
<i class="ki-outline ki-abstract-33"></i> Camera
</button>
</div>
<button type="button" class="btn btn-danger btn-sm delete-btn" <button type="button" class="btn btn-danger btn-sm delete-btn"
style="display: none;" id="btnDelete"> style="display: none;" id="btnDelete">
<i class="ki-filled ki-trash"></i> <i class="ki-filled ki-trash"></i>
@@ -377,10 +408,16 @@
<img src="{{ asset('storage/' . old('foto_lingkungan', $item->foto_lingkungan)) }}" <img src="{{ asset('storage/' . old('foto_lingkungan', $item->foto_lingkungan)) }}"
alt="Gambar Pendamping" style="width: 12rem;"> alt="Gambar Pendamping" style="width: 12rem;">
@endif @endif
<input type="hidden" name="name_lingkungan[]" value="lingkungan"> <div class="input-group w-full flex gap-2">
<input id="inputLingkungan" type="file" name="foto_lingkungan[]" <input type="hidden" name="name_lingkungan[]" value="lingkungan">
class="file-input file-input-bordered w-full" accept="image/*" <input id="inputLingkungan" type="file" name="foto_lingkungan[]"
capture="camera"> class="file-input file-input-bordered w-full" accept="image/*"
capture="camera">
<button type="button" id="btnCamera" class="btn btn-light"
data-modal-toggle="#cameraModal">
<i class="ki-outline ki-abstract-33"></i> Camera
</button>
</div>
<button type="button" class="btn btn-danger btn-sm delete-btn" <button type="button" class="btn btn-danger btn-sm delete-btn"
style="display: none;" id="btnDelete"> style="display: none;" id="btnDelete">
<i class="ki-filled ki-trash"></i> <i class="ki-filled ki-trash"></i>
@@ -401,9 +438,18 @@
<label class="form-label max-w-56"> <label class="form-label max-w-56">
<span class="form-label">Lingkungan</span> <span class="form-label">Lingkungan</span>
</label> </label>
<input type="hidden" name="name_lingkungan[]" value="lingkungan"> <div class="input-group w-full flex gap-2">
<input id="inputLingkungan" type="file" name="foto_lingkungan[]" <input type="hidden" name="name_lingkungan[]" value="lingkungan">
class="file-input file-input-bordered w-full" accept="image/*" capture="camera"> <input id="inputLingkungan" type="file" name="foto_lingkungan[]"
class="file-input file-input-bordered w-full" accept="image/*"
capture="camera">
<button type="button" id="btnCamera" class="btn btn-light"
data-modal-toggle="#cameraModal">
<i class="ki-outline ki-abstract-33"></i> Camera
</button>
</div>
<button type="button" class="btn btn-danger btn-sm delete-btn" <button type="button" class="btn btn-danger btn-sm delete-btn"
style="display: none;" id="btnDelete"> style="display: none;" id="btnDelete">
<i class="ki-filled ki-trash"></i> <i class="ki-filled ki-trash"></i>
@@ -436,8 +482,16 @@
<img src="{{ asset('storage/' . old('pendamping', $fotoJaminan->pendamping)) }}" <img src="{{ asset('storage/' . old('pendamping', $fotoJaminan->pendamping)) }}"
alt="Gambar Pendamping" style="width: 12rem;"> alt="Gambar Pendamping" style="width: 12rem;">
@endif @endif
<input id="inputPendamping" type="file" name="pendamping" <div class="input-group w-full flex gap-2">
class="file-input file-input-bordered w-full" accept="image/*" capture="camera"> <input id="inputPendamping" type="file" name="pendamping"
class="file-input file-input-bordered w-full" accept="image/*"
capture="camera">
<button type="button" id="btnCamera" class="btn btn-light"
data-modal-toggle="#cameraModal">
<i class="ki-outline ki-abstract-33"></i> Camera
</button>
</div>
<button type="button" class="btn btn-danger btn-sm delete-btn" <button type="button" class="btn btn-danger btn-sm delete-btn"
style="display: none;" id="btnDelete"> style="display: none;" id="btnDelete">
<i class="ki-filled ki-trash"></i> <i class="ki-filled ki-trash"></i>
@@ -459,11 +513,266 @@
</div> </div>
</div> </div>
</div> </div>
<!-- Modal Kamera -->
<div class="modal fade" data-modal="true" id="cameraModal" data-backdrop="" data-keyboard="false">
<div class="modal-content">
<div class="modal-header">
<h3 class="modal-title">Ambil Foto</h3>
<button class="btn btn-xs btn-icon btn-light" data-modal-dismiss="true" id="closeModal">
<i class="ki-outline ki-cross"></i>
</button>
</div>
<!-- Camera Interface -->
<div class="modal-body">
<div class="camera-container relative">
<video id="video" class="w-full h-auto" autoplay playsinline></video>
<canvas id="canvas" class="hidden w-full h-auto"></canvas>
<canvas id="drawingCanvas" class="hidden absolute top-0 left-0 w-full h-full"></canvas>
<div id="textOverlay" class="position-absolute top-0 left-0 w-100 h-100 pointer-events-none">
<!-- Text elements will be added here dynamically -->
</div>
</div>
<div class="modal-footer mt-2">
<div id="cameraControls" class="flex justify-center gap-2 mt-4">
<button id="startButton" class="btn btn-primary">
<i class="ki-outline ki-camera"></i> Start Camera
</button>
<button id="takePhotoButton" class="btn btn-success" disabled>
<i class="ki-outline ki-photograph"></i> Ambil Foto
</button>
<button id="switchButton" class="btn btn-info" disabled>
<i class="ki-outline ki-arrows-circle"></i> Switch Camera
</button>
</div>
<!-- Editor Controls -->
<div id="editorControls" class=" flex flex-wrap gap-2 mt-4">
<div class="drawing-tools flex gap-2">
<button class="tool-btn btn btn-sm" data-tool="brush">
<i class="ki-filled ki-brush"></i>
</button>
<button class="tool-btn btn btn-sm" data-tool="rectangle">
<i class="ki-filled ki-frame"></i>
</button>
<button class="btn btn-light btn-sm tool-btn" data-tool="arrow">
<i class="ki-duotone ki-arrow-right fs-2"></i>
</button>
<button class="tool-btn btn btn-sm" data-tool="circle">
<i class="ki-filled ki-mouse-circle"></i>
</button>
<button class="tool-btn btn btn-sm" data-tool="text">
<i class="ki-filled ki-text"></i>
</button>
</div>
<div class="drawing-settings flex gap-2">
<input type="color" id="colorPicker" class="w-8 h-8 rounded">
<div class="flex items-center gap-2">
<input type="range" id="brushSize" min="1" max="20" value="5"
class="range range-sm">
<span id="brushSizeValue" class="text-sm">5px</span>
</div>
<input type="text" id="textInput" class="input" placeholder="Enter text">
<button type="button" class="btn btn-primary" id="confirmTextBtn">Add Text</button>
</div>
<div class="history-controls flex gap-2">
<button id="undoButton" class="btn btn-sm">
<i class="ki-filled ki-arrows-loop"></i>
</button>
<button id="resetButton" class="btn btn-sm">
<i class="ki-outline ki-trash"></i>
</button>
</div>
<div class="final-controls flex gap-2">
<button type="button" class="btn btn-light btn-sm" data-modal-dismiss="true">Cancel</button>
<button id="backButton" class="btn btn-warning btn-sm">
<i class="ki-outline ki-arrow-left"></i> Kembali
</button>
<button id="saveButton" class="btn btn-success btn-sm">
<i class="ki-outline ki-check"></i> Simpan
</button>
</div>
</div>
</div>
</div>
</div>
</div>
@endsection @endsection
@push('scripts') @push('scripts')
@include('lpj::surveyor.js.camera-editor')
<script> <script>
const style = document.createElement('style');
style.textContent = `
.draggable-text {
z-index: 1000;
}
.draggable-text:hover {
outline: 1px dashed #666;
}
`;
document.head.appendChild(style);
document.addEventListener('DOMContentLoaded', function() {
// Initialize camera editor
const editor = new UniversalCameraEditor();
// Get all camera buttons
const cameraButtons = document.querySelectorAll('#btnCamera');
const modal = document.getElementById('cameraModal');
const closeModal = document.getElementById('closeModal');
// Current input field to update
let currentInputField = null;
// Confirm text button
// Handle camera button click
cameraButtons.forEach(button => {
button.addEventListener('click', function(e) {
e.preventDefault();
const inputContainer = this.closest('.input-group');
currentInputField = inputContainer.querySelector('input[type="file"]');
modal.classList.remove('hidden');
modal.classList.add('modal-open');
editor.startCamera();
});
});
closeModal.addEventListener('click', function() {
modal.classList.add('hidden');
editor.closeCamera();
});
// Override save function
editor.saveAndUpload = async function() {
try {
// Membuat canvas akhir
const finalCanvas = document.createElement('canvas');
finalCanvas.width = this.canvas.width;
finalCanvas.height = this.canvas.height;
const ctx = finalCanvas.getContext('2d');
// Menggambar foto asli dan hasil edit di canvas akhir
ctx.drawImage(this.canvas, 0, 0);
ctx.drawImage(this.drawingCanvas, 0, 0);
// Konversi canvas ke Blob dan buat file
finalCanvas.toBlob(async (blob) => {
const file = new File([blob], `camera_photo_${Date.now()}.jpg`, {
type: "image/jpeg"
});
// Membuat FileList dan memperbarui field input
const dataTransfer = new DataTransfer();
dataTransfer.items.add(file);
if (currentInputField) {
currentInputField.files = dataTransfer.files;
// Trigger event "change" untuk memperbarui tampilan
const event = new Event('change', {
bubbles: true
});
currentInputField.dispatchEvent(event);
// Tampilkan preview jika container preview ada
const previewContainer = currentInputField.closest('.input-group')
.querySelector('.preview-container');
if (previewContainer) {
const img = document.createElement('img');
img.src = URL.createObjectURL(file);
img.className = 'w-full h-32 object-cover rounded-lg';
previewContainer.innerHTML = ''; // Bersihkan container preview
previewContainer.appendChild(img); // Tambah gambar preview
}
}
// Menutup modal
const modal = document.getElementById('cameraModal');
modal.classList.remove('show');
modal.style.display = 'none';
modal.setAttribute('aria-hidden', 'true');
document.body.classList.remove('modal-open');
// Menghapus backdrop modal jika ada
const backdrop = document.querySelector('.modal-backdrop');
if (backdrop) {
backdrop.remove();
}
// Hentikan stream kamera
if (editor.stream) {
editor.stream.getTracks().forEach(track => track.stop());
editor.stream = null;
}
// Mengatur ulang ke kondisi awal (reset kamera)
editor.closeCamera()
}, 'image/jpeg', 0.8);
} catch (error) {
console.error('Error saving photo:', error);
alert('Error saving photo. Please try again.');
}
};
});
// Preview for regular file input change
document.addEventListener('change', function(e) {
if (e.target && e.target.type === 'file') {
const file = e.target.files[0];
if (file && file.type.startsWith('image/')) {
const previewContainer = e.target.closest('.input-group').querySelector('.preview-container');
if (previewContainer) {
const img = document.createElement('img');
img.src = URL.createObjectURL(file);
img.className = 'w-full h-32 object-cover rounded-lg';
previewContainer.innerHTML = '';
previewContainer.appendChild(img);
}
}
}
});
// Handle escape key
document.addEventListener('keydown', function(e) {
if (e.key === 'Escape') {
const modal = document.getElementById('cameraModal');
if (modal.classList.contains('modal-open')) {
modal.classList.remove('modal-open');
modal.classList.add('hidden');
if (editor.stream) {
editor.stream.getTracks().forEach(track => track.stop());
}
}
}
});
document.addEventListener('DOMContentLoaded', function() { document.addEventListener('DOMContentLoaded', function() {
// Generic function to handle adding new input and delete functionality // Generic function to handle adding new input and delete functionality

View File

@@ -139,48 +139,62 @@
<input type="hidden" name="jenis_jaminan_id" value="{{ request('jenis_jaminan') }}"> <input type="hidden" name="jenis_jaminan_id" value="{{ request('jenis_jaminan') }}">
@php @php
$analisaType = 'unknown'; $analisaType = 'unknown';
$data = [ $data = [
'tanah' => 'Tanah', 'tanah' => 'Tanah',
'unit_rumah' => 'Rumah Tinggal / Ruko (Unit) / Apartemen (Unit) / Gudang', 'unit_rumah' => 'Rumah Tinggal / Ruko (Unit) / Apartemen (Unit) / Gudang',
'tanah_bangunan' => 'Kawasan Industrial / Komersil / Residensial - Perumahan', 'tanah_bangunan' => 'Kawasan Industrial / Komersil / Residensial - Perumahan',
'unit_gedung' => 'Gedung Apartement / Kantor / Condotel (Strata Title)', 'unit_gedung' => 'Gedung Apartement / Kantor / Condotel (Strata Title)',
'tanah_bangunan' => 'Mall', 'tanah_bangunan' => 'Mall',
]; ];
if (isset($analisa->id)) {
if (isset($analisa->id)) { $analisaType = $analisa->type;
$analisaType = $analisa->type; } else {
} else { foreach ($data as $key => $value) {
foreach ($data as $key => $value) { if (
if (isset($jenisJaminanData) && isset($jenisJaminanData) &&
trim(strtolower($jenisJaminanData)) === trim(strtolower($value))) { trim(strtolower($jenisJaminanData)) === trim(strtolower($value))
$analisaType = $key; ) {
break; $analisaType = $key;
break;
}
} }
} }
} if ($analisaType === 'tanah') {
if ($analisaType === 'tanah') { $analisaType = 'tanah_bangunan';
$analisaType = 'tanah_bangunan'; }
}
if ($analisaType === 'unit_rumah' || $analisaType === 'unit_gedung') {
$analisaType = 'unit';
}
if ($analisaType === 'unit_rumah' || $analisaType === 'unit_gedung') {
$analisaType = 'unit';
}
@endphp @endphp
<input type="hidden" name="action" value="{{ $analisaType }}"> <input type="hidden" name="action" value="{{ $analisaType }}">
<input type="hidden" name="type" value="{{ $analisaType }}"> <input type="hidden" name="type" value="{{ $analisaType }}">
@if ($analisaType == 'tanah_bangunan') @if ($analisaType == 'tanah_bangunan')
@include('lpj::surveyor.components.tanah-bangunan') @include('lpj::surveyor.components.tanah')
@else @elseif($analisaType == 'unit')
@include('lpj::surveyor.components.apartemen-kantor') @include('lpj::surveyor.components.apartemen-kantor')
@elseif($analisaType == 'alat-berat')
@include('lpj::surveyor.components.alat-berat')
@elseif($analisaType == 'mesin')
@include('lpj::surveyor.components.mesin')
@elseif($analisaType == 'kapal')
@include('lpj::surveyor.components.kapal')
@elseif($analisaType == 'kendaraan')
@include('lpj::surveyor.components.kendaraan')
@endif @endif
@if($analisaType == 'tanah_bangunan')
@include('lpj::surveyor.components.bangunan')
@endif
<div class=" bg-white rounded-lg shadow-md overflow-hidden"> @if ($analisaType != 'mesin' && $analisaType != 'kapal')
<div class="bg-green-600 text-white py-4 px-6"> <div class=" bg-white rounded-lg overflow-hidden">
<div class=" text-white py-4 px-6">
<h1 class="text-md font-medium text-gray-900">Analisis Lingkungan</h1> <h1 class="text-md font-medium text-gray-900">Analisis Lingkungan</h1>
</div> </div>
<div class="grid gap-5"> <div class="grid gap-5">
@@ -244,9 +258,9 @@
<select <select
class="input tomselect w-full @error('lalu_lintas') border-danger bg-danger-light @enderror" class="input tomselect w-full @error('lalu_lintas') border-danger bg-danger-light @enderror"
name="lalu_lintas"> name="lalu_lintas">
<option value="">Select PLalulintas Depan Lokasi</option> <option value="">Select Lalulintas Depan Lokasi</option>
@if (isset($konturTanah)) @if (isset($laluLintasLokasi))
@foreach ($konturTanah as $item) @foreach ($laluLintasLokasi as $item)
<option value="{{ $item->name }}" <option value="{{ $item->name }}"
{{ old('lalu_lintas', isset($analisa->analisaLingkungan) ? $analisa->analisaLingkungan->lalu_lintas : '') == $item->name ? 'selected' : '' }}> {{ old('lalu_lintas', isset($analisa->analisaLingkungan) ? $analisa->analisaLingkungan->lalu_lintas : '') == $item->name ? 'selected' : '' }}>
{{ $item->name }}</option> {{ $item->name }}</option>
@@ -268,8 +282,9 @@
class="input tomselect w-full @error('gol_mas_sekitar') border-danger bg-danger-light @enderror" class="input tomselect w-full @error('gol_mas_sekitar') border-danger bg-danger-light @enderror"
name="gol_mas_sekitar"> name="gol_mas_sekitar">
<option value="">Select Golongan Hidup Sekitar</option> <option value="">Select Golongan Hidup Sekitar</option>
@if (isset($konturTanah))
@foreach ($konturTanah as $item) @if (isset($golMasySekitar))
@foreach ($golMasySekitar as $item)
<option value="{{ $item->name }}" <option value="{{ $item->name }}"
{{ old('gol_mas_sekitar', isset($analisa->analisaLingkungan) ? $analisa->analisaLingkungan->gol_mas_sekitar : '') == $item->name ? 'selected' : '' }}> {{ old('gol_mas_sekitar', isset($analisa->analisaLingkungan) ? $analisa->analisaLingkungan->gol_mas_sekitar : '') == $item->name ? 'selected' : '' }}>
{{ $item->name }}</option> {{ $item->name }}</option>
@@ -291,8 +306,8 @@
class="input tomselect w-full @error('tingkat_keramaian') border-danger bg-danger-light @enderror" class="input tomselect w-full @error('tingkat_keramaian') border-danger bg-danger-light @enderror"
name="tingkat_keramaian"> name="tingkat_keramaian">
<option value="">Select Tingkat Keramaian</option> <option value="">Select Tingkat Keramaian</option>
@if (isset($konturTanah)) @if (isset($tingkatKeramaian))
@foreach ($konturTanah as $item) @foreach ($tingkatKeramaian as $item)
<option value="{{ $item->name }}" <option value="{{ $item->name }}"
{{ old('tingkat_keramaian', isset($analisa->analisaLingkungan) ? $analisa->analisaLingkungan->tingkat_keramaian : '') == $item->name ? 'selected' : '' }}> {{ old('tingkat_keramaian', isset($analisa->analisaLingkungan) ? $analisa->analisaLingkungan->tingkat_keramaian : '') == $item->name ? 'selected' : '' }}>
{{ $item->name }}</option> {{ $item->name }}</option>
@@ -446,9 +461,10 @@
</div> </div>
</div> </div>
</div> </div>
@endif
<div class=" bg-white rounded-lg shadow-md overflow-hidden"> <div class=" bg-white rounded-lg overflow-hidden">
<div class="bg-blue-600 text-white py-4 px-6"> <div class=" py-4 px-6">
<h1 class="text-md font-medium text-gray-900">Analisis Fakta</h1> <h1 class="text-md font-medium text-gray-900">Analisis Fakta</h1>
</div> </div>
<div class="grid gap-5"> <div class="grid gap-5">
@@ -472,6 +488,7 @@
</div> </div>
</div> </div>
@if ($analisaType != 'mesin' && $analisaType != 'kapal')
<div class="flex items-baseline flex-wrap lg:flex-nowrap gap-2.5"> <div class="flex items-baseline flex-wrap lg:flex-nowrap gap-2.5">
<label class="form-label max-w-56">Rute Menuju</label> <label class="form-label max-w-56">Rute Menuju</label>
<div class="flex flex-wrap items-baseline w-full"> <div class="flex flex-wrap items-baseline w-full">
@@ -539,14 +556,17 @@
@enderror @enderror
</div> </div>
</div> </div>
@endif
</div> </div>
</div> </div>
<div class="container mx-auto "> <!-- Informasi Tata Ruang -->
@if ($analisaType != 'mesin' && $analisaType != 'kapal')
<div class="">
<!-- Header --> <!-- Header -->
<div class="bg-blue-600 text-white py-4 px-6"> <div class="py-4 px-6">
<h1 class="text-md font-medium text-gray-900">Informasi Dinas Tata Ruang</h1> <h1 class="text-md font-medium text-gray-900">Informasi Dinas Tata Ruang</h1>
</div> </div>
@@ -656,15 +676,47 @@
@enderror @enderror
</div> </div>
</div> </div>
<div class="flex items-baseline flex-wrap lg:flex-nowrap gap-2.5">
<label class="form-label max-w-56">
<span class="form-label">Gistaru</span>
</label>
<div class="input-group w-full flex gap-2">
<input class="name_rute" type="hidden" name="name_rute[]" value="rute">
<input id="inputRute" type="file" name="foto_rute"
class="file-input file-input-bordered w-full" accept="image/*">
<button id="gistaru" type="button" class="btn btn-light"
onclick="openModal('gistaru')">
<i class="ki-outline ki-abstract-33"></i> Gistaru
</button>
</div>
</div>
<div class="flex items-baseline flex-wrap lg:flex-nowrap gap-2.5">
<label class="form-label max-w-56">
<span class="form-label">Bumi</span>
</label>
<div class="input-group w-full flex gap-2">
<input class="name_rute" type="hidden" name="name_rute" value="rute">
<input id="inputRute" type="file" name="foto_rute"
class="file-input file-input-bordered w-full" accept="image/*" capture="camera">
<button id="bumi" type="button" class="btn btn-light"
onclick="openModal('bumi')">
<i class="ki-outline ki-abstract-33"></i> Bumi
</button>
</div>
</div>
</div> </div>
<!-- Peta Section --> <!-- Peta Section -->
<div class="mt-2" style="margin-top: 20px"> <div class="mt-2" style="margin-top: 20px">
<input type="hidden" name="lat" id="lat" <input type="hidden" name="lat" id="lat"
value="{{ old('lat', isset($analisa->analisaFakta) ? $analisa->analisaFakta->lat : '') }}"> value="{{ old('lat', isset($analisa->analisaFakta) ? $analisa->analisaFakta->lat : '') }}">
<input type="hidden" name="lng" id="lng" <input type="hidden" name="lng" id="lng"
value="{{ old('lng', isset($analisa->analisaFakta) ? $analisa->analisaFakta->lng : '') }}"> value="{{ old('lng', isset($analisa->analisaFakta) ? $analisa->analisaFakta->lng : '') }}">
<div class="bg-info border p-6 rounded-lg shadow-lg flex items-center justify-center" <div class=" border p-6 rounded-lg shadow-lg flex items-center justify-center"
style="height: 300px"> style="height: 300px">
<iframe id="mapFrame" frameborder="0" style="width: 100%; height: 100%;"></iframe> <iframe id="mapFrame" frameborder="0" style="width: 100%; height: 100%;"></iframe>
</div> </div>
@@ -706,6 +758,7 @@
</div> </div>
</div> </div>
</div> </div>
@endif
<div class="flex justify-end gap-2" style="margin-right: 20px; margin-top: 20px"> <div class="flex justify-end gap-2" style="margin-right: 20px; margin-top: 20px">
<button type="submit" class="btn btn-success"> <button type="submit" class="btn btn-success">
@@ -717,8 +770,74 @@
</div> </div>
</div> </div>
<div class="modal fade" data-modal="true" id="modal" data-backdrop="static" data-keyboard="false">
<div class="modal-content">
<div class="modal-header">
<h3 class="modal-title">Kunjungan</h3>
<button class="btn btn-xs btn-icon btn-light" data-modal-dismiss="true">
<i class="ki-outline ki-cross"></i>
</button>
</div>
<div class="modal-body" id="screenshotContainer" style="height: 500px">
<iframe id="mapFrameGis" style="width: 100%; height: 100%;"></iframe>
</div>
<div class="modal-footer flex justify-end">
<button id="takeScreenshot" class="btn btn-success">Take Screenshot</button>
</div>
</div>
</div>
@endsection @endsection
@push('scripts') @push('scripts')
<script>
function getMap(params) {
const iframe = document.getElementById('mapFrameGis');
const maps = [
'https://gistaru.atrbpn.go.id/rtronline/',
'https://bhumi.atrbpn.go.id/peta'
];
iframe.src = maps[params];
}
function openModal(type) {
const modalGistaru = document.getElementById('gistaru');
const modalBumi = document.getElementById('bumi');
if (type === 'bumi') {
modalBumi.setAttribute('data-modal-toggle', '#modal');
}else if (type === 'gistaru') {
modalGistaru.setAttribute('data-modal-toggle', '#modal');
}
getMap(type === 'gistaru' ? 0 : 1);
}
document.getElementById('takeScreenshot').addEventListener('click', () => {
const screenshotContainer = document.getElementById('screenshotContainer');
const canvas = document.createElement('canvas');
canvas.width = screenshotContainer.offsetWidth;
canvas.height = screenshotContainer.offsetHeight;
const ctx = canvas.getContext('2d');
ctx.drawImage(document.getElementById('mapFrame'), 0, 0, canvas.width, canvas.height);
const dataURL = canvas.toDataURL('image/jpeg');
// Tampilkan gambar di atas input
const inputRute = document.getElementById('inputRute');
const img = document.createElement('img');
img.src = dataURL;
img.style.maxWidth = '100%';
img.style.maxHeight = '200px';
inputRute.parentNode.insertBefore(img, inputRute);
// Isi input dengan data URL gambar
inputRute.value = dataURL;
});
</script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/html2canvas/1.4.1/html2canvas.min.js"></script>
<script> <script>
// Fungsi untuk mengambil lokasi pengguna // Fungsi untuk mengambil lokasi pengguna
function getUserLocation() { function getUserLocation() {

View File

@@ -0,0 +1,488 @@
<div class=""max-w-4xl mx-auto bg-white rounded-lg shadow-md overflow-hidden">
<div class="py-4 px-6">
<h1 class="text-md font-medium text-gray-900">Identitas Debitur</h1>
</div>
<div class="flex items-baseline flex-wrap lg:flex-nowrap gap-2.5">
<label class="form-label max-w-56">Hubungan Calon Debitur</label>
<div class="flex flex-wrap items-baseline w-full">
<input type="text" name="bentuk_tanah" class="input"
placeholder="Masukkan Hubungan Calon Debitur">
@error('bentuk_tanah')
<em class="alert text-danger text-sm">{{ $message }}</em>
@enderror
</div>
</div>
<div class="py-4 px-6">
<h1 class="text-md font-medium text-gray-900">Lokasi Jaminan</h1>
</div>
<div class="grid gap-5">
@php
$inputDataLoaksi = [];
$inputDataLoaksi = [
['label' => 'Nama Jalan', 'index' => 0],
['label' => 'Perumahan/Gang', 'index' => 1],
['label' => 'Blok/Nomor', 'index' => 2],
['label' => 'Desa/Kelurahan', 'index' => 3],
['label' => 'Kecamatan', 'index' => 4],
['label' => 'Kota/Kotamadya', 'index' => 5],
['label' => 'Provinsi', 'index' => 6]
];
@endphp
@if (count($inputDataLoaksi) > 0)
@foreach ($inputDataLoaksi as $item)
<!-- Nomor Lambung -->
<div class="flex items-baseline flex-wrap lg:flex-nowrap gap-2.5">
<label class="form-label max-w-56">{{ $item['label'] }}</label>
<div class="flex flex-wrap items-baseline w-full">
<input type="text" name="bentuk_tanah" class="input"
placeholder="Masukkan {{ $item['label'] }}">
@error('bentuk_tanah')
<em class="alert text-danger text-sm">{{ $message }}</em>
@enderror
</div>
</div>
@endforeach
@endif
</div>
</div>
<div class=""max-w-4xl mx-auto bg-white rounded-lg shadow-md overflow-hidden">
<div class="py-4 px-6">
<h1 class="text-md font-medium text-gray-900">Data Data Jaminan</h1>
</div>
<div class="grid gap-5">
<div class="flex items-baseline flex-wrap lg:flex-nowrap gap-2.5">
<label class="form-label max-w-56">Jenis</label>
<div class="flex flex-wrap items-baseline w-full">
<select class="input tomselect w-full @error('hadapMataAngin') border-danger bg-danger-light @enderror"
name="hadapMataAngin">
<option value="">Select Jenis</option>
@if (isset($arahMataAngin))
@foreach ($arahMataAngin as $item)
<option value="{{ $item->name }}"
{{ old('hadapMataAngin') == $item->name ? 'selected' : '' }}>{{ $item->name }}
</option>
@endforeach
@endif
</select>
@error('hadapMataAngin')
<em class="alert text-danger text-sm">{{ $message }}</em>
@enderror
</div>
</div>
<div class="flex items-baseline flex-wrap lg:flex-nowrap gap-2.5">
<label class="form-label max-w-56">Size</label>
<div class="flex flex-wrap items-baseline w-full">
<select class="input tomselect w-full @error('hadapMataAngin') border-danger bg-danger-light @enderror"
name="hadapMataAngin">
<option value="">Select Size</option>
@if (isset($arahMataAngin))
@foreach ($arahMataAngin as $item)
<option value="{{ $item->name }}"
{{ old('hadapMataAngin') == $item->name ? 'selected' : '' }}>{{ $item->name }}
</option>
@endforeach
@endif
</select>
@error('hadapMataAngin')
<em class="alert text-danger text-sm">{{ $message }}</em>
@enderror
</div>
</div>
<div class="flex items-baseline flex-wrap lg:flex-nowrap gap-2.5">
<label class="form-label max-w-56">Kondisi</label>
<div class="flex flex-wrap items-baseline w-full">
<select class="input tomselect w-full @error('hadapMataAngin') border-danger bg-danger-light @enderror"
name="hadapMataAngin">
<option value="">Select Jenis</option>
@if (isset($arahMataAngin))
@foreach ($arahMataAngin as $item)
<option value="{{ $item->name }}"
{{ old('hadapMataAngin') == $item->name ? 'selected' : '' }}>{{ $item->name }}
</option>
@endforeach
@endif
</select>
@error('hadapMataAngin')
<em class="alert text-danger text-sm">{{ $message }}</em>
@enderror
</div>
</div>
<div class="flex items-baseline flex-wrap lg:flex-nowrap gap-2.5">
<label class="form-label max-w-56">Klasifikasi</label>
<div class="flex flex-wrap items-baseline w-full">
<select class="input tomselect w-full @error('hadapMataAngin') border-danger bg-danger-light @enderror"
name="hadapMataAngin">
<option value="">Select Jenis</option>
@if (isset($arahMataAngin))
@foreach ($arahMataAngin as $item)
<option value="{{ $item->name }}"
{{ old('hadapMataAngin') == $item->name ? 'selected' : '' }}>{{ $item->name }}
</option>
@endforeach
@endif
</select>
@error('hadapMataAngin')
<em class="alert text-danger text-sm">{{ $message }}</em>
@enderror
</div>
</div>
@php
$inputDataJaminan = [];
$inputDataJaminan = [
['label' => 'Nama Kapal', 'index' => 0],
['label' => 'Pemilik Kapal', 'index' => 1],
['label' => 'Bendera', 'index' => 2],
['label' => 'Nomor Tanda Selar', 'index' => 3],
['label' => 'Kapal', 'index' => 4],
['label' => 'Galangan', 'index' => 5],
['label' => 'Kapal/Shipyard', 'index' => 6],
['label' => 'Tahun Pembuatan', 'index' => 7],
['label' => 'Tahun Lanuncing', 'index' => 8],
['label' => 'DWT (ton)', 'index' => 9],
['label' => 'LWT (ton)', 'index' => 10],
['label' => 'Gross Tonnage (ton)', 'index' => 11],
['label' => 'Net Tonnage (ton)', 'index' => 12],
['label' => 'Tenaga Mesin (HP)', 'index' => 13],
['label' => 'LOA', 'index' => 14],
['label' => 'LBP', 'index' => 15],
['label' => 'Beam', 'index' => 16],
['label' => 'Depth', 'index' => 17],
['label' => 'Draft', 'index' => 18],
];
@endphp
@if (count($inputDataJaminan) > 0)
@foreach ($inputDataJaminan as $item)
<!-- Nomor Lambung -->
<div class="flex items-baseline flex-wrap lg:flex-nowrap gap-2.5">
<label class="form-label max-w-56">{{ $item['label'] }}</label>
<div class="flex flex-wrap items-baseline w-full">
<input type="text" name="bentuk_tanah" class="input"
placeholder="Masukkan {{ $item['label'] }}">
@error('bentuk_tanah')
<em class="alert text-danger text-sm">{{ $message }}</em>
@enderror
</div>
</div>
@endforeach
@endif
</div>
<div class="flex justify-end" style="margin-top: 10px">
<button class="btn btn-xs btn-primary" type="button" id="addBagunan">
tambah mesin
<i class="ki-filled ki-plus"></i>
</button>
</div>
</div>
<div class=""max-w-4xl mx-auto bg-white rounded-lg shadow-md overflow-hidden">
<div class="py-4 px-6">
<h1 class="text-md font-medium text-gray-900">Struktur Kapal</h1>
</div>
<div class="grid gap-5">
@php
$inputDataLoaksi = [];
$inputDataLoaksi = [
['label' => 'Lambung Kapal', 'index' => 0],
['label' => 'Dek', 'index' => 1],
['label' => 'Struktur Rangka', 'index' => 2],
['label' => 'Palka', 'index' => 3],
['label' => 'Pondasi Mesin', 'index' => 4],
['label' => 'Area Mesin', 'index' => 5],
['label' => 'Cat dan Korosi', 'index' => 6],
['label' => 'Sistem Pengelasan', 'index' => 7]
];
@endphp
@if (count($inputDataLoaksi) > 0)
@foreach ($inputDataLoaksi as $item)
<!-- Nomor Lambung -->
<div class="flex items-baseline flex-wrap lg:flex-nowrap gap-2.5">
<label class="form-label max-w-56">{{ $item['label'] }}</label>
<div class="flex flex-wrap items-baseline w-full">
<input type="text" name="bentuk_tanah" class="input"
placeholder="Masukkan {{ $item['label'] }}">
@error('bentuk_tanah')
<em class="alert text-danger text-sm">{{ $message }}</em>
@enderror
</div>
</div>
@endforeach
@endif
<div class="flex items-baseline flex-wrap lg:flex-nowrap gap-2.5">
<label class="form-label max-w-56">Deskripsi/Keterangan Lain Lain </label>
<div class="flex flex-wrap items-baseline w-full">
<textarea name="deskripsi" id="" class="textarea"></textarea>
@error('deskripsi')
<em class="alert text-danger text-sm">{{ $message }}</em>
@enderror
</div>
</div>
</div>
</div>
{{-- Peralatan Keselamatan --}}
<div class=""max-w-4xl mx-auto bg-white rounded-lg shadow-md overflow-hidden">
<div class="py-4 px-6">
<h1 class="text-md font-medium text-gray-900">Peralatan Keselamatan</h1>
</div>
<div class="grid gap-5">
@php
$inputDataLoaksi = [];
$inputDataLoaksi = [
['label' => 'Sekoci/Lifeboat', 'index' => 0],
['label' => 'Jaket Pelampung', 'index' => 1],
['label' => 'Alat Pemadam', 'index' => 2],
['label' => 'Rambu Darurat', 'index' => 3],
['label' => 'Sistem Alarm', 'index' => 4],
['label' => 'Sistem Pencegah', 'index' => 5],
['label' => 'Kebaran', 'index' => 6],
['label' => 'Lampu Darurat', 'index' => 7]
];
@endphp
@if (count($inputDataLoaksi) > 0)
@foreach ($inputDataLoaksi as $item)
<!-- Nomor Lambung -->
<div class="flex items-baseline flex-wrap lg:flex-nowrap gap-2.5">
<label class="form-label max-w-56">{{ $item['label'] }}</label>
<div class="flex flex-wrap items-baseline w-full">
<input type="text" name="bentuk_tanah" class="input"
placeholder="Masukkan {{ $item['label'] }}">
@error('bentuk_tanah')
<em class="alert text-danger text-sm">{{ $message }}</em>
@enderror
</div>
</div>
@endforeach
@endif
<div class="flex items-baseline flex-wrap lg:flex-nowrap gap-2.5">
<label class="form-label max-w-56">Deskripsi/Keterangan Lain Lain </label>
<div class="flex flex-wrap items-baseline w-full">
<textarea name="deskripsi" id="" class="textarea"></textarea>
@error('deskripsi')
<em class="alert text-danger text-sm">{{ $message }}</em>
@enderror
</div>
</div>
</div>
</div>
{{-- Sistwm Navigasi dan Komunikasi --}}
<div class=""max-w-4xl mx-auto bg-white rounded-lg shadow-md overflow-hidden">
<div class="py-4 px-6">
<h1 class="text-md font-medium text-gray-900">Sistem Navigasi dan Komunikasi</h1>
</div>
<div class="grid gap-5">
@php
$inputDataLoaksi = [];
$inputDataLoaksi = [
['label' => 'Gps', 'index' => 0],
['label' => 'Radat', 'index' => 1],
['label' => 'Radio Komunikasi', 'index' => 2],
['label' => 'Lampu Navigasi', 'index' => 3],
['label' => 'Sistem Kendali otomatis', 'index' => 4],
['label' => 'Kompas', 'index' => 5],
];
@endphp
@if (count($inputDataLoaksi) > 0)
@foreach ($inputDataLoaksi as $item)
<!-- Nomor Lambung -->
<div class="flex items-baseline flex-wrap lg:flex-nowrap gap-2.5">
<label class="form-label max-w-56">{{ $item['label'] }}</label>
<div class="flex flex-wrap items-baseline w-full">
<input type="text" name="bentuk_tanah" class="input"
placeholder="Masukkan {{ $item['label'] }}">
@error('bentuk_tanah')
<em class="alert text-danger text-sm">{{ $message }}</em>
@enderror
</div>
</div>
@endforeach
@endif
<div class="flex items-baseline flex-wrap lg:flex-nowrap gap-2.5">
<label class="form-label max-w-56">Deskripsi/Keterangan Lain Lain </label>
<div class="flex flex-wrap items-baseline w-full">
<textarea name="deskripsi" id="" class="textarea"></textarea>
@error('deskripsi')
<em class="alert text-danger text-sm">{{ $message }}</em>
@enderror
</div>
</div>
</div>
</div>
{{-- Sistwm Mesin dan Penggerak Kapal --}}
<div class=""max-w-4xl mx-auto bg-white rounded-lg shadow-md overflow-hidden">
<div class="py-4 px-6">
<h1 class="text-md font-medium text-gray-900">Sistem Mesin dan Penggerak Kapal</h1>
</div>
<div class="grid gap-5">
@php
$inputDataLoaksi = [];
$inputDataLoaksi = [
['label' => 'Mesin Utama', 'index' => 0],
['label' => 'Mesin Bantu', 'index' => 1],
['label' => 'Pompa Pendingin', 'index' => 2],
['label' => 'Sistem Pelumasan', 'index' => 3],
['label' => 'Propeller', 'index' => 4],
['label' => 'Sistem Kelistrikan', 'index' => 5],
];
@endphp
@if (count($inputDataLoaksi) > 0)
@foreach ($inputDataLoaksi as $item)
<!-- Nomor Lambung -->
<div class="flex items-baseline flex-wrap lg:flex-nowrap gap-2.5">
<label class="form-label max-w-56">{{ $item['label'] }}</label>
<div class="flex flex-wrap items-baseline w-full">
<input type="text" name="bentuk_tanah" class="input"
placeholder="Masukkan {{ $item['label'] }}">
@error('bentuk_tanah')
<em class="alert text-danger text-sm">{{ $message }}</em>
@enderror
</div>
</div>
@endforeach
@endif
<div class="flex items-baseline flex-wrap lg:flex-nowrap gap-2.5">
<label class="form-label max-w-56">Deskripsi/Keterangan Lain Lain </label>
<div class="flex flex-wrap items-baseline w-full">
<textarea name="deskripsi" id="" class="textarea"></textarea>
@error('deskripsi')
<em class="alert text-danger text-sm">{{ $message }}</em>
@enderror
</div>
</div>
</div>
</div>
{{-- Sistwm kelistrikan dan Elektronik --}}
<div class=""max-w-4xl mx-auto bg-white rounded-lg shadow-md overflow-hidden">
<div class="py-4 px-6">
<h1 class="text-md font-medium text-gray-900">Sistem Kelistrikan dan Elektronik</h1>
</div>
<div class="grid gap-5">
@php
$inputDataLoaksi = [];
$inputDataLoaksi = [
['label' => 'Lampu Navigasi', 'index' => 0],
['label' => 'Sistem Penerangan', 'index' => 1],
['label' => 'Sistem Panel Distribusi', 'index' => 2],
['label' => 'Kabel dan Perangkat Pendukung', 'index' => 3],
];
@endphp
@if (count($inputDataLoaksi) > 0)
@foreach ($inputDataLoaksi as $item)
<!-- Nomor Lambung -->
<div class="flex items-baseline flex-wrap lg:flex-nowrap gap-2.5">
<label class="form-label max-w-56">{{ $item['label'] }}</label>
<div class="flex flex-wrap items-baseline w-full">
<input type="text" name="bentuk_tanah" class="input"
placeholder="Masukkan {{ $item['label'] }}">
@error('bentuk_tanah')
<em class="alert text-danger text-sm">{{ $message }}</em>
@enderror
</div>
</div>
@endforeach
@endif
<div class="flex items-baseline flex-wrap lg:flex-nowrap gap-2.5">
<label class="form-label max-w-56">Deskripsi/Keterangan Lain Lain </label>
<div class="flex flex-wrap items-baseline w-full">
<textarea name="deskripsi" id="" class="textarea"></textarea>
@error('deskripsi')
<em class="alert text-danger text-sm">{{ $message }}</em>
@enderror
</div>
</div>
</div>
</div>
{{-- Linkungan dan Kebersihan Kapal --}}
<div class=""max-w-4xl mx-auto bg-white rounded-lg shadow-md overflow-hidden">
<div class="py-4 px-6">
<h1 class="text-md font-medium text-gray-900">Linkungan dan Kebersihan Kapal</h1>
</div>
<div class="grid gap-5">
@php
$inputDataLoaksi = [];
$inputDataLoaksi = [
['label' => 'Kebersihan Dek Luar', 'index' => 0],
['label' => 'Tangki Limbah', 'index' => 1],
['label' => 'Sistem Pengelolaan Limbah', 'index' => 2],
['label' => 'Pengelolaan Air Ballast', 'index' => 3],
];
@endphp
@if (count($inputDataLoaksi) > 0)
@foreach ($inputDataLoaksi as $item)
<!-- Nomor Lambung -->
<div class="flex items-baseline flex-wrap lg:flex-nowrap gap-2.5">
<label class="form-label max-w-56">{{ $item['label'] }}</label>
<div class="flex flex-wrap items-baseline w-full">
<input type="text" name="bentuk_tanah" class="input"
placeholder="Masukkan {{ $item['label'] }}">
@error('bentuk_tanah')
<em class="alert text-danger text-sm">{{ $message }}</em>
@enderror
</div>
</div>
@endforeach
@endif
<div class="flex items-baseline flex-wrap lg:flex-nowrap gap-2.5">
<label class="form-label max-w-56">Deskripsi/Keterangan Lain Lain </label>
<div class="flex flex-wrap items-baseline w-full">
<textarea name="deskripsi" id="" class="textarea"></textarea>
@error('deskripsi')
<em class="alert text-danger text-sm">{{ $message }}</em>
@enderror
</div>
</div>
</div>
</div>

View File

@@ -0,0 +1,160 @@
<div class=""max-w-4xl mx-auto bg-white rounded-lg shadow-md overflow-hidden">
<div class="py-4 px-6">
<h1 class="text-md font-medium text-gray-900">Order Penilaian</h1>
</div>
<div class="flex items-baseline flex-wrap lg:flex-nowrap gap-2.5">
<label class="form-label max-w-56">Tanggal Survey</label>
<div class="flex flex-wrap items-baseline w-full">
<input type="date" name="tanggal_survey" class="input" placeholder="Masukkan Hubungan Calon Debitur">
@error('bentuk_tanah')
<em class="alert text-danger text-sm">{{ $message }}</em>
@enderror
</div>
</div>
</div>
<div class=""max-w-4xl mx-auto bg-white rounded-lg shadow-md overflow-hidden">
<div class="py-4 px-6">
<h1 class="text-md font-medium text-gray-900">Identitas Debitur</h1>
</div>
<div class="grid gap-5">
<div class="flex items-baseline flex-wrap lg:flex-nowrap gap-2.5">
<label class="form-label max-w-56">Nama Wakil Debitur</label>
<div class="flex flex-wrap items-baseline w-full">
<input type="text" name="bentuk_tanah" class="input" placeholder="Masukkan Hubungan Calon Debitur">
@error('bentuk_tanah')
<em class="alert text-danger text-sm">{{ $message }}</em>
@enderror
</div>
</div>
<div class="flex items-baseline flex-wrap lg:flex-nowrap gap-2.5">
<label class="form-label max-w-56">Hubungan Calon Debitur</label>
<div class="flex flex-wrap items-baseline w-full">
<input type="text" name="bentuk_tanah" class="input" placeholder="Masukkan Hubungan Calon Debitur">
@error('bentuk_tanah')
<em class="alert text-danger text-sm">{{ $message }}</em>
@enderror
</div>
</div>
</div>
<div class="py-4 px-6">
<h1 class="text-md font-medium text-gray-900">Lokasi Jaminan</h1>
</div>
<div class="grid gap-5">
@php
$inputDataLoaksi = [];
$inputDataLoaksi = [
['label' => 'Nama Jalan', 'index' => 0],
['label' => 'Perumahan/Gang', 'index' => 1],
['label' => 'Blok/Nomor', 'index' => 2],
['label' => 'Desa/Kelurahan', 'index' => 3],
['label' => 'Kecamatan', 'index' => 4],
['label' => 'Kota/Kotamadya', 'index' => 5],
['label' => 'Provinsi', 'index' => 6],
];
@endphp
@if (count($inputDataLoaksi) > 0)
@foreach ($inputDataLoaksi as $item)
<!-- Nomor Lambung -->
<div class="flex items-baseline flex-wrap lg:flex-nowrap gap-2.5">
<label class="form-label max-w-56">{{ $item['label'] }}</label>
<div class="flex flex-wrap items-baseline w-full">
<input type="text" name="bentuk_tanah" class="input"
placeholder="Masukkan {{ $item['label'] }}">
@error('bentuk_tanah')
<em class="alert text-danger text-sm">{{ $message }}</em>
@enderror
</div>
</div>
@endforeach
@endif
</div>
</div>
<div class=""max-w-4xl mx-auto bg-white rounded-lg shadow-md overflow-hidden">
<div class="py-4 px-6">
<h1 class="text-md font-medium text-gray-900">Data Data Jaminan</h1>
</div>
<div class="grid gap-5">
<div class="flex items-baseline flex-wrap lg:flex-nowrap gap-2.5">
<label class="form-label max-w-56">BPKB</label>
<div class="flex flex-wrap items-baseline w-full">
<input type="text" name="tanggal_survey" class="input" placeholder="BPKP">
@error('hadapMataAngin')
<em class="alert text-danger text-sm">{{ $message }}</em>
@enderror
</div>
</div>
<div class="flex items-baseline flex-wrap lg:flex-nowrap gap-2.5">
<label class="form-label max-w-56">STNK</label>
<div class="flex flex-wrap items-baseline w-full">
<input type="text" name="tanggal_survey" class="input" placeholder="STNK">
@error('hadapMataAngin')
<em class="alert text-danger text-sm">{{ $message }}</em>
@enderror
</div>
</div>
<div class="flex items-baseline flex-wrap lg:flex-nowrap gap-2.5">
<label class="form-label max-w-56">Deskripsi kendaraan sesuai dokument</label>
<div class="flex flex-wrap items-baseline w-full">
@error('hadapMataAngin')
<em class="alert text-danger text-sm">{{ $message }}</em>
@enderror
</div>
</div>
@php
$inputDataJaminan = [];
$inputDataJaminan = [
['label' => 'Tipe/Model', 'index' => 0],
['label' => 'Merek', 'index' => 1],
['label' => 'Tahun Pembuatan', 'index' => 2],
['label' => 'Negara Pembuat', 'index' => 3],
['label' => 'Kondisi Mesin', 'index' => 4],
];
@endphp
@if (count($inputDataJaminan) > 0)
@foreach ($inputDataJaminan as $item)
<!-- Nomor Lambung -->
<div class="flex items-baseline flex-wrap lg:flex-nowrap gap-2.5">
<label class="form-label max-w-56">{{ $item['label'] }}</label>
<div class="flex flex-wrap items-baseline w-full">
<input type="text" name="bentuk_tanah" class="input"
placeholder="Masukkan {{ $item['label'] }}">
@error('bentuk_tanah')
<em class="alert text-danger text-sm">{{ $message }}</em>
@enderror
</div>
</div>
@endforeach
@endif
<div class="flex items-baseline flex-wrap lg:flex-nowrap gap-2.5">
<label class="form-label max-w-56">Deskripsi/Keterangan Lain Lain </label>
<div class="flex flex-wrap items-baseline w-full">
<textarea name="deskripsi" id="" class="textarea"></textarea>
@error('deskripsi')
<em class="alert text-danger text-sm">{{ $message }}</em>
@enderror
</div>
</div>
</div>
</div>

View File

@@ -0,0 +1,133 @@
<div class=""max-w-4xl mx-auto bg-white rounded-lg shadow-md overflow-hidden">
<div class="py-4 px-6">
<h1 class="text-md font-medium text-gray-900">Identitas Debitur</h1>
</div>
<div class="flex items-baseline flex-wrap lg:flex-nowrap gap-2.5">
<label class="form-label max-w-56">Hubungan Calon Debitur</label>
<div class="flex flex-wrap items-baseline w-full">
<input type="text" name="bentuk_tanah" class="input"
placeholder="Masukkan Hubungan Calon Debitur">
@error('bentuk_tanah')
<em class="alert text-danger text-sm">{{ $message }}</em>
@enderror
</div>
</div>
<div class="py-4 px-6">
<h1 class="text-md font-medium text-gray-900">Lokasi Jaminan</h1>
</div>
<div class="grid gap-5">
@php
$inputDataLoaksi = [];
$inputDataLoaksi = [
['label' => 'Nama Jalan', 'index' => 0],
['label' => 'Perumahan/Gang', 'index' => 1],
['label' => 'Blok/Nomor', 'index' => 2],
['label' => 'Desa/Kelurahan', 'index' => 3],
['label' => 'Kecamatan', 'index' => 4],
['label' => 'Kota/Kotamadya', 'index' => 5],
['label' => 'Provinsi', 'index' => 6]
];
@endphp
@if (count($inputDataLoaksi) > 0)
@foreach ($inputDataLoaksi as $item)
<!-- Nomor Lambung -->
<div class="flex items-baseline flex-wrap lg:flex-nowrap gap-2.5">
<label class="form-label max-w-56">{{ $item['label'] }}</label>
<div class="flex flex-wrap items-baseline w-full">
<input type="text" name="bentuk_tanah" class="input"
placeholder="Masukkan {{ $item['label'] }}">
@error('bentuk_tanah')
<em class="alert text-danger text-sm">{{ $message }}</em>
@enderror
</div>
</div>
@endforeach
@endif
</div>
</div>
<div class=""max-w-4xl mx-auto bg-white rounded-lg shadow-md overflow-hidden">
<div class="py-4 px-6">
<h1 class="text-md font-medium text-gray-900">Data Data Jaminan</h1>
</div>
<div class="grid gap-5">
<div class="flex items-baseline flex-wrap lg:flex-nowrap gap-2.5">
<label class="form-label max-w-56">Model</label>
<div class="flex flex-wrap items-baseline w-full">
<select class="input tomselect w-full @error('hadapMataAngin') border-danger bg-danger-light @enderror"
name="hadapMataAngin">
<option value="">Select Model Kendaraan </option>
@if (isset($arahMataAngin))
@foreach ($arahMataAngin as $item)
<option value="{{ $item->name }}"
{{ old('hadapMataAngin') == $item->name ? 'selected' : '' }}>{{ $item->name }}
</option>
@endforeach
@endif
</select>
@error('hadapMataAngin')
<em class="alert text-danger text-sm">{{ $message }}</em>
@enderror
</div>
</div>
@php
$inputDataJaminan = [];
$inputDataJaminan = [
['label' => 'Tipe/Model', 'index' => 0],
['label' => 'Merek', 'index' => 1],
['label' => 'Tahun Pembuatan', 'index' => 2],
['label' => 'Negara Pembuat', 'index' => 3],
['label' => 'Kondisi Mesin', 'index' => 4],
];
@endphp
@if (count($inputDataJaminan) > 0)
@foreach ($inputDataJaminan as $item)
<!-- Nomor Lambung -->
<div class="flex items-baseline flex-wrap lg:flex-nowrap gap-2.5">
<label class="form-label max-w-56">{{ $item['label'] }}</label>
<div class="flex flex-wrap items-baseline w-full">
<input type="text" name="bentuk_tanah" class="input"
placeholder="Masukkan {{ $item['label'] }}">
@error('bentuk_tanah')
<em class="alert text-danger text-sm">{{ $message }}</em>
@enderror
</div>
</div>
@endforeach
@endif
<div class="flex items-baseline flex-wrap lg:flex-nowrap gap-2.5">
<label class="form-label max-w-56">Deskripsi/Keterangan Lain Lain </label>
<div class="flex flex-wrap items-baseline w-full">
<textarea name="deskripsi" id="" class="textarea"></textarea>
@error('deskripsi')
<em class="alert text-danger text-sm">{{ $message }}</em>
@enderror
</div>
</div>
</div>
<div class="flex justify-end" style="margin-top: 10px">
<button class="btn btn-xs btn-primary" type="button" id="addBagunan">
tambah mesin
<i class="ki-filled ki-plus"></i>
</button>
</div>
</div>

View File

@@ -1,5 +1,5 @@
<div class=""max-w-4xl mx-auto bg-white rounded-lg shadow-md overflow-hidden"> <div class=""max-w-4xl mx-auto bg-white rounded-lg shadow-md overflow-hidden">
<div class="bg-blue-600 text-white py-4 px-6"> <div class="py-4 px-6">
<h1 class="text-md font-medium text-gray-900">Analisa Tanah</h1> <h1 class="text-md font-medium text-gray-900">Analisa Tanah</h1>
</div> </div>
<div class="grid gap-5"> <div class="grid gap-5">
@@ -246,235 +246,3 @@
</div> </div>
</div> </div>
@if ($analisaType == 'tanah_bangunan')
<div class=" bg-white rounded-lg shadow-md overflow-hidden">
<div class="bg-blue-600 text-white py-4 px-6">
<h1 class="text-md font-medium text-gray-900">Analisa Bangunan</h1>
</div>
<div class="grid gap-5">
<div class="flex items-baseline flex-wrap lg:flex-nowrap gap-2.5">
<label class="form-label max-w-56">Luas Tanah</label>
<div class="flex flex-wrap items-baseline w-full">
<div class="grid grid-cols-2 md:grid-cols-3 gap-4 mt-2">
<label class="form-label flex items-center gap-3 text-nowrap">
<input type="radio" class="radio" name="luas_tanah_bagunan" value="sesuai"
{{ old('luas_tanah_bagunan') == 'sesuai' ? 'checked' : '' }}>
<span class="ml-2">Sesuai</span>
</label>
<label class="form-label flex items-center gap-2.5 text-nowrap">
<input type="radio" class="radio" name="luas_tanah_bagunan" value="tidak sesuai"
{{ old('luas_tanah_bagunan') == 'tidak sesuai' ? 'checked' : '' }}>
<span class="ml-2">Tidak Sesuai</span>
</label>
</div>
@error('luas_tanah_bagunan')
<em class="alert text-danger text-sm">{{ $message }}</em>
@enderror
</div>
</div>
<!-- Jenis Bangunan -->
<div class="flex items-baseline flex-wrap lg:flex-nowrap gap-2.5">
<label class="form-label max-w-56">Jenis Bangunan</label>
<div class="flex flex-wrap items-baseline w-full">
<select
class="input tomselect w-full @error('jenis_bangunan') border-danger bg-danger-light @enderror"
name="jenis_bangunan">
<option value="">Select Jenis Bangunan</option>
@if (isset($jenisBangunan))
@foreach ($jenisBangunan as $item)
<option value="{{ $item->name }}"
{{ old('jenis_bangunan', isset($analisa) && optional($analisa->analisaTanahBangunan)->jenis_bangunan) == $item->name ? 'selected' : '' }}>{{ $item->name }}
</option>
@endforeach
@endif
</select>
@error('jenis_bangunan')
<em class="alert text-danger text-sm">{{ $message }}</em>
@enderror
</div>
</div>
<!-- Kondisi Bangunan -->
<div class="flex items-baseline flex-wrap lg:flex-nowrap gap-2.5">
<label class="form-label max-w-56">Kondisi Bangunan</label>
<div class="flex flex-wrap items-baseline w-full">
<select
class="input tomselect w-full @error('kondisi_bangunan') border-danger bg-danger-light @enderror"
name="kondisi_bangunan">
<option value="">Select Kondisi Bangunan</option>
@if (isset($kondisiBangunan))
@foreach ($kondisiBangunan as $item)
<option value="{{ $item->name }}"
{{ old('kondisi_bangunan', isset($analisa) && optional($analisa->analisaTanahBangunan)->kondisi_bangunan) == $item->name ? 'selected' : '' }}>{{ $item->name }}
</option>
@endforeach
@endif
</select>
@error('kondisi_bangunan')
<em class="alert text-danger text-sm">{{ $message }}</em>
@enderror
</div>
</div>
<!-- Sifat Bangunan -->
<div class="flex items-baseline flex-wrap lg:flex-nowrap gap-2.5">
<label class="form-label max-w-56"> Sifat Bangunan</label>
<div class="flex flex-wrap items-baseline w-full">
<select
class="input tomselect w-full @error('sifat_bangunan') border-danger bg-danger-light @enderror"
name="sifat_bangunan">
<option value="">Select Sifat Bangunan</option>
@if (isset($sifatBangunan))
@foreach ($sifatBangunan as $item)
<option value="{{ $item->name }}"
{{ old('sifat_bangunan', isset($analisa) && optional($analisa->analisaTanahBangunan)->sifat_bangunan) == $item->name ? 'selected' : '' }}>{{ $item->name }}
</option>
@endforeach
@endif
</select>
@error('sifat_bangunan')
<em class="alert text-danger text-sm">{{ $message }}</em>
@enderror
</div>
</div>
<!-- Spek Bangunan -->
<div class="gap-2.5">
<div class="flex items-baseline flex-wrap lg:flex-nowrap gap-2.5">
<label class="form-label max-w-56">Spek Bangunan</label>
<div class="flex flex-wrap items-baseline w-full" id="spek-bangunan-container">
<div class="spek-bangunan w-full gap-4">
<input type="hidden" name="nama_bagunan[]" value="Bangunan">
<div class="grid grid-cols-2 md:grid-cols-3 gap-4 mt-2 w-full">
@if (@isset($spekKategoriBagunan))
@foreach ($spekKategoriBagunan as $item)
<div>
<label
class="form-label flex items-center gap-3 text-nowrap">{{ $item->name }}</label>
<div class="flex flex-wrap items-baseline w-full">
<select
class="input tomselect w-full @error('name') border-danger bg-danger-light @enderror"
name="name[]">
<option value="">Select {{ $item->name }}</option>
@foreach ($spekBangunan as $spek)
@if ($spek->spek_kategori_bangunan_id == $item->id)
<option value="{{ $spek->name }}"
{{ old('name') == $spek->name ? 'selected' : '' }}>
{{ $spek->name }}
</option>
@endif
@endforeach
</select>
@error('name')
<em class="alert text-danger text-sm">{{ $message }}</em>
@enderror
</div>
</div>
@endforeach
@endif
</div>
<button type="button"
class="mt-2 btn btn-danger btn-outline btn-xs delete-button">Hapus</button>
</div>
</div>
</div>
<div class="flex justify-end">
<button class="btn btn-xs btn-primary" type="button" id="addBagunan">
tambah bangunan
<i class="ki-filled ki-plus"></i>
</button>
</div>
</div>
<!-- Sarana pelengkap -->
<div class="flex items-baseline flex-wrap lg:flex-nowrap gap-2.5">
<label class="form-label max-w-56">Sarana pelengkap</label>
<div class="flex flex-wrap items-baseline w-full">
<select
class="input tomselect w-full @error('sarana_pelengkap') border-danger bg-danger-light @enderror"
name="sarana_pelengkap">
<option value="">Select Posisi Kavling</option>
@if (isset($saranaPelengkap))
@foreach ($saranaPelengkap as $item)
<option value="{{ $item->name }}"
{{ old('sarana_pelengkap', isset($analisa) && optional($analisa->analisaTanahBangunan)->sarana_pelengkap) == $item->name ? 'selected' : '' }}>{{ $item->name }}
</option>
@endforeach
@endif
</select>
@error('sarana_pelengkap')
<em class="alert text-danger text-sm">{{ $message }}</em>
@enderror
</div>
</div>
</div>
</div>
@endif
@push('scripts')
<script>
const spekBangunanContainer = document.getElementById('spek-bangunan-container');
function updateDeleteButtonsVisibility() {
const allDeleteButtons = spekBangunanContainer.querySelectorAll('.delete-button');
// Only show the delete buttons if there are more than one form
allDeleteButtons.forEach(button => {
if (spekBangunanContainer.querySelectorAll('.spek-bangunan').length > 1) {
button.style.display = 'inline-block';
} else {
button.style.display = 'none';
}
});
}
document.getElementById('addBagunan').addEventListener('click', function() {
const newDiv = spekBangunanContainer.querySelector('.spek-bangunan').cloneNode(true);
// Clear the selected values of the cloned input fields
newDiv.querySelectorAll('select').forEach(select => {
select.value = '';
});
// Append the cloned div to the container
spekBangunanContainer.appendChild(newDiv);
// Add event listener to the delete button in the cloned div
newDiv.querySelector('.delete-button').addEventListener('click', function() {
spekBangunanContainer.removeChild(newDiv);
updateDeleteButtonsVisibility();
});
// Update delete buttons visibility
updateDeleteButtonsVisibility();
});
// Initial delete button visibility
updateDeleteButtonsVisibility();
// Add delete functionality to the initial form
spekBangunanContainer.querySelectorAll('.delete-button').forEach(button => {
button.addEventListener('click', function() {
const spekBangunan = this.closest('.spek-bangunan');
// Make sure not to delete the last remaining form
if (spekBangunanContainer.querySelectorAll('.spek-bangunan').length > 1) {
spekBangunan.remove();
updateDeleteButtonsVisibility();
}
});
});
</script>
@endpush

View File

@@ -1,8 +1,8 @@
@extends('layouts.main') @extends('layouts.main')
{{-- @section('breadcrumbs') @section('breadcrumbs')
{{ Breadcrumbs::render(request()->route()->getName()) }} {{ Breadcrumbs::render(request()->route()->getName()) }}
@endsection --}} @endsection
@section('content') @section('content')
<div class="w-full grid gap-5 lg:gap-7.5 mx-auto"> <div class="w-full grid gap-5 lg:gap-7.5 mx-auto">
@@ -33,7 +33,7 @@
</label> </label>
<div class="flex flex-wrap items-baseline w-full"> <div class="flex flex-wrap items-baseline w-full">
<input class="input @error('code') border-danger bg-danger-light @enderror" type="text" <input class="input @error('code') border-danger bg-danger-light @enderror" type="text"
name="code" value="{{ $model->code ?? '' }}" > name="code" value="{{ $model->code ?? '' }}">
@error('code') @error('code')
<em class="alert text-danger text-sm">{{ $message }}</em> <em class="alert text-danger text-sm">{{ $message }}</em>
@enderror @enderror
@@ -51,6 +51,41 @@
@enderror @enderror
</div> </div>
</div> </div>
@if (isset($header[1]) && $header[1] == 'spek-bangunan')
<div class="flex items-baseline flex-wrap lg:flex-nowrap gap-2.5">
<label class="form-label max-w-56">
Kategori
</label>
<div class="flex flex-wrap items-baseline w-full">
<select
class="input tomselect w-full @error('spek_kategori_bangunan_id') border-danger bg-danger-light @enderror"
name="spek_kategori_bangunan_id">
<option value="">Select Kategori Bangunan</option>
@if (isset($spekKategoriBagunan))
@foreach ($spekKategoriBagunan as $item)
@if (isset($model->spek_kategori_bangunan_id))
<option value="{{ $model->spek_kategori_bangunan_id }}"
{{ $model->spek_kategori_bangunan_id == $item->id ? 'selected' : '' }}>
{{ $item->name }}
</option>
@else
<option value="{{ $item->id }}"
{{ old('spek_kategori_bangunan_id') == $item->id ? 'selected' : '' }}>
{{ $item->name }}
</option>
@endif
@endforeach
@endif
</select>
@error('spek_kategori_bangunan_id')
<em class="alert text-danger text-sm">{{ $message }}</em>
@enderror
</div>
</div>
@endif
<div class="flex justify-end"> <div class="flex justify-end">
<button type="submit" class="btn btn-primary"> <button type="submit" class="btn btn-primary">
Save Save

View File

@@ -1,8 +1,8 @@
@extends('layouts.main') @extends('layouts.main')
{{-- @section('breadcrumbs') @section('breadcrumbs')
{{ Breadcrumbs::render('surveyor.bentuk-tanah') }} {{ Breadcrumbs::render('basicdata.' . $header[1]) }}
@endsection --}} @endsection
@section('content') @section('content')
<div class="grid"> <div class="grid">

View File

@@ -94,7 +94,7 @@
@if (request()->has('form') && request('form') !== 'data-pembanding') @if (request()->has('form') && request('form') !== 'data-pembanding')
<div class="card-footer"> <div class="card-footer">
<form action="{{ route('surveyor.submitSurveyor', $surveyor) }}" method="POST"> <form action="{{ route('surveyor.submitSurveyor', $surveyor ) }}" method="POST">
@csrf @csrf
@method('PUT') @method('PUT')
<button type="submit" class="btn btn-primary " {{ $buttonDisable ? 'disabled' : '' }}> <button type="submit" class="btn btn-primary " {{ $buttonDisable ? 'disabled' : '' }}>

View File

@@ -8,6 +8,7 @@
@push('styles') @push('styles')
<style> <style>
.modal { .modal {
width: 50%; width: 50%;
display: flex; display: flex;
justify-content: center; justify-content: center;
@@ -201,10 +202,10 @@
}, },
tanggal_permohonan: { tanggal_permohonan: {
title: 'Tanggal Assigned', title: 'Tanggal Assigned',
render: (item, data) => { // render: (item, data) => {
const createdAt = convertDate(data.penilaian.created_at); // const createdAt = convertDate(data.penilaian.created_at);
return createdAt; // return createdAt;
}, // },
}, },
user_id: { user_id: {
@@ -231,9 +232,6 @@
title: 'Action', title: 'Action',
render: (item, data) => ` render: (item, data) => `
<div class="flex flex-nowrap justify-center"> <div class="flex flex-nowrap justify-center">
<a class="btn btn-sm btn-icon btn-clear btn-info" data-modal-toggle="#modal_revisi" >
<i class="ki-outline ki-notepad-edit"></i>
</a>
<a class="btn btn-sm btn-icon btn-clear btn-warning" href="surveyor/${data.id}/show?form=inspeksi"> <a class="btn btn-sm btn-icon btn-clear btn-warning" href="surveyor/${data.id}/show?form=inspeksi">
<i class="ki-outline ki-eye"></i> <i class="ki-outline ki-eye"></i>
</a> </a>
@@ -249,10 +247,10 @@
dataTable.search(searchValue, true); dataTable.search(searchValue, true);
}); });
statusFilter.addEventListener('change', function() { // statusFilter.addEventListener('change', function() {
const selectedStatus = this.value; // const selectedStatus = this.value;
dataTable.search(selectedStatus); // dataTable.search(selectedStatus);
}); // });
function convertDate(date) { function convertDate(date) {
const createdAt = new Date(date); const createdAt = new Date(date);

View File

@@ -0,0 +1,585 @@
@push('scripts')
<script>
class UniversalCameraEditor {
constructor() {
// Initialize elements
this.video = document.getElementById('video');
this.canvas = document.getElementById('canvas');
this.drawingCanvas = document.getElementById('drawingCanvas');
this.ctx = this.drawingCanvas.getContext('2d');
// Buttons
this.startButton = document.getElementById('startButton');
this.takePhotoButton = document.getElementById('takePhotoButton');
this.switchButton = document.getElementById('switchButton');
this.backButton = document.getElementById('backButton');
this.saveButton = document.getElementById('saveButton');
this.undoButton = document.getElementById('undoButton');
this.resetButton = document.getElementById('resetButton');
// Drawing controls
this.colorPicker = document.getElementById('colorPicker');
this.brushSize = document.getElementById('brushSize');
this.brushSizeValue = document.getElementById('brushSizeValue');
// Text modal elements
this.textModal = document.getElementById('textModal');
this.textInput = document.getElementById('textInput');
this.confirmTextBtn = document.getElementById('confirmTextBtn');
this.cancelTextBtn = document.getElementById('cancelTextBtn');
// Initialize state
this.stream = null;
this.currentFacingMode = 'environment';
this.isDrawing = false;
this.currentTool = 'brush';
this.drawingHistory = [];
this.historyIndex = -1;
// Drawing coordinates
this.startX = 0;
this.startY = 0;
this.lastX = 0;
this.lastY = 0;
// Setup
this.setupCanvas();
this.setupEventListeners();
this.setupDrawingContext();
// Add text overlay container
this.textOverlay = document.getElementById('textOverlay');
this.activeTextElement = null;
this.isDraggingText = false;
this.textOffset = {
x: 0,
y: 0
};
// Current input field reference
this.currentInputField = null;
}
setupCanvas() {
// Set initial canvas size
this.canvas.width = 1280;
this.canvas.height = 960;
this.drawingCanvas.width = 1280;
this.drawingCanvas.height = 960;
}
setupDrawingContext() {
this.ctx.strokeStyle = this.colorPicker.value;
this.ctx.lineWidth = this.brushSize.value;
this.ctx.lineCap = 'round';
this.ctx.lineJoin = 'round';
}
async startCamera() {
try {
if (this.stream) {
this.stream.getTracks().forEach(track => track.stop());
}
const constraints = {
video: {
facingMode: this.currentFacingMode,
width: {
ideal: 1280
},
height: {
ideal: 960
}
},
audio: false
};
this.stream = await navigator.mediaDevices.getUserMedia(constraints);
this.video.srcObject = this.stream;
// Enable buttons after camera starts
this.takePhotoButton.disabled = false;
this.switchButton.disabled = false;
// Show video, hide canvas
this.video.style.display = 'block';
this.canvas.style.display = 'none';
this.drawingCanvas.style.display = 'none';
// Hide editor controls
document.getElementById('editorControls').classList.add('hidden');
document.getElementById('cameraControls').classList.remove('hidden');
} catch (error) {
console.error('Error accessing camera:', error);
alert('Error accessing camera. Please make sure you have granted camera permissions.');
}
}
takePhoto() {
// Draw video frame to canvas
const context = this.canvas.getContext('2d');
context.drawImage(this.video, 0, 0, this.canvas.width, this.canvas.height);
// Hide video, show canvases
this.video.style.display = 'none';
this.canvas.style.display = 'block';
this.drawingCanvas.style.display = 'block';
// Show editor controls, hide camera controls
document.getElementById('editorControls').classList.remove('hidden');
document.getElementById('cameraControls').classList.add('hidden');
// Clear drawing history
this.drawingHistory = [];
this.historyIndex = -1;
this.saveDrawingState();
}
switchCamera() {
this.currentFacingMode = this.currentFacingMode === 'environment' ? 'user' : 'environment';
this.startCamera();
}
resetToCamera() {
// Clear canvases
const context = this.canvas.getContext('2d');
context.clearRect(0, 0, this.canvas.width, this.canvas.height);
this.ctx.clearRect(0, 0, this.drawingCanvas.width, this.drawingCanvas.height);
// Reset history
this.drawingHistory = [];
this.historyIndex = -1;
// Restart camera
this.startCamera();
}
saveDrawingState() {
// Trim history if we're not at the end
if (this.historyIndex < this.drawingHistory.length - 1) {
this.drawingHistory = this.drawingHistory.slice(0, this.historyIndex + 1);
}
// Save current state
this.drawingHistory.push(this.drawingCanvas.toDataURL());
this.historyIndex++;
}
undo() {
if (this.historyIndex > 0) {
this.historyIndex--;
this.redrawHistory();
}
}
resetDrawing() {
this.ctx.clearRect(0, 0, this.drawingCanvas.width, this.drawingCanvas.height);
this.saveDrawingState();
}
// Implement all event listeners from previous code here
setupEventListeners() {
// Camera controls
this.startButton.onclick = () => this.startCamera();
this.takePhotoButton.onclick = () => this.takePhoto();
this.switchButton.onclick = () => this.switchCamera();
this.backButton.onclick = () => this.resetToCamera();
// Drawing controls
this.setupDrawingEvents();
this.setupToolButtons();
// Settings changes
this.colorPicker.oninput = (e) => this.ctx.strokeStyle = e.target.value;
this.brushSize.oninput = (e) => {
this.ctx.lineWidth = e.target.value;
this.brushSizeValue.textContent = `${e.target.value}px`;
};
// History controls
this.undoButton.onclick = () => this.undo();
this.resetButton.onclick = () => this.resetDrawing();
// Save functionality
this.saveButton.onclick = () => this.saveAndUpload();
// Text tool modal controls
this.confirmTextBtn.onclick = () => {
const text = this.textInput.value.trim();
if (text) {
this.addDraggableText(text);
this.textInput.value = '';
}
};
}
setupToolButtons() {
const toolButtons = document.querySelectorAll('.tool-btn');
toolButtons.forEach(button => {
button.onclick = () => {
toolButtons.forEach(btn => btn.classList.remove('active'));
button.classList.add('active');
this.currentTool = button.dataset.tool;
};
});
}
// Implement drawing events from previous code here
setupDrawingEvents() {
// Mouse events
this.drawingCanvas.addEventListener('mousedown', (e) => this.startDrawing(e));
this.drawingCanvas.addEventListener('mousemove', (e) => this.draw(e));
this.drawingCanvas.addEventListener('mouseup', () => this.stopDrawing());
this.drawingCanvas.addEventListener('mouseout', () => this.stopDrawing());
// Touch events
this.drawingCanvas.addEventListener('touchstart', (e) => {
if (this.shouldPreventDefault(e)) {
e.preventDefault();
}
const touch = e.touches[0];
const mouseEvent = new MouseEvent('mousedown', {
clientX: touch.clientX,
clientY: touch.clientY
});
this.startDrawing(mouseEvent);
}, {
passive: false
});
this.drawingCanvas.addEventListener('touchmove', (e) => {
if (this.shouldPreventDefault(e)) {
e.preventDefault();
}
const touch = e.touches[0];
const mouseEvent = new MouseEvent('mousemove', {
clientX: touch.clientX,
clientY: touch.clientY
});
this.draw(mouseEvent);
}, {
passive: false
});
this.drawingCanvas.addEventListener('touchend', () => {
this.stopDrawing();
}, {
passive: true
});
}
// Implement drawing methods from previous code here
startDrawing(e) {
this.isDrawing = true;
const rect = this.drawingCanvas.getBoundingClientRect();
const scaleX = this.drawingCanvas.width / rect.width;
const scaleY = this.drawingCanvas.height / rect.height;
this.startX = (e.clientX - rect.left) * scaleX;
this.startY = (e.clientY - rect.top) * scaleY;
this.lastX = this.startX;
this.lastY = this.startY;
if (this.currentTool === 'brush') {
this.ctx.beginPath();
this.ctx.moveTo(this.startX, this.startY);
}
}
addDraggableText(text) {
const textElement = document.createElement('div');
textElement.className = 'draggable-text';
textElement.style.cssText = `
position: absolute;
cursor: move;
user-select: none;
color: ${this.colorPicker.value};
font-size: ${this.brushSize.value * 2}px;
padding: 5px;
border-radius: 3px;
display: flex;
align-items: center;
gap: 8px;
`;
// Create text span
const textSpan = document.createElement('span');
textSpan.textContent = text;
textElement.appendChild(textSpan);
// Create delete button
const deleteBtn = document.createElement('button');
deleteBtn.innerHTML = '×';
deleteBtn.style.cssText = `
border: none;
background: none;
color: #ff4444;
font-size: 20px;
cursor: pointer;
padding: 0;
line-height: 1;
opacity: 0;
transition: opacity 0.2s;
`;
textElement.appendChild(deleteBtn);
// Show/hide delete button on hover
textElement.addEventListener('mouseenter', () => {
deleteBtn.style.opacity = '1';
});
textElement.addEventListener('mouseleave', () => {
deleteBtn.style.opacity = '0';
});
// Delete functionality
deleteBtn.addEventListener('click', (e) => {
e.stopPropagation();
textElement.remove();
this.saveDrawingState();
});
// Center the text initially
textElement.style.left = '50%';
textElement.style.top = '50%';
textElement.style.transform = 'translate(-50%, -50%)';
// Add drag functionality
this.setupDraggableText(textElement);
this.textOverlay.appendChild(textElement);
this.saveDrawingState();
}
setupDraggableText(element) {
let isDragging = false;
let currentX;
let currentY;
let initialX;
let initialY;
let xOffset = 0;
let yOffset = 0;
const dragStart = (e) => {
if (this.currentTool === 'text') {
const event = e.type === 'mousedown' ? e : e.touches[0];
initialX = event.clientX - xOffset;
initialY = event.clientY - yOffset;
if (e.target === element || e.target.parentNode === element) {
isDragging = true;
}
}
};
const drag = (e) => {
if (isDragging) {
e.preventDefault();
const event = e.type === 'mousemove' ? e : e.touches[0];
currentX = event.clientX - initialX;
currentY = event.clientY - initialY;
xOffset = currentX;
yOffset = currentY;
setTranslate(currentX, currentY, element);
}
};
const dragEnd = () => {
if (isDragging) {
isDragging = false;
this.saveDrawingState();
}
};
const setTranslate = (xPos, yPos, el) => {
el.style.transform = `translate(${xPos}px, ${yPos}px)`;
};
// Mouse events
element.addEventListener('mousedown', dragStart);
document.addEventListener('mousemove', drag);
document.addEventListener('mouseup', dragEnd);
// Touch events
element.addEventListener('touchstart', dragStart);
document.addEventListener('touchmove', drag);
document.addEventListener('touchend', dragEnd);
}
// Add this CSS to your stylesheet
draw(e) {
if (!this.isDrawing) return;
const rect = this.drawingCanvas.getBoundingClientRect();
const scaleX = this.drawingCanvas.width / rect.width;
const scaleY = this.drawingCanvas.height / rect.height;
const x = (e.clientX - rect.left) * scaleX;
const y = (e.clientY - rect.top) * scaleY;
switch (this.currentTool) {
case 'arrow':
// Restore the previous state before drawing new arrow
if (this.historyIndex >= 0) {
this.redrawHistory();
} else {
this.ctx.clearRect(0, 0, this.drawingCanvas.width, this.drawingCanvas.height);
}
this.drawArrow(this.startX, this.startY, x, y);
break;
case 'brush':
this.ctx.lineTo(x, y);
this.ctx.stroke();
break;
case 'rectangle':
// Restore the previous state before drawing new rectangle
if (this.historyIndex >= 0) {
this.redrawHistory();
} else {
this.ctx.clearRect(0, 0, this.drawingCanvas.width, this.drawingCanvas.height);
}
this.ctx.beginPath();
this.ctx.strokeRect(this.startX, this.startY, x - this.startX, y - this.startY);
break;
case 'circle':
// Restore the previous state before drawing new circle
if (this.historyIndex >= 0) {
this.redrawHistory();
} else {
this.ctx.clearRect(0, 0, this.drawingCanvas.width, this.drawingCanvas.height);
}
const radius = Math.sqrt(Math.pow(x - this.startX, 2) + Math.pow(y - this.startY, 2));
this.ctx.beginPath();
this.ctx.arc(this.startX, this.startY, radius, 0, Math.PI * 2);
this.ctx.stroke();
break;
}
this.lastX = x;
this.lastY = y;
}
drawArrow(fromX, fromY, toX, toY) {
const headLength = 20;
const headAngle = Math.PI / 6;
// Calculate angle
const angle = Math.atan2(toY - fromY, toX - fromX);
// Draw main line
this.ctx.beginPath();
this.ctx.moveTo(fromX, fromY);
this.ctx.lineTo(toX, toY);
this.ctx.stroke();
// Draw arrowhead
this.ctx.beginPath();
this.ctx.moveTo(toX, toY);
this.ctx.lineTo(
toX - headLength * Math.cos(angle - headAngle),
toY - headLength * Math.sin(angle - headAngle)
);
this.ctx.moveTo(toX, toY);
this.ctx.lineTo(
toX - headLength * Math.cos(angle + headAngle),
toY - headLength * Math.sin(angle + headAngle)
);
this.ctx.stroke();
}
startDrawing(e) {
this.isDrawing = true;
const rect = this.drawingCanvas.getBoundingClientRect();
const scaleX = this.drawingCanvas.width / rect.width;
const scaleY = this.drawingCanvas.height / rect.height;
this.startX = (e.clientX - rect.left) * scaleX;
this.startY = (e.clientY - rect.top) * scaleY;
this.lastX = this.startX;
this.lastY = this.startY;
if (this.currentTool === 'brush') {
this.ctx.beginPath();
this.ctx.moveTo(this.startX, this.startY);
}
}
stopDrawing() {
if (this.isDrawing) {
this.isDrawing = false;
if (this.currentTool === 'brush') {
this.ctx.closePath();
}
this.saveDrawingState();
}
}
redrawHistory() {
if (this.historyIndex >= 0 && this.drawingHistory[this.historyIndex]) {
const img = new Image();
img.src = this.drawingHistory[this.historyIndex];
this.ctx.clearRect(0, 0, this.drawingCanvas.width, this.drawingCanvas.height);
this.ctx.drawImage(img, 0, 0);
} else {
this.ctx.clearRect(0, 0, this.drawingCanvas.width, this.drawingCanvas.height);
}
}
closeEditor() {
if (this.stream) {
this.stream.getTracks().forEach(track => track.stop());
}
// Clear canvases and text overlay
this.ctx.clearRect(0, 0, this.drawingCanvas.width, this.drawingCanvas.height);
const mainCtx = this.canvas.getContext('2d');
mainCtx.clearRect(0, 0, this.canvas.width, this.canvas.height);
this.textOverlay.innerHTML = '';
// Reset state
this.drawingHistory = [];
this.historyIndex = -1;
this.currentInputField = null;
// Close modals
this.cameraModal.hide();
this.textInputModal.hide();
}
// Override this method in your implementation
saveAndUpload() {
}
closeCamera() {
// Stop the video stream
if (this.stream) {
this.stream.getTracks().forEach(track => track.stop());
}
// Hide video and canvas elements
this.video.style.display = 'none';
this.canvas.style.display = 'none';
this.drawingCanvas.style.display = 'none';
// Reset any additional state if needed
this.stream = null;
}
}
</script>
@endpush

View File

@@ -61,14 +61,14 @@
class="input tomselect w-full @error('regions_id') border-danger bg-danger-light @enderror" class="input tomselect w-full @error('regions_id') border-danger bg-danger-light @enderror"
name="regions_id"> name="regions_id">
<option value="">Select Region</option> <option value="">Select Region</option>
@if (isset($region)) @if (isset($regions))
@foreach ($region as $regions) @foreach ($regions as $region)
@if (isset($teams)) @if (isset($teams))
<option value="{{ $regions->id }}" <option value="{{ $region->id }}"
{{ $teams->regions_id == $regions->id ? 'selected' : '' }}> {{ $teams->regions_id == $region->id ? 'selected' : '' }}>
{{ $regions->name }}</option> {{ $region->name }}</option>
@else @else
<option value="{{ $regions->id }}">{{ $regions->name }}</option> <option value="{{ $region->id }}">{{ $region->name }}</option>
@endif @endif
@endforeach @endforeach
@endif @endif
@@ -98,6 +98,7 @@
@endforeach @endforeach
</option> </option>
@else @else
<option value="{{ $users->id }}">{{ $users->name . ' | ' }} <option value="{{ $users->id }}">{{ $users->name . ' | ' }}
@foreach ($users->roles as $role) @foreach ($users->roles as $role)

View File

@@ -498,6 +498,15 @@ Breadcrumbs::for('otorisasitender.penawaran.show', function (BreadcrumbTrail $tr
$trail->push('Detail Data Otorisasi Penawaran'); $trail->push('Detail Data Otorisasi Penawaran');
}); });
// andy add Otorisasi Tender // andy add Otorisasi Tender
// spk
Breadcrumbs::for('spk', function (BreadcrumbTrail $trail) {
$trail->push('SPK', route('spk.index'));
});
Breadcrumbs::for('spk.edit', function (BreadcrumbTrail $trail) {
$trail->parent('spk');
$trail->push('Buat SPK');
});
// spk
// andy add registrasi final // andy add registrasi final
Breadcrumbs::for('registrasifinal', function (BreadcrumbTrail $trail) { Breadcrumbs::for('registrasifinal', function (BreadcrumbTrail $trail) {
$trail->push('Registrasi Final', route('registrasifinal.index')); $trail->push('Registrasi Final', route('registrasifinal.index'));
@@ -518,6 +527,79 @@ Breadcrumbs::for('otorisator.pelaporan.index', function (BreadcrumbTrail $trail)
$trail->push('Otorisator', route('otorisator.pelaporan.index')); $trail->push('Otorisator', route('otorisator.pelaporan.index'));
}); });
// basic data surveyor
$basicDataRoutes = [
'bentuk-tanah' => 'Bentuk Tanah',
'kontur-tanah' => 'Kontur Tanah',
'posisi-kavling' => 'Posisi Kavling',
'ketinggian-tanah' => 'Ketinggian Tanah',
'kondisi-fisik-tanah' => 'Kondisi Fisik Tanah',
'jenis-bangunan' => 'Jenis Bangunan',
'kondisi-bangunan' => 'Kondisi Bangunan',
'sifat-bangunan' => 'Sifat Bangunan',
'spek-bangunan' => 'Speksifikasi Bangunan',
'spek-kategori-bangunan' => 'Speksifikasi Kategori Bangunan',
'sarana-pelengkap' => 'Sarana Pelengkap',
'lalu-lintas-lokasi' => 'Lalu Lintas',
'tingkat-keramaian' => 'Tingkat Keramaian',
'gol-mas-sekitar' => 'Golongan Masyarakat Sekitar',
'lantai-unit' => 'Lantai Unit',
'view-unit' => 'View Unit',
'bentuk-unit' => 'Bentuk unit',
];
foreach ($basicDataRoutes as $route => $title) {
Breadcrumbs::for("basicdata.{$route}", function (BreadcrumbTrail $trail) use ($route, $title) {
$trail->parent('basicdata');
$trail->push($title, route("basicdata.{$route}.index"));
});
}
Breadcrumbs::for('basicdata.createData', function (BreadcrumbTrail $trail, $type = null) {
$trail->parent('basicdata');
if ($type) {
$title = $basicDataRoutes[$type] ?? ucwords(str_replace('-', ' ', $type));
$trail->push("Tambah $title");
} else {
$trail->push("Tambah Data");
}
});
Breadcrumbs::for('basicdata.editData', function (BreadcrumbTrail $trail, $type = null) {
$trail->parent('basicdata');
if ($type) {
$title = $basicDataRoutes[$type] ?? ucwords(str_replace('-', ' ', $type));
$trail->push("Edit $title");
} else {
$trail->push("Edit Data");
}
});
// otorisator surveyor
$otorisatorSurveyor = [
'pelaporan' => 'Pelaporan',
'pembayaran' => 'Pembayaran',
'pembatalan' => 'Pembatalan',
'sla' => 'SLA',
];
foreach ($otorisatorSurveyor as $route => $title) {
Breadcrumbs::for("otorisator.{$route}", function (BreadcrumbTrail $trail) use ($route, $title) {
$trail->push($title, route("otorisator.{$route}.index"));
});
}
Breadcrumbs::for('laporan', function (BreadcrumbTrail $trail) { Breadcrumbs::for('laporan', function (BreadcrumbTrail $trail) {
$trail->push('Laporan', route('laporan.sederhana.index')); $trail->push('Laporan', route('laporan.sederhana.index'));
}); });

View File

@@ -4,6 +4,7 @@ use Modules\Lpj\Http\Controllers\RegistrasiController;
use Modules\Lpj\Http\Controllers\ProsesPenawaranController; use Modules\Lpj\Http\Controllers\ProsesPenawaranController;
use Modules\Lpj\Http\Controllers\ProsesPenawaranUlangController; use Modules\Lpj\Http\Controllers\ProsesPenawaranUlangController;
use Modules\Lpj\Http\Controllers\OtorisasiPenawaranController; use Modules\Lpj\Http\Controllers\OtorisasiPenawaranController;
use Modules\Lpj\Http\Controllers\SpkController;
use Modules\Lpj\Http\Controllers\RegistrasiFinalController; use Modules\Lpj\Http\Controllers\RegistrasiFinalController;
Route::middleware(['auth'])->group(function () { Route::middleware(['auth'])->group(function () {
@@ -85,6 +86,18 @@ Route::middleware(['auth'])->group(function () {
}); });
}); });
Route::controller(SpkController::class)->group(function(){
Route::get('/spk/dokumennya', 'dokumennya')->name('spk.dokumennya');
Route::get('/spk', 'index')->name('spk.index');
Route::get('/spk/datatables', 'dataForDatatables')->name('spk.datatables');
Route::get('/spk/{spk}', 'show')->name('spk.show');
Route::get('/spk/{spk}/edit', 'edit')->name('spk.edit');
Route::put('/spk/{spk}', 'update')->name('spk.update');
Route::get('spk/{spk}/download', 'download')->name('spk.download');
});
Route::controller(RegistrasiFinalController::class)->group(function(){ Route::controller(RegistrasiFinalController::class)->group(function(){
Route::get('/registrasifinal', 'index')->name('registrasifinal.index'); Route::get('/registrasifinal', 'index')->name('registrasifinal.index');
Route::get('/registrasifinal/datatables', 'dataForDatatables')->name('registrasifinal.datatables'); Route::get('/registrasifinal/datatables', 'dataForDatatables')->name('registrasifinal.datatables');

View File

@@ -2,7 +2,6 @@
use Illuminate\Support\Facades\Route; use Illuminate\Support\Facades\Route;
use Modules\Lpj\Http\Controllers\SLAController; use Modules\Lpj\Http\Controllers\SLAController;
use Modules\Lpj\Http\Controllers\SpkController;
use Modules\Lpj\Http\Controllers\KJPPController; use Modules\Lpj\Http\Controllers\KJPPController;
use Modules\Lpj\Http\Controllers\TeamsController; use Modules\Lpj\Http\Controllers\TeamsController;
use Modules\Lpj\Http\Controllers\RegionController; use Modules\Lpj\Http\Controllers\RegionController;
@@ -67,7 +66,7 @@ Route::middleware(['auth'])->group(function () {
Route::resource('jenis-legalitas-jaminan', JenisLegalitasJaminanController::class); Route::resource('jenis-legalitas-jaminan', JenisLegalitasJaminanController::class);
Route::name('jenis-jaminan.')->prefix('jenis-jaminan')->group(function () { Route::name('jenis-jaminan.')->prefix('jenis-jaminan')->group(function () {
Route::get('legalitas/{id}', [JenisJaminanController::class, 'legalitasJaminan'])->name('legalitas'); Route::get('legalitas/{id}/{jenisJaminanId}', [DokumenJaminanController::class, 'getLegalitasJaminan'])->name('legalitas');
Route::get('restore/{id}', [JenisJaminanController::class, 'restore'])->name('restore'); Route::get('restore/{id}', [JenisJaminanController::class, 'restore'])->name('restore');
Route::get('datatables', [JenisJaminanController::class, 'dataForDatatables'])->name('datatables'); Route::get('datatables', [JenisJaminanController::class, 'dataForDatatables'])->name('datatables');
Route::get('export', [JenisJaminanController::class, 'export'])->name('export'); Route::get('export', [JenisJaminanController::class, 'export'])->name('export');
@@ -286,9 +285,15 @@ Route::middleware(['auth'])->group(function () {
'jenis-bangunan' => 'Jenis Bangunan', 'jenis-bangunan' => 'Jenis Bangunan',
'kondisi-bangunan' => 'Kondisi Bangunan', 'kondisi-bangunan' => 'Kondisi Bangunan',
'sifat-bangunan' => 'Sifat Bangunan', 'sifat-bangunan' => 'Sifat Bangunan',
// 'spek-bangunan' => 'Speksifikasi Bangunan', 'spek-bangunan' => 'Speksifikasi Bangunan',
// 'spek-kategori-bagunan' => 'Speksifikasi Kategori Bangunan', 'spek-kategori-bangunan' => 'Speksifikasi Kategori Bangunan',
'sarana-pelengkap' => 'Sarana Pelengkap', 'sarana-pelengkap' => 'Sarana Pelengkap',
'lalu-lintas-lokasi' => 'Lalu Lintas',
'tingkat-keramaian' => 'Tingkat Keramaian',
'gol-mas-sekitar' => 'Golongan Masyarakat Sekitar',
'lantai-unit' => 'Lantai Unit',
'view-unit' => 'View Unit',
'bentuk-unit' => 'Bentuk unit',
]; ];
foreach ($headers as $type => $header) { foreach ($headers as $type => $header) {
@@ -347,18 +352,6 @@ Route::middleware(['auth'])->group(function () {
Route::get('print/{id}', [PermohonanController::class, 'print'])->name('print'); Route::get('print/{id}', [PermohonanController::class, 'print'])->name('print');
}); });
Route::name('spk.')->prefix('spk')->group(function () {
// Route::get('download', [PermohonanController::class, 'createPermohonan'])->name('create.debitur');
Route::get('view', [SpkController::class, 'viewSpk'])->name('spk.view');
// Route::get('{id}/create', [PermohonanController::class, 'createPermohonan'])->name('create.debitur');
// Route::get('download/{id}', [PermohonanController::class, 'download'])->name('download');
// Route::get('restore/{id}', [PermohonanController::class, 'restore'])->name('restore');
// Route::get('datatables', [PermohonanController::class, 'dataForDatatables'])->name('datatables');
// Route::get('export', [PermohonanController::class, 'export'])->name('export');
});
Route::resource('spk', SpkController::class);
Route::get('authorization', [PermohonanController::class, 'authorization'])->name('authorization.index'); Route::get('authorization', [PermohonanController::class, 'authorization'])->name('authorization.index');
Route::resource('permohonan', PermohonanController::class); Route::resource('permohonan', PermohonanController::class);
@@ -431,6 +424,7 @@ Route::middleware(['auth'])->group(function () {
Route::get('restore/{id}', [ActivityController::class, 'restore'])->name('restore'); Route::get('restore/{id}', [ActivityController::class, 'restore'])->name('restore');
Route::get('datatables', [ActivityController::class, 'dataForDatatables'])->name('datatables'); Route::get('datatables', [ActivityController::class, 'dataForDatatables'])->name('datatables');
Route::get('export', [ActivityController::class, 'export'])->name('export'); Route::get('export', [ActivityController::class, 'export'])->name('export');
Route::get('/', [ActivityController::class, 'index'])->name('index'); Route::get('/', [ActivityController::class, 'index'])->name('index');
Route::get('/{id}/show', [ActivityController::class, 'show'])->name('show'); Route::get('/{id}/show', [ActivityController::class, 'show'])->name('show');