Andrew Wallo 1 gadu atpakaļ
vecāks
revīzija
7f43f070df

+ 5
- 3
app/DTO/AccountCategoryDTO.php Parādīt failu

5
 class AccountCategoryDTO
5
 class AccountCategoryDTO
6
 {
6
 {
7
     /**
7
     /**
8
-     * @param  AccountDTO[]  $accounts
8
+     * @param  AccountDTO[]|null  $accounts
9
+     * @param  AccountTypeDTO[]|null  $types
9
      */
10
      */
10
     public function __construct(
11
     public function __construct(
11
-        public array $accounts,
12
-        public AccountBalanceDTO $summary,
12
+        public ?array $accounts = null,
13
+        public ?array $types = null,
14
+        public ?AccountBalanceDTO $summary = null,
13
     ) {}
15
     ) {}
14
 }
16
 }

+ 14
- 0
app/DTO/AccountTypeDTO.php Parādīt failu

1
+<?php
2
+
3
+namespace App\DTO;
4
+
5
+class AccountTypeDTO
6
+{
7
+    /**
8
+     * @param  AccountDTO[]  $accounts
9
+     */
10
+    public function __construct(
11
+        public array $accounts,
12
+        public AccountBalanceDTO $summary,
13
+    ) {}
14
+}

+ 9
- 3
app/DTO/ReportCategoryDTO.php Parādīt failu

4
 
4
 
5
 class ReportCategoryDTO
5
 class ReportCategoryDTO
6
 {
6
 {
7
+    /**
8
+     * ReportCategoryDTO constructor.
9
+     *
10
+     * @param  ReportTypeDTO[]|null  $types
11
+     */
7
     public function __construct(
12
     public function __construct(
8
-        public array $header,
9
-        public array $data,
10
-        public array $summary = [],
13
+        public ?array $header = null,
14
+        public ?array $data = null,
15
+        public ?array $summary = null,
16
+        public ?array $types = null,
11
     ) {}
17
     ) {}
12
 }
18
 }

+ 12
- 0
app/DTO/ReportTypeDTO.php Parādīt failu

1
+<?php
2
+
3
+namespace App\DTO;
4
+
5
+class ReportTypeDTO
6
+{
7
+    public function __construct(
8
+        public ?array $header = null,
9
+        public ?array $data = null,
10
+        public ?array $summary = null,
11
+    ) {}
12
+}

+ 22
- 0
app/Enums/Accounting/AccountType.php Parādīt failu

45
         };
45
         };
46
     }
46
     }
47
 
47
 
48
+    public function getPluralLabel(): ?string
49
+    {
50
+        return match ($this) {
51
+            self::CurrentAsset => 'Current Assets',
52
+            self::NonCurrentAsset => 'Non-Current Assets',
53
+            self::ContraAsset => 'Contra Assets',
54
+            self::CurrentLiability => 'Current Liabilities',
55
+            self::NonCurrentLiability => 'Non-Current Liabilities',
56
+            self::ContraLiability => 'Contra Liabilities',
57
+            self::Equity => 'Equity',
58
+            self::ContraEquity => 'Contra Equity',
59
+            self::OperatingRevenue => 'Operating Revenue',
60
+            self::NonOperatingRevenue => 'Non-Operating Revenue',
61
+            self::ContraRevenue => 'Contra Revenue',
62
+            self::UncategorizedRevenue => 'Uncategorized Revenue',
63
+            self::OperatingExpense => 'Operating Expenses',
64
+            self::NonOperatingExpense => 'Non-Operating Expenses',
65
+            self::ContraExpense => 'Contra Expenses',
66
+            self::UncategorizedExpense => 'Uncategorized Expenses',
67
+        };
68
+    }
69
+
48
     public function getCategory(): AccountCategory
70
     public function getCategory(): AccountCategory
49
     {
71
     {
50
         return match ($this) {
72
         return match ($this) {

+ 2
- 1
app/Filament/Company/Pages/Reports.php Parādīt failu

4
 
4
 
5
 use App\Filament\Company\Pages\Reports\AccountBalances;
5
 use App\Filament\Company\Pages\Reports\AccountBalances;
6
 use App\Filament\Company\Pages\Reports\AccountTransactions;
6
 use App\Filament\Company\Pages\Reports\AccountTransactions;
7
+use App\Filament\Company\Pages\Reports\BalanceSheet;
7
 use App\Filament\Company\Pages\Reports\IncomeStatement;
8
 use App\Filament\Company\Pages\Reports\IncomeStatement;
8
 use App\Filament\Company\Pages\Reports\TrialBalance;
9
 use App\Filament\Company\Pages\Reports\TrialBalance;
9
 use App\Infolists\Components\ReportEntry;
10
 use App\Infolists\Components\ReportEntry;
41
                             ->description('Snapshot of assets, liabilities, and equity at a specific point in time.')
42
                             ->description('Snapshot of assets, liabilities, and equity at a specific point in time.')
42
                             ->icon('heroicon-o-clipboard-document-list')
43
                             ->icon('heroicon-o-clipboard-document-list')
43
                             ->iconColor(Color::Emerald)
44
                             ->iconColor(Color::Emerald)
44
-                            ->url('#'),
45
+                            ->url(BalanceSheet::getUrl()),
45
                         ReportEntry::make('cash_flow_statement')
46
                         ReportEntry::make('cash_flow_statement')
46
                             ->hiddenLabel()
47
                             ->hiddenLabel()
47
                             ->heading('Cash Flow Statement')
48
                             ->heading('Cash Flow Statement')

+ 83
- 0
app/Filament/Company/Pages/Reports/BalanceSheet.php Parādīt failu

1
+<?php
2
+
3
+namespace App\Filament\Company\Pages\Reports;
4
+
5
+use App\Contracts\ExportableReport;
6
+use App\DTO\ReportDTO;
7
+use App\Filament\Forms\Components\DateRangeSelect;
8
+use App\Services\ExportService;
9
+use App\Services\ReportService;
10
+use App\Support\Column;
11
+use App\Transformers\BalanceSheetReportTransformer;
12
+use Filament\Forms\Form;
13
+use Filament\Support\Enums\Alignment;
14
+use Symfony\Component\HttpFoundation\StreamedResponse;
15
+
16
+class BalanceSheet extends BaseReportPage
17
+{
18
+    protected static string $view = 'filament.company.pages.reports.balance-sheet';
19
+
20
+    protected static bool $shouldRegisterNavigation = false;
21
+
22
+    protected ReportService $reportService;
23
+
24
+    protected ExportService $exportService;
25
+
26
+    public function boot(ReportService $reportService, ExportService $exportService): void
27
+    {
28
+        $this->reportService = $reportService;
29
+        $this->exportService = $exportService;
30
+    }
31
+
32
+    public function getTable(): array
33
+    {
34
+        return [
35
+            Column::make('account_code')
36
+                ->label('Account Code')
37
+                ->toggleable()
38
+                ->alignment(Alignment::Center),
39
+            Column::make('account_name')
40
+                ->label('Account')
41
+                ->alignment(Alignment::Left),
42
+            Column::make('ending_balance')
43
+                ->label('Amount')
44
+                ->alignment(Alignment::Right),
45
+        ];
46
+    }
47
+
48
+    public function filtersForm(Form $form): Form
49
+    {
50
+        return $form
51
+            ->inlineLabel()
52
+            ->columns(3)
53
+            ->schema([
54
+                DateRangeSelect::make('dateRange')
55
+                    ->label('As of')
56
+                    ->selectablePlaceholder(false)
57
+                    ->endDateField('asOfDate'),
58
+                $this->getAsOfDateFormComponent()
59
+                    ->hiddenLabel()
60
+                    ->extraFieldWrapperAttributes([]),
61
+            ]);
62
+    }
63
+
64
+    protected function buildReport(array $columns): ReportDTO
65
+    {
66
+        return $this->reportService->buildBalanceSheetReport($this->getFormattedAsOfDate(), $columns);
67
+    }
68
+
69
+    protected function getTransformer(ReportDTO $reportDTO): ExportableReport
70
+    {
71
+        return new BalanceSheetReportTransformer($reportDTO);
72
+    }
73
+
74
+    public function exportCSV(): StreamedResponse
75
+    {
76
+        return $this->exportService->exportToCsv($this->company, $this->report, $this->getFilterState('asOfDate'));
77
+    }
78
+
79
+    public function exportPDF(): StreamedResponse
80
+    {
81
+        return $this->exportService->exportToPdf($this->company, $this->report, $this->getFilterState('asOfDate'));
82
+    }
83
+}

+ 1
- 0
app/Services/AccountService.php Parādīt failu

138
                 'accounts.id',
138
                 'accounts.id',
139
                 'accounts.name',
139
                 'accounts.name',
140
                 'accounts.category',
140
                 'accounts.category',
141
+                'accounts.type',
141
                 'accounts.subtype_id',
142
                 'accounts.subtype_id',
142
                 'accounts.currency_code',
143
                 'accounts.currency_code',
143
                 'accounts.code',
144
                 'accounts.code',

+ 126
- 6
app/Services/ReportService.php Parādīt failu

6
 use App\DTO\AccountCategoryDTO;
6
 use App\DTO\AccountCategoryDTO;
7
 use App\DTO\AccountDTO;
7
 use App\DTO\AccountDTO;
8
 use App\DTO\AccountTransactionDTO;
8
 use App\DTO\AccountTransactionDTO;
9
+use App\DTO\AccountTypeDTO;
9
 use App\DTO\ReportDTO;
10
 use App\DTO\ReportDTO;
10
 use App\Enums\Accounting\AccountCategory;
11
 use App\Enums\Accounting\AccountCategory;
11
 use App\Models\Accounting\Account;
12
 use App\Models\Accounting\Account;
86
             $formattedCategorySummaryBalances = $this->formatBalances($categorySummaryBalances);
87
             $formattedCategorySummaryBalances = $this->formatBalances($categorySummaryBalances);
87
 
88
 
88
             $accountCategories[$category->getPluralLabel()] = new AccountCategoryDTO(
89
             $accountCategories[$category->getPluralLabel()] = new AccountCategoryDTO(
89
-                $categoryAccounts,
90
-                $formattedCategorySummaryBalances,
90
+                accounts: $categoryAccounts,
91
+                summary: $formattedCategorySummaryBalances,
91
             );
92
             );
92
         }
93
         }
93
 
94
 
305
             $formattedCategorySummaryBalances = $this->formatBalances($categorySummaryBalances);
306
             $formattedCategorySummaryBalances = $this->formatBalances($categorySummaryBalances);
306
 
307
 
307
             $accountCategories[$category->getPluralLabel()] = new AccountCategoryDTO(
308
             $accountCategories[$category->getPluralLabel()] = new AccountCategoryDTO(
308
-                $categoryAccounts,
309
-                $formattedCategorySummaryBalances,
309
+                accounts: $categoryAccounts,
310
+                summary: $formattedCategorySummaryBalances,
310
             );
311
             );
311
         }
312
         }
