Andrew Wallo 1 year ago
parent
commit
de40b94505

+ 0
- 1
app/Facades/Accounting.php View File

15
  * @method static Money|null getEndingBalance(Account $account, string $startDate, string $endDate)
15
  * @method static Money|null getEndingBalance(Account $account, string $startDate, string $endDate)
16
  * @method static array getBalances(Account $account, string $startDate, string $endDate)
16
  * @method static array getBalances(Account $account, string $startDate, string $endDate)
17
  * @method static Money getTotalBalanceForAllBankAccounts(string $startDate, string $endDate)
17
  * @method static Money getTotalBalanceForAllBankAccounts(string $startDate, string $endDate)
18
- * @method static array getAccountCategoryOrder()
19
  * @method static string getEarliestTransactionDate()
18
  * @method static string getEarliestTransactionDate()
20
  *
19
  *
21
  * @see AccountHandler
20
  * @see AccountHandler

+ 3
- 1
app/Filament/Company/Pages/Reports/AccountTransactions.php View File

90
                 Cluster::make([
90
                 Cluster::make([
91
                     $this->getStartDateFormComponent(),
91
                     $this->getStartDateFormComponent(),
92
                     $this->getEndDateFormComponent(),
92
                     $this->getEndDateFormComponent(),
93
-                ])->label("\u{200B}"), // its too bad hiddenLabel removes spacing of the label
93
+                ])->extraFieldWrapperAttributes([
94
+                    'class' => 'report-hidden-label',
95
+                ]),
94
                 Actions::make([
96
                 Actions::make([
95
                     Actions\Action::make('applyFilters')
97
                     Actions\Action::make('applyFilters')
96
                         ->label('Update Report')
98
                         ->label('Update Report')

+ 76
- 11
app/Filament/Company/Pages/Reports/BaseReportPage.php View File

12
 use App\Support\Column;
12
 use App\Support\Column;
13
 use Filament\Actions\Action;
13
 use Filament\Actions\Action;
14
 use Filament\Actions\ActionGroup;
14
 use Filament\Actions\ActionGroup;
15
-use Filament\Forms\Components\Component;
16
 use Filament\Forms\Components\DatePicker;
15
 use Filament\Forms\Components\DatePicker;
17
 use Filament\Forms\Set;
16
 use Filament\Forms\Set;
18
 use Filament\Pages\Page;
17
 use Filament\Pages\Page;
19
 use Filament\Support\Enums\IconPosition;
18
 use Filament\Support\Enums\IconPosition;
20
 use Filament\Support\Enums\IconSize;
19
 use Filament\Support\Enums\IconSize;
20
+use Illuminate\Support\Arr;
21
 use Illuminate\Support\Carbon;
21
 use Illuminate\Support\Carbon;
22
 use Livewire\Attributes\Computed;
22
 use Livewire\Attributes\Computed;
23
 use Symfony\Component\HttpFoundation\StreamedResponse;
23
 use Symfony\Component\HttpFoundation\StreamedResponse;
64
 
64
 
65
     protected function loadDefaultDateRange(): void
65
     protected function loadDefaultDateRange(): void
66
     {
66
     {
67
-        $startDate = $this->getFilterState('startDate');
68
-        $endDate = $this->getFilterState('endDate');
67
+        $flatFields = $this->getFiltersForm()->getFlatFields();
69
 
68
 
70
-        if ($this->isValidDate($startDate) && $this->isValidDate($endDate)) {
71
-            $matchingDateRange = app(DateRangeService::class)->getMatchingDateRangeOption(Carbon::parse($startDate), Carbon::parse($endDate));
72
-            $this->setFilterState('dateRange', $matchingDateRange);
73
-        } else {
69
+        $dateRangeField = Arr::first($flatFields, static fn ($field) => $field instanceof DateRangeSelect);
70
+
71
+        if (! $dateRangeField) {
72
+            return;
73
+        }
74
+
75
+        $startDateField = $dateRangeField->getStartDateField();
76
+        $endDateField = $dateRangeField->getEndDateField();
77
+
78
+        $startDate = $startDateField ? $this->getFilterState($startDateField) : null;
79
+        $endDate = $endDateField ? $this->getFilterState($endDateField) : null;
80
+
81
+        $startDateCarbon = $this->isValidDate($startDate) ? Carbon::parse($startDate) : null;
82
+        $endDateCarbon = $this->isValidDate($endDate) ? Carbon::parse($endDate) : null;
83
+
84
+        if ($startDateCarbon && $endDateCarbon) {
85
+            $this->setMatchingDateRange($startDateCarbon, $endDateCarbon);
86
+
87
+            return;
88
+        }
89
+
90
+        if ($endDateCarbon && ! $startDateField) {
91
+            $this->setAsOfDateRange($endDateCarbon);
92
+
93
+            return;
94
+        }
95
+
96
+        if ($endDateField && ! $startDateField) {
97
+            $this->setFilterState('dateRange', $this->getDefaultDateRange());
98
+            $defaultEndDate = Carbon::parse($this->fiscalYearEndDate);
99
+            $this->setFilterState($endDateField, $defaultEndDate->isFuture() ? now()->endOfDay()->toDateTimeString() : $defaultEndDate->endOfDay()->toDateTimeString());
100
+
101
+            return;
102
+        }
103
+
104
+        if ($startDateField && $endDateField) {
74
             $this->setFilterState('dateRange', $this->getDefaultDateRange());
105
             $this->setFilterState('dateRange', $this->getDefaultDateRange());
75
-            $this->setDateRange(Carbon::parse($this->fiscalYearStartDate), Carbon::parse($this->fiscalYearEndDate));
106
+            $defaultStartDate = Carbon::parse($this->fiscalYearStartDate);
107
+            $defaultEndDate = Carbon::parse($this->fiscalYearEndDate);
108
+            $this->setDateRange($defaultStartDate, $defaultEndDate);
76
         }
109
         }
77
     }
110
     }
78
 
111
 
112
+    protected function setMatchingDateRange($startDate, $endDate): void
113
+    {
114
+        $matchingDateRange = app(DateRangeService::class)->getMatchingDateRangeOption($startDate, $endDate);
115
+        $this->setFilterState('dateRange', $matchingDateRange);
116
+    }
117
+
118
+    protected function setAsOfDateRange($endDate): void
119
+    {
120
+        $fiscalYearStart = Carbon::parse($this->fiscalYearStartDate);
121
+        $asOfStartDate = $endDate->copy()->setMonth($fiscalYearStart->month)->setDay($fiscalYearStart->day);
122
+
123
+        $this->setMatchingDateRange($asOfStartDate, $endDate);
124
+    }
125
+
79
     public function loadReportData(): void
126
     public function loadReportData(): void
80
     {
127
     {
81
         unset($this->report);
128
         unset($this->report);
117
         return Carbon::parse($this->getFilterState('endDate'))->endOfDay()->toDateTimeString();
164
         return Carbon::parse($this->getFilterState('endDate'))->endOfDay()->toDateTimeString();
118
     }
165
     }
119
 
166
 
167
+    public function getFormattedAsOfDate(): string
168
+    {
169
+        return Carbon::parse($this->getFilterState('asOfDate'))->endOfDay()->toDateTimeString();
170
+    }
171
+
120
     protected function getHeaderActions(): array
172
     protected function getHeaderActions(): array
121
     {
173
     {
122
         return [
174
         return [
139
         ];
191
         ];
140
     }
192
     }
141
 
193
 
142
-    protected function getDateRangeFormComponent(): Component
194
+    protected function getDateRangeFormComponent(): DateRangeSelect
143
     {
195
     {
144
         return DateRangeSelect::make('dateRange')
196
         return DateRangeSelect::make('dateRange')
145
             ->label('Date Range')
197
             ->label('Date Range')
148
             ->endDateField('endDate');
200
             ->endDateField('endDate');
149
     }
201
     }
150
 
202
 
151
-    protected function getStartDateFormComponent(): Component
203
+    protected function getStartDateFormComponent(): DatePicker
152
     {
204
     {
153
         return DatePicker::make('startDate')
205
         return DatePicker::make('startDate')
154
             ->label('Start Date')
206
             ->label('Start Date')
158
             });
210
             });
159
     }
211
     }
160
 
212
 
161
-    protected function getEndDateFormComponent(): Component
213
+    protected function getEndDateFormComponent(): DatePicker
162
     {
214
     {
163
         return DatePicker::make('endDate')
215
         return DatePicker::make('endDate')
164
             ->label('End Date')
216
             ->label('End Date')
167
                 $set('dateRange', 'Custom');
219
                 $set('dateRange', 'Custom');
168
             });
220
             });
169
     }
221
     }
222
+
223
+    protected function getAsOfDateFormComponent(): DatePicker
224
+    {
225
+        return DatePicker::make('asOfDate')
226
+            ->label('As of Date')
227
+            ->live()
228
+            ->afterStateUpdated(static function (Set $set) {
229
+                $set('dateRange', 'Custom');
230
+            })
231
+            ->extraFieldWrapperAttributes([
232
+                'class' => 'report-hidden-label',
233
+            ]);
234
+    }
170
 }
235
 }

+ 24
- 10
app/Filament/Company/Pages/Reports/TrialBalance.php View File

4
 
4
 
5
 use App\Contracts\ExportableReport;
5
 use App\Contracts\ExportableReport;
6
 use App\DTO\ReportDTO;
6
 use App\DTO\ReportDTO;
7
+use App\Filament\Forms\Components\DateRangeSelect;
7
 use App\Services\ExportService;
8
 use App\Services\ExportService;
8
 use App\Services\ReportService;
9
 use App\Services\ReportService;
9
 use App\Support\Column;
10
 use App\Support\Column;
10
 use App\Transformers\TrialBalanceReportTransformer;
11
 use App\Transformers\TrialBalanceReportTransformer;
12
+use Filament\Forms\Components\Select;
11
 use Filament\Forms\Form;
13
 use Filament\Forms\Form;
12
 use Filament\Support\Enums\Alignment;
14
 use Filament\Support\Enums\Alignment;
13
-use Guava\FilamentClusters\Forms\Cluster;
14
 use Symfony\Component\HttpFoundation\StreamedResponse;
15
 use Symfony\Component\HttpFoundation\StreamedResponse;
15
 
16
 
16
 class TrialBalance extends BaseReportPage
17
 class TrialBalance extends BaseReportPage
