]> gitweb.erp-flowers.ru Git - erp24_rep/yii-erp24/.git/commitdiff
Правки таблицы и расчета когорт
authorfomichev <vladimir.fomichev@erp-flowers.ru>
Sat, 28 Dec 2024 11:02:15 +0000 (14:02 +0300)
committerfomichev <vladimir.fomichev@erp-flowers.ru>
Sat, 28 Dec 2024 11:02:15 +0000 (14:02 +0300)
erp24/commands/CronController.php
erp24/migrations/m241220_131428_create_sent_kogort_table.php
erp24/records/SentKogort.php
erp24/records/Users.php

index f063c0119048a91ca9774f32f11c48c3e310e951..b3a95f1dcb1bd617174f85eff566b24a7deb5a2a 100644 (file)
@@ -201,25 +201,55 @@ class CronController extends Controller
         }
 
         $time = $this->time ? (int)$this->time : time();
-        $stepsBack = $this->stepsBack ?? 0;
+
         $currentYear = date('Y', $time);
         $currentMonth = date('m', $time);
         $currentDay = date('j', $time);
         $currentDate = sprintf('%04d-%02d-%02d', $currentYear, $currentMonth, $currentDay);
 
         $step1 = $messagesSettings ? $messagesSettings->day_before_step1 : 10;
+        $stepsBack = $this->stepsBack ?? $step1;
 
