src/Controller/Api/CreateOrUpdateDocumentAction.php line 39

Open in your IDE?
  1. <?php
  2. namespace App\Controller\Api;
  3. use App\Enum\DocumentTypeOrganizationEnum;
  4. use App\Repository\OrganizationRepository;
  5. use App\Service\OrganizationUtils;
  6. use Doctrine\ORM\OptimisticLockException;
  7. use Doctrine\ORM\ORMException;
  8. use Evo\Infrastructure\MappingORM\Document;
  9. use Symfony\Component\HttpFoundation\Request;
  10. use Symfony\Component\HttpKernel\Exception\BadRequestHttpException;
  11. use Symfony\Component\Serializer\Exception\ExceptionInterface;
  12. use Symfony\Component\Serializer\Normalizer\AbstractNormalizer;
  13. use Symfony\Component\Serializer\SerializerInterface;
  14. use Symfony\Contracts\Translation\TranslatorInterface;
  15. final class CreateOrUpdateDocumentAction
  16. {
  17.     private OrganizationUtils $organizationUtils;
  18.     private OrganizationRepository $organizationRepository;
  19.     private TranslatorInterface $translator;
  20.     public function __construct(
  21.         OrganizationUtils $organizationUtils,
  22.         OrganizationRepository $organizationRepository,
  23.         TranslatorInterface $translator
  24.     ) {
  25.         $this->organizationUtils $organizationUtils;
  26.         $this->organizationRepository $organizationRepository;
  27.         $this->translator $translator;
  28.     }
  29.     /**
  30.      * @throws ExceptionInterface
  31.      * @throws ORMException
  32.      * @throws OptimisticLockException
  33.      */
  34.     public function __invoke(Request $requestSerializerInterface $serializer): Document
  35.     {
  36.         $currentDocument $request->attributes->get('data');
  37.         $arrayDocument $request->request->all();
  38.         if (!$arrayDocument) {
  39.             $arrayDocument json_decode($request->getContent(), true);
  40.         }
  41.         if (!$currentDocument->getId() && (!isset($arrayDocument['type']) || !$arrayDocument['type'])) {
  42.             throw new BadRequestHttpException('"Type" est requis');
  43.         }
  44.         if (!isset($arrayDocument['organization']) || !$documents $this->generate($arrayDocument)) {
  45.             $documentFile $request->files->get('documentFile');
  46.             if (!$currentDocument->getId() && !$documentFile) {
  47.                 throw new BadRequestHttpException('"documentFile" is required');
  48.             }
  49.             /** @var Document $document */
  50.             $document $serializer->denormalize(
  51.                 $arrayDocument,
  52.                 Document::class,
  53.                 null,
  54.                 [AbstractNormalizer::OBJECT_TO_POPULATE => $currentDocument]
  55.             );
  56.             if ($documentFile) {
  57.                 $document->setPath(null);
  58.                 $document->setAwsPath(null);
  59.                 $document->setDocumentFile($documentFile);
  60.             }
  61.             $documents = [$document];
  62.         }
  63.         return $documents[0];
  64.     }
  65.     /**
  66.      * @param array<string, array<bool|float|int|string>|bool|float|int|string> $arrayDocument
  67.      *
  68.      * @throws ORMException
  69.      * @throws OptimisticLockException
  70.      *
  71.      * @return array<Document|mixed>
  72.      */
  73.     private function generate(array $arrayDocument): array
  74.     {
  75.         $documents = [];
  76.         $organization $this->organizationRepository->find((int) basename($arrayDocument['organization']));
  77.         if (null !== $organization) {
  78.             switch (true) {
  79.                 case isset($arrayDocument['isAbleToGenerate'], $arrayDocument['type']) && 'true' == $arrayDocument['isAbleToGenerate']:
  80.                     $docsToGenerate = [$arrayDocument['type']];
  81.                     $documents[] = $this->organizationUtils->generateDocs(
  82.                         $organization,
  83.                         DocumentTypeOrganizationEnum::DOMICILIATION_CONTRACT == $arrayDocument['type'],
  84.                         $docsToGenerate,
  85.                         true
  86.                     );
  87.                     break;
  88.                 case isset($arrayDocument['isPappersAbleToGenerate']) && 'true' == $arrayDocument['isPappersAbleToGenerate']:
  89.                     $trans DocumentTypeOrganizationEnum::getReadableValue($arrayDocument['type']);
  90.                     $document = new Document();
  91.                     $document
  92.                         ->setType($arrayDocument['type'])
  93.                         ->setStatus($arrayDocument['status'])
  94.                         ->setOrganization($organization)
  95.                         ->setName($this->translator->trans($trans));
  96.                     $organization->addDocument($document);
  97.                     $documents[] = $document;
  98.                     break;
  99.             }
  100.         }
  101.         return $documents;
  102.     }
  103. }