src/Service/CouponManager.php line 35

Open in your IDE?
  1. <?php
  2. namespace App\Service;
  3. use App\Document\Coupon;
  4. use App\Document\CouponOverride;
  5. use App\EventListener\RequestValidation\CheckHeaders;
  6. use Doctrine\Bundle\MongoDBBundle\ManagerRegistry;
  7. use Doctrine\Common\Collections\ArrayCollection;
  8. use Symfony\Component\HttpFoundation\RequestStack;
  9. class CouponManager
  10. {
  11.     //services
  12.     private $request;
  13.     private $apiCoupon;
  14.     private $managerRegistry;
  15.     //vars
  16.     private $coupons;
  17.     private $currentEmitter;
  18.     private $overrideCoupons;
  19.     private $cart = [];
  20.     public function __construct(RequestStack $requestStackAPIDigitalCouponHTTP $apiCouponManagerRegistry $managerRegistry)
  21.     {
  22.         $this->request $requestStack->getCurrentRequest();
  23.         $this->apiCoupon $apiCoupon;
  24.         $this->managerRegistry $managerRegistry;
  25.         $this->currentEmitter $this->request->headers->get(CheckHeaders::SOGEC_HEADER_EMITTER_CODE_NAME);
  26.         $this->apiCoupon->setCodeDemandeur($this->currentEmitter);
  27.         $this->coupons $this->apiCoupon->getCoupponByMedia();
  28.         $this->overrideCoupons();
  29.     }
  30.     public function getCart() :array
  31.     {
  32.         return $this->cart;
  33.     }
  34.     public function getCartItemQuantity(Coupon $coupon) :int
  35.     {
  36.         return $opCode[$coupon->getOperationCode()]['quantity'] ?? 0;
  37.     }
  38.     public function addToCart(Coupon $coupon$nb 1) :self
  39.     {
  40.         $opCode $coupon->getOperationCode();
  41.         if( !isset( $this->cart[$opCode] ) ) {
  42.             $this->cart[$opCode]["quantity"] = 0;
  43.             $this->cart[$opCode]["item"] = $coupon;
  44.         }
  45.         $this->cart[$opCode]["quantity"] += $nb;
  46.         $this->cart[$opCode]["item"] = $coupon;
  47.         $this->decreaseStock($coupon$nb);
  48.         return $this;
  49.     }
  50.     public function clearCart() :self
  51.     {
  52.         if( is_array($this->cart) ) {
  53.             foreach($this->cart as $item) {
  54.                 $quantity $item["quantity"] ?? 0;
  55.                 $coupon $item["item"] ?? null;
  56.                 if( $quantity <= || !$coupon instanceof Coupon) {
  57.                     continue;
  58.                 }
  59.                 $this->increaseStock($coupon$quantity);
  60.             }
  61.         }
  62.         return $this;
  63.     }
  64.     public function geCollection(): array
  65.     {
  66.         return $this->overrideCoupons ?? [];
  67.     }
  68.     public function getItem(string $couponCode): ?Coupon
  69.     {
  70.         if(!$this->overrideCoupons instanceof ArrayCollection) {
  71.             $this->overrideCoupons = new ArrayCollection($this->overrideCoupons);
  72.         }
  73.         $coupon $this->overrideCoupons
  74.             ->filter(
  75.                 function (Coupon $coupon) use ($couponCode) {
  76.                     return $coupon->getOperationCode() === $couponCode;
  77.                 }
  78.             )->first();
  79.         if(!$coupon instanceof Coupon) {
  80.             return null;
  81.         }
  82.         return $coupon;
  83.     }
  84.     private function overrideCoupons(): self
  85.     {
  86.         $this->overrideCoupons = [];
  87.         $repo $this->managerRegistry->getRepository(CouponOverride::class);
  88.         foreach( $this->coupons as $key => $coupon ) {
  89.             $overrideCoupon $repo->findOneBy(['operationCode' => $coupon->getOperationCode()]);
  90.             // rm coupon if no config
  91.             if (!$overrideCoupon instanceof CouponOverride) {
  92.                 continue;
  93.             }
  94.             $stock min(
  95.                 (int)$overrideCoupon->getStock($this->currentEmitter)->getCurrent(),
  96.                 (int)$overrideCoupon->getCurrentGlobalStock(),
  97.                 (int)$coupon->getStock()
  98.             );
  99.             $coupon->setStock($stock);
  100.             $this->overrideCoupons[] = $coupon;
  101.         }
  102.         return $this;
  103.     }
  104.     private function decreaseStock(Coupon $coupon$nb 1)
  105.     {
  106.         $repo $this->managerRegistry->getRepository(CouponOverride::class);
  107.         $overrideCoupons $repo->findOneBy(["operationCode" => $coupon->getOperationCode()]);
  108.         if( !$overrideCoupons instanceof CouponOverride) {
  109.             return;
  110.         }
  111.         $repo $this->managerRegistry->getRepository(CouponOverride::class);
  112.         $repo->decreaseStock($coupon->getOperationCode(), $this->currentEmitter$nb);
  113.     }
  114.     private function increaseStock(Coupon $coupon$nb 1)
  115.     {
  116.         $repo $this->managerRegistry->getRepository(CouponOverride::class);
  117.         $overrideCoupons $repo->findOneBy(["operationCode" => $coupon->getOperationCode()]);
  118.         if( !$overrideCoupons instanceof CouponOverride) {
  119.             return;
  120.         }
  121.         $repo $this->managerRegistry->getRepository(CouponOverride::class);
  122.         $repo->increaseStock($coupon->getOperationCode(), $this->currentEmitter$nb);
  123.     }
  124. }