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 }