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.         if (!empty($formData['nip']) && empty($formData['companyName']))
  92.         {
  93.             $this->cartV4Logger->notice('Address validation failed - companyName not valid', [
  94.                 'data' => $formData,
  95.             ]);
  96.             return [
  97.                 'success' => false,
  98.                 'message' => $this->translator->trans('errors.cart.address.companyName')
  99.             ];
  100.         }
  101.         $portalSettings $this->cartPortalService->getPortalSettings();
  102.         if (($portalSettings->getIsPhoneRequired() || $isPhoneRequiredByShippingType)
  103.             && $_ENV['DEFAULT_LOCALE'] == 'pl' && !AddressUtils::checkPhoneForPl($formData['phone'])
  104.         )
  105.         {
  106.             $this->cartV4Logger->notice('Address validation failed - phone check', [
  107.                 'data'      => $formData,
  108.                 'domain'    => $portalSettings->getDomain()
  109.             ]);
  110.             return [
  111.                 'success' => false,
  112.                 'message' => $this->translator->trans('errors.cart.address.phone')
  113.             ];
  114.         }
  115.         $response $this->apiCartService->checkAddressForm($this->cartHash$formData);
  116.         if($response && isset($response['correct']))
  117.         {
  118.             if ($response['correct'] === false)
  119.             {
  120.                 $this->cartV4Logger->notice('Address validation failed - gos response', [
  121.                     'response'  => $response,
  122.                     'data'      => $formData,
  123.                     'domain'    => $portalSettings->getDomain()
  124.                 ]);
  125.             }
  126.             else
  127.             {
  128.                 $cart $this->cartDetailsService->getCart(null);
  129.                 if (!is_null($cart['hash']))
  130.                 {
  131.                     $this->eventDispatcher->dispatch(new AddPaymentInfoEvent($cart['hash']), AddPaymentInfoEvent::CART_ADD_PAYMENT_INFO);
  132.                 }
  133.             }
  134.             return [
  135.                 'success' => $response['correct'],
  136.                 'clientType' => AddressUtils::deduceClientTypeFromForm($this->request->request->all()),
  137.                 'message' => $response['correct'] ? '' $this->translator->trans($response['message'])
  138.             ];
  139.         }
  140.         $this->cartV4Logger->notice('Address validation failed', [
  141.             'response'  => $response,
  142.             'data'      => $formData,
  143.             'domain'    => $portalSettings->getDomain()
  144.         ]);
  145.         return [
  146.             'success' => false,
  147.             'message' => 'Błędne dane'
  148.         ];
  149.     }
  150.     public function validateInvoiceAddress(): array
  151.     {
  152.         $formData AddressUtils::convertCorrespondenceFormFieldsForGosApi($this->request->request->all());
  153.         $this->request->request->add($formData);
  154.         $this->request->request->remove('private_customer');
  155.         $result $this->apiCartService->setInvoiceAddress($this->cartHash);
  156.         if ((isset($result['success']) && $result['success'] === false)
  157.             || (isset($result['correct']) && $result['correct'] === false))
  158.         {
  159.             $this->cartV4Logger->notice('Invoice Address validation failed - api gos return', [
  160.                 'cartHash'      => $this->cartHash,
  161.                 'formData'      => $formData,
  162.                 'result'        => $result
  163.             ]);
  164.         }
  165.         return $result;
  166.     }
  167.     public function setInvoiceEmailAddress(): array
  168.     {
  169.         if (!$this->request->request->has('invoiceEmail'))
  170.         {
  171.             $this->cartV4Logger->notice('Invoice Email Address validation failed', [
  172.                 'cartHash'      => $this->cartHash,
  173.                 'invoiceEmail'  => $this->request->request->get('invoiceEmail')
  174.             ]);
  175.             return [
  176.                 'success' => false,
  177.                 'message' => $this->translator->trans('errors.cart.address.email')
  178.             ];
  179.         }
  180.         $this->request->request->set('email'$this->request->request->get('invoiceEmail'));
  181.         $result $this->apiCartService->changeInvoiceEmailAddress($this->cartHash);
  182.         if (isset($result['success']) && $result['success'] === false)
  183.         {
  184.             $this->cartV4Logger->notice('Invoice Email Address validation failed - api gos return', [
  185.                 'result'        => $result,
  186.                 'cartHash'      => $this->cartHash,
  187.                 'invoiceEmail'  => $this->request->request->get('invoiceEmail')
  188.             ]);
  189.         }
  190.         return $result;
  191.     }
  192.     public function setDocumentDistributionChannel(): array
  193.     {
  194.         if (!$this->request->request->has('documentDistributionChannel'))
  195.         {
  196.             return ['success' => false];
  197.         }
  198.         $this->request->request->set('ddc'$this->request->request->get('documentDistributionChannel'));
  199.         return $this->apiCartService->changeDocumentDistributionChannel($this->cartHash);
  200.     }
  201.     public function clearCorrespondenceAddressData(): array
  202.     {
  203.         return $this->apiCartService->clearCorrespondenceAddress($this->cartHash);
  204.     }
  205.     public function assignAddressTemplate(string $customerType): string
  206.     {
  207.         switch ($customerType)
  208.         {
  209.             case PrivateCustomerType::class:
  210.                 return 'uniqskills/cartcms/_partials/Address/_private-customer.html.twig';
  211.             case BudgetCustomerType::class:
  212.                 return 'uniqskills/cartcms/_partials/Address/_budget-customer.html.twig';
  213.             case BusinessCustomerType::class:
  214.                 return 'uniqskills/cartcms/_partials/Address/_business-customer.html.twig';
  215.         }
  216.         throw new \InvalidArgumentException('An invalid customer type was specified');
  217.     }
  218.     public function checkVatNumber(): array
  219.     {
  220.         $euVatNumber $this->request->get('vatNumber''');
  221.         if ($this->request->get('countryCode') == 'GB')
  222.         {
  223.             $success $this->orderServices->checkUKVat($euVatNumber);
  224.         }
  225.         else
  226.         {
  227.             $success $this->orderServices->checkEuVat($euVatNumber);
  228.         }
  229.         return ['success' => $success];
  230.     }
  231.     private function prepareAddressData(): array
  232.     {
  233.         return AddressUtils::convertFormFieldsForGosApi($this->request->request->all());
  234.     }
  235. }