NonConformityService.php
1 <?php 2 3 namespace App\Http\Services; 4 5 use App\Models\Dossier; 6 use App\Models\NonConformity; 7 use App\Models\ValidationRequirementResponse; 8 use App\Models\ValidationRequirementResponseType; 9 10 class NonConformityService 11 { 12 public static function searchNonconformities(string $sortfield, string $sortDirection, array|null $filters) 13 { 14 $query = ValidationRequirementResponse::query(); 15 $query 16 ->when($filters && $filters['created_at_since'], function ($query) use ($filters) { 17 $query->where('created_at', '>=', $filters['created_at_since']); 18 }) 19 ->when($filters && $filters['created_at_to'], function ($query) use ($filters) { 20 $query->where('created_at', '<=', $filters['created_at_to']); 21 }) 22 ->when($filters && $filters['updated_at_since'], function ($query) use ($filters) { 23 $query->where('updated_at', '>=', $filters['updated_at_since']); 24 }) 25 ->when($filters && $filters['updated_at_to'], function ($query) use ($filters) { 26 $query->where('updated_at', '<=', $filters['updated_at_to']); 27 }) 28 // ->when($filters && $filters['closure_date_since'], function ($query) use ($filters) { 29 // $query->where('closure_date', '>=', $filters['closure_date_since']); 30 // }) 31 // ->when($filters && $filters['closure_date_to'], function ($query) use ($filters) { 32 // $query->where('closure_date', '<=', $filters['closure_date_to']); 33 // }) 34 ->when($filters && $filters['dossier_id'] != null, function ($query) use ($filters) { 35 36 $query->whereHas('requirement', function ($query) use ($filters) { 37 $query->whereHas('validation', function ($query) use ($filters) { 38 $query->whereHas('inboxFile', function ($query) use ($filters) { 39 $query->where('dossier_id', $filters['dossier_id']); 40 }); 41 }); 42 }); 43 }) 44 ->when($filters && $filters['status'], function ($query) use ($filters) { 45 $query->whereHas('requirement', function ($query) use ($filters) { 46 $query->whereHas('status', function ($query) use ($filters) { 47 $query->where('name', $filters['status']); 48 }); 49 }); 50 }) 51 ->when($filters && !empty($filters['type']), function ($query) use ($filters) { 52 $query->whereIn('validation_requirement_response_type_id', $filters['type']); 53 }) 54 ->where(function($query){ 55 $query->whereHas('requirement.validation.inboxFile') 56 ->orWhereHas('requirement.validation.jsonDraft'); 57 }); 58 return $query 59 ->orderBy($sortfield, $sortDirection) 60 ->paginate(10); 61 } 62 63 public static function addCorrectiveActionFromCAPJson(array $cap, int $dossierId) 64 { 65 try { 66 $reference = $cap['information']['validationReference']; 67 foreach ($cap['nonconformities'] as $nonConformities) { 68 self::createCorrectiveAction('NonConformity', $nonConformities, $dossierId, $reference); 69 } 70 71 foreach ($cap['observations'] as $observations) { 72 self::createCorrectiveAction('Observation', $observations, $dossierId, $reference); 73 } 74 75 foreach ($cap['comments'] as $comments) { 76 self::createCorrectiveAction('Comment', $comments, $dossierId, $reference); 77 } 78 } catch (\Exception $e) { 79 log_exception($e); 80 } 81 } 82 83 public static function createCorrectiveAction(string $NonConformityType, array $data, int $dossierId, string $reference) 84 { 85 $type = ValidationRequirementResponseType::where('name', $NonConformityType)->first(); 86 $code = $data['id']; 87 $nonConformity = ValidationRequirementResponse::query() 88 ->whereHas('requirement', function ($query) use ($dossierId, $type, $code, $reference) { 89 $query->whereHas('validation', function ($query) use ($dossierId, $type, $code, $reference) { 90 $query->where('reference', $reference); 91 $query->whereHas('inboxFile', function ($query) use ($dossierId, $type, $code) { 92 $query->where('dossier_id', $dossierId)->where('code', $type->short_name . $code . 'v1')->whereNull('parent_id'); 93 }); 94 }); 95 })->first() ?? ValidationRequirementResponse::query() 96 ->whereHas('requirement', function ($query) use ($dossierId, $type, $code, $reference) { 97 $query->whereHas('validation', function ($query) use ($dossierId, $type, $code, $reference) { 98 $query->where('reference', $reference); 99 $query->whereHas('jsonDraft', function ($query) use ($dossierId, $type, $code) { 100 $query->where('dossier_id', $dossierId)->where('code', $type->short_name . $code.'v1')->whereNull('parent_id'); 101 }); 102 }); 103 })->first(); 104 105 if (!$nonConformity->correctiveAction) { 106 $nonConformity->correctiveAction()->create([ 107 'cause_analysis' => $data['iterations'][0]['causeAnalysis'], 108 'correction' => $data['iterations'][0]['correction'], 109 'corrective_action' => $data['iterations'][0]['correctiveAction'], 110 'evidence' => $data['iterations'][0]['evidence'], 111 ]); 112 } 113 $childrenNonconformity = $nonConformity->children; 114 foreach ($childrenNonconformity as $key => $child) { 115 $child->correctiveAction()->create( 116 [ 117 'cause_analysis' => $data['iterations'][$key+1]['causeAnalysis'], 118 'correction' => $data['iterations'][$key+1]['correction'], 119 'corrective_action' => $data['iterations'][$key+1]['correctiveAction'], 120 'evidence' => $data['iterations'][$key+1]['evidence'], 121 ] 122 ); 123 } 124 } 125 126 }