17
 {
18
 {
18
-    protected static string $view = 'filament.company.pages.reports.detailed-report';
19
+    protected static string $view = 'filament.company.pages.reports.trial-balance';
19
 
20
 
20
     protected static ?string $slug = 'reports/trial-balance';
21
     protected static ?string $slug = 'reports/trial-balance';
21
 
22
 
31
         $this->exportService = $exportService;
32
         $this->exportService = $exportService;
32
     }
33
     }
33
 
34
 
35
+    protected function initializeDefaultFilters(): void
36
+    {
37
+        if (empty($this->getFilterState('trialBalanceType'))) {
38
+            $this->setFilterState('trialBalanceType', 'regular');
39
+        }
40
+    }
41
+
34
     public function getTable(): array
42
     public function getTable(): array
35
     {
43
     {
36
         return [
44
         return [
53
     public function filtersForm(Form $form): Form
61
     public function filtersForm(Form $form): Form
54
     {
62
     {
55
         return $form
63
         return $form
56
-            ->inlineLabel()
57
-            ->columns()
64
+            ->columns(4)
58
             ->schema([
65
             ->schema([
59
-                $this->getDateRangeFormComponent(),
60
-                Cluster::make([
61
-                    $this->getStartDateFormComponent(),
62
-                    $this->getEndDateFormComponent(),
63
-                ])->hiddenLabel(),
66
+                Select::make('trialBalanceType')
67
+                    ->label('Trial Balance Type')
68
+                    ->options([
69
+                        'regular' => 'Regular',
70
+                        'postClosing' => 'Post-Closing',
71
+                    ])
72
+                    ->selectablePlaceholder(false),
73
+                DateRangeSelect::make('dateRange')
74
+                    ->label('As of Date')
75
+                    ->selectablePlaceholder(false)
76
+                    ->endDateField('asOfDate'),
77
+                $this->getAsOfDateFormComponent(),
64
             ]);
78
             ]);
65
     }
79
     }
66
 
80
 
67
     protected function buildReport(array $columns): ReportDTO
81
     protected function buildReport(array $columns): ReportDTO
68
     {
82
     {
69
-        return $this->reportService->buildTrialBalanceReport($this->getFormattedStartDate(), $this->getFormattedEndDate(), $columns);
83
+        return $this->reportService->buildTrialBalanceReport($this->getFilterState('trialBalanceType'), $this->getFormattedAsOfDate(), $columns);
70
     }
84
     }
71
 
85
 
72
     protected function getTransformer(ReportDTO $reportDTO): ExportableReport
86
     protected function getTransformer(ReportDTO $reportDTO): ExportableReport

+ 25
- 7
app/Filament/Forms/Components/DateRangeSelect.php View File

28
         $this->options(app(DateRangeService::class)->getDateRangeOptions())
28
         $this->options(app(DateRangeService::class)->getDateRangeOptions())
29
             ->live()
29
             ->live()
30
             ->afterStateUpdated(function ($state, Set $set) {
30
             ->afterStateUpdated(function ($state, Set $set) {
31
-                if ($this->startDateField && $this->endDateField) {
32
-                    $this->updateDateRange($state, $set);
33
-                }
31
+                $this->updateDateRange($state, $set);
34
             });
32
             });
35
     }
33
     }
36
 
34
 
48
         return $this;
46
         return $this;
49
     }
47
     }
50
 
48
 
49
+    public function getStartDateField(): ?string
50
+    {
51
+        return $this->startDateField;
52
+    }
53
+
54
+    public function getEndDateField(): ?string
55
+    {
56
+        return $this->endDateField;
57
+    }
58
+
51
     public function updateDateRange($state, Set $set): void
59
     public function updateDateRange($state, Set $set): void
52
     {
60
     {
53
         if ($state === null) {
61
         if ($state === null) {
54
-            $set($this->startDateField, null);
55
-            $set($this->endDateField, null);
62
+            if ($this->startDateField) {
63
+                $set($this->startDateField, null);
64
+            }
65
+
66
+            if ($this->endDateField) {
67
+                $set($this->endDateField, null);
68
+            }
56
 
69
 
57
             return;
70
             return;
58
         }
71
         }
116
 
129
 
117
     public function setDateRange(Carbon $start, Carbon $end, Set $set): void
130
     public function setDateRange(Carbon $start, Carbon $end, Set $set): void
118
     {
131
     {
119
-        $set($this->startDateField, $start->startOfDay()->toDateTimeString());
120
-        $set($this->endDateField, $end->isFuture() ? now()->endOfDay()->toDateTimeString() : $end->endOfDay()->toDateTimeString());
132
+        if ($this->startDateField) {
133
+            $set($this->startDateField, $start->startOfDay()->toDateTimeString());
134
+        }
135
+
136
+        if ($this->endDateField) {
137
+            $set($this->endDateField, $end->isFuture() ? now()->endOfDay()->toDateTimeString() : $end->endOfDay()->toDateTimeString());
138
+        }
121
     }
139
     }
122
 }
140
 }

+ 75
- 101
app/Services/AccountService.php View File

5
 use App\Contracts\AccountHandler;
5
 use App\Contracts\AccountHandler;
6
 use App\Enums\Accounting\AccountCategory;
6
 use App\Enums\Accounting\AccountCategory;
7
 use App\Models\Accounting\Account;
7
 use App\Models\Accounting\Account;
8
-use App\Models\Accounting\JournalEntry;
9
 use App\Models\Accounting\Transaction;
8
 use App\Models\Accounting\Transaction;
10
 use App\Repositories\Accounting\JournalEntryRepository;
9
 use App\Repositories\Accounting\JournalEntryRepository;
11
 use App\Utilities\Currency\CurrencyAccessor;
10
 use App\Utilities\Currency\CurrencyAccessor;
53
         return new Money($balances['starting_balance'], $account->currency_code);
52
         return new Money($balances['starting_balance'], $account->currency_code);
54
     }
53
     }
55
 
54
 
55
+    public function getEndingBalance(Account $account, string $startDate, string $endDate): ?Money
56
+    {
57
+        $calculatedBalances = $this->calculateBalances($account, $startDate, $endDate);
58
+        $startingBalances = $this->calculateStartingBalances($account, $startDate);
59
+
60
+        $netMovement = $calculatedBalances['net_movement'];
61
+
62
+        if (in_array($account->category, [AccountCategory::Expense, AccountCategory::Revenue], true)) {
63
+            return new Money($netMovement, $account->currency_code);
64
+        }
65
+
66
+        $endingBalance = $startingBalances['starting_balance'] + $netMovement;
67
+
68
+        return new Money($endingBalance, $account->currency_code);
69
+    }
70
+
71
+    private function calculateNetMovementByCategory(AccountCategory $category, int $debitBalance, int $creditBalance): int
72
+    {
73
+        return match ($category) {
74
+            AccountCategory::Asset, AccountCategory::Expense => $debitBalance - $creditBalance,
75
+            AccountCategory::Liability, AccountCategory::Equity, AccountCategory::Revenue => $creditBalance - $debitBalance,
76
+        };
77
+    }
78
+
79
+    private function calculateBalances(Account $account, string $startDate, string $endDate): array
80
+    {
81
+        $debitBalance = $this->journalEntryRepository->sumDebitAmounts($account, $startDate, $endDate);
82
+        $creditBalance = $this->journalEntryRepository->sumCreditAmounts($account, $startDate, $endDate);
83
+
84
+        return [
85
+            'debit_balance' => $debitBalance,
86
+            'credit_balance' => $creditBalance,
87
+            'net_movement' => $this->calculateNetMovementByCategory($account->category, $debitBalance, $creditBalance),
88
+        ];
89
+    }
90
+
91
+    private function calculateStartingBalances(Account $account, string $startDate): array
92
+    {
93
+        $debitBalanceBefore = $this->journalEntryRepository->sumDebitAmounts($account, $startDate);
94
+        $creditBalanceBefore = $this->journalEntryRepository->sumCreditAmounts($account, $startDate);
95
+
96
+        return [
97
+            'debit_balance_before' => $debitBalanceBefore,
98
+            'credit_balance_before' => $creditBalanceBefore,
99
+            'starting_balance' => $this->calculateNetMovementByCategory($account->category, $debitBalanceBefore, $creditBalanceBefore),
100
+        ];
101
+    }
102
+
103
+    public function getBalances(Account $account, string $startDate, string $endDate, array $fields): array
104
+    {
105
+        $balances = [];
106
+        $calculatedBalances = $this->calculateBalances($account, $startDate, $endDate);
107
+
108
+        // Calculate starting balances only if needed
109
+        $startingBalances = null;
110
+        $needStartingBalances = ! in_array($account->category, [AccountCategory::Expense, AccountCategory::Revenue], true)
111
+                                && (in_array('starting_balance', $fields) || in_array('ending_balance', $fields));
112
+
113
+        if ($needStartingBalances) {
114
+            $startingBalances = $this->calculateStartingBalances($account, $startDate);
115
+        }
116
+
117
+        foreach ($fields as $field) {
118
+            $balances[$field] = match ($field) {
119
+                'debit_balance', 'credit_balance', 'net_movement' => $calculatedBalances[$field],
120
+                'starting_balance' => $needStartingBalances ? $startingBalances['starting_balance'] : null,
121
+                'ending_balance' => $needStartingBalances ? $startingBalances['starting_balance'] + $calculatedBalances['net_movement'] : null,
122
+                default => null,
123
+            };
124
+        }
125
+
126
+        return array_filter($balances, static fn ($value) => $value !== null);
127
+    }
128
+
56
     public function getTransactionDetailsSubquery(string $startDate, string $endDate): Closure
129
     public function getTransactionDetailsSubquery(string $startDate, string $endDate): Closure
