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 }