/ app / Http / Livewire / InboxFiles / Assign.php
Assign.php
  1  <?php
  2  
  3  namespace App\Http\Livewire\InboxFiles;
  4  
  5  use App\Enums\StatusEnum;
  6  use App\Http\Services\DossierService;
  7  use App\Http\Services\TaskService;
  8  use App\Models\Dossier;
  9  use App\Models\InboxFile;
 10  use App\Models\User;
 11  use Carbon\Carbon;
 12  use Livewire\Component;
 13  use WireUi\Traits\Actions;
 14  use Illuminate\Foundation\Auth\Access\AuthorizesRequests;
 15  use Illuminate\Support\Facades\Auth;
 16  use Illuminate\Support\Facades\DB;
 17  use Illuminate\Validation\Rule;
 18  
 19  class Assign extends Component
 20  {
 21      use AuthorizesRequests, Actions;
 22  
 23      public $entityId;
 24      public InboxFile $inboxFile;
 25      public Dossier $dossier;
 26  
 27      public ?int $principalCertifier = null;
 28      public array $secondaryCertifiers = [];
 29      public array $externalCertifiers = [];
 30  
 31      protected function rules()
 32      {
 33          return [
 34              'principalCertifier' => 'nullable|exists:users,id',
 35              'secondaryCertifiers' => ['nullable', 'array', Rule::prohibitedIf(fn() => !$this->principalCertifier && !$this->externalCertifiers)],
 36              'secondaryCertifiers.*' => 'exists:users,id',
 37              'externalCertifiers' => 'nullable|array',
 38              'externalCertifiers.*' => 'exists:users,id',
 39          ];
 40      }
 41  
 42      protected function messages()
 43      {
 44          return [
 45              'secondaryCertifiers.prohibited' => __('dossiers.dossier.notifications.update.error.secondary_certifiers'),
 46          ];
 47      }
 48  
 49      public function mount()
 50      {
 51          $this->inboxFile = InboxFile::find($this->entityId);
 52          $this->dossier = $this->inboxFile->dossier;
 53          $this->principalCertifier = $this->dossier->principal_certifier_id;
 54          $this->secondaryCertifiers = $this->dossier->secondaryCertifiers()->pluck('id')->toArray();
 55          $this->externalCertifiers = $this->dossier->externalCertifiers()->pluck('id')->toArray();
 56      }
 57  
 58      public function assignCertifiers()
 59      {
 60          // Update the dossier
 61          DossierService::assignCertifiers($this->dossier, [
 62              'principal_certifier_id' => $this->principalCertifier,
 63              'secondary_certifiers' => $this->secondaryCertifiers,
 64              'external_certifiers' => $this->externalCertifiers
 65          ]);
 66  
 67          // Update the inbox file
 68          $this->inboxFile->reviewer_id = $this->principalCertifier ?? User::technicalManager()?->id;
 69          $this->inboxFile->save();
 70      }
 71  
 72      public function update()
 73      {
 74          $this->authorize('update', $this->inboxFile);
 75          $this->validate();
 76  
 77          DB::beginTransaction();
 78  
 79          try {
 80              $this->assignCertifiers();
 81          } catch (\Exception $e) {
 82              DB::rollBack();
 83              logger()->error($e);
 84              $this->notification()->error(
 85                  __('inbox-files.notifications.assign.error.title'),
 86                  __('inbox-files.notifications.assign.error.message')
 87              );
 88              return;
 89          }
 90  
 91          DB::commit();
 92  
 93          $this->emitTo('inbox-files.index', 'refresh');
 94          $this->emitTo('dossier.view', 'refresh');
 95          $this->notification()->success(
 96              __('inbox-files.notifications.assign.success.title'),
 97              __('inbox-files.notifications.assign.success.message')
 98          );
 99          $this->emit('closePanel');
100      }
101  
102      public function render()
103      {
104          return view('livewire.inbox-files.assign');
105      }
106  }