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.

BaseReportPage.php 3.4KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113
  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 array $options = [];
  24. public function mount(): void
  25. {
  26. $this->company = auth()->user()->currentCompany;
  27. $this->fiscalYearStartDate = $this->company->locale->fiscalYearStartDate();
  28. $this->fiscalYearEndDate = $this->company->locale->fiscalYearEndDate();
  29. $this->dateRange = $this->getDefaultDateRange();
  30. $this->setDateRange(Carbon::parse($this->fiscalYearStartDate), Carbon::parse($this->fiscalYearEndDate));
  31. $this->options = ['showAccountCode'];
  32. $this->loadReportData();
  33. }
  34. abstract public function loadReportData(): void;
  35. abstract public function exportCSV(): StreamedResponse;
  36. abstract public function exportPDF(): StreamedResponse;
  37. public function getDefaultDateRange(): string
  38. {
  39. return 'FY-' . now()->year;
  40. }
  41. public function setDateRange(Carbon $start, Carbon $end): void
  42. {
  43. $this->startDate = $start->format('Y-m-d');
  44. $this->endDate = $end->isFuture() ? now()->format('Y-m-d') : $end->format('Y-m-d');
  45. }
  46. protected function getHeaderActions(): array
  47. {
  48. return [
  49. ActionGroup::make([
  50. Action::make('exportCSV')
  51. ->label('CSV')
  52. ->action(fn () => $this->exportCSV()),
  53. Action::make('exportPDF')
  54. ->label('PDF')
  55. ->action(fn () => $this->exportPDF()),
  56. ])
  57. ->label('Export')
  58. ->button()
  59. ->outlined()
  60. ->dropdownWidth('max-w-[7rem]')
  61. ->dropdownPlacement('bottom-end')
  62. ->icon('heroicon-c-chevron-down')
  63. ->iconSize(IconSize::Small)
  64. ->iconPosition(IconPosition::After),
  65. ];
  66. }
  67. protected function getDateRangeFormComponent(): Component
  68. {
  69. return DateRangeSelect::make('dateRange')
  70. ->label('Date Range')
  71. ->selectablePlaceholder(false)
  72. ->startDateField('startDate')
  73. ->endDateField('endDate');
  74. }
  75. protected function getStartDateFormComponent(): Component
  76. {
  77. return DatePicker::make('startDate')
  78. ->label('Start Date')
  79. ->displayFormat('Y-m-d')
  80. ->afterStateUpdated(static function (Set $set) {
  81. $set('dateRange', 'Custom');
  82. });
  83. }
  84. protected function getEndDateFormComponent(): Component
  85. {
  86. return DatePicker::make('endDate')
  87. ->label('End Date')
  88. ->displayFormat('Y-m-d')
  89. ->afterStateUpdated(static function (Set $set) {
  90. $set('dateRange', 'Custom');
  91. });
  92. }
  93. }