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);
}
});
}
}
+25
View File
@@ -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 () {