add controllers, servoices

This commit is contained in:
root
2026-03-09 02:52:13 -04:00
parent c8de5f7edc
commit d76c871cb7
501 changed files with 34439 additions and 21843 deletions
@@ -0,0 +1,77 @@
<?php
namespace App\Services\Invoices;
use App\Models\ClassSection;
class InvoiceTuitionService
{
public function __construct(
private InvoiceGradeService $grades,
private int $gradeFee,
private float $firstStudentFee,
private float $secondStudentFee,
private float $youthFee,
private string $timezone
) {
}
public function calculateTuitionFee(array $registeredKids, array $withdrawnKids, ?string $refundDeadline): float
{
$refundOk = $this->isRefundAllowed($refundDeadline);
$tuitionStudents = $refundOk ? $registeredKids : array_merge($registeredKids, $withdrawnKids);
return $this->calculateTotalTuitionFee($tuitionStudents);
}
public function calculateTotalTuitionFee(array $students): float
{
foreach ($students as &$student) {
$gradeName = ClassSection::getClassSectionNameBySectionId($student['class_section_id'] ?? null) ?? '';
$student['grade'] = strtoupper(trim($gradeName));
}
unset($student);
$regularCount = 0;
$youthCount = 0;
foreach ($students as $student) {
$levelInfo = $this->grades->getGradeLevel($student['grade'] ?? '');
$level = (int) ($levelInfo['level'] ?? 999);
if ($level > $this->gradeFee) {
$youthCount++;
} else {
$regularCount++;
}
}
$total = 0.0;
$total += $youthCount * $this->youthFee;
if ($regularCount >= 2) {
$total += $this->firstStudentFee;
$total += ($regularCount - 1) * $this->secondStudentFee;
} elseif ($regularCount === 1) {
$total += $this->firstStudentFee;
}
return $total;
}
private function isRefundAllowed(?string $refundDeadline): bool
{
if (!$refundDeadline) {
return true;
}
try {
$tz = new \DateTimeZone($this->timezone);
$today = new \DateTimeImmutable('today', $tz);
$deadline = new \DateTimeImmutable($refundDeadline, $tz);
return $today <= $deadline;
} catch (\Throwable $e) {
return true;
}
}
}