src/V4/Service/Prospect/ProspectFormHandler.php line 104

Open in your IDE?
  1. <?php
  2. namespace App\V4\Service\Prospect;
  3. use App\ApiFormFactory\ApiFormFactory;
  4. use App\Model\Form\FormSchema;
  5. use App\Normalizer\FormNormalizer;
  6. use App\Normalizer\ViewOrderAwareFormNormalizer;
  7. use App\Service\Form\FormUtils;
  8. use App\V4\DataProvider\CustomAction\ActionBuilder;
  9. use App\V4\Form\Type\Prospect\ProspectBusinessType;
  10. use App\V4\Form\Type\Prospect\ProspectContactSearchType;
  11. use App\V4\Form\Type\Prospect\ProspectIndividualType;
  12. use App\V4\Form\Type\Prospect\ProspectSearchType;
  13. use App\V4\Model\Address\Address;
  14. use App\V4\Model\Company\Company;
  15. use App\V4\Model\Contact\Contact;
  16. use App\V4\Model\Prospect\Prospect;
  17. use App\V4\Model\Prospect\ProspectContactSearch;
  18. use App\V4\Model\Response\Response;
  19. use App\V4\Model\Response\Result;
  20. use Exception;
  21. use Sentry\State\Scope;
  22. use Symfony\Component\Form\FormFactoryInterface;
  23. use Symfony\Component\Form\FormInterface;
  24. use Symfony\Component\HttpFoundation\JsonResponse;
  25. use Symfony\Component\HttpFoundation\Response as HttpResponse;
  26. use Symfony\Component\Serializer\Exception\ExceptionInterface;
  27. use Symfony\Component\Serializer\Normalizer\NormalizerInterface;
  28. use function Sentry\captureMessage;
  29. use function Sentry\withScope;
  30. class ProspectFormHandler
  31. {
  32.     use FormUtils;
  33.     /**
  34.      * @var FormFactoryInterface
  35.      */
  36.     private $formFactory;
  37.     /**
  38.      * @var ApiFormFactory
  39.      */
  40.     private $legacyFormFactory;
  41.     /**
  42.      * @var ViewOrderAwareFormNormalizer
  43.      */
  44.     private $viewOrderAwareFormNormalizer;
  45.     /**
  46.      * @var NormalizerInterface
  47.      */
  48.     private $normalizer;
  49.     /**
  50.      * @var FormNormalizer
  51.      */
  52.     private $formNormalizer;
  53.     /**
  54.      * @var ActionBuilder
  55.      */
  56.     private $actionBuilder;
  57.     public function __construct(
  58.         FormFactoryInterface $formFactory,
  59.         ApiFormFactory $legacyFormFactory,
  60.         ViewOrderAwareFormNormalizer $viewOrderAwareFormNormalizer,
  61.         NormalizerInterface $normalizer,
  62.         FormNormalizer $formNormalizer,
  63.         ActionBuilder $actionBuilder
  64.     ) {
  65.         $this->formFactory $formFactory;
  66.         $this->legacyFormFactory $legacyFormFactory;
  67.         $this->viewOrderAwareFormNormalizer $viewOrderAwareFormNormalizer;
  68.         $this->normalizer $normalizer;
  69.         $this->formNormalizer $formNormalizer;
  70.         $this->actionBuilder $actionBuilder;
  71.     }
  72.     /**
  73.      * @SuppressWarnings(PHPMD.BooleanArgumentFlag)
  74.      *
  75.      * @param bool $isLegacy
  76.      * @param bool $isGeolocationSearch
  77.      *
  78.      * @return JsonResponse|FormSchema
  79.      *
  80.      * @throws ExceptionInterface
  81.      */
  82.     public function getProspectSearchForm(bool $isLegacy falsebool $isGeolocationSearch false)
  83.     {
  84.         if ($isLegacy) {
  85.             return (new FormSchema())
  86.                 ->setSchema($this->legacyFormFactory->createAsJson(ProspectSearchType::class))
  87.                 ;
  88.         }
  89.         $response = new Response();
  90.         $response->setResults(
  91.             $this->viewOrderAwareFormNormalizer->normalize(
  92.                 $this->formFactory->create(ProspectSearchType::class, null, [
  93.                     'isGeolocationSearch' => $isGeolocationSearch,
  94.                 ])
  95.             )
  96.         );
  97.         return new JsonResponse(['hydra:member' => $this->normalizer->normalize($response)], HttpResponse::HTTP_OK);
  98.     }
  99.     /**
  100.      * @SuppressWarnings(PHPMD.BooleanArgumentFlag)
  101.      *
  102.      * @param string $searchRequestContent
  103.      * @param bool   $isGeolocationSearch
  104.      *
  105.      * @return FormInterface
  106.      */
  107.     public function handleProspectSearchForm(string $searchRequestContentbool $isGeolocationSearch false): FormInterface
  108.     {
  109.         $prospectSearchForm $this->formFactory->create(ProspectSearchType::class, null, [
  110.             'isGeolocationSearch' => $isGeolocationSearch,
  111.         ]);
  112.         $prospectSearchForm->submit(json_decode($searchRequestContenttrue));
  113.         return $prospectSearchForm;
  114.     }
  115.     /**
  116.      * @SuppressWarnings(PHPMD.BooleanArgumentFlag)
  117.      *
  118.      * @param Prospect $prospect
  119.      * @param string   $prospectType
  120.      * @param bool     $isLegacy
  121.      *
  122.      * @return FormSchema|JsonResponse
  123.      *
  124.      * @throws ExceptionInterface
  125.      */
  126.     public function getProspectForm(Prospect $prospectstring $prospectTypebool $isLegacy false)
  127.     {
  128.         if ($isLegacy) {
  129.             return (new FormSchema())
  130.                 ->setSchema(
  131.                     $this->legacyFormFactory->createAsJson(
  132.                         Prospect::GROUP_TYPE_INDIVIDUAL === $prospectType
  133.                             ProspectIndividualType::class
  134.                             : ProspectBusinessType::class,
  135.                         $prospect
  136.                     )
  137.                 )
  138.             ;
  139.         }
  140.         $prospectForm $this->formFactory->create(
  141.             Prospect::GROUP_TYPE_INDIVIDUAL === $prospectType
  142.                 ProspectIndividualType::class
  143.                 : ProspectBusinessType::class,
  144.             $prospect
  145.         );
  146.         $response = new Response();
  147.         $response->setResults($this->viewOrderAwareFormNormalizer->normalize($prospectForm));
  148.         if (null !== $prospect->getId()) {
  149.             $updatedInfos $this->getLastUpdatedAtUpdatedBy($prospect);
  150.             $response->addMetadata('id'$prospect->getId());
  151.             $response->addMetadata('name'$prospect->getFullname());
  152.             $response->addMetadata('isBusiness'$prospect->isBusiness());
  153.             $response->addMetadata('prospectType'$prospect->getType());
  154.             $response->addMetadata('fullname'$prospect->getFullname());
  155.             $response->addMetadata('createdBy'$prospect->getCreatedBy());
  156.             $response->addMetadata('createdAt'$prospect->getCreatedAt());
  157.             $response->addMetadata('updatedBy'$updatedInfos['lastUpdatedBy']);
  158.             $response->addMetadata('updatedAt'$updatedInfos['lastUpdatedAt']);
  159.             $response->addMetadata('prospectSubscription'$prospect->getProspectSubscriptions());
  160.             $response->addMetadata('isUnknown'$prospect->isUnknown());
  161.             $response->addMetadata('showActions'$this->actionBuilder->getActions($prospect));
  162.             $contact $prospect->getContact();
  163.             if ($contact instanceof Contact) {
  164.                 $response->addMetadata('phone'$contact->getPhone());
  165.             }
  166.             $prospectAddress $prospect->getMainAddress();
  167.             if ($prospectAddress instanceof Address) {
  168.                 $addressMetadata = [
  169.                     'address' => $prospectAddress->getAddress(),
  170.                     'city' => $prospectAddress->getCity(),
  171.                     'postalCode' => $prospectAddress->getPostalCode(),
  172.                 ];
  173.                 $response->addMetadata('address'$addressMetadata);
  174.                 $response->addMetadata('lat'$prospectAddress->getLat());
  175.                 $response->addMetadata('lng'$prospectAddress->getLng());
  176.             }
  177.         }
  178.         return new JsonResponse(['hydra:member' => $this->normalizer->normalize($response)], HttpResponse::HTTP_OK);
  179.     }
  180.     /**
  181.      * @param Prospect $prospect
  182.      *
  183.      * @return array
  184.      */
  185.     private function getLastUpdatedAtUpdatedBy(Prospect $prospect): array
  186.     {
  187.         $lastUpdatedAt $prospect->getUpdatedAt();
  188.         $lastUpdatedBy $prospect->getUpdatedBy();
  189.         if ($prospect->getCompany() instanceof Company && $lastUpdatedAt $prospect->getCompany()->getUpdatedAt()) {
  190.             $lastUpdatedAt $prospect->getCompany()->getUpdatedAt();
  191.             $lastUpdatedBy $prospect->getCompany()->getUpdatedBy();
  192.         }
  193.         if ($prospect->getContact() instanceof Contact && $lastUpdatedAt $prospect->getContact()->getUpdatedAt()) {
  194.             $lastUpdatedAt $prospect->getContact()->getUpdatedAt();
  195.             $lastUpdatedBy $prospect->getContact()->getUpdatedBy();
  196.         }
  197.         return [
  198.             'lastUpdatedAt' => $lastUpdatedAt,
  199.             'lastUpdatedBy' => $lastUpdatedBy,
  200.         ];
  201.     }
  202.     /**
  203.      * @throws ExceptionInterface
  204.      */
  205.     public function getProspectContactSearchForm(): JsonResponse
  206.     {
  207.         $normalized $this->formNormalizer->normalize($this->formFactory->create(ProspectContactSearchType::class));
  208.         $properties = [];
  209.         foreach ($normalized as $key => $property) {
  210.             $properties[] = array_merge(['key' => $key], $property);
  211.         }
  212.         $result = new Result();
  213.         $result->addMetadata('group', [
  214.             'groupName' => null,
  215.             'properties' => $properties,
  216.         ]);
  217.         $response = [
  218.             'results' => [
  219.                 'group' => [
  220.                     'groupName' => null,
  221.                     'properties' => $properties,
  222.                 ],
  223.             ],
  224.         ];
  225.         return new JsonResponse(['hydra:member' => $this->normalizer->normalize($response)], HttpResponse::HTTP_OK);
  226.     }
  227.     /**
  228.      * @throws ExceptionInterface
  229.      * @throws Exception
  230.      */
  231.     public function handleProspectContactSearchForm(array $content): array
  232.     {
  233.         $prospectContactSearchForm $this->formFactory->create(ProspectContactSearchType::class);
  234.         $prospectContactSearchForm->submit($content);
  235.         if ($prospectContactSearchForm->isSubmitted() && $prospectContactSearchForm->isValid()) {
  236.             $prospectContactSearch $prospectContactSearchForm->getData();
  237.             return $this->normalizer->normalize($prospectContactSearch ?? new ProspectContactSearch());
  238.         }
  239.         $errors $this->convertFormErrorsToArray($prospectContactSearchForm);
  240.         withScope(function (Scope $scope) use ($content$errors) {
  241.             $scope
  242.                 ->setExtra('catchOnClass'self::class)
  243.                 ->setExtra('method''handleProspectContactSearchForm')
  244.                 ->setExtra('formCalled''ProspectContactSearchType')
  245.                 ->setExtra('content'$content)
  246.                 ->setExtra('errors'$errors)
  247.                 ->setTag('PostProspectContactSearchFormAction''searchForm');
  248.             captureMessage('Invalid prospect contact search form submission');
  249.         });
  250.         return $errors;
  251.     }
  252. }