/ app / Http / Livewire / App / ScheduleSettings.php
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  }