Andrew Wallo 1 yıl önce
ebeveyn
işleme
7f43f070df

+ 5
- 3
app/DTO/AccountCategoryDTO.php Dosyayı Görüntüle

@@ -5,10 +5,12 @@ namespace App\DTO;
5 5
 class AccountCategoryDTO
6 6
 {
7 7
     /**
8
-     * @param  AccountDTO[]  $accounts
8
+     * @param  AccountDTO[]|null  $accounts
9
+     * @param  AccountTypeDTO[]|null  $types
9 10
      */
10 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 Dosyayı Görüntüle

@@ -0,0 +1,14 @@
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 Dosyayı Görüntüle

@@ -4,9 +4,15 @@ namespace App\DTO;
4 4
 
5 5
 class ReportCategoryDTO
6 6
 {
7
+    /**
8
+     * ReportCategoryDTO constructor.
9
+     *
10
+     * @param  ReportTypeDTO[]|null  $types
11
+     */
7 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 Dosyayı Görüntüle

@@ -0,0 +1,12 @@
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 Dosyayı Görüntüle

@@ -45,6 +45,28 @@ enum AccountType: string implements HasLabel
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 70
     public function getCategory(): AccountCategory
49 71
     {
50 72
         return match ($this) {

+ 2
- 1
app/Filament/Company/Pages/Reports.php Dosyayı Görüntüle

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

+ 83
- 0
app/Filament/Company/Pages/Reports/BalanceSheet.php Dosyayı Görüntüle

@@ -0,0 +1,83 @@
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 Dosyayı Görüntüle

@@ -138,6 +138,7 @@ class AccountService
138 138
                 'accounts.id',
139 139
                 'accounts.name',
140 140
                 'accounts.category',
141
+                'accounts.type',
141 142
                 'accounts.subtype_id',
142 143
                 'accounts.currency_code',
143 144
                 'accounts.code',

+ 126
- 6
app/Services/ReportService.php Dosyayı Görüntüle

@@ -6,6 +6,7 @@ use App\DTO\AccountBalanceDTO;
6 6
 use App\DTO\AccountCategoryDTO;
7 7
 use App\DTO\AccountDTO;
8 8
 use App\DTO\AccountTransactionDTO;
9
+use App\DTO\AccountTypeDTO;
9 10
 use App\DTO\ReportDTO;
10 11
 use App\Enums\Accounting\AccountCategory;
11 12
 use App\Models\Accounting\Account;
@@ -86,8 +87,8 @@ class ReportService
86 87
             $formattedCategorySummaryBalances = $this->formatBalances($categorySummaryBalances);
87 88
 
88 89
             $accountCategories[$category->getPluralLabel()] = new AccountCategoryDTO(
89
-                $categoryAccounts,
90
-                $formattedCategorySummaryBalances,
90
+                accounts: $categoryAccounts,
91
+                summary: $formattedCategorySummaryBalances,
91 92
             );
92 93
         }
93 94
 
@@ -305,8 +306,8 @@ class ReportService
305 306
             $formattedCategorySummaryBalances = $this->formatBalances($categorySummaryBalances);
306 307
 
307 308
             $accountCategories[$category->getPluralLabel()] = new AccountCategoryDTO(
308
-                $categoryAccounts,
309
-                $formattedCategorySummaryBalances,
309
+                accounts: $categoryAccounts,
310
+                summary: $formattedCategorySummaryBalances,
310 311
             );
311 312
         }
312 313
 
@@ -417,8 +418,8 @@ class ReportService
417 418
             }
418 419
 
419 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,4 +430,123 @@ class ReportService
429 430
 
430 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 Dosyayı Görüntüle

@@ -0,0 +1,147 @@
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 Dosyayı Görüntüle

@@ -497,16 +497,16 @@
497 497
         },