57
     {
130
     {
58
         return static function ($query) use ($startDate, $endDate) {
131
         return static function ($query) use ($startDate, $endDate) {
165
         return new Money($totalBalance, CurrencyAccessor::getDefaultCurrency());
238
         return new Money($totalBalance, CurrencyAccessor::getDefaultCurrency());
166
     }
239
     }
167
 
240
 
168
-    public function getEndingBalance(Account $account, string $startDate, string $endDate): ?Money
169
-    {
170
-        $calculatedBalances = $this->calculateBalances($account, $startDate, $endDate);
171
-        $startingBalances = $this->calculateStartingBalances($account, $startDate);
172
-
173
-        $netMovement = $calculatedBalances['net_movement'];
174
-
175
-        if (in_array($account->category, [AccountCategory::Expense, AccountCategory::Revenue], true)) {
176
-            return new Money($netMovement, $account->currency_code);
177
-        }
178
-
179
-        $endingBalance = $startingBalances['starting_balance'] + $netMovement;
180
-
181
-        return new Money($endingBalance, $account->currency_code);
182
-    }
183
-
184
-    public function getRetainedEarnings(string $startDate): Money
185
-    {
186
-        $revenue = JournalEntry::whereHas('account', static function ($query) {
187
-            $query->where('category', AccountCategory::Revenue);
188
-        })
189
-            ->where('type', 'credit')
190
-            ->whereHas('transaction', static function ($query) use ($startDate) {
191
-                $query->where('posted_at', '<', $startDate);
192
-            })
193
-            ->sum('amount');
194
-
195
-        $expense = JournalEntry::whereHas('account', static function ($query) {
196
-            $query->where('category', AccountCategory::Expense);
197
-        })
198
-            ->where('type', 'debit')
199
-            ->whereHas('transaction', static function ($query) use ($startDate) {
200
-                $query->where('posted_at', '<', $startDate);
201
-            })
202
-            ->sum('amount');
203
-
204
-        $retainedEarnings = $revenue - $expense;
205
-
206
-        return new Money($retainedEarnings, CurrencyAccessor::getDefaultCurrency());
207
-    }
208
-
209
-    private function calculateNetMovementByCategory(AccountCategory $category, int $debitBalance, int $creditBalance): int
210
-    {
211
-        return match ($category) {
212
-            AccountCategory::Asset, AccountCategory::Expense => $debitBalance - $creditBalance,
213
-            AccountCategory::Liability, AccountCategory::Equity, AccountCategory::Revenue => $creditBalance - $debitBalance,
214
-        };
215
-    }
216
-
217
-    private function calculateBalances(Account $account, string $startDate, string $endDate): array
218
-    {
219
-        $debitBalance = $this->journalEntryRepository->sumDebitAmounts($account, $startDate, $endDate);
220
-        $creditBalance = $this->journalEntryRepository->sumCreditAmounts($account, $startDate, $endDate);
221
-
222
-        return [
223
-            'debit_balance' => $debitBalance,
224
-            'credit_balance' => $creditBalance,
225
-            'net_movement' => $this->calculateNetMovementByCategory($account->category, $debitBalance, $creditBalance),
226
-        ];
227
-    }
228
-
229
-    private function calculateStartingBalances(Account $account, string $startDate): array
230
-    {
231
-        $debitBalanceBefore = $this->journalEntryRepository->sumDebitAmounts($account, $startDate);
232
-        $creditBalanceBefore = $this->journalEntryRepository->sumCreditAmounts($account, $startDate);
233
-
234
-        return [
235
-            'debit_balance_before' => $debitBalanceBefore,
236
-            'credit_balance_before' => $creditBalanceBefore,
237
-            'starting_balance' => $this->calculateNetMovementByCategory($account->category, $debitBalanceBefore, $creditBalanceBefore),
238
-        ];
239
-    }
240
-
241
-    public function getBalances(Account $account, string $startDate, string $endDate, array $fields): array
242
-    {
243
-        $balances = [];
244
-        $calculatedBalances = $this->calculateBalances($account, $startDate, $endDate);
245
-
246
-        // Calculate starting balances only if needed
247
-        $startingBalances = null;
248
-        $needStartingBalances = ! in_array($account->category, [AccountCategory::Expense, AccountCategory::Revenue], true)
249
-                                && (in_array('starting_balance', $fields) || in_array('ending_balance', $fields));
250
-
251
-        if ($needStartingBalances) {
252
-            $startingBalances = $this->calculateStartingBalances($account, $startDate);
253
-        }
254
-
255
-        foreach ($fields as $field) {
256
-            $balances[$field] = match ($field) {
257
-                'debit_balance', 'credit_balance', 'net_movement' => $calculatedBalances[$field],
258
-                'starting_balance' => $needStartingBalances ? $startingBalances['starting_balance'] : null,
259
-                'ending_balance' => $needStartingBalances ? $startingBalances['starting_balance'] + $calculatedBalances['net_movement'] : null,
260
-                default => null,
261
-            };
262
-        }
263
-
264
-        return array_filter($balances, static fn ($value) => $value !== null);
265
-    }
266
-
267
     public function getEarliestTransactionDate(): string
241
     public function getEarliestTransactionDate(): string
268
     {
242
     {
269
         $earliestDate = Transaction::oldest('posted_at')
243
         $earliestDate = Transaction::oldest('posted_at')
270
             ->value('posted_at');
244
             ->value('posted_at');
271
 
245
 
272
-        return $earliestDate ?? now()->format('Y-m-d');
246
+        return $earliestDate ?? now()->toDateString();
273
     }
247
     }
274
 }
248
 }

+ 20
- 17
app/Services/ReportService.php View File

12
 use App\Support\Column;
12
 use App\Support\Column;
13
 use App\Utilities\Currency\CurrencyAccessor;
13
 use App\Utilities\Currency\CurrencyAccessor;
14
 use App\ValueObjects\Money;
14
 use App\ValueObjects\Money;
15
+use Illuminate\Database\Eloquent\Builder;
15
 use Illuminate\Support\Carbon;
16
 use Illuminate\Support\Carbon;
16
 
17
 
17
 class ReportService
18
 class ReportService
116
         return $balances;
117
         return $balances;
117
     }
118
     }
118
 
119
 
119
-    public function calculateRetainedEarnings(string $startDate): Money
120
+    public function calculateRetainedEarnings(?string $startDate, string $endDate): Money
120
     {
121
     {
121
-        $modifiedStartDate = Carbon::parse($this->accountService->getEarliestTransactionDate())->startOfYear()->toDateTimeString();
122
-        $endDate = Carbon::parse($startDate)->subYear()->endOfYear()->toDateTimeString();
122
+        $startDate ??= Carbon::parse($this->accountService->getEarliestTransactionDate())->toDateTimeString();
123
+        $revenueAccounts = $this->accountService->getAccountBalances($startDate, $endDate)->where('category', AccountCategory::Revenue)->get();
123
 
124
 
124
-        $revenueAccounts = $this->accountService->getAccountBalances($modifiedStartDate, $endDate)->where('category', AccountCategory::Revenue)->get();
125
-
126
-        $expenseAccounts = $this->accountService->getAccountBalances($modifiedStartDate, $endDate)->where('category', AccountCategory::Expense)->get();
125
+        $expenseAccounts = $this->accountService->getAccountBalances($startDate, $endDate)->where('category', AccountCategory::Expense)->get();
127
 
126
 
128
         $revenueTotal = 0;
127
         $revenueTotal = 0;
129
         $expenseTotal = 0;
128
         $expenseTotal = 0;
230
         return new ReportDTO(categories: $reportCategories, fields: $columns);
229
         return new ReportDTO(categories: $reportCategories, fields: $columns);
231
     }
230
     }
232
 
231
 
233
-    public function buildTrialBalanceReport(string $startDate, string $endDate, array $columns = []): ReportDTO
232
+    public function buildTrialBalanceReport(string $trialBalanceType, string $asOfDate, array $columns = []): ReportDTO
234
     {
233
     {
234
+        $asOfDateCarbon = Carbon::parse($asOfDate);
235
+        $startDateCarbon = Carbon::parse($this->accountService->getEarliestTransactionDate());
236
+
235
         $orderedCategories = AccountCategory::getOrderedCategories();
237
         $orderedCategories = AccountCategory::getOrderedCategories();
236
 
238
 
237
-        $accounts = $this->accountService->getAccountBalances($startDate, $endDate)->get();
239
+        $isPostClosingTrialBalance = $trialBalanceType === 'postClosing';
240
+
241
+        $accounts = $this->accountService->getAccountBalances($startDateCarbon->toDateTimeString(), $asOfDateCarbon->toDateTimeString())
242
+            ->when($isPostClosingTrialBalance, fn (Builder $query) => $query->whereNotIn('category', [AccountCategory::Revenue, AccountCategory::Expense]))
243
+            ->get();
238
 
244
 
239
         $balanceFields = ['debit_balance', 'credit_balance'];
245
         $balanceFields = ['debit_balance', 'credit_balance'];
240
 
246
 
268
                     $account->code,
274
                     $account->code,
269
                     $account->id,
275
                     $account->id,
270
                     $formattedAccountBalances,
276
                     $formattedAccountBalances,
271
-                    Carbon::parse($startDate)->toDateString(),
272
-                    Carbon::parse($endDate)->toDateString(),
277
+                    startDate: $startDateCarbon->toDateString(),
278
+                    endDate: $asOfDateCarbon->toDateString(),
273
                 );
279
                 );
274
             }
280
             }
275
 
281
 
276
-            if ($category === AccountCategory::Equity) {
277
-                $modifiedStartDate = Carbon::parse($this->accountService->getEarliestTransactionDate())->startOfYear()->toDateString();
278
-                $modifiedEndDate = Carbon::parse($startDate)->subYear()->endOfYear()->toDateString();
279
-
280
-                $retainedEarningsAmount = $this->calculateRetainedEarnings($startDate)->getAmount();
282
+            if ($category === AccountCategory::Equity && $isPostClosingTrialBalance) {
283
+                $retainedEarningsAmount = $this->calculateRetainedEarnings($startDateCarbon->toDateTimeString(), $asOfDateCarbon->toDateTimeString())->getAmount();
281
                 $isCredit = $retainedEarningsAmount >= 0;
284
                 $isCredit = $retainedEarningsAmount >= 0;
282
 
285
 
283
                 $categorySummaryBalances[$isCredit ? 'credit_balance' : 'debit_balance'] += abs($retainedEarningsAmount);
286
                 $categorySummaryBalances[$isCredit ? 'credit_balance' : 'debit_balance'] += abs($retainedEarningsAmount);
290
                         'debit_balance' => $isCredit ? 0 : abs($retainedEarningsAmount),
293
                         'debit_balance' => $isCredit ? 0 : abs($retainedEarningsAmount),
291
                         'credit_balance' => $isCredit ? $retainedEarningsAmount : 0,
294
                         'credit_balance' => $isCredit ? $retainedEarningsAmount : 0,
292
                     ]),
295
                     ]),
293
-                    $modifiedStartDate,
294
-                    $modifiedEndDate,
296
+                    startDate: $startDateCarbon->toDateString(),
297
+                    endDate: $asOfDateCarbon->toDateString(),
295
                 );
298
                 );
296
             }
299
             }
297
 
300
 

+ 63
- 61
composer.lock View File

497
         },
497
         },
