/ app / Models / ValidationRequirement.php
ValidationRequirement.php
  1  <?php
  2  
  3  namespace App\Models;
  4  
  5  use App\Enums\ValidationRequirementResponseTypeEnum;
  6  use App\Enums\ValidationRequirementStatusEnum;
  7  use Illuminate\Database\Eloquent\Factories\HasFactory;
  8  use Illuminate\Database\Eloquent\Model;
  9  use Spatie\Activitylog\LogOptions;
 10  use Spatie\Activitylog\Traits\LogsActivity;
 11  
 12  class ValidationRequirement extends Model
 13  {
 14      use HasFactory, LogsActivity;
 15  
 16      protected $table = 'workbook_requirement_validation';
 17  
 18      protected $guarded = [];
 19  
 20      public function validation()
 21      {
 22          return $this->belongsTo(Validation::class);
 23      }
 24  
 25      public function status()
 26      {
 27          return $this->belongsTo(ValidationRequirementStatus::class, 'validation_requirement_status_id');
 28      }
 29  
 30      public function responses()
 31      {
 32          return $this->hasMany(ValidationRequirementResponse::class);
 33      }
 34  
 35      public function nonconformities()
 36      {
 37          return $this->responses()->where(
 38              'validation_requirement_response_type_id',
 39              ValidationRequirementResponseTypeEnum::nonconformity()->value
 40          )->where('parent_id', NULL);
 41      }
 42  
 43      public function hasNonconformities()
 44      {
 45          return $this->nonconformities()->count() > 0;
 46      }
 47  
 48      public function comments()
 49      {
 50          return $this->responses()->where(
 51              'validation_requirement_response_type_id',
 52              ValidationRequirementResponseTypeEnum::comment()->value
 53          );
 54      }
 55  
 56      public function hasComments()
 57      {
 58          return $this->comments()->count() > 0;
 59      }
 60  
 61      public function observations()
 62      {
 63          return $this->responses()->where(
 64              'validation_requirement_response_type_id',
 65              ValidationRequirementResponseTypeEnum::observation()->value
 66          );
 67      }
 68  
 69      public function hasObservations()
 70      {
 71          return $this->observations()->count() > 0;
 72      }
 73  
 74      public function checkStatus()
 75      {
 76          $this->refresh();
 77  
 78          $status = $this->responses()->whereNull('parent_id')->get()->contains(function ($response) {
 79              return $response->lastChild()->closure_date === null;
 80          });
 81  
 82          if ($status) {
 83              $this->update([
 84                  'validation_requirement_status_id' => ValidationRequirementStatusEnum::no_pass()->value
 85              ]);
 86          } else {
 87              $this->update([
 88                  'validation_requirement_status_id' => ValidationRequirementStatusEnum::pass()->value
 89              ]);
 90          }
 91      }
 92  
 93      public function workbook()
 94      {
 95          return $this->belongsTo(Workbook::class);
 96      }
 97  
 98      public function requirementTemplate()
 99      {
100          return $this->belongsTo(RequirementTemplate::class, 'requirement_template_id');
101      }
102  
103      public function internalNotes()
104      {
105          return $this->morphMany(InternalNote::class, 'internal_noteable');
106      }
107  
108      public function getActivitylogOptions(): LogOptions
109      {
110          return LogOptions::defaults()
111              ->logOnly([
112                  'title',
113                  'description',
114                  'validation_id',
115                  'validation.name',
116                  'workbook_id',
117                  'workbook.name',
118              ])->logOnlyDirty();
119      }
120  }