userContext = $userContext; return $this; } public function getDiscountFilterSpec(PurchaseState $purchaseState) { if ($user = $this->userContext->getActive()) { $email = $user->email; } else { $email = $purchaseState->getCustomData('email'); } if ($email) { return function (QueryBuilder $qb) use ($email) { $specs = [ Operator::equals(['odt.type' => static::getType()]), ]; $qb->setParameter('invoice_email', $email); $qb_count = sqlQueryBuilder() ->select('COUNT(*)') ->from('orders', 'o') ->join('o', 'order_discounts_orders', 'odo', 'o.id = odo.id_order') ->where('odo.id_order_discount = odt.id_order_discount') ->andWhere('invoice_email=:invoice_email'); $specs[] = '('.$qb_count->getSQL().') >= '.JsonOperator::value('odt.data', 'max_uses_count'); return Operator::andX($specs); }; } return null; } }