InboxFile.php
1 <?php 2 3 namespace App\Models; 4 5 use App\Enums\InboxFileTypeEnum; 6 use App\Enums\InboxFileStatusEnum; 7 use App\Utils\InboxFileInterface; 8 use Illuminate\Database\Eloquent\Builder; 9 use Illuminate\Database\Eloquent\Model; 10 use Illuminate\Database\Eloquent\Relations\BelongsTo; 11 use Overtrue\LaravelVersionable\Versionable; 12 use Illuminate\Contracts\Database\Query\Builder as BuilderContract; 13 use Illuminate\Database\Eloquent\SoftDeletes; 14 use Illuminate\Support\Arr; 15 16 class InboxFile extends Model implements InboxFileInterface 17 { 18 use Versionable, SoftDeletes; 19 20 /** 21 * Versionable attributes 22 * 23 * @var array 24 */ 25 protected $versionable = ['user_id', 'path', 'version', 'validation_id']; 26 protected $fillable = ['path']; 27 28 public function dossier(): BelongsTo 29 { 30 return $this->belongsTo(Dossier::class); 31 } 32 33 public function user(): BelongsTo 34 { 35 return $this->belongsTo(User::class); 36 } 37 38 public function reviewer(): BelongsTo 39 { 40 return $this->belongsTo(User::class, 'reviewer_id'); 41 } 42 43 public function validation(): BelongsTo 44 { 45 return $this->belongsTo(Validation::class)->where('is_review', false); 46 } 47 48 public function review(): BelongsTo 49 { 50 return $this->belongsTo(Validation::class)->where('is_review', true); 51 } 52 53 public function getFilename(): string 54 { 55 return $this->path; 56 } 57 58 public function getIsReviewedAttribute(): bool 59 { 60 return $this?->validation?->validatedReport?->isReviewed() ?? false; 61 } 62 63 public function scopeEtr(Builder $query) 64 { 65 $query->where('type', InboxFileTypeEnum::ETR()->value); 66 } 67 68 public function scopePartialReport(Builder $query) 69 { 70 $query->where('type', InboxFileTypeEnum::partial_report()->value); 71 } 72 73 public function scopeFilter(Builder $query, string $sortField, string $sortDirection, array $filters = []) 74 { 75 $query->when(!auth()->user()->hasAnyRole(['root', 'technical_manager']), function ($query) { 76 $query->where(function ($query) { 77 $query->whereHas('dossier.users', function ($query) { 78 $query->where('users.id', auth()->id()); 79 })->orWhereHas('dossier', function ($query) { 80 $query->where('principal_certifier_id', auth()->id()); 81 }); 82 }); 83 }) 84 ->when($sortDirection && $sortField, function ($query) use ($sortField, $sortDirection) { 85 $query->orderBy($sortField, $sortDirection); 86 }) 87 ->when($filters && isset($filters['onlyCompleted']), function ($query) use ($filters) { 88 $query->whereIsValidated($filters['onlyCompleted']); 89 }) 90 ->when($filters && isset($filters['reviewed']), function ($query) use ($filters) { 91 $query->when($filters['reviewed'], function ($query) { 92 $query->whereHas('validation.validatedReport.review', function ($query) { 93 $query->where('has_passed', true); 94 }); 95 }, function ($query) { 96 $query->whereDoesntHave('validation.validatedReport.review'); 97 }); 98 }) 99 ->when($filters && is_array($filters['reviewed_by']) && !empty($filters['reviewed_by']), function ($query) use ($filters) { 100 $query->whereHas('validation.validatedReport.review', function ($query) use ($filters) { 101 $query->WhereIn('author_id', $filters['reviewed_by']); 102 }); 103 }) 104 ->when($filters && isset($filters['approved']), function ($query) use ($filters) { 105 $query->when($filters['approved'], function ($query) { 106 $query->whereHas('validation.validatedReport.approval', function ($query) { 107 $query->where('has_passed', true); 108 }); 109 }, function ($query) { 110 $query->whereDoesntHave('validation.validatedReport.approval'); 111 }); 112 }) 113 ->when($filters && $filters['search'], function ($query) use ($filters) { 114 $query->where(function ($query) use ($filters) { 115 $query->where('path', 'like', "%" . $filters['search'] . "%") 116 ->orWhere('name', 'like', "%" . $filters['search'] . "%") 117 ->orWhere('version', $filters['search']); 118 }); 119 }) 120 ->when($filters && $filters['types'], function ($query) use ($filters) { 121 $query->whereIn('type', $filters['types']); 122 }) 123 ->when($filters && $filters['certifiers'], function ($query) use ($filters) { 124 $query->where(function ($query) use ($filters) { 125 $query->whereHas('dossier', function ($query) use ($filters) { 126 $query->whereIn('principal_certifier_id', $filters['certifiers']); 127 })->orWhereHas('dossier.users', function ($query) use ($filters) { 128 $query->whereIn('users.id', $filters['certifiers']) 129 ->whereIn('role_id', [ 130 \App\Enums\RoleEnum::secondaryCertifier()->value, 131 \App\Enums\RoleEnum::externalCertifier()->value 132 ]); 133 }); 134 }); 135 }) 136 ->when($filters && $filters['status_ids'], function ($query) use ($filters) { 137 $query->whereIn('status_id', $filters['status_ids']); 138 }) 139 ->when($filters && $filters['report_status_ids'], function ($query) use ($filters) { 140 $query->whereHas('validation', function ($query) use ($filters) { 141 $query->whereIn('validation_status_id', $filters['report_status_ids']); 142 }); 143 }); 144 foreach ( 145 [ 146 'created_at_since' => 'created_at', 147 'created_at_to' => 'created_at', 148 'updated_at_since' => 'updated_at', 149 'updated_at_to' => 'updated_at', 150 ] as $filter => $column 151 ) { 152 if ($filters && $filters[$filter]) { 153 $query->where($column, str_contains($filter, '_since') ? '>=' : '<=', $filters[$filter]); 154 } 155 } 156 } 157 158 public function document() 159 { 160 return $this->belongsTo(Document::class); 161 } 162 163 public function getStatusAttribute(): ?InboxFileStatusEnum 164 { 165 return InboxFileStatusEnum::make($this->status_id); 166 } 167 168 public function setStatusAttribute(InboxFileStatusEnum $value): void 169 { 170 $this->attributes['status_id'] = $value->value; 171 } 172 173 public function isPassed(): bool 174 { 175 return $this->status->equals(InboxFileStatusEnum::pass()); 176 } 177 }