-        for ($i = $stepsBack; $i >= 0; $i--) {
-            $dateToProcess = date('Y-m-d', strtotime("-$i days", strtotime($currentDate)));
-            $startDate = date('Y-m-d', strtotime("+$step1 days", strtotime($dateToProcess)));
+        // Генерация для прошлых дат (от текущей даты на $step1 дней назад)
+        for ($i = $stepsBack; $i > 0; $i--) {
+            $kogortDate = date('Y-m-d', strtotime("-$i days", strtotime($currentDate))); // Дата когорты
+            $targetDate = date('Y-m-d', strtotime("+$step1 days", strtotime($kogortDate))); // Целевая дата
 
-            $kogortPhones = Users::formKogortByDateAndType($startDate, 'target');
+            $kogortPhones = Users::formKogortByDateAndType($targetDate, 'target');
 
             if (!empty($kogortPhones)) {
-                Users::saveKogort($kogortPhones, $startDate, SentKogort::KOGORT_NUMBERS['target']);
-                $this->stdout("Ð\9aогоÑ\80Ñ\82а Ð´Ð»Ñ\8f Ð´Ð°Ñ\82Ñ\8b {$startDate} успешно сохранена.\n", BaseConsole::FG_GREEN);
+                Users::saveKogort($kogortPhones, $kogortDate, $targetDate, SentKogort::KOGORT_NUMBERS['target']);
+                $this->stdout("Ð\9aогоÑ\80Ñ\82а Ð½Ð° {$kogortDate} Ð´Ð»Ñ\8f Ñ\86елевой Ð´Ð°Ñ\82Ñ\8b {$targetDate} успешно сохранена.\n", BaseConsole::FG_GREEN);
             } else {
-                $this->stdout("Нет данных для формирования когорты на дату {$startDate}.\n", BaseConsole::FG_RED);
+                $this->stdout("Нет данных для формирования когорты для целевой даты {$targetDate}.\n", BaseConsole::FG_RED);
+            }
+        }
+
+        // Генерация для текущей даты
+        $kogortDate = $currentDate;
+        $targetDate = date('Y-m-d', strtotime("+$step1 days", strtotime($kogortDate)));
+
+        $kogortPhones = Users::formKogortByDateAndType($targetDate, 'target');
+
+        if (!empty($kogortPhones)) {
+            Users::saveKogort($kogortPhones, $kogortDate, $targetDate, SentKogort::KOGORT_NUMBERS['target']);
+            $this->stdout("Когорта на {$kogortDate} для целевой даты {$targetDate} успешно сохранена.\n", BaseConsole::FG_GREEN);
+        } else {
+            $this->stdout("Нет данных для формирования когорты для целевой даты {$targetDate}.\n", BaseConsole::FG_RED);
+        }
+
+        // Генерация для будущих дат (от текущей даты на $step1 дней вперёд)
+        for ($i = 1; $i <= $step1; $i++) {
+            $kogortDate = date('Y-m-d', strtotime("+$i days", strtotime($currentDate))); // Дата когорты
+            $targetDate = date('Y-m-d', strtotime("+$step1 days", strtotime($kogortDate))); // Целевая дата
+
+            $kogortPhones = Users::formKogortByDateAndType($targetDate, 'target');
+
+            if (!empty($kogortPhones)) {
+                Users::saveKogort($kogortPhones, $kogortDate, $targetDate, SentKogort::KOGORT_NUMBERS['target'], true);
+                $this->stdout("Когорта на {$kogortDate} для целевой даты {$targetDate} успешно сохранена.\n", BaseConsole::FG_GREEN);
+            } else {
+                $this->stdout("Нет данных для формирования когорты для целевой даты {$targetDate}.\n", BaseConsole::FG_RED);
             }
         }
 
@@ -252,25 +282,40 @@ class CronController extends Controller
         $step2 = $messagesSettings ? $messagesSettings->day_before_step2 : 4;
 
         for ($i = $stepsBack; $i >= 0; $i--) {
-            $dateToProcess = date('Y-m-d', strtotime("-$i days", strtotime($currentDate)));
-            $startDate = date('Y-m-d', strtotime("+$step2 days", strtotime($dateToProcess)));
+            $kogortDate = date('Y-m-d', strtotime("-$i days", strtotime($currentDate)));
+            $targetDate = date('Y-m-d', strtotime("+$step2 days", strtotime($kogortDate)));
 
-            $kogortPhones = Users::formKogortByDateAndType($startDate, 'whatsapp');
+            $kogortPhones = Users::formKogortByDateAndType($targetDate, 'whatsapp');
 
             if (!empty($kogortPhones)) {
-                Users::saveKogort($kogortPhones, $startDate, SentKogort::KOGORT_NUMBERS['whatsapp']);
+                Users::saveKogort($kogortPhones, $kogortDate, $targetDate, SentKogort::KOGORT_NUMBERS['whatsapp']);
                 $this->stdout(
-                    "Когорта для Вотсапа на дату {$startDate} успешно создана.\n",
+                    "Когорта для Вотсапа на {$kogortDate} для целевой даты {$targetDate} успешно создана.\n",
                     BaseConsole::FG_GREEN
                 );
             } else {
                 $this->stdout(
-                    "Нет данных для формирования когорты для Ватсапа на дату {$startDate}.\n",
+                    "Нет данных для формирования когорты для Ватсапа на {$kogortDate} для целевой даты {$targetDate}.\n",
                     BaseConsole::FG_RED
                 );
             }
         }
 
+        // Генерация для будущих дат (от текущей даты на $step2 дней вперёд)
+        for ($i = 1; $i <= $step2; $i++) {
+            $kogortDate = date('Y-m-d', strtotime("+$i days", strtotime($currentDate))); // Дата когорты
+            $targetDate = date('Y-m-d', strtotime("+$step2 days", strtotime($kogortDate))); // Целевая дата
+
+            $kogortPhones = Users::formKogortByDateAndType($targetDate, 'target');
+
+            if (!empty($kogortPhones)) {
+                Users::saveKogort($kogortPhones, $kogortDate, $targetDate, SentKogort::KOGORT_NUMBERS['whatsapp'], true);
+                $this->stdout("Когорта на {$kogortDate} для целевой даты {$targetDate} успешно сохранена.\n", BaseConsole::FG_GREEN);
+            } else {
+                $this->stdout("Нет данных для формирования когорты для целевой даты {$targetDate}.\n", BaseConsole::FG_RED);
+            }
+        }
+
         return ExitCode::OK;
     }
 
