<?php
namespace App\Utils\Uniqskills\Cart\Actions;
use App\Event\Analitics\AddPaymentInfoEvent;
use App\Form\Frontend\Uniqskills\Cart\BudgetCustomerType;
use App\Form\Frontend\Uniqskills\Cart\BusinessCustomerType;
use App\Form\Frontend\Uniqskills\Cart\PrivateCustomerType;
use App\Model\Cart\Address;
use App\Utils\Api\ApiCartService;
use App\Utils\Api\ApiUserService;
use App\Utils\MailerUtils;
use App\Utils\OrderServices;
use App\Utils\Uniqskills\Cart\AddressUtils;
use Psr\Log\LoggerInterface;
use Symfony\Component\HttpFoundation\RequestStack;
use Symfony\Component\Security\Core\User\UserInterface;
use Symfony\Contracts\EventDispatcher\EventDispatcherInterface;
use Symfony\Contracts\Translation\TranslatorInterface;
class CartAddressService
{
private $request;
private $apiCartService;
private $cartHash;
private $apiUserService;
private $translator;
private $cartV4Logger;
private $orderServices;
private $cartPortalService;
private $cartDetailsService;
private $eventDispatcher;
public function __construct(
RequestStack $requestStack,
ApiCartService $apiCartService,
ApiUserService $apiUserService,
TranslatorInterface $translator,
LoggerInterface $cartV4Logger,
OrderServices $orderServices,
CartPortalService $cartPortalService,
CartDetailsService $cartDetailsService,
EventDispatcherInterface $eventDispatcher
) {
$this->apiCartService = $apiCartService;
$this->request = $requestStack->getCurrentRequest();
$this->cartHash = $this->request->getSession()->get('cartHash');
$this->apiUserService = $apiUserService;
$this->translator = $translator;
$this->cartV4Logger = $cartV4Logger;
$this->orderServices = $orderServices;
$this->cartPortalService = $cartPortalService;
$this->cartDetailsService = $cartDetailsService;
$this->eventDispatcher = $eventDispatcher;
}
public function getAddress(?UserInterface $user, array $customerFormData = []): ?Address
{
if (!empty($customerFormData)) {
return AddressUtils::convertFromCustomerFormData($customerFormData);
}
if ($user !== null)
{
return AddressUtils::convertFromGos($this->apiUserService->getUserAddress($user));
}
if ($this->request !== null)
{
return $this->request->getSession()->get('newUserAddress');
}
return null;
}
public function validateAddress(bool $isPhoneRequiredByShippingType): array
{
$formData = $this->prepareAddressData();
if (!$this->request->getSession()->has('cartHash'))
{
$this->cartV4Logger->notice('Address validation failed - cartHash not found', [
'cartHash' => $this->cartHash,
'data' => $formData
]);
return [
'success' => false,
'message' => $this->translator->trans('errors.cart.notFound')
];
}
if (!MailerUtils::validate_rfc_2822_email($formData['email']))
{
$this->cartV4Logger->notice('Address validation failed - email not valid', [
'data' => $formData,
]);
return [
'success' => false,
'message' => $this->translator->trans('errors.cart.address.email')
];
}
$portalSettings = $this->cartPortalService->getPortalSettings();
if (($portalSettings->getIsPhoneRequired() || $isPhoneRequiredByShippingType)
&& $_ENV['DEFAULT_LOCALE'] == 'pl' && !AddressUtils::checkPhoneForPl($formData['phone'])
)
{
$this->cartV4Logger->notice('Address validation failed - phone check', [
'data' => $formData,
'domain' => $portalSettings->getDomain()
]);
return [
'success' => false,
'message' => $this->translator->trans('errors.cart.address.phone')
];
}
$response = $this->apiCartService->checkAddressForm($this->cartHash, $formData);
if($response && isset($response['correct']))
{
if ($response['correct'] === false)
{
$this->cartV4Logger->notice('Address validation failed - gos response', [
'response' => $response,
'data' => $formData,
'domain' => $portalSettings->getDomain()
]);
}
else
{
$cart = $this->cartDetailsService->getCart(null);
if (!is_null($cart['hash']))
{
$this->eventDispatcher->dispatch(new AddPaymentInfoEvent($cart['hash']), AddPaymentInfoEvent::CART_ADD_PAYMENT_INFO);
}
}
return [
'success' => $response['correct'],
'clientType' => AddressUtils::deduceClientTypeFromForm($this->request->request->all()),
'message' => $response['correct'] ? '' : $this->translator->trans($response['message'])
];
}
$this->cartV4Logger->notice('Address validation failed', [
'response' => $response,
'data' => $formData,
'domain' => $portalSettings->getDomain()
]);
return [
'success' => false,
'message' => 'Błędne dane'
];
}
public function validateInvoiceAddress(): array
{
$formData = AddressUtils::convertCorrespondenceFormFieldsForGosApi($this->request->request->all());
$this->request->request->add($formData);
$this->request->request->remove('private_customer');
$result = $this->apiCartService->setInvoiceAddress($this->cartHash);
if ((isset($result['success']) && $result['success'] === false)
|| (isset($result['correct']) && $result['correct'] === false))
{
$this->cartV4Logger->notice('Invoice Address validation failed - api gos return', [
'cartHash' => $this->cartHash,
'formData' => $formData,
'result' => $result
]);
}
return $result;
}
public function setInvoiceEmailAddress(): array
{
if (!$this->request->request->has('invoiceEmail'))
{
$this->cartV4Logger->notice('Invoice Email Address validation failed', [
'cartHash' => $this->cartHash,
'invoiceEmail' => $this->request->request->get('invoiceEmail')
]);
return [
'success' => false,
'message' => $this->translator->trans('errors.cart.address.email')
];
}
$this->request->request->set('email', $this->request->request->get('invoiceEmail'));
$result = $this->apiCartService->changeInvoiceEmailAddress($this->cartHash);
if (isset($result['success']) && $result['success'] === false)
{
$this->cartV4Logger->notice('Invoice Email Address validation failed - api gos return', [
'result' => $result,
'cartHash' => $this->cartHash,
'invoiceEmail' => $this->request->request->get('invoiceEmail')
]);
}
return $result;
}
public function setDocumentDistributionChannel(): array
{
if (!$this->request->request->has('documentDistributionChannel'))
{
return ['success' => false];
}
$this->request->request->set('ddc', $this->request->request->get('documentDistributionChannel'));
return $this->apiCartService->changeDocumentDistributionChannel($this->cartHash);
}
public function clearCorrespondenceAddressData(): array
{
return $this->apiCartService->clearCorrespondenceAddress($this->cartHash);
}
public function assignAddressTemplate(string $customerType): string
{
switch ($customerType)
{
case PrivateCustomerType::class:
return 'uniqskills/cartcms/_partials/Address/_private-customer.html.twig';
case BudgetCustomerType::class:
return 'uniqskills/cartcms/_partials/Address/_budget-customer.html.twig';
case BusinessCustomerType::class:
return 'uniqskills/cartcms/_partials/Address/_business-customer.html.twig';
}
throw new \InvalidArgumentException('An invalid customer type was specified');
}
public function checkVatNumber(): array
{
$euVatNumber = $this->request->get('vatNumber', '');
if ($this->request->get('countryCode') == 'GB')
{
$success = $this->orderServices->checkUKVat($euVatNumber);
}
else
{
$success = $this->orderServices->checkEuVat($euVatNumber);
}
return ['success' => $success];
}
private function prepareAddressData(): array
{
return AddressUtils::convertFormFieldsForGosApi($this->request->request->all());
}
}