custom/plugins/shopware6-sapoci/src/Service/OciService.php line 81

Open in your IDE?
  1. <?php
  2. declare(strict_types=1);
  3. namespace Orcamultimedia\OciPunchout\Service;
  4. use Psr\Log\LoggerInterface;
  5. use Shopware\Core\Checkout\Customer\CustomerEntity;
  6. use Shopware\Core\Checkout\Customer\Exception\BadCredentialsException;
  7. use Shopware\Core\Checkout\Customer\Exception\CustomerNotFoundException;
  8. use Shopware\Core\Framework\Context;
  9. use Shopware\Core\Framework\DataAbstractionLayer\EntityRepository;
  10. use Shopware\Core\Framework\DataAbstractionLayer\Search\Criteria;
  11. use Shopware\Core\Framework\DataAbstractionLayer\Search\Filter\EqualsFilter;
  12. use Shopware\Core\Framework\DataAbstractionLayer\Search\Sorting\FieldSorting;
  13. use Shopware\Core\Framework\DataAbstractionLayer\Write\CloneBehavior;
  14. use Shopware\Core\Framework\Validation\DataBag\RequestDataBag;
  15. use Shopware\Core\SalesChannelRequest;
  16. use Shopware\Core\System\SalesChannel\SalesChannelContext;
  17. use Symfony\Component\HttpFoundation\Request;
  18. use Symfony\Component\HttpFoundation\RequestStack;
  19. class OciService
  20. {
  21.     /**
  22.      * @var RequestStack
  23.      */
  24.     private RequestStack $requestStack;
  25.     /**
  26.      * @var LoggerInterface
  27.      */
  28.     private LoggerInterface $logger;
  29.     /**
  30.      * @var EntityRepository
  31.      */
  32.     private EntityRepository $customerRepository;
  33.     public function __construct(
  34.         RequestStack     $requestStack,
  35.         LoggerInterface  $logger,
  36.         EntityRepository $customerRepository
  37.     )
  38.     {
  39.         $this->requestStack $requestStack;
  40.         $this->logger $logger;
  41.         $this->customerRepository $customerRepository;
  42.     }
  43.     public function init(Request $requestRequestDataBag $data): void
  44.     {
  45.         $user $data->get('email'$data->get('username'$request->query->get('email'$request->query->get('username'))));
  46.         $hookUrl $data->get('HOOK_URL'$request->query->get('HOOK_URL'));
  47.         $returnTarget $data->get('returntarget'$request->query->get('returntarget'));
  48.         $this->logger->info('Initializing new OCI session', ['user' => $user'hookUrl' => $hookUrl'returnTarget' => $returnTarget'requestMethod' => $request->getMethod(), 'requestContent' => $request->getContent(), 'requestQuery' => $request->getQueryString()]);
  49.         $request->getSession()->set('oci', ['hookUrl' => $hookUrl'returnTarget' => $returnTarget]);
  50.     }
  51.     public function isPunchout(): bool
  52.     {
  53.         $master $this->requestStack->getMainRequest();
  54.         if (!$master) {
  55.             return false;
  56.         }
  57.         if (!$master->attributes->get(SalesChannelRequest::ATTRIBUTE_IS_SALES_CHANNEL_REQUEST)) {
  58.             return false;
  59.         }
  60.         if (!$master->hasSession()) {
  61.             return false;
  62.         }
  63.         if (!$oci $master->getSession()->get('oci')) {
  64.             return false;
  65.         }
  66.         if (isset($oci['hookUrl'])) {
  67.             return true;
  68.         }
  69.         return false;
  70.     }
  71.     public function getCustomerByLogin(string $emailstring $passwordSalesChannelContext $context): CustomerEntity
  72.     {
  73.         $customer $this->getCustomerByEmail($email$context);
  74.         if (!password_verify($password$customer->getPassword())) {
  75.             throw new BadCredentialsException();
  76.         }
  77.         return $customer;
  78.     }
  79.     public function getCustomerByEmail(string $emailSalesChannelContext $context): CustomerEntity
  80.     {
  81.         $criteria = new Criteria();
  82.         $criteria->addFilter(new EqualsFilter('customer.email'$email));
  83.         $criteria->addFilter(new EqualsFilter('customer.guest'0));
  84.         $criteria->addFilter(new EqualsFilter('customer.active'1));
  85.         $customers $this->customerRepository->search($criteria$context->getContext());
  86.         $customerCount $customers->count();
  87.         if ($customerCount === 1) {
  88.             return $customers->first();
  89.         }
  90.         throw new CustomerNotFoundException($email);
  91.     }
  92.     public function createCustomer(CustomerEntity $customerContext $context, array $overwrites = []): void
  93.     {
  94.         $behavior = new CloneBehavior(
  95.             $overwrites
  96.         );
  97.         $this->customerRepository->clone($customer->getId(), $contextnull$behavior);
  98.     }
  99.     public function getLogger(): LoggerInterface
  100.     {
  101.         return $this->logger;
  102.     }
  103.     public function findLeastRecentlyLoggedInOciCustomer(CustomerEntity $customerSalesChannelContext $context): CustomerEntity
  104.     {
  105.         $criteria = new Criteria();
  106.         $criteria->addFilter(new EqualsFilter('customer.guest'0));
  107.         $criteria->addFilter(new EqualsFilter('customer.active'1));
  108.         $criteria->addFilter(new EqualsFilter('customer.customFields.oci_technical_account'$customer->getId()));
  109.         $criteria->addSorting(new FieldSorting('lastLogin'FieldSorting::ASCENDING));
  110.         $criteria->setLimit(1);
  111.         $customers $this->customerRepository->search($criteria$context->getContext());
  112.         $customerCount $customers->count();
  113.         if ($customerCount === 1) {
  114.             return $customers->first();
  115.         }
  116.         throw new CustomerNotFoundException($customer->getEmail());
  117.     }
  118. }