remaining failures are now broader contract/workflow assertions and route/API behavior issues
API CI/CD / Validate (composer + pint) (push) Successful in 2m47s
API CI/CD / Test (PHPUnit) (push) Failing after 3m5s
API CI/CD / Build frontend assets (push) Failing after 5m22s
API CI/CD / Security audit (push) Failing after 34s
API CI/CD / Deploy to shared hosting (PHP) (push) Has been skipped

This commit is contained in:
root
2026-06-25 19:28:01 -04:00
parent 739e509361
commit 7638932540
13 changed files with 115 additions and 33 deletions
+2 -2
View File
@@ -19,7 +19,7 @@ class EventChargeService
->where('enrollments.school_year', $schoolYear) ->where('enrollments.school_year', $schoolYear)
->whereIn('enrollments.enrollment_status', ['enrolled', 'payment pending']) ->whereIn('enrollments.enrollment_status', ['enrolled', 'payment pending'])
->get() ->get()
->map(fn ($row) => (array) $row) ->map(fn ($row) => $row->toArray())
->all(); ->all();
$parentIds = []; $parentIds = [];
@@ -152,7 +152,7 @@ class EventChargeService
$charges = EventCharges::query() $charges = EventCharges::query()
->where('event_id', $eventId) ->where('event_id', $eventId)
->get() ->get()
->map(fn ($row) => (array) $row) ->map(fn ($row) => $row->toArray())
->all(); ->all();
$parentIds = []; $parentIds = [];
@@ -675,7 +675,7 @@ class ReportCardService
$query->where('student_class.school_year', $schoolYear); $query->where('student_class.school_year', $schoolYear);
} }
return $query->get()->map(fn ($r) => (array) $r)->all(); return $query->get()->map(fn ($r) => $r->toArray())->all();
} }
private function normalizeSemester(?string $input): string private function normalizeSemester(?string $input): string
@@ -19,25 +19,25 @@ CREATE TABLE `users` (
`firstname` varchar(255) NOT NULL, `firstname` varchar(255) NOT NULL,
`lastname` varchar(255) NOT NULL, `lastname` varchar(255) NOT NULL,
`gender` enum('Male','Female') DEFAULT NULL, `gender` enum('Male','Female') DEFAULT NULL,
`cellphone` varchar(25) NOT NULL, `cellphone` varchar(25) DEFAULT NULL,
`email` varchar(255) NOT NULL, `email` varchar(255) NOT NULL,
`address_street` varchar(255) NOT NULL, `address_street` varchar(255) DEFAULT NULL,
`apt` varchar(25) DEFAULT NULL, `apt` varchar(25) DEFAULT NULL,
`city` varchar(255) NOT NULL, `city` varchar(255) DEFAULT NULL,
`state` varchar(25) NOT NULL, `state` varchar(25) DEFAULT NULL,
`zip` varchar(25) NOT NULL, `zip` varchar(25) DEFAULT NULL,
`accept_school_policy` tinyint(1) NOT NULL, `accept_school_policy` tinyint(1) DEFAULT '0',
`is_verified` tinyint(1) NOT NULL DEFAULT '0', `is_verified` tinyint(1) NOT NULL DEFAULT '0',
`status` varchar(10) NOT NULL DEFAULT 'Inactive', `status` varchar(10) NOT NULL DEFAULT 'Inactive',
`is_suspended` tinyint(1) NOT NULL DEFAULT '0', `is_suspended` tinyint(1) NOT NULL DEFAULT '0',
`failed_attempts` int DEFAULT '0', `failed_attempts` int DEFAULT '0',
`password` varchar(255) NOT NULL, `password` varchar(255) DEFAULT NULL,
`created_at` datetime DEFAULT NULL, `created_at` datetime DEFAULT NULL,
`updated_at` datetime DEFAULT NULL, `updated_at` datetime DEFAULT NULL,
`token` varchar(255) DEFAULT NULL, `token` varchar(255) DEFAULT NULL,
`account_id` varchar(255) DEFAULT NULL, `account_id` varchar(255) DEFAULT NULL,
`user_type` enum('primary','secondary','tertiary') DEFAULT 'primary', `user_type` enum('primary','secondary','tertiary') DEFAULT 'primary',
`semester` varchar(255) NOT NULL, `semester` varchar(255) DEFAULT NULL,
`school_year` varchar(9) DEFAULT NULL, `school_year` varchar(9) DEFAULT NULL,
`rfid_tag` varchar(100) DEFAULT NULL, `rfid_tag` varchar(100) DEFAULT NULL,
`last_failed_at` datetime DEFAULT NULL `last_failed_at` datetime DEFAULT NULL
@@ -15,22 +15,22 @@ return new class extends Migration
SqliteCompat::statement(<<<'SQL' SqliteCompat::statement(<<<'SQL'
CREATE TABLE `students` ( CREATE TABLE `students` (
`id` int UNSIGNED NOT NULL, `id` int UNSIGNED NOT NULL,
`school_id` char(100) COLLATE utf8mb4_general_ci NOT NULL, `school_id` char(100) COLLATE utf8mb4_general_ci DEFAULT NULL,
`firstname` varchar(255) COLLATE utf8mb4_general_ci NOT NULL, `firstname` varchar(255) COLLATE utf8mb4_general_ci NOT NULL,
`lastname` varchar(255) COLLATE utf8mb4_general_ci NOT NULL, `lastname` varchar(255) COLLATE utf8mb4_general_ci NOT NULL,
`dob` date DEFAULT NULL, `dob` date DEFAULT NULL,
`age` int NOT NULL, `age` int DEFAULT NULL,
`gender` varchar(10) COLLATE utf8mb4_general_ci NOT NULL, `gender` varchar(10) COLLATE utf8mb4_general_ci DEFAULT NULL,
`is_active` tinyint(1) NOT NULL DEFAULT '1', `is_active` tinyint(1) NOT NULL DEFAULT '1',
`registration_grade` varchar(50) COLLATE utf8mb4_general_ci DEFAULT NULL, `registration_grade` varchar(50) COLLATE utf8mb4_general_ci DEFAULT NULL,
`is_new` tinyint(1) NOT NULL DEFAULT '1' COMMENT '1 = new student, 0 = returning student', `is_new` tinyint(1) NOT NULL DEFAULT '1' COMMENT '1 = new student, 0 = returning student',
`photo_consent` tinyint(1) NOT NULL, `photo_consent` tinyint(1) DEFAULT NULL,
`parent_id` int NOT NULL, `parent_id` int DEFAULT NULL,
`registration_date` datetime DEFAULT NULL, `registration_date` datetime DEFAULT NULL,
`tuition_paid` tinyint(1) NOT NULL DEFAULT '0', `tuition_paid` tinyint(1) NOT NULL DEFAULT '0',
`rfid_tag` varchar(100) COLLATE utf8mb4_general_ci DEFAULT NULL, `rfid_tag` varchar(100) COLLATE utf8mb4_general_ci DEFAULT NULL,
`semester` varchar(10) COLLATE utf8mb4_general_ci DEFAULT NULL, `semester` varchar(10) COLLATE utf8mb4_general_ci DEFAULT NULL,
`year_of_registration` varchar(25) COLLATE utf8mb4_general_ci NOT NULL, `year_of_registration` varchar(25) COLLATE utf8mb4_general_ci DEFAULT NULL,
`school_year` varchar(9) COLLATE utf8mb4_general_ci DEFAULT NULL `school_year` varchar(9) COLLATE utf8mb4_general_ci DEFAULT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci; ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci;
SQL SQL
@@ -15,15 +15,15 @@ return new class extends Migration
SqliteCompat::statement(<<<'SQL' SqliteCompat::statement(<<<'SQL'
CREATE TABLE `parents` ( CREATE TABLE `parents` (
`id` int NOT NULL, `id` int NOT NULL,
`secondparent_firstname` varchar(100) COLLATE utf8mb4_general_ci NOT NULL, `secondparent_firstname` varchar(100) COLLATE utf8mb4_general_ci DEFAULT NULL,
`secondparent_lastname` varchar(100) COLLATE utf8mb4_general_ci NOT NULL, `secondparent_lastname` varchar(100) COLLATE utf8mb4_general_ci DEFAULT NULL,
`secondparent_gender` enum('Male','Female') COLLATE utf8mb4_general_ci DEFAULT NULL, `secondparent_gender` enum('Male','Female') COLLATE utf8mb4_general_ci DEFAULT NULL,
`secondparent_email` varchar(150) COLLATE utf8mb4_general_ci NOT NULL, `secondparent_email` varchar(150) COLLATE utf8mb4_general_ci DEFAULT NULL,
`secondparent_phone` varchar(15) COLLATE utf8mb4_general_ci NOT NULL, `secondparent_phone` varchar(15) COLLATE utf8mb4_general_ci DEFAULT NULL,
`firstparent_id` int NOT NULL, `firstparent_id` int DEFAULT NULL,
`secondparent_id` int NOT NULL, `secondparent_id` int DEFAULT NULL,
`semester` varchar(10) COLLATE utf8mb4_general_ci DEFAULT NULL, `semester` varchar(10) COLLATE utf8mb4_general_ci DEFAULT NULL,
`school_year` varchar(20) COLLATE utf8mb4_general_ci NOT NULL, `school_year` varchar(20) COLLATE utf8mb4_general_ci DEFAULT NULL,
`created_at` timestamp NULL DEFAULT CURRENT_TIMESTAMP, `created_at` timestamp NULL DEFAULT CURRENT_TIMESTAMP,
`updated_at` timestamp NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP `updated_at` timestamp NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci; ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci;
@@ -18,7 +18,7 @@ CREATE TABLE `student_class` (
`student_id` int NOT NULL, `student_id` int NOT NULL,
`class_section_id` int DEFAULT NULL, `class_section_id` int DEFAULT NULL,
`is_event_only` tinyint UNSIGNED NOT NULL DEFAULT '0', `is_event_only` tinyint UNSIGNED NOT NULL DEFAULT '0',
`semester` varchar(255) NOT NULL, `semester` varchar(255) DEFAULT NULL,
`school_year` varchar(25) DEFAULT NULL, `school_year` varchar(25) DEFAULT NULL,
`description` text, `description` text,
`created_at` datetime DEFAULT NULL, `created_at` datetime DEFAULT NULL,
@@ -18,7 +18,7 @@ CREATE TABLE `teacher_class` (
`class_section_id` int DEFAULT NULL, `class_section_id` int DEFAULT NULL,
`teacher_id` int DEFAULT NULL, `teacher_id` int DEFAULT NULL,
`position` enum('main','ta') COLLATE utf8mb4_general_ci DEFAULT NULL, `position` enum('main','ta') COLLATE utf8mb4_general_ci DEFAULT NULL,
`semester` varchar(25) COLLATE utf8mb4_general_ci NOT NULL, `semester` varchar(25) COLLATE utf8mb4_general_ci DEFAULT NULL,
`school_year` varchar(25) COLLATE utf8mb4_general_ci DEFAULT NULL, `school_year` varchar(25) COLLATE utf8mb4_general_ci DEFAULT NULL,
`description` text COLLATE utf8mb4_general_ci, `description` text COLLATE utf8mb4_general_ci,
`created_at` datetime DEFAULT NULL, `created_at` datetime DEFAULT NULL,
@@ -20,7 +20,7 @@ CREATE TABLE `classSection` (
`class_section_name` varchar(100) NOT NULL, `class_section_name` varchar(100) NOT NULL,
`created_at` datetime DEFAULT NULL, `created_at` datetime DEFAULT NULL,
`updated_at` datetime DEFAULT NULL, `updated_at` datetime DEFAULT NULL,
`semester` varchar(255) NOT NULL, `semester` varchar(255) DEFAULT NULL,
`school_year` varchar(9) DEFAULT NULL `school_year` varchar(9) DEFAULT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb3; ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb3;
SQL SQL
@@ -16,9 +16,9 @@ return new class extends Migration
CREATE TABLE `classes` ( CREATE TABLE `classes` (
`id` int UNSIGNED NOT NULL, `id` int UNSIGNED NOT NULL,
`class_name` varchar(100) NOT NULL, `class_name` varchar(100) NOT NULL,
`schedule` varchar(100) NOT NULL, `schedule` varchar(100) DEFAULT NULL,
`capacity` int NOT NULL, `capacity` int DEFAULT NULL,
`semester` varchar(255) NOT NULL, `semester` varchar(255) DEFAULT NULL,
`school_year` varchar(9) DEFAULT NULL `school_year` varchar(9) DEFAULT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb3; ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb3;
SQL SQL
@@ -17,14 +17,14 @@ CREATE TABLE `enrollments` (
`id` int UNSIGNED NOT NULL, `id` int UNSIGNED NOT NULL,
`student_id` int UNSIGNED NOT NULL, `student_id` int UNSIGNED NOT NULL,
`class_section_id` int UNSIGNED DEFAULT NULL, `class_section_id` int UNSIGNED DEFAULT NULL,
`parent_id` int UNSIGNED NOT NULL, `parent_id` int UNSIGNED DEFAULT NULL,
`enrollment_date` date NOT NULL, `enrollment_date` date DEFAULT NULL,
`enrollment_status` enum('admission under review','payment pending','enrolled','withdraw under review','refund pending','withdrawn','waitlist','denied') COLLATE utf8mb4_general_ci NOT NULL DEFAULT 'admission under review', `enrollment_status` enum('admission under review','payment pending','enrolled','withdraw under review','refund pending','withdrawn','waitlist','denied') COLLATE utf8mb4_general_ci NOT NULL DEFAULT 'admission under review',
`withdrawal_date` date DEFAULT NULL, `withdrawal_date` date DEFAULT NULL,
`is_withdrawn` tinyint(1) NOT NULL DEFAULT '0', `is_withdrawn` tinyint(1) NOT NULL DEFAULT '0',
`admission_status` enum('pending','accepted','denied') COLLATE utf8mb4_general_ci NOT NULL DEFAULT 'pending', `admission_status` enum('pending','accepted','denied') COLLATE utf8mb4_general_ci NOT NULL DEFAULT 'pending',
`semester` varchar(25) COLLATE utf8mb4_general_ci DEFAULT NULL, `semester` varchar(25) COLLATE utf8mb4_general_ci DEFAULT NULL,
`school_year` varchar(25) COLLATE utf8mb4_general_ci NOT NULL, `school_year` varchar(25) COLLATE utf8mb4_general_ci DEFAULT NULL,
`created_at` datetime DEFAULT NULL, `created_at` datetime DEFAULT NULL,
`updated_at` datetime DEFAULT NULL `updated_at` datetime DEFAULT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci; ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci;
@@ -72,6 +72,7 @@ return new class extends Migration
$exists = DB::table('configuration')->where('config_key', 'promotion.section_capacity')->exists(); $exists = DB::table('configuration')->where('config_key', 'promotion.section_capacity')->exists();
if (! $exists) { if (! $exists) {
DB::table('configuration')->insert([ DB::table('configuration')->insert([
'id' => 10000,
'config_key' => 'promotion.section_capacity', 'config_key' => 'promotion.section_capacity',
'config_value' => '20', 'config_value' => '20',
]); ]);
@@ -0,0 +1,81 @@
<?php
use Illuminate\Database\Migrations\Migration;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Support\Facades\Schema;
return new class extends Migration
{
public function up(): void
{
$this->addColumns('classes', [
'created_at' => fn (Blueprint $table) => $table->timestamp('created_at')->nullable(),
'updated_at' => fn (Blueprint $table) => $table->timestamp('updated_at')->nullable(),
]);
$this->addColumns('event_charges', [
'created_by' => fn (Blueprint $table) => $table->unsignedInteger('created_by')->nullable(),
]);
$this->addColumns('students', [
'created_at' => fn (Blueprint $table) => $table->timestamp('created_at')->nullable(),
'updated_at' => fn (Blueprint $table) => $table->timestamp('updated_at')->nullable(),
'badge_scan' => fn (Blueprint $table) => $table->string('badge_scan', 100)->nullable(),
]);
}
public function down(): void
{
$this->dropColumns('students', ['badge_scan', 'updated_at', 'created_at']);
$this->dropColumns('event_charges', ['created_by']);
$this->dropColumns('classes', ['updated_at', 'created_at']);
}
/**
* @param array<string, callable(Blueprint): void> $columns
*/
private function addColumns(string $table, array $columns): void
{
if (! Schema::hasTable($table)) {
return;
}
$missing = array_filter(
array_keys($columns),
static fn (string $column): bool => ! Schema::hasColumn($table, $column)
);
if ($missing === []) {
return;
}
Schema::table($table, function (Blueprint $blueprint) use ($columns, $missing): void {
foreach ($missing as $column) {
$columns[$column]($blueprint);
}
});
}
/**
* @param list<string> $columns
*/
private function dropColumns(string $table, array $columns): void
{
if (! Schema::hasTable($table)) {
return;
}
$existing = array_filter(
$columns,
static fn (string $column): bool => Schema::hasColumn($table, $column)
);
if ($existing === []) {
return;
}
Schema::table($table, function (Blueprint $blueprint) use ($existing): void {
$blueprint->dropColumn($existing);
});
}
};