498
         {
498
         {
499
             "name": "aws/aws-sdk-php",
499
             "name": "aws/aws-sdk-php",
500
-            "version": "3.321.8",
500
+            "version": "3.321.11",
501
             "source": {
501
             "source": {
502
                 "type": "git",
502
                 "type": "git",
503
                 "url": "https://github.com/aws/aws-sdk-php.git",
503
                 "url": "https://github.com/aws/aws-sdk-php.git",
504
-                "reference": "df456658bdc2ad84a00cf35a7b5af874fdcc7a53"
504
+                "reference": "bbd357d246350ffcd0dd8df30951d2d46c5ddadb"
505
             },
505
             },
506
             "dist": {
506
             "dist": {
507
                 "type": "zip",
507
                 "type": "zip",
508
-                "url": "https://api.github.com/repos/aws/aws-sdk-php/zipball/df456658bdc2ad84a00cf35a7b5af874fdcc7a53",
509
-                "reference": "df456658bdc2ad84a00cf35a7b5af874fdcc7a53",
508
+                "url": "https://api.github.com/repos/aws/aws-sdk-php/zipball/bbd357d246350ffcd0dd8df30951d2d46c5ddadb",
509
+                "reference": "bbd357d246350ffcd0dd8df30951d2d46c5ddadb",
510
                 "shasum": ""
510
                 "shasum": ""
511
             },
511
             },
512
             "require": {
512
             "require": {
589
             "support": {
589
             "support": {
590
                 "forum": "https://forums.aws.amazon.com/forum.jspa?forumID=80",
590
                 "forum": "https://forums.aws.amazon.com/forum.jspa?forumID=80",
591
                 "issues": "https://github.com/aws/aws-sdk-php/issues",
591
                 "issues": "https://github.com/aws/aws-sdk-php/issues",
592
-                "source": "https://github.com/aws/aws-sdk-php/tree/3.321.8"
592
+                "source": "https://github.com/aws/aws-sdk-php/tree/3.321.11"
593
             },
593
             },
594
-            "time": "2024-09-10T18:18:03+00:00"
594
+            "time": "2024-09-13T18:05:10+00:00"
595
         },
595
         },
596
         {
596
         {
597
             "name": "aws/aws-sdk-php-laravel",
597
             "name": "aws/aws-sdk-php-laravel",
1738
         },
1738
         },
1739
         {
1739
         {
1740
             "name": "filament/actions",
1740
             "name": "filament/actions",
1741
-            "version": "v3.2.110",
1741
+            "version": "v3.2.112",
1742
             "source": {
1742
             "source": {
1743
                 "type": "git",
1743
                 "type": "git",
1744
                 "url": "https://github.com/filamentphp/actions.git",
1744
                 "url": "https://github.com/filamentphp/actions.git",
1745
-                "reference": "5d6e4fe444f1ef04d373518248a445bbcc3ca272"
1745
+                "reference": "df3310607b49dad302b03516c558c93cb82c5164"
1746
             },
1746
             },
1747
             "dist": {
1747
             "dist": {
1748
                 "type": "zip",
1748
                 "type": "zip",
1749
-                "url": "https://api.github.com/repos/filamentphp/actions/zipball/5d6e4fe444f1ef04d373518248a445bbcc3ca272",
1750
-                "reference": "5d6e4fe444f1ef04d373518248a445bbcc3ca272",
1749
+                "url": "https://api.github.com/repos/filamentphp/actions/zipball/df3310607b49dad302b03516c558c93cb82c5164",
1750
+                "reference": "df3310607b49dad302b03516c558c93cb82c5164",
1751
                 "shasum": ""
1751
                 "shasum": ""
1752
             },
1752
             },
1753
             "require": {
1753
             "require": {
1787
                 "issues": "https://github.com/filamentphp/filament/issues",
1787
                 "issues": "https://github.com/filamentphp/filament/issues",
1788
                 "source": "https://github.com/filamentphp/filament"
1788
                 "source": "https://github.com/filamentphp/filament"
1789
             },
1789
             },
1790
-            "time": "2024-08-26T07:22:35+00:00"
1790
+            "time": "2024-09-11T08:25:31+00:00"
1791
         },
1791
         },
1792
         {
1792
         {
1793
             "name": "filament/filament",
1793
             "name": "filament/filament",
1794
-            "version": "v3.2.110",
1794
+            "version": "v3.2.112",
1795
             "source": {
1795
             "source": {
1796
                 "type": "git",
1796
                 "type": "git",
1797
                 "url": "https://github.com/filamentphp/panels.git",
1797
                 "url": "https://github.com/filamentphp/panels.git",
1798
-                "reference": "130636e90e821154e0ce60dcbc7b358d2a1a716f"
1798
+                "reference": "86aa182deceedce5970560c60ceae30c2c40632d"
1799
             },
1799
             },
1800
             "dist": {
1800
             "dist": {
1801
                 "type": "zip",
1801
                 "type": "zip",
1802
-                "url": "https://api.github.com/repos/filamentphp/panels/zipball/130636e90e821154e0ce60dcbc7b358d2a1a716f",
1803
-                "reference": "130636e90e821154e0ce60dcbc7b358d2a1a716f",
1802
+                "url": "https://api.github.com/repos/filamentphp/panels/zipball/86aa182deceedce5970560c60ceae30c2c40632d",
1803
+                "reference": "86aa182deceedce5970560c60ceae30c2c40632d",
1804
                 "shasum": ""
1804
                 "shasum": ""
1805
             },
1805
             },
1806
             "require": {
1806
             "require": {
1852
                 "issues": "https://github.com/filamentphp/filament/issues",
1852
                 "issues": "https://github.com/filamentphp/filament/issues",
1853
                 "source": "https://github.com/filamentphp/filament"
1853
                 "source": "https://github.com/filamentphp/filament"
1854
             },
1854
             },
1855
-            "time": "2024-08-30T01:52:09+00:00"
1855
+            "time": "2024-09-11T08:25:51+00:00"
1856
         },
1856
         },
1857
         {
1857
         {
1858
             "name": "filament/forms",
1858
             "name": "filament/forms",
1859
-            "version": "v3.2.110",
1859
+            "version": "v3.2.112",
1860
             "source": {
1860
             "source": {
1861
                 "type": "git",
1861
                 "type": "git",
1862
                 "url": "https://github.com/filamentphp/forms.git",
1862
                 "url": "https://github.com/filamentphp/forms.git",
1863
-                "reference": "02fe2e211993f6291b719a093ed6f63e17125e9a"
1863
+                "reference": "99d72777f1e6dc5d42d936e7deb53148e4233ec3"
1864
             },
1864
             },
1865
             "dist": {
1865
             "dist": {
1866
                 "type": "zip",
1866
                 "type": "zip",
1867
-                "url": "https://api.github.com/repos/filamentphp/forms/zipball/02fe2e211993f6291b719a093ed6f63e17125e9a",
1868
-                "reference": "02fe2e211993f6291b719a093ed6f63e17125e9a",
1867
+                "url": "https://api.github.com/repos/filamentphp/forms/zipball/99d72777f1e6dc5d42d936e7deb53148e4233ec3",
1868
+                "reference": "99d72777f1e6dc5d42d936e7deb53148e4233ec3",
1869
                 "shasum": ""
1869
                 "shasum": ""
1870
             },
1870
             },
1871
             "require": {
1871
             "require": {
1908
                 "issues": "https://github.com/filamentphp/filament/issues",
1908
                 "issues": "https://github.com/filamentphp/filament/issues",
1909
                 "source": "https://github.com/filamentphp/filament"
1909
                 "source": "https://github.com/filamentphp/filament"
1910
             },
1910
             },
1911
-            "time": "2024-08-30T18:04:06+00:00"
1911
+            "time": "2024-09-12T12:27:13+00:00"
1912
         },
1912
         },
1913
         {
1913
         {
1914
             "name": "filament/infolists",
1914
             "name": "filament/infolists",
1915
-            "version": "v3.2.110",
1915
+            "version": "v3.2.112",
1916
             "source": {
1916
             "source": {
1917
                 "type": "git",
1917
                 "type": "git",
1918
                 "url": "https://github.com/filamentphp/infolists.git",
1918
                 "url": "https://github.com/filamentphp/infolists.git",
1919
-                "reference": "96403f2842e4c485f32110e4456b7a3bbcb1e835"
1919
+                "reference": "e50bd9a5fc623320bd79508e3bfb72ff9e309edf"
1920
             },
1920
             },
1921
             "dist": {
1921
             "dist": {
1922
                 "type": "zip",
1922
                 "type": "zip",
1923
-                "url": "https://api.github.com/repos/filamentphp/infolists/zipball/96403f2842e4c485f32110e4456b7a3bbcb1e835",
1924
-                "reference": "96403f2842e4c485f32110e4456b7a3bbcb1e835",
1923
+                "url": "https://api.github.com/repos/filamentphp/infolists/zipball/e50bd9a5fc623320bd79508e3bfb72ff9e309edf",
1924
+                "reference": "e50bd9a5fc623320bd79508e3bfb72ff9e309edf",
1925
                 "shasum": ""
1925
                 "shasum": ""
1926
             },
1926
             },
1927
             "require": {
1927
             "require": {
1959
                 "issues": "https://github.com/filamentphp/filament/issues",
1959
                 "issues": "https://github.com/filamentphp/filament/issues",
1960
                 "source": "https://github.com/filamentphp/filament"
1960
                 "source": "https://github.com/filamentphp/filament"
1961
             },
1961
             },
1962
-            "time": "2024-08-14T16:52:44+00:00"
1962
+            "time": "2024-09-11T08:25:25+00:00"
1963
         },
1963
         },
1964
         {
1964
         {
1965
             "name": "filament/notifications",
1965
             "name": "filament/notifications",
1966
-            "version": "v3.2.110",
1966
+            "version": "v3.2.112",
1967
             "source": {
1967
             "source": {
1968
                 "type": "git",
1968
                 "type": "git",
1969
                 "url": "https://github.com/filamentphp/notifications.git",
1969
                 "url": "https://github.com/filamentphp/notifications.git",
2015
         },
2015
         },
2016
         {
2016
         {
2017
             "name": "filament/support",
2017
             "name": "filament/support",
2018
-            "version": "v3.2.110",
2018
+            "version": "v3.2.112",
2019
             "source": {
2019
             "source": {
2020
                 "type": "git",
2020
                 "type": "git",
2021
                 "url": "https://github.com/filamentphp/support.git",
2021
                 "url": "https://github.com/filamentphp/support.git",
2022
-                "reference": "78e25428c754fcbb30c321d5dda439c760de9837"
2022
+                "reference": "d07086506d39f318398c13a0b8d689f75cbc14d6"
2023
             },
2023
             },
2024
             "dist": {
2024
             "dist": {
2025
                 "type": "zip",
2025
                 "type": "zip",
2026
-                "url": "https://api.github.com/repos/filamentphp/support/zipball/78e25428c754fcbb30c321d5dda439c760de9837",
2027
-                "reference": "78e25428c754fcbb30c321d5dda439c760de9837",
2026
+                "url": "https://api.github.com/repos/filamentphp/support/zipball/d07086506d39f318398c13a0b8d689f75cbc14d6",
2027
+                "reference": "d07086506d39f318398c13a0b8d689f75cbc14d6",
2028
                 "shasum": ""
2028
                 "shasum": ""
2029
             },
2029
             },
2030
             "require": {
2030
             "require": {
2070
                 "issues": "https://github.com/filamentphp/filament/issues",
2070
                 "issues": "https://github.com/filamentphp/filament/issues",
2071
                 "source": "https://github.com/filamentphp/filament"
2071
                 "source": "https://github.com/filamentphp/filament"
2072
             },
2072
             },
2073
-            "time": "2024-08-26T07:22:57+00:00"
2073
+            "time": "2024-09-11T08:25:46+00:00"
2074
         },
2074
         },
2075
         {
2075
         {
2076
             "name": "filament/tables",
2076
             "name": "filament/tables",
2077
-            "version": "v3.2.110",
2077
+            "version": "v3.2.112",
2078
             "source": {
2078
             "source": {
2079
                 "type": "git",
2079
                 "type": "git",
2080
                 "url": "https://github.com/filamentphp/tables.git",
2080
                 "url": "https://github.com/filamentphp/tables.git",
2081
-                "reference": "129943d1b4e6c1edeef53e804eb56ef78a932a6c"
2081
+                "reference": "4285a031dd36250a86710631a5b1fea1372097a1"
2082
             },
2082
             },
2083
             "dist": {
2083
             "dist": {
2084
                 "type": "zip",
2084
                 "type": "zip",
2085
-                "url": "https://api.github.com/repos/filamentphp/tables/zipball/129943d1b4e6c1edeef53e804eb56ef78a932a6c",
2086
-                "reference": "129943d1b4e6c1edeef53e804eb56ef78a932a6c",
2085
+                "url": "https://api.github.com/repos/filamentphp/tables/zipball/4285a031dd36250a86710631a5b1fea1372097a1",
2086
+                "reference": "4285a031dd36250a86710631a5b1fea1372097a1",
2087
                 "shasum": ""
2087
                 "shasum": ""
2088
             },
2088
             },
2089
             "require": {
2089
             "require": {
2122
                 "issues": "https://github.com/filamentphp/filament/issues",
2122
                 "issues": "https://github.com/filamentphp/filament/issues",
2123
                 "source": "https://github.com/filamentphp/filament"
2123
                 "source": "https://github.com/filamentphp/filament"
2124
             },
2124
             },
2125
-            "time": "2024-08-30T01:52:14+00:00"
2125
+            "time": "2024-09-11T08:25:43+00:00"
2126
         },
2126
         },
2127
         {
2127
         {
2128
             "name": "filament/widgets",
2128
             "name": "filament/widgets",
2129
-            "version": "v3.2.110",
2129
+            "version": "v3.2.112",
2130
             "source": {
2130
             "source": {
2131
                 "type": "git",
2131
                 "type": "git",
2132
                 "url": "https://github.com/filamentphp/widgets.git",
2132
                 "url": "https://github.com/filamentphp/widgets.git",
2981
         },
2981
         },
2982
         {
2982
         {
2983
             "name": "laravel/framework",
2983
             "name": "laravel/framework",
2984
-            "version": "v11.22.0",
2984
+            "version": "v11.23.5",
2985
             "source": {
2985
             "source": {
2986
                 "type": "git",
2986
                 "type": "git",
2987
                 "url": "https://github.com/laravel/framework.git",
2987
                 "url": "https://github.com/laravel/framework.git",
2988
-                "reference": "868c75beacc47d0f361b919bbc155c0b619bf3d5"
2988
+                "reference": "16b31ab0e1dad5cb2ed6dcc1818c02f02fc48453"
2989
             },
2989
             },
2990
             "dist": {
2990
             "dist": {
2991
                 "type": "zip",
2991
                 "type": "zip",
2992
-                "url": "https://api.github.com/repos/laravel/framework/zipball/868c75beacc47d0f361b919bbc155c0b619bf3d5",
2993
-                "reference": "868c75beacc47d0f361b919bbc155c0b619bf3d5",
2992
+                "url": "https://api.github.com/repos/laravel/framework/zipball/16b31ab0e1dad5cb2ed6dcc1818c02f02fc48453",
2993
+                "reference": "16b31ab0e1dad5cb2ed6dcc1818c02f02fc48453",
2994
                 "shasum": ""
2994
                 "shasum": ""
2995
             },
2995
             },
2996
             "require": {
2996
             "require": {
3052
                 "illuminate/bus": "self.version",
3052
                 "illuminate/bus": "self.version",
3053
                 "illuminate/cache": "self.version",
3053
                 "illuminate/cache": "self.version",
3054
                 "illuminate/collections": "self.version",
3054
                 "illuminate/collections": "self.version",
3055
+                "illuminate/concurrency": "self.version",
3055
                 "illuminate/conditionable": "self.version",
3056
                 "illuminate/conditionable": "self.version",
3056
                 "illuminate/config": "self.version",
3057
                 "illuminate/config": "self.version",
3057
                 "illuminate/console": "self.version",
3058
                 "illuminate/console": "self.version",
3094
                 "league/flysystem-sftp-v3": "^3.0",
3095
                 "league/flysystem-sftp-v3": "^3.0",
3095
                 "mockery/mockery": "^1.6",
3096
                 "mockery/mockery": "^1.6",
3096
                 "nyholm/psr7": "^1.2",
3097
                 "nyholm/psr7": "^1.2",
3097
-                "orchestra/testbench-core": "^9.1.5",
3098
+                "orchestra/testbench-core": "^9.4.0",
3098
                 "pda/pheanstalk": "^5.0",
3099
                 "pda/pheanstalk": "^5.0",
3099
                 "phpstan/phpstan": "^1.11.5",
3100
                 "phpstan/phpstan": "^1.11.5",
3100
                 "phpunit/phpunit": "^10.5|^11.0",
3101
                 "phpunit/phpunit": "^10.5|^11.0",
3152
                     "src/Illuminate/Events/functions.php",
3153
                     "src/Illuminate/Events/functions.php",
3153
                     "src/Illuminate/Filesystem/functions.php",
3154
                     "src/Illuminate/Filesystem/functions.php",
3154
                     "src/Illuminate/Foundation/helpers.php",
3155
                     "src/Illuminate/Foundation/helpers.php",
3156
+                    "src/Illuminate/Log/functions.php",
3155
                     "src/Illuminate/Support/helpers.php"
3157
                     "src/Illuminate/Support/helpers.php"
3156
                 ],
3158
                 ],
3157
                 "psr-4": {
3159
                 "psr-4": {
3183
                 "issues": "https://github.com/laravel/framework/issues",
3185
                 "issues": "https://github.com/laravel/framework/issues",
3184
                 "source": "https://github.com/laravel/framework"
3186
                 "source": "https://github.com/laravel/framework"
3185
             },
3187
             },
3186
-            "time": "2024-09-03T15:27:15+00:00"
3188
+            "time": "2024-09-13T13:36:30+00:00"
3187
         },
3189
         },
3188
         {
3190
         {
3189
             "name": "laravel/prompts",
3191
             "name": "laravel/prompts",
5810
         },
5812
         },
5811
         {
5813
         {
5812
             "name": "psr/log",
5814
             "name": "psr/log",
5813
-            "version": "3.0.1",
5815
+            "version": "3.0.2",
5814
             "source": {
5816
             "source": {
5815
                 "type": "git",
5817
                 "type": "git",
5816
                 "url": "https://github.com/php-fig/log.git",
5818
                 "url": "https://github.com/php-fig/log.git",
5817
-                "reference": "79dff0b268932c640297f5208d6298f71855c03e"
5819
+                "reference": "f16e1d5863e37f8d8c2a01719f5b34baa2b714d3"
5818
             },
5820
             },
5819
             "dist": {
5821
             "dist": {
5820
                 "type": "zip",
5822
                 "type": "zip",
5821
-                "url": "https://api.github.com/repos/php-fig/log/zipball/79dff0b268932c640297f5208d6298f71855c03e",
5822
-                "reference": "79dff0b268932c640297f5208d6298f71855c03e",
5823
+                "url": "https://api.github.com/repos/php-fig/log/zipball/f16e1d5863e37f8d8c2a01719f5b34baa2b714d3",
5824
+                "reference": "f16e1d5863e37f8d8c2a01719f5b34baa2b714d3",
5823
                 "shasum": ""
5825
                 "shasum": ""
5824
             },
5826
             },
5825
             "require": {
5827
             "require": {
5854
                 "psr-3"
5856
                 "psr-3"
5855
             ],
5857
             ],
5856
             "support": {
5858
             "support": {
5857
-                "source": "https://github.com/php-fig/log/tree/3.0.1"
5859
+                "source": "https://github.com/php-fig/log/tree/3.0.2"
5858
             },
5860
             },
5859
-            "time": "2024-08-21T13:31:24+00:00"
5861
+            "time": "2024-09-11T13:17:53+00:00"
5860
         },
5862
         },
5861
         {
5863
         {
5862
             "name": "psr/simple-cache",
5864
             "name": "psr/simple-cache",
9480
         },
9482
         },
9481
         {
9483
         {
9482
             "name": "laravel/sail",
9484
             "name": "laravel/sail",
9483
-            "version": "v1.31.3",
9485
+            "version": "v1.32.0",
9484
             "source": {
9486
             "source": {
9485
                 "type": "git",
9487
                 "type": "git",
9486
                 "url": "https://github.com/laravel/sail.git",
9488
                 "url": "https://github.com/laravel/sail.git",
9487
-                "reference": "0a7e2891a85eba2d448a9ffc6fc5ce367e924bc1"
9489
+                "reference": "4a7e41d280861ca7e35710cea011a07669b4003b"
9488
             },
9490
             },
9489
             "dist": {
9491
             "dist": {
9490
                 "type": "zip",
9492
                 "type": "zip",
9491
-                "url": "https://api.github.com/repos/laravel/sail/zipball/0a7e2891a85eba2d448a9ffc6fc5ce367e924bc1",
9492
-                "reference": "0a7e2891a85eba2d448a9ffc6fc5ce367e924bc1",
9493
+                "url": "https://api.github.com/repos/laravel/sail/zipball/4a7e41d280861ca7e35710cea011a07669b4003b",
9494
+                "reference": "4a7e41d280861ca7e35710cea011a07669b4003b",
9493
                 "shasum": ""
9495
                 "shasum": ""
9494
             },
9496
             },
9495
             "require": {
9497
             "require": {
9539
                 "issues": "https://github.com/laravel/sail/issues",
9541
                 "issues": "https://github.com/laravel/sail/issues",
9540
                 "source": "https://github.com/laravel/sail"
9542
                 "source": "https://github.com/laravel/sail"
9541
             },
9543
             },
9542
-            "time": "2024-09-03T20:05:33+00:00"
9544
+            "time": "2024-09-11T20:14:29+00:00"
9543
         },
9545
         },
9544
         {
9546
         {
9545
             "name": "mockery/mockery",
9547
             "name": "mockery/mockery",
10408
         },
10410
         },
10409
         {
10411
         {
10410
             "name": "phpunit/phpunit",
10412
             "name": "phpunit/phpunit",
10411
-            "version": "10.5.33",
10413
+            "version": "10.5.34",
10412
             "source": {
10414
             "source": {
10413
                 "type": "git",
10415
                 "type": "git",
10414
                 "url": "https://github.com/sebastianbergmann/phpunit.git",
10416
                 "url": "https://github.com/sebastianbergmann/phpunit.git",
10415
-                "reference": "4def7a9cda75af9c2bc179ed53a8e41313e7f7cf"
10417
+                "reference": "3c69d315bdf79080c8e115b69d1961c6905b0e18"
10416
             },
10418
             },
10417
             "dist": {
10419
             "dist": {
10418
                 "type": "zip",
10420
                 "type": "zip",
10419
-                "url": "https://api.github.com/repos/sebastianbergmann/phpunit/zipball/4def7a9cda75af9c2bc179ed53a8e41313e7f7cf",
10420
-                "reference": "4def7a9cda75af9c2bc179ed53a8e41313e7f7cf",
10421
+                "url": "https://api.github.com/repos/sebastianbergmann/phpunit/zipball/3c69d315bdf79080c8e115b69d1961c6905b0e18",
10422
+                "reference": "3c69d315bdf79080c8e115b69d1961c6905b0e18",
10421
                 "shasum": ""
10423
                 "shasum": ""
10422
             },
10424
             },
10423
             "require": {
10425
             "require": {
10489
             "support": {
10491
             "support": {
10490
                 "issues": "https://github.com/sebastianbergmann/phpunit/issues",
10492
                 "issues": "https://github.com/sebastianbergmann/phpunit/issues",
10491
                 "security": "https://github.com/sebastianbergmann/phpunit/security/policy",
10493
                 "security": "https://github.com/sebastianbergmann/phpunit/security/policy",
10492
-                "source": "https://github.com/sebastianbergmann/phpunit/tree/10.5.33"
10494
+                "source": "https://github.com/sebastianbergmann/phpunit/tree/10.5.34"
10493
             },
10495
             },
10494
             "funding": [
10496
             "funding": [
10495
                 {
10497
                 {
10505
                     "type": "tidelift"
10507
                     "type": "tidelift"
10506
                 }
10508
                 }
10507
             ],
10509
             ],
10508
-            "time": "2024-09-09T06:06:56+00:00"
10510
+            "time": "2024-09-13T05:19:38+00:00"
10509
         },
10511
         },
10510
         {
10512
         {
10511
             "name": "rector/rector",
10513
             "name": "rector/rector",

+ 81
- 81
package-lock.json View File

541
             }
541
             }
542
         },
542
         },
543
         "node_modules/@rollup/rollup-android-arm-eabi": {
543
         "node_modules/@rollup/rollup-android-arm-eabi": {
544
-            "version": "4.21.2",
545
-            "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.21.2.tgz",
546
-            "integrity": "sha512-fSuPrt0ZO8uXeS+xP3b+yYTCBUd05MoSp2N/MFOgjhhUhMmchXlpTQrTpI8T+YAwAQuK7MafsCOxW7VrPMrJcg==",
544
+            "version": "4.21.3",
545
+            "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.21.3.tgz",
546
+            "integrity": "sha512-MmKSfaB9GX+zXl6E8z4koOr/xU63AMVleLEa64v7R0QF/ZloMs5vcD1sHgM64GXXS1csaJutG+ddtzcueI/BLg==",
547
             "cpu": [
547
             "cpu": [
548
                 "arm"
548
                 "arm"
549
             ],
549
             ],
555
             ]
555
             ]
556
         },
556
         },
557
         "node_modules/@rollup/rollup-android-arm64": {
557
         "node_modules/@rollup/rollup-android-arm64": {
558
-            "version": "4.21.2",
559
-            "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.21.2.tgz",
560
-            "integrity": "sha512-xGU5ZQmPlsjQS6tzTTGwMsnKUtu0WVbl0hYpTPauvbRAnmIvpInhJtgjj3mcuJpEiuUw4v1s4BimkdfDWlh7gA==",
558
+            "version": "4.21.3",
559
+            "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.21.3.tgz",
560
+            "integrity": "sha512-zrt8ecH07PE3sB4jPOggweBjJMzI1JG5xI2DIsUbkA+7K+Gkjys6eV7i9pOenNSDJH3eOr/jLb/PzqtmdwDq5g==",
561
             "cpu": [
561
             "cpu": [
562
                 "arm64"
562
                 "arm64"
563
             ],
563
             ],
569
             ]
569
             ]
570
         },
570
         },
571
         "node_modules/@rollup/rollup-darwin-arm64": {
571
         "node_modules/@rollup/rollup-darwin-arm64": {
572
-            "version": "4.21.2",
573
-            "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.21.2.tgz",
574
-            "integrity": "sha512-99AhQ3/ZMxU7jw34Sq8brzXqWH/bMnf7ZVhvLk9QU2cOepbQSVTns6qoErJmSiAvU3InRqC2RRZ5ovh1KN0d0Q==",
572
+            "version": "4.21.3",
573
+            "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.21.3.tgz",
574
+            "integrity": "sha512-P0UxIOrKNBFTQaXTxOH4RxuEBVCgEA5UTNV6Yz7z9QHnUJ7eLX9reOd/NYMO3+XZO2cco19mXTxDMXxit4R/eQ==",
575
             "cpu": [
575
             "cpu": [
576
                 "arm64"
576
                 "arm64"
577
             ],
577
             ],
583
             ]
583
             ]
584
         },
584
         },
