src/WellCommerce/Bundle/AppBundle/EventListener/ClientSubscriber.php line 117

Open in your IDE?
  1. <?php
  2. declare(strict_types=0);
  3. /*
  4.  * WellCommerce Foundation
  5.  *
  6.  * This file is part of the WellCommerce package.
  7.  *
  8.  * (c) Adam Piotrowski <adam@wellcommerce.org>, Adrian Potepa <adrian@wellcommerce.org>
  9.  *
  10.  * For the full copyright and license information,
  11.  * please view the LICENSE file that was distributed with this source code.
  12.  */
  13. namespace WellCommerce\Bundle\AppBundle\EventListener;
  14. use Carbon\Carbon;
  15. use Doctrine\Common\Collections\Collection;
  16. use Doctrine\Common\Collections\Criteria;
  17. use Doctrine\ORM\EntityManagerInterface;
  18. use Geocoder\Geocoder;
  19. use Geocoder\Location;
  20. use Symfony\Component\EventDispatcher\EventSubscriberInterface;
  21. use Symfony\Component\HttpKernel\Event\FilterControllerEvent;
  22. use Symfony\Component\HttpKernel\KernelEvents;
  23. use Symfony\Component\PropertyAccess\PropertyPath;
  24. use Symfony\Component\Security\Http\Event\InteractiveLoginEvent;
  25. use WellCommerce\Bundle\AppBundle\Entity\AddressInterface;
  26. use WellCommerce\Bundle\AppBundle\Entity\Client;
  27. use WellCommerce\Bundle\AppBundle\Entity\ClientAddress;
  28. use WellCommerce\Bundle\AppBundle\Entity\ClientGroup;
  29. use WellCommerce\Bundle\AppBundle\Entity\ComplaintHistory;
  30. use WellCommerce\Bundle\AppBundle\Entity\ComplaintProduct;
  31. use WellCommerce\Bundle\AppBundle\Entity\ComplaintStatus;
  32. use WellCommerce\Bundle\AppBundle\Entity\NewsletterSubscriber;
  33. use WellCommerce\Bundle\AppBundle\Entity\ProductClientGroupDiscount;
  34. use WellCommerce\Bundle\AppBundle\Entity\User;
  35. use WellCommerce\Bundle\AppBundle\Manager\NewsletterSubscriberManager;
  36. use WellCommerce\Bundle\AppBundle\Service\ClientAddress\ClientAddressHelper;
  37. use WellCommerce\Bundle\AppBundle\Service\Geocoder\Configuration\GeocoderSystemConfigurator;
  38. use WellCommerce\Bundle\AppBundle\Service\Geocoder\Provider\GeocoderProvider;
  39. use WellCommerce\Bundle\CatalogBundle\Entity\Product;
  40. use WellCommerce\Bundle\CoreBundle\Doctrine\Event\EntityEvent;
  41. use WellCommerce\Bundle\CoreBundle\Doctrine\Repository\RepositoryInterface;
  42. use WellCommerce\Bundle\CoreBundle\Helper\Request\RequestHelper;
  43. use WellCommerce\Bundle\CoreBundle\Helper\Router\RouterHelperInterface;
  44. use WellCommerce\Bundle\CoreBundle\Helper\Security\SecurityHelperInterface;
  45. use WellCommerce\Bundle\CoreBundle\Helper\Translator\TranslatorHelper;
  46. use WellCommerce\Bundle\OrderBundle\Entity\Order;
  47. use WellCommerce\Bundle\OrderBundle\Entity\OrderProduct;
  48. use WellCommerce\Bundle\OrderBundle\Provider\Front\OrderProvider;
  49. use WellCommerce\Component\Form\Elements\Fieldset\FieldsetInterface;
  50. use WellCommerce\Component\Form\Event\FormEvent;
  51. /**
  52.  * Class ClientSubscriber
  53.  *
  54.  * @author  Adam Piotrowski <adam@wellcommerce.org>
  55.  */
  56. class ClientSubscriber implements EventSubscriberInterface
  57. {
  58.     protected SecurityHelperInterface     $securityHelper;
  59.     protected EntityManagerInterface      $entityManager;
  60.     protected RouterHelperInterface       $routerHelper;
  61.     protected GeocoderProvider            $geocoderProvider;
  62.     protected GeocoderSystemConfigurator  $geocoderSystemConfigurator;
  63.     protected NewsletterSubscriberManager $newsletterSubscriberManager;
  64.     protected TranslatorHelper            $translatorHelper;
  65.     protected RequestHelper               $requestHelper;
  66.     protected ClientAddressHelper         $clientAddressHelper;
  67.     protected OrderProvider               $orderProvider;
  68.     protected bool                        $debug;
  69.     public function __construct(
  70.         SecurityHelperInterface $securityHelper,
  71.         EntityManagerInterface $entityManager,
  72.         RouterHelperInterface $routerHelper,
  73.         RequestHelper $requestHelper,
  74.         GeocoderProvider $geocoderProvider,
  75.         GeocoderSystemConfigurator $geocoderSystemConfigurator,
  76.         NewsletterSubscriberManager $newsletterSubscriberManager,
  77.         TranslatorHelper $translatorHelper,
  78.         ClientAddressHelper $clientAddressHelper,
  79.         OrderProvider $orderProvider,
  80.         bool $debug
  81.     ) {
  82.         $this->securityHelper              $securityHelper;
  83.         $this->entityManager               $entityManager;
  84.         $this->routerHelper                $routerHelper;
  85.         $this->requestHelper               $requestHelper;
  86.         $this->geocoderProvider            $geocoderProvider;
  87.         $this->geocoderSystemConfigurator  $geocoderSystemConfigurator;
  88.         $this->newsletterSubscriberManager $newsletterSubscriberManager;
  89.         $this->translatorHelper            $translatorHelper;
  90.         $this->clientAddressHelper         $clientAddressHelper;
  91.         $this->orderProvider               $orderProvider;
  92.         $this->debug                       $debug;
  93.     }
  94.     public static function getSubscribedEvents()
  95.     {
  96.         return [
  97.             KernelEvents::CONTROLLER               => ['onKernelController'0],
  98.             'admin.product.pre_form_init'          => ['onProductFormAdminInit'],
  99.             'client.post_create'                   => ['onClientPostCreate'10],
  100.             'client.post_update'                   => ['onClientPostUpdate'10],
  101.             'client.pre_create'                    => ['onClientPreCreate'10],
  102.             'client.pre_update'                    => ['onClientPreUpdate'10],
  103.             'client_address.pre_update'            => ['onClientAddressPreUpdate'10],
  104.             'admin.client.pre_form_init'           => ['onClientAdminFormInit'10],
  105.             'admin.client.post_form_init'          => ['onClientAdminFormPostInit'10],
  106.             'admin.client_complaint.pre_form_init' => ['onClientComplaintAdminFormInit'10],
  107.             'security.interactive_login'           => ['onSecurityInteractiveLogin'0],
  108.         ];
  109.     }
  110.     public function onKernelController(FilterControllerEvent $event)
  111.     {
  112.         if ($event->isMasterRequest()) {
  113.             $currentClient $this->securityHelper->getCurrentClient();
  114.             if ($currentClient instanceof Client) {
  115.                 $currentClient->setLastActive(Carbon::now()->toDateTimeImmutable());
  116.                 $this->entityManager->flush();
  117.             }
  118.         }
  119.     }
  120.     public function onProductFormAdminInit(FormEvent $event)
  121.     {
  122.         $resource $event->getResource();
  123.         if ($resource instanceof Product) {
  124.             /** @var RepositoryInterface $repository */
  125.             $repository   $this->entityManager->getRepository(ProductClientGroupDiscount::class);
  126.             $form         $event->getForm();
  127.             $builder      $event->getFormBuilder();
  128.             $transformer  $builder->getRepositoryTransformer('product_client_group_discount'ProductClientGroupDiscount::class);
  129.             $clientGroups $this->entityManager->getRepository(ClientGroup::class)->matching(new Criteria());
  130.             if ($clientGroups instanceof Collection) {
  131.                 $clientGroupData $form->addChild(
  132.                     $builder->getElement('nested_fieldset', [
  133.                         'name'          => 'client_group_discount_data',
  134.                         'label'         => 'product.form.fieldset.client_group_discounts',
  135.                         'transformer'   => $transformer,
  136.                         'property_path' => new PropertyPath('clientGroupDiscounts'),
  137.                     ])
  138.                 );
  139.                 $clientGroups->map(function (ClientGroup $clientGroup) use ($form$builder$resource$clientGroupData$repository) {
  140.                     $clientGroupDiscounts $repository->findBy([
  141.                         'product'     => $resource,
  142.                         'clientGroup' => $clientGroup,
  143.                     ]);
  144.                     if ($form->getChildren()->has('price_pane')) {
  145.                         $sellPriceTax $form->getChildren()->get('price_pane')->getChildren()->get('sell_price_settings')->getChildren(
  146.                         )->get('sellPriceTax');
  147.                         $priceStockData $clientGroupData->addChild(
  148.                             $builder->getElement('nested_fieldset', [
  149.                                 'name'  => 'client_group_' $clientGroup->getId(),
  150.                                 'label' => $clientGroup->translate()->getName(),
  151.                             ])
  152.                         );
  153.                         $ranges = [];
  154.                         /** @var ProductClientGroupDiscount $clientGroupDiscount */
  155.                         foreach ($clientGroupDiscounts as $clientGroupDiscount) {
  156.                             $ranges[] = [
  157.                                 'min'   => $clientGroupDiscount->getQuantityFrom(),
  158.                                 'max'   => $clientGroupDiscount->getQuantityTo(),
  159.                                 'price' => $clientGroupDiscount->getDiscount(),
  160.                             ];
  161.                         }
  162.                         $priceStockData->addChild(
  163.                             $builder->getElement('range_editor', [
  164.                                 'name'            => 'discounts',
  165.                                 'label'           => 'Rabaty',
  166.                                 'vat_field'       => $sellPriceTax,
  167.                                 'range_precision' => 0,
  168.                                 'price_precision' => 0,
  169.                             ])
  170.                         )->setValue(['ranges' => $ranges]);
  171.                     }
  172.                 });
  173.             }
  174.         }
  175.     }
  176.     public function onClientComplaintAdminFormInit(FormEvent $event)
  177.     {
  178.         $resource $event->getResource();
  179.         if ($resource instanceof ComplaintHistory) {
  180.             $complaint $resource->getComplaint();
  181.             $history   $complaint->getHistory();
  182.             $form      $event->getForm();
  183.             $builder   $event->getFormBuilder();
  184.             $fieldset $form->getChildren()->get('products_data');
  185.             $html     '<ul class="changes-detailed">';
  186.             $complaint->getProducts()->map(function (ComplaintProduct $complaintProduct) use (&$html) {
  187.                 $orderProduct $complaintProduct->getOrderProduct();
  188.                 if ($orderProduct instanceof OrderProduct) {
  189.                     $product $orderProduct->getProduct();
  190.                     $url     $this->routerHelper->generateUrl('admin.product.edit', ['id' => $product->getId()]);
  191.                     $name    sprintf('%s x %s'$complaintProduct->getQuantity(), $product->translate()->getName());
  192.                     foreach ($orderProduct->getOptions() as $option) {
  193.                         $name .= ' - ' $option;
  194.                     }
  195.                     $html .= '<li style="border-bottom: 1px solid #dfdfdf;list-style: none;margin-bottom: 15px;">';
  196.                     $html .= '<p><a href="' $url '">' $name '</a></p>';
  197.                     $html .= '</li > ';
  198.                 } else {
  199.                     $product $complaintProduct->getProduct();
  200.                     if ($product instanceof Product) {
  201.                         $url  $this->routerHelper->generateUrl('admin.product.edit', ['id' => $product->getId()]);
  202.                         $name sprintf('%s x %s'$complaintProduct->getQuantity(), $product->translate()->getName());
  203.                         $html .= '<li style="border-bottom: 1px solid #dfdfdf;list-style: none;margin-bottom: 15px;">';
  204.                         $html .= '<p><a href="' $url '">' $name '</a></p>';
  205.                         $html .= '</li > ';
  206.                     }
  207.                 }
  208.             });
  209.             $fieldset->addChild(
  210.                 $builder->getElement('static_text', [
  211.                     'text' => $html,
  212.                 ])
  213.             );
  214.             /** @var FieldsetInterface $fieldset */
  215.             $fieldset $form->addChild(
  216.                 $builder->getElement('nested_fieldset', [
  217.                     'name'  => 'comment_data',
  218.                     'label' => 'complaint.fieldset.comments',
  219.                 ])
  220.             );
  221.             $html '<ul class="changes-detailed">';
  222.             $history->map(function (ComplaintHistory $complaintHistory) use (&$html$complaint) {
  223.                 $user   $complaintHistory->getUser();
  224.                 $client $complaint->getClient();
  225.                 $date   $complaintHistory->getCreatedAt()->format('Y-m-d H:i:s');
  226.                 $status $complaintHistory->getStatus() instanceof ComplaintStatus $complaintHistory->getStatus()->translate()->getName(
  227.                 ) : '';
  228.                 $html .= '<li style="border-bottom: 1px solid #dfdfdf;list-style: none;margin-bottom: 15px;">';
  229.                 if ($user instanceof User) {
  230.                     $html .= '<h4><span>' $date ' ' $user->getFirstName() . ' ' $user->getLastName(
  231.                         ) . ' (' $status ')</span></h4>';
  232.                 } else {
  233.                     $html .= '<h4><span>' $date ' ' $client->getContactDetails()->getFirstName() . ' ' $client->getContactDetails(
  234.                         )->getLastName() . ' (' $status ')</h4>';
  235.                 }
  236.                 $html .= '    <p>' nl2br($complaintHistory->getComment()) . '</p>';
  237.                 if (!empty($complaintHistory->getFiles())) {
  238.                     $html .= '    <p><strong>Załączniki</strong></p>';
  239.                     foreach ($complaintHistory->getFiles() as $file) {
  240.                         $html .= '<p><a href="/' $complaint->getWebPath() . '/' $file '" target="_blank">' $file '</a></p>';
  241.                     }
  242.                 }
  243.                 $html .= '</li > ';
  244.             });
  245.             $html .= '</ul > ';
  246.             $fieldset->addChild(
  247.                 $builder->getElement('static_text', [
  248.                     'text' => $html,
  249.                 ])
  250.             );
  251.         }
  252.     }
  253.     public function onClientAdminFormPostInit(FormEvent $event)
  254.     {
  255.         $resource $event->getResource();
  256.         if ($resource instanceof Client) {
  257.             $form    $event->getForm();
  258.             $builder $event->getFormBuilder();
  259.             /** @var FieldsetInterface $fieldset */
  260.             $requiredData $form->getChildren()->get('required_data');
  261.             $clientDetailsData $requiredData->addChild(
  262.                 $builder->getElement('nested_fieldset', [
  263.                     'name'  => 'clientDetails',
  264.                     'label' => 'client.heading.client_details',
  265.                 ])
  266.             );
  267.             $clientDetailsData->addChild(
  268.                 $builder->getElement('select', [
  269.                     'name'    => 'clientDetails.sex',
  270.                     'label'   => 'PÅ‚eć',
  271.                     'options' => [
  272.                         'm' => 'Mężczyzna',
  273.                         'f' => 'Kobieta',
  274.                     ],
  275.                 ])
  276.             )->setValue($resource->getClientDetails()->getSex());
  277.             $clientDetailsData->addChild(
  278.                 $builder->getElement('text_field', [
  279.                     'name'  => 'clientDetails.username',
  280.                     'label' => 'client.label.username',
  281.                     'rules' => [
  282.                         $builder->getRule('required'),
  283.                     ],
  284.                 ])
  285.             )->setValue($resource->getClientDetails()->getUsername());
  286.             if ($form->getResource() instanceof Client && null === $form->getResource()->getId()) {
  287.                 $clientDetailsData->addChild(
  288.                     $builder->getElement('text_field', [
  289.                         'name'  => 'clientDetails.hashedPassword',
  290.                         'label' => 'client.label.password',
  291.                         'rules' => [
  292.                             $builder->getRule('required'),
  293.                         ],
  294.                     ])
  295.                 )->setValue($this->securityHelper->generateRandomPassword());
  296.             }
  297.             $clientDetailsData->addChild(
  298.                 $builder->getElement('checkbox', [
  299.                     'name'  => 'clientDetails.conditionsAccepted',
  300.                     'label' => 'client.label.accept_conditions_admin',
  301.                 ])
  302.             )->setValue(null === $resource->getId() ? true $resource->getClientDetails()->isConditionsAccepted());
  303.             $clientDetailsData->addChild(
  304.                 $builder->getElement('checkbox', [
  305.                     'name'  => 'clientDetails.privacyAccepted',
  306.                     'label' => 'client.label.accept_privacy_admin',
  307.                 ])
  308.             )->setValue(null === $resource->getId() ? true $resource->getClientDetails()->isPrivacyAccepted());
  309.             $clientDetailsData->addChild(
  310.                 $builder->getElement('checkbox', [
  311.                     'name'  => 'clientDetails.newsletterAccepted',
  312.                     'label' => 'client.label.accept_newsletter_admin',
  313.                 ])
  314.             )->setValue(null === $resource->getId() ? true $resource->getClientDetails()->isNewsletterAccepted());
  315.             $clientDetailsData->addChild(
  316.                 $builder->getElement('checkbox', [
  317.                     'name'  => 'clientDetails.registrationConfirmed',
  318.                     'label' => 'client.label.registration_confirmed',
  319.                 ])
  320.             )->setValue(null === $resource->getId() ? true $resource->getClientDetails()->isRegistrationConfirmed());
  321.         }
  322.     }
  323.     public function onClientAdminFormInit(FormEvent $event)
  324.     {
  325.         $resource $event->getResource();
  326.         if ($resource instanceof Client) {
  327.             $form              $event->getForm();
  328.             $builder           $event->getFormBuilder();
  329.             $billingAddresses  $resource->getBillingAddresses();
  330.             $shippingAddresses $resource->getShippingAddresses();
  331.             /** @var FieldsetInterface $fieldset */
  332.             $fieldset $form->getChildren()->get('billingAddress');
  333.             $billingAddressesFieldset $fieldset->addChild(
  334.                 $builder->getElement('nested_fieldset', [
  335.                     'name'  => 'billingAddresses',
  336.                     'label' => 'client.fieldset.addresses',
  337.                 ])
  338.             );
  339.             if ($this->routerHelper->getCurrentAction() === 'editAction') {
  340.                 $billingAddressesFieldset->addChild(
  341.                     $builder->getElement('button', [
  342.                         'name'   => 'add_billing_address',
  343.                         'label'  => 'Dodaj adres',
  344.                         'target' => '_self',
  345.                         'url'    => $this->routerHelper->generateUrl('admin.client.add_address', [
  346.                             'id'   => $resource->getId(),
  347.                             'type' => 'billing',
  348.                         ]),
  349.                     ])
  350.                 );
  351.             }
  352.             if ($billingAddresses->count()) {
  353.                 $html '<ul class="changes-detailed">';
  354.                 $billingAddresses->map(function (ClientAddress $address) use (&$html) {
  355.                     $addressUrl $this->routerHelper->generateUrl('admin.client.edit_address', ['id' => $address->getId()]);
  356.                     $html .= '<li style="border-bottom: 1px solid #dfdfdf;list-style: none;margin-bottom: 15px;">';
  357.                     $html .= '    <p>' $this->formatClientAddress($address) . '</p>';
  358.                     $html .= '    <p><a href="' $addressUrl '">Edycja</a></p > ';
  359.                     $html .= '</li > ';
  360.                 });
  361.                 $html .= '</ul > ';
  362.                 $billingAddressesFieldset->addChild(
  363.                     $builder->getElement('static_text', [
  364.                         'text' => $html,
  365.                     ])
  366.                 );
  367.             }
  368.             /** @var FieldsetInterface $fieldset */
  369.             $fieldset $form->getChildren()->get('shippingAddress');
  370.             $shippingAddressesFieldset $fieldset->addChild(
  371.                 $builder->getElement('nested_fieldset', [
  372.                     'name'  => 'shippingAddresses',
  373.                     'label' => 'client.fieldset.addresses',
  374.                 ])
  375.             );
  376.             if ($this->routerHelper->getCurrentAction() === 'editAction') {
  377.                 $shippingAddressesFieldset->addChild(
  378.                     $builder->getElement('button', [
  379.                         'name'   => 'add_shipping_address',
  380.                         'label'  => 'Dodaj adres',
  381.                         'target' => '_self',
  382.                         'url'    => $this->routerHelper->generateUrl('admin.client.add_address', [
  383.                             'id'   => $resource->getId(),
  384.                             'type' => 'shipping',
  385.                         ]),
  386.                     ])
  387.                 );
  388.             }
  389.             if ($shippingAddresses->count()) {
  390.                 $html '<ul class="changes-detailed">';
  391.                 $shippingAddresses->map(function (ClientAddress $address) use (&$html) {
  392.                     $addressUrl $this->routerHelper->generateUrl('admin.client.edit_address', ['id' => $address->getId()]);
  393.                     $html .= '<li style="border-bottom: 1px solid #dfdfdf;list-style: none;margin-bottom: 15px;">';
  394.                     $html .= '    <p>' $this->formatClientAddress($address) . '</p>';
  395.                     $html .= '    <p><a href="' $addressUrl '">Edycja</a></p > ';
  396.                     $html .= '</li > ';
  397.                 });
  398.                 $html .= '</ul > ';
  399.                 $shippingAddressesFieldset->addChild(
  400.                     $builder->getElement('static_text', [
  401.                         'text' => $html,
  402.                     ])
  403.                 );
  404.             }
  405.         }
  406.     }
  407.     public function onClientPreUpdate(EntityEvent $event)
  408.     {
  409.         $resource $event->getEntity();
  410.         if ($resource instanceof Client) {
  411.             $shop $resource->getShop();
  412.             if ($shop->isRegistrationConfirmationRequired()) {
  413.                 $resource->setEnabled($resource->getClientDetails()->isRegistrationConfirmed());
  414.             }
  415.             if ($this->geocoderSystemConfigurator->isClientEnabled()) {
  416.                 $this->geocodeClientAddresses($resource);
  417.             }
  418.         }
  419.     }
  420.     public function onClientPostUpdate(EntityEvent $event)
  421.     {
  422.         $resource $event->getEntity();
  423.         if ($resource instanceof Client) {
  424.             $email $resource->getUsername();
  425.             $shop  $resource->getShop();
  426.             $subscriber $this->newsletterSubscriberManager->getRepository()->findOneBy([
  427.                 'email' => $email,
  428.                 'shop'  => $shop,
  429.             ]);
  430.             if (!$subscriber instanceof NewsletterSubscriber) {
  431.                 /** @var NewsletterSubscriber $subscriber */
  432.                 $subscriber $this->newsletterSubscriberManager->initResource();
  433.                 $subscriber->setEnabled($resource->getClientDetails()->isNewsletterAccepted());
  434.                 $subscriber->setEmail($email);
  435.                 $subscriber->setConditionsAccepted($resource->getClientDetails()->isNewsletterAccepted());
  436.                 $subscriber->setClient($resource);
  437.                 $subscriber->setShop($shop);
  438.                 if (false === $subscriber->getShop()->getNewsletterSettings()->isSendConfirmationEmail()) {
  439.                     $subscriber->setEnabled(true);
  440.                 }
  441.                 $this->newsletterSubscriberManager->createResource($subscriber);
  442.             }
  443.         }
  444.     }
  445.     public function onClientPostCreate(EntityEvent $event)
  446.     {
  447.         $resource $event->getEntity();
  448.         if ($resource instanceof Client) {
  449.             $email      $resource->getUsername();
  450.             $shop       $resource->getShop();
  451.             $subscriber $this->newsletterSubscriberManager->getRepository()->findOneBy([
  452.                 'email' => $email,
  453.                 'shop'  => $shop,
  454.             ]);
  455.             if (!$subscriber instanceof NewsletterSubscriber) {
  456.                 /** @var NewsletterSubscriber $subscriber */
  457.                 $subscriber $this->newsletterSubscriberManager->initResource();
  458.                 $subscriber->setEnabled($resource->getClientDetails()->isNewsletterAccepted());
  459.                 $subscriber->setEmail($email);
  460.                 $subscriber->setConditionsAccepted($resource->getClientDetails()->isNewsletterAccepted());
  461.                 $subscriber->setClient($resource);
  462.                 $subscriber->setShop($shop);
  463.                 if (false === $subscriber->getShop()->getNewsletterSettings()->isSendConfirmationEmail()) {
  464.                     $subscriber->setEnabled(true);
  465.                 }
  466.                 $this->newsletterSubscriberManager->createResource($subscriber);
  467.             }
  468.         }
  469.     }
  470.     public function onClientPreCreate(EntityEvent $event)
  471.     {
  472.         $entity $event->getEntity();
  473.         if ($entity instanceof Client) {
  474.             if ($entity->getContactDetails()->getEmail() === '') {
  475.                 $entity->getContactDetails()->setEmail($entity->getUsername());
  476.             }
  477.             if ($entity->getBillingAddress()->isNotEmpty()) {
  478.                 if (false === $entity->getShippingAddress()->isNotEmpty()) {
  479.                     $entity->getShippingAddress()->setFirstName($entity->getBillingAddress()->getFirstName());
  480.                     $entity->getShippingAddress()->setLastName($entity->getBillingAddress()->getLastName());
  481.                     $entity->getShippingAddress()->setLine1($entity->getBillingAddress()->getLine1());
  482.                     $entity->getShippingAddress()->setLine2($entity->getBillingAddress()->getLine2());
  483.                     $entity->getShippingAddress()->setPostalCode($entity->getBillingAddress()->getPostalCode());
  484.                     $entity->getShippingAddress()->setCity($entity->getBillingAddress()->getCity());
  485.                     $entity->getShippingAddress()->setCompanyName($entity->getBillingAddress()->getCompanyName());
  486.                     $entity->getShippingAddress()->setCountry($entity->getBillingAddress()->getCountry());
  487.                     $entity->getShippingAddress()->setState($entity->getBillingAddress()->getState());
  488.                 }
  489.                 $billingAddress  = new ClientAddress(AddressInterface::ADDRESS_TYPE_BILLING$entity);
  490.                 $shippingAddress = new ClientAddress(AddressInterface::ADDRESS_TYPE_SHIPPING$entity);
  491.                 $billingAddress->setDefaultAddress(false);
  492.                 $shippingAddress->setDefaultAddress(false);
  493.                 if ($this->geocoderSystemConfigurator->isClientEnabled()) {
  494.                     $this->geocodeClientAddresses($entity);
  495.                 }
  496.                 $this->entityManager->persist($billingAddress);
  497.                 $this->entityManager->persist($shippingAddress);
  498.             }
  499.         }
  500.     }
  501.     public function onClientAddressPreUpdate(EntityEvent $event)
  502.     {
  503.         $geocoder $this->getGeocoder();
  504.         $entity   $event->getEntity();
  505.         if ($entity instanceof ClientAddress) {
  506.             try {
  507.                 $geocodeAddress $geocoder->geocode($entity->getGeocodableAddress())->first();
  508.                 if ($geocodeAddress instanceof Location) {
  509.                     $coordinates $geocodeAddress->getCoordinates();
  510.                     $entity->setLongitude($coordinates->getLongitude());
  511.                     $entity->setLatitude($coordinates->getLatitude());
  512.                 }
  513.             } catch (\Exception $e) {
  514.             }
  515.         }
  516.     }
  517.     private function geocodeClientAddresses(Client $client)
  518.     {
  519.         $geocoder $this->getGeocoder();
  520.         try {
  521.             $billingAddress $client->getBillingAddress();
  522.             $geocodeBilling $geocoder->geocode($billingAddress->getGeocodableAddress())->first();
  523.             if ($geocodeBilling instanceof Location) {
  524.                 $coordinates $geocodeBilling->getCoordinates();
  525.                 $billingAddress->setLongitude($coordinates->getLongitude());
  526.                 $billingAddress->setLatitude($coordinates->getLatitude());
  527.             }
  528.         } catch (\Exception $e) {
  529.         }
  530.         try {
  531.             $shippingAddress $client->getShippingAddress();
  532.             $geocodeShipping $geocoder->geocode($shippingAddress->getGeocodableAddress())->first();
  533.             if ($geocodeShipping instanceof Location) {
  534.                 $coordinates $geocodeShipping->getCoordinates();
  535.                 $shippingAddress->setLongitude($coordinates->getLongitude());
  536.                 $shippingAddress->setLatitude($coordinates->getLatitude());
  537.             }
  538.         } catch (\Exception $e) {
  539.         }
  540.         $client->getBillingAddresses()->map(function (ClientAddress $clientAddress) use ($geocoder) {
  541.             try {
  542.                 $geocodeAddress $geocoder->geocode($clientAddress->getGeocodableAddress())->first();
  543.                 if ($geocodeAddress instanceof Location) {
  544.                     $coordinates $geocodeAddress->getCoordinates();
  545.                     $clientAddress->setLongitude($coordinates->getLongitude());
  546.                     $clientAddress->setLatitude($coordinates->getLatitude());
  547.                 }
  548.             } catch (\Exception $e) {
  549.             }
  550.         });
  551.         $client->getShippingAddresses()->map(function (ClientAddress $clientAddress) use ($geocoder) {
  552.             try {
  553.                 $geocodeAddress $geocoder->geocode($clientAddress->getGeocodableAddress())->first();
  554.                 if ($geocodeAddress instanceof Location) {
  555.                     $coordinates $geocodeAddress->getCoordinates();
  556.                     $clientAddress->setLongitude($coordinates->getLongitude());
  557.                     $clientAddress->setLatitude($coordinates->getLatitude());
  558.                 }
  559.             } catch (\Exception $e) {
  560.             }
  561.         });
  562.     }
  563.     private function getGeocoder(): Geocoder
  564.     {
  565.         return $this->geocoderProvider->createGeocoder();
  566.     }
  567.     protected function formatClientAddress(ClientAddress $address$lineSeparator '<br />')
  568.     {
  569.         $lines   = [];
  570.         $lines[] = sprintf('%s %s'$address->getFirstName(), $address->getLastName());
  571.         if ('' !== $address->getCompanyName()) {
  572.             $lines[] = $address->getCompanyName();
  573.         }
  574.         $lines[] = sprintf('%s, %s %s'$address->getLine1(), $address->getLine2(), $address->getLine3());
  575.         $lines[] = sprintf('%s, %s %s'$address->getCountry(), $address->getPostalCode(), $address->getCity());
  576.         return implode($lineSeparator$lines);
  577.     }
  578.     public function onSecurityInteractiveLogin(InteractiveLoginEvent $event)
  579.     {
  580.         $client $event->getAuthenticationToken()->getUser();
  581.         if ($client instanceof Client) {
  582.             if ($this->orderProvider->hasCurrentOrder()) {
  583.                 $order $this->orderProvider->getCurrentOrder();
  584.                 $this->clientAddressHelper->syncBillingAddress($client->getBillingAddress(), $order->getBillingAddress(), true);
  585.                 $this->clientAddressHelper->syncShippingAddress($client->getShippingAddress(), $order->getShippingAddress(), true);
  586.                 $this->clientAddressHelper->syncContactDetails($client->getContactDetails(), $order->getContactDetails(), true);
  587.             }
  588.             if (!empty($client->getBillingAddress()->getCompanyName())) {
  589.                 $client->getBillingAddress()->setCompanyAddress(true);
  590.             } else {
  591.                 $client->getBillingAddress()->setCompanyAddress(false);
  592.             }
  593.             if (!empty($client->getShippingAddress()->getCompanyName())) {
  594.                 $client->getShippingAddress()->setCompanyAddress(true);
  595.             } else {
  596.                 $client->getShippingAddress()->setCompanyAddress(false);
  597.             }
  598.             $email  $client->getContactDetails()->getEmail();
  599.             $orders $this->entityManager->getRepository(Order::class)->findBy(['contactDetails.email' => $email]);
  600.             /** @var Order $order */
  601.             foreach ($orders as $order) {
  602.                 if (!$order->getClient() instanceof Client) {
  603.                     $order->setClient($client);
  604.                 }
  605.             }
  606.             $this->entityManager->flush();
  607.         }
  608.     }
  609. }