src/Utils/TermsService.php line 617

Open in your IDE?
  1. <?php
  2. namespace App\Utils;
  3. use App\Entity\Gos\Cart;
  4. use App\Entity\Gos\Language;
  5. use App\Entity\Gos\OrderPart;
  6. use App\Entity\Gos\OrderProductVariant;
  7. use App\Entity\Gos\Orders;
  8. use App\Entity\Gos\PortalSettings;
  9. use App\Entity\Gos\ProductCart;
  10. use App\Entity\Gos\ProductVariant;
  11. use App\Entity\Gos\Term;
  12. use App\Entity\Gos\TermText;
  13. use App\Entity\Gos\User;
  14. use App\Entity\Gos\UserTerms;
  15. use App\Utils\SalesManago\SalesManagoEvent;
  16. use Doctrine\ORM\EntityManagerInterface;
  17. use Psr\Log\LoggerInterface;
  18. use Symfony\Component\HttpFoundation\Request;
  19. use Symfony\Component\HttpFoundation\RequestStack;
  20. use Symfony\Contracts\Translation\TranslatorInterface;
  21. class TermsService
  22. {
  23.     private ?Request $request;
  24.     private EntityManagerInterface $em;
  25.     private EmailPermissionServices $emailPermissionServices;
  26.     private SalesManagoEvent $salesManagoEvent;
  27.     private LoggerInterface $logger;
  28.     private TranslatorInterface $translator;
  29.     private $locale;
  30.     public function __construct(
  31.         RequestStack $requestStack,
  32.         EntityManagerInterface $entityManager,
  33.         EmailPermissionServices $emailPermissionServices,
  34.         SalesManagoEvent $salesManagoEvent,
  35.         LoggerInterface $logger,
  36.         TranslatorInterface $translator
  37.     ) {
  38.         $this->request                  $requestStack->getCurrentRequest();
  39.         $this->em                       $entityManager;
  40.         $this->emailPermissionServices  $emailPermissionServices;
  41.         $this->salesManagoEvent         $salesManagoEvent;
  42.         $this->logger                   $logger;
  43.         $this->translator               $translator;
  44.     }
  45.     /**
  46.      * Get Terms from products and portal settings to display in order form
  47.      */
  48.     public function getTerms(
  49.         PortalSettings $portalSettings,
  50.         Cart $cart null,
  51.         $isRequired false,
  52.         $registration false,
  53.         $advertising true,
  54.         $user null
  55.     )
  56.     {
  57.         $terms = [];
  58.         if (empty($user))
  59.         {
  60.             $user = empty($cart) ? null $cart->getUser();
  61.         }
  62.         $myTerms $this->getMyTerms($user);
  63.         // get portal settings terms
  64.         foreach ($portalSettings->getTerms() as $term)
  65.         {
  66.             if ($this->checkIfCorrectLanguage($term) && $this->checkApprovedTerms($term$myTerms$user)
  67.                 && !in_array($term->getTermType()->getSlug(), ['voucher''term-info']))
  68.             {
  69.                 $terms $this->addTermsToArray($terms$isRequired$term$registration$advertising);
  70.             }
  71.         }
  72.         // get product variants terms
  73.         if (!empty($cart))
  74.         {
  75.             foreach ($cart->getProductCart() as $productCart)
  76.             {
  77.                 /** @var ProductCart $productCart */
  78.                 $pv $productCart->getProductVariant();
  79.                 if (!empty($pv))
  80.                 {
  81.                     $terms $this->addTerms($terms$pv$user$myTerms$isRequired$advertising);
  82.                 }
  83.                 elseif (!empty($productCart->getProductPack()))
  84.                 {
  85.                     foreach ($productCart->getProductPack()->getProductPackItem() as $productPackItem)
  86.                     {
  87.                         $terms $this->addTerms($terms$productPackItem->getProductVariant(), $user$myTerms$isRequired$advertising);
  88.                     }
  89.                 }
  90.                 if ($productCart->getIsGift() || $productCart->getGift())
  91.                 {
  92.                     $cartLanguage $cart->getCountry()
  93.                         ? $cart->getCountry()->getLanguage()
  94.                         : $this->em->getRepository(Language::class)->findOneBySlug('polish');
  95.                     $voucherTerm $this->em->getRepository(Term::class)
  96.                         ->findOneVoucherTerm($cartLanguage$portalSettings);
  97.                     if ($voucherTerm)
  98.                     {
  99.                         $terms $this->addTermsToArray($terms$isRequired$voucherTerm$registration$advertising);
  100.                     }
  101.                 }
  102.                 foreach ($productCart->getCartParticipant() as $cartParticipant)
  103.                 foreach ($cartParticipant->getProductVariantGroupItems() as $productVariantGroupItem)
  104.                 {
  105.                     $pv $productVariantGroupItem->getProductVariant();
  106.                     $terms $this->addTerms($terms$pv$user$myTerms$isRequired$advertising);
  107.                 }
  108.             }
  109.             $address $cart->getAddress();
  110.             if ($address === null && $user !== null)
  111.             {
  112.                 $address $user->getAddress();
  113.             }
  114.             if ($address && $address->getClientType())
  115.             {
  116.                 /** @var Term $term */
  117.                 foreach ($terms as $k => $term)
  118.                 {
  119.                     if (!empty($term->getClientTypes()->toArray()))
  120.                     {
  121.                         if (!in_array($address->getClientType(), $term->getClientTypes()->toArray()))
  122.                         {
  123.                             unset($terms[$k]);
  124.                         }
  125.                     }
  126.                 }
  127.             }
  128.             foreach ($cart->getAllProductVariants() as $variant)
  129.             {
  130.                 foreach ($variant->getTerms() as $term)
  131.                 {
  132.                     if ($term->getTermType()->getSlug() === 'withdrawal')
  133.                     {
  134.                         foreach ($terms as $key => $businessTerm)
  135.                         {
  136.                             if ($businessTerm->getTermType()->getSlug() === 'business-activity')
  137.                             {
  138.                                 unset($terms[$key]);
  139.                             }
  140.                         }
  141.                     }
  142.                 }
  143.             }
  144.         }
  145.         return $terms;
  146.     }
  147.     public function getInfoTerms(?PortalSettings $portalSettings, ?Cart $cart null): array
  148.     {
  149.         $infoTerms = array();
  150.         if ($portalSettings !== null)
  151.         {
  152.             $infoTerm $this->em->getRepository(Term::class)->findTermInfoForPortal($portalSettings);
  153.             if ($infoTerm)
  154.             {
  155.                 $infoTerms[] = $infoTerm;
  156.             }
  157.         }
  158.         if ($cart !== null)
  159.         {
  160.             $variants = array();
  161.             /** @var ProductCart $productCart */
  162.             foreach ($cart->getProductCart() as $productCart)
  163.             {
  164.                 if ($productCart->getProductVariant() !== null)
  165.                 {
  166.                     $variants[] = $productCart->getProductVariant();
  167.                 }
  168.                 elseif ($productCart->getProductPack() !== null)
  169.                 {
  170.                     foreach ($productCart->getProductPack()->getProductPackItem() as $packItem)
  171.                     {
  172.                         $variants[] = $packItem->getProductVariant();
  173.                     }
  174.                 }
  175.             }
  176.             foreach ($variants as $variant)
  177.             {
  178.                 $infoTerm $this->em->getRepository(Term::class)->findTermInfoForVariant($variant);
  179.                 if ($infoTerm)
  180.                 {
  181.                     $infoTerms[] = $infoTerm;
  182.                 }
  183.             }
  184.         }
  185.         return array_unique($infoTerms);
  186.     }
  187.     /**
  188.      * Get Terms from order product variant
  189.      */
  190.     public function getTermsFromOrder(Orders $orders)
  191.     {
  192.         $terms = [];
  193.         /** @var OrderPart $op */
  194.         foreach ($orders->getOrderPart() as $op)
  195.         {
  196.             /** @var OrderProductVariant $opv */
  197.             foreach ($op->getOrderProductVariant() as $opv)
  198.             {
  199.                 /** @var ProductVariant $pv */
  200.                 $pv      $opv->getProductVariant();
  201.                 $terms   $this->addTerms($terms$pvnull, [], false);
  202.             }
  203.         }
  204.         return $terms;
  205.     }
  206.     /**
  207.      * Get Terms from order product variant for Api
  208.      */
  209.     public function getTermsFromOrderForApi(Orders $orders): array
  210.     {
  211.         $terms = [];
  212.         /** @var OrderPart $op */
  213.         foreach ($orders->getOrderPart() as $op)
  214.         {
  215.             /** @var OrderProductVariant $opv */
  216.             foreach ($op->getOrderProductVariant() as $opv)
  217.             {
  218.                 /** @var ProductVariant $pv */
  219.                 $pv      $opv->getProductVariant();
  220.                 $terms   $this->addTerms($terms$pvnull, [], false);
  221.             }
  222.         }
  223.         $termsInfo = [];
  224.         /** @var Term $term */
  225.         foreach ($terms as $term)
  226.         {
  227.             $termsInfo[] = [
  228.                 'titleOfShortDescription' => $term->getTitleOfShortDescription(),
  229.                 'shortDescription' => $term->getShortDescription()
  230.             ];
  231.         }
  232.         return $termsInfo;
  233.     }
  234.     /**
  235.      * Check if this terms accepted by user
  236.      */
  237.     private function checkApprovedTerms(Term $term$myTermsUser $user null): bool
  238.     {
  239.         if (empty($user))
  240.         {
  241.             return true;
  242.         }
  243.         if (in_array($term->getTermType()->getSlug(), ['business-activity''withdrawal']))
  244.         {
  245.             return true;
  246.         }
  247.         if ($term->getIsReusable())
  248.         {
  249.             return true;
  250.         }
  251.         if (!$term->getPortalSettings()->isEmpty())
  252.         {
  253.             return true;
  254.         }
  255.         if (
  256.                in_array($term->getId(), $myTerms)
  257.             || ($user->getAllowedAdvertising() && $term->getTermType()->getSlug() == 'advertising-agreement')
  258.         )
  259.         {
  260.             return false;
  261.         }
  262.         else
  263.         {
  264.             return true;
  265.         }
  266.     }
  267.     /**
  268.      * Return array all ID terms this user
  269.      */
  270.     private function getMyTerms(User $user null): array
  271.     {
  272.         $myTerms = array();
  273.         if (empty($user))
  274.         {
  275.             return $myTerms;
  276.         }
  277.         /** @var UserTerms $userTerm */
  278.         foreach ($user->getUserTerms() as $userTerm)
  279.         {
  280.             if (!$userTerm->getTermText())
  281.             {
  282.                 $this->logger->critical('GOS-1348.09: $userTerm->getTermText() is null.
  283.                 User_id passed to function: ' $user->getId() . '. 
  284.                 Referer url: ' $this->request->headers->get('referer'));
  285.                 throw new \Exception($this->translator->trans('errors.order.oops'));
  286.             }
  287.             if (empty($userTerm->getTermText()->getTerm()))
  288.             {
  289.                 $myTerms[] = $userTerm->getTermText()->getActiveTerm()->getId();
  290.             }
  291.             else
  292.             {
  293.                 $myTerms[] = $userTerm->getTermText()->getTerm()->getId();
  294.             }
  295.         }
  296.         return $myTerms;
  297.     }
  298.     private function addTermsToArray($terms$isRequiredTerm $term$registration false$advertising true)
  299.     {
  300.         if (
  301.                 (($isRequired && $term->getIsRequired()) || !$isRequired)
  302.              && !empty($term->getActiveTermText())
  303.              && (($registration && $term->getShowInRegistration()) || !$registration)
  304.              && ((!$advertising && $term->getTermType()->getSlug() != 'advertising-agreement') || $advertising)
  305.            )
  306.         {
  307.             $terms[$term->getId()] = $term;
  308.         }
  309.         return $terms;
  310.     }
  311.     /**
  312.      * Check if all terms are selected
  313.      */
  314.     public function areTermsSelected($form$terms): bool
  315.     {
  316.         // check each term is in form
  317.         foreach ($terms as $term)
  318.         {
  319.             if (!isset($form[$term->getId()]))
  320.             {
  321.                 return false;
  322.             }
  323.         }
  324.         return true;
  325.     }
  326.     /**
  327.      * Create or edit term on backend
  328.      */
  329.     public function save($formTerm $term): Term
  330.     {
  331.         if ($form->isSubmitted())
  332.         {
  333.             if ($form->isValid())
  334.             {
  335.                 $requestTermText $this->request->request->get('termText'null);
  336.                 $this->em->persist($term);
  337.                 if (!empty($requestTermText))
  338.                 {
  339.                     if (empty($term->getActiveTermText()))
  340.                     {
  341.                         $activeTermText = new TermText();
  342.                     }
  343.                     else
  344.                     {
  345.                         $activeTermText $term->getActiveTermText();
  346.                         if ($requestTermText != $term->getActiveTermText()->getTermText())
  347.                         {
  348.                             $oldTermText    $activeTermText;
  349.                             $activeTermText = clone $oldTermText;
  350.                             $oldTermText
  351.                                 ->setTerm($term)
  352.                                 ->setActiveTerm(null)
  353.                                 ->setIsActive(false);
  354.                             $this->em->persist($oldTermText);
  355.                             $this->em->flush();
  356.                         }
  357.                     }
  358.                     $activeTermText
  359.                         ->setTermText($requestTermText)
  360.                         ->setActiveTerm($term)
  361.                         ->setIsActive(true);
  362.                     $this->em->persist($activeTermText);
  363.                 }
  364.                 $this->em->flush();
  365.                 $this->em->refresh($term);
  366.                 $this->request->getSession()->getFlashBag()->add('success''Successfully saved');
  367.             }
  368.             else
  369.             {
  370.                 $this->request->getSession()->getFlashBag()->add('danger''Form is not valid');
  371.             }
  372.         }
  373.         return $term;
  374.     }
  375.     public function saveUserTerms($terms$termsAcceptedUser $userPortalSettings $portalSettingsOrders $order null): array
  376.     {
  377.         $result = [];
  378.         if (!empty($terms))
  379.         {
  380.             $clientHost         $this->request->getHost();
  381.             $httpXForwardedFor  $this->request->server->get('HTTP_X_FORWARDED_FOR');
  382.             $clientIp           $httpXForwardedFor ?: $this->request->getClientIp();
  383.             foreach ($terms as $term)
  384.             {
  385.                 if ($this->checkTermIsSelected($term$termsAccepted) && !$this->checkTermAlreadyExists($term$user))
  386.                 {
  387.                     $userTerms = (new UserTerms())
  388.                         ->setUser($user)
  389.                         ->setUserHost($clientHost)
  390.                         ->setUserIp($clientIp)
  391.                         ->setTermText($term->getActiveTermText())
  392.                         ->setOrders($order);
  393.                     if ($term->getCooperatorGroup())
  394.                     {
  395.                         $cooperatorsList '';
  396.                         foreach ($term->getCooperatorGroup()->getCooperator() as $cooperator) {
  397.                             $cooperatorsList $cooperatorsList $cooperator->getName() . ($cooperator->getNip() ? '('$cooperator->getNip() . ')' '') . ';';
  398.                         }
  399.                         $userTerms->setCurrentCooperators(trim($cooperatorsList,';'));
  400.                     }
  401.                     $this->em->persist($userTerms);
  402.                     $result[] = $userTerms;
  403.                     if ($term->getTermType()->getSlug() == 'advertising-agreement')
  404.                     {
  405.                         $user->setAllowedAdvertising(true);
  406.                         $portal parse_url($portalSettings->getDomain(), PHP_URL_HOST);
  407.                         $this->emailPermissionServices->setEmailPermissionAndPortal(
  408.                             $user->getEmail(),
  409.                             $portal
  410.                         );
  411.                         /* Send AllowedAdvertising event to SalesManago */
  412.                         $this->salesManagoEvent->sendAllowedAdvertising($user);
  413.                     }
  414.                     $this->em->persist($user);
  415.                 }
  416.             }
  417.             $this->em->flush();
  418.         }
  419.         return $result;
  420.     }
  421.     private function checkTermIsSelected($term$termsAccepted): bool
  422.     {
  423.         if (
  424.             isset($termsAccepted[$term->getId()])
  425.             && $termsAccepted[$term->getId()]
  426.         )
  427.         {
  428.             return true;
  429.         }
  430.         return false;
  431.     }
  432.     public function checkTermAlreadyExists(?Term $term$user): bool
  433.     {
  434.         $userTerms $user->getUserTerms();
  435.         foreach ($userTerms as $ut)
  436.         {
  437.             if ($ut->getTermText()
  438.                && $ut->getTermText()->getId() == $term->getActiveTermText()->getId()
  439.                && strpos($ut->getTermText()->getTermText(),'regulamin') !== false
  440.                && !$term->getIsReusable())
  441.             {
  442.                 return true;
  443.             }
  444.         }
  445.         return false;
  446.     }
  447.     public function addTermsToSB($client$userTerms)
  448.     {
  449.         $termIndex 0;
  450.         /** @var UserTerms $value */
  451.         foreach ($userTerms as $value)
  452.         {
  453.             $client['Zgoda_' $termIndex++] = $value->getTermText()->getTermText();
  454.             if ($value->getTermText()->getActiveTerm()
  455.                 && $value->getTermText()->getActiveTerm()->getTermType()->getSlug() === 'withdrawal'
  456.             )
  457.             {
  458.                 $client['prawo_zwrotu'] = 'nie';
  459.             }
  460.         }
  461.         return $client;
  462.     }
  463.     public function forceUserRegulationsAccept($user$hash)
  464.     {
  465.         if ($user)
  466.         {
  467.             $termRepo $this->em->getRepository(Term::class);
  468.             $portalSettingsRegulations $termRepo->findRegulationsTermsForPortal($hash);
  469.             $userTerms $termRepo->findUserTerms($user$hash);
  470.             $foundRegulations 0;
  471.             foreach ($portalSettingsRegulations as $portalSettingsRegulation)
  472.             {
  473.                 if (in_array($portalSettingsRegulation$userTerms))
  474.                 {
  475.                     $foundRegulations++;
  476.                 }
  477.             }
  478.             return count($portalSettingsRegulations) == $foundRegulations 1;
  479.         }
  480.         return false;
  481.     }
  482.     public function addMarketingTerms(User $userPortalSettings $portal): void
  483.     {
  484.         $terms $this->em->getRepository(Term::class)->findAllByPortalAndType($portal'advertising-agreement');
  485.         if (empty($terms)) return;
  486.         $termsAccepted = [];
  487.         foreach ($terms as $term)
  488.         {
  489.             $termsAccepted[$term->getId()] = $term->getId();
  490.         }
  491.         $this->saveUserTerms($terms$termsAccepted$user$portal);
  492.     }
  493.     private function addTerms($terms$productVariant$user$myTerms$isRequired$advertising true)
  494.     {
  495.         foreach ($productVariant->getTerms() as $term)
  496.         {
  497.             if ($this->checkIfCorrectLanguage($term)
  498.                 && $this->checkApprovedTerms($term$myTerms$user)
  499.                 && $this->checkTermDateValidity($term$productVariant)
  500.                 && !in_array($term->getTermType()->getSlug(), ['term-info']))
  501.             {
  502.                 $terms $this->addTermsToArray($terms$isRequired$termfalse$advertising);
  503.             }
  504.         }
  505.         // if product variant has not terms, check master product
  506.         if (count($productVariant->getTerms()) < 1)
  507.         {
  508.             foreach ($productVariant->getMasterProduct()->getTerms() as $term)
  509.             {
  510.                 if ($this->checkIfCorrectLanguage($term) && $this->checkApprovedTerms($term$myTerms$user)
  511.                 && !in_array($term->getTermType()->getSlug(), ['term-info']))
  512.                 {
  513.                     $terms $this->addTermsToArray($terms$isRequired$termfalse$advertising);
  514.                 }
  515.             }
  516.         }
  517.         return $terms;
  518.     }
  519.     private function checkIfCorrectLanguage(Term $term): bool
  520.     {
  521.         $this->locale = empty($this->request)
  522.             ? 'pl'
  523.             $this->request->getSession()->get('userLocale''pl');
  524.         if ($this->locale == 'pl'
  525.             && (is_null($term->getLanguage()) || $term->getLanguage()->getCode() == 'pl'))
  526.         {
  527.             return true;
  528.         }
  529.         if ($this->locale != 'pl'
  530.             && !empty($term->getLanguage())
  531.             && $this->locale == $term->getLanguage()->getCode())
  532.         {
  533.             return true;
  534.         }
  535.         return false;
  536.     }
  537.     private function checkTermDateValidity(Term $termProductVariant $productVariant): bool
  538.     {
  539.         if ($productVariant->getEventDate() && $term->getShowDaysBefore())
  540.         {
  541.             $eventDate = clone $productVariant->getEventDate();
  542.             $daysUntilEvent = (new \DateTime())->diff($eventDate)->days;
  543.             if ($eventDate > (new \DateTime()) && $daysUntilEvent $term->getShowDaysBefore())
  544.             {
  545.                 return false;
  546.             }
  547.         }
  548.         return true;
  549.     }
  550. }