From: fomichev Date: Mon, 23 Dec 2024 15:24:29 +0000 (+0300) Subject: Правки генерации эксель X-Git-Tag: 1.7~94^2~52 X-Git-Url: https://gitweb.erp-flowers.ru/?a=commitdiff_plain;h=bde4d981cccb09f9ba59b6e9aacfd4a343f6214d;p=erp24_rep%2Fyii-erp24%2F.git Правки генерации эксель --- diff --git a/erp24/controllers/UsersMessageManagementController.php b/erp24/controllers/UsersMessageManagementController.php index 4f36ea1e..2db02053 100644 --- a/erp24/controllers/UsersMessageManagementController.php +++ b/erp24/controllers/UsersMessageManagementController.php @@ -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, diff --git a/erp24/views/users-message-management/_data_table.php b/erp24/views/users-message-management/_data_table.php index db4c4aac..a69c04fe 100644 --- a/erp24/views/users-message-management/_data_table.php +++ b/erp24/views/users-message-management/_data_table.php @@ -25,37 +25,43 @@ use yii\helpers\Url; + Таргет-.xlsx Посмотреть - + + + Whatsapp-.xlsx Посмотреть - + + + Звонок-.xlsx Посмотреть - + +