312
 
313
 
417
             }
418
             }
418
 
419
 
419
             $accountCategories[$label] = new AccountCategoryDTO(
420
             $accountCategories[$label] = new AccountCategoryDTO(
420
-                $categoryAccounts,
421
-                $this->formatBalances(['net_movement' => $netMovement])
421
+                accounts: $categoryAccounts,
422
+                summary: $this->formatBalances(['net_movement' => $netMovement])
422
             );
423
             );
423
         }
424
         }
424
 
425
 
429
 
430
 
430
         return new ReportDTO($accountCategories, $formattedReportTotalBalances, $columns);
431
         return new ReportDTO($accountCategories, $formattedReportTotalBalances, $columns);
431
     }
432
     }
433
+
434
+    public function buildBalanceSheetReport(string $asOfDate, array $columns = []): ReportDTO
435
+    {
436
+        $asOfDateCarbon = Carbon::parse($asOfDate);
437
+        $startDateCarbon = Carbon::parse($this->accountService->getEarliestTransactionDate());
438
+
439
+        $orderedCategories = AccountCategory::getOrderedCategories();
440
+
441
+        // Filter out non-real categories like Revenue and Expense
442
+        $orderedCategories = array_filter($orderedCategories, fn (AccountCategory $category) => $category->isReal());
443
+
444
+        // Fetch account balances
445
+        $accounts = $this->accountService->getAccountBalances($startDateCarbon->toDateTimeString(), $asOfDateCarbon->toDateTimeString())
446
+            ->get();
447
+
448
+        $accountCategories = [];
449
+        $reportTotalBalances = [
450
+            'assets' => 0,
451
+            'liabilities' => 0,
452
+            'equity' => 0,
453
+        ];
454
+
455
+        foreach ($orderedCategories as $category) {
456
+            $categorySummaryBalances = ['ending_balance' => 0];
457
+
458
+            // Group the accounts by their type within the current category
459
+            $categoryAccountsByType = [];
460
+            $subCategoryTotals = [];
461
+
462
+            /** @var Account $account */
463
+            foreach ($accounts as $account) {
464
+                // Ensure that the account type's category matches the current loop category
465
+                if ($account->type->getCategory() === $category) {
466
+                    $accountBalances = $this->calculateAccountBalances($account, $category);
467
+                    $endingBalance = $accountBalances['ending_balance'] ?? $accountBalances['net_movement'];
468
+
469
+                    $categorySummaryBalances['ending_balance'] += $endingBalance;
470
+
471
+                    $formattedAccountBalances = $this->formatBalances($accountBalances);
472
+
473
+                    // Create a DTO for each account
474
+                    $accountDTO = new AccountDTO(
475
+                        $account->name,
476
+                        $account->code,
477
+                        $account->id,
478
+                        $formattedAccountBalances,
479
+                        startDate: $startDateCarbon->toDateString(),
480
+                        endDate: $asOfDateCarbon->toDateString(),
481
+                    );
482
+
483
+                    // Group by account type label and accumulate subcategory totals
484
+                    $accountType = $account->type->getPluralLabel();
485
+                    $categoryAccountsByType[$accountType][] = $accountDTO;
486
+
487
+                    // Track totals for the subcategory (not formatted)
488
+                    $subCategoryTotals[$accountType] = ($subCategoryTotals[$accountType] ?? 0) + $endingBalance;
489
+                }
490
+            }
491
+
492
+            // If the category is Equity, include Retained Earnings
493
+            if ($category === AccountCategory::Equity) {
494
+                $retainedEarningsAmount = $this->calculateRetainedEarnings($startDateCarbon->toDateTimeString(), $asOfDateCarbon->toDateTimeString())->getAmount();
495
+
496
+                $categorySummaryBalances['ending_balance'] += $retainedEarningsAmount;
497
+
498
+                $accountDTO = new AccountDTO(
499
+                    'Retained Earnings',
500
+                    'RE',
501
+                    null,
502
+                    $this->formatBalances(['ending_balance' => $retainedEarningsAmount]),
503
+                    startDate: $startDateCarbon->toDateString(),
504
+                    endDate: $asOfDateCarbon->toDateString(),
505
+                );
506
+
507
+                // Add Retained Earnings to the Equity type
508
+                $categoryAccountsByType['Equity'][] = $accountDTO;
509
+
510
+                // Add to subcategory total as well
511
+                $subCategoryTotals['Equity'] = ($subCategoryTotals['Equity'] ?? 0) + $retainedEarningsAmount;
512
+            }
513
+
514
+            // Create SubCategory DTOs for each account type within the category
515
+            $subCategories = [];
516
+            foreach ($categoryAccountsByType as $accountType => $accountsInType) {
517
+                $subCategorySummary = $this->formatBalances([
518
+                    'ending_balance' => $subCategoryTotals[$accountType] ?? 0,
519
+                ]);
520
+
521
+                $subCategories[$accountType] = new AccountTypeDTO(
522
+                    accounts: $accountsInType,
523
+                    summary: $subCategorySummary
524
+                );
525
+            }
526
+
527
+            // Add category totals to the overall totals
528
+            if ($category === AccountCategory::Asset) {
529
+                $reportTotalBalances['assets'] += $categorySummaryBalances['ending_balance'];
530
+            } elseif ($category === AccountCategory::Liability) {
531
+                $reportTotalBalances['liabilities'] += $categorySummaryBalances['ending_balance'];
532
+            } elseif ($category === AccountCategory::Equity) {
533
+                $reportTotalBalances['equity'] += $categorySummaryBalances['ending_balance'];
534
+            }
535
+
536
+            // Store the subcategories and the summary in the accountCategories array
537
+            $accountCategories[$category->getPluralLabel()] = new AccountCategoryDTO(
538
+                types: $subCategories,
539
+                summary: $this->formatBalances($categorySummaryBalances),
540
+            );
541
+        }
542
+
543
+        // Calculate Net Assets (Assets - Liabilities)
544
+        $netAssets = $reportTotalBalances['assets'] - $reportTotalBalances['liabilities'];
545
+
546
+        // Format the overall totals for the report
547
+        $formattedReportTotalBalances = $this->formatBalances(['ending_balance' => $netAssets]);
548
+
549
+        // Return the constructed ReportDTO
550
+        return new ReportDTO($accountCategories, $formattedReportTotalBalances, $columns);
551
+    }
432
 }
552
 }

+ 147
- 0
app/Transformers/BalanceSheetReportTransformer.php Parādīt failu

