Files
alrahma_sunday_school/app/Controllers/Administrator/FinancialAidController.php
T
root 0ac3a8375e
Deploy to Shared Hosting / Shared hosting deploy (push) Failing after 31s
Tests / PHPUnit (push) Failing after 55s
Fix semester context, attendance rosters, and billing workflows
- load global semester helpers consistently and use date-based semester defaults
- fix grading and daily attendance duplicate student/section rows
- keep attendance violations scoped to the current semester by default
- update invoice, refund, discount, payment, and financial aid flows
- add configuration cleanup migrations for duplicate calendar/semester keys
- refresh parent registration/report-card and print request handling
- update related models, services, views, cron notes, and test coverage
2026-08-16 17:41:11 -04:00

117 lines
4.4 KiB
PHP

<?php
namespace App\Controllers\Administrator;
use App\Controllers\BaseController;
use App\Models\FinancialAidRequestModel;
use App\Models\StudentModel;
use App\Models\UserModel;
use Throwable;
class FinancialAidController extends BaseController
{
public function index()
{
$schoolYear = $this->request->getGet('school_year');
$model = new FinancialAidRequestModel();
$builder = $model->orderBy('created_at', 'DESC');
if (is_string($schoolYear) && trim($schoolYear) !== '') {
$builder->where('school_year', trim($schoolYear));
}
$requests = $builder->findAll();
$parentIds = array_values(array_unique(array_filter(array_map('intval', array_column($requests, 'parent_id')))));
$parents = [];
if ($parentIds !== []) {
foreach ((new UserModel())->select('id, firstname, lastname, email')->whereIn('id', $parentIds)->findAll() as $parent) {
$parents[(int) $parent['id']] = $parent;
}
}
return view('administrator/financial_aid_queue', [
'requests' => $requests,
'parents' => $parents,
'schoolYear' => is_string($schoolYear) ? trim($schoolYear) : '',
]);
}
public function show(int $id)
{
$request = (new FinancialAidRequestModel())->find($id);
if ($request === null) {
return redirect()->to('/administrator/financial-aid')->with('error', 'Financial aid request was not found.');
}
$parent = (new UserModel())->find((int) $request['parent_id']);
$studentIds = json_decode((string) ($request['student_ids_json'] ?? '[]'), true);
$studentIds = is_array($studentIds) ? array_map('intval', $studentIds) : [];
$students = $studentIds !== []
? (new StudentModel())->whereIn('id', $studentIds)->findAll()
: [];
return view('administrator/financial_aid_review', [
'requestRow' => $request,
'parent' => $parent,
'students' => $students,
]);
}
public function approve(int $id)
{
try {
$model = new FinancialAidRequestModel();
$request = $model->find($id);
if ($request === null) {
return redirect()->to('/administrator/financial-aid')->with('error', 'Financial aid request was not found.');
}
if (! in_array((string) ($request['status'] ?? ''), ['submitted', 'under_review'], true)) {
return redirect()->back()->with('error', 'Only open requests can be approved.');
}
$amount = $this->approvalAmount($request);
$note = trim((string) $this->request->getPost('admin_note'));
service('financialAid')->applyApprovedAmount($request, $amount, (int) session()->get('user_id'), $note);
return redirect()->to('/administrator/financial-aid')->with('success', 'Financial aid was approved and applied to the invoice.');
} catch (Throwable $e) {
return redirect()->back()->withInput()->with('error', $e->getMessage());
}
}
public function deny(int $id)
{
$model = new FinancialAidRequestModel();
$request = $model->find($id);
if ($request === null) {
return redirect()->to('/administrator/financial-aid')->with('error', 'Financial aid request was not found.');
}
if (! in_array((string) ($request['status'] ?? ''), ['submitted', 'under_review'], true)) {
return redirect()->back()->with('error', 'Only open requests can be denied.');
}
$note = trim((string) $this->request->getPost('admin_note'));
if ($note === '') {
return redirect()->back()->with('error', 'A denial note is required.');
}
$model->update($id, [
'status' => 'denied',
'admin_note' => $note,
'reviewed_by' => (int) session()->get('user_id'),
'reviewed_at' => date('Y-m-d H:i:s'),
]);
return redirect()->to('/administrator/financial-aid')->with('success', 'Financial aid request was denied.');
}
private function approvalAmount(array $request): float
{
$postedAmount = trim((string) $this->request->getPost('admin_amount'));
if ($postedAmount !== '') {
return (float) $postedAmount;
}
return (float) ($request['requested_amount'] ?? 0);
}
}