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 }