96 lines
3.8 KiB
PHP
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']);
|
|
}
|
|
}
|