You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

ViewTransaction.php 6.6KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137
  1. <?php
  2. namespace App\Filament\Company\Resources\Accounting\TransactionResource\Pages;
  3. use App\Filament\Actions\EditTransactionAction;
  4. use App\Filament\Company\Resources\Accounting\TransactionResource;
  5. use App\Models\Accounting\JournalEntry;
  6. use App\Models\Accounting\Transaction;
  7. use Filament\Actions;
  8. use Filament\Infolists\Components\Grid;
  9. use Filament\Infolists\Components\RepeatableEntry;
  10. use Filament\Infolists\Components\Section;
  11. use Filament\Infolists\Components\TextEntry;
  12. use Filament\Infolists\Infolist;
  13. use Filament\Resources\Pages\ViewRecord;
  14. use Filament\Support\Enums\FontWeight;
  15. use Filament\Support\Enums\IconPosition;
  16. use Filament\Support\Enums\IconSize;
  17. class ViewTransaction extends ViewRecord
  18. {
  19. protected static string $resource = TransactionResource::class;
  20. protected function getHeaderActions(): array
  21. {
  22. return [
  23. EditTransactionAction::make()
  24. ->label('Edit transaction')
  25. ->outlined(),
  26. Actions\ActionGroup::make([
  27. Actions\ActionGroup::make([
  28. Actions\Action::make('markAsReviewed')
  29. ->label(static fn (Transaction $record) => $record->reviewed ? 'Mark as unreviewed' : 'Mark as reviewed')
  30. ->icon(static fn (Transaction $record) => $record->reviewed ? 'heroicon-s-check-circle' : 'heroicon-o-check-circle')
  31. ->disabled(fn (Transaction $record): bool => $record->isUncategorized())
  32. ->action(fn (Transaction $record) => $record->update(['reviewed' => ! $record->reviewed])),
  33. Actions\ReplicateAction::make()
  34. ->excludeAttributes(['created_by', 'updated_by', 'created_at', 'updated_at'])
  35. ->modal(false)
  36. ->beforeReplicaSaved(static function (Transaction $replica) {
  37. $replica->description = '(Copy of) ' . $replica->description;
  38. })
  39. ->hidden(static fn (Transaction $transaction) => $transaction->transactionable_id)
  40. ->after(static function (Transaction $original, Transaction $replica) {
  41. $original->journalEntries->each(function (JournalEntry $entry) use ($replica) {
  42. $entry->replicate([
  43. 'transaction_id',
  44. ])->fill([
  45. 'transaction_id' => $replica->id,
  46. ])->save();
  47. });
  48. }),
  49. ])->dropdown(false),
  50. Actions\DeleteAction::make(),
  51. ])
  52. ->label('Actions')
  53. ->button()
  54. ->outlined()
  55. ->dropdownPlacement('bottom-end')
  56. ->icon('heroicon-c-chevron-down')
  57. ->iconSize(IconSize::Small)
  58. ->iconPosition(IconPosition::After),
  59. ];
  60. }
  61. public function infolist(Infolist $infolist): Infolist
  62. {
  63. return $infolist
  64. ->schema([
  65. Section::make('Transaction Details')
  66. ->columns(2)
  67. ->schema([
  68. TextEntry::make('posted_at')
  69. ->label('Date')
  70. ->date(),
  71. TextEntry::make('type')
  72. ->badge(),
  73. TextEntry::make('description')
  74. ->label('Description'),
  75. TextEntry::make('bankAccount.account.name')
  76. ->label('Account'),
  77. TextEntry::make('account.name')
  78. ->label('Category')
  79. ->prefix(fn (Transaction $record) => $record->type->isTransfer() ? 'Transfer to ' : null)
  80. ->state(fn (Transaction $record) => $record->account->name ?? 'Journal Entry'),
  81. TextEntry::make('amount')
  82. ->label('Amount')
  83. ->weight(fn (Transaction $record) => $record->reviewed ? null : FontWeight::SemiBold)
  84. ->color(
  85. fn (Transaction $record) => match ($record->type) {
  86. \App\Enums\Accounting\TransactionType::Deposit => 'success',
  87. \App\Enums\Accounting\TransactionType::Journal => 'primary',
  88. default => null,
  89. }
  90. )
  91. ->currency(fn (Transaction $record) => $record->bankAccount?->account->currency_code),
  92. TextEntry::make('reviewed')
  93. ->label('Status')
  94. ->badge()
  95. ->formatStateUsing(fn (bool $state): string => $state ? 'Reviewed' : 'Not Reviewed')
  96. ->color(fn (bool $state): string => $state ? 'success' : 'warning'),
  97. TextEntry::make('notes')
  98. ->label('Notes')
  99. ->columnSpanFull(),
  100. ]),
  101. Section::make('Journal Entries')
  102. ->visible(fn (Transaction $record) => $record->type->isJournal())
  103. ->schema([
  104. RepeatableEntry::make('journalEntries')
  105. ->hiddenLabel()
  106. ->schema([
  107. Grid::make(4)
  108. ->schema([
  109. TextEntry::make('type')
  110. ->label('Type')
  111. ->badge(),
  112. TextEntry::make('description')
  113. ->label('Description'),
  114. TextEntry::make('account.name')
  115. ->label('Account'),
  116. TextEntry::make('amount')
  117. ->label('Amount')
  118. ->currency(fn (JournalEntry $record) => $record->transaction->bankAccount?->account->currency_code)
  119. ->alignEnd(),
  120. ]),
  121. ]),
  122. ]),
  123. ]);
  124. }
  125. protected function getAllRelationManagers(): array
  126. {
  127. return [
  128. TransactionResource\RelationManagers\JournalEntriesRelationManager::class,
  129. ];
  130. }
  131. }