Files
alrahma_sunday_school/app/Models/CalendarModel.php
T
2026-05-16 13:44:12 -04:00

111 lines
3.2 KiB
PHP
Executable File

<?php
namespace App\Models;
use CodeIgniter\Model;
class CalendarModel extends Model
{
protected $table = 'calendar_events';
protected $primaryKey = 'id';
protected ?bool $hasEventTypeColumn = null;
protected $allowedFields = [
'title',
'date',
'description',
'event_type',
'semester',
'school_year',
'notify_parent',
'notify_admin',
'notify_teacher',
'no_school'
];
protected $useTimestamps = true;
protected $createdField = 'created_at';
protected $updatedField = 'updated_at';
public function getEvents()
{
$events = $this->findAll();
return $this->withNoSchoolFlag($events);
}
public function getEventByDate($date)
{
$events = $this->where('date', $date)->findAll();
return $this->withNoSchoolFlag($events);
}
public function addEvent($data)
{
return $this->insert($data);
}
public function getEventsBySchoolYear($schoolYear)
{
$events = $this->where('school_year', $schoolYear)
->orderBy('date', 'ASC')
->findAll();
return $this->withNoSchoolFlag($events);
}
public function getEventsBySchoolYearAndSemester(string $schoolYear, ?string $semester = null): array
{
$builder = $this->where('school_year', $schoolYear);
if (is_string($semester) && $semester !== '') {
$builder = $builder->where('semester', $semester);
}
$events = $builder->orderBy('date', 'ASC')->findAll();
return $this->withNoSchoolFlag($events);
}
public function supportsEventType(): bool
{
if ($this->hasEventTypeColumn === null) {
$this->hasEventTypeColumn = $this->db->fieldExists('event_type', $this->table);
}
return $this->hasEventTypeColumn;
}
/**
* Add computed no_school flag to each event without requiring DB schema changes.
* An event is considered no-school if title or description contains keywords.
*
* @param array $events
* @return array
*/
protected function withNoSchoolFlag(array $events): array
{
return array_map(function ($event) {
// Respect DB value if present; otherwise infer heuristically
if (array_key_exists('no_school', (array) $event)) {
$event['no_school'] = (int) ((array) $event)['no_school'];
} else {
$event['no_school'] = $this->isNoSchoolEvent((array) $event) ? 1 : 0;
}
return $event;
}, $events);
}
/**
* Heuristic to determine "no school" days from event text.
*/
protected function isNoSchoolEvent(array $event): bool
{
$title = strtolower((string)($event['title'] ?? ''));
$desc = strtolower((string)($event['description'] ?? ''));
$text = $title . ' ' . $desc;
$keywords = ['no school', 'no-school', 'cancel', 'vacation', 'holiday', 'break'];
foreach ($keywords as $kw) {
if ($kw !== '' && strpos($text, $kw) !== false) {
return true;
}
}
return false;
}
}