mirror of
https://github.com/rekywhyd/WebGIS_PengentasanKemiskinan.git
synced 2026-07-07 01:43:07 +00:00
147 lines
5.0 KiB
PHP
147 lines
5.0 KiB
PHP
<?php
|
|
|
|
namespace App\Http\Controllers;
|
|
|
|
use Illuminate\Http\Request;
|
|
|
|
class MapController extends Controller
|
|
{
|
|
public function index()
|
|
{
|
|
$ibadahs = \App\Models\TempatIbadah::all();
|
|
$penerimas = \App\Models\PenerimaBantuan::with('tempat_ibadah')->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]);
|
|
}
|
|
}
|
|
}
|
|
}
|