src/Modules/Package/Service/PackageOrderService.php line 160

  1. <?php
  2. namespace App\Modules\Package\Service;
  3. use Symfony\Component\DependencyInjection\ReverseContainer;
  4. use Symfony\Component\HttpFoundation\RequestStack;
  5. use Symfony\Component\Routing\RouterInterface;
  6. use Symfony\Component\PasswordHasher\Hasher\UserPasswordHasherInterface;
  7. use Symfony\Component\Form\Form;
  8. use Symfony\Component\String\Slugger\AsciiSlugger;
  9. use Psr\Container\ContainerInterface;
  10. use Doctrine\Persistence\ManagerRegistry;
  11. use App\Lib\UtilsLib;
  12. use App\Service\AppService;
  13. use App\Service\MailerService;
  14. use App\Common\Modules\Payment\Service\PaymentService as CommonPaymentService;
  15. use App\Common\Modules\Voucher\Service\VoucherService as CommonVoucherService;
  16. use App\Admin\Modules\User\Service\AdminService;
  17. use App\Admin\Modules\User\Entity\UserAdmin;
  18. use App\Admin\Modules\Voucher\Entity\VoucherPackage;
  19. use App\Admin\Modules\Voucher\Entity\VoucherPackageVoucher;
  20. use App\Admin\SuperAdmin\Modules\Trader\Entity\UserTrader;
  21. use App\Admin\SuperAdmin\Modules\Package\Entity\Package;
  22. use App\Modules\User\Entity\User;
  23. use App\Modules\Package\Entity\PackageOrder;
  24. use App\Modules\Package\Form\OrderType;
  25. use App\Modules\Voucher\Service\VoucherRepositoryService;
  26. class PackageOrderService
  27. {
  28.     const REFERRAR_LINK_QUERY_PARAM_NAME 'ref';
  29.     const VOUCHER_ID_QUERY_PARAM_NAME 'voucher';
  30.     private $_reverseContainer;
  31.     private $_requestStack;
  32.     private $_router;
  33.     private $_passwordHasher;
  34.     private $_doctrine;
  35.     private $_parameterBag;
  36.     private $_mailerService;
  37.     private $_commonVoucherService;
  38.     private $_adminService;
  39.     private $_voucherRepositoryService;
  40.     public function __construct(
  41.             ReverseContainer $reverseContainer,
  42.             RequestStack $requestStack,
  43.             RouterInterface $router,
  44.             UserPasswordHasherInterface $passwordHasher,
  45.             ManagerRegistry $doctrine,
  46.             ContainerInterface $parameterBag,
  47.             MailerService $mailerService,
  48.             CommonVoucherService $commonVoucherService,
  49.             AdminService $adminService,
  50.             VoucherRepositoryService $voucherRepositoryService)
  51.     {
  52.         $this->_reverseContainer $reverseContainer;
  53.         $this->_requestStack $requestStack;
  54.         $this->_router $router;
  55.         $this->_passwordHasher $passwordHasher;
  56.         $this->_doctrine $doctrine;
  57.         $this->_parameterBag $parameterBag;
  58.         $this->_mailerService $mailerService;
  59.         $this->_commonVoucherService $commonVoucherService;
  60.         $this->_adminService $adminService;
  61.         $this->_voucherRepositoryService $voucherRepositoryService;
  62.     }
  63.     
  64.     public function setReferralTrader($referralId)
  65.     {
  66.         $trader $this->_doctrine->getRepository(UserTrader::class)->findOneBy(['referralId' => $referralId]);
  67.         
  68.         if (!$trader)
  69.             return;
  70.         
  71.         $session $this->_requestStack->getCurrentRequest()->getSession();
  72.         
  73.         // zwiekszenie licznika odwiedzin z reflinka
  74.         
  75.         $lastReferralIds $session->get('packages.last_referral_ids') ?? [];
  76.         if (!in_array($referralId$lastReferralIds))
  77.         {
  78.             $trader->setReflinkViewCount($trader->getReflinkViewCount() + 1);
  79.             
  80.             $em $this->_doctrine->getManager();
  81.             $em->persist($trader);
  82.             $em->flush();
  83.             $lastReferralIds[] = $referralId;
  84.             
  85.             if (count($lastReferralIds) > 50)
  86.                 array_shift($lastReferralIds);
  87.             
  88.             $session->set('packages.last_referral_ids'$lastReferralIds);
  89.         }
  90.         
  91.         // zapamietanie referral id w sesji
  92.         
  93.         $session->set('packages.referral_id'$referralId);
  94.     }
  95.     
  96.     public function getReferralTrader()
  97.     {
  98.         $referralId $this->_requestStack->getCurrentRequest()->getSession()->get('packages.referral_id');
  99.         
  100.         if ($referralId != '')
  101.         {
  102.             $trader $this->_doctrine->getRepository(UserTrader::class)->findOneBy(['referralId' => $referralId]);
  103.             if ($trader)
  104.                 return $trader->getUser();
  105.         }
  106.     }
  107.     
  108.     public function setVoucher($voucherId)
  109.     {
  110.         $voucher $this->_voucherRepositoryService->find($voucherId);
  111.         if ($voucher)
  112.         {
  113.             $this->_requestStack->getCurrentRequest()->getSession()->set('packages.voucher_id'$voucher->getId());
  114.             
  115.             self::$_voucher null;
  116.             return $this->getVoucher() != null;
  117.         }
  118.         else
  119.             return false;
  120.     }
  121.     public function setVouhcherByNumber($number)
  122.     {
  123.         $adminUser $this->_doctrine->getRepository(User::class)->findOneBy(['systemId' => User::SYSTEM_ADMIN_SYSTEM_ID]);
  124.         
  125.         if (!$adminUser)
  126.             return false;
  127.         
  128.         $voucher $this->_voucherRepositoryService->findByFullNumberAndAdminUser($number$adminUser);
  129.    
  130.         if ($voucher)
  131.         {
  132.             $this->_requestStack->getCurrentRequest()->getSession()->set('packages.voucher_id'$voucher->getId());
  133.             
  134.             self::$_voucher null;
  135.             
  136.             return $this->getVoucher() != null;
  137.         }
  138.         else
  139.             return false;
  140.     }
  141.     
  142.     private static $_voucher;
  143.     public function getVoucher()
  144.     {
  145.         if (self::$_voucher === null)
  146.         {
  147.             self::$_voucher false;
  148.             $voucherId $this->_requestStack->getCurrentRequest()->getSession()->get('packages.voucher_id');
  149.             if ($voucherId == '')
  150.                 return;
  151.             $voucher $this->_voucherRepositoryService->find($voucherId);
  152.             
  153.             if ($voucher)
  154.             {
  155.                 switch($voucher->getPackage()->getAddedByUser()->getSystemId())
  156.                 {
  157.                     case User::SYSTEM_ADMIN_SYSTEM_ID:
  158.                         if (in_array($voucher->getPackage()->getVoucherType(), [VoucherPackage::VOUCHER_TYPE_AMOUNTVoucherPackage::VOUCHER_TYPE_DISCOUNT]) &&
  159.                                 $voucher->getPackage()->getQRCodeRedirectType() == VoucherPackage::QR_CODE_REDIRECT_TYPE_PACKAGES &&
  160.                                 ($voucher->getPackage()->getVoucherType() != VoucherPackage::VOUCHER_TYPE_AMOUNT || $voucher->getPackage()->getCurrencyCode() == AppService::DEFAULT_CURRENCY_CODE) &&
  161.                                 $voucher->getType() == VoucherPackageVoucher::TYPE_PACKAGE_VOUCHER &&
  162.                                 $this->_commonVoucherService->isValid($voucher))
  163.                             self::$_voucher $voucher;
  164.                             break;
  165.                     case User::SYSTEM_VOUCHER_ADMIN_SYSTEM_ID:
  166.                         if (in_array($voucher->getPackage()->getVoucherType(), [VoucherPackage::VOUCHER_TYPE_AMOUNTVoucherPackage::VOUCHER_TYPE_DISCOUNT]) &&
  167.                                 ($voucher->getPackage()->getVoucherType() != VoucherPackage::VOUCHER_TYPE_AMOUNT || $voucher->getPackage()->getCurrencyCode() == AppService::DEFAULT_CURRENCY_CODE) &&
  168.                                 $this->_commonVoucherService->isValid($voucher))
  169.                             self::$_voucher $voucher;
  170.                             break;
  171.                 }
  172.             }
  173.         }
  174.         
  175.         return self::$_voucher self::$_voucher null;
  176.     }
  177.     
  178.     public function add(Form $formPackage $package)
  179.     {
  180.         $formType $form->getConfig()->getType()->getInnerType();
  181.         $packageData $this->_reverseContainer->getService('package')->getDetails($package);
  182.         $em $this->_doctrine->getManager();
  183.         $em->getConnection()->beginTransaction();
  184.         
  185.         try
  186.         {        
  187.             $order $form->getData();
  188.             $order->setReferralUser($this->getReferralTrader());
  189.             $order->setPackage($package);
  190.             $order->setPackageName($package->getName());
  191.             $order->setPrice($packageData['gross_price']);
  192.             $order->setVouchersNumber($package->getVouchersNumber());
  193.             $order->setPrintVouchersNumber($package->getPrintVouchersNumber());
  194.             $order->setVoucherManagementType($package->getVoucherManagementType());
  195.             $order->setReportsType($package->getReportsType());
  196.             $order->setOfflineVouchers($package->getOfflineVouchers());
  197.             $order->setProductVouchers($package->getProductVouchers());
  198.             $order->setAmountVouchers($package->getAmountVouchers());
  199.             $order->setThematicVouchers($package->getThematicVouchers());
  200.             $order->setVoucherCreator($package->getVoucherCreator());
  201.             $order->setVouchersParameterization($package->getVouchersParameterization());
  202.             $order->setCodeSNSerialization($package->getCodeSNSerialization());
  203.             $order->setPartners($package->getPartners());
  204.             $order->setLoyaltyProgram($package->getLoyaltyProgram());
  205.             $order->setClientPanel($package->getClientPanel());
  206.             $order->setLandingPagesCreator($package->getLandingPagesCreator());
  207.             if ($form['userType']->getData() == OrderType::USER_TYPE_NEW)
  208.             {
  209.                 // $password = $form['newUserPassword']->getData();
  210.                 $password UtilsLib::generateRandom(6);
  211.                 $user = new User();
  212.                 $user->setIsActive(true);
  213.                 $user->setType(User::TYPE_ADMIN);
  214.                 $user->setUsername($form['newUserEmail']->getData());
  215.                 $user->setPassword($this->_passwordHasher->hashPassword($user$password));
  216.                 $user->setEmail($order->getEmail());
  217.                 $admin = new UserAdmin();
  218.                 $admin->setCompanyName($order->getCompanyName());
  219.                 $admin->setTin($order->getTin());
  220.                 $admin->setPhone($order->getPhone());
  221.                 $alias = (new AsciiSlugger())->slug($order->getCompanyName());
  222.                 $i 0;
  223.                 while(true)
  224.                 {
  225.                     $_alias $alias . ($i++ ? '-' $i '');
  226.                     $_admin $this->_doctrine->getRepository(UserAdmin::class)->findOneBy(['alias' => $_alias]);
  227.                     if (!$_admin)
  228.                     {
  229.                         $alias $_alias;
  230.                         break;
  231.                     }
  232.                 }
  233.                 $admin->setAlias($alias);
  234.                 $user->setAdmin($admin);
  235.                 $em->persist($user);
  236.                 $order->setUser($user);
  237.             }
  238.             else
  239.             {
  240.                 $user $formType->user;
  241.                 $admin $user->getAdmin();
  242.                 $order->setUser($formType->user);
  243.                 $order->setCompanyName($admin->getCompanyName());
  244.                 $order->setTin($admin->getTin());
  245.                 $order->setEmail($user->getEmail());
  246.                 $order->setPhone($admin->getPhone());
  247.             }
  248.             $em->persist($order);
  249.             // czy uzyto vouchera
  250.             $voucher $this->getVoucher();
  251.             if ($voucher)
  252.             {
  253.                 if (!$this->_commonVoucherService->setUsedStatus($voucher))
  254.                     throw new \Exception('Nie udało się zmienić statusu vouchera.');
  255.                 
  256.                 $voucher->setUser($user);
  257.                 $em->persist($voucher);
  258.             }
  259.             $em->flush();
  260.             
  261.             $em->getConnection()->commit();
  262.         }
  263.         catch(\Exception $e)
  264.         {
  265.             $em->getConnection()->rollback();
  266.             
  267.             throw $e;
  268.         }
  269.         
  270.         // wiadomosc do uzytkownika
  271.         
  272.         if ($form['userType']->getData() == OrderType::USER_TYPE_NEW)
  273.         {
  274.             $this->_mailerService->sendFromTemplate($user->getEmail(), 'Modules/Package/Templates/Package/Email/newUserOrderMessage.html.twig', [
  275.                     'order' => $order,
  276.                     'password' => $password,
  277.                     'paymentUrl' => $this->_router->generate('package_go_to_payment', ['orderId' => $order->getId(), 'key' => $this->getOrderAccessKey($order), 'paymentMethodId' => CommonPaymentService::PAYMENT_METHOD_PRZELEWY24_ID], RouterInterface::ABSOLUTE_URL)
  278.                 ]);
  279.         }
  280.         else
  281.         {
  282.             $this->_mailerService->sendFromTemplate($user->getEmail(), 'Modules/Package/Templates/Package/Email/orderMessageToUser.html.twig', [
  283.                     'order' => $order,
  284.                     'paymentUrl' => $this->_router->generate('package_go_to_payment', ['orderId' => $order->getId(), 'key' => $this->getOrderAccessKey($order), 'paymentMethodId' => CommonPaymentService::PAYMENT_METHOD_PRZELEWY24_ID], RouterInterface::ABSOLUTE_URL)
  285.                 ]);
  286.         }
  287.         
  288.         return $order;
  289.     }
  290.     
  291.     public function setPaidStatus(PackageOrder $order)
  292.     {
  293.         if ($order->getPaidAt() ||
  294.                 !$order->getUser())
  295.             return false;
  296.         
  297.         $order->setPaidAt(new \DateTime());
  298.         $order->setEndDate((clone $order->getPaidAt())->add(new \DateInterval('P1Y')));
  299.         
  300.         $user $order->getUser();
  301.         
  302.         $this->_adminService->prepareAdminAccount($userfalse);
  303.         
  304.         $admin $user->getAdmin();
  305.         $admin->setAvailableVoucherCount($order->getVouchersNumber());
  306.         
  307.         $em $this->_doctrine->getManager();
  308.         $em->persist($user);
  309.         $em->flush();
  310.         
  311.         return true;
  312.     }
  313.     
  314.     public function isOrderKeyValid(PackageOrder $order$key)
  315.     {
  316.         return $key == $this->getOrderAccessKey($order);
  317.     }
  318.     
  319.     public function getOrderAccessKey(PackageOrder $order)
  320.     {
  321.         return md5($order->getId() . $this->_parameterBag->get('secret'));
  322.     }
  323. }