585
         "node_modules/@rollup/rollup-darwin-x64": {
585
         "node_modules/@rollup/rollup-darwin-x64": {
586
-            "version": "4.21.2",
587
-            "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.21.2.tgz",
588
-            "integrity": "sha512-ZbRaUvw2iN/y37x6dY50D8m2BnDbBjlnMPotDi/qITMJ4sIxNY33HArjikDyakhSv0+ybdUxhWxE6kTI4oX26w==",
586
+            "version": "4.21.3",
587
+            "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.21.3.tgz",
588
+            "integrity": "sha512-L1M0vKGO5ASKntqtsFEjTq/fD91vAqnzeaF6sfNAy55aD+Hi2pBI5DKwCO+UNDQHWsDViJLqshxOahXyLSh3EA==",
589
             "cpu": [
589
             "cpu": [
590
                 "x64"
590
                 "x64"
591
             ],
591
             ],
597
             ]
597
             ]
598
         },
598
         },
599
         "node_modules/@rollup/rollup-linux-arm-gnueabihf": {
599
         "node_modules/@rollup/rollup-linux-arm-gnueabihf": {
600
-            "version": "4.21.2",
601
-            "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.21.2.tgz",
602
-            "integrity": "sha512-ztRJJMiE8nnU1YFcdbd9BcH6bGWG1z+jP+IPW2oDUAPxPjo9dverIOyXz76m6IPA6udEL12reYeLojzW2cYL7w==",
600
+            "version": "4.21.3",
601
+            "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.21.3.tgz",
602
+            "integrity": "sha512-btVgIsCjuYFKUjopPoWiDqmoUXQDiW2A4C3Mtmp5vACm7/GnyuprqIDPNczeyR5W8rTXEbkmrJux7cJmD99D2g==",
603
             "cpu": [
603
             "cpu": [
604
                 "arm"
604
                 "arm"
605
             ],
605
             ],
611
             ]
611
             ]
