/ app / Http / Services / EMLService.php
EMLService.php
  1  <?php
  2  
  3  namespace App\Http\Services;
  4  
  5  use App\Models\Dossier;
  6  use App\Models\EMLTemplate;
  7  use App\Models\User;
  8  use DB;
  9  use Exception;
 10  use Illuminate\Support\Collection;
 11  use Illuminate\Support\Facades\Lang;
 12  use Illuminate\Support\Facades\Storage;
 13  use RecursiveDirectoryIterator;
 14  use RecursiveTreeIterator;
 15  
 16  class EMLService
 17  {
 18      public static function getTemplateNames(?string $phase = null, string $locale): array
 19      {
 20          return EMLTemplate::where('language', $locale)
 21              ->orderBy('title')
 22              ->get()
 23              ->filter(function ($emlTemplate) use ($phase) {
 24                  return !$phase || str_contains($emlTemplate->title, $phase);
 25              })
 26              ->map(function ($emlTemplate) use ($locale) {
 27                  $nameParts = explode(DIRECTORY_SEPARATOR, explode('.', $emlTemplate->title)[0]);
 28                  $name = $locale . '.' . end($nameParts);
 29                  return [
 30                      'id' => $emlTemplate->id,
 31                      'name' => Lang::has('eml.panel.form.type.' . $name) ? __('eml.panel.form.type.' . $name) : end($nameParts),
 32                      'filter' => explode('.', $name)[1],
 33                  ];
 34              })->toArray();
 35      }
 36  
 37      public static function getDataFromEmailsParser(Dossier $dossier, string $filter, bool &$encrypt, array &$usersTo, array &$usersCC, array &$usersBCC): void
 38      {
 39          $emailMapping = collect(json_decode(Storage::disk('local')->get('emls/email_mapping.json'), true)['emails']);
 40          $emailConfig = $emailMapping->where('template_path', $filter)->first();
 41  
 42          if (!$emailConfig) {
 43              return;
 44          }
 45          $usersTo = [];
 46          $usersCC = [];
 47          $usersBCC = [];
 48  
 49          $encrypt = $emailConfig['encrypted'];
 50          // Process receivers
 51          foreach ($emailConfig['receivers']['to'] as $receiver) {
 52              $usersTo =  self::fillArrayWithUsers($dossier, $receiver);
 53          }
 54  
 55          foreach ($emailConfig['receivers']['cc'] as $receiver) {
 56              $usersCC = self::fillArrayWithUsers($dossier, $receiver);
 57          }
 58  
 59          foreach ($emailConfig['receivers']['bcc'] as $receiver) {
 60              $usersBCC = self::fillArrayWithUsers($dossier, $receiver);
 61          }
 62  
 63  
 64      }
 65  
 66  
 67      private static function fillArrayWithUsers(Dossier $dossier, string $entity): array
 68      {
 69          return match ($entity) {
 70              'vendor' => $dossier->applicant?->pointsOfContact()->pluck('id')->toArray() ?? [],
 71              'lab' => $dossier->laboratory?->pointsOfContact()->pluck('id')->toArray() ?? [],
 72              'externos' => $dossier->externalCertifiers()->pluck('id')->toArray() ?? [],
 73              default => [],
 74          };
 75      }
 76  
 77      public static function getTypeOfReceiver(array &$usersTo, array &$usersCC, array &$usersBCC, User $userToSearch): string
 78      {
 79          // I have to check if the user is in the array of usersTo, usersCC or usersBCC, return the type of receiver and remove it from the array
 80          if (($key = array_search($userToSearch->id, $usersTo)) !== false) {
 81              unset($usersTo[$key]);
 82              return 'normal';
 83          } elseif (($key = array_search($userToSearch->id, $usersCC)) !== false) {
 84              unset($usersCC[$key]);
 85              return 'cc';
 86          } elseif (($key = array_search($userToSearch->id, $usersBCC)) !== false) {
 87              unset($usersBCC[$key]);
 88              return 'bcc';
 89          }
 90  
 91          return 'normal';
 92      }
 93  
 94      public static function search(string $searchString, string $sortField, string $sortDirection, array|null $filters)
 95      {
 96          $emlTemplatesQuery = EMLTemplate::query();
 97  
 98          $emlTemplatesQuery->where('title', 'like', '%' . $searchString . '%');
 99  
100          $emlTemplatesQuery->when($filters['isInternal'], function ($query) use ($filters) {
101              $query->where('isInternal', $filters['isInternal']);
102          });
103  
104          $emlTemplatesQuery->when($filters['language'], function ($query) use ($filters) {
105              $query->where('language', $filters['language']);
106          });
107  
108          if ($filters && $filters['created_at_since']) {
109              $emlTemplatesQuery->where('created_at', '>=', $filters['created_at_since']);
110          }
111  
112          if ($filters && $filters['created_at_to']) {
113              $emlTemplatesQuery->where('created_at', '<=', $filters['created_at_to']);
114          }
115  
116          if ($sortField && $sortDirection) {
117              $emlTemplatesQuery->orderBy($sortField, $sortDirection);
118          }
119  
120          return $emlTemplatesQuery;
121      }
122  
123      public static function findEMLTemplate(int $emlTemplateId): EMLTemplate
124      {
125          return EMLTemplate::find($emlTemplateId);
126      }
127  
128      public static function createEMLTemplate(array $data)
129      {
130          return EMLTemplate::create($data);
131      }
132  
133      public static function updateEMLTemplate(int $id, array $data)
134      {
135          $emlTemplate = EMLTemplate::findOrFail($id);
136  
137          return $emlTemplate->update($data);
138      }
139  
140      public static function removeEMLTemplate(int $emlTemplateId): void
141      {
142          try {
143              DB::beginTransaction();
144              EMLTemplate::destroy($emlTemplateId);
145              DB::commit();
146          } catch (Exception $e) {
147              DB::rollBack();
148              log_exception($e);
149              throw new Exception(__('eml.template.notifications.remove.error.message'));
150          }
151      }
152  }