From: fomichev Date: Fri, 13 Dec 2024 09:11:46 +0000 (+0300) Subject: Merge branch 'refs/heads/develop' into feature_fomichev_erp-263_kogort_download_page X-Git-Tag: 1.7~161^2~8 X-Git-Url: https://gitweb.erp-flowers.ru/?a=commitdiff_plain;h=1ee15d67e06b8a82b4ac820eabeaadb8dbdc2745;p=erp24_rep%2Fyii-erp24%2F.git Merge branch 'refs/heads/develop' into feature_fomichev_erp-263_kogort_download_page # Conflicts: # erp24/controllers/UsersMessageManagementController.php # erp24/views/users-message-management/index.php --- 1ee15d67e06b8a82b4ac820eabeaadb8dbdc2745 diff --cc erp24/controllers/UsersMessageManagementController.php index 5e614c76,913fa2fc..f27fa83f --- a/erp24/controllers/UsersMessageManagementController.php +++ b/erp24/controllers/UsersMessageManagementController.php @@@ -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 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() { + 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'); @@@ -65,223 -76,60 +112,278 @@@ } } + 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')); } } diff --cc erp24/views/users-message-management/index.php index 6d9825cc,b25ba5d8..2cfa7b9d --- a/erp24/views/users-message-management/index.php +++ b/erp24/views/users-message-management/index.php @@@ -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; + } + '); + ?>
diff --cc erp24/web/js/users-message-management/index.js index 9551156c,2f71e881..ea886ceb --- a/erp24/web/js/users-message-management/index.js +++ b/erp24/web/js/users-message-management/index.js @@@ -23,41 -23,20 +23,55 @@@ function setReadonly(id, checked) } } + function addCharCounter(sel, maxNumber) { + $( "
10 / " + maxNumber + "
" ).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); +});