{$method}(); } } protected function alertDiscountCoupons(): void { $subqueryUsedCoupons = sqlQueryBuilder() ->select('COUNT(*)') ->from('discounts_coupons', 'dcu') ->andWhere('dcu.id_discount = d.id') ->andWhere(Operator::equals(['dcu.used' => 'Y'])); $subqueryProducts = sqlQueryBuilder() ->select("JSON_VALUE(data, '$.generate_coupon_discount') as id_discount") ->from('products') ->andWhere(Operator::equals([JsonOperator::value('data', 'generate_coupon') => 'Y'])) ->andWhere("JSON_VALUE(data, '$.generate_coupon_discount') IS NOT NULL AND JSON_VALUE(data, '$.generate_coupon_discount') != ''"); $qb = sqlQueryBuilder() ->select("d.id, d.descr, COUNT(dc.id) as total, ({$subqueryUsedCoupons}) as used, (COUNT(dc.id) - ({$subqueryUsedCoupons->getSQL()})) as remaining") ->from('discounts', 'd') ->joinSubQuery('d', $subqueryProducts, 'p', 'p.id_discount = d.id') ->join('d', 'discounts_coupons', 'dc', 'dc.id_discount = d.id') ->groupBy('d.id') ->having('remaining < '.self::ALERT_LIMIT_DISCOUNT_COUPONS) ->addQueryBuilderParameters($subqueryUsedCoupons); $activityLogData = []; foreach ($qb->execute() as $item) { $activityLogData[$item['descr']] = $item['remaining']; } if (!empty($activityLogData)) { $this->addActivityLog('Zásoby některých dárkových poukazů docházejí: ('.count($activityLogData).')', $activityLogData); } } private function addActivityLog(string $message, array $data): void { addActivityLog( severity: ActivityLog::SEVERITY_WARNING, type: ActivityLog::TYPE_COMMUNICATION, message: $message, data: $data, ); } }