From fb4bee32eb8bc4e5f8d7bcc2a6206eb6250c68e4 Mon Sep 17 00:00:00 2001 From: fomichev Date: Sat, 28 Dec 2024 14:02:15 +0300 Subject: [PATCH] =?utf8?q?=D0=9F=D1=80=D0=B0=D0=B2=D0=BA=D0=B8=20=D1=82?= =?utf8?q?=D0=B0=D0=B1=D0=BB=D0=B8=D1=86=D1=8B=20=D0=B8=20=D1=80=D0=B0?= =?utf8?q?=D1=81=D1=87=D0=B5=D1=82=D0=B0=20=D0=BA=D0=BE=D0=B3=D0=BE=D1=80?= =?utf8?q?=D1=82?= MIME-Version: 1.0 Content-Type: text/plain; charset=utf8 Content-Transfer-Encoding: 8bit --- erp24/commands/CronController.php | 101 ++++++++++++++---- ...241220_131428_create_sent_kogort_table.php | 1 + erp24/records/SentKogort.php | 6 +- erp24/records/Users.php | 21 ++-- 4 files changed, 101 insertions(+), 28 deletions(-) diff --git a/erp24/commands/CronController.php b/erp24/commands/CronController.php index f063c011..b3a95f1d 100644 --- a/erp24/commands/CronController.php +++ b/erp24/commands/CronController.php @@ -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("Когорта для даты {$startDate} успешно сохранена.\n", BaseConsole::FG_GREEN); + Users::saveKogort($kogortPhones, $kogortDate, $targetDate, SentKogort::KOGORT_NUMBERS['target']); + $this->stdout("Когорта на {$kogortDate} для целевой даты {$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( - "Когорта для Звонка на данную дату {$startDate} успешно создана.\n", + "Когорта звонка на {$kogortDate} для целевой даты {$targetDate} успешно сохранена.\n", BaseConsole::FG_GREEN ); } else { $this->stdout( - "Нет данных для формирования когорты для Ватсапа на дату {$startDate}.\n", + "Нет данных для формирования когорты для звонка на дату {$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; } diff --git a/erp24/migrations/m241220_131428_create_sent_kogort_table.php b/erp24/migrations/m241220_131428_create_sent_kogort_table.php index 1c9a872f..a3d8969f 100644 --- a/erp24/migrations/m241220_131428_create_sent_kogort_table.php +++ b/erp24/migrations/m241220_131428_create_sent_kogort_table.php @@ -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('Контакт с клиентом'), diff --git a/erp24/records/SentKogort.php b/erp24/records/SentKogort.php index bd74e55f..0acd9f37 100644 --- a/erp24/records/SentKogort.php +++ b/erp24/records/SentKogort.php @@ -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' => 'Вхождение в когорту', diff --git a/erp24/records/Users.php b/erp24/records/Users.php index c460ce80..1ae3f13b 100755 --- a/erp24/records/Users.php +++ b/erp24/records/Users.php @@ -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); -- 2.39.5