=== PHASE 4 FORENSIC VERIFY === [PASS] [database] Table finance_settings [PASS] [database] Table fee_categories [PASS] [database] Table fee_heads [PASS] [database] Table fee_templates [PASS] [database] Table fee_structures [PASS] [database] Table course_fees [PASS] [database] Table discounts [PASS] [database] Table scholarships [PASS] [database] Table bursaries [PASS] [database] Table finance_sponsors [PASS] [database] Table student_accounts [PASS] [database] Table finance_invoices [PASS] [database] Table finance_invoice_items [PASS] [database] Table finance_payments [PASS] [database] Table finance_payment_allocations [PASS] [database] Table finance_receipts [PASS] [database] Table finance_credit_notes [PASS] [database] Table finance_debit_notes [PASS] [database] Table finance_refunds [PASS] [database] Table payment_plans [PASS] [database] Table payment_plan_installments [PASS] [database] Table minimum_payment_rules [PASS] [database] Table student_clearances [PASS] [database] Table result_release_holds [PASS] [database] Table payment_transactions [PASS] [database] Table payment_webhooks [PASS] [database] Table finance_waivers [PASS] [database] Table finance_penalties [PASS] [database] Table student_scholarships [PASS] [database] Table finance_ledger_entries [PASS] [database] fee_categories.deleted_at [PASS] [database] fee_heads.deleted_at [PASS] [database] fee_templates.deleted_at [PASS] [database] fee_structures.deleted_at [PASS] [database] course_fees.deleted_at [PASS] [database] discounts.deleted_at [PASS] [database] scholarships.deleted_at [PASS] [database] bursaries.deleted_at [PASS] [database] finance_sponsors.deleted_at [PASS] [database] student_accounts.deleted_at [PASS] [database] finance_invoices.deleted_at [PASS] [database] finance_payments.deleted_at [PASS] [database] finance_receipts.deleted_at [PASS] [database] finance_credit_notes.deleted_at [PASS] [database] finance_debit_notes.deleted_at [PASS] [database] finance_refunds.deleted_at [PASS] [database] payment_plans.deleted_at [PASS] [database] minimum_payment_rules.deleted_at [PASS] [database] student_clearances.deleted_at [PASS] [database] finance_waivers.deleted_at [PASS] [database] finance_penalties.deleted_at [PASS] [controllers] Finance controllers == 29 (29) [PASS] [controllers] Resolve BursariesController [PASS] [controllers] Resolve CourseFeesController [PASS] [controllers] Resolve CreditNotesController [PASS] [controllers] Resolve DebitNotesController [PASS] [controllers] Resolve DiscountsController [PASS] [controllers] Resolve FeeCategoriesController [PASS] [controllers] Resolve FeeHeadsController [PASS] [controllers] Resolve FeeStructuresController [PASS] [controllers] Resolve FeeTemplatesController [PASS] [controllers] Resolve FinanceAnalyticsController [PASS] [controllers] Resolve FinanceDashboardController [PASS] [controllers] Resolve FinanceReportsController [PASS] [controllers] Resolve FinanceSettingsController [PASS] [controllers] Resolve FinanceSponsorsController [PASS] [controllers] Resolve GatewayWebhooksController [PASS] [controllers] Resolve InvoicesController [PASS] [controllers] Resolve MinimumPaymentsController [PASS] [controllers] Resolve PaymentCheckoutController [PASS] [controllers] Resolve PaymentPlansController [PASS] [controllers] Resolve PaymentsController [PASS] [controllers] Resolve PenaltiesController [PASS] [controllers] Resolve ReceiptsController [PASS] [controllers] Resolve RefundsController [PASS] [controllers] Resolve ReleaseSessionResultsController [PASS] [controllers] Resolve ReleaseStudentResultsController [PASS] [controllers] Resolve ScholarshipsController [PASS] [controllers] Resolve StudentAccountsController [PASS] [controllers] Resolve StudentClearanceController [PASS] [controllers] Resolve WaiversController [PASS] [routes] Finance named routes >= 300 (375) [PASS] [routes] No duplicate finance route names [PASS] [routes] Webhook lenco registered [PASS] [routes] Webhook stripe registered [PASS] [routes] Route finance.dashboard [PASS] [routes] Route finance.settings.index [PASS] [routes] Route finance.fee-categories.index [PASS] [routes] Route finance.fee-heads.index [PASS] [routes] Route finance.fee-templates.index [PASS] [routes] Route finance.fee-setup.index [PASS] [routes] Route finance.course-fees.index [PASS] [routes] Route finance.discounts.index [PASS] [routes] Route finance.scholarships.index [PASS] [routes] Route finance.bursaries.index [PASS] [routes] Route finance.sponsors.index [PASS] [routes] Route finance.accounts.index [PASS] [routes] Route finance.invoices.index [PASS] [routes] Route finance.invoices.generate [PASS] [routes] Route finance.invoices.pdf [PASS] [routes] Route finance.payments.index [PASS] [routes] Route finance.payments.verify [PASS] [routes] Route finance.payments.allocate [PASS] [routes] Route finance.checkout.show [PASS] [routes] Route finance.receipts.index [PASS] [routes] Route finance.credit-notes.index [PASS] [routes] Route finance.debit-notes.index [PASS] [routes] Route finance.refunds.index [PASS] [routes] Route finance.payment-plans.index [PASS] [routes] Route finance.minimum-payments.index [PASS] [routes] Route finance.waivers.index [PASS] [routes] Route finance.penalties.index [PASS] [routes] Route finance.student-clearance.index [PASS] [routes] Route finance.release-student-results.index [PASS] [routes] Route finance.release-session-results.index [PASS] [routes] Route finance.reports.index [PASS] [routes] Route finance.analytics.index [PASS] [views] Finance blade views >= 80 (93) [PASS] [views] View finance.dashboard.index [PASS] [views] View finance.settings.index [PASS] [views] View finance.fee-categories.index [PASS] [views] View finance.fee-heads.index [PASS] [views] View finance.fee-templates.index [PASS] [views] View finance.fee-setup.index [PASS] [views] View finance.course-fees.index [PASS] [views] View finance.invoices.index [PASS] [views] View finance.invoices.show [PASS] [views] View finance.payments.index [PASS] [views] View finance.payments.checkout [PASS] [views] View finance.receipts.index [PASS] [views] View finance.student-clearance.index [PASS] [views] View finance.release-student-results.index [PASS] [views] View finance.release-session-results.index [PASS] [views] View finance.reports.index [PASS] [views] View finance.analytics.index [PASS] [models] FinanceSetting instantiates [PASS] [models] FinanceSetting has fillable [PASS] [models] FeeCategory instantiates [PASS] [models] FeeCategory has fillable [PASS] [models] FeeHead instantiates [PASS] [models] FeeHead has fillable [PASS] [models] FeeTemplate instantiates [PASS] [models] FeeTemplate has fillable [PASS] [models] FeeStructure instantiates [PASS] [models] FeeStructure has fillable [PASS] [models] CourseFee instantiates [PASS] [models] CourseFee has fillable [PASS] [models] Discount instantiates [PASS] [models] Discount has fillable [PASS] [models] Scholarship instantiates [PASS] [models] Scholarship has fillable [PASS] [models] Bursary instantiates [PASS] [models] Bursary has fillable [PASS] [models] FinanceSponsor instantiates [PASS] [models] FinanceSponsor has fillable [PASS] [models] StudentAccount instantiates [PASS] [models] StudentAccount has fillable [PASS] [models] FinanceInvoice instantiates [PASS] [models] FinanceInvoice has fillable [PASS] [models] FinanceInvoiceItem instantiates [PASS] [models] FinanceInvoiceItem has fillable [PASS] [models] FinancePayment instantiates [PASS] [models] FinancePayment has fillable [PASS] [models] FinancePaymentAllocation instantiates [PASS] [models] FinancePaymentAllocation has fillable [PASS] [models] FinanceReceipt instantiates [PASS] [models] FinanceReceipt has fillable [PASS] [models] FinanceCreditNote instantiates [PASS] [models] FinanceCreditNote has fillable [PASS] [models] FinanceDebitNote instantiates [PASS] [models] FinanceDebitNote has fillable [PASS] [models] FinanceRefund instantiates [PASS] [models] FinanceRefund has fillable [PASS] [models] PaymentPlan instantiates [PASS] [models] PaymentPlan has fillable [PASS] [models] PaymentPlanInstallment instantiates [PASS] [models] PaymentPlanInstallment has fillable [PASS] [models] MinimumPaymentRule instantiates [PASS] [models] MinimumPaymentRule has fillable [PASS] [models] StudentClearance instantiates [PASS] [models] StudentClearance has fillable [PASS] [models] ResultReleaseHold instantiates [PASS] [models] ResultReleaseHold has fillable [PASS] [models] PaymentTransaction instantiates [PASS] [models] PaymentTransaction has fillable [PASS] [models] PaymentWebhook instantiates [PASS] [models] PaymentWebhook has fillable [PASS] [models] FinanceWaiver instantiates [PASS] [models] FinanceWaiver has fillable [PASS] [models] FinancePenalty instantiates [PASS] [models] FinancePenalty has fillable [PASS] [models] StudentScholarship instantiates [PASS] [models] StudentScholarship has fillable [PASS] [models] FinanceLedgerEntry instantiates [PASS] [models] FinanceLedgerEntry has fillable [PASS] [services] InvoiceService resolves [PASS] [services] ReceiptService resolves [PASS] [services] FeeAssessmentService resolves [PASS] [services] ClearanceService resolves [PASS] [services] ResultReleaseService resolves [PASS] [services] RefundService resolves [PASS] [services] FinanceLedgerService resolves [PASS] [services] PaymentService resolves [PASS] [services] WebhookService resolves [PASS] [services] TransactionService resolves [PASS] [services] GatewayFactory resolves [PASS] [services] GatewayManager resolves [PASS] [gateways] Factory makes lenco (App\Services\Payments\Gateways\LencoPayGateway) [PASS] [gateways] Factory makes stripe (App\Services\Payments\Gateways\StripeGateway) [PASS] [gateways] Factory makes manual (App\Services\Payments\Gateways\ManualGateway) [PASS] [gateways] Factory makes null (App\Services\Payments\Gateways\NullGateway) [PASS] [gateways] LENCO_API_KEY in .env.example [PASS] [gateways] STRIPE_SECRET in .env.example [PASS] [gateways] config services.lenco exists [PASS] [gateways] config services.stripe exists [PASS] [gateways] Manual initiatePayment returns array [PASS] [auth] Super admin exists [PASS] [auth] Super admin password 1234 [PASS] [auth] Students exist (2) [PASS] [auth] Finance settings seeded (1) [PASS] [auth] Fee categories seeded (2) [PASS] [auth] Fee heads seeded (2) [PASS] [calculations] Invoice subtotal (1200.00) [PASS] [calculations] Invoice tax (0.00) [PASS] [calculations] Invoice total (1150.00) [PASS] [calculations] Invoice balance == total [PASS] [calculations] Invoice has items (2) [PASS] [calculations] Invoice number generated (INV-2026-000003) [PASS] [calculations] Invoice QR token [PASS] [workflow] Invoice issued (issued) [PASS] [workflow] Student account exists after invoice [PASS] [workflow] Ledger has invoice entry [PASS] [workflow] Payment created (PAY-2026-000001) [PASS] [workflow] Payment confirmed/paid (paid) [PASS] [workflow] Receipt exists (RCP-2026-000001) [PASS] [calculations] Receipt amount == payment (1150) [PASS] [calculations] Invoice balance after full payment (0.00) [PASS] [workflow] Payment allocation exists [PASS] [workflow] Account balance reduced after payment (before=10000 after=8850.00) [PASS] [workflow] Minimum payment rule exists (rule) [PASS] [workflow] Financial clearance evaluated (blocked) [PASS] [workflow] Result release canReleaseResults (eligible) [PASS] [workflow] E2E transaction rolled back (no DB pollution) [PASS] [rbac] Finance permissions configured >= 20 (22) [PASS] [rbac] Super admin can access finance [PASS] [security] CSRF except webhooks/lenco [PASS] [security] CSRF except webhooks/stripe [PASS] [security] Lenco uses config not hardcoded secret [PASS] [security] Stripe uses config not hardcoded secret [PASS] [security] Lenco validateWebhook present [PASS] [security] Stripe validateWebhook present [PASS] [integration] institutions table [PASS] [integration] students table [PASS] [integration] programmes table [PASS] [integration] Student has finance relations [PASS] [integration] Student eager-load finance relations [PASS] [rbac] Finance policies present >= 1 (22) === SUMMARY pass=257 fail=0 ===