您最多选择25个主题 主题必须以字母或数字开头,可以包含连字符 (-),并且长度不得超过35个字符

DateRangeSelect.php 4.3KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140
  1. <?php
  2. namespace App\Filament\Forms\Components;
  3. use App\Services\DateRangeService;
  4. use Filament\Forms\Components\Select;
  5. use Filament\Forms\Set;
  6. use Illuminate\Support\Carbon;
  7. class DateRangeSelect extends Select
  8. {
  9. public string $fiscalYearStartDate;
  10. public string $fiscalYearEndDate;
  11. public ?string $startDateField = null;
  12. public ?string $endDateField = null;
  13. protected function setUp(): void
  14. {
  15. parent::setUp();
  16. $company = auth()->user()->currentCompany;
  17. $this->fiscalYearStartDate = $company->locale->fiscalYearStartDate();
  18. $this->fiscalYearEndDate = $company->locale->fiscalYearEndDate();
  19. $this->options(app(DateRangeService::class)->getDateRangeOptions())
  20. ->live()
  21. ->afterStateUpdated(function ($state, Set $set) {
  22. $this->updateDateRange($state, $set);
  23. });
  24. }
  25. public function startDateField(string $fieldName): static
  26. {
  27. $this->startDateField = $fieldName;
  28. return $this;
  29. }
  30. public function endDateField(string $fieldName): static
  31. {
  32. $this->endDateField = $fieldName;
  33. return $this;
  34. }
  35. public function getStartDateField(): ?string
  36. {
  37. return $this->startDateField;
  38. }
  39. public function getEndDateField(): ?string
  40. {
  41. return $this->endDateField;
  42. }
  43. public function updateDateRange($state, Set $set): void
  44. {
  45. if ($state === null) {
  46. if ($this->startDateField) {
  47. $set($this->startDateField, null);
  48. }
  49. if ($this->endDateField) {
  50. $set($this->endDateField, null);
  51. }
  52. return;
  53. }
  54. [$type, $param1, $param2] = explode('-', $state) + [null, null, null];
  55. $this->processDateRange($type, $param1, $param2, $set);
  56. }
  57. public function processDateRange($type, $param1, $param2, Set $set): void
  58. {
  59. match ($type) {
  60. 'FY' => $this->processFiscalYear($param1, $set),
  61. 'FQ' => $this->processFiscalQuarter($param1, $param2, $set),
  62. 'Y' => $this->processCalendarYear($param1, $set),
  63. 'Q' => $this->processCalendarQuarter($param1, $param2, $set),
  64. 'M' => $this->processMonth("{$param1}-{$param2}", $set),
  65. 'Custom' => null,
  66. };
  67. }
  68. public function processFiscalYear($year, Set $set): void
  69. {
  70. $currentYear = now()->year;
  71. $diff = $currentYear - $year;
  72. $fiscalYearStart = Carbon::parse($this->fiscalYearStartDate)->subYears($diff);
  73. $fiscalYearEnd = Carbon::parse($this->fiscalYearEndDate)->subYears($diff);
  74. $this->setDateRange($fiscalYearStart, $fiscalYearEnd, $set);
  75. }
  76. public function processFiscalQuarter($quarter, $year, Set $set): void
  77. {
  78. $currentYear = now()->year;
  79. $diff = $currentYear - $year;
  80. $fiscalYearStart = Carbon::parse($this->fiscalYearStartDate)->subYears($diff);
  81. $quarterStart = $fiscalYearStart->copy()->addMonths(($quarter - 1) * 3);
  82. $quarterEnd = $quarterStart->copy()->addMonths(3)->subDay();
  83. $this->setDateRange($quarterStart, $quarterEnd, $set);
  84. }
  85. public function processCalendarYear($year, Set $set): void
  86. {
  87. $start = Carbon::createFromDate($year)->startOfYear();
  88. $end = Carbon::createFromDate($year)->endOfYear();
  89. $this->setDateRange($start, $end, $set);
  90. }
  91. public function processCalendarQuarter($quarter, $year, Set $set): void
  92. {
  93. $month = ($quarter - 1) * 3 + 1;
  94. $start = Carbon::createFromDate($year, $month, 1);
  95. $end = Carbon::createFromDate($year, $month, 1)->endOfQuarter();
  96. $this->setDateRange($start, $end, $set);
  97. }
  98. public function processMonth($yearMonth, Set $set): void
  99. {
  100. $start = Carbon::parse($yearMonth)->startOfMonth();
  101. $end = Carbon::parse($yearMonth)->endOfMonth();
  102. $this->setDateRange($start, $end, $set);
  103. }
  104. public function setDateRange(Carbon $start, Carbon $end, Set $set): void
  105. {
  106. if ($this->startDateField) {
  107. $set($this->startDateField, $start->startOfDay()->toDateTimeString());
  108. }
  109. if ($this->endDateField) {
  110. $set($this->endDateField, $end->isFuture() ? now()->endOfDay()->toDateTimeString() : $end->endOfDay()->toDateTimeString());
  111. }
  112. }
  113. }