612
         },
612
         },
613
         "node_modules/@rollup/rollup-linux-arm-musleabihf": {
613
         "node_modules/@rollup/rollup-linux-arm-musleabihf": {
614
-            "version": "4.21.2",
615
-            "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-musleabihf/-/rollup-linux-arm-musleabihf-4.21.2.tgz",
616
-            "integrity": "sha512-flOcGHDZajGKYpLV0JNc0VFH361M7rnV1ee+NTeC/BQQ1/0pllYcFmxpagltANYt8FYf9+kL6RSk80Ziwyhr7w==",
614
+            "version": "4.21.3",
615
+            "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-musleabihf/-/rollup-linux-arm-musleabihf-4.21.3.tgz",
616
+            "integrity": "sha512-zmjbSphplZlau6ZTkxd3+NMtE4UKVy7U4aVFMmHcgO5CUbw17ZP6QCgyxhzGaU/wFFdTfiojjbLG3/0p9HhAqA==",
617
             "cpu": [
617
             "cpu": [
618
                 "arm"
618
                 "arm"
619
             ],
619
             ],
625
             ]
625
             ]
626
         },
626
         },
627
         "node_modules/@rollup/rollup-linux-arm64-gnu": {
627
         "node_modules/@rollup/rollup-linux-arm64-gnu": {
628
-            "version": "4.21.2",
629
-            "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.21.2.tgz",
630
-            "integrity": "sha512-69CF19Kp3TdMopyteO/LJbWufOzqqXzkrv4L2sP8kfMaAQ6iwky7NoXTp7bD6/irKgknDKM0P9E/1l5XxVQAhw==",
628
+            "version": "4.21.3",
629
+            "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.21.3.tgz",
630
+            "integrity": "sha512-nSZfcZtAnQPRZmUkUQwZq2OjQciR6tEoJaZVFvLHsj0MF6QhNMg0fQ6mUOsiCUpTqxTx0/O6gX0V/nYc7LrgPw==",
631
             "cpu": [
631
             "cpu": [
632
                 "arm64"
632
                 "arm64"
633
             ],
633
             ],
639
             ]
639
             ]
