/ app / Models / ValidationRequirementResponse.php
ValidationRequirementResponse.php
  1  <?php
  2  
  3  namespace App\Models;
  4  
  5  use App\Enums\ValidationRequirementResponseTypeEnum;
  6  use Illuminate\Database\Eloquent\Casts\Attribute;
  7  use Illuminate\Database\Eloquent\Factories\HasFactory;
  8  use Illuminate\Database\Eloquent\Model;
  9  use Illuminate\Database\Eloquent\SoftDeletes;
 10  use Illuminate\Support\Collection;
 11  use Spatie\Activitylog\LogOptions;
 12  use Spatie\Activitylog\Traits\LogsActivity;
 13  
 14  class ValidationRequirementResponse extends Model
 15  {
 16      use HasFactory, LogsActivity, SoftDeletes;
 17  
 18      protected $fillable = ['description', 'nonconformity_type', 'validation_requirement_id', 'validation_requirement_response_type_id', 'closure_date', 'parent_id'];
 19      protected $casts = [
 20          'closure_date' => 'date',
 21      ];
 22  
 23  
 24      public function responseType()
 25      {
 26          return $this->belongsTo(ValidationRequirementResponseType::class, 'validation_requirement_response_type_id');
 27      }
 28  
 29      public function requirement()
 30      {
 31          return $this->belongsTo(ValidationRequirement::class, 'validation_requirement_id');
 32      }
 33  
 34      public static function nonconformities()
 35      {
 36          return ValidationRequirementResponse::where('validation_requirement_response_type_id', ValidationRequirementResponseTypeEnum::nonconformity()->value)->get();
 37      }
 38  
 39      public static function observations()
 40      {
 41          return ValidationRequirementResponse::where('validation_requirement_response_type_id', ValidationRequirementResponseTypeEnum::observation()->value)->get();
 42      }
 43  
 44      public static function comments()
 45      {
 46          return ValidationRequirementResponse::where('validation_requirement_response_type_id', ValidationRequirementResponseTypeEnum::comment()->value)->get();
 47      }
 48  
 49      public function images()
 50      {
 51          return $this->hasMany(ValReqResponseImage::class);
 52      }
 53  
 54      public function workbook()
 55      {
 56          return $this->requirement->workbook ?? null;
 57      }
 58  
 59      public function correctiveAction()
 60      {
 61          return $this->hasOne(CorrectiveAction::class, 'non_conformity_id');
 62      }
 63  
 64      public function parsedDescription()
 65      {
 66          return strip_tags(htmlspecialchars_decode($this->description));
 67      }
 68  
 69      public function getActivitylogOptions(): LogOptions
 70      {
 71          return LogOptions::defaults()
 72              ->logOnly([
 73                  'id',
 74                  'description',
 75                  'code',
 76                  'nonconformity_type',
 77                  'validation_requirement_id',
 78                  'requirement.title',
 79                  'validation_requirement_response_type_id',
 80                  'responseType.name',
 81                  'closure_date',
 82              ]);
 83      }
 84  
 85  
 86      public function parent()
 87      {
 88          return $this->belongsTo(ValidationRequirementResponse::class, 'parent_id');
 89      }
 90  
 91      public function firstParent()
 92      {
 93          if (!$this->parent) {
 94              return $this;
 95          }
 96  
 97          return $this->parent->firstParent();
 98      }
 99      
100      public function child()
101      {
102          return $this->hasOne(ValidationRequirementResponse::class, 'parent_id');
103      }
104  
105      public function children()
106      {
107          return $this->hasMany(ValidationRequirementResponse::class, 'parent_id');
108      }
109  
110      public function lastChild()
111      {
112          if (!$this->child) {
113              return $this;
114          }
115  
116          return $this->child->lastChild();
117      }
118  
119      public function descendants()
120      {
121          $children = new Collection([$this]);
122          $child = $this->child;
123          while ($child) {
124              $children->push($child);
125              $child = $child->child;
126          }
127  
128          return $children;
129      }
130  }