/ app / Http / Services / NonConformityService.php
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  }