src/Controller/Api/LetterController.php line 226

Open in your IDE?
  1. <?php
  2. namespace App\Controller\Api;
  3. use App\Enum\LetterStatusEnum;
  4. use App\Enum\LetterTypeEnum;
  5. use App\Enum\OrganizationForwardingFrequencyEnum;
  6. use App\Message\ResendLetterMessage;
  7. use App\Repository\LetterRepository;
  8. use App\Repository\OrganizationRepository;
  9. use App\Service\EncryptorDataUtils;
  10. use App\Service\LetterFilesService;
  11. use App\Service\OrganizationUtils;
  12. use App\Service\UserChecker;
  13. use App\Traits\SentryNotifyTrait;
  14. use App\Utils\UserUtils;
  15. use Doctrine\ORM\EntityManagerInterface;
  16. use Doctrine\ORM\Query\QueryException;
  17. use Evo\Infrastructure\MappingORM\Letter;
  18. use Evo\Infrastructure\MappingORM\LetterForward;
  19. use Evo\Infrastructure\MappingORM\Organization;
  20. use Evo\Infrastructure\MappingORM\User;
  21. use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
  22. use Symfony\Component\HttpFoundation\JsonResponse;
  23. use Symfony\Component\HttpFoundation\Request;
  24. use Symfony\Component\HttpFoundation\Response;
  25. use Symfony\Component\Messenger\Bridge\AmazonSqs\Transport\AmazonSqsFifoStamp;
  26. use Symfony\Component\Messenger\Envelope;
  27. use Symfony\Component\Messenger\MessageBusInterface;
  28. use Symfony\Component\Routing\Annotation\Route;
  29. use Symfony\Component\Routing\Generator\UrlGeneratorInterface;
  30. use Symfony\Contracts\Translation\TranslatorInterface;
  31. /**
  32.  * @Route("/letter")
  33.  */
  34. class LetterController extends AbstractController
  35. {
  36.     use SentryNotifyTrait;
  37.     private OrganizationUtils $organizationUtils;
  38.     private LetterFilesService $letterFilesService;
  39.     private EncryptorDataUtils $encryptor;
  40.     private UserChecker $userChecker;
  41.     private EntityManagerInterface $entityManager;
  42.     private UserUtils $userUtils;
  43.     private MessageBusInterface $bus;
  44.     private LetterRepository $letterRepository;
  45.     private UrlGeneratorInterface $router;
  46.     /**
  47.      * LetterController constructor.
  48.      */
  49.     public function __construct(
  50.         OrganizationUtils $organizationUtils,
  51.         EncryptorDataUtils $encryptor,
  52.         LetterFilesService $letterFilesService,
  53.         UserChecker $userChecker,
  54.         UserUtils $userUtils,
  55.         EntityManagerInterface $entityManager,
  56.         MessageBusInterface $bus,
  57.         LetterRepository $letterRepository,
  58.         UrlGeneratorInterface $router
  59.     ) {
  60.         $this->organizationUtils $organizationUtils;
  61.         $this->letterFilesService $letterFilesService;
  62.         $this->encryptor $encryptor;
  63.         $this->userUtils $userUtils;
  64.         $this->userChecker $userChecker;
  65.         $this->entityManager $entityManager;
  66.         $this->bus $bus;
  67.         $this->letterRepository $letterRepository;
  68.         $this->router $router;
  69.     }
  70.     /**
  71.      * @Route("/get-types", name="app_letter_get_types", methods={"GET"})
  72.      *
  73.      * @return JsonResponse
  74.      */
  75.     public function getTypes(TranslatorInterface $translator)
  76.     {
  77.         $letterTypes = [];
  78.         $letterEnums LetterTypeEnum::getChoices();
  79.         foreach ($letterEnums as $key => $value) {
  80.             $letterTypes[$translator->trans($key)] = $value;
  81.         }
  82.         return $this->json($letterTypes);
  83.     }
  84.     /**
  85.      * @Route("/get-status-translations", name="app_letter_get_status_translations", methods={"GET"})
  86.      *
  87.      * @return JsonResponse
  88.      */
  89.     public function getStatusTranslations(TranslatorInterface $translator)
  90.     {
  91.         $letterStatus = [];
  92.         $letterEnums LetterStatusEnum::getChoices();
  93.         foreach ($letterEnums as $key => $value) {
  94.             $letterStatus[$value] = $translator->trans($key);
  95.         }
  96.         return $this->json($letterStatus);
  97.     }
  98.     /**
  99.      * @Route("/redirect-all-by-organization/{id}", name="app_letter_redirect_all_by_organization", methods={"GET"})
  100.      *
  101.      * @return JsonResponse
  102.      */
  103.     public function redirectAllByOrganization($id)
  104.     {
  105.         $em $this->getDoctrine()->getManager();
  106.         $organizations $em->getRepository(Organization::class)->findBy(['id' => $id]);
  107.         $this->forwardLetters($organizationstrue);
  108.         return $this->json(['ok']);
  109.     }
  110.     private function forwardLetters(array $organizationsbool $isCheckReex false): bool
  111.     {
  112.         $em $this->getDoctrine()->getManager();
  113.         /** @var Organization $organization */
  114.         foreach ($organizations as $organization) {
  115.             if ($this->organizationUtils->hasReexpedition($organization) || $isCheckReex) {
  116.                 $letters $em->getRepository(Letter::class)->getLetterToForward($organization->getId());
  117.                 $letterForward = new LetterForward();
  118.                 $letterForward->setOrganization($organization);
  119.                 $letterForward->setIsDone(true);
  120.                 /** @var Letter $letter */
  121.                 foreach ($letters as $letter) {
  122.                     $letter->setStatus(LetterStatusEnum::SENT);
  123.                     $em->persist($letter);
  124.                     $letterForward->addLetter($letter);
  125.                 }
  126.                 if (count($letterForward->getLetters()) > 0) {
  127.                     $em->persist($letterForward);
  128.                     $em->flush();
  129.                 }
  130.             }
  131.         }
  132.         return true;
  133.     }
  134.     /**
  135.      * @Route("/resend-letter-organizations/{postalCode}/{frequency}/{isDomisimple}", name="app_letter_weekly_redirect_all_organizations", methods={"GET"})
  136.      *
  137.      * @throws QueryException
  138.      */
  139.     public function weeklyRedirectByOrganization(int $postalCodestring $frequencybool $isDomisimple false): JsonResponse
  140.     {
  141.         $em $this->getDoctrine()->getManager();
  142.         /** @var OrganizationRepository $orgaRepo */
  143.         $orgaRepo $em->getRepository(Organization::class);
  144.         $organizations $orgaRepo->findByForwardable($postalCodeOrganizationForwardingFrequencyEnum::getEnum($frequency), $isDomisimple);
  145.         $organizationsCount iterator_count($orgaRepo->findByForwardable($postalCodeOrganizationForwardingFrequencyEnum::getEnum($frequency), $isDomisimple));
  146.         foreach ($organizations as $organization) {
  147.             $this->bus->dispatch(
  148.                 (new Envelope(new ResendLetterMessage(
  149.                     $organization['id'],
  150.                     $organization['forwardingFrequency'],
  151.                     $organization['legalName'],
  152.                     $organization['bal'],
  153.                     $organization['statusInvoicePayed'],
  154.                     $organization['uniqId']
  155.                 )))->with(
  156.                     new AmazonSqsFifoStamp('Letter'uniqid(''true))
  157.                 )
  158.             );
  159.         }
  160.         // envoi d'un message de fin avec nombre initial d'orga a traité + nombre restant qui devrait etre 0
  161.         $this->bus->dispatch(
  162.             (new Envelope(new ResendLetterMessage(
  163.                 'END',
  164.                 OrganizationForwardingFrequencyEnum::WEEKLY,
  165.                 null,
  166.                 null,
  167.                 null,
  168.                 null,
  169.                 $postalCode,
  170.                 $organizationsCount
  171.             )))->with(
  172.                 new AmazonSqsFifoStamp('Letter'uniqid(''true))
  173.             )
  174.         );
  175.         return $this->json(["La réexpédition a débuté, $organizationsCount organisation(s) en cours de traitement."]);
  176.     }
  177.     /**
  178.      * @Route("/domisimple-redirect-all-organizations/{postalCode}/list", name="app_letter_domisimple_redirect_all_organizations_list", methods={"GET"})
  179.      */
  180.     public function domisimpleRedirectByOrganizationList(int $postalCode): JsonResponse
  181.     {
  182.         $em $this->getDoctrine()->getManager();
  183.         $organizations $em->getRepository(Organization::class)->findByForwardable(
  184.             $postalCode,
  185.             OrganizationForwardingFrequencyEnum::QUARTERLY,
  186.             true
  187.         );
  188.         return $this->json($organizations);
  189.     }
  190.     /**
  191.      * @Route("/view/{id}/type/{type}/{token}", name="app_letter_view", methods={"GET"})
  192.      *
  193.      * @return JsonResponse
  194.      */
  195.     public function viewDocument(Request $request$id$type$token null)
  196.     {
  197.         $repository $this->entityManager->getRepository(Letter::class);
  198.         /** @var User $user */
  199.         $user $this->userChecker->checkUserByToken($token);
  200.         $id $this->encryptor->decrypt($id);
  201.         /** @var Letter $letter */
  202.         $letter $repository->find($id);
  203.         if (!$user || !$letter) {
  204.             return $this->json(['result' => 'Document not found'], Response::HTTP_NOT_FOUND);
  205.         }
  206.         $prescriberOrganizations $this->userUtils->getOrganizationPrescribersID($user);
  207.         $organization $letter->getOrganization();
  208.         if ($organization
  209.             && (in_array($user$organization->getUsers())
  210.                 || in_array('ROLE_ADMIN'$user->getRoles()) || ($organization->getPrescriber() && in_array($organization->getPrescriber()->getId(), $prescriberOrganizations)))) {
  211.             if ($request->query->get('download')) {
  212.                 $this->letterFilesService->downloadLetter($letter->getContentPathAWS());
  213.             }
  214.             $this->letterFilesService->viewLetter($letter$type);
  215.         }
  216.         return $this->json(['result' => 'Document not found'], Response::HTTP_NOT_FOUND);
  217.     }
  218.     /**
  219.      * @Route("/get-nbr-letter/{type}/{orgaId}", name="app_letter_parcel", methods={"GET"})
  220.      */
  221.     public function letterParcel(string $typeint $orgaIdLetterRepository $letterRepository): JsonResponse
  222.     {
  223.         $arrStatus $this->convertStatusToArray($type);
  224.         $result $letterRepository->getNumberLetterOrParcel($arrStatus$orgaId);
  225.         return $this->json(['result' => count($result)], Response::HTTP_OK);
  226.     }
  227.     private function convertStatusToArray(string $status): array
  228.     {
  229.         return explode(','$status);
  230.     }
  231.     /**
  232.      * @Route("/zapier", name="app_letter_invoice", methods={"GET"})
  233.      */
  234.     public function getLastLetterByOrganisation(): JsonResponse
  235.     {
  236.         $userRepository $this->entityManager->getRepository(User::class);
  237.         $organizations $userRepository->getOrganizationsByUser($this->getUser()->getUsername());
  238.         if (is_array($organizations) && !empty($organizations)) {
  239.             $letter $this->letterRepository->getLastLetterWithOrganization($organizations);
  240.             if (is_array($letter) && !empty($letter)) {
  241.                 $url $this->router->generate(
  242.                     'app_letter_view',
  243.                     ['id' => $this->encryptor->encrypt($letter['id']), 'type' => 'recto'],
  244.                     UrlGeneratorInterface::ABSOLUTE_URL
  245.                 );
  246.                 $letter['contentUrl'] = $url;
  247.                 $letter['createdAt'] = $letter['createdAt']->format('d/m/Y');
  248.                 return new JsonResponse([$letter]);
  249.             }
  250.             return new JsonResponse(['error' => 'Letter not found']);
  251.         }
  252.         return new JsonResponse(['error' => 'Organization not found']);
  253.     }
  254. }