inti project

This commit is contained in:
root
2026-05-29 04:33:03 -04:00
commit cdeab1796f
699 changed files with 20516 additions and 0 deletions
@@ -0,0 +1,32 @@
<?php
declare(strict_types=1);
namespace App\Domain\IslamicSundaySchool\Attendance;
use App\Domain\SchoolCore\Context\SchoolContext;
use App\Domain\SchoolCore\Contracts\AttendancePolicyContract;
use DateTimeInterface;
final class IslamicSundaySchoolAttendancePolicy implements AttendancePolicyContract
{
public function isSchoolDay(SchoolContext $context, DateTimeInterface $date): bool
{
return (int) $date->format('N') === 7;
}
public function determineStatus(SchoolContext $context, DateTimeInterface $scanTime, array $session): string
{
$startsAt = $session['starts_at'] ?? null;
if ($startsAt instanceof DateTimeInterface && $scanTime > $startsAt) {
return 'late';
}
return 'present';
}
public function duplicateScanWindowSeconds(SchoolContext $context): int
{
return 600;
}
}
@@ -0,0 +1,16 @@
<?php
declare(strict_types=1);
namespace App\Domain\IslamicSundaySchool\Attendance\Policies;
use App\Domain\SchoolCore\Attendance\Policies\DefaultAttendancePolicy;
use App\Domain\SchoolCore\Context\SchoolContext;
final class IslamicSundaySchoolAttendancePolicy extends DefaultAttendancePolicy
{
public function duplicateScanWindowSeconds(SchoolContext $context): int
{
return 180;
}
}
@@ -0,0 +1,22 @@
<?php
declare(strict_types=1);
namespace App\Domain\IslamicSundaySchool\Attendance\Policies;
use App\Domain\SchoolCore\Attendance\Contracts\AttendanceStatusPolicyContract;
use App\Domain\SchoolCore\Attendance\DTO\AttendanceSessionView;
use App\Domain\SchoolCore\Attendance\DTO\AttendanceStatusResult;
use App\Domain\SchoolCore\Context\SchoolContext;
use DateTimeInterface;
final class IslamicSundaySchoolAttendanceStatusPolicy implements AttendanceStatusPolicyContract
{
public function statusForScan(SchoolContext $context, AttendanceSessionView $session, DateTimeInterface $timestamp): AttendanceStatusResult
{
$lateThreshold = $session->startsAt->modify('+15 minutes');
$status = $timestamp > $lateThreshold ? 'late' : 'present';
return new AttendanceStatusResult($status, $status === 'late', $status === 'late' ? 'Configured extension late window.' : null);
}
}
@@ -0,0 +1,13 @@
<?php
declare(strict_types=1);
namespace App\Domain\IslamicSundaySchool\Attendance\Policies;
final class IslamicSundaySchoolSessionPolicy
{
public function supportsProgramSessionType(string $type): bool
{
return in_array($type, ['program', 'group', 'class', 'event'], true);
}
}
@@ -0,0 +1,23 @@
<?php
declare(strict_types=1);
namespace App\Domain\IslamicSundaySchool\Attendance\Providers;
use App\Domain\IslamicSundaySchool\Attendance\Policies\IslamicSundaySchoolAttendancePolicy;
use App\Domain\IslamicSundaySchool\Attendance\Policies\IslamicSundaySchoolAttendanceStatusPolicy;
use App\Domain\IslamicSundaySchool\Attendance\Services\IslamicSundaySchoolSessionResolver;
use App\Domain\SchoolCore\Attendance\Contracts\AttendancePolicyContract;
use App\Domain\SchoolCore\Attendance\Contracts\AttendanceSessionResolverContract;
use App\Domain\SchoolCore\Attendance\Contracts\AttendanceStatusPolicyContract;
use Illuminate\Support\ServiceProvider;
final class IslamicSundaySchoolAttendanceServiceProvider extends ServiceProvider
{
public function register(): void
{
$this->app->bind(AttendancePolicyContract::class, IslamicSundaySchoolAttendancePolicy::class);
$this->app->bind(AttendanceStatusPolicyContract::class, IslamicSundaySchoolAttendanceStatusPolicy::class);
$this->app->bind(AttendanceSessionResolverContract::class, IslamicSundaySchoolSessionResolver::class);
}
}
@@ -0,0 +1,3 @@
# Attendance
Extension module. Bind policies/providers here without leaking implementation details into SchoolCore.
@@ -0,0 +1,17 @@
<?php
declare(strict_types=1);
namespace App\Domain\IslamicSundaySchool\Attendance\Reports;
final class IslamicSundaySchoolAttendanceReportBuilder
{
public function labels(): array
{
return [
'present' => 'Present',
'late' => 'Late',
'absent' => 'Absent',
];
}
}
@@ -0,0 +1,16 @@
<?php
declare(strict_types=1);
namespace App\Domain\IslamicSundaySchool\Attendance\Services;
use App\Domain\SchoolCore\Attendance\DTO\AttendanceSessionView;
use DateTimeInterface;
final class IslamicSundaySchoolLateArrivalEvaluator
{
public function isLate(AttendanceSessionView $session, DateTimeInterface $timestamp): bool
{
return $timestamp > $session->startsAt->modify('+15 minutes');
}
}
@@ -0,0 +1,22 @@
<?php
declare(strict_types=1);
namespace App\Domain\IslamicSundaySchool\Attendance\Services;
use App\Domain\SchoolCore\Attendance\Contracts\AttendanceSessionResolverContract;
use App\Domain\SchoolCore\Attendance\DTO\AttendanceSubjectView;
use App\Domain\SchoolCore\Attendance\DTO\AttendanceSessionView;
use App\Domain\SchoolCore\Attendance\Services\AttendanceSessionResolver;
use App\Domain\SchoolCore\Context\SchoolContext;
use DateTimeInterface;
final class IslamicSundaySchoolSessionResolver implements AttendanceSessionResolverContract
{
public function __construct(private AttendanceSessionResolver $fallback) {}
public function resolveForScan(SchoolContext $context, AttendanceSubjectView $subject, DateTimeInterface $timestamp): AttendanceSessionView
{
return $this->fallback->resolveForScan($context, $subject, $timestamp);
}
}