1
+<?php
2
+
3
+namespace App\Transformers;
4
+
5
+use App\DTO\AccountDTO;
6
+use App\DTO\ReportCategoryDTO;
7
+use App\DTO\ReportTypeDTO;
8
+use App\Support\Column;
9
+
10
+class BalanceSheetReportTransformer extends BaseReportTransformer
11
+{
12
+    protected string $totalAssets = '$0.00';
13
+
14
+    protected string $totalLiabilities = '$0.00';
15
+
16
+    protected string $totalEquity = '$0.00';
17
+
18
+    public function getTitle(): string
19
+    {
20
+        return 'Balance Sheet';
21
+    }
22
+
23
+    public function getHeaders(): array
24
+    {
25
+        return array_map(fn (Column $column) => $column->getLabel(), $this->getColumns());
26
+    }
27
+
28
+    public function calculateTotals(): void
29
+    {
30
+        foreach ($this->report->categories as $accountCategoryName => $accountCategory) {
31
+            match ($accountCategoryName) {
32
+                'Assets' => $this->totalAssets = $accountCategory->summary->endingBalance ?? '',
33
+                'Liabilities' => $this->totalLiabilities = $accountCategory->summary->endingBalance ?? '',
34
+                'Equity' => $this->totalEquity = $accountCategory->summary->endingBalance ?? '',
35
+            };
36
+        }
37
+    }
38
+
39
+    public function getCategories(): array
40
+    {
41
+        $categories = [];
42
+
43
+        foreach ($this->report->categories as $accountCategoryName => $accountCategory) {
44
+            $header = [];
45
+
46
+            foreach ($this->getColumns() as $index => $column) {
47
+                if ($column->getName() === 'account_name') {
48
+                    $header[$index] = $accountCategoryName;
49
+                } else {
50
+                    $header[$index] = '';
51
+                }
52
+            }
53
+
54
+            // Category-level summary
55
+            $categorySummary = [];
56
+            foreach ($this->getColumns() as $column) {
57
+                $categorySummary[] = match ($column->getName()) {
58
+                    'account_name' => 'Total ' . $accountCategoryName,
59
+                    'ending_balance' => $accountCategory->summary->endingBalance ?? '',
60
+                    default => '',
61
+                };
62
+            }
63
+
64
+            // Subcategories (types) under the main category
65
+            $types = [];
66
+            foreach ($accountCategory->types as $typeName => $type) {
67
+                // Header for subcategory (type)
68
+                $typeHeader = [];
69
+                foreach ($this->getColumns() as $index => $column) {
70
+                    $typeHeader[$index] = $column->getName() === 'account_name' ? $typeName : '';
71
+                }
72
+
73
+                // Account data for the subcategory
74
+                $data = array_map(function (AccountDTO $account) {
75
+                    $row = [];
76
+                    foreach ($this->getColumns() as $column) {
77
+                        $row[] = match ($column->getName()) {
78
+                            'account_code' => $account->accountCode,
79
+                            'account_name' => [
80
+                                'name' => $account->accountName,
81
+                                'id' => $account->accountId ?? null,
82
+                                'start_date' => $account->startDate,
83
+                                'end_date' => $account->endDate,
84
+                            ],
85
+                            'ending_balance' => $account->balance->endingBalance ?? '',
86
+                            default => '',
87
+                        };
88
+                    }
89
+
90
+                    return $row;
91
+                }, $type->accounts);
92
+
93
+                // Subcategory (type) summary
94
+                $typeSummary = [];
95
+                foreach ($this->getColumns() as $column) {
96
+                    $typeSummary[] = match ($column->getName()) {
97
+                        'account_name' => 'Total ' . $typeName,
98
+                        'ending_balance' => $type->summary->endingBalance ?? '',
99
+                        default => '',
100
+                    };
101
+                }
102
+
103
+                // Add subcategory (type) to the list
104
+                $types[$typeName] = new ReportTypeDTO(
105
+                    header: $typeHeader,
106
+                    data: $data,
107
+                    summary: $typeSummary,
108
+                );
109
+            }
110
+
111
+            // Add the category to the final array with its subcategories (types)
112
+            $categories[$accountCategoryName] = new ReportCategoryDTO(
113
+                header: $header,
114
+                data: [],
115
+                summary: $categorySummary,
116
+                types: $types,
117
+            );
118
+        }
119
+
120
+        return $categories;
121
+    }
122
+
123
+    public function getOverallTotals(): array
124
+    {
125
+        return [];
126
+    }
127
+
128
+    public function getSummary(): array
129
+    {
130
+        $this->calculateTotals();
131
+
132
+        return [
133
+            [
134
+                'label' => 'Total Assets',
135
+                'value' => $this->totalAssets,
136
+            ],
137
+            [
138
+                'label' => 'Total Liabilities',
139
+                'value' => $this->totalLiabilities,
140
+            ],
141
+            [
142
+                'label' => 'Net Assets',
143
+                'value' => $this->report->overallTotal->endingBalance ?? '',
144
+            ],
145
+        ];
146
+    }
147
+}

+ 96
- 93
composer.lock Parādīt failu

497
         },
497
         },
498
         {
498
         {
499
             "name": "aws/aws-sdk-php",
499
             "name": "aws/aws-sdk-php",
500
-            "version": "3.323.3",
500
+            "version": "3.324.1",
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": "9dec2a6453bdb32b3abeb475fc63b46ba1cbd996"
504
+                "reference": "5b824a9b8015a38f18c53b023975c0f63c7bd3dc"
505
             },
505
             },
506
             "dist": {
506
             "dist": {
507
                 "type": "zip",
507
                 "type": "zip",
508
-                "url": "https://api.github.com/repos/aws/aws-sdk-php/zipball/9dec2a6453bdb32b3abeb475fc63b46ba1cbd996",
509
-                "reference": "9dec2a6453bdb32b3abeb475fc63b46ba1cbd996",
508
+                "url": "https://api.github.com/repos/aws/aws-sdk-php/zipball/5b824a9b8015a38f18c53b023975c0f63c7bd3dc",
509
+                "reference": "5b824a9b8015a38f18c53b023975c0f63c7bd3dc",
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.323.3"
592
+                "source": "https://github.com/aws/aws-sdk-php/tree/3.324.1"
593
             },
593
             },
594
-            "time": "2024-10-08T18:05:47+00:00"
594
+            "time": "2024-10-11T18:22:01+00:00"
595
         },
595
         },
596
         {
596
         {
597
             "name": "aws/aws-sdk-php-laravel",
597
             "name": "aws/aws-sdk-php-laravel",
1209
         },
1209
         },
1210
         {
1210
         {
1211
             "name": "doctrine/dbal",
1211
             "name": "doctrine/dbal",
1212
-            "version": "4.1.1",
1212
+            "version": "4.2.1",
1213
             "source": {
1213
             "source": {
1214
                 "type": "git",
1214
                 "type": "git",
1215
                 "url": "https://github.com/doctrine/dbal.git",
1215
                 "url": "https://github.com/doctrine/dbal.git",
1216
-                "reference": "7a8252418689feb860ea8dfeab66d64a56a64df8"
1216
+                "reference": "dadd35300837a3a2184bd47d403333b15d0a9bd0"
1217
             },
1217
             },
1218
             "dist": {
1218
             "dist": {
1219
                 "type": "zip",
1219
                 "type": "zip",
1220
-                "url": "https://api.github.com/repos/doctrine/dbal/zipball/7a8252418689feb860ea8dfeab66d64a56a64df8",
1221
-                "reference": "7a8252418689feb860ea8dfeab66d64a56a64df8",
1220
+                "url": "https://api.github.com/repos/doctrine/dbal/zipball/dadd35300837a3a2184bd47d403333b15d0a9bd0",
1221
+                "reference": "dadd35300837a3a2184bd47d403333b15d0a9bd0",
1222
                 "shasum": ""
1222
                 "shasum": ""
1223
             },
1223
             },
1224
             "require": {
1224
             "require": {
1231
                 "doctrine/coding-standard": "12.0.0",
1231
                 "doctrine/coding-standard": "12.0.0",
1232
                 "fig/log-test": "^1",
1232
                 "fig/log-test": "^1",
1233
                 "jetbrains/phpstorm-stubs": "2023.2",
1233
                 "jetbrains/phpstorm-stubs": "2023.2",
1234
-                "phpstan/phpstan": "1.12.0",
1234
+                "phpstan/phpstan": "1.12.6",
1235
                 "phpstan/phpstan-phpunit": "1.4.0",
1235
                 "phpstan/phpstan-phpunit": "1.4.0",
1236
                 "phpstan/phpstan-strict-rules": "^1.6",
1236
                 "phpstan/phpstan-strict-rules": "^1.6",
1237
                 "phpunit/phpunit": "10.5.30",
1237
                 "phpunit/phpunit": "10.5.30",
1297
             ],
1297
             ],
1298
             "support": {
1298
             "support": {
1299
                 "issues": "https://github.com/doctrine/dbal/issues",
1299
                 "issues": "https://github.com/doctrine/dbal/issues",
1300
-                "source": "https://github.com/doctrine/dbal/tree/4.1.1"
1300
+                "source": "https://github.com/doctrine/dbal/tree/4.2.1"
1301
             },
1301
             },
1302
             "funding": [
1302
             "funding": [
1303
                 {
1303
                 {
1313
                     "type": "tidelift"
1313
                     "type": "tidelift"
1314
                 }
1314
                 }
1315
             ],
1315
             ],
1316
-            "time": "2024-09-03T08:58:39+00:00"
1316
+            "time": "2024-10-10T18:01:27+00:00"
1317
         },
1317
         },
1318
         {
1318
         {
1319
             "name": "doctrine/deprecations",
1319
             "name": "doctrine/deprecations",
1532
         },
1532
         },
