Você não pode selecionar mais de 25 tópicos Os tópicos devem começar com uma letra ou um número, podem incluir traços ('-') e podem ter até 35 caracteres.

BaseReportPage.php 3.3KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110
  1. <?php
  2. namespace App\Filament\Company\Pages\Reports;
  3. use App\Filament\Forms\Components\DateRangeSelect;
  4. use App\Models\Company;
  5. use Filament\Actions\Action;
  6. use Filament\Actions\ActionGroup;
  7. use Filament\Forms\Components\Component;
  8. use Filament\Forms\Components\DatePicker;
  9. use Filament\Forms\Set;
  10. use Filament\Pages\Page;
  11. use Filament\Support\Enums\IconPosition;
  12. use Filament\Support\Enums\IconSize;
  13. use Illuminate\Support\Carbon;
  14. use Symfony\Component\HttpFoundation\StreamedResponse;
  15. abstract class BaseReportPage extends Page
  16. {
  17. public string $startDate = '';
  18. public string $endDate = '';
  19. public string $dateRange = '';
  20. public string $fiscalYearStartDate = '';
  21. public string $fiscalYearEndDate = '';
  22. public Company $company;
  23. public function mount(): void
  24. {
  25. $this->company = auth()->user()->currentCompany;
  26. $this->fiscalYearStartDate = $this->company->locale->fiscalYearStartDate();
  27. $this->fiscalYearEndDate = $this->company->locale->fiscalYearEndDate();
  28. $this->dateRange = $this->getDefaultDateRange();
  29. $this->setDateRange(Carbon::parse($this->fiscalYearStartDate), Carbon::parse($this->fiscalYearEndDate));
  30. $this->loadReportData();
  31. }
  32. abstract public function loadReportData(): void;
  33. abstract public function exportCSV(): StreamedResponse;
  34. abstract public function exportPDF(): StreamedResponse;
  35. public function getDefaultDateRange(): string
  36. {
  37. return 'FY-' . now()->year;
  38. }
  39. public function setDateRange(Carbon $start, Carbon $end): void
  40. {
  41. $this->startDate = $start->format('Y-m-d');
  42. $this->endDate = $end->isFuture() ? now()->format('Y-m-d') : $end->format('Y-m-d');
  43. }
  44. protected function getHeaderActions(): array
  45. {
  46. return [
  47. ActionGroup::make([
  48. Action::make('exportCSV')
  49. ->label('CSV')
  50. ->action(fn () => $this->exportCSV()),
  51. Action::make('exportPDF')
  52. ->label('PDF')
  53. ->action(fn () => $this->exportPDF()),
  54. ])
  55. ->label('Export')
  56. ->button()
  57. ->outlined()
  58. ->dropdownWidth('max-w-[7rem]')
  59. ->dropdownPlacement('bottom-end')
  60. ->icon('heroicon-c-chevron-down')
  61. ->iconSize(IconSize::Small)
  62. ->iconPosition(IconPosition::After),
  63. ];
  64. }
  65. protected function getDateRangeFormComponent(): Component
  66. {
  67. return DateRangeSelect::make('dateRange')
  68. ->label('Date Range')
  69. ->selectablePlaceholder(false)
  70. ->startDateField('startDate')
  71. ->endDateField('endDate');
  72. }
  73. protected function getStartDateFormComponent(): Component
  74. {
  75. return DatePicker::make('startDate')
  76. ->label('Start Date')
  77. ->displayFormat('Y-m-d')
  78. ->afterStateUpdated(static function (Set $set) {
  79. $set('dateRange', 'Custom');
  80. });
  81. }
  82. protected function getEndDateFormComponent(): Component
  83. {
  84. return DatePicker::make('endDate')
  85. ->label('End Date')
  86. ->displayFormat('Y-m-d')
  87. ->afterStateUpdated(static function (Set $set) {
  88. $set('dateRange', 'Custom');
  89. });
  90. }
  91. }