Files
alrahma_sunday_school/tests/app/Libraries/ParentLedgerServiceTest.php
T
root a30c1398a1
Tests / PHPUnit (push) Failing after 1m21s
fix financials
2026-07-18 22:57:40 -04:00

96 lines
3.8 KiB
PHP

<?php
namespace Tests\App\Libraries;
use App\Libraries\ParentLedgerService;
use App\Libraries\RefundEligibilityResult;
use CodeIgniter\Test\CIUnitTestCase;
class ParentLedgerServiceHarness extends ParentLedgerService
{
public function __construct(
private array $invoices,
private array $ledgers,
private array $eligibilities
) {
}
protected function loadInvoices(int $parentId, string $schoolYear, ?string $semester): array
{
return array_values(array_filter($this->invoices, static function (array $invoice) use ($parentId, $schoolYear, $semester): bool {
if ((int)($invoice['parent_id'] ?? 0) !== $parentId || (string)($invoice['school_year'] ?? '') !== $schoolYear) {
return false;
}
return $semester === null || $semester === '' || (string)($invoice['semester'] ?? '') === $semester;
}));
}
protected function ledgerForInvoice(int $invoiceId): array
{
return $this->ledgers[$invoiceId] ?? [];
}
protected function eligibilityForSource(
int $parentId,
?int $invoiceId,
string $sourceType,
int $sourceId
): RefundEligibilityResult {
return $this->eligibilities[$sourceId] ?? new RefundEligibilityResult(0, 0, 0, 0, []);
}
}
class ParentLedgerServiceTest extends CIUnitTestCase
{
public function testParentProjectionAggregatesLedgerAndEligibilityFields(): void
{
$service = new ParentLedgerServiceHarness(
[
['id' => 10, 'parent_id' => 5, 'school_year' => '2026-2027', 'semester' => 'Fall', 'invoice_number' => 'INV-10'],
['id' => 11, 'parent_id' => 5, 'school_year' => '2026-2027', 'semester' => 'Fall', 'invoice_number' => 'INV-11'],
['id' => 12, 'parent_id' => 5, 'school_year' => '2026-2027', 'semester' => 'Spring', 'invoice_number' => 'INV-12'],
],
[
10 => [
'totalAmountCents' => 10000,
'discountCents' => 1000,
'paidCents' => 11000,
'completedRefundCents' => 500,
'balanceDueCents' => 0,
'customerCreditCents' => 1500,
'status' => 'paid',
],
11 => [
'totalAmountCents' => 8000,
'discountCents' => 0,
'paidCents' => 2000,
'completedRefundCents' => 0,
'balanceDueCents' => 6000,
'customerCreditCents' => 0,
'status' => 'partially_paid',
],
],
[
10 => new RefundEligibilityResult(1500, 0, 300, 1200, ['HAS_APPROVED_RESERVATIONS']),
11 => new RefundEligibilityResult(0, 0, 0, 0, ['NO_AVAILABLE_CREDIT']),
]
);
$projection = $service->getParentProjection(5, '2026-2027', 'Fall');
$this->assertSame(18000, $projection['grossChargesCents']);
$this->assertSame(1000, $projection['discountCents']);
$this->assertSame(17000, $projection['netInvoiceChargesCents']);
$this->assertSame(13000, $projection['validPaymentCents']);
$this->assertSame(500, $projection['completedRefundCents']);
$this->assertSame(6000, $projection['balanceDueCents']);
$this->assertSame(1500, $projection['customerCreditCents']);
$this->assertSame(300, $projection['approvedRefundReservationCents']);
$this->assertSame(1200, $projection['availableRefundableCreditCents']);
$this->assertSame('170.00', $projection['net_invoice_charges']);
$this->assertSame('12.00', $projection['available_refundable_credit']);
$this->assertCount(2, $projection['invoices']);
}
}