]> gitweb.erp-flowers.ru Git - erp24_rep/yii-erp24/.git/commitdiff
Правки генерации эксель
authorfomichev <vladimir.fomichev@erp-flowers.ru>
Mon, 23 Dec 2024 15:24:29 +0000 (18:24 +0300)
committerfomichev <vladimir.fomichev@erp-flowers.ru>
Mon, 23 Dec 2024 15:24:29 +0000 (18:24 +0300)
erp24/controllers/UsersMessageManagementController.php
erp24/views/users-message-management/_data_table.php

index 4f36ea1e7819e7c9a057c95d31802de89d1f45c8..2db02053462619e64cc255060ea39c34d5d82fe0 100644 (file)
@@ -14,6 +14,7 @@ use yii\helpers\ArrayHelper;
 use yii\helpers\Json;
 use yii\web\Controller;
 use yii_app\records\Sales;
+use yii_app\records\SentKogort;
 use yii_app\records\Users;
 use yii_app\records\UsersEvents;
 use yii_app\records\UsersMessageManagement;
@@ -60,23 +61,25 @@ class UsersMessageManagementController extends Controller
         $types = array_keys(Users::KOGORT_TYPES);
         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'),
-                   // count(Users::getUsersListForKogort($formattedDate))
-                ],
-                'whatsapp' => [
-                    $this->generateLink($formattedDate, 'whatsapp', 'generate-excel'),
-                    $this->generateLink($formattedDate, 'whatsapp', 'view-kogort-users'),
-                   // count(Users::getUsersListForKogort($formattedDate, 'whatsapp'))
-                ],
-                'call' => [
-                    $this->generateLink($formattedDate, 'call', 'generate-excel'),
-                    $this->generateLink($formattedDate, 'call', 'view-kogort-users'),
-                   // count(Users::getUsersListForKogort($formattedDate, 'call'))
-                ],
-            ];
+            $dateData = [];
+
+            foreach (SentKogort::KOGORT_NUMBERS as $type => $kogortNumber) {
+                $count = SentKogort::find()
+                    ->where(['kogort_date' => $formattedDate, 'kogort_number' => $kogortNumber])
+                    ->count();
+
+                if ($count > 0) {
+                    $dateData[$type] = [
+                        $this->generateLink($formattedDate, $type, 'generate-excel'),
+                        $this->generateLink($formattedDate, $type, 'view-kogort-users'),
+                        $count,
+                    ];
+                }
+            }
+
+            if (!empty($dateData)) {
+                $dates[$formattedDate] = $dateData;
+            }
             $currentDate = strtotime('+1 day', $currentDate);
         }
 
@@ -154,26 +157,29 @@ class UsersMessageManagementController extends Controller
         $types = array_keys(Users::KOGORT_TYPES);
         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'),
-                   // count(Users::getUsersListForKogort($formattedDate))
-                ],
-                'whatsapp' => [
-                    $this->generateLink($formattedDate, 'whatsapp', 'generate-excel'),
-                    $this->generateLink($formattedDate, 'whatsapp', 'view-kogort-users'),
-                   // count(Users::getUsersListForKogort($formattedDate, 'whatsapp'))
-                ],
-                'call' => [
-                    $this->generateLink($formattedDate, 'call', 'generate-excel'),
-                    $this->generateLink($formattedDate, 'call', 'view-kogort-users'),
-                   // count(Users::getUsersListForKogort($formattedDate, 'call'))
-                ],
-            ];
+            $dateData = [];
+
+            foreach (SentKogort::KOGORT_NUMBERS as $type => $kogortNumber) {
+                $count = SentKogort::find()
+                    ->where(['kogort_date' => $formattedDate, 'kogort_number' => $kogortNumber])
+                    ->count();
+
+                if ($count > 0) {
+                    $dateData[$type] = [
+                        $this->generateLink($formattedDate, $type, 'generate-excel'),
+                        $this->generateLink($formattedDate, $type, 'view-kogort-users'),
+                        $count,
+                    ];
+                }
+            }
+
+            if (!empty($dateData)) {
+                $dates[$formattedDate] = $dateData;
+            }
             $currentDate = strtotime('+1 day', $currentDate);
         }
 
