From f7479770e6e297ffeee78ce31392138d8c061ad0 Mon Sep 17 00:00:00 2001 From: rekywhyd Date: Fri, 5 Jun 2026 18:34:30 +0700 Subject: [PATCH] Tampilan awal --- app/Http/Controllers/MapController.php | 146 ++++++++++ app/Models/PenerimaBantuan.php | 30 +++ app/Models/TempatIbadah.php | 28 ++ ..._05_090029_create_tempat_ibadahs_table.php | 32 +++ ...6_05_090030_create_rumah_miskins_table.php | 31 +++ ...ename_rumah_miskin_to_penerima_bantuan.php | 24 ++ ...06_05_101633_add_columns_to_map_tables.php | 42 +++ .../views/daftar-penerima-bantuan.blade.php | 114 ++++++++ .../views/daftar-tempat-ibadah.blade.php | 101 +++++++ resources/views/dashboard.blade.php | 255 +++++++++++++++++- resources/views/layouts/navigation.blade.php | 12 + routes/web.php | 14 +- 12 files changed, 824 insertions(+), 5 deletions(-) create mode 100644 app/Http/Controllers/MapController.php create mode 100644 app/Models/PenerimaBantuan.php create mode 100644 app/Models/TempatIbadah.php create mode 100644 database/migrations/2026_06_05_090029_create_tempat_ibadahs_table.php create mode 100644 database/migrations/2026_06_05_090030_create_rumah_miskins_table.php create mode 100644 database/migrations/2026_06_05_094151_rename_rumah_miskin_to_penerima_bantuan.php create mode 100644 database/migrations/2026_06_05_101633_add_columns_to_map_tables.php create mode 100644 resources/views/daftar-penerima-bantuan.blade.php create mode 100644 resources/views/daftar-tempat-ibadah.blade.php diff --git a/app/Http/Controllers/MapController.php b/app/Http/Controllers/MapController.php new file mode 100644 index 0000000..6777bba --- /dev/null +++ b/app/Http/Controllers/MapController.php @@ -0,0 +1,146 @@ +get(); + return view('dashboard', compact('ibadahs', 'penerimas')); + } + + public function daftarPenerimaBantuan() + { + $penerimas = \App\Models\PenerimaBantuan::with('tempat_ibadah')->get(); + $ibadahs = \App\Models\TempatIbadah::all(); + return view('daftar-penerima-bantuan', compact('penerimas', 'ibadahs')); + } + + public function daftarTempatIbadah() + { + $ibadahs = \App\Models\TempatIbadah::all(); + return view('daftar-tempat-ibadah', compact('ibadahs')); + } + + public function save(Request $request) + { + $type = $request->type; + $nama = $request->nama; + $lat = $request->lat; + $lng = $request->lng; + $alamat = $request->alamat; + + if ($type == 'ibadah') { + \App\Models\TempatIbadah::create([ + 'nama_tempat' => $nama, + 'jenis_tempat_ibadah' => $request->jenis_tempat_ibadah, + 'kontak_person' => $request->kontak_person, + 'radius_meter' => 500, + 'lat' => $lat, + 'lng' => $lng, + 'alamat' => $alamat + ]); + } else { + $fotoPath = null; + if ($request->hasFile('foto_kondisi_rumah')) { + $fotoPath = $request->file('foto_kondisi_rumah')->store('fotos', 'public'); + } + + \App\Models\PenerimaBantuan::create([ + 'nama_kepala_keluarga' => $nama, + 'id_tempat_ibadah' => $request->id_tempat_ibadah, + 'nik_kepala_keluarga' => $request->nik_kepala_keluarga, + 'nomor_kk' => $request->nomor_kk, + 'jumlah_tanggungan' => $request->jumlah_tanggungan, + 'foto_kondisi_rumah' => $fotoPath, + 'lat' => $lat, + 'lng' => $lng, + 'alamat' => $alamat + ]); + } + return response()->json(['status' => 'success']); + } + + public function updateRadius(Request $request) + { + $id = $request->id; + $radius = $request->radius; + \App\Models\TempatIbadah::where('id', $id)->update(['radius_meter' => $radius]); + $this->checkAndUnlinkPenerima($id); + return response()->json(['status' => 'success']); + } + + public function edit(Request $request) + { + $id = $request->id; + $nama = $request->nama; + $alamat = $request->alamat; + $type = $request->type; + + if ($type == 'ibadah') { + \App\Models\TempatIbadah::where('id', $id)->update([ + 'nama_tempat' => $nama, + 'jenis_tempat_ibadah' => $request->jenis_tempat_ibadah, + 'kontak_person' => $request->kontak_person, + 'alamat' => $alamat, + 'radius_meter' => $request->radius_meter + ]); + $this->checkAndUnlinkPenerima($id); + } else { + $updateData = [ + 'nama_kepala_keluarga' => $nama, + 'id_tempat_ibadah' => $request->id_tempat_ibadah, + 'nik_kepala_keluarga' => $request->nik_kepala_keluarga, + 'nomor_kk' => $request->nomor_kk, + 'jumlah_tanggungan' => $request->jumlah_tanggungan, + 'alamat' => $alamat + ]; + + if ($request->hasFile('foto_kondisi_rumah')) { + $updateData['foto_kondisi_rumah'] = $request->file('foto_kondisi_rumah')->store('fotos', 'public'); + } + + \App\Models\PenerimaBantuan::where('id', $id)->update($updateData); + } + return redirect()->back(); + } + + public function delete(Request $request) + { + $id = $request->id; + $type = $request->type; + + if ($type == 'ibadah') { + \App\Models\TempatIbadah::where('id', $id)->delete(); + } else { + \App\Models\PenerimaBantuan::where('id', $id)->delete(); + } + return redirect()->back(); + } + + private function calculateDistance($lat1, $lon1, $lat2, $lon2) { + $earthRadius = 6371000; // in meters + $dLat = deg2rad($lat2 - $lat1); + $dLon = deg2rad($lon2 - $lon1); + $a = sin($dLat/2) * sin($dLat/2) + cos(deg2rad($lat1)) * cos(deg2rad($lat2)) * sin($dLon/2) * sin($dLon/2); + $c = 2 * asin(sqrt($a)); + return $earthRadius * $c; + } + + private function checkAndUnlinkPenerima($ibadahId) { + $ibadah = \App\Models\TempatIbadah::find($ibadahId); + if (!$ibadah) return; + + $penerimas = \App\Models\PenerimaBantuan::where('id_tempat_ibadah', $ibadahId)->get(); + foreach ($penerimas as $penerima) { + $distance = $this->calculateDistance($ibadah->lat, $ibadah->lng, $penerima->lat, $penerima->lng); + if ($distance > $ibadah->radius_meter) { + $penerima->update(['id_tempat_ibadah' => null]); + } + } + } +} diff --git a/app/Models/PenerimaBantuan.php b/app/Models/PenerimaBantuan.php new file mode 100644 index 0000000..2e35959 --- /dev/null +++ b/app/Models/PenerimaBantuan.php @@ -0,0 +1,30 @@ +belongsTo(TempatIbadah::class, 'id_tempat_ibadah'); + } +} diff --git a/app/Models/TempatIbadah.php b/app/Models/TempatIbadah.php new file mode 100644 index 0000000..d47b2fc --- /dev/null +++ b/app/Models/TempatIbadah.php @@ -0,0 +1,28 @@ +hasMany(PenerimaBantuan::class, 'id_tempat_ibadah'); + } +} diff --git a/database/migrations/2026_06_05_090029_create_tempat_ibadahs_table.php b/database/migrations/2026_06_05_090029_create_tempat_ibadahs_table.php new file mode 100644 index 0000000..25afc2e --- /dev/null +++ b/database/migrations/2026_06_05_090029_create_tempat_ibadahs_table.php @@ -0,0 +1,32 @@ +id(); + $table->string('nama_tempat'); + $table->integer('radius_meter')->default(500); + $table->decimal('lat', 10, 7); + $table->decimal('lng', 10, 7); + $table->string('alamat')->nullable(); + $table->timestamps(); + }); + } + + /** + * Reverse the migrations. + */ + public function down(): void + { + Schema::dropIfExists('tempat_ibadah'); + } +}; diff --git a/database/migrations/2026_06_05_090030_create_rumah_miskins_table.php b/database/migrations/2026_06_05_090030_create_rumah_miskins_table.php new file mode 100644 index 0000000..90c994e --- /dev/null +++ b/database/migrations/2026_06_05_090030_create_rumah_miskins_table.php @@ -0,0 +1,31 @@ +id(); + $table->string('nama_kepala_keluarga'); + $table->decimal('lat', 10, 7); + $table->decimal('lng', 10, 7); + $table->string('alamat')->nullable(); + $table->timestamps(); + }); + } + + /** + * Reverse the migrations. + */ + public function down(): void + { + Schema::dropIfExists('rumah_miskin'); + } +}; diff --git a/database/migrations/2026_06_05_094151_rename_rumah_miskin_to_penerima_bantuan.php b/database/migrations/2026_06_05_094151_rename_rumah_miskin_to_penerima_bantuan.php new file mode 100644 index 0000000..0f8cf4c --- /dev/null +++ b/database/migrations/2026_06_05_094151_rename_rumah_miskin_to_penerima_bantuan.php @@ -0,0 +1,24 @@ +enum('jenis_tempat_ibadah', ['Masjid', 'Gereja Katolik', 'Gereja Protestan', 'Vihara', 'Pura', 'Klenteng'])->nullable()->after('nama_tempat'); + $table->string('kontak_person')->nullable()->after('alamat'); + }); + + Schema::table('penerima_bantuan', function (Blueprint $table) { + $table->foreignId('id_tempat_ibadah')->nullable()->after('id')->constrained('tempat_ibadah')->nullOnDelete(); + $table->string('nik_kepala_keluarga')->nullable()->unique()->after('nama_kepala_keluarga'); + $table->string('nomor_kk')->nullable()->after('nik_kepala_keluarga'); + $table->integer('jumlah_tanggungan')->nullable()->after('alamat'); + $table->string('foto_kondisi_rumah')->nullable()->after('jumlah_tanggungan'); + }); + } + + /** + * Reverse the migrations. + */ + public function down(): void + { + Schema::table('penerima_bantuan', function (Blueprint $table) { + $table->dropForeign(['id_tempat_ibadah']); + $table->dropColumn(['id_tempat_ibadah', 'nik_kepala_keluarga', 'nomor_kk', 'jumlah_tanggungan', 'foto_kondisi_rumah']); + }); + + Schema::table('tempat_ibadah', function (Blueprint $table) { + $table->dropColumn(['jenis_tempat_ibadah', 'kontak_person']); + }); + } +}; diff --git a/resources/views/daftar-penerima-bantuan.blade.php b/resources/views/daftar-penerima-bantuan.blade.php new file mode 100644 index 0000000..bd24aea --- /dev/null +++ b/resources/views/daftar-penerima-bantuan.blade.php @@ -0,0 +1,114 @@ + + +

+ {{ __('Daftar Penerima Bantuan') }} +

+
+ +
+
+
+
+ + + +
+
+ @csrf + Edit Data Penerima Bantuan: +
+ + + + + + + + + + + + + + + + +
+
+
+ + + + + + + + + + + + + + + + + @foreach($penerimas as $r) + + + + + + + + + + + + @endforeach + +
IDNama Kepala KeluargaNIK / KKTanggunganTempat IbadahAlamat DetailKoordinat (Lat, Lng)FotoAksi
{{ $r->id }}{{ $r->nama_kepala_keluarga }}{{ $r->nik_kepala_keluarga ?? '-' }} / {{ $r->nomor_kk ?? '-' }}{{ $r->jumlah_tanggungan ?? '0' }}{{ $r->tempat_ibadah->nama_tempat ?? '-' }}{{ $r->alamat }}{{ $r->lat }}, {{ $r->lng }} + @if($r->foto_kondisi_rumah) + Lihat Foto + @else + - + @endif + + + Hapus +
+ + + +
+
+
+
+
diff --git a/resources/views/daftar-tempat-ibadah.blade.php b/resources/views/daftar-tempat-ibadah.blade.php new file mode 100644 index 0000000..a038fcd --- /dev/null +++ b/resources/views/daftar-tempat-ibadah.blade.php @@ -0,0 +1,101 @@ + + +

+ {{ __('Daftar Tempat Ibadah') }} +

+
+ +
+
+
+
+ + + +
+
+ @csrf + Edit Data Tempat Ibadah: +
+ + + + + + + + + + + +
+
+
+ + + + + + + + + + + + + + + + @foreach($ibadahs as $ib) + + + + + + + + + + + @endforeach + +
IDNama Tempat IbadahJenisKontak PersonAlamat DetailRadius Layan (Meter)Koordinat (Lat, Lng)Aksi
{{ $ib->id }}{{ $ib->nama_tempat }}{{ $ib->jenis_tempat_ibadah ?? '-' }}{{ $ib->kontak_person ?? '-' }}{{ $ib->alamat }}{{ $ib->radius_meter }}{{ $ib->lat }}, {{ $ib->lng }} + + Hapus +
+ + + +
+
+
+
+
diff --git a/resources/views/dashboard.blade.php b/resources/views/dashboard.blade.php index 4024c64..55a43a4 100644 --- a/resources/views/dashboard.blade.php +++ b/resources/views/dashboard.blade.php @@ -1,7 +1,7 @@

- {{ __('Dashboard') }} + {{ __('Dashboard Pemetaan') }}

@@ -9,7 +9,258 @@
- {{ __("You're logged in!") }} + + + + + +
+ Tambah Titik Baru: +
+ + + + + +
+ + + + + + + + 👉 Pilih jenis titik, isi kolom yang tersedia, lalu klik pada peta untuk menyimpan lokasinya. +
+ + + +
+
+ @csrf + Edit Data: + + + + + + +
+
+ +
+ + + + + + +
diff --git a/resources/views/layouts/navigation.blade.php b/resources/views/layouts/navigation.blade.php index c64bf64..515c4fb 100644 --- a/resources/views/layouts/navigation.blade.php +++ b/resources/views/layouts/navigation.blade.php @@ -15,6 +15,12 @@ {{ __('Dashboard') }} + + {{ __('Daftar Tempat Ibadah') }} + + + {{ __('Daftar Penerima Bantuan') }} + @@ -70,6 +76,12 @@ {{ __('Dashboard') }} + + {{ __('Daftar Penerima Bantuan') }} + + + {{ __('Daftar Tempat Ibadah') }} + diff --git a/routes/web.php b/routes/web.php index 74bb7ca..b468fc3 100644 --- a/routes/web.php +++ b/routes/web.php @@ -3,13 +3,21 @@ use App\Http\Controllers\ProfileController; use Illuminate\Support\Facades\Route; +use App\Http\Controllers\MapController; + Route::get('/', function () { return view('welcome'); }); -Route::get('/dashboard', function () { - return view('dashboard'); -})->middleware(['auth', 'verified'])->name('dashboard'); +Route::middleware(['auth', 'verified'])->group(function () { + Route::get('/dashboard', [MapController::class, 'index'])->name('dashboard'); + Route::get('/daftar-penerima-bantuan', [MapController::class, 'daftarPenerimaBantuan'])->name('penerima.index'); + Route::get('/daftar-tempat-ibadah', [MapController::class, 'daftarTempatIbadah'])->name('ibadah.index'); + Route::post('/map/save', [MapController::class, 'save'])->name('map.save'); + Route::post('/map/update-radius', [MapController::class, 'updateRadius'])->name('map.updateRadius'); + Route::post('/map/edit', [MapController::class, 'edit'])->name('map.edit'); + Route::get('/map/delete', [MapController::class, 'delete'])->name('map.delete'); +}); Route::middleware('auth')->group(function () { Route::get('/profile', [ProfileController::class, 'edit'])->name('profile.edit');