From: fomichev Date: Sat, 28 Dec 2024 11:02:15 +0000 (+0300) Subject: Правки таблицы и расчета когорт X-Git-Tag: 1.7~94^2~9 X-Git-Url: https://gitweb.erp-flowers.ru/?a=commitdiff_plain;h=fb4bee32eb8bc4e5f8d7bcc2a6206eb6250c68e4;p=erp24_rep%2Fyii-erp24%2F.git Правки таблицы и расчета когорт --- 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);