/ app / Http / Livewire / InboxFiles / Update.php
Update.php
  1  <?php
  2  
  3  namespace App\Http\Livewire\InboxFiles;
  4  
  5  use App\Enums\InboxFileTypeEnum;
  6  use App\Http\Services\AutoRequirementService;
  7  use App\Http\Services\DossierService;
  8  use App\Http\Services\ValidationService;
  9  use App\Http\Services\ValidationTypeService;
 10  use App\Models\InboxFile;
 11  use App\Models\ValidationType;
 12  use App\Rules\ValidateDossierCodeExists;
 13  use Illuminate\Support\Facades\DB;
 14  use Livewire\Component;
 15  use Livewire\WithFileUploads;
 16  use WireUi\Traits\Actions;
 17  
 18  class Update extends Component
 19  {
 20      use Actions, WithFileUploads;
 21  
 22      public int $entityId; // InboxFile ID
 23      public InboxFile $inboxFile;
 24      public string $code = '';
 25      public ?int $type = null;
 26      public ?int $validationTypeId = null;
 27  
 28      public function rules()
 29      {
 30          return [
 31              'code' => [
 32                  'required',
 33                  'string',
 34                  new ValidateDossierCodeExists(),
 35              ],
 36              'type' => 'required',
 37              'validationTypeId' => 'required',
 38          ];
 39      }
 40  
 41      public function mount($entityId)
 42      {
 43          $this->entityId = $entityId;
 44          $this->inboxFile = InboxFile::findOrFail($entityId);
 45  
 46          $this->code = $this->inboxFile->dossier->code ?? '';
 47          $this->type = $this->inboxFile->type;
 48          $this->validationTypeId = $this->inboxFile->validation->validation_type_id ?? null;
 49      }
 50  
 51      public function getDossierProperty()
 52      {
 53          return DossierService::findByCode($this->code);
 54      }
 55  
 56      public function getTypesProperty()
 57      {
 58          return InboxFileTypeEnum::valueLangArray();
 59      }
 60  
 61      public function getValidationTypesProperty()
 62      {
 63          $dossier = DossierService::findByCode($this->code);
 64          if (!$dossier) {
 65              return [];
 66          }
 67          return ValidationTypeService::getValidationTypesSelect($dossier);
 68      }
 69  
 70      public function validationSelectIsDisabled()
 71      {
 72          return $this->validationTypes->isEmpty();
 73      }
 74  
 75      public function updated($propertyName)
 76      {
 77          $this->validateOnly($propertyName);
 78          $this->forgetComputed();
 79      }
 80  
 81      public function updateConfirm()
 82      {
 83          if ($this->modifiesTheValidation()) {
 84              $this->confirmNewValidation();
 85          } else {
 86              $this->update();
 87          }
 88      }
 89  
 90      public function update()
 91      {
 92          $this->validate();
 93          DB::beginTransaction();
 94  
 95          try {
 96              $this->inboxFile->dossier_id = $this->dossier->id;
 97              $this->inboxFile->type = $this->type;
 98              $this->inboxFile->save();
 99              $this->updateValidation();
100          } catch (\Exception $e) {
101              logger($e->getMessage());
102              $this->notification()->error(__('inbox-files.notifications.update.error.message'));
103              return;
104          }
105  
106          DB::commit();
107  
108          $this->emitUp('closePanel');
109          $this->emitTo(View::class, 'refresh');
110          $this->emitTo(Validate::class, 'refresh');
111          $this->emitTo(View::class, 'forgetRequirements');
112  
113          $this->notification()->success(
114              __('inbox-files.notifications.update.success.title'),
115              __('inbox-files.notifications.update.success.message')
116          );
117      }
118  
119      public function updateValidation()
120      {
121          if (!$this->modifiesTheValidation()) {
122              return;
123          }
124  
125          if ($this->validationTypeId) {
126              $validationType = ValidationType::find($this->validationTypeId);
127              $validation = ValidationService::createNewValidation($validationType, $this->dossier->id);
128          }
129  
130          $this->inboxFile->validation_id = $validation->id ?? null;
131          $this->inboxFile->save();
132  
133          if ($this->inboxFile->validation) {
134              AutoRequirementService::run($this->inboxFile->validation);
135          }
136      }
137  
138      public function modifiesTheValidation()
139      {
140          return $this->validationTypeId !== ($this->inboxFile->validation->validation_type_id ?? null);
141      }
142  
143      public function confirmNewValidation()
144      {
145          $this->dialog()->confirm([
146              'title' => __('inbox-files.validations.select.confirm.title'),
147              'description' => __('inbox-files.validations.select.confirm.description'),
148              'method' => 'update'
149          ]);
150      }
151  
152      public function render()
153      {
154          return view('livewire.inbox-files.update');
155      }
156  }