diff --git a/app/Http/Controllers/BantuanController.php b/app/Http/Controllers/BantuanController.php index f8ec3af..de4f5a6 100644 --- a/app/Http/Controllers/BantuanController.php +++ b/app/Http/Controllers/BantuanController.php @@ -4,6 +4,7 @@ namespace App\Http\Controllers; use App\Models\ActivityLog; use App\Models\RiwayatBantuan; +use App\Models\RumahIbadah; use App\Models\RumahMiskin; use Illuminate\Http\Request; @@ -36,6 +37,18 @@ class BantuanController extends Controller 'tanggal_bantuan' => 'required|date', 'ibadah_id' => 'nullable|integer|exists:rumah_ibadah,id', ]); + + $user = auth()->user(); + if ($user->hasRole('pengurus_ibadah') && !empty($validated['ibadah_id'])) { + $ownsIbadah = RumahIbadah::where('id', $validated['ibadah_id']) + ->where('user_id', $user->id) + ->exists(); + + if (!$ownsIbadah) { + return response()->json(['message' => 'Tidak berhak mencatat bantuan dari rumah ibadah ini'], 403); + } + } + $bantuan = RiwayatBantuan::create([ 'id_rumah' => $idRumah, 'dicatat_oleh' => auth()->id(), diff --git a/app/Http/Controllers/DosenSummaryController.php b/app/Http/Controllers/DosenSummaryController.php new file mode 100644 index 0000000..614475a --- /dev/null +++ b/app/Http/Controllers/DosenSummaryController.php @@ -0,0 +1,68 @@ + 0, + 'dewasa' => 0, + 'lansia' => 0, + 'tidak_diketahui' => 0, + ]; + + foreach ($anggota as $item) { + if ($item->umur === null) { + $umur['tidak_diketahui']++; + } elseif ($item->umur < 18) { + $umur['anak']++; + } elseif ($item->umur < 60) { + $umur['dewasa']++; + } else { + $umur['lansia']++; + } + } + + $pendidikan = array_merge( + ['tidak_sekolah' => 0, 'sd' => 0, 'smp' => 0, 'sma' => 0, 'd3' => 0, 's1_plus' => 0, 'tidak_diketahui' => 0], + $anggota->countBy(fn($item) => $item->pendidikan ?: 'tidak_diketahui')->all() + ); + + $statusHidup = array_merge( + ['hidup' => 0, 'meninggal' => 0], + $anggota->countBy('status_hidup')->all() + ); + + $transferCounts = array_merge( + ['pending' => 0, 'disetujui' => 0, 'ditolak' => 0], + PermohonanTransfer::all()->countBy('status')->all() + ); + + return response()->json([ + 'anggota' => [ + 'total' => $anggota->count(), + 'status_hidup' => $statusHidup, + 'pendidikan' => $pendidikan, + 'umur' => $umur, + ], + 'bantuan' => [ + 'total' => RiwayatBantuan::count(), + 'bulan_ini' => (clone $bantuan) + ->whereDate('tanggal_bantuan', '>=', now()->startOfMonth()->toDateString()) + ->whereDate('tanggal_bantuan', '<=', now()->endOfMonth()->toDateString()) + ->count(), + 'per_jenis' => RiwayatBantuan::all()->countBy('jenis_bantuan')->all(), + ], + 'transfer' => $transferCounts, + ]); + } +} diff --git a/app/Models/AnggotaKeluarga.php b/app/Models/AnggotaKeluarga.php index 306e23e..11cb9d3 100644 --- a/app/Models/AnggotaKeluarga.php +++ b/app/Models/AnggotaKeluarga.php @@ -22,7 +22,7 @@ class AnggotaKeluarga extends Model public function getUmurAttribute(): ?int { return $this->tanggal_lahir - ? now()->diffInYears(Carbon::parse($this->tanggal_lahir)) + ? (int) Carbon::parse($this->tanggal_lahir)->diffInYears(now()) : null; } } diff --git a/app/Providers/AppServiceProvider.php b/app/Providers/AppServiceProvider.php index f462d43..c0800b7 100644 --- a/app/Providers/AppServiceProvider.php +++ b/app/Providers/AppServiceProvider.php @@ -2,6 +2,8 @@ namespace App\Providers; +use App\Models\PermohonanTransfer; +use App\Models\RumahIbadah; use App\Models\Setting; use Illuminate\Support\Facades\View; use Illuminate\Support\ServiceProvider; @@ -18,6 +20,27 @@ class AppServiceProvider extends ServiceProvider } catch (\Throwable) { $view->with('appSettings', []); } + + try { + $pendingTransferCount = 0; + + if (auth()->check()) { + $user = auth()->user(); + + if ($user->hasRole('administrator')) { + $pendingTransferCount = PermohonanTransfer::where('status', 'pending')->count(); + } elseif ($user->hasRole('pengurus_ibadah')) { + $ownedIbadahIds = RumahIbadah::where('user_id', $user->id)->pluck('id'); + $pendingTransferCount = PermohonanTransfer::where('status', 'pending') + ->whereIn('ke_ibadah_id', $ownedIbadahIds) + ->count(); + } + } + + $view->with('pendingTransferCount', $pendingTransferCount); + } catch (\Throwable) { + $view->with('pendingTransferCount', 0); + } }); } } diff --git a/routes/web.php b/routes/web.php index f741340..8072af8 100644 --- a/routes/web.php +++ b/routes/web.php @@ -6,6 +6,7 @@ use App\Http\Controllers\AnggotaKeluargaController; use App\Http\Controllers\AuthController; use App\Http\Controllers\BackupController; use App\Http\Controllers\BantuanController; +use App\Http\Controllers\DosenSummaryController; use App\Http\Controllers\ExportController; use App\Http\Controllers\IbadahController; use App\Http\Controllers\ImportController; @@ -64,15 +65,39 @@ Route::middleware('auth')->group(function () { Route::get('/notifications', function (\Illuminate\Http\Request $request) { $since = $request->query('since'); $after = $since ? \Carbon\Carbon::parse($since) : now()->subMinutes(1); + $user = $request->user(); + + $transferQuery = \App\Models\PermohonanTransfer::query(); + $pendingTransferQuery = \App\Models\PermohonanTransfer::where('status', 'pending'); + + if ($user->hasRole('pengurus_ibadah')) { + $ownedIbadahIds = \App\Models\RumahIbadah::where('user_id', $user->id)->pluck('id'); + $transferQuery->where(function ($query) use ($ownedIbadahIds) { + $query->whereIn('dari_ibadah_id', $ownedIbadahIds) + ->orWhereIn('ke_ibadah_id', $ownedIbadahIds); + }); + $pendingTransferQuery->whereIn('ke_ibadah_id', $ownedIbadahIds); + } elseif (!$user->hasRole('administrator')) { + $pendingTransferQuery->whereRaw('1 = 0'); + } return response()->json([ 'new_ibadah' => \App\Models\RumahIbadah::where('created_at', '>', $after)->count(), 'new_miskin' => \App\Models\RumahMiskin::where('created_at', '>', $after)->count(), + 'new_anggota' => \App\Models\AnggotaKeluarga::where('created_at', '>', $after)->count(), + 'new_bantuan' => \App\Models\RiwayatBantuan::where('created_at', '>', $after)->count(), + 'new_transfer' => $transferQuery->where('created_at', '>', $after)->count(), + 'pending_transfer' => $pendingTransferQuery->count(), 'latest_ibadah' => \App\Models\RumahIbadah::max('created_at'), 'latest_miskin' => \App\Models\RumahMiskin::max('created_at'), + 'latest_anggota' => \App\Models\AnggotaKeluarga::max('created_at'), + 'latest_bantuan' => \App\Models\RiwayatBantuan::max('created_at'), + 'latest_transfer' => \App\Models\PermohonanTransfer::max('created_at'), ]); }); + Route::get('/dashboard/dosen-summary', DosenSummaryController::class); + // Rumah Ibadah — read: all roles, write: administrator + pengurus_ibadah Route::get('/ibadah', [IbadahController::class, 'index']); Route::middleware('role:administrator|pengurus_ibadah')->group(function () {