From 4b0822540344acc2f944b248f1e4648b86651ff8 Mon Sep 17 00:00:00 2001 From: majid Date: Tue, 29 Oct 2024 14:22:25 +0700 Subject: [PATCH 01/10] update pemilihan team hanya surveyor atau penilai dan update form foto menggunakan camera --- app/Http/Controllers/ActivityController.php | 2 +- app/Http/Controllers/PenilaianController.php | 6 +- app/Http/Controllers/SurveyorController.php | 231 ++++++----- app/Http/Controllers/TeamsController.php | 39 +- app/Http/Requests/SurveyorRequest.php | 157 ++++++-- app/Models/GolonganMasySekitar.php | 4 +- app/Models/Lantai.php | 23 ++ app/Models/SpekBangunan.php | 2 +- app/Models/SpekKategoritBangunan.php | 2 +- app/Models/TingkatKeramaian.php | 1 + app/Models/ViewUnit.php | 23 ++ ...2024_10_16_153543_create_analisa_table.php | 1 + .../2024_10_16_153841_create_denah_table.php | 2 +- ...10_16_153902_create_foto_jaminan_table.php | 2 +- ...0_16_153918_create_objek_jaminan_table.php | 1 + ..._10_25_014340_create_lokasi_unit_table.php | 37 ++ ...24_10_25_014428_create_view_unit_table.php | 36 ++ module.json | 60 ++- .../activity/progres_activity/index.blade.php | 2 +- resources/views/penilaian/form.blade.php | 200 ++++++--- .../penilaian/otorisator/index.blade.php | 48 ++- .../views/penilaian/otorisator/show.blade.php | 30 +- .../surveyor/components/alat-berat.blade.php | 192 +++++++++ .../components/apartemen-kantor.blade.php | 14 +- .../views/surveyor/components/foto.blade.php | 379 ++++++++++++++++-- .../surveyor/components/inspeksi.blade.php | 164 ++++++-- .../components/tanah-bangunan.blade.php | 2 +- resources/views/surveyor/data/form.blade.php | 41 +- resources/views/surveyor/data/index.blade.php | 6 +- resources/views/surveyor/index.blade.php | 1 + resources/views/teams/form.blade.php | 1 + routes/breadcrumbs.php | 72 ++++ routes/web.php | 10 +- 33 files changed, 1477 insertions(+), 314 deletions(-) create mode 100644 app/Models/Lantai.php create mode 100644 app/Models/ViewUnit.php create mode 100644 database/migrations/2024_10_25_014340_create_lokasi_unit_table.php create mode 100644 database/migrations/2024_10_25_014428_create_view_unit_table.php create mode 100644 resources/views/surveyor/components/alat-berat.blade.php diff --git a/app/Http/Controllers/ActivityController.php b/app/Http/Controllers/ActivityController.php index 496f1b4..74bb5f7 100644 --- a/app/Http/Controllers/ActivityController.php +++ b/app/Http/Controllers/ActivityController.php @@ -195,7 +195,7 @@ class ActivityController extends Controller public function dataTablesForActivity(Request $request, $id) { // Query Penilaian dengan relasi yang diperlukan - $query = Penilaian::with(['permohonan', 'permohonan.debiture', 'permohonan.tujuanPenilaian']) + $query = Penilaian::with(['permohonan', 'permohonan.debiture', 'permohonan.tujuanPenilaian', 'permohonan.debiture.documents.jenisJaminan']) ->where(function($q) use ($id) { $q->where('surveyor_id', $id) ->orWhere('penilaian_id', $id) diff --git a/app/Http/Controllers/PenilaianController.php b/app/Http/Controllers/PenilaianController.php index f273b0a..3ae9cde 100644 --- a/app/Http/Controllers/PenilaianController.php +++ b/app/Http/Controllers/PenilaianController.php @@ -222,7 +222,8 @@ class PenilaianController extends Controller - public function otorisator(Request $request){ + public function otorisator(Request $request) + { $type = $request->route('type'); $header = ''; @@ -248,7 +249,8 @@ class PenilaianController extends Controller return view('lpj::penilaian.otorisator.index', compact('header')); } - public function show($id){ + public function show($id) + { $permohonan = Permohonan::find($id); diff --git a/app/Http/Controllers/SurveyorController.php b/app/Http/Controllers/SurveyorController.php index 36b9ae2..d4e30df 100644 --- a/app/Http/Controllers/SurveyorController.php +++ b/app/Http/Controllers/SurveyorController.php @@ -32,9 +32,14 @@ use Modules\Lpj\Models\Denah; use Modules\Lpj\Models\FotoJaminan; use Modules\Lpj\Models\Lingkungan; use Modules\Lpj\Models\LantaiUnit; +use Modules\Lpj\Models\Lantai; +use Modules\Lpj\Models\ViewUnit; use Modules\Lpj\Models\ObjekJaminan; use Modules\Lpj\Models\RuteJaminan; 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\Http\Requests\SurveyorRequest; use Modules\Lpj\Http\Requests\FormSurveyorRequest; @@ -552,6 +557,8 @@ class SurveyorController extends Controller { $permohonan = $this->getPermohonanJaminanId($id, $jaminanId); + + $branches = Branch::all(); $provinces = Province::all(); @@ -570,6 +577,11 @@ class SurveyorController extends Controller $spekBangunan = SpekBangunan::all(); $saranaPelengkap = SaranaPelengkap::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') @@ -597,6 +609,12 @@ class SurveyorController extends Controller 'spekBangunan', 'saranaPelengkap', 'arahMataAngin', + 'lantai', + 'viewUnit', + 'golMasySekitar', + 'tingkatKeramaian', + 'laluLintasLokasi' + )); } @@ -625,10 +643,6 @@ class SurveyorController extends Controller $provinces = Province::all(); $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')); } @@ -658,25 +672,18 @@ class SurveyorController extends Controller } + + + private function getHeader(string $type): array + { + return self::HEADERS[$type] ?? []; + } + public function data(Request $request) { $type = $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] ?? ''; - + $header = $this->getHeader($request->route('type')); return view('lpj::surveyor.data.index', compact('header')); } @@ -684,21 +691,9 @@ class SurveyorController extends Controller public function createData($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.form', compact('header')); + $spekKategoriBagunan = SpekKategoritBangunan::all(); + $header = $this->getHeader($type); + return view('lpj::surveyor.data.form', compact('header','spekKategoriBagunan')); } @@ -710,30 +705,21 @@ class SurveyorController extends Controller $type = $request->route('type'); - $modelClasses = [ - '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, - ]; + $modelClass = $this->getModelClass($type); - if (!array_key_exists($type, $modelClasses)) { + if (!$modelClass) { return redirect() ->route('basicdata.'. $type .'.index') ->with('error', 'Invalid type specified.'); } - $modelClass = $modelClasses[$type]; - $data = $request->all(); - $data['status'] = true; + if($type == 'spek-bangunan') { + $validate['spek_kategori_bagunan_id'] = $request->spek_kategori_bagunan_id; + + } + + + $data = array_merge($validate, ['status' => true]); $modelClass::create($data); return redirect() @@ -757,6 +743,9 @@ class SurveyorController extends Controller 'spek-bangunan' => ['Spek Bangunan', 'spek-bangunan', SpekBangunan::class], 'spek-kategori-bangunan' => ['Spek Kategori Bangunan', 'spek-kategori-bangunan', SpekKategoritBangunan::class], 'sarana-pelengkap' => ['Sarana Pelengkap', 'sarana-pelengkap', SaranaPelengkap::class], + 'lantai-unit' => ['Lantai Unit', 'lantai-unit', Lantai::class], + 'view-unit' => ['View Unit', 'view-unit', ViewUnit::class], + 'gol-mas-sekitar' => ['Golongan Masyarakat Sekitar', 'gol-mas-sekitar', GolonganMasySekitar::class], ]; @@ -769,7 +758,13 @@ class SurveyorController extends Controller $header = $dataMap[$type] ?? ''; $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 +772,22 @@ class SurveyorController extends Controller { $validate = $request->validated(); if ($validate) { - $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, + $modelClass = $this->getModelClass($type); - ]; + if($type == 'spek-bangunan') { + $validate['spek_kategori_bagunan_id'] = $request->spek_kategori_bagunan_id; + + } // Check if the provided type exists in the modelClasses - if (!array_key_exists($type, $modelClasses)) { + if (!$modelClass) { return redirect() ->route('basicdata.' . $type . '.index') ->with('error', 'Invalid type specified.'); } - $modelClass = $modelClasses[$type]; + + + $model = $modelClass::findOrFail($id); $model->update($validate); @@ -817,8 +808,6 @@ class SurveyorController extends Controller //abort(403, 'Sorry! You are not allowed to view users.'); } - // Retrieve data from the database - $models = [ 'Bentuk Tanah' => BentukTanah::class, 'Kontur Tanah' => KonturTanah::class, @@ -828,9 +817,14 @@ class SurveyorController extends Controller 'Jenis Bangunan' => JenisBangunan::class, 'Kondisi Bangunan' => KondisiBangunan::class, 'Sifat Bangunan' => SifatBangunan::class, - // 'Spek Kategori Bangunan' => SpekKategoritBangunan::class, - // 'Spek Bangunan' => SpekBangunan::class, + 'Spek Kategori Bangunan' => SpekKategoritBangunan::class, + 'Spek Bangunan' => SpekBangunan::class, 'Sarana Pelengkap' => SaranaPelengkap::class, + 'Lalu Lintas Depan Lokasi' => LaluLintasLokasi::class, + 'Tingkat Keramaian' => TingkatKeramaian::class, + 'Golongan Masyarakat Sekitar' => GolonganMasySekitar::class, + 'Lantai Unit' => Lantai::class, + 'View Unit' => ViewUnit::class, ]; @@ -840,8 +834,6 @@ class SurveyorController extends Controller throw new InvalidArgumentException("Invalid type: $type"); } - - // Apply search filter if provided if ($request->has('search') && !empty($request->get('search'))) { $search = $request->get('search'); $query->where(function ($q) use ($search) { @@ -897,24 +889,13 @@ class SurveyorController extends Controller { try { - $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, - ]; + $modelClass = $this->getModelClass($type); - - if (!array_key_exists($type, $modelClasses)) { + if (!$modelClass) { return response()->json(['success' => false, 'message' => 'Invalid type specified.'], 400); } - $modelClass = $modelClasses[$type]; + $model = $modelClass::findOrFail($id); $model->delete(); @@ -948,6 +929,47 @@ class SurveyorController extends Controller ->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'); + + } + + + 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, + 'lantai-unit' => Lantai::class, + 'view-unit' => ViewUnit::class, + ]; + + + + private function getCommonData() { return [ @@ -964,21 +986,34 @@ class SurveyorController extends Controller 'spekKategoriBangunan' => SpekKategoritBangunan::all(), 'spekBangunan' => SpekBangunan::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) - { - $permohonan = Permohonan::find($id); - $permohonan->update([ - 'status' => 'done', - ]); - return redirect() - ->route('surveyor.index') - ->with('success', 'form surveyor submitted successfully'); - - } + private const HEADERS = [ + 'bentuk-tanah' => ['Bentuk Tanah', 'bentuk-tanah'], + 'kontur-tanah' => ['Kontur Tanah', 'kontur-tanah'], + 'posisi-kavling' => ['Posisi Kavling', 'posisi-kavling'], + 'ketinggian-tanah' => ['Ketinggian Tanah', 'ketinggian-tanah'], + 'kondisi-fisik-tanah' => ['Kondisi Fisik Tanah', 'kondisi-fisik-tanah'], + 'jenis-bangunan' => ['Jenis Bangunan', 'jenis-bangunan'], + 'kondisi-bangunan' => ['Kondisi Bangunan', 'kondisi-bangunan'], + 'sifat-bangunan' => ['Sifat Bangunan', 'sifat-bangunan'], + 'sarana-pelengkap' => ['Sarana Pelengkap', 'sarana-pelengkap'], + 'lalu-lintas-lokasi' => ['Lalu Lintas Depan Lokasi', 'lalu-lintas-lokasi'], + 'tingkat-keramaian' => ['Tingkat Keramaian', 'tingkat-keramaian'], + 'gol-mas-sekitar' => ['Golongan Masyarakat Sekitar', 'gol-mas-sekitar'], + 'spek-kategori-bangunan' => ['Spek Kategori Bangunan', 'spek-kategori-bangunan'], + 'spek-bangunan' => ['Spek Bangunan', 'spek-bangunan'], + 'lantai-unit' => ['Lantai Unit', 'lantai-unit'], + 'view-unit' => ['View Unit', 'view-unit'], + ]; } diff --git a/app/Http/Controllers/TeamsController.php b/app/Http/Controllers/TeamsController.php index e360132..a6eb9ca 100644 --- a/app/Http/Controllers/TeamsController.php +++ b/app/Http/Controllers/TeamsController.php @@ -31,20 +31,26 @@ class TeamsController extends Controller * Show the form for creating a new resource. */ public function create() - { +{ - // cek region apakah sudah ada di tabel teams - $regionTeam = Teams::pluck('regions_id')->toArray(); - $region = Regions::whereNotIn('id', $regionTeam)->get(); + $regionTeam = Teams::pluck('regions_id')->toArray(); + $regions = Regions::whereNotIn('id', $regionTeam)->get(); - // cek user apakah sudah ada di tabel teams_users - $userTeam = TeamsUsers::pluck('user_id')->toArray(); - $user = User::whereNotIn('id', $userTeam) - ->with('roles') - ->get(); + $userTeam = TeamsUsers::pluck('user_id')->toArray(); + $usersWithRole = User::whereNotIn('id', $userTeam) + ->with('roles') // Eager load roles + ->get(); - return view('lpj::teams.form', compact('region', 'user')); - } + $user = $usersWithRole->filter(function ($user) { + return $user->roles->contains(function ($role) { + return $role->name === 'surveyor' || $role->name === 'surveyor-penilai'; + }); + }); + + + + return view('lpj::teams.form', compact('regions', 'user')); +} /** * Store a newly created resource in storage. @@ -97,12 +103,19 @@ class TeamsController extends Controller { $teams = Teams::find($id); - $region = Regions::all(); $usedUsers = TeamsUsers::where('teams_id', '!=', $id)->pluck('user_id')->toArray(); - $user = User::whereNotIn('id', $usedUsers) + $usersWithRole = User::whereNotIn('id', $usedUsers) ->with('roles') ->get(); + + + $user = $usersWithRole->filter(function ($user) { + return $user->roles->contains(function ($role) { + return $role->name === 'surveyor' || $role->name === 'surveyor-penilai'; + }); + }); + // Ambil user yang sudah ada di tim ini $selectedUsers = $teams->teamsUsers->pluck('user_id')->toArray(); diff --git a/app/Http/Requests/SurveyorRequest.php b/app/Http/Requests/SurveyorRequest.php index b986f8e..7fbb8b7 100644 --- a/app/Http/Requests/SurveyorRequest.php +++ b/app/Http/Requests/SurveyorRequest.php @@ -4,62 +4,137 @@ namespace Modules\Lpj\Http\Requests; use Illuminate\Foundation\Http\FormRequest; +use Illuminate\Validation\Rule; + class SurveyorRequest extends FormRequest { /** - * Get the validation rules that apply to the request. + * Table mapping for different actionszz */ - public function rules() - : array - { - - $action = $this->input('action'); - - $uniqueTable = [ - 'bentuk-tanah' => 'bentuk_tanah', - 'kontur-tanah' => 'kontur_tanah', - 'posisi-kavling' => 'posisi_kavling', - 'ketinggian-tanah' => 'ketinggian_tanah', - 'kondisi-fisik-tanah' => 'kondisi_fisik_tanah', - 'kondisi-bangunan' => 'kondisi_bangunan', - 'jenis-bangunan' => 'jenis_bangunan', - 'sifat-bangunan' => 'sifat_bangunan', - 'sarana-pelengkap' => 'sarana_pelengkap', - 'lalu_lintas_lokasi' => 'lalu_lintas_lokasi', - '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; - } + private const TABLE_MAPPING = [ + 'bentuk-tanah' => 'bentuk_tanah', + 'kontur-tanah' => 'kontur_tanah', + 'posisi-kavling' => 'posisi_kavling', + 'ketinggian-tanah' => 'ketinggian_tanah', + 'kondisi-fisik-tanah' => 'kondisi_fisik_tanah', + 'kondisi-bangunan' => 'kondisi_bangunan', + 'jenis-bangunan' => 'jenis_bangunan', + 'sifat-bangunan' => 'sifat_bangunan', + 'sarana-pelengkap' => 'sarana_pelengkap', + 'lalu-lintas-lokasi' => 'lalu_lintas_lokasi', + 'tingkat-keramaian' => 'tingkat_keramaian', + 'gol-mas-sekitar' => 'gol_mas_sekitar', + 'spek-kategori-bangunan' => 'spek_kategori_bangunan', + 'spek-bangunan' => 'spek_bangunan', + 'lantai-unit' => 'lantai', + 'view-unit' => 'view_unit', + ]; /** * Determine if the user is authorized to make this request. */ - public function authorize() - : bool + public function authorize(): bool { 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([ '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', + ]; + } } diff --git a/app/Models/GolonganMasySekitar.php b/app/Models/GolonganMasySekitar.php index 5140710..a4d1f9a 100644 --- a/app/Models/GolonganMasySekitar.php +++ b/app/Models/GolonganMasySekitar.php @@ -10,10 +10,12 @@ class GolonganMasySekitar extends Model { use HasFactory; + protected $table = 'gol_mas_sekitar'; /** * The attributes that are mass assignable. */ - protected $fillable = []; + protected $fillable = ['code', 'name', 'status']; + protected static function newFactory(): GolonganMasySekitarFactory { diff --git a/app/Models/Lantai.php b/app/Models/Lantai.php new file mode 100644 index 0000000..3330df1 --- /dev/null +++ b/app/Models/Lantai.php @@ -0,0 +1,23 @@ +unsignedBigInteger('permohonan_id'); $table->foreign('permohonan_id')->references('id')->on('permohonan'); $table->string('luas'); + $table->unsignedBigInteger('jenis_jaminan_id'); $table->char('authorized_status', 1)->nullable(); $table->timestamp('authorized_at')->nullable(); $table->unsignedBigInteger('authorized_by')->nullable(); diff --git a/database/migrations/2024_10_16_153841_create_denah_table.php b/database/migrations/2024_10_16_153841_create_denah_table.php index 308a7ad..71475ff 100644 --- a/database/migrations/2024_10_16_153841_create_denah_table.php +++ b/database/migrations/2024_10_16_153841_create_denah_table.php @@ -18,7 +18,7 @@ return new class () extends Migration { $table->string('foto_denah'); $table->string('luas'); - + $table->unsignedBigInteger('jenis_jaminan_id'); $table->char('authorized_status', 1)->nullable(); $table->timestamp('authorized_at')->nullable(); $table->unsignedBigInteger('authorized_by')->nullable(); diff --git a/database/migrations/2024_10_16_153902_create_foto_jaminan_table.php b/database/migrations/2024_10_16_153902_create_foto_jaminan_table.php index f0e1000..3c7f514 100644 --- a/database/migrations/2024_10_16_153902_create_foto_jaminan_table.php +++ b/database/migrations/2024_10_16_153902_create_foto_jaminan_table.php @@ -16,7 +16,7 @@ return new class () extends Migration { $table->foreign('permohonan_id')->references('id')->on('permohonan'); $table->string('pendamping'); - + $table->unsignedBigInteger('jenis_jaminan_id'); $table->char('authorized_status', 1)->nullable(); $table->timestamp('authorized_at')->nullable(); $table->unsignedBigInteger('authorized_by')->nullable(); diff --git a/database/migrations/2024_10_16_153918_create_objek_jaminan_table.php b/database/migrations/2024_10_16_153918_create_objek_jaminan_table.php index b55f7eb..3d02a38 100644 --- a/database/migrations/2024_10_16_153918_create_objek_jaminan_table.php +++ b/database/migrations/2024_10_16_153918_create_objek_jaminan_table.php @@ -19,6 +19,7 @@ return new class () extends Migration { $table->string('name'); $table->string('foto_objek'); + $table->unsignedBigInteger('jenis_jaminan_id'); $table->char('authorized_status', 1)->nullable(); $table->timestamp('authorized_at')->nullable(); $table->unsignedBigInteger('authorized_by')->nullable(); diff --git a/database/migrations/2024_10_25_014340_create_lokasi_unit_table.php b/database/migrations/2024_10_25_014340_create_lokasi_unit_table.php new file mode 100644 index 0000000..cc51e6d --- /dev/null +++ b/database/migrations/2024_10_25_014340_create_lokasi_unit_table.php @@ -0,0 +1,37 @@ +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'); + } +}; diff --git a/database/migrations/2024_10_25_014428_create_view_unit_table.php b/database/migrations/2024_10_25_014428_create_view_unit_table.php new file mode 100644 index 0000000..5a99cfe --- /dev/null +++ b/database/migrations/2024_10_25_014428_create_view_unit_table.php @@ -0,0 +1,36 @@ +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'); + } +}; diff --git a/module.json b/module.json index 427bfca..ed66671 100644 --- a/module.json +++ b/module.json @@ -344,7 +344,7 @@ "roles": ["administrator", "admin"] }, { - "title": "Bentuk Tanah", + "title": "Bentuk", "path": "basicdata.bentuk-tanah", "classes": "", "attributes": [], @@ -415,8 +415,66 @@ "attributes": [], "permission": "", "roles": ["surveyor"] + }, + + { + "title": "Lalu Lintas Sekitar", + "path": "basicdata.lalu-lintas-lokasi", + "classes": "", + "attributes": [], + "permission": "", + "roles": ["surveyor"] + }, + { + "title": "Tingkat Keramaian", + "path": "basicdata.tingkat-keramaian", + "classes": "", + "attributes": [], + "permission": "", + "roles": ["surveyor"] + }, + { + "title": "Masyarakat Sekitar", + "path": "basicdata.gol-mas-sekitar", + "classes": "", + "attributes": [], + "permission": "", + "roles": ["surveyor"] + }, + { + "title": "Lantai Unit", + "path": "basicdata.lantai-unit", + "classes": "", + "attributes": [], + "permission": "", + "roles": ["surveyor"] + }, + { + "title": "View unit", + "path": "basicdata.view-unit", + "classes": "", + "attributes": [], + "permission": "", + "roles": ["surveyor"] + }, + { + "title": "Spesifikasi Bangunan", + "path": "basicdata.spek-bangunan", + "classes": "", + "attributes": [], + "permission": "", + "roles": ["surveyor"] + }, + { + "title": "Kategori Speksikasi Bangunan", + "path": "basicdata.spek-kategori-bangunan", + "classes": "", + "attributes": [], + "permission": "", + "roles": ["surveyor"] } + ] } ], diff --git a/resources/views/activity/progres_activity/index.blade.php b/resources/views/activity/progres_activity/index.blade.php index 7f824da..67942a7 100644 --- a/resources/views/activity/progres_activity/index.blade.php +++ b/resources/views/activity/progres_activity/index.blade.php @@ -180,7 +180,7 @@ }, 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: { title: 'Jenis Report', diff --git a/resources/views/penilaian/form.blade.php b/resources/views/penilaian/form.blade.php index 07e7061..8ac5c47 100644 --- a/resources/views/penilaian/form.blade.php +++ b/resources/views/penilaian/form.blade.php @@ -280,15 +280,14 @@ +
- + + type="text" value="{{ $jenisPenilaian->name }}" readonly> @error('jenis_penilaian_id') {{ $message }} @enderror @@ -300,9 +299,7 @@ Tim Penilai yang di tunjuk
- + @error('teams_id') @@ -311,62 +308,115 @@
+
- +
+ +
- @error('surveyor_id') + @error('surveyor_selection') {{ $message }} @enderror
- -
- -
- - @error('penilaian_id') - {{ $message }} - @enderror + -
- -
- - @error('penilai_surveyor_id') - {{ $message }} - @enderror + + -
- -
- -
- - -
@@ -473,8 +516,51 @@
@endsection @push('scripts') - + + + + +@endpush diff --git a/resources/views/surveyor/components/alat-berat.blade.php b/resources/views/surveyor/components/alat-berat.blade.php new file mode 100644 index 0000000..c010e38 --- /dev/null +++ b/resources/views/surveyor/components/alat-berat.blade.php @@ -0,0 +1,192 @@ + + +
+ + +
+

Identitas Debitur

+
+
+ +
+ + + @error('bentuk_tanah') + {{ $message }} + @enderror +
+
+ +
+

Lokasi Jaminan

+
+
+ @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) + +
+ +
+ + + @error('bentuk_tanah') + {{ $message }} + @enderror +
+
+ @endforeach + @endif +
+
+ + +
+
+

