Ви не можете вибрати більше 25 тем Теми мають розпочинатися з літери або цифри, можуть містити дефіси (-) і не повинні перевищувати 35 символів.

TrialBalanceReportTest.php 5.7KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167
  1. <?php
  2. use App\Facades\Accounting;
  3. use App\Facades\Reporting;
  4. use App\Factories\ReportDateFactory;
  5. use App\Filament\Company\Pages\Reports\TrialBalance;
  6. use App\Models\Accounting\Transaction;
  7. use function Pest\Livewire\livewire;
  8. it('correctly builds a standard trial balance report', function () {
  9. $testCompany = $this->testCompany;
  10. $reportDates = ReportDateFactory::create($testCompany);
  11. $defaultDateRange = $reportDates->defaultDateRange;
  12. $defaultStartDate = $reportDates->defaultStartDate->toImmutable();
  13. $defaultEndDate = $reportDates->defaultEndDate->toImmutable();
  14. $defaultReportType = 'standard';
  15. $depositAmount = 1000;
  16. $withdrawalAmount = 1000;
  17. $depositCount = 10;
  18. $withdrawalCount = 10;
  19. Transaction::factory()
  20. ->forDefaultBankAccount()
  21. ->forUncategorizedRevenue()
  22. ->asDeposit($depositAmount)
  23. ->count($depositCount)
  24. ->state([
  25. 'posted_at' => $defaultStartDate->subWeek(),
  26. ])
  27. ->create();
  28. Transaction::factory()
  29. ->forDefaultBankAccount()
  30. ->forUncategorizedExpense()
  31. ->asWithdrawal($withdrawalAmount)
  32. ->count($withdrawalCount)
  33. ->state([
  34. 'posted_at' => now()->subWeek(),
  35. ])
  36. ->create();
  37. $defaultBankAccountAccount = $testCompany->default->bankAccount->account;
  38. $earliestTransactionDate = $reportDates->refresh()->earliestTransactionDate;
  39. $expectedBalances = Accounting::getBalances(
  40. $defaultBankAccountAccount,
  41. $earliestTransactionDate->toDateString(),
  42. $defaultEndDate->toDateString(),
  43. );
  44. $calculatedTrialBalances = Reporting::calculateTrialBalances($defaultBankAccountAccount->category, $expectedBalances['ending_balance']);
  45. $formattedExpectedBalances = Reporting::formatBalances($calculatedTrialBalances);
  46. livewire(TrialBalance::class)
  47. ->assertFormSet([
  48. 'deferredFilters.reportType' => $defaultReportType,
  49. 'deferredFilters.dateRange' => $defaultDateRange,
  50. 'deferredFilters.asOfDate' => $defaultEndDate->toDateTimeString(),
  51. ])
  52. ->assertSet('filters', [
  53. 'reportType' => $defaultReportType,
  54. 'dateRange' => $defaultDateRange,
  55. 'asOfDate' => $defaultEndDate->toDateString(),
  56. ])
  57. ->call('applyFilters')
  58. ->assertDontSeeText('Retained Earnings')
  59. ->assertSeeTextInOrder([
  60. $defaultBankAccountAccount->name,
  61. $formattedExpectedBalances->debitBalance,
  62. $formattedExpectedBalances->creditBalance,
  63. ])
  64. ->assertReportTableData();
  65. });
  66. it('correctly builds a post-closing trial balance report', function () {
  67. $testCompany = $this->testCompany;
  68. $reportDates = ReportDateFactory::create($testCompany);
  69. $defaultDateRange = $reportDates->defaultDateRange;
  70. $defaultStartDate = $reportDates->defaultStartDate->toImmutable();
  71. $defaultEndDate = $reportDates->defaultEndDate->toImmutable();
  72. $defaultReportType = 'postClosing';
  73. $depositAmount = 2000;
  74. $withdrawalAmount = 1000;
  75. $depositCount = 5;
  76. $withdrawalCount = 5;
  77. Transaction::factory()
  78. ->forDefaultBankAccount()
  79. ->forUncategorizedRevenue()
  80. ->asDeposit($depositAmount)
  81. ->count($depositCount)
  82. ->state([
  83. 'posted_at' => $defaultStartDate->subWeek(),
  84. ])
  85. ->create();
  86. Transaction::factory()
  87. ->forDefaultBankAccount()
  88. ->forUncategorizedExpense()
  89. ->asWithdrawal($withdrawalAmount)
  90. ->count($withdrawalCount)
  91. ->state([
  92. 'posted_at' => now()->subWeek(),
  93. ])
  94. ->create();
  95. $defaultBankAccountAccount = $testCompany->default->bankAccount->account;
  96. $earliestTransactionDate = $reportDates->refresh()->earliestTransactionDate;
  97. $expectedBalances = Accounting::getBalances(
  98. $defaultBankAccountAccount,
  99. $earliestTransactionDate->toDateString(),
  100. $defaultEndDate->toDateString(),
  101. );
  102. $calculatedTrialBalances = Reporting::calculateTrialBalances($defaultBankAccountAccount->category, $expectedBalances['ending_balance']);
  103. $formattedExpectedBalances = Reporting::formatBalances($calculatedTrialBalances);
  104. $formattedRetainedEarningsBalances = Reporting::getRetainedEarningsBalances($earliestTransactionDate->toDateTimeString(), $defaultEndDate->toDateTimeString());
  105. // Use Livewire to assert the report's filters and displayed data
  106. livewire(TrialBalance::class)
  107. ->set('deferredFilters.reportType', $defaultReportType)
  108. ->assertFormSet([
  109. 'deferredFilters.reportType' => $defaultReportType,
  110. 'deferredFilters.dateRange' => $defaultDateRange,
  111. 'deferredFilters.asOfDate' => $defaultEndDate->toDateTimeString(),
  112. ])
  113. ->call('applyFilters')
  114. ->assertSet('filters', [
  115. 'reportType' => $defaultReportType,
  116. 'dateRange' => $defaultDateRange,
  117. 'asOfDate' => $defaultEndDate->toDateString(),
  118. ])
  119. ->assertSeeTextInOrder([
  120. $defaultBankAccountAccount->name,
  121. $formattedExpectedBalances->debitBalance,
  122. $formattedExpectedBalances->creditBalance,
  123. ])
  124. ->assertSeeText('Retained Earnings')
  125. ->assertSeeTextInOrder([
  126. 'RE',
  127. 'Retained Earnings',
  128. $formattedRetainedEarningsBalances->debitBalance,
  129. $formattedRetainedEarningsBalances->creditBalance,
  130. ])
  131. ->assertSeeTextInOrder([
  132. 'Total Revenue',
  133. '$0.00',
  134. '$0.00',
  135. ])
  136. ->assertSeeTextInOrder([
  137. 'Total Expenses',
  138. '$0.00',
  139. '$0.00',
  140. ])
  141. ->assertReportTableData();
  142. });