/ app / Models / Validation.php
Validation.php
  1  <?php
  2  
  3  namespace App\Models;
  4  
  5  use App\Enums\ValidationRequirementStatusEnum;
  6  use App\Enums\ValidationStatusEnum;
  7  use Illuminate\Database\Eloquent\Collection;
  8  use Illuminate\Database\Eloquent\Factories\HasFactory;
  9  use Illuminate\Database\Eloquent\Model;
 10  use Illuminate\Database\Eloquent\SoftDeletes;
 11  use Spatie\Activitylog\LogOptions;
 12  use Spatie\Activitylog\Traits\LogsActivity;
 13  
 14  class Validation extends Model
 15  {
 16      use HasFactory, LogsActivity, SoftDeletes;
 17  
 18      protected $fillable = ['validation_status_id',  'validated_at', 'validation_type_id', 'name', 'validated_report_id', 'original_dossier_id', 'reference'];
 19  
 20      public function type()
 21      {
 22          return $this->belongsTo(ValidationType::class, 'validation_type_id');
 23      }
 24  
 25      public function workbooks()
 26      {
 27          return $this->type->norm ? $this->type->norm->workbooks : null;
 28      }
 29  
 30      public function validatedReport()
 31      {
 32          return $this->belongsTo(Document::class, 'validated_report_id');
 33      }
 34  
 35      public function status()
 36      {
 37          return $this->belongsTo(ValidationStatus::class, 'validation_status_id');
 38      }
 39  
 40      public function requirements()
 41      {
 42          return $this->hasMany(ValidationRequirement::class);
 43      }
 44  
 45      public function inboxFile()
 46      {
 47          return $this->hasOne(InboxFile::class);
 48      }
 49  
 50      public function jsonDraft()
 51      {
 52          return $this->hasOne(JsonDraft::class);
 53      }
 54  
 55      public function dossier()
 56      {
 57          return $this->hasOneThrough(Dossier::class, InboxFile::class, 'validation_id', 'dossier_id',);
 58      }
 59  
 60      public function checkStatus()
 61      {
 62          $flag = ValidationRequirement::select('*')
 63              ->where([
 64                  ['validation_id', $this->id],
 65                  ['validation_requirement_status_id', '!=', ValidationRequirementStatusEnum::pass()->value],
 66              ])
 67              ->exists();
 68  
 69          $this->update([
 70              'validation_status_id' => !$flag
 71                  ? ValidationStatusEnum::pass()->value
 72                  : ValidationStatusEnum::no_pass()->value,
 73          ]);
 74  
 75          return $this->status;
 76      }
 77  
 78      public function requirementResponses()
 79      {
 80          $requirements = $this->requirements;
 81          $allResponses = new Collection;
 82  
 83          if ($requirements && count($requirements) > 0) {
 84              foreach ($requirements as $requirement) {
 85                  $responses = $requirement->responses;
 86  
 87                  if ($responses && count($responses) > 0) {
 88                      foreach ($responses as $response) {
 89                          $allResponses->push($response);
 90                      }
 91                  }
 92              }
 93          }
 94  
 95          return $allResponses;
 96      }
 97  
 98      public function requirementResponseImages()
 99      {
100          $responses = $this->requirementResponses();
101          $allImages = new Collection;
102  
103          if ($responses && count($responses) > 0) {
104              foreach ($responses as $response) {
105                  $images = $response->images;
106  
107                  if ($images && count($images) > 0) {
108                      foreach ($images as $image) {
109                          $allImages->push($image);
110                      }
111                  }
112              }
113          }
114  
115          return $allImages;
116      }
117      /**
118       * @deprecated
119       *  dont use this method, use the relationship instead
120       */
121      public function originalDossier()
122      {
123          return $this->belongsTo(Dossier::class, 'original_dossier_id');
124      }
125  
126      public function getActivitylogOptions(): LogOptions
127      {
128          return LogOptions::defaults()
129              ->logOnly([
130                  'validation_status_id',
131                  'status.name',
132                  'original_dossier_id',
133                  'validated_report_id',
134                  'validated_at',
135                  'validation_type_id',
136                  'type.name',
137              ])->logOnlyDirty()
138              ->dontSubmitEmptyLogs();
139      }
140  }