640
         },
640
         },
641
         "node_modules/@rollup/rollup-linux-arm64-musl": {
641
         "node_modules/@rollup/rollup-linux-arm64-musl": {
642
-            "version": "4.21.2",
643
-            "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.21.2.tgz",
644
-            "integrity": "sha512-48pD/fJkTiHAZTnZwR0VzHrao70/4MlzJrq0ZsILjLW/Ab/1XlVUStYyGt7tdyIiVSlGZbnliqmult/QGA2O2w==",
642
+            "version": "4.21.3",
643
+            "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.21.3.tgz",
644
+            "integrity": "sha512-MnvSPGO8KJXIMGlQDYfvYS3IosFN2rKsvxRpPO2l2cum+Z3exiExLwVU+GExL96pn8IP+GdH8Tz70EpBhO0sIQ==",
645
             "cpu": [
645
             "cpu": [
646
                 "arm64"
646
                 "arm64"
647
             ],
647
             ],
653
             ]
653
             ]
654
         },
654
         },
655
         "node_modules/@rollup/rollup-linux-powerpc64le-gnu": {
655
         "node_modules/@rollup/rollup-linux-powerpc64le-gnu": {
656
-            "version": "4.21.2",
657
-            "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-powerpc64le-gnu/-/rollup-linux-powerpc64le-gnu-4.21.2.tgz",
658
-            "integrity": "sha512-cZdyuInj0ofc7mAQpKcPR2a2iu4YM4FQfuUzCVA2u4HI95lCwzjoPtdWjdpDKyHxI0UO82bLDoOaLfpZ/wviyQ==",
656
+            "version": "4.21.3",
657
+            "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-powerpc64le-gnu/-/rollup-linux-powerpc64le-gnu-4.21.3.tgz",
658
+            "integrity": "sha512-+W+p/9QNDr2vE2AXU0qIy0qQE75E8RTwTwgqS2G5CRQ11vzq0tbnfBd6brWhS9bCRjAjepJe2fvvkvS3dno+iw==",
659
             "cpu": [
659
             "cpu": [
660
                 "ppc64"
660
                 "ppc64"
661
             ],
661
             ],
667
             ]
667
             ]
668
         },
668
         },
669
         "node_modules/@rollup/rollup-linux-riscv64-gnu": {
669
         "node_modules/@rollup/rollup-linux-riscv64-gnu": {
670
-            "version": "4.21.2",
671
-            "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.21.2.tgz",
672
-            "integrity": "sha512-RL56JMT6NwQ0lXIQmMIWr1SW28z4E4pOhRRNqwWZeXpRlykRIlEpSWdsgNWJbYBEWD84eocjSGDu/XxbYeCmwg==",
670
+            "version": "4.21.3",
671
+            "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.21.3.tgz",
672
+            "integrity": "sha512-yXH6K6KfqGXaxHrtr+Uoy+JpNlUlI46BKVyonGiaD74ravdnF9BUNC+vV+SIuB96hUMGShhKV693rF9QDfO6nQ==",
673
             "cpu": [
673
             "cpu": [
674
                 "riscv64"
674
                 "riscv64"
675
             ],
675
             ],
681
             ]
681
             ]
682
         },
682
         },
683
         "node_modules/@rollup/rollup-linux-s390x-gnu": {
683
         "node_modules/@rollup/rollup-linux-s390x-gnu": {
684
-            "version": "4.21.2",
685
-            "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-s390x-gnu/-/rollup-linux-s390x-gnu-4.21.2.tgz",
686
-            "integrity": "sha512-PMxkrWS9z38bCr3rWvDFVGD6sFeZJw4iQlhrup7ReGmfn7Oukrr/zweLhYX6v2/8J6Cep9IEA/SmjXjCmSbrMQ==",
684
+            "version": "4.21.3",
685
+            "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-s390x-gnu/-/rollup-linux-s390x-gnu-4.21.3.tgz",
686
+            "integrity": "sha512-R8cwY9wcnApN/KDYWTH4gV/ypvy9yZUHlbJvfaiXSB48JO3KpwSpjOGqO4jnGkLDSk1hgjYkTbTt6Q7uvPf8eg==",
687
             "cpu": [
687
             "cpu": [
688
                 "s390x"
688
                 "s390x"
689
             ],
689
             ],
695
             ]
695
             ]
696
         },
696
         },
697
         "node_modules/@rollup/rollup-linux-x64-gnu": {
697
         "node_modules/@rollup/rollup-linux-x64-gnu": {
698
-            "version": "4.21.2",
699
-            "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.21.2.tgz",
700
-            "integrity": "sha512-B90tYAUoLhU22olrafY3JQCFLnT3NglazdwkHyxNDYF/zAxJt5fJUB/yBoWFoIQ7SQj+KLe3iL4BhOMa9fzgpw==",
698
+            "version": "4.21.3",
699
+            "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.21.3.tgz",
700
+            "integrity": "sha512-kZPbX/NOPh0vhS5sI+dR8L1bU2cSO9FgxwM8r7wHzGydzfSjLRCFAT87GR5U9scj2rhzN3JPYVC7NoBbl4FZ0g==",
701
             "cpu": [
701
             "cpu": [
702
                 "x64"
702
                 "x64"
703
             ],
703
             ],
709
             ]
709
             ]
710
         },
710
         },
711
         "node_modules/@rollup/rollup-linux-x64-musl": {
711
         "node_modules/@rollup/rollup-linux-x64-musl": {
712
-            "version": "4.21.2",
713
-            "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.21.2.tgz",
714
-            "integrity": "sha512-7twFizNXudESmC9oneLGIUmoHiiLppz/Xs5uJQ4ShvE6234K0VB1/aJYU3f/4g7PhssLGKBVCC37uRkkOi8wjg==",
712
+            "version": "4.21.3",
713
+            "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.21.3.tgz",
714
+            "integrity": "sha512-S0Yq+xA1VEH66uiMNhijsWAafffydd2X5b77eLHfRmfLsRSpbiAWiRHV6DEpz6aOToPsgid7TI9rGd6zB1rhbg==",
715
             "cpu": [
715
             "cpu": [
716
                 "x64"
716
                 "x64"
717
             ],
717
             ],
723
             ]
723
             ]
724
         },
724
         },
725
         "node_modules/@rollup/rollup-win32-arm64-msvc": {
725
         "node_modules/@rollup/rollup-win32-arm64-msvc": {
726
-            "version": "4.21.2",
727
-            "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.21.2.tgz",
728
-            "integrity": "sha512-9rRero0E7qTeYf6+rFh3AErTNU1VCQg2mn7CQcI44vNUWM9Ze7MSRS/9RFuSsox+vstRt97+x3sOhEey024FRQ==",
726
+            "version": "4.21.3",
727
+            "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.21.3.tgz",
728
+            "integrity": "sha512-9isNzeL34yquCPyerog+IMCNxKR8XYmGd0tHSV+OVx0TmE0aJOo9uw4fZfUuk2qxobP5sug6vNdZR6u7Mw7Q+Q==",
729
             "cpu": [
729
             "cpu": [
730
                 "arm64"
730
                 "arm64"
731
             ],
731
             ],
737
             ]
737
             ]
738
         },
738
         },
739
         "node_modules/@rollup/rollup-win32-ia32-msvc": {
739
         "node_modules/@rollup/rollup-win32-ia32-msvc": {
740
-            "version": "4.21.2",
741
-            "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.21.2.tgz",
742
-            "integrity": "sha512-5rA4vjlqgrpbFVVHX3qkrCo/fZTj1q0Xxpg+Z7yIo3J2AilW7t2+n6Q8Jrx+4MrYpAnjttTYF8rr7bP46BPzRw==",
740
+            "version": "4.21.3",
741
+            "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.21.3.tgz",
742
+            "integrity": "sha512-nMIdKnfZfzn1Vsk+RuOvl43ONTZXoAPUUxgcU0tXooqg4YrAqzfKzVenqqk2g5efWh46/D28cKFrOzDSW28gTA==",
743
             "cpu": [
743
             "cpu": [
744
                 "ia32"
744
                 "ia32"
745
             ],
745
             ],
751
             ]
751
             ]
752
         },
752
         },
753
         "node_modules/@rollup/rollup-win32-x64-msvc": {
753
         "node_modules/@rollup/rollup-win32-x64-msvc": {
754
-            "version": "4.21.2",
755
-            "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.21.2.tgz",
756
-            "integrity": "sha512-6UUxd0+SKomjdzuAcp+HAmxw1FlGBnl1v2yEPSabtx4lBfdXHDVsW7+lQkgz9cNFJGY3AWR7+V8P5BqkD9L9nA==",
754
+            "version": "4.21.3",
755
+            "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.21.3.tgz",
756
+            "integrity": "sha512-fOvu7PCQjAj4eWDEuD8Xz5gpzFqXzGlxHZozHP4b9Jxv9APtdxL6STqztDzMLuRXEc4UpXGGhx029Xgm91QBeA==",
757
             "cpu": [
757
             "cpu": [
758
                 "x64"
758
                 "x64"
759
             ],
759
             ],
1159
             "license": "MIT"
1159
             "license": "MIT"
1160
         },
1160
         },
1161
         "node_modules/electron-to-chromium": {
1161
         "node_modules/electron-to-chromium": {
1162
-            "version": "1.5.19",
1163
-            "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.19.tgz",
1164
-            "integrity": "sha512-kpLJJi3zxTR1U828P+LIUDZ5ohixyo68/IcYOHLqnbTPr/wdgn4i1ECvmALN9E16JPA6cvCG5UG79gVwVdEK5w==",
1162
+            "version": "1.5.23",
1163
+            "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.23.tgz",
1164
+            "integrity": "sha512-mBhODedOXg4v5QWwl21DjM5amzjmI1zw9EPrPK/5Wx7C8jt33bpZNrC7OhHUG3pxRtbLpr3W2dXT+Ph1SsfRZA==",
1165
             "dev": true,
1165
             "dev": true,
1166
             "license": "ISC"
1166
             "license": "ISC"
1167
         },
1167
         },
1826
             }
1826
             }
1827
         },
1827
         },
