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.

ViewInvoice.php 2.8KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182
  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 App\Models\Accounting\Invoice;
  7. use Carbon\CarbonInterface;
  8. use Filament\Infolists\Components\Section;
  9. use Filament\Infolists\Components\TextEntry;
  10. use Filament\Infolists\Infolist;
  11. use Filament\Resources\Pages\ViewRecord;
  12. use Filament\Support\Enums\FontWeight;
  13. use Illuminate\Support\Carbon;
  14. class ViewInvoice extends ViewRecord
  15. {
  16. protected static string $resource = InvoiceResource::class;
  17. protected $listeners = [
  18. 'refresh' => '$refresh',
  19. ];
  20. public function infolist(Infolist $infolist): Infolist
  21. {
  22. return $infolist
  23. ->schema([
  24. Section::make('Invoice Details')
  25. ->columns(3)
  26. ->schema([
  27. TextEntry::make('invoice_number')
  28. ->label('Invoice #'),
  29. TextEntry::make('status')
  30. ->badge(),
  31. TextEntry::make('client.name')
  32. ->label('Client')
  33. ->color('primary')
  34. ->weight(FontWeight::SemiBold)
  35. ->url(fn (Invoice $record) => ClientResource::getUrl('edit', ['record' => $record->client_id])),
  36. TextEntry::make('total')
  37. ->label('Total')
  38. ->money(),
  39. TextEntry::make('amount_due')
  40. ->label('Amount Due')
  41. ->money(),
  42. TextEntry::make('due_date')
  43. ->label('Due Date')
  44. ->formatStateUsing(function (TextEntry $entry, mixed $state) {
  45. if (blank($state)) {
  46. return null;
  47. }
  48. $date = Carbon::parse($state)
  49. ->setTimezone($timezone ?? $entry->getTimezone());
  50. if ($date->isToday()) {
  51. return 'Today';
  52. }
  53. return $date->diffForHumans([
  54. 'options' => CarbonInterface::ONE_DAY_WORDS,
  55. ]);
  56. }),
  57. ]),
  58. ]);
  59. }
  60. public function approveDraft(): void
  61. {
  62. $this->record->update([
  63. 'status' => InvoiceStatus::Unsent,
  64. ]);
  65. }
  66. public function markAsSent(): void
  67. {
  68. $this->record->update([
  69. 'status' => InvoiceStatus::Sent,
  70. ]);
  71. }
  72. }