diff --git a/app/Controllers/View/EventController.php b/app/Controllers/View/EventController.php index 442c46e..f61110d 100644 --- a/app/Controllers/View/EventController.php +++ b/app/Controllers/View/EventController.php @@ -93,58 +93,6 @@ class EventController extends ResourceController 'created_by' => session()->get('user_id'), ]); - if ($eventId) { - $amount = (float) $this->request->getPost('amount'); - $semester = (string) $this->request->getPost('semester'); - $schoolYear = (string) $this->request->getPost('school_year'); - $userId = (int) (session()->get('user_id') ?? 0); - - $enrollments = $this->enrollmentModel - ->select('enrollments.student_id, students.parent_id') - ->join('students', 'students.id = enrollments.student_id', 'left') - ->where('enrollments.school_year', $schoolYear) - ->whereIn('enrollments.enrollment_status', ['enrolled', 'payment pending']) - ->findAll(); - - $parentIds = []; - foreach ($enrollments as $row) { - $studentId = (int) ($row['student_id'] ?? 0); - $parentId = (int) ($row['parent_id'] ?? 0); - if ($studentId <= 0 || $parentId <= 0) { - continue; - } - - $exists = $this->eventChargesModel - ->where('event_id', $eventId) - ->where('student_id', $studentId) - ->where('school_year', $schoolYear) - ->where('semester', $semester) - ->first(); - - if ($exists) { - continue; - } - - $this->eventChargesModel->insert([ - 'event_id' => $eventId, - 'parent_id' => $parentId, - 'student_id' => $studentId, - 'participation' => 'yes', - 'charged' => $amount, - 'school_year' => $schoolYear, - 'semester' => $semester, - 'updated_by' => $userId ?: null, - ]); - - $parentIds[] = $parentId; - } - - $parentIds = array_unique($parentIds); - foreach ($parentIds as $pid) { - $this->invoiceController->generateInvoice((string) $pid); - } - } - return redirect()->to('/administrator/events')->with('success', 'Event created successfully'); } @@ -240,17 +188,24 @@ class EventController extends ResourceController $parents = $this->userModel->getParents(); $events = $this->eventModel->getActiveEvents($this->schoolYear); + $filterEventId = (int) ($this->request->getGet('event_id') ?? 0); - $charges = $this->eventChargesModel + $chargesBuilder = $this->eventChargesModel ->select('event_charges.*, users.firstname AS parent_firstname, users.lastname AS parent_lastname, students.firstname AS student_firstname, students.lastname AS student_lastname, - events.event_name') + events.event_name, events.description AS event_description, events.amount AS event_amount') ->join('users', 'users.id = event_charges.parent_id', 'left') ->join('students', 'students.id = event_charges.student_id', 'left') ->join('events', 'events.id = event_charges.event_id', 'left') ->where('event_charges.school_year', $schoolYear) - ->where('event_charges.semester', $semester) + ->where('event_charges.semester', $semester); + + if ($filterEventId > 0) { + $chargesBuilder->where('event_charges.event_id', $filterEventId); + } + + $charges = $chargesBuilder ->orderBy('event_charges.created_at', 'DESC') ->findAll(); @@ -260,6 +215,7 @@ class EventController extends ResourceController 'events' => $events, 'school_year' => $schoolYear, 'semester' => $semester, + 'filterEventId' => $filterEventId, ]); } diff --git a/app/Controllers/View/FinancialController.php b/app/Controllers/View/FinancialController.php index 8b2323c..d537820 100644 --- a/app/Controllers/View/FinancialController.php +++ b/app/Controllers/View/FinancialController.php @@ -216,25 +216,28 @@ public function financialReport() $schoolYears[] = (string)$schoolYear; } + $eventFeesTotal = $this->getEventFeesTotal($schoolYear, $dateFrom, $dateTo); + // JSON API support if ($this->wantsJson() || strtolower((string)($this->request->getGet('format') ?? '')) === 'json') { - return $this->response->setJSON([ - 'ok' => true, - 'selectedYear' => $schoolYear, - 'dateFrom' => $dateFrom, - 'dateTo' => $dateTo, + return $this->response->setJSON([ + 'ok' => true, + 'selectedYear' => $schoolYear, + 'dateFrom' => $dateFrom, + 'dateTo' => $dateTo, 'schoolYears' => $schoolYears, 'invoices' => $invoices, 'payments' => $payments, 'paymentBreakdown' => $paymentBreakdown, 'paymentTotals' => $paymentTotals, - 'refunds' => $refunds, - 'expenses' => $expenses, - 'reimbursements' => $reimbursements, - 'discounts' => $discounts, - 'csrf_token' => csrf_token(), - 'csrf_hash' => csrf_hash(), - ]); + 'refunds' => $refunds, + 'expenses' => $expenses, + 'reimbursements' => $reimbursements, + 'discounts' => $discounts, + 'eventFeesTotal' => $eventFeesTotal, + 'csrf_token' => csrf_token(), + 'csrf_hash' => csrf_hash(), + ]); } return view('payment/financial_report', [ @@ -246,6 +249,7 @@ public function financialReport() 'expenses' => $expenses, 'reimbursements' => $reimbursements, 'discounts' => $discounts, + 'eventFeesTotal' => $eventFeesTotal, 'selectedYear' => $schoolYear, 'schoolYears' => $schoolYears, 'dateFrom' => $dateFrom, @@ -1058,6 +1062,7 @@ public function financialReport() $amountCollected = $totalPaid; $netAmount = ($totalCharges - $totalDiscounts - $totalRefunds); + $totalEventFees = $this->getEventFeesTotal($schoolYear, $invoiceDateFrom, $invoiceDateTo); return [ 'schoolYear' => $schoolYear, 'dateFrom' => $dateFrom, @@ -1073,9 +1078,28 @@ public function financialReport() 'amountCollected' => $amountCollected, 'totalUnpaid' => $totalUnpaid, 'netAmount' => $netAmount, + 'totalEventFees' => $totalEventFees, ]; } + private function getEventFeesTotal(?string $schoolYear, ?string $dateFrom, ?string $dateTo): float + { + $db = \Config\Database::connect(); + $builder = $db->table('event_charges ec') + ->select('COALESCE(SUM(ec.charged),0) AS amount', false); + if (!empty($schoolYear)) { + $builder->where('ec.school_year', $schoolYear); + } + if (!empty($dateFrom)) { + $builder->where('DATE(ec.created_at) >=', $dateFrom); + } + if (!empty($dateTo)) { + $builder->where('DATE(ec.created_at) <=', $dateTo); + } + $row = $builder->get()->getRowArray(); + return $row ? (float)($row['amount'] ?? 0) : 0.0; + } + /** * Management page: list parents with outstanding balances (> 0) for a school year. @@ -1226,6 +1250,23 @@ public function financialReport() $byParent[$pid]['total_balance'] += $extra; } + $eventFeesPerParent = []; + try { + $eventFeesRows = $db->table('event_charges ec') + ->select('ec.parent_id, COALESCE(SUM(ec.charged),0) AS event_fees', false) + ->where('ec.school_year', $schoolYear) + ->groupBy('ec.parent_id') + ->get() + ->getResultArray(); + foreach ($eventFeesRows as $row) { + $pid = (int)($row['parent_id'] ?? 0); + if ($pid <= 0) continue; + $eventFeesPerParent[$pid] = (float)($row['event_fees'] ?? 0); + } + } catch (\Throwable $e) { + // ignore, fallback to no event fees data + } + // Reduce into rows list; only parents with positive balance // Also compute remaining installments and suggested monthly amount $rows = []; @@ -1305,7 +1346,7 @@ public function financialReport() } } - $dataRows = array_map(function(array $r) use ($hasPayments, $paidTotals, $paymentCounts, $nextInstallmentYmd) { + $dataRows = array_map(function(array $r) use ($hasPayments, $paidTotals, $paymentCounts, $nextInstallmentYmd, $eventFeesPerParent) { $pid = (int)($r['parent_id'] ?? 0); $name = trim((string)($r['firstname'] ?? '') . ' ' . (string)($r['lastname'] ?? '')); return [ @@ -1322,6 +1363,7 @@ public function financialReport() 'payment_count' => isset($paymentCounts[$pid]) ? (int)$paymentCounts[$pid] : 0, 'has_installment'=> isset($hasPayments[$pid]) ? 1 : 0, 'next_installment' => $nextInstallmentYmd, + 'event_fees' => (float)($eventFeesPerParent[$pid] ?? 0), ]; }, $rows); diff --git a/app/Models/EventChargesModel.php b/app/Models/EventChargesModel.php index 096c903..3c5dde5 100644 --- a/app/Models/EventChargesModel.php +++ b/app/Models/EventChargesModel.php @@ -30,7 +30,7 @@ class EventChargesModel extends Model public function getChargesWithEventInfo($parentId = null, $schoolYear = null, $semester = null) { - $builder = $this->select('event_charges.*, events.event_name, events.amount') + $builder = $this->select('event_charges.*, events.event_name, events.amount AS event_amount, events.description AS event_description') ->join('events', 'events.id = event_charges.event_id', 'left'); if ($parentId) { diff --git a/app/Views/administrator/events/create_event.php b/app/Views/administrator/events/create_event.php index e26f73b..355b85b 100644 --- a/app/Views/administrator/events/create_event.php +++ b/app/Views/administrator/events/create_event.php @@ -4,6 +4,11 @@