1828
         "node_modules/postcss": {
1828
         "node_modules/postcss": {
1829
-            "version": "8.4.45",
1830
-            "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.45.tgz",
1831
-            "integrity": "sha512-7KTLTdzdZZYscUc65XmjFiB73vBhBfbPztCYdUNvlaso9PrzjzcmjqBPR0lNGkcVlcO4BjiO5rK/qNz+XAen1Q==",
1829
+            "version": "8.4.47",
1830
+            "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.47.tgz",
1831
+            "integrity": "sha512-56rxCq7G/XfB4EkXq9Egn5GCqugWvDFjafDOThIdMBsI15iqPqR5r15TfSr1YPYeEI19YeaXMCbY6u88Y76GLQ==",
1832
             "dev": true,
1832
             "dev": true,
1833
             "funding": [
1833
             "funding": [
1834
                 {
1834
                 {
1847
             "license": "MIT",
1847
             "license": "MIT",
1848
             "dependencies": {
1848
             "dependencies": {
1849
                 "nanoid": "^3.3.7",
1849
                 "nanoid": "^3.3.7",
1850
-                "picocolors": "^1.0.1",
1851
-                "source-map-js": "^1.2.0"
1850
+                "picocolors": "^1.1.0",
1851
+                "source-map-js": "^1.2.1"
1852
             },
1852
             },
1853
             "engines": {
1853
             "engines": {
1854
                 "node": "^10 || ^12 || >=14"
1854
                 "node": "^10 || ^12 || >=14"
2171
             }
2171
             }
2172
         },
2172
         },
2173
         "node_modules/rollup": {
2173
         "node_modules/rollup": {
2174
-            "version": "4.21.2",
2175
-            "resolved": "https://registry.npmjs.org/rollup/-/rollup-4.21.2.tgz",
2176
-            "integrity": "sha512-e3TapAgYf9xjdLvKQCkQTnbTKd4a6jwlpQSJJFokHGaX2IVjoEqkIIhiQfqsi0cdwlOD+tQGuOd5AJkc5RngBw==",
2174
+            "version": "4.21.3",
2175
+            "resolved": "https://registry.npmjs.org/rollup/-/rollup-4.21.3.tgz",
2176
+            "integrity": "sha512-7sqRtBNnEbcBtMeRVc6VRsJMmpI+JU1z9VTvW8D4gXIYQFz0aLcsE6rRkyghZkLfEgUZgVvOG7A5CVz/VW5GIA==",
2177
             "dev": true,
2177
             "dev": true,
2178
             "license": "MIT",
2178
             "license": "MIT",
2179
             "dependencies": {
2179
             "dependencies": {
2187
                 "npm": ">=8.0.0"
2187
                 "npm": ">=8.0.0"
2188
             },
2188
             },
2189
             "optionalDependencies": {
2189
             "optionalDependencies": {
2190
-                "@rollup/rollup-android-arm-eabi": "4.21.2",
2191
-                "@rollup/rollup-android-arm64": "4.21.2",
2192
-                "@rollup/rollup-darwin-arm64": "4.21.2",
2193
-                "@rollup/rollup-darwin-x64": "4.21.2",
2194
-                "@rollup/rollup-linux-arm-gnueabihf": "4.21.2",
2195
-                "@rollup/rollup-linux-arm-musleabihf": "4.21.2",
2196
-                "@rollup/rollup-linux-arm64-gnu": "4.21.2",
2197
-                "@rollup/rollup-linux-arm64-musl": "4.21.2",
2198
-                "@rollup/rollup-linux-powerpc64le-gnu": "4.21.2",
2199
-                "@rollup/rollup-linux-riscv64-gnu": "4.21.2",
2200
-                "@rollup/rollup-linux-s390x-gnu": "4.21.2",
2201
-                "@rollup/rollup-linux-x64-gnu": "4.21.2",
2202
-                "@rollup/rollup-linux-x64-musl": "4.21.2",
2203
-                "@rollup/rollup-win32-arm64-msvc": "4.21.2",
2204
-                "@rollup/rollup-win32-ia32-msvc": "4.21.2",
2205
-                "@rollup/rollup-win32-x64-msvc": "4.21.2",
2190
+                "@rollup/rollup-android-arm-eabi": "4.21.3",
2191
+                "@rollup/rollup-android-arm64": "4.21.3",
2192
+                "@rollup/rollup-darwin-arm64": "4.21.3",
2193
+                "@rollup/rollup-darwin-x64": "4.21.3",
2194
+                "@rollup/rollup-linux-arm-gnueabihf": "4.21.3",
2195
+                "@rollup/rollup-linux-arm-musleabihf": "4.21.3",
2196
+                "@rollup/rollup-linux-arm64-gnu": "4.21.3",
2197
+                "@rollup/rollup-linux-arm64-musl": "4.21.3",
2198
+                "@rollup/rollup-linux-powerpc64le-gnu": "4.21.3",
2199
+                "@rollup/rollup-linux-riscv64-gnu": "4.21.3",
2200
+                "@rollup/rollup-linux-s390x-gnu": "4.21.3",
2201
+                "@rollup/rollup-linux-x64-gnu": "4.21.3",
2202
+                "@rollup/rollup-linux-x64-musl": "4.21.3",
2203
+                "@rollup/rollup-win32-arm64-msvc": "4.21.3",
2204
+                "@rollup/rollup-win32-ia32-msvc": "4.21.3",
2205
+                "@rollup/rollup-win32-x64-msvc": "4.21.3",
2206
                 "fsevents": "~2.3.2"
2206
                 "fsevents": "~2.3.2"
2207
             }
2207
             }
2208
         },
2208
         },
2417
             }
2417
             }
2418
         },
2418
         },
2419
         "node_modules/tailwindcss": {
2419
         "node_modules/tailwindcss": {
2420
-            "version": "3.4.10",
2421
-            "resolved": "https://registry.npmjs.org/tailwindcss/-/tailwindcss-3.4.10.tgz",
2422
-            "integrity": "sha512-KWZkVPm7yJRhdu4SRSl9d4AK2wM3a50UsvgHZO7xY77NQr2V+fIrEuoDGQcbvswWvFGbS2f6e+jC/6WJm1Dl0w==",
2420
+            "version": "3.4.11",
2421
+            "resolved": "https://registry.npmjs.org/tailwindcss/-/tailwindcss-3.4.11.tgz",
2422
+            "integrity": "sha512-qhEuBcLemjSJk5ajccN9xJFtM/h0AVCPaA6C92jNP+M2J8kX+eMJHI7R2HFKUvvAsMpcfLILMCFYSeDwpMmlUg==",
2423
             "dev": true,
2423
             "dev": true,
2424
             "license": "MIT",
2424
             "license": "MIT",
2425
             "dependencies": {
2425
             "dependencies": {
2550
             "license": "MIT"
2550
             "license": "MIT"
2551
         },
2551
         },
2552
         "node_modules/vite": {
2552
         "node_modules/vite": {
2553
-            "version": "5.4.3",
2554
-            "resolved": "https://registry.npmjs.org/vite/-/vite-5.4.3.tgz",
2555
-            "integrity": "sha512-IH+nl64eq9lJjFqU+/yrRnrHPVTlgy42/+IzbOdaFDVlyLgI/wDlf+FCobXLX1cT0X5+7LMyH1mIy2xJdLfo8Q==",
2553
+            "version": "5.4.5",
2554
+            "resolved": "https://registry.npmjs.org/vite/-/vite-5.4.5.tgz",
2555
+            "integrity": "sha512-pXqR0qtb2bTwLkev4SE3r4abCNioP3GkjvIDLlzziPpXtHgiJIjuKl+1GN6ESOT3wMjG3JTeARopj2SwYaHTOA==",
2556
             "dev": true,
2556
             "dev": true,
2557
             "license": "MIT",
2557
             "license": "MIT",
2558
             "dependencies": {
2558
             "dependencies": {

+ 8
- 0
resources/css/filament/company/theme.css View File

4
 
4
 
5
 @config './tailwind.config.js';
5
 @config './tailwind.config.js';
6
 
6
 
7
+.fi-fo-field-wrp.report-hidden-label div.flex.items-center {
8
+    @apply hidden;
9
+}
10
+
11
+.fi-fo-field-wrp.report-hidden-label {
12
+    @apply lg:mt-8;
13
+}
14
+
7
 .choices__list.choices__list--single {
15
 .choices__list.choices__list--single {
8
     @apply w-full;
16
     @apply w-full;
9
 }
17
 }

+ 45
- 0
resources/views/filament/company/pages/reports/trial-balance.blade.php View File

1
+<x-filament-panels::page>
2
+    <x-filament::section>
3
+        <div class="flex flex-col lg:flex-row items-start lg:items-end justify-between gap-4">
4
+            <!-- Form Container -->
5
+            @if(method_exists($this, 'filtersForm'))
6
+                {{ $this->filtersForm }}
7
+            @endif
8
+
9
+            <!-- Grouping Button and Column Toggle -->
10
+            @if($this->hasToggleableColumns())
11
+                <div class="lg:mb-1">
12
+                    <x-filament-tables::column-toggle.dropdown
13
+                        :form="$this->getTableColumnToggleForm()"
14
+                        :trigger-action="$this->getToggleColumnsTriggerAction()"
15
+                    />
16
+                </div>
17
+            @endif
18
+
19
+            <div class="inline-flex items-center min-w-0 lg:min-w-[9.5rem] justify-end">
20
+                {{ $this->applyFiltersAction }}
21
+            </div>
22
+        </div>
23
+    </x-filament::section>
24
+
25
+    <x-filament-tables::container>
26
+        <div class="es-table__header-ctn"></div>
27
+        <div
28
+            class="relative divide-y divide-gray-200 overflow-x-auto dark:divide-white/10 dark:border-t-white/10 min-h-64">
29
+            <div wire:init="applyFilters" class="flex items-center justify-center w-full h-full absolute">
30
+                <div wire:loading wire:target="applyFilters">
31
+                    <x-filament::loading-indicator class="p-6 text-primary-700 dark:text-primary-300"/>
32
+                </div>
33
+            </div>
34
+
35
+            @if($this->reportLoaded)
36
+                <div wire:loading.remove wire:target="applyFilters">
37
+                    @if($this->report)
38
+                        <x-company.tables.reports.detailed-report :report="$this->report"/>
39
+                    @endif
40
+                </div>
41
+            @endif
42
+        </div>
43
+        <div class="es-table__footer-ctn border-t border-gray-200"></div>
44
+    </x-filament-tables::container>
45
+</x-filament-panels::page>

Loading…
Cancel
Save