Files
alrahma_sunday_school_api/app/Services/Administrator/AdministratorSharedService.php
T
2026-06-11 03:22:12 -04:00

166 lines
4.3 KiB
PHP

<?php
namespace App\Services\Administrator;
use App\Models\Configuration;
use Carbon\Carbon;
use Illuminate\Support\Facades\Schema;
class AdministratorSharedService
{
protected ?bool $teacherClassHasSemesterColumn = null;
public function __construct(
protected Configuration $configuration
) {
}
public function getSemester(?string $override = null): string
{
$value = trim((string) $override);
return $value !== '' ? $value : (string) ($this->configuration->getConfig('semester') ?? '');
}
public function getSchoolYear(?string $override = null): string
{
$value = trim((string) $override);
return $value !== '' ? $value : (string) ($this->configuration->getConfig('school_year') ?? '');
}
public function getPreviousSchoolYear(string $schoolYear): string
{
$schoolYear = trim($schoolYear);
if ($schoolYear === '') {
return '';
}
if (preg_match('/^(\d{4})\s*-\s*(\d{4})$/', $schoolYear, $m)) {
return ((int) $m[1] - 1) . '-' . ((int) $m[2] - 1);
}
if (preg_match('/^(\d{4})\s*-\s*(\d{2})$/', $schoolYear, $m)) {
$start = (int) $m[1] - 1;
$end = (int) $m[2] - 1;
if ($end < 0) {
$end += 100;
}
return sprintf('%04d-%02d', $start, $end);
}
if (preg_match('/^\d{4}$/', $schoolYear)) {
return (string) ((int) $schoolYear - 1);
}
return '';
}
public function getSchoolYearStartYear(string $schoolYear): ?int
{
$schoolYear = trim($schoolYear);
if ($schoolYear === '') {
return null;
}
if (preg_match('/^(\d{4})\s*-\s*(\d{4})$/', $schoolYear, $m)) {
return (int) $m[1];
}
if (preg_match('/^(\d{4})\s*-\s*(\d{2})$/', $schoolYear, $m)) {
return (int) $m[1];
}
if (preg_match('/^\d{4}$/', $schoolYear)) {
return (int) $schoolYear;
}
return null;
}
public function allowedAbsenceDates(): array
{
$today = Carbon::today();
$schoolYear = $this->getSchoolYear();
$startYear = null;
$endYear = null;
if (preg_match('/^(\d{4})\D+(\d{4})$/', $schoolYear, $m)) {
$startYear = (int) $m[1];
$endYear = (int) $m[2];
} else {
$cy = (int) now()->format('Y');
$cm = (int) now()->format('n');
if ($cm >= 9) {
$startYear = $cy;
$endYear = $cy + 1;
} else {
$startYear = $cy - 1;
$endYear = $cy;
}
}
try {
$start = Carbon::create($startYear, 9, 1)->startOfDay();
$end = Carbon::create($endYear, 5, 31)->startOfDay();
} catch (\Throwable) {
return [];
}
if ($start->lt($today)) {
$start = $today->copy();
}
$dates = [];
$cursor = $start->copy();
while ($cursor->lte($end)) {
if ($cursor->dayOfWeek === Carbon::SUNDAY) {
$dates[] = $cursor->format('Y-m-d');
}
$cursor->addDay();
}
return $dates;
}
public function countUniqueEntities($rows): int
{
if (!is_iterable($rows)) {
return 0;
}
$ids = [];
foreach ($rows as $row) {
if (is_array($row)) {
if (isset($row['id'])) {
$ids[] = (int) $row['id'];
} elseif (isset($row['user_id'])) {
$ids[] = (int) $row['user_id'];
}
} elseif (is_object($row)) {
if (isset($row->id)) {
$ids[] = (int) $row->id;
} elseif (isset($row->user_id)) {
$ids[] = (int) $row->user_id;
}
}
}
return count(array_unique($ids));
}
public function teacherClassSupportsSemester(): bool
{
if ($this->teacherClassHasSemesterColumn !== null) {
return $this->teacherClassHasSemesterColumn;
}
return $this->teacherClassHasSemesterColumn = Schema::hasColumn('teacher_class', 'semester');
}
}