@@ -292,24 +337,40 @@ class CronController extends Controller
         $step3 = $messagesSettings ? $messagesSettings->day_before_step3 : 2;
 
         for ($i = $stepsBack; $i >= 0; $i--) {
-            $dateToProcess = date('Y-m-d', strtotime("-$i days", strtotime($currentDate)));
-            $startDate = date('Y-m-d', strtotime("+$step3 days", strtotime($dateToProcess)));
+            $kogortDate = date('Y-m-d', strtotime("-$i days", strtotime($currentDate)));
+            $targetDate = date('Y-m-d', strtotime("+$step3 days", strtotime($kogortDate)));
 
-            $kogortPhones = Users::formKogortByDateAndType($startDate, 'call');
+            $kogortPhones = Users::formKogortByDateAndType($targetDate, 'call');
 
             if (!empty($kogortPhones)) {
-                Users::saveKogort($kogortPhones, $startDate, SentKogort::KOGORT_NUMBERS['call']);
+                Users::saveKogort($kogortPhones, $kogortDate, $targetDate, SentKogort::KOGORT_NUMBERS['call']);
                 $this->stdout(
-                    "Ð\9aогоÑ\80Ñ\82а Ð´Ð»Ñ\8f Ð\97вонка Ð½Ð° Ð´Ð°Ð½Ð½Ñ\83Ñ\8e Ð´Ð°Ñ\82Ñ\83 {$startDate} Ñ\83Ñ\81пеÑ\88но Ñ\81оздана.\n",
+                    "Ð\9aогоÑ\80Ñ\82а Ð·Ð²Ð¾Ð½ÐºÐ° Ð½Ð° {$kogortDate} Ð´Ð»Ñ\8f Ñ\86елевой Ð´Ð°Ñ\82Ñ\8b {$targetDate} Ñ\83Ñ\81пеÑ\88но Ñ\81оÑ\85Ñ\80анена.\n",
                     BaseConsole::FG_GREEN
                 );
             } else {
                 $this->stdout(
-                    "Ð\9dеÑ\82 Ð´Ð°Ð½Ð½Ñ\8bÑ\85 Ð´Ð»Ñ\8f Ñ\84оÑ\80миÑ\80ованиÑ\8f ÐºÐ¾Ð³Ð¾Ñ\80Ñ\82Ñ\8b Ð´Ð»Ñ\8f Ð\92аÑ\82Ñ\81апа Ð½Ð° Ð´Ð°Ñ\82Ñ\83 {$startDate}.\n",
+                    "Ð\9dеÑ\82 Ð´Ð°Ð½Ð½Ñ\8bÑ\85 Ð´Ð»Ñ\8f Ñ\84оÑ\80миÑ\80ованиÑ\8f ÐºÐ¾Ð³Ð¾Ñ\80Ñ\82Ñ\8b Ð´Ð»Ñ\8f Ð·Ð²Ð¾Ð½ÐºÐ° Ð½Ð° Ð´Ð°Ñ\82Ñ\83 {$targetDate}.\n",
                     BaseConsole::FG_RED
                 );
             }
         }
+
+        // Генерация для будущих дат (от текущей даты на $step2 дней вперёд)
+        for ($i = 1; $i <= $step3; $i++) {
+            $kogortDate = date('Y-m-d', strtotime("+$i days", strtotime($currentDate))); // Дата когорты
+            $targetDate = date('Y-m-d', strtotime("+$step3 days", strtotime($kogortDate))); // Целевая дата
+
+            $kogortPhones = Users::formKogortByDateAndType($targetDate, 'target');
+
+            if (!empty($kogortPhones)) {
+                Users::saveKogort($kogortPhones, $kogortDate, $targetDate, SentKogort::KOGORT_NUMBERS['call'], true);
+                $this->stdout("Когорта на {$kogortDate} для целевой даты {$targetDate} успешно сохранена.\n", BaseConsole::FG_GREEN);
+            } else {
+                $this->stdout("Нет данных для формирования когорты для целевой даты {$targetDate}.\n", BaseConsole::FG_RED);
+            }
+        }
+
         return ExitCode::OK;
     }
 
index 1c9a872f73a2d732eb8f2597dd9d8829f6309ef2..a3d8969f55f92222dfd536ecbd45a32a9c75ba6c 100644 (file)
@@ -21,6 +21,7 @@ class m241220_131428_create_sent_kogort_table extends Migration
                 'phone' => $this->string(15)->notNull()->comment('Телефон пользователя'),
                 'kogort_number' => $this->integer()->notNull()->comment('Номер типа когорты когорты'),
                 'kogort_date' => $this->date()->notNull()->comment('Дата когорты'),
+                'target_date' => $this->date()->notNull()->comment('Целевая дата'),
                 'kogort_unixtime' => $this->integer()->notNull()->comment('UNIX-время когорты'),
                 'status' => $this->tinyInteger(1)->notNull()->defaultValue(1)->comment('Вхождение в когорту'),
                 'contact' => $this->tinyInteger(1)->notNull()->defaultValue(0)->comment('Контакт с клиентом'),