Data Data Jaminan

+
+
+
+ +
+ + + @error('hadapMataAngin') + {{ $message }} + @enderror +
+
+ + @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) + +
+ +
+ + + @error('bentuk_tanah') + {{ $message }} + @enderror +
+
+ @endforeach + @endif +
+
+ + + +
+
+

Kondisi Objek Jaminan

+
+
+
+ +
+ + + @error('hadapMataAngin') + {{ $message }} + @enderror +
+
+ + @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) + +
+ +
+ + + @error('bentuk_tanah') + {{ $message }} + @enderror +
+
+ @endforeach + @endif +
+
diff --git a/resources/views/surveyor/components/apartemen-kantor.blade.php b/resources/views/surveyor/components/apartemen-kantor.blade.php index 05e0adb..28cb7e8 100644 --- a/resources/views/surveyor/components/apartemen-kantor.blade.php +++ b/resources/views/surveyor/components/apartemen-kantor.blade.php @@ -1,5 +1,5 @@
-
+

Analisa Unit

@@ -104,8 +104,8 @@ class="input tomselect w-full @error('lantai') border-danger bg-danger-light @enderror" name="lantai"> - @if (isset($posisiKavling)) - @foreach ($posisiKavling as $item) + @if (isset($lantai)) + @foreach ($lantai as $item) @endforeach @endif @@ -126,8 +126,8 @@ class="input tomselect w-full @error('view') border-danger bg-danger-light @enderror" name="view"> - @if (isset($kondisiFisikTanah)) - @foreach ($kondisiFisikTanah as $item) + @if (isset($viewUnit)) + @foreach ($viewUnit as $item) @endforeach @endif @@ -146,8 +146,8 @@ class="input tomselect w-full @error('bentuk_unit') border-danger bg-danger-light @enderror" name="bentuk_unit"> - @if (isset($kondisiFisikTanah)) - @foreach ($kondisiFisikTanah as $item) + @if (isset($bentukTanah)) + @foreach ($bentukTanah as $item) @endforeach @endif diff --git a/resources/views/surveyor/components/foto.blade.php b/resources/views/surveyor/components/foto.blade.php index 4ca2845..b31698f 100644 --- a/resources/views/surveyor/components/foto.blade.php +++ b/resources/views/surveyor/components/foto.blade.php @@ -5,6 +5,7 @@ @endsection --}} @section('content') +
@@ -120,7 +121,6 @@
-
+ +

