namespace app\controllers;
+use PhpOffice\PhpSpreadsheet\Cell\Coordinate;
+use PhpOffice\PhpSpreadsheet\Spreadsheet;
+use PhpOffice\PhpSpreadsheet\Writer\Xlsx;
use Yii;
use yii\base\DynamicModel;
- use yii\data\ArrayDataProvider;
+ use yii\data\ActiveDataProvider;
+ use yii\db\Exception;
+ use yii\helpers\ArrayHelper;
+ use yii\helpers\Json;
use yii\web\Controller;
+use yii_app\records\Sales;
+use yii_app\records\Users;
+use yii_app\records\UsersEvents;
use yii_app\records\UsersMessageManagement;
+ use yii_app\records\UsersMessageManagementLogs;
class UsersMessageManagementController extends Controller
{
- public function actionIndex() {
+ public static function saveLogs($old, $new) {
+ $cnt = 0;
+ foreach (array_keys($old) as $oldKey) {
+ if ($new[$oldKey] != $old[$oldKey]) {
+ $cnt++;
+ }
+ }
+ foreach (array_keys($old) as $oldKey) {
+ if ($cnt >1 && $new[$oldKey] != $old[$oldKey]) {
+ $log = new UsersMessageManagementLogs;
+ $log->field_name = $oldKey;
+ $log->value_old = '' . $old[$oldKey];
+ $log->value_new = '' . $new[$oldKey];
+ $log->created_at = date('Y-m-d H:i:s');
+ $log->created_by = Yii::$app->user->id;
+ $log->save();
+ if ($log->getErrors()) {
+ throw new Exception(Json::encode($log->getErrors()));
+ }
+ }
+ }
+ }
+
+ public function actionIndex()
+ {
+ $request = Yii::$app->request;
$model = UsersMessageManagement::find()->one();
+ $month = date('m');
+ $year = date('Y');
+
+ $startDate = date('Y-m-d', strtotime("$year-$month-01"));
+ $endDate = date('Y-m-t', strtotime($startDate));
+
+ $dates = [];
+ $currentDate = strtotime($startDate);
+
+ while ($currentDate <= strtotime($endDate)) {
+ $formattedDate = date('Y-m-d', $currentDate);
+ $dates[$formattedDate] = [
+ 'target' => [
+ $this->generateLink($formattedDate, 'target', 'generate-excel'),
+ $this->generateLink($formattedDate, 'target', 'view-kogort-users')
+ ],
+ 'whatsapp' => [
+ $this->generateLink($formattedDate, 'whatsapp', 'generate-excel'),
+ $this->generateLink($formattedDate, 'whatsapp', 'view-kogort-users')
+ ],
+ 'call' => [
+ $this->generateLink($formattedDate, 'call', 'generate-excel'),
+ $this->generateLink($formattedDate, 'call', 'view-kogort-users')
+ ],
+ ];
+ $currentDate = strtotime('+1 day', $currentDate);
+ }
+
if (!$model) {
- $model = new UsersMessageManagement;
+ $model = new UsersMessageManagement();
+ $model->hold_active = 1;
+ $model->day_before_step1_active = 1;
+ $model->day_before_step2_active = 1;
+ $model->day_before_step3_active = 1;
+ $model->date_start = date('Y-m-d H:i:s');
+ $model->date_last_scenario = $model->date_start;
}
+ $oldAttributes = $model->getAttributes();
+
+ $tab = 1;
if (Yii::$app->request->isPost && $model->load(Yii::$app->request->post())) {
if (!$model->created_at) {
$model->created_at = date('Y-m-d H:i:s');
}
}
+ return $this->render('index', compact('model', 'tab'));
+ }
+
+ return $this->render('index', [
+ 'model' => $model,
+ 'links' => $dates,
+ 'month' => $month,
+ 'year' => $year,
+
+ ]);
+ }
+
+
+ public function actionExportKogort()
+ {
+ $request = Yii::$app->request;
+
+ $month = $request->get('month', date('m'));
+ $year = $request->get('year', date('Y'));
+
+ $startDate = date('Y-m-d', strtotime("$year-$month-01"));
+ $endDate = date('Y-m-t', strtotime($startDate)); // Последний день месяца
+
+ $dates = [];
+ $currentDate = strtotime($startDate);
+
+ while ($currentDate <= strtotime($endDate)) {
+ $formattedDate = date('Y-m-d', $currentDate);
+ $dates[$formattedDate] = [
+ 'target' => [
+ $this->generateLink($formattedDate, 'target', 'generate-excel'),
+ $this->generateLink($formattedDate, 'target', 'view-kogort-users')
+ ],
+ 'whatsapp' => [
+ $this->generateLink($formattedDate, 'whatsapp', 'generate-excel'),
+ $this->generateLink($formattedDate, 'whatsapp', 'view-kogort-users')
+ ],
+ 'call' => [
+ $this->generateLink($formattedDate, 'call', 'generate-excel'),
+ $this->generateLink($formattedDate, 'call', 'view-kogort-users')
+ ],
+ ];
+ $currentDate = strtotime('+1 day', $currentDate);
+ }
+
+ if ($request->isAjax) {
+ return $this->renderPartial('_data_table', [
+ 'links' => $dates,
+ ]);
+ }
+
+ return $this->render('export-kogort', [
+ 'links' => $dates,
+ 'month' => $month,
+ 'year' => $year,
+ ]);
+ }
+
+ public function actionGenerateExcel($date, $type)
+ {
+ try {
+ $users = Users::getUsersListForKogort($date);
+ if (empty($users)) {
+ Yii::$app->session->setFlash('error', 'Нет данных для экспорта.');
+ return $this->redirect(Yii::$app->request->referrer);
+ }
+
+ $data = [];
+ foreach ($users as $user) {
+ $userPhone = $user['phone'];
+
+ $memorableDateCount = UsersEvents::find()->where(['phone' => $userPhone])->count();
+ $memorableDateExists = UsersEvents::find()
+ ->where(['phone' => $userPhone, 'date' => $date])
+ ->exists() ? 1 : 0;
+
+ $lastSale = Sales::find()
+ ->where(['phone' => $userPhone])
+ ->orderBy(['date' => SORT_DESC])
+ ->one();
+ $lastDate = $lastSale ? $lastSale->date : null;
+ $dealsCount = Sales::find()->where(['phone' => $userPhone])->count();
+ $totalSum = Sales::find()->where(['phone' => $userPhone])->sum('summ') ?? 0;
+
+ $userData = [
+ 'phone' => $userPhone,
+ ];
+
+ if ($type === 'call') {
+ $userData['name'] = $user['name'];
+ $userData['memorable_date_count'] = $memorableDateCount;
+ $userData['memorable_date'] = $memorableDateExists;
+ $userData['last_date'] = $lastDate;
+ $userData['deals_count'] = $dealsCount;
+ $userData['total_sum'] = $totalSum;
+ }
+
+ $data[] = $userData;
+ }
+
+ $columns = ['phone'];
+ if ($type === 'call') {
+ $columns = array_merge($columns, [
+ 'last_date',
+ 'deals_count',
+ 'total_sum',
+ 'memorable_date_count',
+ 'memorable_date',
+ 'name',
+ ]);
+ }
+
+ $spreadsheet = new Spreadsheet();
+ $sheet = $spreadsheet->getActiveSheet();
+ $sheet->setTitle('Users');
+
+ foreach ($columns as $index => $column) {
+ $cell = Coordinate::stringFromColumnIndex($index + 1) . '1';
+ $sheet->setCellValue($cell, $column);
+ }
+
+ foreach ($data as $rowIndex => $userData) {
+ foreach ($columns as $columnIndex => $column) {
+ $cell = Coordinate::stringFromColumnIndex($columnIndex + 1) . ($rowIndex + 2);
+ $sheet->setCellValue($cell, $userData[$column] ?? '');
+ }
+ }
+
+ $filename = "users-{$type}-{$date}.xlsx";
+ $response = Yii::$app->response;
+ $response->format = \yii\web\Response::FORMAT_RAW;
+ $response->headers->set('Content-Type', 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet');
+ $response->headers->set('Content-Disposition', "attachment; filename=\"{$filename}\"");
+ $response->headers->set('Cache-Control', 'max-age=0');
+ $response->headers->add('Pragma', 'public');
+
+ ob_clean();
+ $writer = new Xlsx($spreadsheet);
+ $writer->save('php://output');
+ die;
+
+ } catch (\Exception $e) {
+ Yii::error("Excel generation error: " . $e->getMessage());
+ Yii::$app->session->setFlash('error', 'Произошла ошибка при генерации Excel файла.');
+ return $this->redirect(Yii::$app->request->referrer);
+ } finally {
+ if (isset($spreadsheet)) {
+ $spreadsheet->disconnectWorksheets();
+ unset($spreadsheet);
+ }
+ }
+ }
+
+ public function actionViewKogortUsers($date, $type)
+ {
+ $users = Users::getUsersListForKogort($date);
+ $data = [];
+
+ foreach ($users as $user) {
+ $userPhone = $user['phone'];
+
+ $memorableDateCount = UsersEvents::find()
+ ->where(['phone' => $userPhone])
+ ->count();
+
+ $memorableDateExists = UsersEvents::find()
+ ->where(['phone' => $userPhone, 'date' => $date])
+ ->exists() ? 1 : 0;
+
+ $lastSale = Sales::find()
+ ->where(['phone' => $userPhone])
+ ->orderBy(['date' => SORT_DESC])
+ ->one();
+
+ $lastDate = $lastSale ? $lastSale->date : 'нет данных';
+ $dealsCount = Sales::find()
+ ->where(['phone' => $userPhone])
+ ->count();
+ $totalSum = Sales::find()
+ ->where(['phone' => $userPhone])
+ ->sum('summ') ?? 0;
+
+
+ $userData = [
+ 'phone' => $userPhone,
+ ];
+
+ if ($type === 'call') {
+ $userData['last_date'] = $lastDate;
+ $userData['deals_count'] = $dealsCount;
+ $userData['total_sum'] = $totalSum;
+ $userData['memorable_date_count'] = $memorableDateCount;
+ $userData['memorable_date'] = $memorableDateExists;
+ $userData['name'] = $user['name'];
+ }
+
+ $data[] = $userData;
+ }
+
+ $dataProvider = new ArrayDataProvider([
+ 'allModels' => $data,
+ 'pagination' => [
+ 'pageSize' => 200,
+ ],
+ ]);
+
+ return $this->render('view-kogort', [
+ 'dataProvider' => $dataProvider,
+ 'date' => $date,
+ 'type' => $type,
+ ]);
+ }
+
+ protected function generateLink($date, $type, $view)
+ {
+ $url = 'users-message-management/' . $view;
+ return Yii::$app->urlManager->createUrl([
+ $url,
+ 'date' => $date,
+ 'type' => $type,
+ ]);
+ public function actionLogs() {
+
+ $model = DynamicModel::validateData([
+ 'date_from' => date('Y-m-d H:i:s', strtotime('-1 week', time())),
+ 'date_to' => date('Y-m-d 23:59:59'),
+ 'field_name' => null,
+ 'value' => null,
+ 'created_by' => null,
+ ], [
+ [['date_from', 'date_to', 'field_name', 'value', 'created_by'], 'safe']
+ ]);
+
+ $model->load(Yii::$app->request->get());
+
+ $query = UsersMessageManagementLogs::find()
+ ->where(['BETWEEN', 'created_at', $model->date_from, $model->date_to]);
+ if ($model->field_name) {
+ $query->andWhere(['field_name' => $model->field_name]);
+ }
+ if (!empty($model->value)) {
+ $query->andWhere([
+ 'or',
+ ['like', 'value_old', '%' . $model->value . '%', false],
+ ['like', 'value_new', '%' . $model->value . '%', false],
+ ]);
+ }
+ if (!empty($model->created_by)) {
+ $query->andWhere(['created_by' => $model->created_by]);
+ }
+
+ $query->orderBy(['created_at' => SORT_DESC]);
+
+ $dataProvider = new ActiveDataProvider(['query' => $query]);
+
+ $fieldNames = array_merge([null => '__Любые__'], (new UsersMessageManagement)->attributeLabels());
+
+ $adminArr = [];
+ $adminArrOther = [];
+ foreach (\yii_app\records\Admin::find()->with('adminGroup')->all() as $admin) {
+ if ($admin->group_id > 0) {
+ $tmp = ['id' => $admin->id, 'name' => $admin->name, 'groupName' => $admin->adminGroup->name ?? "Другие"];
+ if ($tmp['groupName'] == 'Другие') {
+ $adminArrOther[] = $tmp;
+ } else {
+ $adminArr[] = $tmp;
+ }
+ }
+ }
+ $adminArr = ArrayHelper::merge([['id' => null, 'name' => '__Любой__', 'groupName' => '__Любой__']], $adminArr, $adminArrOther);
+ $admins = ArrayHelper::map($adminArr, 'id', 'name', 'groupName');
+
+ return $this->render('logs', compact('model', 'fieldNames', 'dataProvider', 'admins'));
}
}