From 3d03377dc933e613821e59ee7f9cec7b44b97f12 Mon Sep 17 00:00:00 2001 From: fomichev Date: Wed, 5 Feb 2025 10:02:11 +0300 Subject: [PATCH] =?utf8?q?=D0=9C=D0=B5=D1=82=D0=BE=D0=B4=D1=8B=20=D0=BA?= =?utf8?q?=D1=80=D0=BE=D0=BD=D0=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=utf8 Content-Transfer-Encoding: 8bit --- erp24/commands/CronController.php | 256 ++++++++++++++++++++++++++++++ 1 file changed, 256 insertions(+) diff --git a/erp24/commands/CronController.php b/erp24/commands/CronController.php index 707ad91a..d3524d77 100644 --- a/erp24/commands/CronController.php +++ b/erp24/commands/CronController.php @@ -10,14 +10,17 @@ use yii\console\ExitCode; use yii\db\Expression; use yii\helpers\BaseConsole; use yii\helpers\Console; +use yii_app\records\BonusLevels; use yii_app\records\EqualizationRemains; use yii_app\records\Product1cReplacement; use yii_app\records\Products1c; use yii_app\records\ReplacementInvoice; use yii_app\records\ReplacementInvoiceProducts; +use yii_app\records\Sales; use yii_app\records\SentKogort; use yii_app\records\Users; use yii_app\records\UsersBonus; +use yii_app\records\UsersBonusLevels; use yii_app\records\UsersMessageManagement; use yii_app\records\UsersTelegram; use yii_app\records\UsersTelegramLog; @@ -888,4 +891,257 @@ class CronController extends Controller ]); $log->save(false); } + + // обновление уровней по продажам + public function actionUpdateBonusLevels() + { + $users = Users::find()->all(); + + $bonusLevelsList = BonusLevels::find() + ->where(['active' => 1]) + ->orderBy(['threshold' => SORT_ASC]) + ->asArray() + ->all(); + + if (empty($bonusLevelsList)) { + $this->stdout( + "Нет активных бонус уровней для обработки.\n", + BaseConsole::FG_RED + ); + return ExitCode::UNAVAILABLE; + } + + foreach ($users as $user) { + if (!empty($user->check_id_last_sale)) { + $lastSaleRecord = Sales::findOne($user->check_id_last_sale); + if ($lastSaleRecord) { + $baseDate = $lastSaleRecord->date; + } else { + $baseDate = $user->date_last_sale; + } + } else { + $baseDate = $user->date_last_sale; + } + + if (empty($baseDate)) { + continue; + } + + $newSales = Sales::find() + ->where(['phone' => $user->phone, 'operation' => Sales::OPERATION_SALE]) + ->andWhere(['>', 'date', $baseDate]) + ->all(); + + if (empty($newSales)) { + continue; + } + + $newSalesSum = 0; + $newSalesCount = count($newSales); + $newDateLastSale = null; + $newCheckId = null; + $newCheckName = null; + + foreach ($newSales as $sale) { + $newSalesSum += floatval($sale->summ); + $saleTimestamp = strtotime($sale->date); + if ($newDateLastSale === null || $saleTimestamp > strtotime($newDateLastSale)) { + $newDateLastSale = $sale->date; + $newCheckId = $sale->id; + $newCheckName = $sale->number; + } + } + + $user->sale_price = $user->sale_price + $newSalesSum; + $user->sale_cnt = $user->sale_cnt + $newSalesCount; + $user->sale_avg_price = $user->sale_cnt > 0 + ? round($user->sale_price / $user->sale_cnt) + : 0; + $user->date_last_sale = $newDateLastSale; + $user->check_id_last_sale = $newCheckId; // обновляем идентификатор последнего обработанного чека + + if (!$user->save()) { + $this->stdout( + "Ошибка обновления данных пользователя (ID: {$user->id}): " . json_encode($user->getErrors()) . "\n", + BaseConsole::FG_RED + ); + } else { + $this->stdout( + "Обновлены статистические данные пользователя (ID: {$user->id}). Новых продаж: {$newSalesCount}, сумма: {$newSalesSum}\n", + BaseConsole::FG_GREEN + ); + } + + $newBonusLevel = null; + foreach ($bonusLevelsList as $level) { + if ($user->sale_price > $level['threshold']) { + $newBonusLevel = $level['alias']; + } + } + + if ($user->bonus_level !== $newBonusLevel) { + $oldBonusLevel = $user->bonus_level; + $user->bonus_level = $newBonusLevel; + if (!$user->save()) { + $this->stdout( + "Ошибка обновления бонусного уровня пользователя (ID: {$user->id}): " . json_encode($user->getErrors()) . "\n", + BaseConsole::FG_RED + ); + continue; + } + $this->stdout( + "Пользователю (ID: {$user->id}) изменён бонусный уровень с \"{$oldBonusLevel}\" на \"{$newBonusLevel}\".\n", + BaseConsole::FG_GREEN + ); + + $activeBonusRecord = UsersBonusLevels::find() + ->where(['active' => 1]) + ->andWhere(['or', ['phone' => $user->phone], ['user_id' => $user->id]]) + ->one(); + if ($activeBonusRecord) { + $activeBonusRecord->active = 0; + $activeBonusRecord->updated_at = date('Y-m-d H:i:s'); + if (!$activeBonusRecord->save()) { + $this->stdout( + "Ошибка деактивации старой записи бонусного уровня для пользователя (ID: {$user->id}).\n", + BaseConsole::FG_RED + ); + } + } + + $newBonusRecord = new UsersBonusLevels(); + $newBonusRecord->phone = $user->phone; + $newBonusRecord->user_id = $user->id; + $newBonusRecord->bonus_level = $newBonusLevel; + $newBonusRecord->created_at = date('Y-m-d H:i:s'); + $newBonusRecord->check_id = $newCheckId; + $newBonusRecord->check_name = $newCheckName; + $newBonusRecord->active = 1; + if (!$newBonusRecord->save()) { + $this->stdout( + "Ошибка создания новой записи бонусного уровня для пользователя (ID: {$user->id}): " . + json_encode($newBonusRecord->getErrors()) . "\n", + BaseConsole::FG_RED + ); + } else { + $this->stdout( + "Создана новая запись бонусного уровня для пользователя (ID: {$user->id}).\n", + BaseConsole::FG_GREEN + ); + } + } + } + + $this->stdout( + "Обновление бонусных уровней завершено.\n", + BaseConsole::FG_GREEN + ); + return ExitCode::OK; + } + + // Обновление уровня и заполнение таблицы users_bonus_levels + public function actionUpdateUsersLevels() + { + $users = Users::find()->all(); + + $bonusLevelsList = BonusLevels::find() + ->where(['active' => 1]) + ->orderBy(['threshold' => SORT_ASC]) + ->asArray() + ->all(); + + if (empty($bonusLevelsList)) { + $this->stdout( + "Нет активных бонус уровней для обработки.\n", + BaseConsole::FG_RED + ); + return ExitCode::UNAVAILABLE; + } + + foreach ($users as $user) { + $newBonusLevel = null; + foreach ($bonusLevelsList as $level) { + if ($user->sale_price > $level['threshold']) { + $newBonusLevel = $level['alias']; + } + } + + if ($user->bonus_level !== $newBonusLevel) { + $oldBonusLevel = $user->bonus_level; + $user->bonus_level = $newBonusLevel; + if (!$user->save()) { + $this->stdout( + "Ошибка обновления бонусного уровня пользователя (ID: {$user->id}): " . json_encode($user->getErrors()) . "\n", + BaseConsole::FG_RED + ); + continue; + } + $this->stdout( + "Пользователю (ID: {$user->id}) изменён бонусный уровень с \"{$oldBonusLevel}\" на \"{$newBonusLevel}\".\n", + BaseConsole::FG_GREEN + ); + + $activeBonusRecord = UsersBonusLevels::find() + ->where(['active' => 1]) + ->andWhere(['or', ['phone' => $user->phone], ['user_id' => $user->id]]) + ->one(); + if ($activeBonusRecord) { + $activeBonusRecord->active = 0; + $activeBonusRecord->updated_at = date('Y-m-d H:i:s'); + if (!$activeBonusRecord->save()) { + $this->stdout( + "Ошибка деактивации старой записи бонусного уровня для пользователя (ID: {$user->id}).\n", + BaseConsole::FG_RED + ); + } + } + + $newBonusRecord = new UsersBonusLevels(); + $newBonusRecord->phone = $user->phone; + $newBonusRecord->user_id = $user->id; + $newBonusRecord->bonus_level = $newBonusLevel; + $newBonusRecord->created_at = date('Y-m-d H:i:s'); + if ($user->check_id_last_sale) { + $newBonusRecord->check_id = $user->check_id_last_sale; + $sale = Sales::find()->where(['phone' => $user->phone]) + ->andWhere(['id' => $user->check_id_last_sale])->one(); + $check_name = $sale->number ?? null; + $newBonusRecord->check_name = $check_name; + } else { + $sale = Sales::find() + ->where(['phone' => $user->phone]) + ->andWhere( + new \yii\db\Expression("date::DATE = :date"), + [':date' => date('Y-m-d', strtotime($user->date_last_sale))] + ) + ->one(); + if (!empty($sale)) { + $newBonusRecord->check_id = $sale->id; + $newBonusRecord->check_name = $sale->number; + } + } + + + + $newBonusRecord->active = 1; + if (!$newBonusRecord->save()) { + $this->stdout( + "Ошибка создания новой записи бонусного уровня для пользователя (ID: {$user->id}): " . json_encode($newBonusRecord->getErrors()) . "\n", + BaseConsole::FG_RED + ); + } else { + $this->stdout( + "Создана новая запись бонусного уровня для пользователя (ID: {$user->id}).\n", + BaseConsole::FG_GREEN + ); + } + } + } + + $this->stdout( + "Обновление бонусных уровней завершено.\n", + BaseConsole::FG_GREEN + ); + return ExitCode::OK; + } } -- 2.39.5