ScheduleSettings.php
1 <?php 2 3 namespace App\Http\Livewire\App; 4 5 use App\Enums\FrequencyVerificationEnum; 6 use App\Http\Services\SchedulerService; 7 use App\Models\DossierType; 8 use App\Models\Scheduler; 9 use App\Rules\DynamicScheduleRules; 10 use Illuminate\Contracts\View\View; 11 use Illuminate\Foundation\Auth\Access\AuthorizesRequests; 12 use Livewire\Component; 13 use WireUi\Traits\Actions; 14 15 class ScheduleSettings extends Component 16 { 17 use Actions, AuthorizesRequests; 18 19 public ?int $dossierTypeId = null; 20 21 public const defaultData = [ 22 'frequency_verification_rectify' => null, 23 'day_verification_rectify' => null, 24 'time_verification_rectify' => '08:00', 25 'amount_of_days' => 15, 26 'frequency_evaluation_request_check' => null, 27 'day_evaluation_request_check' => null, 28 'time_evaluation_request_check' => '08:00', 29 'days_verification_for_evaluation_request' => null, 30 'frequency_certification_report_check' => null, 31 'day_certification_report_check' => null, 32 'time_certification_report_check' => '08:00', 33 'amount_of_days_certification_report' => 30, 34 ]; 35 36 public array $rectify_check_data = self::defaultData; 37 38 protected $listeners = ['refresh' => '$refresh']; 39 40 public function rules() 41 { 42 $baseRules = [ 43 'rectify_check_data.frequency_verification_rectify' => 'integer|nullable', 44 'rectify_check_data.day_verification_rectify' => 'integer|nullable', 45 'rectify_check_data.time_verification_rectify' => 'string|nullable', 46 'rectify_check_data.amount_of_days' => 'integer|nullable|min:1|numeric', 47 'rectify_check_data.frequency_evaluation_request_check' => 'integer|nullable', 48 'rectify_check_data.day_evaluation_request_check' => 'integer|nullable', 49 'rectify_check_data.time_evaluation_request_check' => 'string|nullable', 50 'rectify_check_data.days_verification_for_evaluation_request' => 'integer|nullable|min:1|numeric', 51 'rectify_check_data.frequency_certification_report_check' => 'integer|nullable', 52 'rectify_check_data.day_certification_report_check' => 'integer|nullable', 53 'rectify_check_data.time_certification_report_check' => 'string|nullable', 54 'rectify_check_data.amount_of_days_certification_report' => 'integer|nullable|min:1', 55 'dossierTypeId' => 'required|integer', 56 ]; 57 58 // Condicionales para días según frecuencia semanal o mensual 59 if (in_array( 60 $this->rectify_check_data['frequency_verification_rectify'], 61 [FrequencyVerificationEnum::weekly()->value, FrequencyVerificationEnum::monthly()->value] 62 )) { 63 $baseRules['rectify_check_data.day_verification_rectify'] .= '|required'; 64 } 65 if ( 66 in_array($this->rectify_check_data['frequency_evaluation_request_check'], 67 [FrequencyVerificationEnum::weekly()->value, FrequencyVerificationEnum::monthly()->value] 68 )) { 69 $baseRules['rectify_check_data.day_evaluation_request_check'] .= '|required'; 70 } 71 if ( 72 in_array($this->rectify_check_data['frequency_certification_report_check'], 73 [FrequencyVerificationEnum::weekly()->value, FrequencyVerificationEnum::monthly()->value] 74 )) { 75 $baseRules['rectify_check_data.day_certification_report_check'] .= '|required'; 76 } 77 78 // Agregar reglas dinámicas desde clase externa 79 return array_merge($baseRules, DynamicScheduleRules::get($this->rectify_check_data)); 80 } 81 82 83 public function mount(): void 84 { 85 $this->dossierTypeId = DossierType::first()->id; 86 $this->setData(); 87 } 88 89 public function updatedRectifyCheckDataAmountOfDaysCertificationReport() 90 { 91 if ($this->rectify_check_data['day_certification_report_check'] === '') { 92 $this->rectify_check_data['day_certification_report_check'] = null; 93 } 94 } 95 96 public function updatedRectifyCheckDataMonthVerification() 97 { 98 if ($this->rectify_check_data['days_verification_for_evaluation_request'] === '') { 99 $this->rectify_check_data['days_verification_for_evaluation_request'] = null; 100 } 101 } 102 103 public function updatedRectifyCheckDataAmountOfDays() 104 { 105 if ($this->rectify_check_data['amount_of_days'] === '') { 106 $this->rectify_check_data['amount_of_days'] = null; 107 } 108 } 109 110 public function updatedDossierTypeId(): void 111 { 112 $this->setData(); 113 } 114 115 private function setData(): void 116 { 117 if ($this->scheduler) 118 $this->rectify_check_data = $this->scheduler->toArray(); 119 else 120 $this->rectify_check_data = self::defaultData; 121 } 122 123 public function getSchedulerProperty(): ?Scheduler 124 { 125 return Scheduler::where('dossier_type_id', $this->dossierTypeId)->first(); 126 } 127 128 public function getRectifyFrequencyProperty(): array 129 { 130 return [ 131 ['id' => FrequencyVerificationEnum::daily()->value, 'name' => __('settings.schedule.daily')], 132 ['id' => FrequencyVerificationEnum::weekly()->value, 'name' => __('settings.schedule.weekly')], 133 ['id' => FrequencyVerificationEnum::monthly()->value, 'name' => __('settings.schedule.monthly')], 134 ]; 135 } 136 137 public function getMonthsProperty() 138 { 139 return SchedulerService::getMonthsInNumber(); 140 } 141 142 public function updateSchedule(): void 143 { 144 $this->authorize('can_manage_schedule'); 145 $this->validate(); 146 147 try { 148 if ($this->scheduler) 149 SchedulerService::updateSchedule($this->scheduler->id, $this->rectify_check_data, $this->dossierTypeId); 150 else 151 SchedulerService::createSchedule($this->rectify_check_data, $this->dossierTypeId); 152 153 $this->successUI(); 154 } catch (\Exception $e) { 155 $this->notification()->error( 156 __('settings.schedule.update.error.title'), 157 __('settings.schedule.update.error.description'), 158 ); 159 logger()->error($e); 160 } 161 } 162 163 private function successUI(): void 164 { 165 $this->notification()->success( 166 __('settings.schedule.update.success.title'), 167 __('settings.schedule.update.success.description'), 168 ); 169 } 170 171 public function render(): View 172 { 173 return view('livewire.app.schedule-settings') 174 ->layoutData([ 175 'title' => __('app.schedule'), 176 'entity' => null, 177 'breadcrumb' => 'app.schedule', 178 ]); 179 } 180 }