Rute Menuju Lokasi

@@ -177,25 +179,33 @@ @if (isset($fotoJaminan)) @foreach ($fotoJaminan->ruteJaminan as $item) - + @if (isset($item->foto_rute)) + Gambar Pendamping + @endif
- @if (isset($item->foto_rute)) - Gambar Pendamping - @endif - - - -
+ +
+ + + +
+ + +
@error('foto_rute.*') {{ $message }} @@ -211,9 +221,17 @@ - - + +
+ + + +
+
+
@@ -289,7 +314,7 @@
-
+
@@ -336,10 +361,16 @@ - - +
+ + + +
+
+
+ +
+
+ + + + + @endsection @push('scripts') + + + + @include('lpj::surveyor.js.camera-editor') +@endpush diff --git a/routes/breadcrumbs.php b/routes/breadcrumbs.php index 556342e..2ea8c02 100644 --- a/routes/breadcrumbs.php +++ b/routes/breadcrumbs.php @@ -550,7 +550,8 @@ Breadcrumbs::for('basicdata.editData', function (BreadcrumbTrail $trail, $type = $otorisatorSurveyor = [ 'pelaporan' => 'Pelaporan', 'pembayaran' => 'Pembayaran', - 'pembayaran' => 'Pembayaran' + 'pembatalan' => 'Pembatalan', + 'sla' => 'SLA', ]; foreach ($otorisatorSurveyor as $route => $title) { From 10c9567b4f1546871b9a5cf39f47cd1aad4b6cbf Mon Sep 17 00:00:00 2001 From: majid Date: Tue, 5 Nov 2024 08:29:27 +0700 Subject: [PATCH 03/10] update assigment lintas region --- app/Http/Controllers/ActivityController.php | 79 ++++-- app/Http/Controllers/PenilaianController.php | 199 ++++++++++--- app/Http/Controllers/SurveyorController.php | 25 +- app/Http/Controllers/TeamsController.php | 4 +- app/Http/Requests/PenilaianRequest.php | 9 +- app/Models/Penilaian.php | 13 +- app/Models/PenilaianTeam.php | 39 +++ app/Models/Permohonan.php | 5 + app/Models/Teams.php | 4 +- ...24227_create_kategori_jenis_aset_table.php | 37 +++ ...24_10_31_032505_update_penilaian_table.php | 38 +++ ...10_31_032940_create_penilai_team_table.php | 38 +++ ...e_kategori_form_analisa_inspeksi_table.php | 38 +++ ...81225_create_label_name_inspeksi_table.php | 28 ++ .../activity/progres_activity/index.blade.php | 20 +- resources/views/penilaian/form.blade.php | 265 +++++++++++------- .../surveyor/components/inspeksi.blade.php | 90 +++--- resources/views/surveyor/detail.blade.php | 2 +- resources/views/surveyor/index.blade.php | 18 +- 19 files changed, 699 insertions(+), 252 deletions(-) create mode 100644 app/Models/PenilaianTeam.php create mode 100644 database/migrations/2024_10_31_024227_create_kategori_jenis_aset_table.php create mode 100644 database/migrations/2024_10_31_032505_update_penilaian_table.php create mode 100644 database/migrations/2024_10_31_032940_create_penilai_team_table.php create mode 100644 database/migrations/2024_11_01_081201_create_kategori_form_analisa_inspeksi_table.php create mode 100644 database/migrations/2024_11_01_081225_create_label_name_inspeksi_table.php diff --git a/app/Http/Controllers/ActivityController.php b/app/Http/Controllers/ActivityController.php index 74bb5f7..816e1e8 100644 --- a/app/Http/Controllers/ActivityController.php +++ b/app/Http/Controllers/ActivityController.php @@ -30,31 +30,44 @@ class ActivityController extends Controller */ - public function progres_activity() - { - // Ambil user yang sedang login - $user = auth()->user(); - $roles = $user->load('roles'); - $regionId = null; + public function progres_activity() + { + // Ambil user yang sedang login + $user = auth()->user(); + $roles = $user->load('roles'); - // Cek apakah user memiliki role 'senior officer' - if ($roles->roles->pluck('name')->contains('senior officer')) { - $regionId = TeamsUsers::with('team.regions') - ->where('user_id', $user->id) - ->first()?->team->regions_id; - } + // Inisialisasi regionId dan teamId sebagai null agar bisa dinamis + $regionId = null; + $teamId = null; - $teamsActivity = TeamsUsers::with(['user', 'team', 'team.regions']) - ->whereHas('team', function ($q) use ($regionId) { - if ($regionId) { - $q->where('regions_id', $regionId); - } - }) - ->where('user_id', '!=', $user->id) - ->get(); + if ($roles->roles->pluck('name')->contains('senior-officer')) { + $userTeam = TeamsUsers::with('team') + ->where('user_id', $user->id) + ->first(); + $regionId = $userTeam?->team->regions_id; + $teamId = $userTeam?->teams_id; + + } + + $teamsActivity = TeamsUsers::with(['user', 'team', 'team.regions', 'user.roles']) + ->whereHas('team', function ($q) use ($regionId, $teamId) { + if ($regionId) { + $q->where('regions_id', $regionId); + } + if ($teamId) { + $q->where('id', $teamId); // Hanya tim yang sama + } + }) + ->where('user_id', '!=', $user->id) + ->whereHas('user.roles', function ($query) { + // Filter hanya peran 'surveyor' atau 'surveyor-penilai' + $query->whereIn('name', ['surveyor', 'surveyor-penilai']); + }) + ->get(); + + return view('lpj::activity.progres_activity.index', compact('teamsActivity')); + } - return view('lpj::activity.progres_activity.index', compact('teamsActivity')); - } public function senior() @@ -194,13 +207,23 @@ class ActivityController extends Controller 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::with(['permohonan', 'permohonan.debiture', 'permohonan.tujuanPenilaian', 'permohonan.debiture.documents.jenisJaminan']) - ->where(function($q) use ($id) { - $q->where('surveyor_id', $id) - ->orWhere('penilaian_id', $id) - ->orWhere('penilai_surveyor_id', $id); - }); + $query = Penilaian::with([ + 'permohonan', + 'permohonan.debiture', + 'permohonan.tujuanPenilaian', + 'permohonan.debiture.documents.jenisJaminan', + 'userPenilai' + ]) + ->whereHas('userPenilai', function ($q) use ($id) { + $q->where('user_id', $id); + }); + + // Filter pencarian if ($request->has('search') && !empty($request->get('search'))) { diff --git a/app/Http/Controllers/PenilaianController.php b/app/Http/Controllers/PenilaianController.php index c25f341..c0730a6 100644 --- a/app/Http/Controllers/PenilaianController.php +++ b/app/Http/Controllers/PenilaianController.php @@ -5,14 +5,18 @@ namespace Modules\Lpj\Http\Controllers; use App\Http\Controllers\Controller; use Exception; use Illuminate\Http\Request; +use Illuminate\Support\Facades\DB; use Modules\Lpj\Http\Requests\PenilaianRequest; use Modules\Lpj\Models\JenisPenilaian; use Modules\Lpj\Models\Penilaian; +use Modules\Lpj\Models\PenilaianTeam; use Modules\Lpj\Models\Permohonan; use Modules\Lpj\Models\StatusPermohonan; use Modules\Lpj\Models\Teams; +use Modules\Lpj\Models\Regions; use Modules\Lpj\Models\TeamsUsers; use Modules\Usermanagement\Models\User; +use Illuminate\Support\Facades\Auth; class PenilaianController extends Controller { @@ -37,17 +41,84 @@ class PenilaianController extends Controller if ($validatedData) { 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']; + $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']; + $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([ - 'status' => 'assign', + 'status' => $status, ]); + DB::commit(); + return redirect()->route('penilaian.index')->with('success', 'Penilaian berhasil disimpan'); } catch (Exception $e) { - - return redirect()->route('penilaian.index')->with('error', $e->getMessage()); + DB::rollBack(); + return response()->json(array('error' => $e->getMessage())); } } } @@ -63,22 +134,43 @@ class PenilaianController extends Controller /** * Update the specified resource in storage. */ - public function update(PenilaianRequest $request, $id) + public function update(Request $request, $id) { - $validate = $request->validated(); - if ($validate) { - try { - $penilaian = Penilaian::where('nomor_registrasi', $request->nomor_registrasi)->firstOrFail(); - $penilaian->update($validate); - $permohonan = Permohonan::where('nomor_registrasi', $request->nomor_registrasi); - $permohonan->update([ - 'status' => 'assign', - ]); + try { + DB::beginTransaction(); + $penilaian = Penilaian::where('nomor_registrasi', $request->nomor_registrasi)->first(); + + $penilaianId = $penilaian->id; + + $penilainTeam = PenilaianTeam::where('penilaian_id', $penilaianId)->get(); + + + 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 response()->json(array('error' => $e->getMessage())); } } @@ -87,29 +179,36 @@ class PenilaianController extends Controller */ public function assignment($id) { - $permohonan = Permohonan::with( - [ - 'user', - 'debiture.province', - 'debiture.city', - 'debiture.district', - 'debiture.village', - 'branch', - 'tujuanPenilaian', - ], - )->findOrFail($id); + $permohonan = Permohonan::with([ + 'user', + 'debiture.province', + 'debiture.city', + 'debiture.district', + 'debiture.village', + 'branch', + 'tujuanPenilaian', + ])->findOrFail($id); - $idPenilaian = $permohonan->jenis_penilaian_id; + $idPenilaian = $permohonan->jenis_penilaian_id; $idRegion = $permohonan->region_id; $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']) - ->whereHas('regions', function ($q) use ($idRegion) { - $q->where('id', $idRegion); - })->get(); - + $teamPenilai = $userTeam->flatMap(function ($team) { + return $team->teamsUsers->filter(function ($teamUser) { + return $teamUser->user->roles->contains(function ($role) { + return $role->name === 'surveyor' || $role->name === 'surveyor-penilai'; + }); + })->map(function ($teamUser) { + return $teamUser->user; + }); + })->unique('id'); $existingTeamIds = $teamPenilai->pluck('id')->toArray(); @@ -117,19 +216,29 @@ class PenilaianController extends Controller ->whereNotIn('id', $existingTeamIds) ->get(); - $regionName = null; - foreach ($teamPenilai as $item) { + foreach ($userTeam as $item) { $regionName = $item->regions; } + // $regionName = $userTeam->first()?->regions->name; + - // dd($teamPenilai); $penilaian = Penilaian::where('nomor_registrasi', $permohonan->nomor_registrasi)->first(); - return view('lpj::penilaian.form', compact('permohonan', 'teamPenilai', 'jenisPenilaian', 'penilaian', 'regionName', 'updateTeamPenilai')); - } + $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. */ @@ -167,8 +276,9 @@ class PenilaianController extends Controller public function dataForDatatables(Request $request) { + if (is_null($this->user) || !$this->user->can('debitur.view')) { - // abort(403, 'Sorry! You are not allowed to view users.'); + } $query = Permohonan::query(); @@ -187,6 +297,9 @@ class PenilaianController extends Controller } $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'))) { $order = $request->get('sortOrder'); @@ -209,7 +322,7 @@ class PenilaianController extends Controller } $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); @@ -312,7 +425,7 @@ class PenilaianController extends Controller if (!empty($otorisator)) { if ($status == 'proses') { $query->whereIn('status_bayar', ['sudah_bayar', 'belum_bayar']); - }else{ + } else { $query->whereRaw('LOWER(status) = ?', [strtolower($status)]); } } diff --git a/app/Http/Controllers/SurveyorController.php b/app/Http/Controllers/SurveyorController.php index d4e30df..c9ff799 100644 --- a/app/Http/Controllers/SurveyorController.php +++ b/app/Http/Controllers/SurveyorController.php @@ -6,6 +6,7 @@ use App\Http\Controllers\Controller; use Illuminate\Http\RedirectResponse; use Illuminate\Http\Request; use Illuminate\Support\Facades\DB; +use Illuminate\Support\Facades\Auth; use Illuminate\Http\Response; use Modules\Lpj\Models\Permohonan; use Modules\Lpj\Models\Branch; @@ -47,6 +48,7 @@ use Modules\Lpj\Http\Requests\FormSurveyorRequest; class SurveyorController extends Controller { public $user; + /** * Display a listing of the resource. */ @@ -118,6 +120,8 @@ class SurveyorController extends Controller ->where('permohonan_id', $id) ->get(); + + return view('lpj::surveyor.detail', compact( 'buttonDisable', 'fotojaminan', @@ -513,6 +517,11 @@ class SurveyorController extends Controller $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'))) { $order = $request->get('sortOrder'); $column = $request->get('sortField'); @@ -614,7 +623,6 @@ class SurveyorController extends Controller 'golMasySekitar', 'tingkatKeramaian', 'laluLintasLokasi' - )); } @@ -693,7 +701,7 @@ class SurveyorController extends Controller $spekKategoriBagunan = SpekKategoritBangunan::all(); $header = $this->getHeader($type); - return view('lpj::surveyor.data.form', compact('header','spekKategoriBagunan')); + return view('lpj::surveyor.data.form', compact('header', 'spekKategoriBagunan')); } @@ -713,7 +721,7 @@ class SurveyorController extends Controller ->with('error', 'Invalid type specified.'); } - if($type == 'spek-bangunan') { + if ($type == 'spek-bangunan') { $validate['spek_kategori_bagunan_id'] = $request->spek_kategori_bagunan_id; } @@ -764,7 +772,7 @@ class SurveyorController extends Controller } - return view('lpj::surveyor.data.form', compact('header', 'model','spekKategoriBagunan')); + return view('lpj::surveyor.data.form', compact('header', 'model', 'spekKategoriBagunan')); } @@ -774,7 +782,7 @@ class SurveyorController extends Controller if ($validate) { $modelClass = $this->getModelClass($type); - if($type == 'spek-bangunan') { + if ($type == 'spek-bangunan') { $validate['spek_kategori_bagunan_id'] = $request->spek_kategori_bagunan_id; } @@ -931,6 +939,8 @@ class SurveyorController extends Controller public function submitSurveyor(Request $request, $id) { + + $permohonan = Permohonan::find($id); $permohonan->update([ 'status' => 'done', @@ -942,6 +952,11 @@ class SurveyorController extends Controller } + public function validateSubmit(){ + + } + + private function getModelClass(string $type): ?string { return $this->modelClasses[$type] ?? null; diff --git a/app/Http/Controllers/TeamsController.php b/app/Http/Controllers/TeamsController.php index a6eb9ca..c699c81 100644 --- a/app/Http/Controllers/TeamsController.php +++ b/app/Http/Controllers/TeamsController.php @@ -43,7 +43,7 @@ class TeamsController extends Controller $user = $usersWithRole->filter(function ($user) { return $user->roles->contains(function ($role) { - return $role->name === 'surveyor' || $role->name === 'surveyor-penilai'; + return $role->name === 'surveyor' || $role->name === 'surveyor-penilai' || $role->name === 'senior-officer'; }); }); @@ -112,7 +112,7 @@ class TeamsController extends Controller $user = $usersWithRole->filter(function ($user) { return $user->roles->contains(function ($role) { - return $role->name === 'surveyor' || $role->name === 'surveyor-penilai'; + return $role->name === 'surveyor' || $role->name === 'surveyor-penilai' || $role->name === 'senior-officer'; }); }); diff --git a/app/Http/Requests/PenilaianRequest.php b/app/Http/Requests/PenilaianRequest.php index 0d9c1bf..af33782 100644 --- a/app/Http/Requests/PenilaianRequest.php +++ b/app/Http/Requests/PenilaianRequest.php @@ -33,9 +33,12 @@ class PenilaianRequest extends FormRequest 'tanggal_kunjungan' => 'required|max:255', 'status' => 'required|string', 'nomor_registrasi' => 'required|string', - 'surveyor_id' => 'nullable|required_without:penilai_surveyor_id', - 'penilaian_id' => 'nullable|required_without:penilai_surveyor_id', - 'penilai_surveyor_id' => 'nullable|required_without_all:surveyor_id,penilaian_id', + 'surveyor_id' => 'nullable| required_without:penilai_surveyor_id', + 'penilai_id' => 'nullable|required_without:penilai_surveyor_id', + 'penilai_surveyor_id' => 'nullable|required_without_all:surveyor_id,penilai_id', + 'surveyor_region_id' => 'nullable|required_without:surveyor_id', + 'penilai_region_id' => 'nullable|required_without:penilai_id', + 'keterangan' => 'nullable', ]; } diff --git a/app/Models/Penilaian.php b/app/Models/Penilaian.php index cb2f44c..b77937a 100644 --- a/app/Models/Penilaian.php +++ b/app/Models/Penilaian.php @@ -17,7 +17,7 @@ class Penilaian extends Model */ protected $table = 'penilaian'; protected $fillable = [ - 'jenis_penilaian_id', 'teams_id', 'tanggal_kunjungan', 'keterangan','nomor_registrasi','penilaian_id','surveyor_id','penilai_surveyor_id', + 'jenis_penilaian_id', 'tanggal_kunjungan', 'keterangan','nomor_registrasi', 'status', 'authorized_status', 'authorized_at', 'authorized_by', 'created_at', 'created_by', 'updated_at', 'updated_by', 'deleted_at', 'deleted_by' ]; @@ -39,18 +39,9 @@ class Penilaian extends Model 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() { diff --git a/app/Models/PenilaianTeam.php b/app/Models/PenilaianTeam.php new file mode 100644 index 0000000..8df88ef --- /dev/null +++ b/app/Models/PenilaianTeam.php @@ -0,0 +1,39 @@ +belongsTo(User::class, 'user_id', 'id'); + } + + public function team(){ + + return $this->belongsTo(Team::class, 'team_id', 'id'); + } + + public function penilaian(){ + + return $this->belongsTo(Penilaian::class, 'penilaian_id', 'id'); + } + + protected static function newFactory(): PenilaianTeamFactory + { + //return PenilaianTeamFactory::new(); + } +} diff --git a/app/Models/Permohonan.php b/app/Models/Permohonan.php index 8e4676b..8f6b0bd 100644 --- a/app/Models/Permohonan.php +++ b/app/Models/Permohonan.php @@ -83,4 +83,9 @@ class Permohonan extends Base { return $this->belongsTo(Penilaian::class, 'nomor_registrasi', 'nomor_registrasi'); } + + public function region() + { + return $this->belongsTo(Regions::class, 'region_id'); + } } diff --git a/app/Models/Teams.php b/app/Models/Teams.php index 0fd48a8..1348a6c 100644 --- a/app/Models/Teams.php +++ b/app/Models/Teams.php @@ -30,8 +30,8 @@ class Teams extends Model return $this->hasMany(TeamsUsers::class, 'teams_id', 'id'); } - public function penilaian(){ - return $this->hasMany(Penilaian::class, 'teams_id', 'id'); + public function penilaianTeam(){ + return $this->hasMany(penilaianTeam::class, 'team_id', 'id'); } diff --git a/database/migrations/2024_10_31_024227_create_kategori_jenis_aset_table.php b/database/migrations/2024_10_31_024227_create_kategori_jenis_aset_table.php new file mode 100644 index 0000000..50b5cb3 --- /dev/null +++ b/database/migrations/2024_10_31_024227_create_kategori_jenis_aset_table.php @@ -0,0 +1,37 @@ +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'); + } +}; diff --git a/database/migrations/2024_10_31_032505_update_penilaian_table.php b/database/migrations/2024_10_31_032505_update_penilaian_table.php new file mode 100644 index 0000000..53d1715 --- /dev/null +++ b/database/migrations/2024_10_31_032505_update_penilaian_table.php @@ -0,0 +1,38 @@ +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); + }); + } +}; diff --git a/database/migrations/2024_10_31_032940_create_penilai_team_table.php b/database/migrations/2024_10_31_032940_create_penilai_team_table.php new file mode 100644 index 0000000..db287b2 --- /dev/null +++ b/database/migrations/2024_10_31_032940_create_penilai_team_table.php @@ -0,0 +1,38 @@ +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'); + } +}; diff --git a/database/migrations/2024_11_01_081201_create_kategori_form_analisa_inspeksi_table.php b/database/migrations/2024_11_01_081201_create_kategori_form_analisa_inspeksi_table.php new file mode 100644 index 0000000..7b14758 --- /dev/null +++ b/database/migrations/2024_11_01_081201_create_kategori_form_analisa_inspeksi_table.php @@ -0,0 +1,38 @@ +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'); + } +}; diff --git a/database/migrations/2024_11_01_081225_create_label_name_inspeksi_table.php b/database/migrations/2024_11_01_081225_create_label_name_inspeksi_table.php new file mode 100644 index 0000000..814024d --- /dev/null +++ b/database/migrations/2024_11_01_081225_create_label_name_inspeksi_table.php @@ -0,0 +1,28 @@ +id(); + + $table->timestamps(); + }); + } + + /** + * Reverse the migrations. + */ + public function down(): void + { + Schema::dropIfExists('label_name_inspeksi'); + } +}; diff --git a/resources/views/activity/progres_activity/index.blade.php b/resources/views/activity/progres_activity/index.blade.php index 67942a7..6bf9a2b 100644 --- a/resources/views/activity/progres_activity/index.blade.php +++ b/resources/views/activity/progres_activity/index.blade.php @@ -46,14 +46,14 @@ @php $sortedTeamsActivity = $teamsActivity->sortBy(function ($item) { - return $item->team->penilaian - ->filter(function ($penilaian) use ($item) { - return $penilaian->penilaian_id == $item->user->id || - $penilaian->surveyor_id == $item->user->id || - $penilaian->penilai_surveyor_id == $item->user->id; + + return $item->team->penilaianTeam + ->filter(function ($penilaianTeam) use ($item) { + return $penilaianTeam->user_id == $item->user->id; }) ->count(); }); + @endphp @foreach ($sortedTeamsActivity as $index => $item) @@ -70,11 +70,9 @@ @php - $totalTasks = $item->team->penilaian - ->filter(function ($penilaian) use ($item) { - return $penilaian->penilaian_id == $item->user->id || - $penilaian->surveyor_id == $item->user->id || - $penilaian->penilai_surveyor_id == $item->user->id; + $totalTasks = $item->team->penilaianTeam + ->filter(function ($penilaianTeam) use ($item) { + return $penilaianTeam->user_id == $item->user->id; }) ->count(); @endphp @@ -156,8 +154,6 @@ const apiUrl = accordion.querySelector('.card-grid').getAttribute( 'data-api-url'); - console.log("This is the API URL: " + apiUrl); - const dataTableOptions = { apiEndpoint: apiUrl, pageSize: 5, diff --git a/resources/views/penilaian/form.blade.php b/resources/views/penilaian/form.blade.php index d068566..2986624 100644 --- a/resources/views/penilaian/form.blade.php +++ b/resources/views/penilaian/form.blade.php @@ -308,8 +308,12 @@
+ {{-- @php + var_dump($penilaianTeam); + @endphp --}} -
+
@@ -328,6 +332,7 @@ @enderror
+ -