]> gitweb.erp-flowers.ru Git - erp24_rep/yii-erp24/.git/commitdiff
Merge branch 'refs/heads/develop' into feature_fomichev_erp-263_kogort_download_page
authorfomichev <vladimir.fomichev@erp-flowers.ru>
Fri, 13 Dec 2024 09:11:46 +0000 (12:11 +0300)
committerfomichev <vladimir.fomichev@erp-flowers.ru>
Fri, 13 Dec 2024 09:11:46 +0000 (12:11 +0300)
# Conflicts:
# erp24/controllers/UsersMessageManagementController.php
# erp24/views/users-message-management/index.php

1  2 
erp24/controllers/UsersMessageManagementController.php
erp24/records/UsersMessageManagement.php
erp24/views/users-message-management/index.php
erp24/web/js/users-message-management/index.js

index 5e614c76860121d547a377adaa51d66ca133eb02,913fa2fc014057ee22dbd9d66d26d601f6b9b7fb..f27fa83f7de13af0c1b071ddb576ba5a91f51fae
@@@ -2,57 -2,57 +2,93 @@@
  
  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'));
      }
  }
index 6d9825cc32ca355ed8c56672733c609593e03cef,b25ba5d83621b4c2530eb5131d17d9db0768b922..2cfa7b9d91aae71c6018647e8dc4f4474f3a1d3c
@@@ -8,13 -9,17 +9,21 @@@ use yii_app\records\Admin
  use yii_app\records\UsersMessageManagement;
  
  /* @var $model UsersMessageManagement */
+ /* @var $tab integer */
  
 +/** @var array $links */
 +/** @var string $month */
 +/** @var string $year */
 +
+ $this->registerJs('var tab = ' . \yii\helpers\Json::encode(['tab' => $tab]), \yii\web\View::POS_END);
  $this->registerJsFile('/js/users-message-management/index.js', ['position' => \yii\web\View::POS_END]);
  
+ $this->registerCss('
+ .nav-link.active {
+     border-bottom: 2px solid purple;
+ }
+ ');
  ?>
  
  <div class="usersMessageManagementIndex m-5">
index 9551156cc31f7cac99eaf57fdea2aefd59df0a63,2f71e881bdfccbd9281c8e06ed164349f5ef09d1..ea886cebcccfb3f62ffd19b87d60e23aa594d149
@@@ -23,41 -23,20 +23,55 @@@ function setReadonly(id, checked) 
      }
  }
  
+ function addCharCounter(sel, maxNumber) {
+     $( "<div style='float: right; color: #aaa'><span data-id='" + sel + "Counter'>10</span> / " + maxNumber + "</div>" ).insertAfter( sel );
+     function cut(value) {
+         let count = value.split('\n').join('').length;
+         $('[data-id="' + sel + 'Counter"]').text(count);
+     }
+     $(sel).on('input', (e) => { cut(e.target.value); });
+     cut($(sel).text());
+ }
  $(document).ready(() => {
-     showTab('mainTab');
+     showTab(tab.tab === 1 ? 'mainTab' : 'messageTab');
+     addCharCounter("#usersmessagemanagement-offer_1", 10000);
+     addCharCounter("#usersmessagemanagement-offer_2", 10000);
+     addCharCounter("#usersmessagemanagement-offer_text", 900);
+     addCharCounter("#usersmessagemanagement-offer_whatsapp", 900);
  })
 +
 +document.addEventListener('DOMContentLoaded', function () {
 +    const monthSelect = document.getElementById('month-select');
 +    const yearSelect = document.getElementById('year-select');
 +
 +    function handleFormChange() {
 +        const month = monthSelect.value;
 +        const year = yearSelect.value;
 +
 +        if (!month || !year) {
 +            return;
 +        }
 +
 +        const params = new URLSearchParams({ month, year });
 +        const url = '/users-message-management/export-kogort?' + params.toString();
 +
 +        fetch(url, {
 +            method: 'GET',
 +            headers: {
 +                'X-Requested-With': 'XMLHttpRequest' // Указываем, что это AJAX-запрос
 +            },
 +        })
 +            .then(response => response.text())
 +            .then(html => {
 +                // Обновляем таблицу с данными
 +                document.querySelector('#data-table').innerHTML = html;
 +            })
 +            .catch(error => {
 +                console.error('Ошибка:', error);
 +            });
 +    }
 +
 +    monthSelect.addEventListener('change', handleFormChange);
 +    yearSelect.addEventListener('change', handleFormChange);
 +});