From 40a6a8b49a5bd342fabc76e5f81d5ec7cb23a1cb Mon Sep 17 00:00:00 2001
From: Yoga Pangestu
Date: Sun, 30 Aug 2026 17:23:16 +0700
Subject: [PATCH] feat: simplify academic term selection logic and clean up
imports in TuitionInvoiceIndex
---
.../Finances/TuitionInvoiceController.php | 4 +-
.../Admin/Master/AcademicTermService.php | 10 +++++
.../admin/finances/tuition-invoices/index.tsx | 38 +++++++++----------
3 files changed, 30 insertions(+), 22 deletions(-)
diff --git a/app/Http/Controllers/Admin/Finances/TuitionInvoiceController.php b/app/Http/Controllers/Admin/Finances/TuitionInvoiceController.php
index ec47952..e4c3957 100644
--- a/app/Http/Controllers/Admin/Finances/TuitionInvoiceController.php
+++ b/app/Http/Controllers/Admin/Finances/TuitionInvoiceController.php
@@ -35,9 +35,7 @@ public function index(PaginatedRequest $request): Response
$academicTerms = $this->academicTermService->getAllForSelect();
$requestedTermId = $request->validated('academic_term_id');
- $defaultTermId = $academicTerms->firstWhere('is_active', true)?->id
- ?? $academicTerms->sortByDesc('start_date')->first()?->id;
- $summaryTermId = $requestedTermId ?? $defaultTermId;
+ $summaryTermId = $requestedTermId ?? $this->academicTermService->getActive()?->id;
return Inertia::render('admin/finances/tuition-invoices/index', [
'invoices' => $this->service->paginated(
diff --git a/app/Services/Admin/Master/AcademicTermService.php b/app/Services/Admin/Master/AcademicTermService.php
index f2eb514..0d4dc71 100644
--- a/app/Services/Admin/Master/AcademicTermService.php
+++ b/app/Services/Admin/Master/AcademicTermService.php
@@ -14,6 +14,16 @@ public function getAllForSelect(): Collection
return AcademicTerm::select(['id', 'name', 'semester', 'start_date', 'end_date', 'is_active'])->latest()->get();
}
+ /**
+ * The academic term currently marked active, falling back to the one with
+ * the latest start date if none is explicitly active.
+ */
+ public function getActive(): ?AcademicTerm
+ {
+ return AcademicTerm::where('is_active', true)->first()
+ ?? AcademicTerm::orderByDesc('start_date')->first();
+ }
+
public function paginated(int $perPage = 25, string $search = '', ?string $semester = null, ?bool $isActive = null): LengthAwarePaginator
{
return AcademicTerm::query()
diff --git a/resources/js/pages/admin/finances/tuition-invoices/index.tsx b/resources/js/pages/admin/finances/tuition-invoices/index.tsx
index f6070f6..1ae450c 100644
--- a/resources/js/pages/admin/finances/tuition-invoices/index.tsx
+++ b/resources/js/pages/admin/finances/tuition-invoices/index.tsx
@@ -1,3 +1,14 @@
+import { Head, router } from '@inertiajs/react';
+import { format } from 'date-fns';
+import type { LucideIcon } from 'lucide-react';
+import {
+ CircleDollarSign,
+ FileText,
+ Plus,
+ UserRoundX,
+ Wallet,
+} from 'lucide-react';
+import { useState } from 'react';
import type { PaginationState } from '@/components/data-table';
import { DataTable } from '@/components/data-table';
import { DatePicker } from '@/components/date-picker';
@@ -55,17 +66,6 @@ import {
PaymentStatusLabels,
PaymentStatuses,
} from '@/types/tuition-payment';
-import { Head, router } from '@inertiajs/react';
-import { format } from 'date-fns';
-import type { LucideIcon } from 'lucide-react';
-import {
- CircleDollarSign,
- FileText,
- Plus,
- UserRoundX,
- Wallet,
-} from 'lucide-react';
-import { useState } from 'react';
import { createTuitionInvoiceColumns } from './columns';
type AcademicTermOption = { id: number; name: string; semester: string };
@@ -208,8 +208,8 @@ export default function TuitionInvoiceIndex({
Ringkasan berikut hanya menampilkan periode{' '}
{summaryAcademicTerm
? formatAcademicTermLabel(summaryAcademicTerm)
- : '-'}
- {' '} dan bisa disesuaikan lewat filter.
+ : '-'}{' '}
+ dan bisa disesuaikan lewat filter.
@@ -362,9 +362,9 @@ function CreateForm({
const availableStudents = academicTermId
? students.filter(
- (student) =>
- !student.invoiced_term_ids?.includes(Number(academicTermId)),
- )
+ (student) =>
+ !student.invoiced_term_ids?.includes(Number(academicTermId)),
+ )
: [];
function reset() {
@@ -441,7 +441,7 @@ function CreateForm({
>
{selectedStudents.length ===
availableStudents.length &&
- availableStudents.length > 0
+ availableStudents.length > 0
? 'Batalkan Semua'
: 'Pilih Semua'}
@@ -478,8 +478,8 @@ function CreateForm({
selectedStudents.length > 0
? ''
: academicTermId
- ? 'Pilih mahasiswa (aktif)'
- : 'Pilih periode akademik terlebih dahulu'
+ ? 'Pilih mahasiswa (aktif)'
+ : 'Pilih periode akademik terlebih dahulu'
}
/>