]> gitweb.erp-flowers.ru Git - erp24_rep/yii-erp24/.git/commitdiff
Методы крона
authorfomichev <vladimir.fomichev@erp-flowers.ru>
Wed, 5 Feb 2025 07:02:11 +0000 (10:02 +0300)
committerfomichev <vladimir.fomichev@erp-flowers.ru>
Wed, 5 Feb 2025 07:02:11 +0000 (10:02 +0300)
erp24/commands/CronController.php

index 707ad91a64ed042c9854cf0078c268bf38f37edd..d3524d77ddeb5b778a38c3979ea35e0fed370858 100644 (file)
@@ -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;
+    }
 }