+
         if ($request->isAjax) {
             return $this->renderPartial('_data_table', [
                 'links' => $dates,
@@ -189,61 +195,71 @@ class UsersMessageManagementController extends Controller
 
     public function actionGenerateExcel($date, $type)
     {
+        $spreadsheet = null;
+
         try {
-            $data = Users::getUsersListForKogort($date, $type);
+            if (!in_array($type, array_keys(SentKogort::KOGORT_NUMBERS))) {
+                throw new \InvalidArgumentException('Invalid type');
+            }
+
+            $dataKogort = SentKogort::find()
+                ->where(['kogort_date' => $date, 'kogort_number' => SentKogort::KOGORT_NUMBERS[$type]])
+                ->select(['phone'])
+                ->column();
+
+            $data = Users::prepareDataForExport($dataKogort, $date, $type);
+
             if (empty($data)) {
                 Yii::$app->session->setFlash('error', 'Нет данных для экспорта.');
                 return $this->redirect(Yii::$app->request->referrer);
             }
 
-            $columns = ['phone'];
-            if ($type === 'call') {
-                $columns = array_merge($columns, [
-                    'last_date',
-                    'deals_count',
-                    'total_sum',
-                    '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);
+            $headers = ($type === 'call')
+                ? ['Телефон', 'Последняя дата', 'Количество сделок', 'Общая сумма', 'Памятная дата', 'Имя']
+                : ['Телефон'];
+
+            $keys = ($type === 'call')
+                ? ['phone', 'last_date', 'deals_count', 'total_sum', 'memorable_date', 'name']
+                : ['phone'];
+
+            foreach ($headers as $index => $header) {
+                $sheet->setCellValue(Coordinate::stringFromColumnIndex($index + 1) . '1', $header);
             }
 
-            foreach ($data as $rowIndex => $userData) {
-                foreach ($columns as $columnIndex => $column) {
-                    $cell = Coordinate::stringFromColumnIndex($columnIndex + 1) . ($rowIndex + 2);
-                    $sheet->setCellValue($cell, $userData[$column] ?? '');
+            foreach ($data as $rowIndex => $row) {
+                foreach ($keys as $colIndex => $key) {
+                    $value = $row[$key] ?? '';
+                    if (in_array($key, ['last_date', 'memorable_date']) && $value) {
+                        $value = date('Y-m-d', strtotime($value));
+                    }
+                    $sheet->setCellValue(
+                        Coordinate::stringFromColumnIndex($colIndex + 1) . ($rowIndex + 2),
+                        $value
+                    );
                 }
             }
 
-            $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();
+            $tempFile = tempnam(sys_get_temp_dir(), 'excel_');
             $writer = new Xlsx($spreadsheet);
-            $writer->save('php://output');
-            die;
+            $writer->save($tempFile);
+
+            return Yii::$app->response->sendFile(
+                $tempFile,
+                "users-{$type}-{$date}.xlsx",
+                ['mimeType' => 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet']
+            )->on(\yii\web\Response::EVENT_AFTER_SEND, function() use ($tempFile) {
+                unlink($tempFile);
+            });
+
         } 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)) {
+            if ($spreadsheet) {
                 $spreadsheet->disconnectWorksheets();
                 unset($spreadsheet);
             }
@@ -252,7 +268,13 @@ class UsersMessageManagementController extends Controller
 
     public function actionViewKogortUsers($date, $type)
     {
-        $data = Users::getUsersListForKogort($date, $type);
+       // $data = Users::getUsersListForKogort($date, $type);
+        $dataKogort = SentKogort::find()
+            ->where(['kogort_date' => $date, 'kogort_number' => SentKogort::KOGORT_NUMBERS[$type]])
+            ->select(['phone'])
+            ->column();
+
+        $data = Users::prepareDataForExport($dataKogort, $date, $type);
 
         $dataProvider = new ArrayDataProvider([
             'allModels' => $data,
index db4c4aac51bb9c53fab49b7574ba0365d3da6d01..a69c04febdd9244ed3298d0004475a97a26b6d9a 100644 (file)
@@ -25,37 +25,43 @@ use yii\helpers\Url;
         <tr>
             <td><?= Html::encode($date) ?></td>
             <td>
+                <?php if (isset($columns['target'])) : ?>
                 <a href="<?= Url::to($columns['target'][0]) ?>" class="btn btn-link" target="_blank" download="users-target-<?= $date ?>.xlsx">
                     Таргет-<?= $date ?>.xlsx
                 </a>
                 <a href="<?= Url::to($columns['target'][1]) ?>" target="_blank" class="btn btn-link">
                     Посмотреть
                 </a>
-               <!-- <span class="count-placeholder"
-                      data-date="<?php /*= $date */?>"
-                      data-type="target">Загрузка...</span>-->
+               <span class="count-placeholder"
+                      data-date="<?= $columns['target'][2] ?>"
+                      data-type="target"><?= $columns['target'][2] ?></span>
+                <?php endif; ?>
             </td>
             <td>
+                <?php if (isset($columns['whatsapp'])) : ?>
                 <a href="<?= Url::to($columns['whatsapp'][0]) ?>" class="btn btn-link" target="_blank" download="users-whatsapp-<?= $date ?>.xlsx">
                     Whatsapp-<?= $date ?>.xlsx
                 </a>
                 <a href="<?= Url::to($columns['whatsapp'][1]) ?>" target="_blank" class="btn btn-link">
                     Посмотреть
                 </a>
-               <!-- <span class="count-placeholder"
-                      data-date="<?php /*= $date */?>"
-                      data-type="whatsapp">Загрузка...</span>-->
+                <span class="count-placeholder"
+                      data-date="<?= $columns['whatsapp'][2] ?>"
+                      data-type="whatsapp"><?= $columns['whatsapp'][2] ?></span>
+                <?php endif; ?>
             </td>
             <td>
+                <?php if (isset($columns['call'])) : ?>
                 <a href="<?= Url::to($columns['call'][0]) ?>" class="btn btn-link" target="_blank" download="users-call-<?= $date ?>.xlsx">
                     Звонок-<?= $date ?>.xlsx
                 </a>
                 <a href="<?= Url::to($columns['call'][1]) ?>" target="_blank" class="btn btn-link">
                     Посмотреть
                 </a>
-               <!-- <span class="count-placeholder"
-                      data-date="<?php /*= $date */?>"
-                      data-type="call">Загрузка...</span>-->
+                <span class="count-placeholder"
+                      data-date="<?= $columns['call'][2] ?>"
+                      data-type="call"><?= $columns['call'][2] ?></span>
+                <?php endif; ?>
             </td>
         </tr>
     <?php endforeach; ?>