Nelze vybrat více než 25 témat Téma musí začínat písmenem nebo číslem, může obsahovat pomlčky („-“) a může být dlouhé až 35 znaků.

ViewInvoice.php 4.3KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108
  1. <?php
  2. namespace App\Filament\Company\Resources\Sales\InvoiceResource\Pages;
  3. use App\Enums\Accounting\InvoiceStatus;
  4. use App\Filament\Company\Resources\Sales\ClientResource;
  5. use App\Filament\Company\Resources\Sales\InvoiceResource;
  6. use Carbon\CarbonInterface;
  7. use Filament\Infolists\Components\Actions\Action;
  8. use Filament\Infolists\Components\Grid;
  9. use Filament\Infolists\Components\TextEntry;
  10. use Filament\Infolists\Components\ViewEntry;
  11. use Filament\Infolists\Infolist;
  12. use Filament\Resources\Pages\ViewRecord;
  13. use Filament\Support\Enums\FontWeight;
  14. use Filament\Support\Enums\MaxWidth;
  15. use Illuminate\Support\Carbon;
  16. class ViewInvoice extends ViewRecord
  17. {
  18. protected static string $resource = InvoiceResource::class;
  19. public function infolist(Infolist $infolist): Infolist
  20. {
  21. return $infolist
  22. ->columns(1)
  23. ->schema([
  24. Grid::make(5)
  25. ->schema([
  26. TextEntry::make('invoice_number')
  27. ->label('Invoice #')
  28. ->size(TextEntry\TextEntrySize::Large),
  29. TextEntry::make('status')
  30. ->badge()
  31. ->size(TextEntry\TextEntrySize::Large),
  32. TextEntry::make('client.name')
  33. ->color('primary')
  34. ->weight(FontWeight::SemiBold)
  35. ->size(TextEntry\TextEntrySize::Large)
  36. ->url(fn ($record) => ClientResource::getUrl('edit', ['record' => $record->client_id]), true),
  37. TextEntry::make('amount_due')
  38. ->label('Amount Due')
  39. ->money()
  40. ->size(TextEntry\TextEntrySize::Large),
  41. TextEntry::make('due_date')
  42. ->label('Due')
  43. ->formatStateUsing(function (TextEntry $entry, mixed $state) {
  44. if (blank($state)) {
  45. return null;
  46. }
  47. $date = Carbon::parse($state)
  48. ->setTimezone($timezone ?? $entry->getTimezone());
  49. if ($date->isToday()) {
  50. return 'Today';
  51. }
  52. return $date->diffForHumans([
  53. 'options' => CarbonInterface::ONE_DAY_WORDS,
  54. ]);
  55. })
  56. ->size(TextEntry\TextEntrySize::Large),
  57. ]),
  58. ViewEntry::make('create')
  59. ->view('filament.infolists.invoice-create-step')
  60. ->registerActions([
  61. Action::make('approveDraft')
  62. ->label('Approve Draft')
  63. ->action('approveDraft')
  64. ->visible(fn ($record) => $record->status === InvoiceStatus::Draft),
  65. Action::make('edit')
  66. ->label('Edit')
  67. ->outlined()
  68. ->url(fn ($record) => InvoiceResource::getUrl('edit', ['record' => $record->id]), true),
  69. Action::make('markAsSent')
  70. ->label('Mark as Sent')
  71. ->outlined()
  72. ->action('markAsSent'),
  73. Action::make('sendInvoice')
  74. ->label('Send Invoice')
  75. ->action('sendInvoice'),
  76. Action::make('recordPayment')
  77. ->label('Record Payment')
  78. ->action('recordPayment'),
  79. ]),
  80. ]);
  81. }
  82. public function approveDraft(): void
  83. {
  84. $this->record->update([
  85. 'status' => InvoiceStatus::Unsent,
  86. ]);
  87. }
  88. public function markAsSent(): void
  89. {
  90. $this->record->update([
  91. 'status' => InvoiceStatus::Sent,
  92. ]);
  93. }
  94. public function getMaxContentWidth(): MaxWidth | string | null
  95. {
  96. return MaxWidth::FiveExtraLarge;
  97. }
  98. }