/ app / Models / InboxFile.php
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  }