src/Controller/Participation/OdrController.php line 74

Open in your IDE?
  1. <?php
  2. namespace App\Controller\Participation;
  3. use App\Controller\APIController;
  4. use App\Form\Participation\OdrParticipationType;
  5. use App\Form\User\UserRegisterType;
  6. use App\Manager\Participation\ParticipationOdrManager;
  7. use App\Manager\ParticipationManager;
  8. use App\Manager\User\UserManager;
  9. use App\Model\Operation\Odr;
  10. use App\Model\Participation\Odr as ParticipationOdr;
  11. use App\Model\State;
  12. use App\Model\User\Identity;
  13. use App\Model\User\User;
  14. use App\Security\Odr\OdrVoter;
  15. use DateTime;
  16. use Exception;
  17. use JMS\Serializer\DeserializationContext;
  18. use Sensio\Bundle\FrameworkExtraBundle\Configuration\IsGranted;
  19. use Symfony\Component\HttpFoundation\Request;
  20. use Symfony\Component\HttpFoundation\Response;
  21. use Symfony\Component\Routing\Annotation\Route;
  22. use Symfony\Component\Serializer\Encoder\JsonEncoder;
  23. use Symfony\Component\Serializer\Normalizer\AbstractObjectNormalizer;
  24. use Symfony\Component\Serializer\Normalizer\ObjectNormalizer;
  25. use Symfony\Component\Serializer\Serializer;
  26. use Symfony\Contracts\HttpClient\Exception\ClientExceptionInterface;
  27. use Symfony\Contracts\HttpClient\Exception\TransportExceptionInterface;
  28. /**
  29.  * Class OdrController.
  30.  *
  31.  * @Route("/offre-de-remboursement")
  32.  */
  33. class OdrController extends APIController
  34. {
  35.     /**
  36.      * @Route("/inscription-au-club", name="kiwi_operation_odr_register_user")
  37.      */
  38.     public function registerOdrOffer(Request $request)
  39.     {
  40.         $user = new User();
  41.         $form $this->createForm(UserRegisterType::class, $user);
  42.         $user->setIdentity(
  43.             (new Identity())
  44.                 ->setFirstName('')
  45.                 ->setLastName('')
  46.         );
  47.         $form->handleRequest($request);
  48.         if ($form->isSubmitted() && $form->isValid()) {
  49.             $encoders = [new JsonEncoder()];
  50.             $normalizers = [new ObjectNormalizer()];
  51.             $serializer = new Serializer($normalizers$encoders);
  52.             $userRequest $request->request->get('user_register');
  53.             $json $serializer->serialize($form->getData(), 'json', [AbstractObjectNormalizer::SKIP_NULL_VALUES => true]);
  54.             $response $this->APIKiwi->register($json);
  55.             try {
  56.                 $user $this->serializer->deserialize($response->getContent(), User::class, 'json'DeserializationContext::create()->setGroups(['get_user']));
  57.                  $this->requestStack->getSession()->set('kiwi_register_odr_user_id'$user->getId());
  58.                  $this->requestStack->getSession()->set('kiwi_register_odr_email'$user->getEmail());
  59.                 $response $this->APIKiwi->postLoginAfterRegistration(['email' => $userRequest['email']['first'], 'password' => $userRequest['plainPassword']['first']]);
  60.                 $apiToken $this->decodeContent($response)['token'];
  61.                 $this->setTokenStorage($user$apiToken);
  62.                 return $this->redirectToRoute('kiwi_operation_odr_form_participation_user');
  63.             } catch (ClientExceptionInterface $e) {
  64.                 $this->catchRegisterError($response$e);
  65.             } catch (Exception $e) {
  66.                 $this->logger->error(sprintf('%s : %s'get_class($e), $e->getMessage()), $e->getTrace());
  67.                 $this->addFlash('warning'$this->translator->trans('api.validation.errors.generic', [], 'api'));
  68.             }
  69.         }
  70.         $odrResp $this->APIKiwi->getPublicKiwi('odr/'$this->requestStack->getSession()->get('kiwi_operation_odr_id'));
  71.         return $this->render('operation/odr/register_from_odr.html.twig', [
  72.             'form' => $form->createView(),
  73.             'odr' => $this->deserialize($odrResp->getContent(), Odr::class, 'get_odr'),
  74.         ]);
  75.     }
  76.     /**
  77.      * @Route("/formulaire-participation", name="kiwi_operation_odr_form_participation_user")
  78.      * @IsGranted("IS_AUTHENTICATED_FULLY")
  79.      * @throws Exception
  80.      * @throws TransportExceptionInterface
  81.      */
  82.     public function participationForm(Request $requestUserManager $userManagerParticipationOdrManager $participationOdrManagerParticipationManager $participationManager)
  83.     {
  84.         $userInterface $this->getUser();
  85.         $user $this->getUserData();
  86.         $odrId =  $this->requestStack->getSession()->get('kiwi_operation_odr_id');
  87.         $offerResp $participationOdrManager->getOdrInformation($odrId);
  88.         $odrWithRelations $this->deserialize($offerResp->getContent(), Odr::class, 'get_odrs');
  89.         if ($odrWithRelations->getEligibilities()[0]->getLabel() == 'new_client') {
  90.             $date = new DateTime();
  91.             $createdAtDate $user->getCreatedAt();
  92.             $diff $createdAtDate->diff($date);
  93.             if ($diff->days $_ENV['DURATION_ELIGIBILITY_NEW_CLIENT']) {
  94.                 $this->flashBag->add('danger''Cette offre s\'adresse aux nouveaux clients uniquement, vous n\'êtes plus éligible à cette offre.');
  95.                 return $this->redirectToRoute('kiwi_operation_odr_show', ['odrId' => $odrId]);
  96.             }
  97.         }
  98.         $nbParticipationsUser $this->APIKiwi->getKiwi(['path' => '/participation-odrs/user/operation/'.$odrId.'?reparticipation=false''token' => $this->getUser()->getToken()])->getContent(); //Retourne le nombre de participation de l'utilisateur à une opération
  99.         $nbParticipations $this->APIKiwi->getPublicKiwi('get-nb-participation-odr/'.$odrId)->getContent(); //Retourne le nombre de participation totale d'une opération
  100.         if ($nbParticipations >= $odrWithRelations->getMaxParticipationPerMonth()) {
  101.             $this->flashBag->add('danger''Cette offre est épuisé');
  102.             return $this->redirectToRoute('kiwi_operation_odr_show', ['odrId' => $odrId]);
  103.         }
  104.         if ('MONTHLY' === $odrWithRelations->getPeriodicity()) {
  105.             if (intval($nbParticipationsUser) >= $odrWithRelations->getMaxPartByUser()) {
  106.                 $this->flashBag->add('danger''Vous avez atteint votre quotas mensuel de participation pour cette offre.');
  107.                 return $this->redirectToRoute('kiwi_operation_odr_show', ['odrId' => $odrId]);
  108.             }
  109.         } else {
  110.             if (intval($nbParticipationsUser) >= $odrWithRelations->getMaxPartByUser()) {
  111.                 $this->flashBag->add('danger''Vous avez atteint votre quotas global de participation pour cette offre.');
  112.                 return $this->redirectToRoute('kiwi_operation_odr_show', ['odrId' => $odrId]);
  113.             }
  114.         }
  115.         return $this->buildParticipationPage($request$userManager$participationOdrManager$participationManager$user$userInterface$odrWithRelations);
  116.     }
  117.     private function catchRegisterError($response$e)
  118.     {
  119.         $content json_decode($response->getContent(false), true);
  120.         if (isset($content['@type']) && 'ConstraintViolationList' === $content['@type'] && isset($content['violations'])) {
  121.             foreach ($content['violations'] as $violation) {
  122.                 $this->addFlash(
  123.                     'warning',
  124.                     sprintf(
  125.                         '%s : %s',
  126.                         $this->translator->trans(sprintf('api.validation.properties.%s'$violation['propertyPath']), [], 'api'),
  127.                         $this->translator->trans(sprintf('api.validation.codes.%s'$violation['code']), [], 'api')
  128.                     )
  129.                 );
  130.             }
  131.         } else {
  132.             $this->logger->error(sprintf('%s : %s''ClientException'$e->getMessage()), $e->getTrace());
  133.             $this->addFlash('warning'$this->translator->trans('api.validation.errors.generic', [], 'api'));
  134.         }
  135.     }
  136.     /**
  137.      * @Route("/recapitulatif", name="kiwi_participation_recap_participation_odr")
  138.      * @IsGranted("IS_AUTHENTICATED_FULLY")
  139.      * @throws Exception|TransportExceptionInterface
  140.      */
  141.     public function recap()
  142.     {
  143.          $this->requestStack->getSession()->set('kiwi_target_path''kiwi_participation_recap_participation_odr');
  144.         $iban =  $this->requestStack->getSession()->get('kiwi_participation_iban_bic');
  145.         $ibanStart substr($iban['accountNumber'], 04);
  146.         $ibanEnd substr($iban['accountNumber'], -4);
  147.         $odrResp $this->APIKiwi->getPublicKiwi('odr/'$this->requestStack->getSession()->get('kiwi_operation_odr_id'));
  148.         return $this->render('participation/odr/recap.html.twig', [
  149.             'user' => $this->APIKiwi->getUserData($this->getUser()),
  150.             'odr' => $this->deserialize($odrResp->getContent(), Odr::class, 'get_odr'),
  151.             'eans' =>  $this->requestStack->getSession()->get('kiwi_participation_eans'),
  152.             'medias' =>  $this->requestStack->getSession()->get('kiwi_participation_odr_medias'),
  153.             'iban' => str_pad($ibanStartstrlen($iban['accountNumber']) - 8'*').$ibanEnd,
  154.             'bic' => $iban['bic'],
  155.         ]);
  156.     }
  157.     /**
  158.      * @Route("/confirmation", name="kiwi_participation_confirm_participation_odr")
  159.      * @IsGranted("IS_AUTHENTICATED_FULLY")
  160.      */
  161.     public function confirmParticipation(ParticipationOdrManager $participationOdrManager)
  162.     {
  163.         $participationId =  $this->requestStack->getSession()->get('kiwi_participation_participation_id');
  164.         $user $this->getUser();
  165.         $stateResp $this->APIKiwi->getKiwi(['path' => '/states?label=participation_progress''token' => $user->getToken()]);
  166.         $state $this->batchDeserialize(json_decode($stateResp->getContent(), true)['hydra:member'], State::class, 'get_states')[0];
  167.         if ( $this->requestStack->getSession()->has('kiwi_participation_nct_id')) {
  168.             $participationOdrManager->confirmParticipation($user$participationId,  $this->requestStack->getSession()->get('kiwi_participation_nct_id'), $state->getId(), true,  $this->requestStack->getSession()->get('kiwi_participation_token'));
  169.         } else {
  170.             $participationOdrManager->confirmParticipation($user$participationIdnull$state->getId(), falsenull);
  171.         }
  172.         $odrResp $this->APIKiwi->getPublicKiwi('odr/'$this->requestStack->getSession()->get('kiwi_operation_odr_id'));
  173.         $odr $this->deserialize($odrResp->getContent(), Odr::class, 'get_odr');
  174.         $participationOdrManager->postParticipationSmp($user$participationId);
  175.         if ( $this->requestStack->getSession()->has('kiwi_register_odr_user_id')) {
  176.              $this->requestStack->getSession()->clear();
  177.             return $this->render('participation/odr/register_confirmation.html.twig', [
  178.                 'odr' => $this->deserialize($odrResp->getContent(), Odr::class, 'get_odr'),
  179.             ]);
  180.         }
  181.         //Passe l'ancienne participation NCT au status participation_edited
  182.         if ( $this->requestStack->getSession()->has('kiwi_participation_nct_id')) {
  183.             $participationNctId =  $this->requestStack->getSession()->get('kiwi_participation_nct_id');
  184.             $stateResp $this->APIKiwi->getKiwi(['path' => '/states?label=participation_edited''token' => $user->getToken()]);
  185.             $state $this->batchDeserialize(json_decode($stateResp->getContent(), true)['hydra:member'], State::class, 'get_states')[0];
  186.             $participationOdrManager->confirmParticipation($user$participationNctIdnull$state->getId(), falsenull);
  187.         }
  188.          $this->requestStack->getSession()->clear();
  189.         return $this->render('participation/odr/confirmation.html.twig', [
  190.             'odr' => $odr,
  191.         ]);
  192.     }
  193.     /**
  194.      * @Route("/participation", name="participation_odr")
  195.      * @IsGranted("IS_AUTHENTICATED_FULLY")
  196.      */
  197.     public function index(): Response
  198.     {
  199.         $this->denyAccessUnlessGranted('IS_AUTHENTICATED_FULLY');
  200.         $userInterface $this->getUser();
  201.         $participations $this->APIKiwi->getKiwi(['path' => '/participation-odrs/user''token' => $userInterface->getToken()]);
  202.         $template = isset($_ENV['PROJECT_TYPE']) && 'step' === $_ENV['PROJECT_TYPE'] ? 'participation/odr/index_tabs.html.twig' 'participation/odr/index.html.twig';
  203.         return $this->render($template, [
  204.             'participations' => $this->batchDeserialize(json_decode($participations->getContent(), true)['hydra:member'], ParticipationOdr::class, 'get_participation_odrs'),
  205.         ]);
  206.     }
  207.     /**
  208.      * @Route("/participation/{participationId}/operation/{odrId}", name="kiwi_show_participation_id")
  209.      * @IsGranted("IS_AUTHENTICATED_FULLY")
  210.      */
  211.     public function show($participationId$odrIdParticipationOdrManager $participationOdrManager): Response
  212.     {
  213.          $this->requestStack->getSession()->set('_target_path''kiwi_show_participation_id');
  214.          $this->requestStack->getSession()->set('_target_path_params', ['participationId' => $participationId'odrId' => $odrId]);
  215.         $this->denyAccessUnlessGranted(OdrVoter::GET_ODR_DELIVERY);
  216.         $user $this->getUser();
  217.         $odrResp $this->APIKiwi->getPublicKiwi('operation-odr/'.$odrId);
  218.         $participationResp $participationOdrManager->getParticipationIdByUser($user$participationId);
  219.         $participation $this->deserialize($participationResp->getContent(), ParticipationOdr::class, 'get_participation_odr_by_id');
  220.          $this->requestStack->getSession()->set('kiwi_operation_odr_id'$odrId);
  221.         if (State::PARTICIPATION_UNCONFORMED_TEMP == $participation->getState()->getLabel()) {
  222.              $this->requestStack->getSession()->set('kiwi_participation_nct_id'$participationId);
  223.         }
  224.         return $this->render('participation/odr/detail_participation.html.twig', [
  225.             'user' => $this->APIKiwi->getUserData($this->getUser()),
  226.             'odr' => $this->deserialize($odrResp->getContent(), Odr::class, 'get_odr'),
  227.             'participation' => $participation,
  228.         ]);
  229.     }
  230.     /**
  231.      * @Route("/formulaire-reparticipation/{participationId}", name="kiwi_operation_odr_form_reparticipation_user")
  232.      * @IsGranted("IS_AUTHENTICATED_FULLY")
  233.      */
  234.     public function reparticipationForm(Request $requestUserManager $userManager$participationIdParticipationOdrManager $participationOdrManagerParticipationManager $participationManager)
  235.     {
  236.         $userInterface $this->getUser();
  237.         $user $this->getUserData();
  238.         $odrId =  $this->requestStack->getSession()->get('kiwi_operation_odr_id');
  239.         $offerResp $participationOdrManager->getOdrInformation($odrId);
  240.         $odrWithRelations $this->deserialize($offerResp->getContent(), Odr::class, 'get_odrs');
  241.         $participationResp $participationOdrManager->getReParticipationIdByUser($userInterface$participationId);
  242.         $participation $this->deserialize($participationResp->getContent(), ParticipationOdr::class, 'get_participation_odr_by_id');
  243.         return $this->buildParticipationPage($request$userManager$participationOdrManager$participationManager$user$userInterface$odrWithRelationstrue$participation);
  244.     }
  245.     private function buildParticipationPage(Request $requestUserManager $userManagerParticipationOdrManager $participationOdrManagerParticipationManager $participationManager$user$userInterface$odrWithRelations$edit false$participation null)
  246.     {
  247.         $form $this->createForm(OdrParticipationType::class, [
  248.             'user' => $user,
  249.             'eans' => $odrWithRelations->getDetailsOdr()->getEans(),
  250.             'edit' => $edit,
  251.             'participation' => $participation,
  252.         ]);
  253.         $form->handleRequest($request);
  254.         if ($form->isSubmitted() && $form->isValid()) {
  255.             $data $form->getData();
  256.             $address = [
  257.                 'street' => $data['street'],
  258.                 'complement' => $data['complement'],
  259.                 'postalCode' => $data['postalCode'],
  260.                 'city' => $data['city'],
  261.             ];
  262.             $eans $data['eans'];
  263.             $iban null;
  264.             if (!array_key_exists('editIban'$data)) {
  265.                 $iban $participationOdrManager->setIban($data['accountNumber'], $data['bic']);
  266.             } else {
  267.                 if ($data['editIban'] && !$edit) {
  268.                     $iban $participationOdrManager->setIban($data['accountNumber'], $data['bic']);
  269.                 }
  270.             }
  271.             if ($participation) {
  272.                 $iban $participationOdrManager->setIban($participation->getIban(), $participation->getBic());
  273.                  $this->requestStack->getSession()->set('kiwi_participation_token'$participation->getToken());
  274.             }
  275.              $this->requestStack->getSession()->set('kiwi_participation_eans'$eans);
  276.              $this->requestStack->getSession()->set('kiwi_target_path''kiwi_participation_recap_participation_odr');
  277.             if (!$iban) {
  278.                  $this->requestStack->getSession()->set('kiwi_participation_iban_bic'$participationOdrManager->setIban($user->getIbans()[0]->getHiddenAccountNumber(), $user->getIbans()[0]->getBic()));
  279.             } else {
  280.                  $this->requestStack->getSession()->set('kiwi_participation_iban_bic'$iban);
  281.             }
  282.             if ((empty($user->getSiret()) || empty($user->getCompanyName()) || empty($user->getIdentity()->getLastName()) || empty($user->getIdentity()->getFirstName())) || empty($user->getPhoneNumber())) {
  283.                 if (!array_key_exists('phoneNumber'$data)) {
  284.                     $data['phoneNumber'] = $user->getPhoneNumber();
  285.                 }
  286.                 $user->getIdentity()
  287.                     ->setLastName($data['lastName'])
  288.                     ->setFirstName($data['firstName']);
  289.                 $user
  290.                     ->setSiret($data['siret'])
  291.                     ->setCompanyName($data['companyName'])
  292.                     ->setPhoneNumber($data['phoneNumber']);
  293.                 $userManager->sendCreateOrUpdateDataCustomerToSalesforce($userInterface);
  294.                 $userManager->requestUser($userInterface'/users/' $userInterface->getId(), $user'put_user_general');
  295.             }
  296.             $data $participationOdrManager->setDeliveryInformation($data$address$user);
  297.             $data['user'] = '/api/users/'.$userInterface->getId();
  298.             $userManager->createOrUpdateDelivery($user$userInterface$data);
  299.             //Participation
  300.             $filesArray $participationManager->postFiles($userInterface$request->files->get('odr_participation')['file']);
  301.              $this->requestStack->getSession()->set('kiwi_participation_odr_medias'$filesArray);
  302.             $participation $participationOdrManager->postParticipation($userInterface$odrWithRelations->getId(), $eans$filesArray$iban);
  303.             $participationId substr($participation[0], (strrpos($participation[0], '/') + 1));
  304.              $this->requestStack->getSession()->set('kiwi_participation_participation_id'$participationId);
  305.             return $this->redirectToRoute('kiwi_participation_recap_participation_odr');
  306.         }
  307.         $odrResp $this->APIKiwi->getPublicKiwi('odr/'$this->requestStack->getSession()->get('kiwi_operation_odr_id'));
  308.         return $this->render('operation/odr/address_delivery.html.twig', [
  309.             'form' => $form->createView(),
  310.             'odr' => $this->deserialize($odrResp->getContent(), Odr::class, 'get_odr'),
  311.         ]);
  312.     }
  313. }