Files
alrahma_sunday_school/app/Database/Migrations/2026-08-06-000500_AddEnrollmentAdministrationNavItem.php
root 1ef2800f12
Tests / PHPUnit (push) Successful in 1m26s
fix enrollment for the new school-year
2026-08-07 23:43:31 -04:00

191 lines
5.6 KiB
PHP

<?php
namespace App\Database\Migrations;
use CodeIgniter\Database\Migration;
class AddEnrollmentAdministrationNavItem extends Migration
{
private string $label = 'Enrollment Administration';
private string $url = 'administrator/enrollment-admin';
public function up(): void
{
if (! $this->db->tableExists('nav_items')) {
return;
}
$parentColumn = $this->parentColumn();
$parent = $this->studentAffairsParent($parentColumn);
$navItemId = $this->navItemId($parentColumn, $parent);
if ($navItemId <= 0) {
return;
}
$this->grantRoles($navItemId, [
'administrator',
'principal',
'vice_principal',
'head of department (education)',
]);
cache()->clean();
}
public function down(): void
{
if (! $this->db->tableExists('nav_items')) {
return;
}
$row = $this->db->table('nav_items')
->where('url', $this->url)
->get()
->getRowArray();
if ($row === null) {
return;
}
if ($this->db->tableExists('role_nav_items')) {
$this->db->table('role_nav_items')
->where('nav_item_id', (int) $row['id'])
->delete();
}
$this->db->table('nav_items')
->where('id', (int) $row['id'])
->delete();
cache()->clean();
}
private function navItemId(?string $parentColumn, ?array $parent): int
{
$existing = $this->db->table('nav_items')
->where('url', $this->url)
->get()
->getRowArray();
if ($existing !== null) {
$updates = [
'label' => $this->label,
'is_enabled' => 1,
'updated_at' => date('Y-m-d H:i:s'),
];
if ($parentColumn !== null && ! empty($parent['id'])) {
$updates[$parentColumn] = (int) $parent['id'];
}
$this->db->table('nav_items')
->where('id', (int) $existing['id'])
->update($updates);
return (int) $existing['id'];
}
$insert = [
'label' => $this->label,
'url' => $this->url,
'sort_order' => 6,
'is_enabled' => 1,
'created_at' => date('Y-m-d H:i:s'),
'updated_at' => date('Y-m-d H:i:s'),
];
if ($this->db->fieldExists('icon_class', 'nav_items')) {
$insert['icon_class'] = 'bi bi-diagram-3';
}
if ($parentColumn !== null && ! empty($parent['id'])) {
$insert[$parentColumn] = (int) $parent['id'];
}
$this->db->table('nav_items')->insert($insert);
return (int) $this->db->insertID();
}
private function studentAffairsParent(?string $parentColumn): ?array
{
$builder = $this->db->table('nav_items')->where('label', 'Student-Affairs');
if ($parentColumn !== null) {
$builder->where($parentColumn, null);
}
return $builder->get()->getRowArray();
}
private function grantRoles(int $navItemId, array $roleNames): void
{
if (! $this->db->tableExists('role_nav_items')) {
return;
}
if ($this->db->fieldExists('role_id', 'role_nav_items') && $this->db->tableExists('roles')) {
foreach ($roleNames as $roleName) {
$roleBuilder = $this->db->table('roles')->select('id');
$roleBuilder->groupStart()
->where('LOWER(name)', strtolower($roleName));
if ($this->db->fieldExists('slug', 'roles')) {
$roleBuilder->orWhere('LOWER(slug)', strtolower($roleName));
}
$role = $roleBuilder->groupEnd()
->limit(1)
->get()
->getRowArray();
if ($role === null) {
continue;
}
$exists = $this->db->table('role_nav_items')
->where('role_id', (int) $role['id'])
->where('nav_item_id', $navItemId)
->countAllResults() > 0;
if (! $exists) {
$this->db->table('role_nav_items')->insert([
'role_id' => (int) $role['id'],
'nav_item_id' => $navItemId,
'created_at' => date('Y-m-d H:i:s'),
'updated_at' => date('Y-m-d H:i:s'),
]);
}
}
return;
}
if (! $this->db->fieldExists('role', 'role_nav_items')) {
return;
}
foreach ($roleNames as $roleName) {
$roleName = strtolower($roleName);
$exists = $this->db->table('role_nav_items')
->where('role', $roleName)
->where('nav_item_id', $navItemId)
->countAllResults() > 0;
if (! $exists) {
$this->db->table('role_nav_items')->insert([
'role' => $roleName,
'nav_item_id' => $navItemId,
'created_at' => date('Y-m-d H:i:s'),
'updated_at' => date('Y-m-d H:i:s'),
]);
}
}
}
private function parentColumn(): ?string
{
if ($this->db->fieldExists('menu_parent_id', 'nav_items')) {
return 'menu_parent_id';
}
if ($this->db->fieldExists('parent_id', 'nav_items')) {
return 'parent_id';
}
return null;
}
}