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 }