1533
         {
1533
         {
1534
             "name": "dragonmantank/cron-expression",
1534
             "name": "dragonmantank/cron-expression",
1535
-            "version": "v3.3.3",
1535
+            "version": "v3.4.0",
1536
             "source": {
1536
             "source": {
1537
                 "type": "git",
1537
                 "type": "git",
1538
                 "url": "https://github.com/dragonmantank/cron-expression.git",
1538
                 "url": "https://github.com/dragonmantank/cron-expression.git",
1539
-                "reference": "adfb1f505deb6384dc8b39804c5065dd3c8c8c0a"
1539
+                "reference": "8c784d071debd117328803d86b2097615b457500"
1540
             },
1540
             },
1541
             "dist": {
1541
             "dist": {
1542
                 "type": "zip",
1542
                 "type": "zip",
1543
-                "url": "https://api.github.com/repos/dragonmantank/cron-expression/zipball/adfb1f505deb6384dc8b39804c5065dd3c8c8c0a",
1544
-                "reference": "adfb1f505deb6384dc8b39804c5065dd3c8c8c0a",
1543
+                "url": "https://api.github.com/repos/dragonmantank/cron-expression/zipball/8c784d071debd117328803d86b2097615b457500",
1544
+                "reference": "8c784d071debd117328803d86b2097615b457500",
1545
                 "shasum": ""
1545
                 "shasum": ""
1546
             },
1546
             },
1547
             "require": {
1547
             "require": {
1554
             "require-dev": {
1554
             "require-dev": {
1555
                 "phpstan/extension-installer": "^1.0",
1555
                 "phpstan/extension-installer": "^1.0",
1556
                 "phpstan/phpstan": "^1.0",
1556
                 "phpstan/phpstan": "^1.0",
1557
-                "phpstan/phpstan-webmozart-assert": "^1.0",
1558
                 "phpunit/phpunit": "^7.0|^8.0|^9.0"
1557
                 "phpunit/phpunit": "^7.0|^8.0|^9.0"
1559
             },
1558
             },
1560
             "type": "library",
1559
             "type": "library",
1560
+            "extra": {
1561
+                "branch-alias": {
1562
+                    "dev-master": "3.x-dev"
1563
+                }
1564
+            },
1561
             "autoload": {
1565
             "autoload": {
1562
                 "psr-4": {
1566
                 "psr-4": {
1563
                     "Cron\\": "src/Cron/"
1567
                     "Cron\\": "src/Cron/"
1581
             ],
1585
             ],
1582
             "support": {
1586
             "support": {
1583
                 "issues": "https://github.com/dragonmantank/cron-expression/issues",
1587
                 "issues": "https://github.com/dragonmantank/cron-expression/issues",
1584
-                "source": "https://github.com/dragonmantank/cron-expression/tree/v3.3.3"
1588
+                "source": "https://github.com/dragonmantank/cron-expression/tree/v3.4.0"
1585
             },
1589
             },
1586
             "funding": [
1590
             "funding": [
1587
                 {
1591
                 {
1589
                     "type": "github"
1593
                     "type": "github"
1590
                 }
1594
                 }
1591
             ],
1595
             ],
1592
-            "time": "2023-08-10T19:36:49+00:00"
1596
+            "time": "2024-10-09T13:47:03+00:00"
1593
         },
1597
         },
1594
         {
1598
         {
1595
             "name": "egulias/email-validator",
1599
             "name": "egulias/email-validator",
1660
         },
1664
         },
1661
         {
1665
         {
1662
             "name": "filament/actions",
1666
             "name": "filament/actions",
1663
-            "version": "v3.2.116",
1667
+            "version": "v3.2.117",
1664
             "source": {
1668
             "source": {
1665
                 "type": "git",
1669
                 "type": "git",
1666
                 "url": "https://github.com/filamentphp/actions.git",
1670
                 "url": "https://github.com/filamentphp/actions.git",
1667
-                "reference": "79dce62359b61b755a5e3d8faa0e047a1f92ad9a"
1671
+                "reference": "886108b59ce99edc26f5bc1231134a95ec58718a"
1668
             },
1672
             },
1669
             "dist": {
1673
             "dist": {
1670
                 "type": "zip",
1674
                 "type": "zip",
1671
-                "url": "https://api.github.com/repos/filamentphp/actions/zipball/79dce62359b61b755a5e3d8faa0e047a1f92ad9a",
1672
-                "reference": "79dce62359b61b755a5e3d8faa0e047a1f92ad9a",
1675
+                "url": "https://api.github.com/repos/filamentphp/actions/zipball/886108b59ce99edc26f5bc1231134a95ec58718a",
1676
+                "reference": "886108b59ce99edc26f5bc1231134a95ec58718a",
1673
                 "shasum": ""
1677
                 "shasum": ""
1674
             },
1678
             },
1675
             "require": {
1679
             "require": {
1709
                 "issues": "https://github.com/filamentphp/filament/issues",
1713
                 "issues": "https://github.com/filamentphp/filament/issues",
1710
                 "source": "https://github.com/filamentphp/filament"
1714
                 "source": "https://github.com/filamentphp/filament"
1711
             },
1715
             },
1712
-            "time": "2024-10-08T14:24:13+00:00"
1716
+            "time": "2024-10-09T11:19:22+00:00"
1713
         },
1717
         },
1714
         {
1718
         {
1715
             "name": "filament/filament",
1719
             "name": "filament/filament",
1716
-            "version": "v3.2.116",
1720
+            "version": "v3.2.117",
1717
             "source": {
1721
             "source": {
1718
                 "type": "git",
1722
                 "type": "git",
1719
                 "url": "https://github.com/filamentphp/panels.git",
1723
                 "url": "https://github.com/filamentphp/panels.git",
1778
         },
1782
         },
1779
         {
1783
         {
1780
             "name": "filament/forms",
1784
             "name": "filament/forms",
1781
-            "version": "v3.2.116",
1785
+            "version": "v3.2.117",
1782
             "source": {
1786
             "source": {
1783
                 "type": "git",
1787
                 "type": "git",
1784
                 "url": "https://github.com/filamentphp/forms.git",
1788
                 "url": "https://github.com/filamentphp/forms.git",
1785
-                "reference": "94f0c7c66d766efc0f1f5c80e790e2391c7c09d7"
1789
+                "reference": "896c868cca474b2e925a3e6162b7c76d8ff3e5fc"
1786
             },
1790
             },
1787
             "dist": {
1791
             "dist": {
1788
                 "type": "zip",
1792
                 "type": "zip",
1789
-                "url": "https://api.github.com/repos/filamentphp/forms/zipball/94f0c7c66d766efc0f1f5c80e790e2391c7c09d7",
1790
-                "reference": "94f0c7c66d766efc0f1f5c80e790e2391c7c09d7",
1793
+                "url": "https://api.github.com/repos/filamentphp/forms/zipball/896c868cca474b2e925a3e6162b7c76d8ff3e5fc",
1794
+                "reference": "896c868cca474b2e925a3e6162b7c76d8ff3e5fc",
1791
                 "shasum": ""
1795
                 "shasum": ""
1792
             },
1796
             },
1793
             "require": {
1797
             "require": {
1830
                 "issues": "https://github.com/filamentphp/filament/issues",
1834
                 "issues": "https://github.com/filamentphp/filament/issues",
1831
                 "source": "https://github.com/filamentphp/filament"
1835
                 "source": "https://github.com/filamentphp/filament"
1832
             },
1836
             },
1833
-            "time": "2024-10-08T14:24:11+00:00"
1837
+            "time": "2024-10-09T11:19:26+00:00"
1834
         },
1838
         },
1835
         {
1839
         {
1836
             "name": "filament/infolists",
1840
             "name": "filament/infolists",
1837
-            "version": "v3.2.116",
1841
+            "version": "v3.2.117",
1838
             "source": {
1842
             "source": {
1839
                 "type": "git",
1843
                 "type": "git",
1840
                 "url": "https://github.com/filamentphp/infolists.git",
1844
                 "url": "https://github.com/filamentphp/infolists.git",
1885
         },
1889
         },
1886
         {
1890
         {
1887
             "name": "filament/notifications",
1891
             "name": "filament/notifications",
1888
-            "version": "v3.2.116",
1892
+            "version": "v3.2.117",
1889
             "source": {
1893
             "source": {
1890
                 "type": "git",
1894
                 "type": "git",
1891
                 "url": "https://github.com/filamentphp/notifications.git",
1895
                 "url": "https://github.com/filamentphp/notifications.git",
1937
         },
1941
         },
1938
         {
1942
         {
1939
             "name": "filament/support",
1943
             "name": "filament/support",
1940
-            "version": "v3.2.116",
1944
+            "version": "v3.2.117",
1941
             "source": {
1945
             "source": {
1942
                 "type": "git",
1946
                 "type": "git",
1943
                 "url": "https://github.com/filamentphp/support.git",
1947
                 "url": "https://github.com/filamentphp/support.git",
1996
         },
2000
         },
1997
         {
2001
         {
1998
             "name": "filament/tables",
2002
             "name": "filament/tables",
1999
-            "version": "v3.2.116",
2003
+            "version": "v3.2.117",
2000
             "source": {
2004
             "source": {
2001
                 "type": "git",
2005
                 "type": "git",
2002
                 "url": "https://github.com/filamentphp/tables.git",
2006
                 "url": "https://github.com/filamentphp/tables.git",
2048
         },
2052
         },
2049
         {
2053
         {
2050
             "name": "filament/widgets",
2054
             "name": "filament/widgets",
2051
-            "version": "v3.2.116",
2055
+            "version": "v3.2.117",
2052
             "source": {
2056
             "source": {
2053
                 "type": "git",
2057
                 "type": "git",
2054
                 "url": "https://github.com/filamentphp/widgets.git",
2058
                 "url": "https://github.com/filamentphp/widgets.git",
2904
         },
2908
         },
2905
         {
2909
         {
2906
             "name": "laravel/framework",
2910
             "name": "laravel/framework",
2907
-            "version": "v11.27.1",
2911
+            "version": "v11.27.2",
2908
             "source": {
2912
             "source": {
2909
                 "type": "git",
2913
                 "type": "git",
2910
                 "url": "https://github.com/laravel/framework.git",
2914
                 "url": "https://github.com/laravel/framework.git",
2911
-                "reference": "2634ad4a6a71da3288943f058a8abbfec6a65ebb"
2915
+                "reference": "a51d1f2b771c542324a3d9b76a98b1bbc75c0ee9"
2912
             },
2916
             },
2913
             "dist": {
2917
             "dist": {
2914
                 "type": "zip",
2918
                 "type": "zip",
2915
-                "url": "https://api.github.com/repos/laravel/framework/zipball/2634ad4a6a71da3288943f058a8abbfec6a65ebb",
2916
-                "reference": "2634ad4a6a71da3288943f058a8abbfec6a65ebb",
2919
+                "url": "https://api.github.com/repos/laravel/framework/zipball/a51d1f2b771c542324a3d9b76a98b1bbc75c0ee9",
2920
+                "reference": "a51d1f2b771c542324a3d9b76a98b1bbc75c0ee9",
2917
                 "shasum": ""
2921
                 "shasum": ""
2918
             },
2922
             },
2919
             "require": {
2923
             "require": {
3109
                 "issues": "https://github.com/laravel/framework/issues",
3113
                 "issues": "https://github.com/laravel/framework/issues",
3110
                 "source": "https://github.com/laravel/framework"
3114
                 "source": "https://github.com/laravel/framework"
3111
             },
3115
             },
3112
-            "time": "2024-10-08T20:25:59+00:00"
3116
+            "time": "2024-10-09T04:17:35+00:00"
3113
         },
3117
         },
3114
         {
3118
         {
3115
             "name": "laravel/prompts",
3119
             "name": "laravel/prompts",
3622
         },
3626
         },
3623
         {
3627
         {
3624
             "name": "league/csv",
3628
             "name": "league/csv",
3625
-            "version": "9.16.0",
3629
+            "version": "9.17.0",
3626
             "source": {
3630
             "source": {
3627
                 "type": "git",
3631
                 "type": "git",
3628
                 "url": "https://github.com/thephpleague/csv.git",
3632
                 "url": "https://github.com/thephpleague/csv.git",
3629
-                "reference": "998280c6c34bd67d8125fdc8b45bae28d761b440"
3633
+                "reference": "8cab815fb11ec93aa2f7b8a57b3daa1f1a364011"
3630
             },
3634
             },
3631
             "dist": {
3635
             "dist": {
3632
                 "type": "zip",
3636
                 "type": "zip",
3633
-                "url": "https://api.github.com/repos/thephpleague/csv/zipball/998280c6c34bd67d8125fdc8b45bae28d761b440",
3634
-                "reference": "998280c6c34bd67d8125fdc8b45bae28d761b440",
3637
+                "url": "https://api.github.com/repos/thephpleague/csv/zipball/8cab815fb11ec93aa2f7b8a57b3daa1f1a364011",
3638
+                "reference": "8cab815fb11ec93aa2f7b8a57b3daa1f1a364011",
3635
                 "shasum": ""
3639
                 "shasum": ""
3636
             },
3640
             },
3637
             "require": {
3641
             "require": {
3639
                 "php": "^8.1.2"
3643
                 "php": "^8.1.2"
3640
             },
3644
             },
3641
             "require-dev": {
3645
             "require-dev": {
3642
-                "doctrine/collections": "^2.2.2",
3643
                 "ext-dom": "*",
3646
                 "ext-dom": "*",
3644
                 "ext-xdebug": "*",
3647
                 "ext-xdebug": "*",
3645
-                "friendsofphp/php-cs-fixer": "^3.57.1",
3646
-                "phpbench/phpbench": "^1.2.15",
3647
-                "phpstan/phpstan": "^1.11.1",
3648
-                "phpstan/phpstan-deprecation-rules": "^1.2.0",
3648
+                "friendsofphp/php-cs-fixer": "^3.64.0",
3649
+                "phpbench/phpbench": "^1.3.1",
3650
+                "phpstan/phpstan": "^1.12.5",
3651
+                "phpstan/phpstan-deprecation-rules": "^1.2.1",
3649
                 "phpstan/phpstan-phpunit": "^1.4.0",
3652
                 "phpstan/phpstan-phpunit": "^1.4.0",
3650
-                "phpstan/phpstan-strict-rules": "^1.6.0",
3651
-                "phpunit/phpunit": "^10.5.16 || ^11.1.3",
3652
-                "symfony/var-dumper": "^6.4.6 || ^7.0.7"
3653
+                "phpstan/phpstan-strict-rules": "^1.6.1",
3654
+                "phpunit/phpunit": "^10.5.16 || ^11.4.0",
3655
+                "symfony/var-dumper": "^6.4.8 || ^7.1.5"
3653
             },
3656
             },
3654
             "suggest": {
3657
             "suggest": {
3655
                 "ext-dom": "Required to use the XMLConverter and the HTMLConverter classes",
3658
                 "ext-dom": "Required to use the XMLConverter and the HTMLConverter classes",
3667
                     "src/functions_include.php"
3670
                     "src/functions_include.php"
3668
                 ],
3671
                 ],
3669
                 "psr-4": {
3672
                 "psr-4": {
3670
-                    "League\\Csv\\": "src"
3673
+                    "League\\Csv\\": "src/"
3671
                 }
3674
                 }
3672
             },
3675
             },
3673
             "notification-url": "https://packagist.org/downloads/",
3676
             "notification-url": "https://packagist.org/downloads/",
3706
                     "type": "github"
3709
                     "type": "github"
3707
                 }
3710
                 }
3708
             ],
3711
             ],
3709
-            "time": "2024-05-24T11:04:54+00:00"
3712
+            "time": "2024-10-10T10:30:28+00:00"
3710
         },
3713
         },
3711
         {
3714
         {
3712
             "name": "league/flysystem",
3715
             "name": "league/flysystem",
9923
         },
9926
         },
9924
         {
9927
         {
9925
             "name": "pestphp/pest",
9928
             "name": "pestphp/pest",
9926
-            "version": "v3.3.0",
9929
+            "version": "v3.3.2",
9927
             "source": {
9930
             "source": {
9928
                 "type": "git",
9931
                 "type": "git",
9929
                 "url": "https://github.com/pestphp/pest.git",
9932
                 "url": "https://github.com/pestphp/pest.git",
9930
-                "reference": "0a7bff0d246b10040e12e4152215e12a599e742a"
9933
+                "reference": "1513ede73b150b8bcf9def90486e85ecc2bac4e1"
9931
             },
9934
             },
9932
             "dist": {
9935
             "dist": {
9933
                 "type": "zip",
9936
                 "type": "zip",
9934
-                "url": "https://api.github.com/repos/pestphp/pest/zipball/0a7bff0d246b10040e12e4152215e12a599e742a",
9935
-                "reference": "0a7bff0d246b10040e12e4152215e12a599e742a",
9937
+                "url": "https://api.github.com/repos/pestphp/pest/zipball/1513ede73b150b8bcf9def90486e85ecc2bac4e1",
9938
+                "reference": "1513ede73b150b8bcf9def90486e85ecc2bac4e1",
9936
                 "shasum": ""
9939
                 "shasum": ""
9937
             },
9940
             },
9938
             "require": {
9941
             "require": {
9939
-                "brianium/paratest": "^7.5.6",
9942
+                "brianium/paratest": "^7.5.7",
9940
                 "nunomaduro/collision": "^8.4.0",
9943
                 "nunomaduro/collision": "^8.4.0",
9941
                 "nunomaduro/termwind": "^2.1.0",
9944
                 "nunomaduro/termwind": "^2.1.0",
9942
                 "pestphp/pest-plugin": "^3.0.0",
9945
                 "pestphp/pest-plugin": "^3.0.0",
9943
                 "pestphp/pest-plugin-arch": "^3.0.0",
9946
                 "pestphp/pest-plugin-arch": "^3.0.0",
9944
                 "pestphp/pest-plugin-mutate": "^3.0.5",
9947
                 "pestphp/pest-plugin-mutate": "^3.0.5",
9945
                 "php": "^8.2.0",
9948
                 "php": "^8.2.0",
9946
-                "phpunit/phpunit": "^11.4.0"
9949
+                "phpunit/phpunit": "^11.4.1"
9947
             },
9950
             },
9948
             "conflict": {
9951
             "conflict": {
9949
-                "phpunit/phpunit": ">11.4.0",
9952
+                "phpunit/phpunit": ">11.4.1",
9950
                 "sebastian/exporter": "<6.0.0",
9953
                 "sebastian/exporter": "<6.0.0",
9951
                 "webmozart/assert": "<1.11.0"
9954
                 "webmozart/assert": "<1.11.0"
9952
             },
9955
             },
9953
             "require-dev": {
9956
             "require-dev": {
9954
-                "pestphp/pest-dev-tools": "^3.0.0",
9957
+                "pestphp/pest-dev-tools": "^3.2.0",
9955
                 "pestphp/pest-plugin-type-coverage": "^3.1.0",
9958
                 "pestphp/pest-plugin-type-coverage": "^3.1.0",
9956
                 "symfony/process": "^7.1.5"
9959
                 "symfony/process": "^7.1.5"
9957
             },
9960
             },
10018
             ],
10021
             ],
10019
             "support": {
10022
             "support": {
10020
                 "issues": "https://github.com/pestphp/pest/issues",
10023
                 "issues": "https://github.com/pestphp/pest/issues",
10021
-                "source": "https://github.com/pestphp/pest/tree/v3.3.0"
10024
+                "source": "https://github.com/pestphp/pest/tree/v3.3.2"
10022
             },
10025
             },
10023
             "funding": [
10026
             "funding": [
10024
                 {
10027
                 {
10030
                     "type": "github"
10033
                     "type": "github"
10031
                 }
10034
                 }
10032
             ],
10035
             ],
10033
-            "time": "2024-10-06T18:25:27+00:00"
10036
+            "time": "2024-10-12T11:36:44+00:00"
10034
         },
10037
         },
10035
         {
10038
         {
10036
             "name": "pestphp/pest-plugin",
10039
             "name": "pestphp/pest-plugin",
10838
         },
10841
         },
10839
         {
10842
         {
10840
             "name": "phpunit/php-code-coverage",
10843
             "name": "phpunit/php-code-coverage",
10841
-            "version": "11.0.6",
10844
+            "version": "11.0.7",
10842
             "source": {
10845
             "source": {
10843
                 "type": "git",
10846
                 "type": "git",
10844
                 "url": "https://github.com/sebastianbergmann/php-code-coverage.git",
10847
                 "url": "https://github.com/sebastianbergmann/php-code-coverage.git",
10845
-                "reference": "ebdffc9e09585dafa71b9bffcdb0a229d4704c45"
10848
+                "reference": "f7f08030e8811582cc459871d28d6f5a1a4d35ca"
10846
             },
10849
             },
10847
             "dist": {
10850
             "dist": {
10848
                 "type": "zip",
10851
                 "type": "zip",
10849
-                "url": "https://api.github.com/repos/sebastianbergmann/php-code-coverage/zipball/ebdffc9e09585dafa71b9bffcdb0a229d4704c45",
10850
-                "reference": "ebdffc9e09585dafa71b9bffcdb0a229d4704c45",
10852
+                "url": "https://api.github.com/repos/sebastianbergmann/php-code-coverage/zipball/f7f08030e8811582cc459871d28d6f5a1a4d35ca",
10853
+                "reference": "f7f08030e8811582cc459871d28d6f5a1a4d35ca",
10851
                 "shasum": ""
10854
                 "shasum": ""
10852
             },
10855
             },
10853
             "require": {
10856
             "require": {
10854
                 "ext-dom": "*",
10857
                 "ext-dom": "*",
10855
                 "ext-libxml": "*",
10858
                 "ext-libxml": "*",
10856
                 "ext-xmlwriter": "*",
10859
                 "ext-xmlwriter": "*",
10857
-                "nikic/php-parser": "^5.1.0",
10860
+                "nikic/php-parser": "^5.3.1",
10858
                 "php": ">=8.2",
10861
                 "php": ">=8.2",
10859
-                "phpunit/php-file-iterator": "^5.0.1",
10862
+                "phpunit/php-file-iterator": "^5.1.0",
10860
                 "phpunit/php-text-template": "^4.0.1",
10863
                 "phpunit/php-text-template": "^4.0.1",
10861
                 "sebastian/code-unit-reverse-lookup": "^4.0.1",
10864
                 "sebastian/code-unit-reverse-lookup": "^4.0.1",
10862
                 "sebastian/complexity": "^4.0.1",
10865
                 "sebastian/complexity": "^4.0.1",
10863
                 "sebastian/environment": "^7.2.0",
10866
                 "sebastian/environment": "^7.2.0",
10864
                 "sebastian/lines-of-code": "^3.0.1",
10867
                 "sebastian/lines-of-code": "^3.0.1",
10865
-                "sebastian/version": "^5.0.1",
10868
+                "sebastian/version": "^5.0.2",
10866
                 "theseer/tokenizer": "^1.2.3"
10869
                 "theseer/tokenizer": "^1.2.3"
10867
             },
10870
             },
10868
             "require-dev": {
10871
             "require-dev": {
10869
-                "phpunit/phpunit": "^11.0"
10872
+                "phpunit/phpunit": "^11.4.1"
10870
             },
10873
             },
10871
             "suggest": {
10874
             "suggest": {
10872
                 "ext-pcov": "PHP extension that provides line coverage",
10875
                 "ext-pcov": "PHP extension that provides line coverage",
10904
             "support": {
10907
             "support": {
10905
                 "issues": "https://github.com/sebastianbergmann/php-code-coverage/issues",
10908
                 "issues": "https://github.com/sebastianbergmann/php-code-coverage/issues",
10906
                 "security": "https://github.com/sebastianbergmann/php-code-coverage/security/policy",
10909
                 "security": "https://github.com/sebastianbergmann/php-code-coverage/security/policy",
10907
-                "source": "https://github.com/sebastianbergmann/php-code-coverage/tree/11.0.6"
10910
+                "source": "https://github.com/sebastianbergmann/php-code-coverage/tree/11.0.7"
10908
             },
10911
             },
10909
             "funding": [
10912
             "funding": [
10910
                 {
10913
                 {
10912
                     "type": "github"
10915
                     "type": "github"
10913
                 }
10916
                 }
10914
             ],
10917
             ],
10915
-            "time": "2024-08-22T04:37:56+00:00"
10918
+            "time": "2024-10-09T06:21:38+00:00"
10916
         },
10919
         },
10917
         {
10920
         {
10918
             "name": "phpunit/php-file-iterator",
10921
             "name": "phpunit/php-file-iterator",
11161
         },
11164
         },
11162
         {
11165
         {
11163
             "name": "phpunit/phpunit",
11166
             "name": "phpunit/phpunit",
11164
-            "version": "11.4.0",
11167
+            "version": "11.4.1",
11165
             "source": {
11168
             "source": {
11166
                 "type": "git",
11169
                 "type": "git",
11167
                 "url": "https://github.com/sebastianbergmann/phpunit.git",
11170
                 "url": "https://github.com/sebastianbergmann/phpunit.git",
11168
-                "reference": "89fe0c530133c08f7fff89d3d727154e4e504925"
11171
+                "reference": "7875627f15f4da7e7f0823d1f323f7295a77334e"
11169
             },
11172
             },
11170
             "dist": {
11173
             "dist": {
11171
                 "type": "zip",
11174
                 "type": "zip",
11172
-                "url": "https://api.github.com/repos/sebastianbergmann/phpunit/zipball/89fe0c530133c08f7fff89d3d727154e4e504925",
11173
-                "reference": "89fe0c530133c08f7fff89d3d727154e4e504925",
11175
+                "url": "https://api.github.com/repos/sebastianbergmann/phpunit/zipball/7875627f15f4da7e7f0823d1f323f7295a77334e",
11176
+                "reference": "7875627f15f4da7e7f0823d1f323f7295a77334e",
11174
                 "shasum": ""
11177
                 "shasum": ""
11175
             },
11178
             },
11176
             "require": {
11179
             "require": {
11241
             "support": {
11244
             "support": {
11242
                 "issues": "https://github.com/sebastianbergmann/phpunit/issues",
11245
                 "issues": "https://github.com/sebastianbergmann/phpunit/issues",
11243
                 "security": "https://github.com/sebastianbergmann/phpunit/security/policy",
11246
                 "security": "https://github.com/sebastianbergmann/phpunit/security/policy",
11244
-                "source": "https://github.com/sebastianbergmann/phpunit/tree/11.4.0"
11247
+                "source": "https://github.com/sebastianbergmann/phpunit/tree/11.4.1"
11245
             },
11248
             },
11246
             "funding": [
11249
             "funding": [
11247
                 {
11250
                 {
11257
                     "type": "tidelift"
11260
                     "type": "tidelift"
11258
                 }
11261
                 }
11259
             ],
11262
             ],
11260
-            "time": "2024-10-05T08:39:03+00:00"
11263
+            "time": "2024-10-08T15:38:37+00:00"
11261
         },
11264
         },
11262
         {
11265
         {
11263
             "name": "rector/rector",
11266
             "name": "rector/rector",
11264
-            "version": "1.2.6",
11267
+            "version": "1.2.7",
11265
             "source": {
11268
             "source": {
11266
                 "type": "git",
11269
                 "type": "git",
11267
                 "url": "https://github.com/rectorphp/rector.git",
11270
                 "url": "https://github.com/rectorphp/rector.git",
11268
-                "reference": "6ca85da28159dbd3bb36211c5104b7bc91278e99"
11271
+                "reference": "5b33bdd871895276e2c18e5410a4a57df9233ee0"
11269
             },
11272
             },
11270
             "dist": {
11273
             "dist": {
11271
                 "type": "zip",
11274
                 "type": "zip",
11272
-                "url": "https://api.github.com/repos/rectorphp/rector/zipball/6ca85da28159dbd3bb36211c5104b7bc91278e99",
11273
-                "reference": "6ca85da28159dbd3bb36211c5104b7bc91278e99",
11275
+                "url": "https://api.github.com/repos/rectorphp/rector/zipball/5b33bdd871895276e2c18e5410a4a57df9233ee0",
11276
+                "reference": "5b33bdd871895276e2c18e5410a4a57df9233ee0",
11274
                 "shasum": ""
11277
                 "shasum": ""
11275
             },
11278
             },
11276
             "require": {
11279
             "require": {
11308
             ],
11311
             ],
11309
             "support": {
11312
             "support": {
11310
                 "issues": "https://github.com/rectorphp/rector/issues",
11313
                 "issues": "https://github.com/rectorphp/rector/issues",
11311
-                "source": "https://github.com/rectorphp/rector/tree/1.2.6"
11314
+                "source": "https://github.com/rectorphp/rector/tree/1.2.7"
11312
             },
11315
             },
11313
             "funding": [
11316
             "funding": [
11314
                 {
11317
                 {
11316
                     "type": "github"
11319
                     "type": "github"
11317
                 }
11320
                 }
11318
             ],
11321
             ],
11319
-            "time": "2024-10-03T08:56:44+00:00"
11322
+            "time": "2024-10-12T11:12:46+00:00"
11320
         },
11323
         },
11321
         {
11324
         {
11322
             "name": "sebastian/cli-parser",
11325
             "name": "sebastian/cli-parser",
12189
         },
12192
         },
12190
         {
12193
         {
12191
             "name": "sebastian/version",
12194
             "name": "sebastian/version",
12192
-            "version": "5.0.1",
12195
+            "version": "5.0.2",
12193
             "source": {
12196
             "source": {
12194
                 "type": "git",
12197
                 "type": "git",
12195
                 "url": "https://github.com/sebastianbergmann/version.git",
12198
                 "url": "https://github.com/sebastianbergmann/version.git",
12196
-                "reference": "45c9debb7d039ce9b97de2f749c2cf5832a06ac4"
12199
+                "reference": "c687e3387b99f5b03b6caa64c74b63e2936ff874"
12197
             },
12200
             },
12198
             "dist": {
12201
             "dist": {
12199
                 "type": "zip",
12202
                 "type": "zip",
12200
-                "url": "https://api.github.com/repos/sebastianbergmann/version/zipball/45c9debb7d039ce9b97de2f749c2cf5832a06ac4",
12201
-                "reference": "45c9debb7d039ce9b97de2f749c2cf5832a06ac4",
12203
+                "url": "https://api.github.com/repos/sebastianbergmann/version/zipball/c687e3387b99f5b03b6caa64c74b63e2936ff874",
12204
+                "reference": "c687e3387b99f5b03b6caa64c74b63e2936ff874",
12202
                 "shasum": ""
12205
                 "shasum": ""
12203
             },
12206
             },
12204
             "require": {
12207
             "require": {
12231
             "support": {
12234
             "support": {
12232
                 "issues": "https://github.com/sebastianbergmann/version/issues",
12235
                 "issues": "https://github.com/sebastianbergmann/version/issues",
12233
                 "security": "https://github.com/sebastianbergmann/version/security/policy",
12236
                 "security": "https://github.com/sebastianbergmann/version/security/policy",
12234
-                "source": "https://github.com/sebastianbergmann/version/tree/5.0.1"
12237
+                "source": "https://github.com/sebastianbergmann/version/tree/5.0.2"
12235
             },
12238
             },
12236
             "funding": [
12239
             "funding": [
12237
                 {
12240
                 {
12239
                     "type": "github"
12242
                     "type": "github"
12240
                 }
12243
                 }
12241
             ],
12244
             ],
12242
-            "time": "2024-07-03T05:13:08+00:00"
12245
+            "time": "2024-10-09T05:16:32+00:00"
12243
         },
12246
         },
12244
         {
12247
         {
12245
             "name": "spatie/backtrace",
12248
             "name": "spatie/backtrace",

+ 9
- 9
package-lock.json Parādīt failu

998
             }
998
             }
999
         },
999
         },
1000
         "node_modules/caniuse-lite": {
1000
         "node_modules/caniuse-lite": {
1001
-            "version": "1.0.30001667",
1002
-            "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001667.tgz",
1003
-            "integrity": "sha512-7LTwJjcRkzKFmtqGsibMeuXmvFDfZq/nzIjnmgCGzKKRVzjD72selLDK1oPF/Oxzmt4fNcPvTDvGqSDG4tCALw==",
1001
+            "version": "1.0.30001668",
1002
+            "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001668.tgz",
1003
+            "integrity": "sha512-nWLrdxqCdblixUO+27JtGJJE/txpJlyUy5YN1u53wLZkP0emYCo5zgS6QYft7VUYR42LGgi/S5hdLZTrnyIddw==",
1004
             "dev": true,
1004
             "dev": true,
1005
             "funding": [
1005
             "funding": [
1006
                 {
1006
                 {
1159
             "license": "MIT"
1159
             "license": "MIT"
1160
         },
1160
         },
1161
         "node_modules/electron-to-chromium": {
1161
         "node_modules/electron-to-chromium": {
1162
-            "version": "1.5.33",
1163
-            "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.33.tgz",
1164
-            "integrity": "sha512-+cYTcFB1QqD4j4LegwLfpCNxifb6dDFUAwk6RsLusCwIaZI6or2f+q8rs5tTB2YC53HhOlIbEaqHMAAC8IOIwA==",
1162
+            "version": "1.5.36",
1163
+            "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.36.tgz",
1164
+            "integrity": "sha512-HYTX8tKge/VNp6FGO+f/uVDmUkq+cEfcxYhKf15Akc4M5yxt5YmorwlAitKWjWhWQnKcDRBAQKXkhqqXMqcrjw==",
1165
             "dev": true,
1165
             "dev": true,
1166
             "license": "ISC"
1166
             "license": "ISC"
1167
         },
1167
         },
1313
             }
1313
             }
1314
         },
1314
         },
1315
         "node_modules/form-data": {
1315
         "node_modules/form-data": {
1316
-            "version": "4.0.0",
1317
-            "resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.0.tgz",
1318
-            "integrity": "sha512-ETEklSGi5t0QMZuiXoA/Q6vcnxcLQP5vdugSpuAyi6SVGi2clPPp+xgEhuMaHC+zGgn31Kd235W35f7Hykkaww==",
1316
+            "version": "4.0.1",
1317
+            "resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.1.tgz",
1318
+            "integrity": "sha512-tzN8e4TX8+kkxGPK8D5u0FNmjPUjw3lwC9lSLxxoB/+GtsJG91CO8bSWy73APlgAZzZbXEYZJuxjkHH2w+Ezhw==",
1319
             "dev": true,
1319
             "dev": true,
1320
             "license": "MIT",
1320
             "license": "MIT",
1321
             "dependencies": {
1321
             "dependencies": {

+ 123
- 0
resources/views/components/company/tables/reports/balance-sheet.blade.php Parādīt failu

1
+<table class="w-full table-auto divide-y divide-gray-200 dark:divide-white/5">
2
+    <thead class="divide-y divide-gray-200 dark:divide-white/5">
3
+    <tr class="bg-gray-50 dark:bg-white/5">
4
+        @foreach($report->getHeaders() as $index => $header)
5
+            <th class="px-3 py-3.5 sm:first-of-type:ps-6 sm:last-of-type:pe-6 {{ $report->getAlignmentClass($index) }}">
6
+                <span class="text-sm font-semibold text-gray-950 dark:text-white">
7
+                    {{ $header }}
8
+                </span>
9
+            </th>
10
+        @endforeach
11
+    </tr>
12
+    </thead>
13
+    @foreach($report->getCategories() as $categoryIndex => $category)
14
+        @ray($category)
15
+        <tbody class="divide-y divide-gray-200 whitespace-nowrap dark:divide-white/5">
16
+        <tr class="bg-gray-50 dark:bg-white/5">
17
+            @foreach($category->header as $headerIndex => $header)
18
+                <x-filament-tables::cell class="{{ $report->getAlignmentClass($headerIndex) }}">
19
+                    <div class="px-3 py-2 text-sm font-semibold text-gray-950 dark:text-white">
20
+                        {{ $header }}
21
+                    </div>
22
+                </x-filament-tables::cell>
23
+            @endforeach
24
+        </tr>
25
+        @foreach($category->types as $subcategory)
26
+            <tr class="bg-gray-50 dark:bg-white/5">
27
+                @foreach($subcategory->header as $headerIndex => $header)
28
+                    <x-filament-tables::cell class="{{ $report->getAlignmentClass($headerIndex) }}"
29
+                                             style="padding-left: 2rem;">
30
+                        <div class="px-3 py-2 text-sm font-semibold text-gray-950 dark:text-white">
31
+                            {{ $header }}
32
+                        </div>
33
+                    </x-filament-tables::cell>
34
+                @endforeach
35
+            </tr>
36
+            @foreach($subcategory->data as $dataIndex => $account)
37
+                <tr>
38
+                    @foreach($account as $cellIndex => $cell)
39
+                        <x-filament-tables::cell class="{{ $report->getAlignmentClass($cellIndex) }}"
40
+                                                 style="padding-left: 2rem;">
41
+                            <div class="px-3 py-4 text-sm leading-6 text-gray-950 dark:text-white">
42
+                                @if(is_array($cell) && isset($cell['name']))
43
+                                    @if($cell['name'] === 'Retained Earnings' && isset($cell['start_date']) && isset($cell['end_date']))
44
+                                        <x-filament::link
45
+                                            color="primary"
46
+                                            target="_blank"
47
+                                            icon="heroicon-o-arrow-top-right-on-square"
48
+                                            :icon-position="\Filament\Support\Enums\IconPosition::After"
49
+                                            :icon-size="\Filament\Support\Enums\IconSize::Small"
50
+                                            href="{{ \App\Filament\Company\Pages\Reports\IncomeStatement::getUrl([
51
+                                            'startDate' => $cell['start_date'],
52
+                                            'endDate' => $cell['end_date']
53
+                                        ]) }}"
54
+                                        >
55
+                                            {{ $cell['name'] }}
56
+                                        </x-filament::link>
57
+                                    @elseif(isset($cell['id']) && isset($cell['start_date']) && isset($cell['end_date']))
58
+                                        <x-filament::link
59
+                                            color="primary"
60
+                                            target="_blank"
61
+                                            icon="heroicon-o-arrow-top-right-on-square"
62
+                                            :icon-position="\Filament\Support\Enums\IconPosition::After"
63
+                                            :icon-size="\Filament\Support\Enums\IconSize::Small"
64
+                                            href="{{ \App\Filament\Company\Pages\Reports\AccountTransactions::getUrl([
65
+                                            'startDate' => $cell['start_date'],
66
+                                            'endDate' => $cell['end_date'],
67
+                                            'selectedAccount' => $cell['id']
68
+                                        ]) }}"
69
+                                        >
70
+                                            {{ $cell['name'] }}
71
+                                        </x-filament::link>
72
+                                    @else
73
+                                        {{ $cell['name'] }}
74
+                                    @endif
75
+                                @else
76
+                                    {{ $cell }}
77
+                                @endif
78
+                            </div>
79
+                        </x-filament-tables::cell>
80
+                    @endforeach
81
+                </tr>
82
+            @endforeach
83
+            <tr>
84
+                @foreach($subcategory->summary as $summaryIndex => $cell)
85
+                    <x-filament-tables::cell class="{{ $report->getAlignmentClass($summaryIndex) }}"
86
+                                             style="padding-left: 2rem;">
87
+                        <div class="px-3 py-2 text-sm leading-6 font-semibold text-gray-950 dark:text-white">
88
+                            {{ $cell }}
89
+                        </div>
90
+                    </x-filament-tables::cell>
91
+                @endforeach
92
+            </tr>
93
+        @endforeach
94
+        <tr>
95
+            @foreach($category->summary as $summaryIndex => $cell)
96
+                <x-filament-tables::cell class="{{ $report->getAlignmentClass($summaryIndex) }}">
97
+                    <div class="px-3 py-2 text-sm leading-6 font-semibold text-gray-950 dark:text-white">
98
+                        {{ $cell }}
99
+                    </div>
100
+                </x-filament-tables::cell>
101
+            @endforeach
102
+        </tr>
103
+        <tr>
104
+            <x-filament-tables::cell colspan="{{ count($report->getHeaders()) }}">
105
+                <div class="px-3 py-2 leading-6 invisible">Hidden Text</div>
106
+            </x-filament-tables::cell>
107
+        </tr>
108
+        </tbody>
109
+    @endforeach
110
+    @if(! empty($report->getOverallTotals()))
111
+        <tfoot>
112
+        <tr class="bg-gray-50 dark:bg-white/5">
113
+            @foreach($report->getOverallTotals() as $index => $total)
114
+                <x-filament-tables::cell class="{{ $report->getAlignmentClass($index) }}">
115
+                    <div class="px-3 py-2 text-sm leading-6 font-semibold text-gray-950 dark:text-white">
116
+                        {{ $total }}
117
+                    </div>
118
+                </x-filament-tables::cell>
119
+            @endforeach
120
+        </tr>
121
+        </tfoot>
122
+    @endif
123
+</table>

+ 13
- 11
resources/views/components/company/tables/reports/detailed-report.blade.php Parādīt failu

83
         </tr>
83
         </tr>
84
         </tbody>
84
         </tbody>
85
     @endforeach
85
     @endforeach
86
-    <tfoot>
87
-    <tr class="bg-gray-50 dark:bg-white/5">
88
-        @foreach($report->getOverallTotals() as $index => $total)
89
-            <x-filament-tables::cell class="{{ $report->getAlignmentClass($index) }}">
90
-                <div class="px-3 py-2 text-sm leading-6 font-semibold text-gray-950 dark:text-white">
91
-                    {{ $total }}
92
-                </div>
93
-            </x-filament-tables::cell>
94
-        @endforeach
95
-    </tr>
96
-    </tfoot>
86
+    @if(! empty($report->getOverallTotals()))
87
+        <tfoot>
88
+        <tr class="bg-gray-50 dark:bg-white/5">
89
+            @foreach($report->getOverallTotals() as $index => $total)
90
+                <x-filament-tables::cell class="{{ $report->getAlignmentClass($index) }}">
91
+                    <div class="px-3 py-2 text-sm leading-6 font-semibold text-gray-950 dark:text-white">
92
+                        {{ $total }}
93
+                    </div>
94
+                </x-filament-tables::cell>
95
+            @endforeach
96
+        </tr>
97
+        </tfoot>
98
+    @endif
97
 </table>
99
 </table>

+ 84
- 0
resources/views/filament/company/pages/reports/balance-sheet.blade.php Parādīt failu

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
+
26
+    <x-filament::section>
27
+        <!-- Summary Section -->
28
+        @if($this->reportLoaded)
29
+            <div
30
+                class="flex flex-col md:flex-row items-center md:items-end text-center justify-center gap-4 md:gap-8">
31
+                @foreach($this->report->getSummary() as $summary)
32
+                    <div class="text-sm">
33
+                        <div class="text-gray-600 font-medium mb-2">{{ $summary['label'] }}</div>
34
+
35
+                        @php
36
+                            $isNetAssets = $summary['label'] === 'Net Assets';
37
+                            $isPositive = money($summary['value'], \App\Utilities\Currency\CurrencyAccessor::getDefaultCurrency())->isPositive();
38
+                        @endphp
39
+
40
+                        <strong
41
+                            @class([
42
+                                'text-lg',
43
+                                'text-green-700' => $isNetAssets && $isPositive,
44
+                                'text-danger-700' => $isNetAssets && ! $isPositive,
45
+                            ])
46
+                        >
47
+                            {{ $summary['value'] }}
48
+                        </strong>
49
+                    </div>
50
+
51
+                    @if(! $loop->last)
52
+                        <div class="flex items-center justify-center px-2">
53
+                            <strong class="text-lg">
54
+                                {{ $loop->remaining === 1 ? '=' : '-' }}
55
+                            </strong>
56
+                        </div>
57
+                    @endif
58
+                @endforeach
59
+            </div>
60
+        @endif
61
+    </x-filament::section>
62
+
63
+    <x-filament-tables::container>
64
+        <div class="es-table__header-ctn"></div>
65
+        <div
66
+            class="relative divide-y divide-gray-200 overflow-x-auto dark:divide-white/10 dark:border-t-white/10 min-h-64">
67
+            <div wire:init="applyFilters" class="flex items-center justify-center w-full h-full absolute">
68
+                <div wire:loading wire:target="applyFilters">
69
+                    <x-filament::loading-indicator class="p-6 text-primary-700 dark:text-primary-300"/>
70
+                </div>
71
+            </div>
72
+
73
+            @if($this->reportLoaded)
74
+                <div wire:loading.remove wire:target="applyFilters">
75
+                    @if($this->report)
76
+                        <x-company.tables.reports.balance-sheet :report="$this->report"/>
77
+                    @endif
78
+                </div>
79
+            @endif
80
+        </div>
81
+        <div class="es-table__footer-ctn border-t border-gray-200"></div>
82
+    </x-filament-tables::container>
83
+</x-filament-panels::page>
84
+

Notiek ielāde…
Atcelt
Saglabāt