498 498
         {
499 499
             "name": "aws/aws-sdk-php",
500
-            "version": "3.323.3",
500
+            "version": "3.324.1",
501 501
             "source": {
502 502
                 "type": "git",
503 503
                 "url": "https://github.com/aws/aws-sdk-php.git",
504
-                "reference": "9dec2a6453bdb32b3abeb475fc63b46ba1cbd996"
504
+                "reference": "5b824a9b8015a38f18c53b023975c0f63c7bd3dc"
505 505
             },
506 506
             "dist": {
507 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 510
                 "shasum": ""
511 511
             },
512 512
             "require": {
@@ -589,9 +589,9 @@
589 589
             "support": {
590 590
                 "forum": "https://forums.aws.amazon.com/forum.jspa?forumID=80",
591 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 597
             "name": "aws/aws-sdk-php-laravel",
@@ -1209,16 +1209,16 @@
1209 1209
         },
1210 1210
         {
1211 1211
             "name": "doctrine/dbal",
1212
-            "version": "4.1.1",
1212
+            "version": "4.2.1",
1213 1213
             "source": {
1214 1214
                 "type": "git",
1215 1215
                 "url": "https://github.com/doctrine/dbal.git",
1216
-                "reference": "7a8252418689feb860ea8dfeab66d64a56a64df8"
1216
+                "reference": "dadd35300837a3a2184bd47d403333b15d0a9bd0"
1217 1217
             },
1218 1218
             "dist": {
1219 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 1222
                 "shasum": ""
1223 1223
             },
1224 1224
             "require": {
@@ -1231,7 +1231,7 @@
1231 1231
                 "doctrine/coding-standard": "12.0.0",
1232 1232
                 "fig/log-test": "^1",
1233 1233
                 "jetbrains/phpstorm-stubs": "2023.2",
1234
-                "phpstan/phpstan": "1.12.0",
1234
+                "phpstan/phpstan": "1.12.6",
1235 1235
                 "phpstan/phpstan-phpunit": "1.4.0",
1236 1236
                 "phpstan/phpstan-strict-rules": "^1.6",
1237 1237
                 "phpunit/phpunit": "10.5.30",
@@ -1297,7 +1297,7 @@
1297 1297
             ],
1298 1298
             "support": {
1299 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 1302
             "funding": [
1303 1303
                 {
@@ -1313,7 +1313,7 @@
1313 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 1319
             "name": "doctrine/deprecations",
@@ -1532,16 +1532,16 @@
1532 1532
         },
1533 1533
         {
1534 1534
             "name": "dragonmantank/cron-expression",
1535
-            "version": "v3.3.3",
1535
+            "version": "v3.4.0",
1536 1536
             "source": {
1537 1537
                 "type": "git",
1538 1538
                 "url": "https://github.com/dragonmantank/cron-expression.git",
1539
-                "reference": "adfb1f505deb6384dc8b39804c5065dd3c8c8c0a"
1539
+                "reference": "8c784d071debd117328803d86b2097615b457500"
1540 1540
             },
1541 1541
             "dist": {
1542 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 1545
                 "shasum": ""
1546 1546
             },
1547 1547
             "require": {
@@ -1554,10 +1554,14 @@
1554 1554
             "require-dev": {
1555 1555
                 "phpstan/extension-installer": "^1.0",
1556 1556
                 "phpstan/phpstan": "^1.0",
1557
-                "phpstan/phpstan-webmozart-assert": "^1.0",
1558 1557
                 "phpunit/phpunit": "^7.0|^8.0|^9.0"
1559 1558
             },
1560 1559
             "type": "library",
1560
+            "extra": {
1561
+                "branch-alias": {
1562
+                    "dev-master": "3.x-dev"
1563
+                }
1564
+            },
1561 1565
             "autoload": {
1562 1566
                 "psr-4": {
1563 1567
                     "Cron\\": "src/Cron/"
@@ -1581,7 +1585,7 @@
1581 1585
             ],
1582 1586
             "support": {
1583 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 1590
             "funding": [
1587 1591
                 {
@@ -1589,7 +1593,7 @@
1589 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 1599
             "name": "egulias/email-validator",
@@ -1660,16 +1664,16 @@
1660 1664
         },
1661 1665
         {
1662 1666
             "name": "filament/actions",
1663
-            "version": "v3.2.116",
1667
+            "version": "v3.2.117",
1664 1668
             "source": {
1665 1669
                 "type": "git",
1666 1670
                 "url": "https://github.com/filamentphp/actions.git",
1667
-                "reference": "79dce62359b61b755a5e3d8faa0e047a1f92ad9a"
1671
+                "reference": "886108b59ce99edc26f5bc1231134a95ec58718a"
1668 1672
             },
1669 1673
             "dist": {
1670 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 1677
                 "shasum": ""
1674 1678
             },
1675 1679
             "require": {
@@ -1709,11 +1713,11 @@
1709 1713
                 "issues": "https://github.com/filamentphp/filament/issues",
1710 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 1719
             "name": "filament/filament",
1716
-            "version": "v3.2.116",
1720
+            "version": "v3.2.117",
1717 1721
             "source": {
1718 1722
                 "type": "git",
1719 1723
                 "url": "https://github.com/filamentphp/panels.git",
@@ -1778,16 +1782,16 @@
1778 1782
         },
1779 1783
         {
1780 1784
             "name": "filament/forms",
1781
-            "version": "v3.2.116",
1785
+            "version": "v3.2.117",
1782 1786
             "source": {
1783 1787
                 "type": "git",
1784 1788
                 "url": "https://github.com/filamentphp/forms.git",
1785
-                "reference": "94f0c7c66d766efc0f1f5c80e790e2391c7c09d7"
1789
+                "reference": "896c868cca474b2e925a3e6162b7c76d8ff3e5fc"
1786 1790
             },
1787 1791
             "dist": {
1788 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 1795
                 "shasum": ""
1792 1796
             },
1793 1797
             "require": {
@@ -1830,11 +1834,11 @@
1830 1834
                 "issues": "https://github.com/filamentphp/filament/issues",
1831 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 1840
             "name": "filament/infolists",
1837
-            "version": "v3.2.116",
1841
+            "version": "v3.2.117",
1838 1842
             "source": {
1839 1843
                 "type": "git",
1840 1844
                 "url": "https://github.com/filamentphp/infolists.git",
@@ -1885,7 +1889,7 @@
1885 1889
         },
1886 1890
         {
1887 1891
             "name": "filament/notifications",
1888
-            "version": "v3.2.116",
1892
+            "version": "v3.2.117",
1889 1893
             "source": {
1890 1894
                 "type": "git",
1891 1895
                 "url": "https://github.com/filamentphp/notifications.git",
@@ -1937,7 +1941,7 @@
1937 1941
         },
1938 1942
         {
1939 1943
             "name": "filament/support",
1940
-            "version": "v3.2.116",
1944
+            "version": "v3.2.117",
1941 1945
             "source": {
1942 1946
                 "type": "git",
1943 1947
                 "url": "https://github.com/filamentphp/support.git",
@@ -1996,7 +2000,7 @@
1996 2000
         },
1997 2001
         {
1998 2002
             "name": "filament/tables",
1999
-            "version": "v3.2.116",
2003
+            "version": "v3.2.117",
2000 2004
             "source": {
2001 2005
                 "type": "git",
2002 2006
                 "url": "https://github.com/filamentphp/tables.git",
@@ -2048,7 +2052,7 @@
2048 2052
         },
2049 2053
         {
2050 2054
             "name": "filament/widgets",
2051
-            "version": "v3.2.116",
2055
+            "version": "v3.2.117",
2052 2056
             "source": {
2053 2057
                 "type": "git",
2054 2058
                 "url": "https://github.com/filamentphp/widgets.git",
@@ -2904,16 +2908,16 @@
2904 2908
         },
2905 2909
         {
2906 2910
             "name": "laravel/framework",
2907
-            "version": "v11.27.1",
2911
+            "version": "v11.27.2",
2908 2912
             "source": {
2909 2913
                 "type": "git",
2910 2914
                 "url": "https://github.com/laravel/framework.git",
2911
-                "reference": "2634ad4a6a71da3288943f058a8abbfec6a65ebb"
2915
+                "reference": "a51d1f2b771c542324a3d9b76a98b1bbc75c0ee9"
2912 2916
             },
2913 2917
             "dist": {
2914 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 2921
                 "shasum": ""
2918 2922
             },
2919 2923
             "require": {
@@ -3109,7 +3113,7 @@
3109 3113
                 "issues": "https://github.com/laravel/framework/issues",
3110 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 3119
             "name": "laravel/prompts",
@@ -3622,16 +3626,16 @@
3622 3626
         },
3623 3627
         {
3624 3628
             "name": "league/csv",
3625
-            "version": "9.16.0",
3629
+            "version": "9.17.0",
3626 3630
             "source": {
3627 3631
                 "type": "git",
3628 3632
                 "url": "https://github.com/thephpleague/csv.git",
3629
-                "reference": "998280c6c34bd67d8125fdc8b45bae28d761b440"
3633
+                "reference": "8cab815fb11ec93aa2f7b8a57b3daa1f1a364011"
3630 3634
             },
3631 3635
             "dist": {
3632 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 3639
                 "shasum": ""
3636 3640
             },
3637 3641
             "require": {
@@ -3639,17 +3643,16 @@
3639 3643
                 "php": "^8.1.2"
3640 3644
             },
3641 3645
             "require-dev": {
3642
-                "doctrine/collections": "^2.2.2",
3643 3646
                 "ext-dom": "*",
3644 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 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 3657
             "suggest": {
3655 3658
                 "ext-dom": "Required to use the XMLConverter and the HTMLConverter classes",
@@ -3667,7 +3670,7 @@
3667 3670
                     "src/functions_include.php"
3668 3671
                 ],
3669 3672
                 "psr-4": {
3670
-                    "League\\Csv\\": "src"
3673
+                    "League\\Csv\\": "src/"
3671 3674
                 }
3672 3675
             },
3673 3676
             "notification-url": "https://packagist.org/downloads/",
@@ -3706,7 +3709,7 @@
3706 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 3715
             "name": "league/flysystem",
@@ -9923,35 +9926,35 @@
9923 9926
         },
9924 9927
         {
9925 9928
             "name": "pestphp/pest",
9926
-            "version": "v3.3.0",
9929
+            "version": "v3.3.2",
9927 9930
             "source": {
9928 9931
                 "type": "git",
9929 9932
                 "url": "https://github.com/pestphp/pest.git",
9930
-                "reference": "0a7bff0d246b10040e12e4152215e12a599e742a"
9933
+                "reference": "1513ede73b150b8bcf9def90486e85ecc2bac4e1"
9931 9934
             },
9932 9935
             "dist": {
9933 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 9939
                 "shasum": ""
9937 9940
             },
9938 9941
             "require": {
9939
-                "brianium/paratest": "^7.5.6",
9942
+                "brianium/paratest": "^7.5.7",
9940 9943
                 "nunomaduro/collision": "^8.4.0",
9941 9944
                 "nunomaduro/termwind": "^2.1.0",
9942 9945
                 "pestphp/pest-plugin": "^3.0.0",
9943 9946
                 "pestphp/pest-plugin-arch": "^3.0.0",
9944 9947
                 "pestphp/pest-plugin-mutate": "^3.0.5",
9945 9948
                 "php": "^8.2.0",
9946
-                "phpunit/phpunit": "^11.4.0"
9949
+                "phpunit/phpunit": "^11.4.1"
9947 9950
             },
9948 9951
             "conflict": {
9949
-                "phpunit/phpunit": ">11.4.0",
9952
+                "phpunit/phpunit": ">11.4.1",
9950 9953
                 "sebastian/exporter": "<6.0.0",
9951 9954
                 "webmozart/assert": "<1.11.0"
9952 9955
             },
9953 9956
             "require-dev": {
9954
-                "pestphp/pest-dev-tools": "^3.0.0",
9957
+                "pestphp/pest-dev-tools": "^3.2.0",
9955 9958
                 "pestphp/pest-plugin-type-coverage": "^3.1.0",
9956 9959
                 "symfony/process": "^7.1.5"
9957 9960
             },
@@ -10018,7 +10021,7 @@
10018 10021
             ],
10019 10022
             "support": {
10020 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 10026
             "funding": [
10024 10027
                 {
@@ -10030,7 +10033,7 @@
10030 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 10039
             "name": "pestphp/pest-plugin",
@@ -10838,35 +10841,35 @@
10838 10841
         },
10839 10842
         {
10840 10843
             "name": "phpunit/php-code-coverage",
10841
-            "version": "11.0.6",
10844
+            "version": "11.0.7",
10842 10845
             "source": {
10843 10846
                 "type": "git",
10844 10847
                 "url": "https://github.com/sebastianbergmann/php-code-coverage.git",
10845
-                "reference": "ebdffc9e09585dafa71b9bffcdb0a229d4704c45"
10848
+                "reference": "f7f08030e8811582cc459871d28d6f5a1a4d35ca"
10846 10849
             },
10847 10850
             "dist": {
10848 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 10854
                 "shasum": ""
10852 10855
             },
10853 10856
             "require": {
10854 10857
                 "ext-dom": "*",
10855 10858
                 "ext-libxml": "*",
10856 10859
                 "ext-xmlwriter": "*",
10857
-                "nikic/php-parser": "^5.1.0",
10860
+                "nikic/php-parser": "^5.3.1",
10858 10861
                 "php": ">=8.2",
10859
-                "phpunit/php-file-iterator": "^5.0.1",
10862
+                "phpunit/php-file-iterator": "^5.1.0",
10860 10863
                 "phpunit/php-text-template": "^4.0.1",
10861 10864
                 "sebastian/code-unit-reverse-lookup": "^4.0.1",
10862 10865
                 "sebastian/complexity": "^4.0.1",
10863 10866
                 "sebastian/environment": "^7.2.0",
10864 10867
                 "sebastian/lines-of-code": "^3.0.1",
10865
-                "sebastian/version": "^5.0.1",
10868
+                "sebastian/version": "^5.0.2",
10866 10869
                 "theseer/tokenizer": "^1.2.3"
10867 10870
             },
10868 10871
             "require-dev": {
10869
-                "phpunit/phpunit": "^11.0"
10872
+                "phpunit/phpunit": "^11.4.1"
10870 10873
             },
10871 10874
             "suggest": {
10872 10875
                 "ext-pcov": "PHP extension that provides line coverage",
@@ -10904,7 +10907,7 @@
10904 10907
             "support": {
10905 10908
                 "issues": "https://github.com/sebastianbergmann/php-code-coverage/issues",
10906 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 10912
             "funding": [
10910 10913
                 {
@@ -10912,7 +10915,7 @@
10912 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 10921
             "name": "phpunit/php-file-iterator",
@@ -11161,16 +11164,16 @@
11161 11164
         },
11162 11165
         {
11163 11166
             "name": "phpunit/phpunit",
11164
-            "version": "11.4.0",
11167
+            "version": "11.4.1",
11165 11168
             "source": {
11166 11169
                 "type": "git",
11167 11170
                 "url": "https://github.com/sebastianbergmann/phpunit.git",
11168
-                "reference": "89fe0c530133c08f7fff89d3d727154e4e504925"
11171
+                "reference": "7875627f15f4da7e7f0823d1f323f7295a77334e"
11169 11172
             },
11170 11173
             "dist": {
11171 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 11177
                 "shasum": ""
11175 11178
             },
11176 11179
             "require": {
@@ -11241,7 +11244,7 @@
11241 11244
             "support": {
11242 11245
                 "issues": "https://github.com/sebastianbergmann/phpunit/issues",
11243 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 11249
             "funding": [
11247 11250
                 {
@@ -11257,20 +11260,20 @@
11257 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 11266
             "name": "rector/rector",
11264
-            "version": "1.2.6",
11267
+            "version": "1.2.7",
11265 11268
             "source": {
11266 11269
                 "type": "git",
11267 11270
                 "url": "https://github.com/rectorphp/rector.git",
11268
-                "reference": "6ca85da28159dbd3bb36211c5104b7bc91278e99"
11271
+                "reference": "5b33bdd871895276e2c18e5410a4a57df9233ee0"
11269 11272
             },
11270 11273
             "dist": {
11271 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 11277
                 "shasum": ""
11275 11278
             },
11276 11279
             "require": {
@@ -11308,7 +11311,7 @@
11308 11311
             ],
11309 11312
             "support": {
11310 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 11316
             "funding": [
11314 11317
                 {
@@ -11316,7 +11319,7 @@
11316 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 11325
             "name": "sebastian/cli-parser",
@@ -12189,16 +12192,16 @@
12189 12192
         },
12190 12193
         {
12191 12194
             "name": "sebastian/version",
12192
-            "version": "5.0.1",
12195
+            "version": "5.0.2",
12193 12196
             "source": {
12194 12197
                 "type": "git",
12195 12198
                 "url": "https://github.com/sebastianbergmann/version.git",
12196
-                "reference": "45c9debb7d039ce9b97de2f749c2cf5832a06ac4"
12199
+                "reference": "c687e3387b99f5b03b6caa64c74b63e2936ff874"
12197 12200
             },
12198 12201
             "dist": {
12199 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 12205
                 "shasum": ""
12203 12206
             },
12204 12207
             "require": {
@@ -12231,7 +12234,7 @@
12231 12234
             "support": {
12232 12235
                 "issues": "https://github.com/sebastianbergmann/version/issues",
12233 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 12239
             "funding": [
12237 12240
                 {
@@ -12239,7 +12242,7 @@
12239 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 12248
             "name": "spatie/backtrace",

+ 9
- 9
package-lock.json Dosyayı Görüntüle

@@ -998,9 +998,9 @@
998 998
             }
999 999
         },
1000 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 1004
             "dev": true,
1005 1005
             "funding": [
1006 1006
                 {
@@ -1159,9 +1159,9 @@
1159 1159
             "license": "MIT"
1160 1160
         },
1161 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 1165
             "dev": true,
1166 1166
             "license": "ISC"
1167 1167
         },
@@ -1313,9 +1313,9 @@
1313 1313
             }
1314 1314
         },
1315 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 1319
             "dev": true,
1320 1320
             "license": "MIT",
1321 1321
             "dependencies": {

+ 123
- 0
resources/views/components/company/tables/reports/balance-sheet.blade.php Dosyayı Görüntüle

@@ -0,0 +1,123 @@
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 Dosyayı Görüntüle

@@ -83,15 +83,17 @@
83 83
         </tr>
84 84
         </tbody>
85 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 99
 </table>

+ 84
- 0
resources/views/filament/company/pages/reports/balance-sheet.blade.php Dosyayı Görüntüle

@@ -0,0 +1,84 @@
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
+

Loading…
İptal
Kaydet