src/Services/GiftCertificateService.php line 44

Open in your IDE?
  1. <?php
  2. namespace Slivki\Services;
  3. use Doctrine\ORM\EntityManagerInterface;
  4. use Mpdf\Config\ConfigVariables;
  5. use Mpdf\Config\FontVariables;
  6. use Mpdf\Mpdf;
  7. use Slivki\Entity\GeoLocation;
  8. use Slivki\Entity\GiftCertificate;
  9. use Slivki\Entity\GiftCertificateOrder;
  10. use Slivki\Entity\Offer;
  11. use Slivki\Entity\OfferOrderDetails;
  12. use Slivki\Entity\User;
  13. use Slivki\Enum\Order\PaymentType;
  14. use Slivki\Services\QRCodeGenerator\Generators\SosediBarcodeGenerator;
  15. use Slivki\Services\Subscription\SubscriptionService;
  16. use Symfony\Component\HttpKernel\KernelInterface;
  17. use Twig\Environment;
  18. use function array_filter;
  19. use function array_values;
  20. class GiftCertificateService
  21. {
  22.     private EntityManagerInterface $entityManager;
  23.     private Environment $twig;
  24.     private SubscriptionService $subscriptionService;
  25.     private ImageService $imageService;
  26.     public function __construct(
  27.         EntityManagerInterface $entityManager,
  28.         Environment $twig,
  29.         SubscriptionService $subscriptionService,
  30.         ImageService $imageService
  31.     ) {
  32.         $this->entityManager $entityManager;
  33.         $this->twig $twig;
  34.         $this->subscriptionService $subscriptionService;
  35.         $this->imageService $imageService;
  36.     }
  37.     // TODO: Refactor this shit
  38.     public function getCertificates(Offer $offer$buyOnlyCodes false): array
  39.     {
  40.         $offerID $offer->getID();
  41.         $sql "select gift_certificate.id, sum(offer_order_details.items_count) as cnt from offer_order_details
  42.             inner join offer_order on offer_order.id = offer_order_details.offer_order_id
  43.             inner join gift_certificate on gift_certificate.id = offer_order_details.gift_certificate_id
  44.             where offer_order.status > 0 and offer_order.type = " GiftCertificateOrder::TYPE " and offer_order.offer_id = " $offerID
  45.             " group by 1 order by 2 desc;";
  46.         $crtPurchaseCount $this->entityManager->getConnection()->executeQuery($sql)->fetchAll(\PDO::FETCH_ASSOC);
  47.         $offer->setGiftCertificates($this->entityManager->find(Offer::class, $offerID)->getGiftCertificates());
  48.         $certificates = [];
  49.         foreach ($offer->getActiveGiftCertificates() as $certificate) {
  50.             if ($offerID != 283213 && (!$certificate->getActiveDays() || $certificate->getActiveDays() == 0)) {
  51.                 continue;
  52.             }
  53.             $key array_search($certificate->getID(), array_column($crtPurchaseCount'id'));
  54.             $purchaseCount = isset($crtPurchaseCount[$key]['cnt']) && $key !== false $crtPurchaseCount[$key]['cnt'] : 0;
  55.             $certificates[] = $this->getCertificateData($certificate$purchaseCount);
  56.         }
  57.         return $buyOnlyCodes
  58.             array_values(array_filter($certificates, static fn (\stdClass $certificate) => $certificate->buyOnlyCode))
  59.             : array_values(array_filter($certificates, static fn (\stdClass $certificate) => !$certificate->buyOnlyCode));
  60.     }
  61.     public function getCertificatePdf(KernelInterface $kernelOfferOrderDetails $offerOrderDetails) {
  62.         $giftCertificate $offerOrderDetails->getGiftCertificate();
  63.         if (!$giftCertificate) {
  64.             return null;
  65.         }
  66.         $customFontDir $kernel->getProjectDir() . '/public/fonts/crt-fonts/ttf';
  67.         $defaultConfig = (new ConfigVariables())->getDefaults();
  68.         $defaultFontDir $defaultConfig['fontDir'];
  69.         $defaultFontConfig = (new FontVariables())->getDefaults();
  70.         $defaultFontData $defaultFontConfig['fontdata'];
  71.         $mpdf = new Mpdf([
  72.             'fontDir' => array_merge($defaultFontDir, [
  73.                 $customFontDir,
  74.             ]),
  75.             'tempDir' => '/tmp',
  76.             'fontdata' => $defaultFontData + [
  77.                     'sfrounded' => [
  78.                         'R' => 'SFRounded-Ultralight.ttf',
  79.                     ],
  80.                     'sf' => [
  81.                         'R' => 'SFProText-Regular.ttf',
  82.                     ],
  83.                 ],
  84.             'mode' => 'utf-8',
  85.             'format' => 'A4',
  86.             'orientation' => 'P',
  87.             'margin_top' => 10,
  88.             'margin_bottom' => 0,
  89.             'margin_left' => 0,
  90.             'margin_right' => 0,
  91.         ]);
  92.         $mpdf->curlAllowUnsafeSslRequests true;
  93.         $template 'Slivki/gift_certificates/crt_pdf.html.twig';
  94.         if (SosediBarcodeGenerator::OFFER_ID === (int) $offerOrderDetails->getOfferOrder()->getOffer()->getID()) {
  95.             $template 'Slivki/gift_certificates/sosedi_pdf.html.twig';
  96.         }
  97.         $mpdf->WriteHTML($this->twig->render($template, [
  98.             'offerOrderDetails' => $offerOrderDetails,
  99.             'giftCertificate' => $giftCertificate,
  100.             'offer' => $giftCertificate->getOffer(),
  101.         ]));
  102.         $mpdf->Output('crt_' $offerOrderDetails->getID() . '.pdf''D');
  103.     }
  104.     private function getCertificateData(GiftCertificate $certificate$purchaseCount): \stdClass
  105.     {
  106.         $data = new \stdClass();
  107.         $data->imageURL $this->imageService->getImageURLCached($certificate->getMedia(), 5400);
  108.         $data->name $certificate->getName();
  109.         $data->sizeFull null;
  110.         $data->offerPrice $certificate->getPriceOffer();
  111.         $data->regularPrice $certificate->getPriceRegular();
  112.         $data->id $certificate->getID();
  113.         $data->position $certificate->getPosition();
  114.         $codesPerItem $certificate->getCodesPerItem();
  115.         if (!$codesPerItem) {
  116.             $codesPerItem 1;
  117.         }
  118.         $data->productsPerCode 1/$codesPerItem;
  119.         $data->purchaseCount $purchaseCount;
  120.         $data->description $certificate->getDescription();
  121.         $giftCertificateCodePool $certificate->getLastActiveCodePool();
  122.         if ($giftCertificateCodePool) {
  123.             $data->freeCodesCount $giftCertificateCodePool->getFreeCodesCount();
  124.         }
  125.         $geoLocationIds = [];
  126.         /** @var GeoLocation $geoLocation */
  127.         foreach ($certificate->getGeoLocations() as $geoLocation) {
  128.             $geoLocationIds[] = $geoLocation->getID();
  129.         }
  130.         $data->geoLocationIds $geoLocationIds;
  131.         $tags = [];
  132.         foreach ($certificate->getTags() as $key=>$tag) {
  133.             $tags[$key]['ID'] = $tag->getID();
  134.             $tags[$key]['name'] = $tag->getTag();
  135.         }
  136.         $data->tags $tags;
  137.         $data->buyOnlyCode $certificate->isBuyOnlyCode();
  138.         return $data;
  139.     }
  140.     public function createOrder(User $userint $offerID$data$deviceType null) {
  141.         $offer $this->entityManager->find(Offer::class, $offerID);
  142.         $order = new GiftCertificateOrder();
  143.         $order->setDeviceType($deviceType);
  144.         $order->setUser($user);
  145.         $order->setOffer($offer);
  146.         $order->setPaymentType($data['paymentType'] ?? PaymentType::ONLINE);
  147.         $codesCount 0;
  148.         $totalOfferAmount 0;
  149.         $isFreeStyle in_array($offerIDOffer::FREESTYLE_OFFER_IDStrue);
  150.         $isSosedi Offer::SOSEDI_OFFER_ID === $offerID;
  151.         foreach ($data['items'] as $item) {
  152.             $count $item['amount'];
  153.             if ($count == 0) {
  154.                 continue;
  155.             }
  156.             $giftCertificate $this->entityManager->find(GiftCertificate::class, $item['id']);
  157.             if (!$giftCertificate) {
  158.                 continue;
  159.             }
  160.             for ($i 0$i $count$i++) {
  161.                 if ($isFreeStyle || $isSosedi) {
  162.                     $codeTill $offer->getCodeActiveTill()->setTime(23,59,59);
  163.                 } else {
  164.                     $codeTill =  new \DateTime("+" $giftCertificate->getActiveDays() ." days");
  165.                 }
  166.                 $details = new OfferOrderDetails();
  167.                 $details->setGiftCertificate($giftCertificate);
  168.                 $details->setItemsCount(1);
  169.                 $details->setCodeActiveTill($codeTill);
  170.                 $details->setPurchasePrice($giftCertificate->getPriceOffer());
  171.                 $order->addOfferOrderDetails($details);
  172.             }
  173.             $codesCount += $giftCertificate->getCodesPerItem() * $count;
  174.             $totalOfferAmount += $giftCertificate->getPriceOffer() * $count;
  175.         }
  176.         $codesCount ceil($codesCount);
  177.         $codeCost $this->entityManager->getRepository(Offer::class)->getCodeCost($offer$codesCount);
  178.         if ($this->subscriptionService->isSubscriber($user)
  179.             || $user->getBatchCodesCount() >= $codesCount
  180.             || $user->isBalanceAllowed($codeCost $codesCount)
  181.         ) {
  182.             $codeCost 0;
  183.         }
  184.         $order->setCodeCost($codeCost);
  185.         $order->setAmount($totalOfferAmount $codesCount $codeCost);
  186.         $order->setCodesCount($codesCount);
  187.         $order->setComment($data['comment']);
  188.         $order->setUserPhone($data['phone']);
  189.         $this->entityManager->persist($order);
  190.         $this->entityManager->flush();
  191.         return $order;
  192.     }
  193.     public function hasSosediPurchase(User $user null) {
  194.         $offerID 283793;
  195.         if (!$user) {
  196.             return false;
  197.         }
  198.         $sql "select count(*) from offer_order where offer_id = $offerID and user_id = "
  199.             .  $user->getID() . " and status > 0";
  200.         $sosediPurchasesCount $this->entityManager->getConnection()->executeQuery($sql)->fetchColumn();
  201.         return $sosediPurchasesCount 0;
  202.     }
  203. }