Files
kupshop/bundles/External/HannahBundle/Util/OCAlertUtil.php
2025-08-02 16:30:27 +02:00

69 lines
2.3 KiB
PHP

<?php
declare(strict_types=1);
namespace External\HannahBundle\Util;
use KupShop\AdminBundle\Util\ActivityLog;
use KupShop\KupShopBundle\Query\JsonOperator;
use Query\Operator;
readonly class OCAlertUtil
{
private const ALERT_LIMIT_DISCOUNT_COUPONS = 50;
public function doCheckAlerts(): void
{
foreach (get_class_methods($this) as $method) {
if (!str_starts_with($method, 'alert')) {
continue;
}
$this->{$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,
);
}
}