AbstractBuilder.php 4.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125
  1. <?php
  2. declare(strict_types=1);
  3. namespace App\Service\Mailer\Builder;
  4. use App\Entity\Access\Access;
  5. use App\Entity\Core\ContactPoint;
  6. use App\Entity\Organization\Organization;
  7. use App\Enum\Message\ReportMessageSatusEnum;
  8. use App\Repository\Core\ContactPointRepository;
  9. use App\Service\Mailer\Email;
  10. use App\Entity\Message\Email as EmailEntity;
  11. use App\Service\Mailer\EmailRecipient;
  12. use Symfony\Contracts\Service\Attribute\Required;
  13. use Twig\Environment;
  14. /**
  15. * Classe AbstractBuilder qui définit les fonctions de bases de chaque builder
  16. */
  17. class AbstractBuilder implements AbstractBuilderInterface
  18. {
  19. protected Environment $twig;
  20. protected ContactPointRepository $contactPointRepository;
  21. #[Required]
  22. public function setTwig(Environment $twig): void
  23. { $this->twig = $twig; }
  24. #[Required]
  25. public function setContactPointRepository(ContactPointRepository $contactPointRepository): void
  26. { $this->contactPointRepository = $contactPointRepository; }
  27. /**
  28. * @param string $subject
  29. * @param Access $author
  30. * @param string $content
  31. * @return EmailEntity
  32. */
  33. public function buildEmailEntity(string $subject, Access $author, string $content): EmailEntity{
  34. return (new EmailEntity())
  35. ->setUniqueSendId(uniqid())
  36. ->setAuthor($author)
  37. ->setAbout($subject)
  38. ->setIsSystem(true)
  39. ->setDateSent(new \DateTime('now'))
  40. ->setText($content)
  41. ;
  42. }
  43. /**
  44. * @param string $template
  45. * @param array $context
  46. * @return string
  47. * @throws \Twig\Error\LoaderError
  48. * @throws \Twig\Error\RuntimeError
  49. * @throws \Twig\Error\SyntaxError
  50. * @throws \Twig_Error_Loader
  51. * @throws \Twig_Error_Runtime
  52. * @throws \Twig_Error_Syntax
  53. */
  54. public function renderer(string $template, array $context)
  55. {
  56. return $this->twig->render(sprintf('@templates/emails/%s.html.twig', $template), $context);
  57. }
  58. /**
  59. * @param Email $email
  60. * @param Access|Organization|string $target
  61. * @param string $sendType
  62. * @param string|null $contactPointType
  63. */
  64. public function addRecipient(Email $email, Access|Organization|string $target, string $sendType, string $contactPointType = null): void{
  65. $emailRecipient = (new EmailRecipient())
  66. ->setSendType($sendType);
  67. if($target instanceof Access){
  68. $emailRecipient->setAccess($target);
  69. $emailRecipient->setName($target->getPerson()->getFullName());
  70. $this->setMailToRecipient($this->contactPointRepository->getByTypeAndPerson($contactPointType, $target->getPerson()), $emailRecipient);
  71. }else if ($target instanceof Organization){
  72. $emailRecipient->setOrganization($target);
  73. $emailRecipient->setName($target->getName());
  74. $this->setMailToRecipient($this->contactPointRepository->getByTypeAndOrganization($contactPointType, $target), $emailRecipient);
  75. }else{
  76. $emailRecipient->setSendStatus(ReportMessageSatusEnum::DELIVERED()->getValue());
  77. $emailRecipient->setEmailAddress($target);
  78. }
  79. $email->addEmailRecipient($emailRecipient);
  80. }
  81. /**
  82. * @param array $contactPoints
  83. * @param EmailRecipient $recipient
  84. */
  85. public function setMailToRecipient(array $contactPoints, EmailRecipient $recipient): void {
  86. if($contactPoint = $this->getFirstContactPointWithEmail($contactPoints)){
  87. $recipient->setSendStatus(ReportMessageSatusEnum::DELIVERED()->getValue());
  88. $recipient->setEmailAddress($contactPoint->getEmail());
  89. }else{
  90. $recipient->setSendStatus(ReportMessageSatusEnum::MISSING()->getValue());
  91. }
  92. }
  93. /**
  94. * @param $contactPoints
  95. * @return ContactPoint
  96. */
  97. public function getFirstContactPointWithEmail($contactPoints): ContactPoint{
  98. $find = false;
  99. $cmpt = 0;
  100. $contactPoint = null;
  101. while(count($contactPoints) > $cmpt && !$find){
  102. if($contactPoints[$cmpt]->getEmail()){
  103. $find = true;
  104. $contactPoint = $contactPoints[$cmpt];
  105. }
  106. $cmpt++;
  107. }
  108. return $contactPoint;
  109. }
  110. }