src/Modules/Package/Service/PackageOrderService.php line 160
<?phpnamespace App\Modules\Package\Service;use Symfony\Component\DependencyInjection\ReverseContainer;use Symfony\Component\HttpFoundation\RequestStack;use Symfony\Component\Routing\RouterInterface;use Symfony\Component\PasswordHasher\Hasher\UserPasswordHasherInterface;use Symfony\Component\Form\Form;use Symfony\Component\String\Slugger\AsciiSlugger;use Psr\Container\ContainerInterface;use Doctrine\Persistence\ManagerRegistry;use App\Lib\UtilsLib;use App\Service\AppService;use App\Service\MailerService;use App\Common\Modules\Payment\Service\PaymentService as CommonPaymentService;use App\Common\Modules\Voucher\Service\VoucherService as CommonVoucherService;use App\Admin\Modules\User\Service\AdminService;use App\Admin\Modules\User\Entity\UserAdmin;use App\Admin\Modules\Voucher\Entity\VoucherPackage;use App\Admin\Modules\Voucher\Entity\VoucherPackageVoucher;use App\Admin\SuperAdmin\Modules\Trader\Entity\UserTrader;use App\Admin\SuperAdmin\Modules\Package\Entity\Package;use App\Modules\User\Entity\User;use App\Modules\Package\Entity\PackageOrder;use App\Modules\Package\Form\OrderType;use App\Modules\Voucher\Service\VoucherRepositoryService;class PackageOrderService{const REFERRAR_LINK_QUERY_PARAM_NAME = 'ref';const VOUCHER_ID_QUERY_PARAM_NAME = 'voucher';private $_reverseContainer;private $_requestStack;private $_router;private $_passwordHasher;private $_doctrine;private $_parameterBag;private $_mailerService;private $_commonVoucherService;private $_adminService;private $_voucherRepositoryService;public function __construct(ReverseContainer $reverseContainer,RequestStack $requestStack,RouterInterface $router,UserPasswordHasherInterface $passwordHasher,ManagerRegistry $doctrine,ContainerInterface $parameterBag,MailerService $mailerService,CommonVoucherService $commonVoucherService,AdminService $adminService,VoucherRepositoryService $voucherRepositoryService){$this->_reverseContainer = $reverseContainer;$this->_requestStack = $requestStack;$this->_router = $router;$this->_passwordHasher = $passwordHasher;$this->_doctrine = $doctrine;$this->_parameterBag = $parameterBag;$this->_mailerService = $mailerService;$this->_commonVoucherService = $commonVoucherService;$this->_adminService = $adminService;$this->_voucherRepositoryService = $voucherRepositoryService;}public function setReferralTrader($referralId){$trader = $this->_doctrine->getRepository(UserTrader::class)->findOneBy(['referralId' => $referralId]);if (!$trader)return;$session = $this->_requestStack->getCurrentRequest()->getSession();// zwiekszenie licznika odwiedzin z reflinka$lastReferralIds = $session->get('packages.last_referral_ids') ?? [];if (!in_array($referralId, $lastReferralIds)){$trader->setReflinkViewCount($trader->getReflinkViewCount() + 1);$em = $this->_doctrine->getManager();$em->persist($trader);$em->flush();$lastReferralIds[] = $referralId;if (count($lastReferralIds) > 50)array_shift($lastReferralIds);$session->set('packages.last_referral_ids', $lastReferralIds);}// zapamietanie referral id w sesji$session->set('packages.referral_id', $referralId);}public function getReferralTrader(){$referralId = $this->_requestStack->getCurrentRequest()->getSession()->get('packages.referral_id');if ($referralId != ''){$trader = $this->_doctrine->getRepository(UserTrader::class)->findOneBy(['referralId' => $referralId]);if ($trader)return $trader->getUser();}}public function setVoucher($voucherId){$voucher = $this->_voucherRepositoryService->find($voucherId);if ($voucher){$this->_requestStack->getCurrentRequest()->getSession()->set('packages.voucher_id', $voucher->getId());self::$_voucher = null;return $this->getVoucher() != null;}elsereturn false;}public function setVouhcherByNumber($number){$adminUser = $this->_doctrine->getRepository(User::class)->findOneBy(['systemId' => User::SYSTEM_ADMIN_SYSTEM_ID]);if (!$adminUser)return false;$voucher = $this->_voucherRepositoryService->findByFullNumberAndAdminUser($number, $adminUser);if ($voucher){$this->_requestStack->getCurrentRequest()->getSession()->set('packages.voucher_id', $voucher->getId());self::$_voucher = null;return $this->getVoucher() != null;}elsereturn false;}private static $_voucher;public function getVoucher(){if (self::$_voucher === null){self::$_voucher = false;$voucherId = $this->_requestStack->getCurrentRequest()->getSession()->get('packages.voucher_id');if ($voucherId == '')return;$voucher = $this->_voucherRepositoryService->find($voucherId);if ($voucher){switch($voucher->getPackage()->getAddedByUser()->getSystemId()){case User::SYSTEM_ADMIN_SYSTEM_ID:if (in_array($voucher->getPackage()->getVoucherType(), [VoucherPackage::VOUCHER_TYPE_AMOUNT, VoucherPackage::VOUCHER_TYPE_DISCOUNT]) &&$voucher->getPackage()->getQRCodeRedirectType() == VoucherPackage::QR_CODE_REDIRECT_TYPE_PACKAGES &&($voucher->getPackage()->getVoucherType() != VoucherPackage::VOUCHER_TYPE_AMOUNT || $voucher->getPackage()->getCurrencyCode() == AppService::DEFAULT_CURRENCY_CODE) &&$voucher->getType() == VoucherPackageVoucher::TYPE_PACKAGE_VOUCHER &&$this->_commonVoucherService->isValid($voucher))self::$_voucher = $voucher;break;case User::SYSTEM_VOUCHER_ADMIN_SYSTEM_ID:if (in_array($voucher->getPackage()->getVoucherType(), [VoucherPackage::VOUCHER_TYPE_AMOUNT, VoucherPackage::VOUCHER_TYPE_DISCOUNT]) &&($voucher->getPackage()->getVoucherType() != VoucherPackage::VOUCHER_TYPE_AMOUNT || $voucher->getPackage()->getCurrencyCode() == AppService::DEFAULT_CURRENCY_CODE) &&$this->_commonVoucherService->isValid($voucher))self::$_voucher = $voucher;break;}}}return self::$_voucher ? self::$_voucher : null;}public function add(Form $form, Package $package){$formType = $form->getConfig()->getType()->getInnerType();$packageData = $this->_reverseContainer->getService('package')->getDetails($package);$em = $this->_doctrine->getManager();$em->getConnection()->beginTransaction();try{$order = $form->getData();$order->setReferralUser($this->getReferralTrader());$order->setPackage($package);$order->setPackageName($package->getName());$order->setPrice($packageData['gross_price']);$order->setVouchersNumber($package->getVouchersNumber());$order->setPrintVouchersNumber($package->getPrintVouchersNumber());$order->setVoucherManagementType($package->getVoucherManagementType());$order->setReportsType($package->getReportsType());$order->setOfflineVouchers($package->getOfflineVouchers());$order->setProductVouchers($package->getProductVouchers());$order->setAmountVouchers($package->getAmountVouchers());$order->setThematicVouchers($package->getThematicVouchers());$order->setVoucherCreator($package->getVoucherCreator());$order->setVouchersParameterization($package->getVouchersParameterization());$order->setCodeSNSerialization($package->getCodeSNSerialization());$order->setPartners($package->getPartners());$order->setLoyaltyProgram($package->getLoyaltyProgram());$order->setClientPanel($package->getClientPanel());$order->setLandingPagesCreator($package->getLandingPagesCreator());if ($form['userType']->getData() == OrderType::USER_TYPE_NEW){// $password = $form['newUserPassword']->getData();$password = UtilsLib::generateRandom(6);$user = new User();$user->setIsActive(true);$user->setType(User::TYPE_ADMIN);$user->setUsername($form['newUserEmail']->getData());$user->setPassword($this->_passwordHasher->hashPassword($user, $password));$user->setEmail($order->getEmail());$admin = new UserAdmin();$admin->setCompanyName($order->getCompanyName());$admin->setTin($order->getTin());$admin->setPhone($order->getPhone());$alias = (new AsciiSlugger())->slug($order->getCompanyName());$i = 0;while(true){$_alias = $alias . ($i++ ? '-' . $i : '');$_admin = $this->_doctrine->getRepository(UserAdmin::class)->findOneBy(['alias' => $_alias]);if (!$_admin){$alias = $_alias;break;}}$admin->setAlias($alias);$user->setAdmin($admin);$em->persist($user);$order->setUser($user);}else{$user = $formType->user;$admin = $user->getAdmin();$order->setUser($formType->user);$order->setCompanyName($admin->getCompanyName());$order->setTin($admin->getTin());$order->setEmail($user->getEmail());$order->setPhone($admin->getPhone());}$em->persist($order);// czy uzyto vouchera$voucher = $this->getVoucher();if ($voucher){if (!$this->_commonVoucherService->setUsedStatus($voucher))throw new \Exception('Nie udało się zmienić statusu vouchera.');$voucher->setUser($user);$em->persist($voucher);}$em->flush();$em->getConnection()->commit();}catch(\Exception $e){$em->getConnection()->rollback();throw $e;}// wiadomosc do uzytkownikaif ($form['userType']->getData() == OrderType::USER_TYPE_NEW){$this->_mailerService->sendFromTemplate($user->getEmail(), 'Modules/Package/Templates/Package/Email/newUserOrderMessage.html.twig', ['order' => $order,'password' => $password,'paymentUrl' => $this->_router->generate('package_go_to_payment', ['orderId' => $order->getId(), 'key' => $this->getOrderAccessKey($order), 'paymentMethodId' => CommonPaymentService::PAYMENT_METHOD_PRZELEWY24_ID], RouterInterface::ABSOLUTE_URL)]);}else{$this->_mailerService->sendFromTemplate($user->getEmail(), 'Modules/Package/Templates/Package/Email/orderMessageToUser.html.twig', ['order' => $order,'paymentUrl' => $this->_router->generate('package_go_to_payment', ['orderId' => $order->getId(), 'key' => $this->getOrderAccessKey($order), 'paymentMethodId' => CommonPaymentService::PAYMENT_METHOD_PRZELEWY24_ID], RouterInterface::ABSOLUTE_URL)]);}return $order;}public function setPaidStatus(PackageOrder $order){if ($order->getPaidAt() ||!$order->getUser())return false;$order->setPaidAt(new \DateTime());$order->setEndDate((clone $order->getPaidAt())->add(new \DateInterval('P1Y')));$user = $order->getUser();$this->_adminService->prepareAdminAccount($user, false);$admin = $user->getAdmin();$admin->setAvailableVoucherCount($order->getVouchersNumber());$em = $this->_doctrine->getManager();$em->persist($user);$em->flush();return true;}public function isOrderKeyValid(PackageOrder $order, $key){return $key == $this->getOrderAccessKey($order);}public function getOrderAccessKey(PackageOrder $order){return md5($order->getId() . $this->_parameterBag->get('secret'));}}