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;
$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);
}
$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,
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);
}
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,