src/Utils/Uniqskills/Cart/Actions/CartAddressService.php line 47

Open in your IDE?
  1. <?php
  2. namespace App\Utils\Uniqskills\Cart\Actions;
  3. use App\Event\Analitics\AddPaymentInfoEvent;
  4. use App\Form\Frontend\Uniqskills\Cart\BudgetCustomerType;
  5. use App\Form\Frontend\Uniqskills\Cart\BusinessCustomerType;
  6. use App\Form\Frontend\Uniqskills\Cart\PrivateCustomerType;
  7. use App\Model\Cart\Address;
  8. use App\Utils\Api\ApiCartService;
  9. use App\Utils\Api\ApiUserService;
  10. use App\Utils\MailerUtils;
  11. use App\Utils\OrderServices;
  12. use App\Utils\Uniqskills\Cart\AddressUtils;
  13. use Psr\Log\LoggerInterface;
  14. use Symfony\Component\HttpFoundation\RequestStack;
  15. use Symfony\Component\Security\Core\User\UserInterface;
  16. use Symfony\Contracts\EventDispatcher\EventDispatcherInterface;
  17. use Symfony\Contracts\Translation\TranslatorInterface;
  18. class CartAddressService
  19. {
  20.     private $request;
  21.     private $apiCartService;
  22.     private $cartHash;
  23.     private $apiUserService;
  24.     private $translator;
  25.     private $cartV4Logger;
  26.     private $orderServices;
  27.     private $cartPortalService;
  28.     private $cartDetailsService;
  29.     private $eventDispatcher;
  30.     public function __construct(
  31.         RequestStack $requestStack,
  32.         ApiCartService $apiCartService,
  33.         ApiUserService $apiUserService,
  34.         TranslatorInterface $translator,
  35.         LoggerInterface $cartV4Logger,
  36.         OrderServices $orderServices,
  37.         CartPortalService $cartPortalService,
  38.         CartDetailsService $cartDetailsService,
  39.         EventDispatcherInterface $eventDispatcher
  40.     ) {
  41.         $this->apiCartService $apiCartService;
  42.         $this->request $requestStack->getCurrentRequest();
  43.         $this->cartHash $this->request->getSession()->get('cartHash');
  44.         $this->apiUserService $apiUserService;
  45.         $this->translator $translator;
  46.         $this->cartV4Logger $cartV4Logger;
  47.         $this->orderServices $orderServices;
  48.         $this->cartPortalService $cartPortalService;
  49.         $this->cartDetailsService $cartDetailsService;
  50.         $this->eventDispatcher $eventDispatcher;
  51.     }
  52.     public function getAddress(?UserInterface $user, array $customerFormData = []): ?Address
  53.     {
  54.         if (!empty($customerFormData)) {
  55.             return AddressUtils::convertFromCustomerFormData($customerFormData);
  56.         }
  57.         if ($user !== null)
  58.         {
  59.             return AddressUtils::convertFromGos($this->apiUserService->getUserAddress($user));
  60.         }
  61.         if ($this->request !== null)
  62.         {
  63.             return $this->request->getSession()->get('newUserAddress');
  64.         }
  65.         return null;
  66.     }
  67.     public function validateAddress(bool $isPhoneRequiredByShippingType): array
  68.     {
  69.         $formData $this->prepareAddressData();
  70.         if (!$this->request->getSession()->has('cartHash'))
  71.         {
  72.             $this->cartV4Logger->notice('Address validation failed - cartHash not found', [
  73.                 'cartHash' => $this->cartHash,
  74.                 'data'     => $formData
  75.             ]);
  76.             return [
  77.                 'success' => false,
  78.                 'message' => $this->translator->trans('errors.cart.notFound')
  79.             ];
  80.         }
  81.         if (!MailerUtils::validate_rfc_2822_email($formData['email']))
  82.         {
  83.             $this->cartV4Logger->notice('Address validation failed - email not valid', [
  84.                 'data' => $formData,
  85.             ]);
  86.             return [
  87.                 'success' => false,
  88.                 'message' => $this->translator->trans('errors.cart.address.email')
  89.             ];
  90.         }
  91.         $portalSettings $this->cartPortalService->getPortalSettings();
  92.         if (($portalSettings->getIsPhoneRequired() || $isPhoneRequiredByShippingType)
  93.             && $_ENV['DEFAULT_LOCALE'] == 'pl' && !AddressUtils::checkPhoneForPl($formData['phone'])
  94.         )
  95.         {
  96.             $this->cartV4Logger->notice('Address validation failed - phone check', [
  97.                 'data'      => $formData,
  98.                 'domain'    => $portalSettings->getDomain()
  99.             ]);
  100.             return [
  101.                 'success' => false,
  102.                 'message' => $this->translator->trans('errors.cart.address.phone')
  103.             ];
  104.         }
  105.         $response $this->apiCartService->checkAddressForm($this->cartHash$formData);
  106.         if($response && isset($response['correct']))
  107.         {
  108.             if ($response['correct'] === false)
  109.             {
  110.                 $this->cartV4Logger->notice('Address validation failed - gos response', [
  111.                     'response'  => $response,
  112.                     'data'      => $formData,
  113.                     'domain'    => $portalSettings->getDomain()
  114.                 ]);
  115.             }
  116.             else
  117.             {
  118.                 $cart $this->cartDetailsService->getCart(null);
  119.                 if (!is_null($cart['hash']))
  120.                 {
  121.                     $this->eventDispatcher->dispatch(new AddPaymentInfoEvent($cart['hash']), AddPaymentInfoEvent::CART_ADD_PAYMENT_INFO);
  122.                 }
  123.             }
  124.             return [
  125.                 'success' => $response['correct'],
  126.                 'clientType' => AddressUtils::deduceClientTypeFromForm($this->request->request->all()),
  127.                 'message' => $response['correct'] ? '' $this->translator->trans($response['message'])
  128.             ];
  129.         }
  130.         $this->cartV4Logger->notice('Address validation failed', [
  131.             'response'  => $response,
  132.             'data'      => $formData,
  133.             'domain'    => $portalSettings->getDomain()
  134.         ]);
  135.         return [
  136.             'success' => false,
  137.             'message' => 'Błędne dane'
  138.         ];
  139.     }
  140.     public function validateInvoiceAddress(): array
  141.     {
  142.         $formData AddressUtils::convertCorrespondenceFormFieldsForGosApi($this->request->request->all());
  143.         $this->request->request->add($formData);
  144.         $this->request->request->remove('private_customer');
  145.         $result $this->apiCartService->setInvoiceAddress($this->cartHash);
  146.         if ((isset($result['success']) && $result['success'] === false)
  147.             || (isset($result['correct']) && $result['correct'] === false))
  148.         {
  149.             $this->cartV4Logger->notice('Invoice Address validation failed - api gos return', [
  150.                 'cartHash'      => $this->cartHash,
  151.                 'formData'      => $formData,
  152.                 'result'        => $result
  153.             ]);
  154.         }
  155.         return $result;
  156.     }
  157.     public function setInvoiceEmailAddress(): array
  158.     {
  159.         if (!$this->request->request->has('invoiceEmail'))
  160.         {
  161.             $this->cartV4Logger->notice('Invoice Email Address validation failed', [
  162.                 'cartHash'      => $this->cartHash,
  163.                 'invoiceEmail'  => $this->request->request->get('invoiceEmail')
  164.             ]);
  165.             return [
  166.                 'success' => false,
  167.                 'message' => $this->translator->trans('errors.cart.address.email')
  168.             ];
  169.         }
  170.         $this->request->request->set('email'$this->request->request->get('invoiceEmail'));
  171.         $result $this->apiCartService->changeInvoiceEmailAddress($this->cartHash);
  172.         if (isset($result['success']) && $result['success'] === false)
  173.         {
  174.             $this->cartV4Logger->notice('Invoice Email Address validation failed - api gos return', [
  175.                 'result'        => $result,
  176.                 'cartHash'      => $this->cartHash,
  177.                 'invoiceEmail'  => $this->request->request->get('invoiceEmail')
  178.             ]);
  179.         }
  180.         return $result;
  181.     }
  182.     public function setDocumentDistributionChannel(): array
  183.     {
  184.         if (!$this->request->request->has('documentDistributionChannel'))
  185.         {
  186.             return ['success' => false];
  187.         }
  188.         $this->request->request->set('ddc'$this->request->request->get('documentDistributionChannel'));
  189.         return $this->apiCartService->changeDocumentDistributionChannel($this->cartHash);
  190.     }
  191.     public function clearCorrespondenceAddressData(): array
  192.     {
  193.         return $this->apiCartService->clearCorrespondenceAddress($this->cartHash);
  194.     }
  195.     public function assignAddressTemplate(string $customerType): string
  196.     {
  197.         switch ($customerType)
  198.         {
  199.             case PrivateCustomerType::class:
  200.                 return 'uniqskills/cartcms/_partials/Address/_private-customer.html.twig';
  201.             case BudgetCustomerType::class:
  202.                 return 'uniqskills/cartcms/_partials/Address/_budget-customer.html.twig';
  203.             case BusinessCustomerType::class:
  204.                 return 'uniqskills/cartcms/_partials/Address/_business-customer.html.twig';
  205.         }
  206.         throw new \InvalidArgumentException('An invalid customer type was specified');
  207.     }
  208.     public function checkVatNumber(): array
  209.     {
  210.         $euVatNumber $this->request->get('vatNumber''');
  211.         if ($this->request->get('countryCode') == 'GB')
  212.         {
  213.             $success $this->orderServices->checkUKVat($euVatNumber);
  214.         }
  215.         else
  216.         {
  217.             $success $this->orderServices->checkEuVat($euVatNumber);
  218.         }
  219.         return ['success' => $success];
  220.     }
  221.     private function prepareAddressData(): array
  222.     {
  223.         return AddressUtils::convertFormFieldsForGosApi($this->request->request->all());
  224.     }
  225. }