| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167 | <?php
use App\Facades\Accounting;
use App\Facades\Reporting;
use App\Factories\ReportDateFactory;
use App\Filament\Company\Pages\Reports\TrialBalance;
use App\Models\Accounting\Transaction;
use function Pest\Livewire\livewire;
it('correctly builds a standard trial balance report', function () {
    $testCompany = $this->testCompany;
    $reportDates = ReportDateFactory::create($testCompany);
    $defaultDateRange = $reportDates->defaultDateRange;
    $defaultStartDate = $reportDates->defaultStartDate->toImmutable();
    $defaultEndDate = $reportDates->defaultEndDate->toImmutable();
    $defaultReportType = 'standard';
    $depositAmount = 1000;
    $withdrawalAmount = 1000;
    $depositCount = 10;
    $withdrawalCount = 10;
    Transaction::factory()
        ->forDefaultBankAccount()
        ->forUncategorizedRevenue()
        ->asDeposit($depositAmount)
        ->count($depositCount)
        ->state([
            'posted_at' => $defaultStartDate->subWeek(),
        ])
        ->create();
    Transaction::factory()
        ->forDefaultBankAccount()
        ->forUncategorizedExpense()
        ->asWithdrawal($withdrawalAmount)
        ->count($withdrawalCount)
        ->state([
            'posted_at' => now()->subWeek(),
        ])
        ->create();
    $defaultBankAccountAccount = $testCompany->default->bankAccount->account;
    $earliestTransactionDate = $reportDates->refresh()->earliestTransactionDate;
    $expectedBalances = Accounting::getBalances(
        $defaultBankAccountAccount,
        $earliestTransactionDate->toDateString(),
        $defaultEndDate->toDateString(),
    );
    $calculatedTrialBalances = Reporting::calculateTrialBalances($defaultBankAccountAccount->category, $expectedBalances['ending_balance']);
    $formattedExpectedBalances = Reporting::formatBalances($calculatedTrialBalances);
    livewire(TrialBalance::class)
        ->assertFormSet([
            'deferredFilters.reportType' => $defaultReportType,
            'deferredFilters.dateRange' => $defaultDateRange,
            'deferredFilters.asOfDate' => $defaultEndDate->toDateString(),
        ])
        ->assertSet('filters', [
            'reportType' => $defaultReportType,
            'dateRange' => $defaultDateRange,
            'asOfDate' => $defaultEndDate->toDateString(),
        ])
        ->call('applyFilters')
        ->assertDontSeeText('Retained Earnings')
        ->assertSeeTextInOrder([
            $defaultBankAccountAccount->name,
            $formattedExpectedBalances->debitBalance,
            $formattedExpectedBalances->creditBalance,
        ])
        ->assertReportTableData();
});
it('correctly builds a post-closing trial balance report', function () {
    $testCompany = $this->testCompany;
    $reportDates = ReportDateFactory::create($testCompany);
    $defaultDateRange = $reportDates->defaultDateRange;
    $defaultStartDate = $reportDates->defaultStartDate->toImmutable();
    $defaultEndDate = $reportDates->defaultEndDate->toImmutable();
    $defaultReportType = 'postClosing';
    $depositAmount = 2000;
    $withdrawalAmount = 1000;
    $depositCount = 5;
    $withdrawalCount = 5;
    Transaction::factory()
        ->forDefaultBankAccount()
        ->forUncategorizedRevenue()
        ->asDeposit($depositAmount)
        ->count($depositCount)
        ->state([
            'posted_at' => $defaultStartDate->subWeek(),
        ])
        ->create();
    Transaction::factory()
        ->forDefaultBankAccount()
        ->forUncategorizedExpense()
        ->asWithdrawal($withdrawalAmount)
        ->count($withdrawalCount)
        ->state([
            'posted_at' => now()->subWeek(),
        ])
        ->create();
    $defaultBankAccountAccount = $testCompany->default->bankAccount->account;
    $earliestTransactionDate = $reportDates->refresh()->earliestTransactionDate;
    $expectedBalances = Accounting::getBalances(
        $defaultBankAccountAccount,
        $earliestTransactionDate->toDateString(),
        $defaultEndDate->toDateString(),
    );
    $calculatedTrialBalances = Reporting::calculateTrialBalances($defaultBankAccountAccount->category, $expectedBalances['ending_balance']);
    $formattedExpectedBalances = Reporting::formatBalances($calculatedTrialBalances);
    $formattedRetainedEarningsBalances = Reporting::getRetainedEarningsBalances($earliestTransactionDate->toDateString(), $defaultEndDate->toDateString());
    // Use Livewire to assert the report's filters and displayed data
    livewire(TrialBalance::class)
        ->set('deferredFilters.reportType', $defaultReportType)
        ->assertFormSet([
            'deferredFilters.reportType' => $defaultReportType,
            'deferredFilters.dateRange' => $defaultDateRange,
            'deferredFilters.asOfDate' => $defaultEndDate->toDateString(),
        ])
        ->call('applyFilters')
        ->assertSet('filters', [
            'reportType' => $defaultReportType,
            'dateRange' => $defaultDateRange,
            'asOfDate' => $defaultEndDate->toDateString(),
        ])
        ->assertSeeTextInOrder([
            $defaultBankAccountAccount->name,
            $formattedExpectedBalances->debitBalance,
            $formattedExpectedBalances->creditBalance,
        ])
        ->assertSeeText('Retained Earnings')
        ->assertSeeTextInOrder([
            'RE',
            'Retained Earnings',
            $formattedRetainedEarningsBalances->debitBalance,
            $formattedRetainedEarningsBalances->creditBalance,
        ])
        ->assertSeeTextInOrder([
            'Total Revenue',
            '$0.00',
            '$0.00',
        ])
        ->assertSeeTextInOrder([
            'Total Expenses',
            '$0.00',
            '$0.00',
        ])
        ->assertReportTableData();
});
 |