add refund logic and fix books inventory logic
Deploy to Shared Hosting / Shared hosting deploy (push) Failing after 47s
Tests / PHPUnit (push) Failing after 1m20s

This commit is contained in:
root
2026-08-22 13:44:25 -04:00
parent 23d1cbb64c
commit d906a915d6
45 changed files with 4711 additions and 442 deletions
@@ -161,7 +161,7 @@ class InvoiceLedgerServiceTest extends CIUnitTestCase
$this->assertSame('0.00', $calculation['balance']);
$this->assertSame('15.00', $calculation['customer_credit']);
$this->assertSame(-3500, $calculation['rawBalanceCents']);
$this->assertSame(-1500, $calculation['rawBalanceCents']);
}
public function testFullyRefundedOverpaymentClearsCustomerCredit(): void
@@ -177,7 +177,7 @@ class InvoiceLedgerServiceTest extends CIUnitTestCase
$this->assertSame('0.00', $calculation['balance']);
$this->assertSame('0.00', $calculation['customer_credit']);
$this->assertSame(-5000, $calculation['rawBalanceCents']);
$this->assertSame(0, $calculation['rawBalanceCents']);
}
public function testPaymentAfterRefundCanRestorePaidStatus(): void
@@ -392,7 +392,7 @@ class InvoiceLedgerServiceTest extends CIUnitTestCase
$this->assertSame(FinancialStatus::INVOICE_PAID, $calculation['status']);
}
public function testCashRefundDoesNotCreateBalanceAfterOverpaymentIsReturned(): void
public function testCashRefundAboveOverpaymentCreatesBalanceDue(): void
{
$service = new InvoiceLedgerServiceHarness([
'id' => 12,
@@ -405,8 +405,8 @@ class InvoiceLedgerServiceTest extends CIUnitTestCase
$calculation = $service->calculateInvoice(12);
$this->assertSame('0.00', $calculation['customer_credit']);
$this->assertSame('0.00', $calculation['balance']);
$this->assertSame(FinancialStatus::INVOICE_PAID, $calculation['status']);
$this->assertSame('5.00', $calculation['balance']);
$this->assertSame(FinancialStatus::INVOICE_PARTIALLY_PAID, $calculation['status']);
}
public function testIssuedInvoiceUsesPaidRefundsAsCashOutInsteadOfAdditionalCredit(): void
@@ -429,7 +429,7 @@ class InvoiceLedgerServiceTest extends CIUnitTestCase
$this->assertSame(FinancialStatus::INVOICE_PAID, $calculation['status']);
}
public function testRefundedWithdrawalInvoiceHasNoBalanceDue(): void
public function testRefundedWithdrawalInvoiceShowsBalanceWhenRefundsExceedPaymentAgainstCharge(): void
{
$service = new InvoiceLedgerServiceHarness([
'id' => 14,
@@ -446,7 +446,7 @@ class InvoiceLedgerServiceTest extends CIUnitTestCase
$this->assertSame('178.00', $calculation['paid_amount']);
$this->assertSame('178.00', $calculation['refund_paid_total']);
$this->assertSame('0.00', $calculation['customer_credit']);
$this->assertSame('0.00', $calculation['balance']);
$this->assertSame(FinancialStatus::INVOICE_PAID, $calculation['status']);
$this->assertSame('280.00', $calculation['balance']);
$this->assertSame(FinancialStatus::INVOICE_PARTIALLY_PAID, $calculation['status']);
}
}
@@ -24,7 +24,7 @@ class RefundEligibilityServiceHarness extends RefundEligibilityService
return $this->completedPayoutCents;
}
protected function calculateReservedAmountCents(string $sourceType, int $sourceId, ?int $excludeRefundId): int
protected function calculateReservedAmountCents(string $sourceType, int $sourceId, ?int $excludeRefundId, ?int $invoiceId = null): int
{
return $this->reservedAmountCents;
}
@@ -60,17 +60,17 @@ class RefundEligibilityServiceTest extends CIUnitTestCase
$this->assertContains('HAS_APPROVED_RESERVATIONS', $result->reasonCodes);
}
public function testTuitionWithdrawalAvailableCreditSubtractsCompletedPayoutsAndReservations(): void
public function testTuitionWithdrawalAvailableCreditUsesAdjustedInvoiceCreditWithoutDoubleSubtractingPayouts(): void
{
$service = new RefundEligibilityServiceHarness(20000, 2500, 1500);
$result = $service->calculateAvailableCredit(10, 20, 'tuition_withdrawal', 20);
$this->assertSame(20000, $result->sourceCreditCents);
$this->assertSame(2500, $result->completedPayoutCents);
$this->assertSame(0, $result->completedPayoutCents);
$this->assertSame(1500, $result->reservedAmountCents);
$this->assertSame(16000, $result->availableAmountCents);
$this->assertContains('HAS_COMPLETED_PAYOUTS', $result->reasonCodes);
$this->assertSame(18500, $result->availableAmountCents);
$this->assertNotContains('HAS_COMPLETED_PAYOUTS', $result->reasonCodes);
$this->assertContains('HAS_APPROVED_RESERVATIONS', $result->reasonCodes);
}