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;
]);
$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;
+ }
}