index bd74e55fa6cd45835159b860747b2f3b2a23d544..0acd9f37533f027d6468b40ba7df5e070c575177 100644 (file)
@@ -10,6 +10,7 @@ use Yii;
  * @property int $id
  * @property string $phone Телефон пользователя
  * @property string $kogort_date Дата когорты
+ * @property string $target_date Целевая дата
  * @property int $kogort_unixtime UNIX-время когорты
  * @property int $kogort_number Номер типа когорты когорты
  * @property int $status Вхождение в когорту
@@ -38,8 +39,8 @@ class SentKogort extends \yii\db\ActiveRecord
     public function rules()
     {
         return [
-            [['phone', 'kogort_date', 'kogort_unixtime', 'kogort_number', 'created_at'], 'required'],
-            [['kogort_date', 'created_at'], 'safe'],
+            [['phone', 'kogort_date', 'target_date', 'kogort_unixtime', 'kogort_number', 'created_at'], 'required'],
+            [['kogort_date', 'target_date', 'created_at'], 'safe'],
             [['kogort_unixtime', 'status', 'contact', 'purchase'], 'default', 'value' => null],
             [['kogort_unixtime', 'status', 'contact', 'purchase', 'kogort_number'], 'integer'],
             [['phone'], 'string', 'max' => 15],
@@ -55,6 +56,7 @@ class SentKogort extends \yii\db\ActiveRecord
             'id' => 'ID',
             'phone' => 'Телефон пользователя',
             'kogort_date' => 'Дата когорты',
+            'target_date' => 'Целевая дата',
             'kogort_number' => 'Номер типа когорты когорты',
             'kogort_unixtime' => 'UNIX-время когорты',
             'status' => 'Вхождение в когорту',
index c460ce80e663b6a78676bcf0c048610505726733..1ae3f13b8eb796a2f903f3641b21516d292967e5 100755 (executable)
@@ -486,6 +486,14 @@ class Users extends \yii\db\ActiveRecord
         $filteredUsers = array_diff($usersArray, $phonesSent);
         $kogortData = array_values($filteredUsers);
 
+        if (isset($messagesSettings->test_phones_active) &&
+            $messagesSettings->test_phones_active == 0 &&
+            !empty($messagesSettings->test_phones_list))
+        {
+            $testPhones = array_map('trim', explode(',', $messagesSettings->test_phones_list));
+            $kogortData = array_merge($kogortData, $testPhones);
+        }
+
         if ($type === 'target') {
             return $kogortData;
         }
@@ -550,16 +558,16 @@ class Users extends \yii\db\ActiveRecord
         return array_diff($whatsappPhones, $excludeSalesPhone);
     }
 
-    public static function saveKogort(array $phones, string $startDate, int $kogort_number): array
+    public static function saveKogort(array $phones, string $kogortDate, string $targetDate, int $kogort_number, bool $delete = false): array
     {
         $data = [];
         $kogortPhones = SentKogort::find()
             ->select('phone')
-            ->where(['kogort_date' => $startDate, 'kogort_number' => $kogort_number])
+            ->where(['kogort_date' => $kogortDate, 'kogort_number' => $kogort_number])
             ->column();
 
-        if ($kogortPhones) {
-            SentKogort::deleteAll(['kogort_date' => $startDate, 'kogort_number' => $kogort_number]);
+        if ($kogortPhones && $delete) {
+            SentKogort::deleteAll(['kogort_date' => $kogortDate, 'kogort_number' => $kogort_number]);
             $kogortPhones =[];
         }
 
@@ -567,8 +575,9 @@ class Users extends \yii\db\ActiveRecord
             if ($phone && !in_array($phone, $kogortPhones)) {
                 $sentKogort = new SentKogort();
                 $sentKogort->phone = $phone;
-                $sentKogort->kogort_date = $startDate;
-                $sentKogort->kogort_unixtime = (int)strtotime($startDate . ' 00:00:00');
+                $sentKogort->kogort_date = $kogortDate;
+                $sentKogort->target_date = $targetDate;
+                $sentKogort->kogort_unixtime = (int)strtotime($kogortDate . ' 00:00:00');
                 $sentKogort->status = 1;
                 $sentKogort->kogort_number = $kogort_number;
                 $sentKogort->save(false);