feat: add dashboard transfer and assistance summaries

This commit is contained in:
GuavaPopper
2026-06-10 18:13:40 +07:00
parent 91fc2fbd16
commit c4157cec8d
5 changed files with 130 additions and 1 deletions
@@ -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(),
@@ -0,0 +1,68 @@
<?php
namespace App\Http\Controllers;
use App\Models\AnggotaKeluarga;
use App\Models\PermohonanTransfer;
use App\Models\RiwayatBantuan;
class DosenSummaryController extends Controller
{
public function __invoke()
{
$anggota = AnggotaKeluarga::all();
$bantuan = RiwayatBantuan::query();
$umur = [
'anak' => 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,
]);
}
}
+1 -1
View File
@@ -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;
}
}
+23
View File
@@ -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);
}
});
}
}