mirror of
https://github.com/janickiy/yii2-nomer
synced 2025-03-09 15:39:59 +00:00
add files to project
This commit is contained in:
commit
5cac498444
3729 changed files with 836998 additions and 0 deletions
47
modules/admin/views/accounts/telegram.php
Normal file
47
modules/admin/views/accounts/telegram.php
Normal file
|
@ -0,0 +1,47 @@
|
|||
<?php
|
||||
|
||||
/* @var $this \yii\web\View */
|
||||
/* @var $model \app\models\Telegram */
|
||||
/* @var $dataProvider \yii\data\ActiveDataProvider */
|
||||
|
||||
use yii\grid\GridView;
|
||||
use yii\helpers\Html;
|
||||
use yii\helpers\Url;
|
||||
use yii\widgets\ActiveForm;
|
||||
use app\models\Telegram;
|
||||
|
||||
$this->title = 'Telegram';
|
||||
|
||||
?>
|
||||
|
||||
<?php $form = ActiveForm::begin(); ?>
|
||||
<?= $form->field($model, 'host')->textInput() ?>
|
||||
<?= $form->field($model, 'port')->textInput() ?>
|
||||
<?= Html::submitButton('Добавить', ['class' => 'btn btn-success']) ?>
|
||||
|
||||
<?php ActiveForm::end(); ?>
|
||||
|
||||
<hr>
|
||||
|
||||
<?= GridView::widget([
|
||||
'dataProvider' => $dataProvider,
|
||||
'columns' => [
|
||||
'id',
|
||||
'host',
|
||||
'port',
|
||||
[
|
||||
'attribute' => 'status',
|
||||
'value' => function (Telegram $model) {
|
||||
return Telegram::getStatusName($model->status);
|
||||
}
|
||||
],
|
||||
'tm_last',
|
||||
[
|
||||
'format' => 'raw',
|
||||
'header' => 'Действия',
|
||||
'value' => function(Telegram $model) {
|
||||
return '<a href="' . Url::to(['accounts/delete-telegram', 'id' => $model->id]) . '" onclick="return confirm(\'Удалить инстанс?\')"><i class="icon-trash"></i></a>';
|
||||
}
|
||||
]
|
||||
]
|
||||
]) ?>
|
34
modules/admin/views/apple/index.php
Normal file
34
modules/admin/views/apple/index.php
Normal file
|
@ -0,0 +1,34 @@
|
|||
<?php
|
||||
/* @var $this \yii\web\View */
|
||||
/* @var $subs array */
|
||||
/* @var $subId int */
|
||||
/* @var $tm_start string */
|
||||
/* @var $tm_end string */
|
||||
|
||||
use yii\helpers\Html;
|
||||
|
||||
/* @var $dataProvider \yii\data\ActiveDataProvider */
|
||||
|
||||
$this->title = "Отчет apple";
|
||||
?>
|
||||
|
||||
|
||||
<?=Html::beginForm('', 'get'); ?>
|
||||
<?=Html::dropDownList("sub_id", $subId, $subs, ["prompt" => "Выберите подписку"]);?>
|
||||
|
||||
с <?=\yii\jui\DatePicker::widget(["name" => "tm_start", "class" => "form-control input-small", "value" => $tm_start, "dateFormat" => "y-MM-dd"]); ?>
|
||||
по <?=\yii\jui\DatePicker::widget(["name" => "tm_end", "class" => "form-control input-small", "value" => $tm_end, "dateFormat" => "y-MM-dd"]); ?>
|
||||
<?=Html::submitButton("Показать", ["class" => "btn btn-primary"]); ?>
|
||||
<?=Html::endForm(); ?>
|
||||
|
||||
<?=\yii\grid\GridView::widget([
|
||||
"dataProvider" => $dataProvider,
|
||||
"columns" => [
|
||||
"event_date",
|
||||
"event",
|
||||
"subscription_name",
|
||||
"original_start_date",
|
||||
"cancellation_reason",
|
||||
"quantity"
|
||||
]
|
||||
]);?>
|
32
modules/admin/views/calls/index.php
Normal file
32
modules/admin/views/calls/index.php
Normal file
|
@ -0,0 +1,32 @@
|
|||
<?php
|
||||
|
||||
/* @var $this \yii\web\View */
|
||||
/* @var $dataProvider \yii\data\ActiveDataProvider */
|
||||
|
||||
use yii\grid\GridView;
|
||||
use yii\helpers\ArrayHelper;
|
||||
use app\models\Call;
|
||||
|
||||
echo GridView::widget([
|
||||
'dataProvider' => $dataProvider,
|
||||
'columns' => [
|
||||
'organization.number',
|
||||
'phone',
|
||||
// 'id',
|
||||
// 'tm',
|
||||
// 'cuid',
|
||||
'duration',
|
||||
// 'status',
|
||||
'organization.number',
|
||||
'organization.name',
|
||||
'organization.inn',
|
||||
'organization.maximum_sum',
|
||||
'organization.region',
|
||||
[
|
||||
'header' => 'Номера телефонов',
|
||||
'value' => function (Call $model) {
|
||||
return implode(', ', array_filter(ArrayHelper::getColumn($model->organization->phones, 'phone2')));
|
||||
}
|
||||
],
|
||||
]
|
||||
]);
|
47
modules/admin/views/checkouts/index.php
Normal file
47
modules/admin/views/checkouts/index.php
Normal file
|
@ -0,0 +1,47 @@
|
|||
<?php
|
||||
/**
|
||||
* Created by PhpStorm.
|
||||
* User: firedemon
|
||||
* Date: 8/3/17
|
||||
* Time: 7:00 PM
|
||||
*/
|
||||
|
||||
use app\models\User;
|
||||
use yii\grid\ActionColumn;
|
||||
use yii\grid\GridView;
|
||||
use yii\helpers\Html;
|
||||
|
||||
$this->title = 'Запросы на выплаты';
|
||||
|
||||
echo GridView::widget([
|
||||
'dataProvider' => $dataProvider,
|
||||
'columns' => [
|
||||
'id',
|
||||
'tm_create',
|
||||
'user_id',
|
||||
'sum',
|
||||
[
|
||||
'header' => 'Сумма',
|
||||
'content' => function($model) {
|
||||
return \Yii::$app->formatter->asCurrency($model->sum, "RUB");
|
||||
}
|
||||
],
|
||||
[
|
||||
'header' => 'Пользователь',
|
||||
'content' => function($model) {
|
||||
$user = User::find()->where(["id" => $model->user_id])->one();
|
||||
return Html::a($user->email, ["users/view", "id" => $user->id]);
|
||||
}
|
||||
],
|
||||
[
|
||||
'class' => ActionColumn::className(),
|
||||
'template' => '{done}',
|
||||
'buttons' => [
|
||||
'done' => function ($url, $model, $key) {
|
||||
return Html::a('Выплачено', ['done', 'id' => $model->id], ['class' => 'btn btn-primary']);
|
||||
}
|
||||
]
|
||||
],
|
||||
]
|
||||
]);
|
||||
|
430
modules/admin/views/dashboard/index.php
Normal file
430
modules/admin/views/dashboard/index.php
Normal file
|
@ -0,0 +1,430 @@
|
|||
<?php
|
||||
|
||||
/* @var $this \yii\web\View */
|
||||
/* @var $start string */
|
||||
/* @var $end string */
|
||||
/* @var $requestsStats array */
|
||||
/* @var $today array */
|
||||
/* @var $todayIos array */
|
||||
/* @var $yesterday array */
|
||||
/* @var $last30days array */
|
||||
/* @var $typesError array */
|
||||
/* @var $notifyTokens int */
|
||||
/* @var $notifyTokensWithoutSubs int */
|
||||
/* @var $avitoStats */
|
||||
/* @var $todaySubs */
|
||||
/* @var $yesterdaySubs */
|
||||
/* @var $last30daysSubs */
|
||||
/* @var $yesterdayIos */
|
||||
|
||||
use app\models\SearchRequest;
|
||||
use yii\db\Expression;
|
||||
use yii\db\Query;
|
||||
use yii\helpers\Url;
|
||||
use yii\jui\DatePicker;
|
||||
use yii\helpers\ArrayHelper;
|
||||
use yii\helpers\Json;
|
||||
use yii\helpers\Html;
|
||||
use yii\web\View;
|
||||
use app\models\Payment;
|
||||
|
||||
\app\modules\admin\assets\ChartsAsset::register($this);
|
||||
|
||||
$this->title = 'Dashboard';
|
||||
|
||||
$requestsDays = array_keys($requestsStats);
|
||||
|
||||
krsort($requestsDays);
|
||||
|
||||
$searchRequestsChart = [];
|
||||
foreach ($requestsDays as $day):
|
||||
$count = 0;
|
||||
if (isset($requestsStats[$day])):
|
||||
$count = $requestsStats[$day]['requests'];
|
||||
endif;
|
||||
$searchRequestsChart[] = [
|
||||
"date" => $day,
|
||||
"value" => $count
|
||||
];
|
||||
endforeach;
|
||||
|
||||
krsort($searchRequestsChart);
|
||||
$searchRequestsChart = array_values($searchRequestsChart);
|
||||
|
||||
$regsChart = [];
|
||||
foreach ($requestsDays as $day):
|
||||
$count = 0;
|
||||
if (isset($requestsStats[$day])):
|
||||
$count = $requestsStats[$day]['registrations'];
|
||||
endif;
|
||||
$regsChart[] = [
|
||||
"date" => $day,
|
||||
"value" => $count
|
||||
];
|
||||
endforeach;
|
||||
|
||||
krsort($regsChart);
|
||||
$regsChart = array_values($regsChart);
|
||||
|
||||
$appleChart = [];
|
||||
foreach ($requestsDays as $day):
|
||||
$count = 0;
|
||||
if (isset($requestsStats[$day])):
|
||||
$count = $requestsStats[$day]['applePayments'];
|
||||
endif;
|
||||
$appleChart[] = [
|
||||
"date" => $day,
|
||||
"value" => $count
|
||||
];
|
||||
endforeach;
|
||||
|
||||
krsort($appleChart);
|
||||
$appleChart = array_values($appleChart);
|
||||
|
||||
$siteTodayPayments = Payment::find()
|
||||
->select(["site_id", new Expression('SUM(amount) as amount')])
|
||||
->where([">=", "tm", date("Y-m-d 00:00:00")])
|
||||
->andWhere(["<>", "type_id", [Payment::TYPE_TESTAPPLE, Payment::TYPE_ANDROID, Payment::TYPE_APPLE]])
|
||||
->andWhere(["IS NOT", "site_id", null])
|
||||
->groupBy(["site_id"])
|
||||
->orderBy(["amount" => SORT_DESC])
|
||||
->asArray()
|
||||
->all();
|
||||
|
||||
$sitePayments = Payment::find()
|
||||
->select(["site_id", new Expression('SUM(amount) as amount')])
|
||||
->where([">=", "tm", date("Y-m-d 00:00:00", strtotime("-30 days"))])
|
||||
->andWhere(["<>", "type_id", [Payment::TYPE_TESTAPPLE, Payment::TYPE_ANDROID, Payment::TYPE_APPLE]])
|
||||
->andWhere(["IS NOT", "site_id", null])
|
||||
->groupBy(["site_id"])
|
||||
->orderBy(["amount" => SORT_DESC])
|
||||
->asArray()
|
||||
->all();
|
||||
|
||||
$sources = (new Query())
|
||||
->select(['source_id', new Expression('COUNT(1)')])
|
||||
->from('requests')
|
||||
->join('LEFT JOIN', 'users', 'requests.user_id = users.id')
|
||||
->where(['>=', 'tm', date("Y-m-d") . ' 00:00:00'])
|
||||
->andWhere(['or', ['users.is_admin' => false], ['users.is_admin' => null]])
|
||||
->groupBy('source_id')
|
||||
->orderBy('source_id')
|
||||
->all();
|
||||
|
||||
$sources = ArrayHelper::map($sources, "source_id", "count");
|
||||
|
||||
$sitesRequests = (new Query())
|
||||
->select(['site_id', 'is_payed', 'source_id', new Expression('COUNT(1) as c')])
|
||||
->from('requests')
|
||||
->leftJoin('users', 'requests.user_id = users.id')
|
||||
->where(['>=', 'tm', date("Y-m-d") . ' 00:00:00'])
|
||||
->andWhere(['or', ['users.is_admin' => false], ['users.is_admin' => null]])
|
||||
->groupBy(['site_id', 'is_payed', 'source_id'])
|
||||
->orderBy(['site_id' => SORT_ASC, 'is_payed' => SORT_ASC, 'source_id' => SORT_ASC])
|
||||
->all();
|
||||
|
||||
$sitesData = [];
|
||||
foreach($sitesRequests as $sr) {
|
||||
$is_payed = in_array($sr["is_payed"], [1, 2]);
|
||||
if(!isset($sitesData[$sr["site_id"]][$sr["source_id"]][$is_payed])) {
|
||||
$sitesData[$sr["site_id"]][$sr["source_id"]][$is_payed] = 0;
|
||||
}
|
||||
$sitesData[$sr["site_id"]][$sr["source_id"]][$is_payed] += $sr["c"];
|
||||
}
|
||||
|
||||
$sites = \app\models\Site::find()->indexBy("id")->asArray()->all();
|
||||
|
||||
$last30daysSum = ArrayHelper::getValue($last30days, "sum") + ArrayHelper::getValue($last30Android, "sum") + ArrayHelper::getValue($last30Ios, "sum");
|
||||
|
||||
$antiparkonStats = \Yii::$app->cache->get("antiparkon");
|
||||
?>
|
||||
|
||||
<?php if(!count($typesError)): ?>
|
||||
<div class="alert alert-success">Все поиски работают отлично</div>
|
||||
<?php else: ?>
|
||||
<div class="alert alert-danger">У нас проблемы с: <?=join(", ", $typesError);?></div>
|
||||
<?php endif; ?>
|
||||
|
||||
<?php if($avitoStats): ?>
|
||||
<div class="alert alert-<?=($avitoStats["api_limit"]["of"]-$avitoStats["api_limit"]["used"])>5000?"success":"danger";?>">Остаток поисков по Авито: <?=$avitoStats["api_limit"]["used"];?>/<?=$avitoStats["api_limit"]["of"];?>, оплачено до <?=\Yii::$app->formatter->asDatetime($avitoStats["api_time_limit"]);?></div>
|
||||
<?php endif; ?>
|
||||
|
||||
|
||||
<?php if($antiparkonStats): ?>
|
||||
<div class="alert alert-danger">Антипаркон: <?=$antiparkonStats;?></div>
|
||||
<?php endif; ?>
|
||||
|
||||
<h3>Финансы</h3>
|
||||
|
||||
<table class="table table-striped table-bordered">
|
||||
<tr>
|
||||
<th>Сегодня</th>
|
||||
<td>Вчера</td>
|
||||
<td>За последние 30 дней</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<th><?= Yii::$app->formatter->asCurrency(ArrayHelper::getValue($today, "sum") + ArrayHelper::getValue($todayIos, "sum"), 'RUB') ?>
|
||||
(Было
|
||||
<?=ArrayHelper::getValue($today, "bills")+ArrayHelper::getValue($todayIos, "bills");?>
|
||||
платежей от
|
||||
<?=ArrayHelper::getValue($today, "bills_users")+ArrayHelper::getValue($todayIos, "bills_users");?>
|
||||
пользователей, ребильных
|
||||
<?=ArrayHelper::getValue($today, "rebills")+ArrayHelper::getValue($todayIos, "rebills");?>
|
||||
платежей от
|
||||
<?=ArrayHelper::getValue($today, "rebills_users")+ArrayHelper::getValue($todayIos, "rebills_users");?> юзеров)</th>
|
||||
<th><?= Yii::$app->formatter->asCurrency(ArrayHelper::getValue($yesterday, "sum")+ArrayHelper::getValue($yesterdayIos, "sum"), 'RUB') ?>
|
||||
(Было
|
||||
<?=ArrayHelper::getValue($yesterday, "bills")+ArrayHelper::getValue($yesterdayIos, "bills");?>
|
||||
платежей от
|
||||
<?=ArrayHelper::getValue($yesterday, "bills_users")+ArrayHelper::getValue($yesterdayIos, "bills_users");?>
|
||||
пользователей, ребильных
|
||||
<?=ArrayHelper::getValue($yesterday, "rebills")+ArrayHelper::getValue($yesterdayIos, "rebills");?>
|
||||
платежей от
|
||||
<?=ArrayHelper::getValue($yesterday, "rebills_users")+ArrayHelper::getValue($yesterdayIos, "rebills_users");?>
|
||||
юзеров)</th>
|
||||
<th><?= Yii::$app->formatter->asCurrency($last30daysSum, 'RUB') ?>
|
||||
(Было
|
||||
<?=ArrayHelper::getValue($last30days, "bills");?>
|
||||
платежей от
|
||||
<?=ArrayHelper::getValue($last30days, "bills_users");?> пользователей, ребильных <?=ArrayHelper::getValue($last30days, "rebills");?> платежей от <?=ArrayHelper::getValue($last30days, "rebills_users");?> юзеров)</th>
|
||||
</tr>
|
||||
<tr>
|
||||
<th><?=\Yii::t('app', '{n,plural,=0{Подписок нет} =1{Одна подписка} one{# подписка} few{# подписки} many{# подписок} other{# подписки}}', ['n' => $todaySubs]);?></th>
|
||||
<th><?=\Yii::t('app', '{n,plural,=0{Подписок нет} =1{Одна подписка} one{# подписка} few{# подписки} many{# подписок} other{# подписки}}', ['n' => $yesterdaySubs]);?></th>
|
||||
<th><?=\Yii::t('app', '{n,plural,=0{Подписок нет} =1{Одна подписка} one{# подписка} few{# подписки} many{# подписок} other{# подписки}}', ['n' => $last30daysSubs]);?></th>
|
||||
</tr>
|
||||
</table>
|
||||
|
||||
<table class="table table-striped table-bordered">
|
||||
<tr>
|
||||
<td>Общая сумма в кошельках - <b><?=Yii::$app->formatter->asCurrency($yandexWalletsSum + $qiwiWalletsSum, "RUB");?></b> из них в Яндекс - <b><?=Yii::$app->formatter->asCurrency($yandexWalletsSum, "RUB");?></b> и в киви - <b><?=Yii::$app->formatter->asCurrency($qiwiWalletsSum, "RUB");?></b></td>
|
||||
</tr>
|
||||
</table>
|
||||
|
||||
<div class="row">
|
||||
<div class="col-md-6">
|
||||
<table class="table table-striped table-bordered">
|
||||
<tr>
|
||||
<th colspan="3">Кол-во поисков</th>
|
||||
</tr>
|
||||
<tr>
|
||||
<th>Сайт</th>
|
||||
<th>Web (платные)</th>
|
||||
<th>Mobile (платные)</th>
|
||||
</tr>
|
||||
<?php foreach ($sitesData as $siteID => $data): if(!$siteID) continue; ?>
|
||||
<tr>
|
||||
<?php $name = ArrayHelper::getValue(ArrayHelper::getValue($sites, $siteID), 'name'); ?>
|
||||
<?php $comment = ArrayHelper::getValue(ArrayHelper::getValue($sites, $siteID), 'comment'); ?>
|
||||
<td><?= $name ? $name : 'Не указано' ?> <?= $comment ? '(' . $comment . ')' : '' ?></td>
|
||||
<td><?= (ArrayHelper::getValue($data, [SearchRequest::SOURCE_WEB, 0], 0) + ArrayHelper::getValue($data, [SearchRequest::SOURCE_WEB, 1], 0)) ?> (<?= ArrayHelper::getValue($data, [SearchRequest::SOURCE_WEB, 1], 0) ?>)</td>
|
||||
<td><?= (ArrayHelper::getValue($data, [SearchRequest::SOURCE_MOBILE, 0], 0) + ArrayHelper::getValue($data, [SearchRequest::SOURCE_MOBILE, 1], 0)) ?> (<?= ArrayHelper::getValue($data, [SearchRequest::SOURCE_MOBILE, 1], 0) ?>)</td>
|
||||
</tr>
|
||||
<?php endforeach; ?>
|
||||
<tr>
|
||||
<th>Всего: </th>
|
||||
<td><?= ArrayHelper::getValue($sources, SearchRequest::SOURCE_WEB);?></td>
|
||||
<td><?= ArrayHelper::getValue($sources, SearchRequest::SOURCE_MOBILE);?></td>
|
||||
</tr>
|
||||
</table>
|
||||
</div>
|
||||
<div class="col-md-3">
|
||||
<table class="table table-bordered">
|
||||
<tr><th colspan="2">За сегодня</th></tr>
|
||||
<?php foreach ($siteTodayPayments as $item): ?>
|
||||
<tr>
|
||||
<?php $name = ArrayHelper::getValue(ArrayHelper::getValue($sites, $item['site_id']), 'name'); ?>
|
||||
<?php $comment = ArrayHelper::getValue(ArrayHelper::getValue($sites, $item['site_id']), 'comment'); ?>
|
||||
<td><?= $name ? $name : 'Не указано' ?> <?= $comment ? '(' . $comment . ')' : '' ?></td>
|
||||
<td><?= Yii::$app->formatter->asCurrency($item['amount'], 'RUB') ?></td>
|
||||
</tr>
|
||||
<?php endforeach; ?>
|
||||
<tr><td>Android</td><td><?=Yii::$app->formatter->asCurrency(ArrayHelper::getValue($todayAndroid, "sum", 0), 'RUB');?></td></tr>
|
||||
<tr><td>Apple</td><td><?=Yii::$app->formatter->asCurrency(ArrayHelper::getValue($todayIos, "sum", 0), 'RUB');?></td></tr>
|
||||
</table>
|
||||
</div>
|
||||
<div class="col-md-3">
|
||||
<table class="table table-bordered">
|
||||
<tr><th colspan="2">За 30 дней</th></tr>
|
||||
<?php foreach ($sitePayments as $item): ?>
|
||||
<tr>
|
||||
<?php $name = ArrayHelper::getValue(ArrayHelper::getValue($sites, $item['site_id']), 'name'); ?>
|
||||
<?php $comment = ArrayHelper::getValue(ArrayHelper::getValue($sites, $item['site_id']), 'comment'); ?>
|
||||
<td><?= $name ? $name : 'Не указано' ?> <?= $comment ? '(' . $comment . ')' : '' ?></td>
|
||||
<td><?= Yii::$app->formatter->asCurrency($item['amount'], 'RUB') ?></td>
|
||||
</tr>
|
||||
<?php endforeach; ?>
|
||||
<tr>
|
||||
<td>Android</td>
|
||||
<td><?=Yii::$app->formatter->asCurrency($last30Android['sum'], 'RUB');?></td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>Apple</td>
|
||||
<td><?=Yii::$app->formatter->asCurrency($last30Ios['sum'], 'RUB');?></td>
|
||||
</tr>
|
||||
</table>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="row">
|
||||
<div class="col-md-6">
|
||||
<table class="table table-striped table-bordered">
|
||||
<tr>
|
||||
<td>Пользователей для уведомлений</td>
|
||||
<td><?=$notifyTokens;?></td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>Пользователей для уведомлений без подписки</td>
|
||||
<td><?=$notifyTokensWithoutSubs;?></td>
|
||||
</tr>
|
||||
</table>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="portlet light bordered">
|
||||
<div class="portlet-title">
|
||||
<div class="caption">Фильтры</div>
|
||||
</div>
|
||||
<div class="portlet-body form">
|
||||
<?= Html::beginForm(['stats/index'], 'GET') ?>
|
||||
<div class="input-group input-medium">
|
||||
<span class="input-group-addon">С</span>
|
||||
<?= DatePicker::widget([
|
||||
'name' => 'tm_start',
|
||||
'value' => $start,
|
||||
'dateFormat' => 'yyyy-MM-dd',
|
||||
'options' => ['class' => 'form-control input-small']
|
||||
]) ?>
|
||||
<span class="input-group-addon">по</span>
|
||||
<?= DatePicker::widget([
|
||||
'name' => 'tm_end',
|
||||
'value' => $end,
|
||||
'language' => 'ru',
|
||||
'dateFormat' => 'yyyy-MM-dd',
|
||||
'options' => ['class' => 'form-control input-small']
|
||||
]) ?>
|
||||
<span class="input-group-addon"></span>
|
||||
<button type="submit" class="form-control btn btn-primary input-small">Показать</button>
|
||||
</div>
|
||||
|
||||
<?= Html::endForm() ?>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<table class="table table-striped table-bordered">
|
||||
<tr>
|
||||
<th>Дата</th>
|
||||
<?php foreach ($requestsDays as $day): ?>
|
||||
<td><?= $day ?></td>
|
||||
<?php endforeach; ?>
|
||||
</tr>
|
||||
<tr style="cursor: pointer;" onclick="renderSearchRequestsChart(); $(this).addClass('warning');">
|
||||
<th>Количество поисковых запросов</th>
|
||||
<?php foreach ($requestsDays as $day): ?>
|
||||
<td>
|
||||
<?php if (isset($requestsStats[$day])): ?>
|
||||
<?= $requestsStats[$day]['requests'] ?>
|
||||
<?php else: ?>
|
||||
-
|
||||
<?php endif; ?>
|
||||
</td>
|
||||
<?php endforeach; ?>
|
||||
</tr>
|
||||
<tr style="cursor: pointer;" onclick="renderRegsChart(); $(this).addClass('warning');">
|
||||
<th>Коичество регистраций</th>
|
||||
<?php foreach ($requestsDays as $day): ?>
|
||||
<td>
|
||||
<?php if (isset($requestsStats[$day])): ?>
|
||||
<?= $requestsStats[$day]['registrations'] ?>
|
||||
<?php else: ?>
|
||||
-
|
||||
<?php endif; ?>
|
||||
</td>
|
||||
<?php endforeach; ?>
|
||||
</tr>
|
||||
<tr style="cursor: pointer;" onclick="renderAppleChart(); $(this).addClass('warning');">
|
||||
<th>Кол-во покупок в Apple Store</th>
|
||||
<?php foreach ($requestsDays as $day): ?>
|
||||
<td>
|
||||
<?php if (isset($requestsStats[$day])): ?>
|
||||
<?= $requestsStats[$day]['applePayments'] ?>
|
||||
<?php else: ?>
|
||||
-
|
||||
<?php endif; ?>
|
||||
</td>
|
||||
<?php endforeach; ?>
|
||||
</tr>
|
||||
</table>
|
||||
|
||||
<div id="chartdiv" style="height: 400px;"></div>
|
||||
|
||||
<?php if(false): ?><script language="JavaScript"><?php endif; ?>
|
||||
<?php ob_start();?>
|
||||
function renderChart(data) {
|
||||
$('.warning').removeClass('warning');
|
||||
var chart = AmCharts.makeChart("chartdiv", {
|
||||
"type": "serial",
|
||||
"theme": "light",
|
||||
"marginRight": 40,
|
||||
"marginLeft": 40,
|
||||
"autoMarginOffset": 20,
|
||||
"mouseWheelZoomEnabled": false,
|
||||
"dataDateFormat": "YYYY-MM-DD",
|
||||
"valueAxes": [{
|
||||
"id": "v1",
|
||||
"axisAlpha": 0,
|
||||
"position": "left",
|
||||
"ignoreAxisWidth":true
|
||||
}],
|
||||
"balloon": {
|
||||
"borderThickness": 1,
|
||||
"shadowAlpha": 0
|
||||
},
|
||||
"graphs": [{
|
||||
"id": "g1",
|
||||
"balloon":{
|
||||
"drop":true,
|
||||
"adjustBorderColor":false,
|
||||
"color":"#ffffff"
|
||||
},
|
||||
"bullet": "round",
|
||||
"bulletBorderAlpha": 1,
|
||||
"bulletColor": "#FFFFFF",
|
||||
"bulletSize": 2,
|
||||
"hideBulletsCount": 50,
|
||||
"lineThickness": 1,
|
||||
"title": "red line",
|
||||
"useLineColorForBulletBorder": true,
|
||||
"valueField": "value",
|
||||
"balloonText": "<span style='font-size:14px;'>[[value]]</span>"
|
||||
}],
|
||||
"chartCursor": {
|
||||
"pan": true,
|
||||
"valueLineEnabled": true,
|
||||
"valueLineBalloonEnabled": true,
|
||||
"cursorAlpha":1,
|
||||
"cursorColor":"#258cbb",
|
||||
"limitToGraph":"g1",
|
||||
"valueLineAlpha":0.2,
|
||||
"valueZoomable":true
|
||||
},
|
||||
"categoryField": "date",
|
||||
"categoryAxis": {
|
||||
"parseDates": true,
|
||||
"dashLength": 1,
|
||||
"minorGridEnabled": true
|
||||
},
|
||||
"dataProvider": data
|
||||
|
||||
} );
|
||||
}
|
||||
function renderSearchRequestsChart() {
|
||||
renderChart(<?=Json::encode($searchRequestsChart);?>);
|
||||
}
|
||||
function renderRegsChart() {
|
||||
renderChart(<?=Json::encode($regsChart);?>);
|
||||
}
|
||||
function renderAppleChart() {
|
||||
renderChart(<?=Json::encode($appleChart);?>);
|
||||
}
|
||||
<?php $js = ob_get_contents(); ob_end_clean(); $this->registerJs($js, View::POS_END); ?>
|
319
modules/admin/views/history/index.php
Normal file
319
modules/admin/views/history/index.php
Normal file
|
@ -0,0 +1,319 @@
|
|||
<?php
|
||||
|
||||
/* @var $this \yii\web\View */
|
||||
/* @var $model \app\models\forms\AdminHistoryFilterForm */
|
||||
/* @var $dataProvider \yii\data\ActiveDataProvider */
|
||||
/* @var $queries array */
|
||||
/* @var $users array */
|
||||
/* @var $phones integer */
|
||||
/* @var $sources array */
|
||||
/* @var $sites array */
|
||||
/* @var $requests array */
|
||||
/* @var $sitesData array */
|
||||
/* @var $searches array */
|
||||
/* @var $payments array */
|
||||
|
||||
use app\models\Payment;
|
||||
use yii\grid\GridView;
|
||||
use yii\helpers\Json;
|
||||
use yii\helpers\Url;
|
||||
use yii\jui\DatePicker;
|
||||
use yii\helpers\ArrayHelper;
|
||||
use yii\helpers\Html;
|
||||
use yii\widgets\ActiveForm;
|
||||
use app\components\SearchHelper;
|
||||
use app\models\SearchRequest;
|
||||
use app\models\RequestResult;
|
||||
use app\models\ResultCache;
|
||||
|
||||
$this->title = 'История поиска';
|
||||
|
||||
$sources = ArrayHelper::map($sources, "source_id", "count");
|
||||
|
||||
$freeNothing = SearchRequest::find()
|
||||
->where(["is_payed" => 0, "is_has_name" => false, "is_has_photo" => false])
|
||||
->andWhere([">=", "tm", $model->from." 00:00:00"])
|
||||
->andWhere(["<=", "tm", $model->to." 23:59:59"])
|
||||
->andWhere(['or', ['users.is_admin' => false], ['users.is_admin' => null]])
|
||||
->joinWith(['user'])
|
||||
->count(1);
|
||||
$freeAll = SearchRequest::find()
|
||||
->where(["is_payed" => 0, "is_has_name" => true, "is_has_photo" => true])
|
||||
->andWhere([">=", "tm", $model->from." 00:00:00"])
|
||||
->andWhere(["<=", "tm", $model->to." 23:59:59"])
|
||||
->andWhere(['or', ['users.is_admin' => false], ['users.is_admin' => null]])
|
||||
->joinWith(['user'])
|
||||
->count(1);
|
||||
$freeOnlyName = SearchRequest::find()
|
||||
->where(["is_payed" => 0, "is_has_name" => true, "is_has_photo" => false])
|
||||
->andWhere([">=", "tm", $model->from." 00:00:00"])
|
||||
->andWhere(["<=", "tm", $model->to." 23:59:59"])
|
||||
->andWhere(['or', ['users.is_admin' => false], ['users.is_admin' => null]])
|
||||
->joinWith(['user'])
|
||||
->count(1);
|
||||
$payed = SearchRequest::find()
|
||||
->where(["is_payed" => 1])
|
||||
->andWhere([">=", "tm", $model->from." 00:00:00"])
|
||||
->andWhere(["<=", "tm", $model->to." 23:59:59"])
|
||||
->andWhere(['or', ['users.is_admin' => false], ['users.is_admin' => null]])
|
||||
->joinWith(['user'])
|
||||
->count(1);
|
||||
$payedNothing = SearchRequest::find()
|
||||
->where(["is_payed" => 2])
|
||||
->andWhere([">=", "tm", $model->from." 00:00:00"])
|
||||
->andWhere(["<=", "tm", $model->to." 23:59:59"])
|
||||
->andWhere(['or', ['users.is_admin' => false], ['users.is_admin' => null]])
|
||||
->joinWith(['user'])
|
||||
->count(1);
|
||||
$anonymous = SearchRequest::find()
|
||||
->where(["user_id" => null])
|
||||
->andWhere([">=", "tm", $model->from." 00:00:00"])
|
||||
->andWhere(["<=", "tm", $model->to." 23:59:59"])
|
||||
->count(1);
|
||||
$regged = SearchRequest::find()
|
||||
->where(["is_payed" => 0])
|
||||
->andWhere(["is not", "user_id", null])
|
||||
->andWhere([">=", "tm", $model->from." 00:00:00"])
|
||||
->andWhere(["<=", "tm", $model->to." 23:59:59"])
|
||||
->count(1);
|
||||
|
||||
$androidSearches = SearchRequest::find()
|
||||
->where(["source_id" => SearchRequest::SOURCE_ANDROID])
|
||||
->andWhere([">=", "tm", $model->from." 00:00:00"])
|
||||
->andWhere(["<=", "tm", $model->to." 23:59:59"])
|
||||
->count(1);
|
||||
|
||||
$androidSearchesPayed = SearchRequest::find()
|
||||
->where(["source_id" => SearchRequest::SOURCE_ANDROID])
|
||||
->andWhere(["is_payed" => 1])
|
||||
->andWhere([">=", "tm", $model->from." 00:00:00"])
|
||||
->andWhere(["<=", "tm", $model->to." 23:59:59"])
|
||||
->count(1);
|
||||
|
||||
$androidPayments = Payment::find()->where([">=", "tm", date("Y-m-d H:i:s", strtotime("-30 days"))])->andWhere(["type_id" => Payment::TYPE_ANDROID])->sum('amount');
|
||||
$androidSearches30days = SearchRequest::find()->where([">=", "tm", date("Y-m-d H:i:s", strtotime("-30 days"))])->andWhere(["source_id" => SearchRequest::SOURCE_ANDROID])->count(1);
|
||||
|
||||
$appleSearches = SearchRequest::find()
|
||||
->where(["source_id" => SearchRequest::SOURCE_IOS])
|
||||
->andWhere([">=", "tm", $model->from." 00:00:00"])
|
||||
->andWhere(["<=", "tm", $model->to." 23:59:59"])
|
||||
->count(1);
|
||||
|
||||
$appleSearchesPayed = SearchRequest::find()
|
||||
->where(["source_id" => SearchRequest::SOURCE_IOS])
|
||||
->andWhere(["is_payed" => 1])
|
||||
->andWhere([">=", "tm", $model->from." 00:00:00"])
|
||||
->andWhere(["<=", "tm", $model->to." 23:59:59"])
|
||||
->count(1);
|
||||
|
||||
$applePayments = Payment::find()->where([">=", "tm", date("Y-m-d H:i:s", strtotime("-30 days"))])->andWhere(["type_id" => Payment::TYPE_APPLE])->sum('amount');
|
||||
$appleSearches30days = SearchRequest::find()->where([">=", "tm", date("Y-m-d H:i:s", strtotime("-30 days"))])->andWhere(["source_id" => SearchRequest::SOURCE_IOS])->count(1);
|
||||
?>
|
||||
|
||||
<div class="portlet light bordered">
|
||||
<div class="portlet-title">
|
||||
<div class="caption">Фильтры</div>
|
||||
</div>
|
||||
<div class="portlet-body form">
|
||||
|
||||
<?php $form = ActiveForm::begin(['method' => 'GET', 'action' => '/admin/history']); ?>
|
||||
|
||||
<div class="input-group input-medium">
|
||||
<span class="input-group-addon">С</span>
|
||||
<?= $form->field($model, 'from', ['template' => '{input}', 'options' => ['class' => '']])->textInput()->widget(DatePicker::className(), [
|
||||
'language' => 'ru',
|
||||
'dateFormat' => 'yyyy-MM-dd',
|
||||
'options' => ['class' => 'form-control input-small']
|
||||
]) ?>
|
||||
<span class="input-group-addon">по</span>
|
||||
<?= $form->field($model, 'to', ['template' => '{input}', 'options' => ['class' => '']])->widget(DatePicker::className(), [
|
||||
'language' => 'ru',
|
||||
'dateFormat' => 'yyyy-MM-dd',
|
||||
'options' => ['class' => 'form-control input-small']
|
||||
]) ?>
|
||||
<?= $form->field($model, 'user', ['template' => '{input}', 'options' => ['class' => '']])->hiddenInput()->label(false) ?>
|
||||
<span class="input-group-addon"></span>
|
||||
<?= Html::submitButton('Показать', ['class' => 'form-control btn btn-primary input-small']) ?>
|
||||
</div>
|
||||
|
||||
<?php ActiveForm::end(); ?>
|
||||
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<hr>
|
||||
|
||||
<div class="row">
|
||||
<?php /*
|
||||
<div class="col-md-4">
|
||||
<table class="table table-striped table-bordered">
|
||||
<?php foreach ($queries as $query): ?>
|
||||
<tr>
|
||||
<th><?= $query['registred'] ? 'Зарегистрированные' : 'Анонимные' ?></th>
|
||||
<td><?= $query['count'] ?></td>
|
||||
</tr>
|
||||
<?php endforeach; ?>
|
||||
<?php if (count($users) > 0): ?>
|
||||
<tr>
|
||||
<th>Сконвертировавшиеся пользователи</th>
|
||||
<td><?= $users[0]['count'] ?></td>
|
||||
</tr>
|
||||
<?php endif; ?>
|
||||
<tr>
|
||||
<th>Количество уникальных номеров</th>
|
||||
<td><?= $phones ?></td>
|
||||
</tr>
|
||||
</table>
|
||||
</div>
|
||||
<div class="col-md-4">
|
||||
<table class="table table-striped table-bordered">
|
||||
<tr>
|
||||
<th><?=Html::a("бесплатные - анонимные", Url::current(["type" => 7]));?></th>
|
||||
<td><?=$anonymous;?></td>
|
||||
</tr>
|
||||
<tr>
|
||||
<th><?=Html::a("бесплатные - зареганные", Url::current(["type" => 8]));?></th>
|
||||
<td><?=$regged;?></td>
|
||||
</tr>
|
||||
<tr>
|
||||
<th><?=Html::a("бесплатные - ничего не найдено", Url::current(["type" => 1]));?></th>
|
||||
<td><?=$freeNothing;?></td>
|
||||
</tr>
|
||||
<tr>
|
||||
<th><?=Html::a("бесплатные - имя и фото", Url::current(["type" => 2]));?></th>
|
||||
<td><?=$freeAll;?></td>
|
||||
</tr>
|
||||
<tr>
|
||||
<th><?=Html::a("бесплатные - только имя", Url::current(["type" => 3]));?></th>
|
||||
<td><?=$freeOnlyName;?></td>
|
||||
</tr>
|
||||
<tr>
|
||||
<th><?=Html::a("платных запросов", Url::current(["type" => 4]));?></th>
|
||||
<td><?=($payedNothing + $payed);?></td>
|
||||
</tr>
|
||||
<tr>
|
||||
<th><?=Html::a("платные - ничего не найдено", Url::current(["type" => 5]));?></th>
|
||||
<td><?=$payedNothing;?></td>
|
||||
</tr>
|
||||
<tr>
|
||||
<th><?=Html::a("платные - найдено", Url::current(["type" => 6]));?></th>
|
||||
<td><?=$payed;?></td>
|
||||
</tr>
|
||||
</table>
|
||||
</div>
|
||||
*/ ?>
|
||||
<div class="col-md-12">
|
||||
<table class="table table-striped table-bordered">
|
||||
<tr>
|
||||
<th colspan="3">Кол-во поисков</th>
|
||||
</tr>
|
||||
<tr>
|
||||
<th>Сайт</th>
|
||||
<th>Web (платные)</th>
|
||||
<th>Mobile (платные)</th>
|
||||
<th>Поиски (за 30 дн)</th>
|
||||
<th>Платежи (за 30 дн)</th>
|
||||
</tr>
|
||||
<?php foreach ($sitesData as $siteID => $data): if(!$siteID) continue; ?>
|
||||
<tr>
|
||||
<th><?= Html::a($sites[$siteID]["name"], Url::current(["site_id" => $siteID])) ?> <?=$sites[$siteID]["comment"]?"(".$sites[$siteID]["comment"].")":"";?></th>
|
||||
<td><?= (ArrayHelper::getValue($data, [SearchRequest::SOURCE_WEB, 0], 0) + ArrayHelper::getValue($data, [SearchRequest::SOURCE_WEB, 1], 0)) ?> (<?= ArrayHelper::getValue($data, [SearchRequest::SOURCE_WEB, 1], 0) ?>)</td>
|
||||
<td><?= (ArrayHelper::getValue($data, [SearchRequest::SOURCE_MOBILE, 0], 0) + ArrayHelper::getValue($data, [SearchRequest::SOURCE_MOBILE, 1], 0)) ?> (<?= ArrayHelper::getValue($data, [SearchRequest::SOURCE_MOBILE, 1], 0) ?>)</td>
|
||||
<td><?=ArrayHelper::getValue($searches, [$siteID, "count"]);?></td>
|
||||
<td><?=\Yii::$app->formatter->asCurrency(ArrayHelper::getValue($payments, [$siteID, "sum"]), "RUB");?></td>
|
||||
</tr>
|
||||
<?php endforeach; ?>
|
||||
<tr>
|
||||
<th>Android</th>
|
||||
<td colspan="2"><?=$androidSearches;?> (<?=$androidSearchesPayed;?>)</td>
|
||||
<td><?=$androidSearches30days;?></td>
|
||||
<td><?=\Yii::$app->formatter->asCurrency($androidPayments, 'RUB');?></td>
|
||||
</tr>
|
||||
<tr>
|
||||
<th>Apple</th>
|
||||
<td colspan="2"><?=$appleSearches;?> (<?=$appleSearchesPayed;?>)</td>
|
||||
<td><?=$appleSearches30days;?></td>
|
||||
<td><?=\Yii::$app->formatter->asCurrency($applePayments, 'RUB');?></td>
|
||||
</tr>
|
||||
<tr>
|
||||
<th>Всего: </th>
|
||||
<td><?= $sources[SearchRequest::SOURCE_WEB];?></td>
|
||||
<td><?= $sources[SearchRequest::SOURCE_MOBILE];?></td>
|
||||
</tr>
|
||||
</table>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<?= GridView::widget([
|
||||
'dataProvider' => $dataProvider,
|
||||
'columns' => [
|
||||
'tm',
|
||||
[
|
||||
'format' => 'raw',
|
||||
'attribute' => 'phone',
|
||||
'value' => function(SearchRequest $model) {
|
||||
$phone = preg_replace('/^7/', '8', $model->phone);
|
||||
return '<a href="/' . $phone . '">' . $phone . '</a>';
|
||||
}
|
||||
],
|
||||
[
|
||||
'attribute' => 'user_id',
|
||||
'format' => 'raw',
|
||||
'value' => function(SearchRequest $model) {
|
||||
if (!$model->user) return 'Аноним';
|
||||
return Html::a(trim($model->user->email)?$model->user->email:$model->user->uuid, ['users/view', 'id' => $model->user_id]);
|
||||
}
|
||||
],
|
||||
[
|
||||
'attribute' => 'ip',
|
||||
'value' => function(SearchRequest $model) {
|
||||
return join(', ', [$model->ip, SearchHelper::City($model->ip)]);
|
||||
}
|
||||
],
|
||||
[
|
||||
'header' => 'Индекс поиска',
|
||||
'value' => function(SearchRequest $model) {
|
||||
if ($model->is_payed) {
|
||||
return array_sum(array_map(function(RequestResult $result) {
|
||||
return $result->index;
|
||||
}, $model->results));
|
||||
}
|
||||
|
||||
$finds = [];
|
||||
if ($model->is_has_name) $finds[] = 'Имя';
|
||||
if ($model->is_has_photo) $finds[] = 'Фото';
|
||||
|
||||
return $finds ? join(', ', $finds) : 'Ничего не найдено';
|
||||
}
|
||||
],
|
||||
[
|
||||
'header' => 'Стоимость',
|
||||
'value' => function(SearchRequest $model) {
|
||||
$type = '';
|
||||
|
||||
switch ($model->is_payed) {
|
||||
case 0: $type = 'Бесплатный (нет проверок)'; break;
|
||||
case 1: $type = 'Платный'; break;
|
||||
case 2: $type = 'Бесплатный (не нашли)'; break;
|
||||
}
|
||||
|
||||
if (!$model->user_id) $type .= ', Аноним';
|
||||
|
||||
return $type;
|
||||
}
|
||||
],
|
||||
[
|
||||
'attribute' => 'source_id',
|
||||
'value' => function(SearchRequest $model) {
|
||||
return SearchRequest::getSourceText($model->source_id);
|
||||
}
|
||||
],
|
||||
[
|
||||
'attribute' => 'site_id',
|
||||
'value' => function(SearchRequest $model) {
|
||||
if (!$model->site) return null;
|
||||
return $model->site->name;
|
||||
}
|
||||
]
|
||||
]
|
||||
]) ?>
|
257
modules/admin/views/layouts/main.php
Normal file
257
modules/admin/views/layouts/main.php
Normal file
|
@ -0,0 +1,257 @@
|
|||
<?php
|
||||
|
||||
/* @var $this \yii\web\View */
|
||||
|
||||
/* @var $content string */
|
||||
|
||||
use yii\helpers\Html;
|
||||
use yii\helpers\Url;
|
||||
use app\models\Telegram;
|
||||
use app\models\Token;
|
||||
use app\modules\admin\assets\ThemeAsset;
|
||||
|
||||
ThemeAsset::register($this);
|
||||
|
||||
$this->registerCss('.badge-menu { margin-left: 10px; }');
|
||||
|
||||
?>
|
||||
<?php $this->beginPage(); ?>
|
||||
<!DOCTYPE html>
|
||||
<!--[if IE 8]>
|
||||
<html lang="<?= Yii::$app->language ?>" class="ie8"> <![endif]-->
|
||||
<!--[if IE 9]>
|
||||
<html lang="<?= Yii::$app->language ?>" class="ie9"> <![endif]-->
|
||||
<!--[if !IE]><!-->
|
||||
<html lang="<?= Yii::$app->language ?>"> <!--<![endif]-->
|
||||
<head>
|
||||
<meta charset="<?= Yii::$app->charset ?>"/>
|
||||
<?= Html::csrfMetaTags() ?>
|
||||
<title><?= Yii::$app->name ?> admin - <?= Html::encode($this->title) ?></title>
|
||||
<meta http-equiv="X-UA-Compatible" content="IE=edge">
|
||||
<meta content="width=device-width, initial-scale=1" name="viewport"/>
|
||||
<meta content="nomer.io Admin" name="description"/>
|
||||
<meta content="nomer.io" name="author"/>
|
||||
|
||||
<link rel="shortcut icon" href="/favicon.ico"/>
|
||||
|
||||
<?php $this->head(); ?>
|
||||
</head>
|
||||
<body class="page-header-fixed page-sidebar-closed-hide-logo page-content-white">
|
||||
<?php $this->beginBody(); ?>
|
||||
<div class="page-wrapper">
|
||||
<!-- BEGIN HEADER -->
|
||||
<div class="page-header navbar navbar-fixed-top">
|
||||
<!-- BEGIN HEADER INNER -->
|
||||
<div class="page-header-inner ">
|
||||
<!-- BEGIN LOGO -->
|
||||
<div class="page-logo">
|
||||
<div class="menu-toggler sidebar-toggler">
|
||||
<span></span>
|
||||
</div>
|
||||
</div>
|
||||
<!-- END LOGO -->
|
||||
<!-- BEGIN RESPONSIVE MENU TOGGLER -->
|
||||
<a href="javascript:;" class="menu-toggler responsive-toggler" data-toggle="collapse"
|
||||
data-target=".navbar-collapse">
|
||||
<span></span>
|
||||
</a>
|
||||
</div>
|
||||
</div>
|
||||
<div class="clearfix"></div>
|
||||
<div class="page-container">
|
||||
|
||||
<!-- BEGIN SIDEBAR -->
|
||||
<div class="page-sidebar-wrapper">
|
||||
<!-- DOC: Set data-auto-scroll="false" to disable the sidebar from auto scrolling/focusing -->
|
||||
<!-- DOC: Change data-auto-speed="200" to adjust the sub menu slide up/down speed -->
|
||||
<div class="page-sidebar navbar-collapse collapse">
|
||||
<!-- BEGIN SIDEBAR MENU -->
|
||||
<ul class="page-sidebar-menu">
|
||||
<?php if (\Yii::$app->user->id != 247): ?>
|
||||
<li class="start <?= Yii::$app->controller->id == 'dashboard' ? 'active' : '' ?>">
|
||||
<a href="<?= Url::toRoute(['dashboard/index']) ?>">
|
||||
<i class="icon-home"></i>
|
||||
<span class="title">Dashboard</span>
|
||||
</a>
|
||||
</li>
|
||||
<li class="<?= Yii::$app->controller->id == 'users' ? 'active' : '' ?>">
|
||||
<a href="<?= Url::toRoute(['users/index']) ?>">
|
||||
<i class="icon-users"></i>
|
||||
<span class="title">Пользователи</span>
|
||||
</a>
|
||||
</li>
|
||||
<li class="<?= Yii::$app->controller->id == 'referrals' ? 'active' : '' ?>">
|
||||
<a href="<?= Url::toRoute(['referrals/index']) ?>">
|
||||
<i class="icon-user-follow"></i>
|
||||
<span class="title">Реферальная система</span>
|
||||
</a>
|
||||
</li>
|
||||
<li class="<?= Yii::$app->controller->id == 'history' ? 'active' : '' ?>">
|
||||
<a href="<?= Url::toRoute(['history/index']) ?>">
|
||||
<i class="icon-list"></i>
|
||||
<span class="title">История поиска</span>
|
||||
<span class="selected"></span>
|
||||
</a>
|
||||
</li>
|
||||
<li class="<?= Yii::$app->controller->id == 'tickets' ? 'active' : '' ?>">
|
||||
<?php
|
||||
$tickets = \app\models\Ticket::find()->where(["status" => [0, 1], "is_deleted" => 0])->count();
|
||||
?>
|
||||
<a href="<?= Url::toRoute(['tickets/index']) ?>">
|
||||
<i class="icon-speech "></i>
|
||||
<span class="title">Система тикетов</span>
|
||||
<?php if ($tickets): ?>
|
||||
<span class="badge badge-danger"><?= $tickets; ?></span>
|
||||
<?php endif; ?>
|
||||
<span class="selected"></span>
|
||||
</a>
|
||||
</li>
|
||||
<li class="<?= Yii::$app->controller->id == 'stats' && Yii::$app->controller->action->id == 'index' ? 'active' : '' ?>">
|
||||
<a href="<?= Url::toRoute(['stats/index']) ?>">
|
||||
<i class="icon-bar-chart"></i>
|
||||
<span class="title">Статистика</span>
|
||||
<span class="selected"></span>
|
||||
</a>
|
||||
</li>
|
||||
<li class="<?= Yii::$app->controller->id == 'payments' ? 'active' : '' ?>">
|
||||
<a href="<?= Url::toRoute(['payments/index']) ?>">
|
||||
<i class="icon-credit-card"></i>
|
||||
<span class="title">Платежи</span>
|
||||
<span class="selected"></span>
|
||||
</a>
|
||||
</li>
|
||||
<li class="<?= Yii::$app->controller->id == 'subscriptions' ? 'active' : '' ?>">
|
||||
<a href="<?= Url::toRoute(['subscriptions/index']) ?>">
|
||||
<i class="icon-credit-card"></i>
|
||||
<span class="title">Подписки</span>
|
||||
<span class="selected"></span>
|
||||
</a>
|
||||
</li>
|
||||
<li class="<?= Yii::$app->controller->id == 'checkouts' ? 'active' : '' ?>">
|
||||
<a href="<?= Url::toRoute(['checkouts/index']) ?>">
|
||||
<i class="icon-credit-card"></i>
|
||||
<span class="title">Выплаты</span>
|
||||
<span class="selected"></span>
|
||||
</a>
|
||||
</li>
|
||||
<li class="<?= Yii::$app->controller->id == 'sites' ? 'active' : '' ?>">
|
||||
<a href="<?= Url::toRoute(['sites/index']) ?>">
|
||||
<i class="icon-globe"></i>
|
||||
<span class="title">Сайты</span>
|
||||
<span class="selected"></span>
|
||||
</a>
|
||||
</li>
|
||||
<li class="<?= Yii::$app->controller->id == 'notify' ? 'active' : '' ?>">
|
||||
<a href="<?= Url::toRoute(['notify/index']) ?>">
|
||||
<i class="icon-energy"></i>
|
||||
<span class="title">Уведомления</span>
|
||||
<span class="selected"></span>
|
||||
</a>
|
||||
</li>
|
||||
<?php endif; ?>
|
||||
<li class="<?= Yii::$app->controller->id == 'wallets' ? 'active' : '' ?>">
|
||||
<a href="<?= Url::toRoute(['wallets/index']) ?>">
|
||||
<i class="icon-wallet"></i>
|
||||
<span class="title">Кошельки</span>
|
||||
<span class="selected"></span>
|
||||
</a>
|
||||
</li>
|
||||
<?php if (\Yii::$app->getUser()->id == 1): ?>
|
||||
<li class="<?= Yii::$app->controller->id == 'tokens' ? 'active' : '' ?>">
|
||||
<a href="<?= Url::toRoute(['tokens/index']) ?>">
|
||||
<i class="icon-key"></i>
|
||||
<span class="title">Токены<?php if ($count = Token::find()->where(['status' => Token::STATUS_INACTIVE])->count()) echo '<span class="badge badge-menu badge-danger">' . $count . '</span>' ?></span>
|
||||
<span class="selected"></span>
|
||||
</a>
|
||||
</li>
|
||||
<li class="<?= Yii::$app->controller->id == 'accounts' && Yii::$app->controller->action->id == 'telegram' ? 'active' : '' ?>">
|
||||
<a href="<?= Url::toRoute(['accounts/telegram']) ?>">
|
||||
<i class="icon-paper-plane"></i>
|
||||
<span class="title">Telegram<?php if ($count = Telegram::find()->where(['status' => [Telegram::STATUS_INACTIVE, Telegram::STATUS_UNAVAILABLE]])->count()) echo '<span class="badge badge-menu badge-danger">' . $count . '</span>' ?></span>
|
||||
<span class="selected"></span>
|
||||
</a>
|
||||
</li>
|
||||
<?php endif; ?>
|
||||
<?php if (\Yii::$app->user->id != 247): ?>
|
||||
<li class="<?= Yii::$app->controller->id == 'reposts' ? 'active' : '' ?>">
|
||||
<a href="<?= Url::toRoute(['reposts/index']) ?>">
|
||||
<i class="icon-share"></i>
|
||||
<span class="title">Репосты</span>
|
||||
<span class="selected"></span>
|
||||
</a>
|
||||
</li>
|
||||
|
||||
<li class="<?= Yii::$app->controller->id == 'retargeting' ? 'active' : '' ?>">
|
||||
<a href="<?= Url::toRoute(['retargeting/index']) ?>">
|
||||
<i class="icon-bar-chart"></i>
|
||||
<span class="title">Ретаргетинг</span>
|
||||
<span class="selected"></span>
|
||||
</a>
|
||||
</li>
|
||||
|
||||
<li class="<?= Yii::$app->controller->id == 'settings' ? 'active' : '' ?>">
|
||||
<a href="<?= Url::toRoute(['settings/index']) ?>">
|
||||
<i class="icon-settings"></i>
|
||||
<span class="title">Настройки</span>
|
||||
</a>
|
||||
</li>
|
||||
<?php endif; ?>
|
||||
<li class="<?= Yii::$app->controller->id == 'apple' ? 'active' : '' ?>">
|
||||
<a href="<?= Url::toRoute(['apple/index']) ?>">
|
||||
<i class="icon-reports"></i>
|
||||
<span class="title">Отчеты apple</span>
|
||||
</a>
|
||||
</li>
|
||||
</ul>
|
||||
<!-- END SIDEBAR MENU -->
|
||||
</div>
|
||||
</div>
|
||||
<!-- END SIDEBAR -->
|
||||
|
||||
<!-- BEGIN CONTENT -->
|
||||
<div class="page-content-wrapper">
|
||||
<div class="page-content">
|
||||
<!-- BEGIN PAGE HEADER-->
|
||||
<h3 class="page-title">
|
||||
<?= $this->title ?>
|
||||
</h3>
|
||||
<div class="page-bar">
|
||||
<ul class="page-breadcrumb">
|
||||
<li>
|
||||
<i class="fa fa-home"></i>
|
||||
<?= Html::a('Главная', '/admin/') ?>
|
||||
<i class="fa fa-angle-right"></i>
|
||||
</li>
|
||||
<li><?= $this->title ?></li>
|
||||
</ul>
|
||||
</div>
|
||||
<!-- END PAGE HEADER-->
|
||||
<br>
|
||||
<!-- BEGIN PAGE CONTENT-->
|
||||
<div class="row">
|
||||
<div class="col-md-12">
|
||||
<?= $content ?>
|
||||
</div>
|
||||
</div>
|
||||
<!-- END PAGE CONTENT-->
|
||||
</div>
|
||||
</div>
|
||||
<!-- END CONTENT -->
|
||||
|
||||
<!-- BEGIN FOOTER -->
|
||||
<div class="page-footer">
|
||||
<div class="page-footer-inner">
|
||||
<?= date('Y') ?> © <?= Yii::$app->name ?>.
|
||||
</div>
|
||||
<div class="page-footer-tools">
|
||||
<span class="go-top"><i class="fa fa-angle-up"></i></span>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<!-- END FOOTER -->
|
||||
<?php $this->endBody(); ?>
|
||||
<?php $this->registerJs("App.init(); Layout.init();"); ?>
|
||||
</body>
|
||||
</html>
|
||||
<?php $this->endPage(); ?>
|
58
modules/admin/views/notify/index.php
Normal file
58
modules/admin/views/notify/index.php
Normal file
|
@ -0,0 +1,58 @@
|
|||
<?php
|
||||
/* @var $this \yii\web\View */
|
||||
/* @var $dataProvider \yii\data\ActiveDataProvider */
|
||||
|
||||
use yii\helpers\Html;
|
||||
|
||||
$this->title = "Уведомления в iOS";
|
||||
?>
|
||||
|
||||
<?=Html::beginForm(["notify/index"]); ?>
|
||||
|
||||
<div class="form-group">
|
||||
<label for="whom">Кому отправлять уведомления</label>
|
||||
<?=Html::dropDownList("whom", "nosub", [
|
||||
"all" => "Всем",
|
||||
"nosub" => "Без активных подписок"
|
||||
], ["class" => "form-control"]);?>
|
||||
</div>
|
||||
|
||||
<div class="form-group">
|
||||
<label for="message">Текст уведомления</label>
|
||||
<?=Html::textInput("message", "", ["class" => "form-control"]); ?>
|
||||
</div>
|
||||
<div class="form-group">
|
||||
<label for="payload">Payload</label>
|
||||
<?=Html::textarea("payload", "", ["class" => "form-control"]); ?>
|
||||
</div>
|
||||
<button type="submit" class="btn btn-default">Отправить</button>
|
||||
<?=Html::endForm();?>
|
||||
|
||||
<br><br>
|
||||
|
||||
<?=\yii\grid\GridView::widget([
|
||||
"dataProvider" => $dataProvider,
|
||||
"columns" => [
|
||||
"id",
|
||||
"tm_create",
|
||||
"message",
|
||||
[
|
||||
"header" => "Данные",
|
||||
"content" => function(\app\models\Notification $model) {
|
||||
return Html::tag("pre", print_r(\yii\helpers\Json::decode($model->payload), true));
|
||||
}
|
||||
],
|
||||
[
|
||||
"header" => "Отправлено",
|
||||
"content" => function(\app\models\Notification $model) {
|
||||
return $model->getResults()->count(1);
|
||||
}
|
||||
],
|
||||
[
|
||||
"header" => "Доставлено",
|
||||
"content" => function(\app\models\Notification $model) {
|
||||
return $model->getGoodResults()->count(1);
|
||||
}
|
||||
]
|
||||
]
|
||||
]); ?>
|
380
modules/admin/views/payments/index.php
Normal file
380
modules/admin/views/payments/index.php
Normal file
|
@ -0,0 +1,380 @@
|
|||
<?php
|
||||
|
||||
/* @var $this \yii\web\View */
|
||||
/* @var $dataProvider \yii\data\ActiveDataProvider */
|
||||
/* @var $regions array */
|
||||
/* @var $todaySubs int */
|
||||
|
||||
use app\models\ApplePayment;
|
||||
use yii\db\Expression;
|
||||
use yii\grid\GridView;
|
||||
use yii\helpers\ArrayHelper;
|
||||
use yii\helpers\Html;
|
||||
use yii\helpers\Url;
|
||||
use app\components\SearchHelper;
|
||||
use app\models\Payment;
|
||||
use app\models\User;
|
||||
|
||||
$this->title = "Платежи";
|
||||
|
||||
$day = date("Y-m-d");
|
||||
$days = [];
|
||||
|
||||
$today = (new yii\db\Query())
|
||||
// ->select([new Expression('SUM(amount) as sum'), new Expression('COUNT(1) as bills'), new Expression('COUNT(1) - (COUNT(DISTINCT user_id) + COUNT(case when user_id is NULL then 1 else null end)) as rebills')])
|
||||
->select([new Expression('SUM(amount) as sum'), new Expression('COUNT(1) as bills'), new Expression('(SELECT COUNT(1) FROM payments p WHERE
|
||||
extract(month from p.tm) = '.date("m").'
|
||||
AND extract(year from p.tm) = '.date("Y").'
|
||||
AND extract(day from p.tm) = '.date("d").'
|
||||
AND p.user_id IN (SELECT user_id FROM payments GROUP BY user_id HAVING COUNT(1) > 1)) as rebills')])
|
||||
->from(Payment::tableName().' p')
|
||||
->where(["=", new Expression("extract(month from tm)"), date("m")])
|
||||
->andWhere(["=", new Expression("extract(year from tm)"), date("Y")])
|
||||
->andWhere(["=", new Expression("extract(day from tm)"), date("d")])
|
||||
->andWhere(["<>", "type_id", Payment::TYPE_TESTAPPLE])
|
||||
->one();
|
||||
|
||||
$last30days = Payment::find()
|
||||
->select(new Expression('SUM(amount)'))
|
||||
->where([">=", "tm", date("Y-m-d 00:00:00", strtotime("-30 days"))])
|
||||
->andWhere(["NOT IN", "type_id", [Payment::TYPE_TESTAPPLE, Payment::TYPE_APPLE]])
|
||||
->scalar();
|
||||
|
||||
$last30daysDetails = Payment::find()
|
||||
->select(["type_id", new Expression('SUM(amount) as amount')])
|
||||
->where([">=", "tm", date("Y-m-d 00:00:00", strtotime("-30 days"))])
|
||||
->andWhere(["NOT IN", "type_id", [Payment::TYPE_TESTAPPLE, Payment::TYPE_APPLE]])
|
||||
->groupBy(["type_id"])
|
||||
->asArray()
|
||||
->all();
|
||||
|
||||
$currentMonth = Payment::find()
|
||||
->select(new Expression('SUM(amount)'))
|
||||
->where(["=", new Expression("extract(month from tm)"), date("m")])
|
||||
->andWhere(["=", new Expression("extract(year from tm)"), date("Y")])
|
||||
->andWhere(["<>", "type_id", Payment::TYPE_TESTAPPLE])
|
||||
->scalar();
|
||||
|
||||
/*
|
||||
$currentMonthDetails = Payment::find()
|
||||
->select(["type_id", new Expression('SUM(amount) as amount')])
|
||||
->where(["=", new Expression("extract(month from tm)"), date("m")])
|
||||
->andWhere(["=", new Expression("extract(year from tm)"), date("Y")])
|
||||
->andWhere(["<>", "type_id", Payment::TYPE_TESTAPPLE])
|
||||
->groupBy(["type_id"])
|
||||
->asArray()
|
||||
->all();
|
||||
*/
|
||||
|
||||
$preventMonth = Payment::find()
|
||||
->select(new Expression('SUM(amount)'))
|
||||
->where(["=", new Expression("extract(month from tm)"), date("m", strtotime("-1 month"))])
|
||||
->andWhere(["=", new Expression("extract(year from tm)"), date("Y", strtotime("-1 month"))])
|
||||
->andWhere(["<>", "type_id", Payment::TYPE_TESTAPPLE])
|
||||
->scalar();
|
||||
|
||||
/*
|
||||
$preventMonthDetails = Payment::find()
|
||||
->select(["type_id", new Expression('SUM(amount) as amount')])
|
||||
->where(["=", new Expression("extract(month from tm)"), date("m", strtotime("-1 month"))])
|
||||
->andWhere(["=", new Expression("extract(year from tm)"), date("Y", strtotime("-1 month"))])
|
||||
->andWhere(["<>", "type_id", Payment::TYPE_TESTAPPLE])
|
||||
->groupBy(["type_id"])
|
||||
->asArray()
|
||||
->all();
|
||||
*/
|
||||
|
||||
$paymentsData = [
|
||||
//"all" => [0 => 0, 1 => 0, 2 => 0],
|
||||
Payment::TYPE_YANDEX => [0 => 0],
|
||||
Payment::TYPE_YANDEX_WALLET => [0 => 0],
|
||||
Payment::TYPE_QIWI => [0 => 0],
|
||||
Payment::TYPE_QIWI_TERMINAL => [0 => 0],
|
||||
Payment::TYPE_WEBMONEY => [0 => 0]
|
||||
];
|
||||
|
||||
foreach($last30daysDetails as $r) {
|
||||
$paymentsData[$r["type_id"]][0] = $r["amount"];
|
||||
}
|
||||
|
||||
$iosPayments = (new yii\db\Query())
|
||||
->select([
|
||||
new Expression('SUM(amount) as amount'),
|
||||
])
|
||||
->from(ApplePayment::tableName())
|
||||
->where([">=", "tm", date("Y-m-d", strtotime("-30 days"))])
|
||||
->scalar();
|
||||
|
||||
$paymentsData[9][0] = $iosPayments;
|
||||
/*
|
||||
foreach($currentMonthDetails as $r) {
|
||||
$paymentsData[$r["type_id"]][1] = $r["amount"];
|
||||
}
|
||||
foreach($preventMonthDetails as $r) {
|
||||
$paymentsData[$r["type_id"]][2] = $r["amount"];
|
||||
}
|
||||
*/
|
||||
|
||||
$siteTodayPayments = Payment::find()
|
||||
->select(["site_id", new Expression('SUM(amount) as amount')])
|
||||
->where([">=", "tm", date("Y-m-d 00:00:00")])
|
||||
->andWhere(["<>", "type_id", Payment::TYPE_TESTAPPLE])
|
||||
->andWhere(["IS NOT", "site_id", null])
|
||||
->groupBy(["site_id"])
|
||||
->orderBy(["amount" => SORT_DESC])
|
||||
->asArray()
|
||||
->all();
|
||||
|
||||
$siteTodayMobilePayments = Payment::find()
|
||||
->select(["type_id", new Expression('SUM(amount) as amount')])
|
||||
->where([">=", "tm", date("Y-m-d 00:00:00")])
|
||||
->andWhere(["type_id" => [Payment::TYPE_ANDROID]])
|
||||
->andWhere(["site_id" => null])
|
||||
->groupBy(["type_id"])
|
||||
->orderBy(["amount" => SORT_DESC])
|
||||
->asArray()
|
||||
->all();
|
||||
|
||||
$sitePayments = Payment::find()
|
||||
->select(["site_id", new Expression('SUM(amount) as amount')])
|
||||
->where([">=", "tm", date("Y-m-d 00:00:00", strtotime("-30 days"))])
|
||||
->andWhere(["<>", "type_id", Payment::TYPE_TESTAPPLE])
|
||||
->andWhere(["IS NOT", "site_id", null])
|
||||
->groupBy(["site_id"])
|
||||
->orderBy(["amount" => SORT_DESC])
|
||||
->asArray()
|
||||
->all();
|
||||
|
||||
$mobilePayments = Payment::find()
|
||||
->select(["type_id", new Expression('SUM(amount) as amount')])
|
||||
->where([">=", "tm", date("Y-m-d 00:00:00", strtotime("-30 days"))])
|
||||
->andWhere(["type_id" => [Payment::TYPE_ANDROID]])
|
||||
->andWhere(["site_id" => null])
|
||||
->groupBy(["type_id"])
|
||||
->orderBy(["amount" => SORT_DESC])
|
||||
->asArray()
|
||||
->all();
|
||||
|
||||
|
||||
|
||||
$siteAllPayments = Payment::find()
|
||||
->select(["site_id", new Expression('SUM(amount) as amount')])
|
||||
->andWhere(["<>", "type_id", Payment::TYPE_TESTAPPLE])
|
||||
->andWhere(["IS NOT", "site_id", null])
|
||||
->groupBy(["site_id"])
|
||||
->orderBy(["amount" => SORT_DESC])
|
||||
->asArray()
|
||||
->all();
|
||||
|
||||
$mobileAllPayments = Payment::find()
|
||||
->select(["type_id", new Expression('SUM(amount) as amount')])
|
||||
->andWhere(["type_id" => [Payment::TYPE_ANDROID]])
|
||||
->andWhere(["site_id" => null])
|
||||
->groupBy(["type_id"])
|
||||
->orderBy(["amount" => SORT_DESC])
|
||||
->asArray()
|
||||
->all();
|
||||
|
||||
$iosAllPayment = (new yii\db\Query())
|
||||
->select([
|
||||
new Expression('SUM(amount) as amount'),
|
||||
])
|
||||
->from(ApplePayment::tableName())
|
||||
->scalar();
|
||||
|
||||
$sites = \app\models\Site::find()->indexBy("id")->asArray()->all();
|
||||
|
||||
$siteTodayData = $site30daysData = $siteAllData = [];
|
||||
foreach ($siteTodayPayments as $s) {
|
||||
//$sTitle =
|
||||
$name = ArrayHelper::getValue(ArrayHelper::getValue($sites, $s['site_id']), 'name');
|
||||
$comment = ArrayHelper::getValue(ArrayHelper::getValue($sites, $s['site_id']), 'comment');
|
||||
$siteId = $name.($comment?'('.$comment.')':'');
|
||||
$siteTodayData[$siteId] = ArrayHelper::getValue($s, "amount");
|
||||
}
|
||||
foreach ($siteTodayMobilePayments as $s) {
|
||||
$siteId = Payment::getTypeName(ArrayHelper::getValue($s, "type_id"));
|
||||
$siteTodayData[$siteId] = ArrayHelper::getValue($s, "amount");
|
||||
}
|
||||
|
||||
|
||||
foreach ($sitePayments as $s) {
|
||||
//$sTitle =
|
||||
$name = ArrayHelper::getValue(ArrayHelper::getValue($sites, $s['site_id']), 'name');
|
||||
$comment = ArrayHelper::getValue(ArrayHelper::getValue($sites, $s['site_id']), 'comment');
|
||||
$siteId = $name.($comment?'('.$comment.')':'');
|
||||
$site30daysData[$siteId] = ArrayHelper::getValue($s, "amount");
|
||||
}
|
||||
foreach ($mobilePayments as $s) {
|
||||
$siteId = Payment::getTypeName(ArrayHelper::getValue($s, "type_id"));
|
||||
$site30daysData[$siteId] = ArrayHelper::getValue($s, "amount");
|
||||
}
|
||||
|
||||
$site30daysData["Apple"] = $iosPayments;
|
||||
|
||||
foreach ($siteAllPayments as $s) {
|
||||
//$sTitle =
|
||||
$name = ArrayHelper::getValue(ArrayHelper::getValue($sites, $s['site_id']), 'name');
|
||||
$comment = ArrayHelper::getValue(ArrayHelper::getValue($sites, $s['site_id']), 'comment');
|
||||
$siteId = $name.($comment?'('.$comment.')':'');
|
||||
$siteAllData[$siteId] = ArrayHelper::getValue($s, "amount");
|
||||
}
|
||||
foreach ($mobileAllPayments as $s) {
|
||||
$siteId = Payment::getTypeName(ArrayHelper::getValue($s, "type_id"));
|
||||
$siteAllData[$siteId] = ArrayHelper::getValue($s, "amount");
|
||||
}
|
||||
|
||||
$siteAllData["Apple"] = $iosAllPayment;
|
||||
|
||||
arsort($siteTodayData);
|
||||
arsort($site30daysData);
|
||||
arsort($siteAllData);
|
||||
|
||||
|
||||
?>
|
||||
<div class="row">
|
||||
<div class="col-md-3">
|
||||
<table class="table table-bordered">
|
||||
<tr><td colspan="4"><b>За сегодня: <?= Yii::$app->formatter->asCurrency(ArrayHelper::getValue($today, 'sum', 0), 'RUB') ?> (Всего платежей - <?= ArrayHelper::getValue($today, 'bills', 0) ?>, ребилов - <?= ArrayHelper::getValue($today, 'rebills', 0) ?>)</b><br>
|
||||
<?=\Yii::t('app', '{n,plural,=0{Подписок нет} =1{Одна подписка} one{# подписка} few{# подписки} many{# подписок} other{# подписки}}', ['n' => $todaySubs]);?>
|
||||
</td></tr>
|
||||
<tr>
|
||||
<td></td>
|
||||
<td><b>За последние 30 дней</b></td>
|
||||
</tr>
|
||||
<?php foreach ($paymentsData as $typeID => $items): ?>
|
||||
<tr>
|
||||
<td><?=Payment::getTypeName($typeID);?></td>
|
||||
<?php foreach($items as $item): ?>
|
||||
<td><?=\Yii::$app->formatter->asCurrency($item, "RUB");?></td>
|
||||
<?php endforeach;?>
|
||||
</tr>
|
||||
<?php endforeach; ?>
|
||||
<tr>
|
||||
<th>Всего:</th>
|
||||
<th><?=\Yii::$app->formatter->asCurrency($last30days+$iosPayments, "RUB");?></th>
|
||||
</tr>
|
||||
</table>
|
||||
</div>
|
||||
<div class="col-md-3">
|
||||
<table class="table table-bordered">
|
||||
<tr><th colspan="2">За сегодня</th></tr>
|
||||
<?php foreach ($siteTodayData as $name => $amount): ?>
|
||||
<tr>
|
||||
<td><?=$name;?></td>
|
||||
<td><?= Yii::$app->formatter->asCurrency($amount, 'RUB') ?></td>
|
||||
</tr>
|
||||
<?php endforeach; ?>
|
||||
</table>
|
||||
</div>
|
||||
<div class="col-md-3">
|
||||
<table class="table table-bordered">
|
||||
<tr><th colspan="2">За 30 дней</th></tr>
|
||||
<?php foreach ($site30daysData as $name => $amount): ?>
|
||||
<tr>
|
||||
<td><?=$name;?></td>
|
||||
<td><?= Yii::$app->formatter->asCurrency($amount, 'RUB') ?></td>
|
||||
</tr>
|
||||
<?php endforeach; ?>
|
||||
</table>
|
||||
</div>
|
||||
<div class="col-md-3">
|
||||
<table class="table table-bordered">
|
||||
<tr><th colspan="2">За всё время</th></tr>
|
||||
<?php foreach ($siteAllData as $name => $amount): ?>
|
||||
<tr>
|
||||
<td><?=$name;?></td>
|
||||
<td><?= Yii::$app->formatter->asCurrency($amount, 'RUB') ?></td>
|
||||
</tr>
|
||||
<?php endforeach; ?>
|
||||
</table>
|
||||
</div>
|
||||
</div>
|
||||
<?php
|
||||
echo GridView::widget([
|
||||
'dataProvider' => $dataProvider,
|
||||
'rowOptions' => function (Payment $model) {
|
||||
$payments = Payment::find()->where(['user_id' => $model->user_id])->andWhere(['<', 'id', $model->id])->count();
|
||||
if ($payments) return ['class' => 'success'];
|
||||
return [];
|
||||
},
|
||||
'beforeRow' => function ($model, $key, $index, $grid) use (&$day){
|
||||
$cday = date("Y-m-d", strtotime($model->tm));
|
||||
if($cday != $day && $index > 0) {
|
||||
$sum = Payment::find()->select(new Expression('SUM(amount)'))->where([">=", "tm", $day." 00:00:00"])->andWhere(["<=", "tm", $day." 23:59:59"])->scalar();
|
||||
return "<tr><td colspan='5'>За <b>".\Yii::$app->formatter->asDate($day, "d MMMM")."</b> заработано <b>".\Yii::$app->formatter->asCurrency($sum, "RUB")."</b></td></tr>";
|
||||
}
|
||||
$day = date("Y-m-d", strtotime($model->tm));
|
||||
},
|
||||
'afterRow' => function ($model, $key, $index, $grid) use (&$day, $dataProvider) {
|
||||
$day = date("Y-m-d", strtotime($model->tm));
|
||||
if(($index+1) == $dataProvider->totalCount) {
|
||||
$sum = Payment::find()->select(new Expression('SUM(amount)'))->where([">=", "tm", $day." 00:00:00"])->andWhere(["<=", "tm", $day." 23:59:59"])->scalar();
|
||||
return "<tr><td colspan='5'>За <b>".\Yii::$app->formatter->asDate($day, "d MMMM")."</b> заработано <b>".\Yii::$app->formatter->asCurrency($sum, "RUB")."</b></td></tr>";
|
||||
}
|
||||
},
|
||||
'columns' => [
|
||||
'id',
|
||||
[
|
||||
'attribute' => 'site_id',
|
||||
'content' => function(Payment $model) {
|
||||
if($model->type_id == Payment::TYPE_ANDROID) {
|
||||
return "Play Market";
|
||||
}
|
||||
if($model->type_id == Payment::TYPE_APPLE) {
|
||||
return "Apple Store";
|
||||
}
|
||||
return ArrayHelper::getValue($model, "site.name", "-");
|
||||
}
|
||||
],
|
||||
[
|
||||
'attribute' => 'tm',
|
||||
'content' => function(Payment $model) {
|
||||
return Yii::$app->formatter->asDatetime(strtotime($model->tm) - 3600, 'dd.MM.yyyy HH:mm');
|
||||
}
|
||||
],
|
||||
[
|
||||
'attribute' => 'user_id',
|
||||
'content' => function(Payment $model) {
|
||||
$user = ArrayHelper::getValue($model, 'user', null);
|
||||
|
||||
$city = '';
|
||||
if (!$user || $user->ip == '') $city = '';
|
||||
//else $city = SearchHelper::City($user->ip);
|
||||
|
||||
$paymentsCount = count(ArrayHelper::getValue($model, ['user', 'payments'], []));
|
||||
|
||||
if ($paymentsCount > 1) {
|
||||
$paymentsSum = array_sum(ArrayHelper::getColumn($model->user->payments, 'amount'));
|
||||
$paymentsSum = Yii::$app->formatter->asCurrency($paymentsSum, 'RUB');
|
||||
$payments = '(Всего ' . $paymentsSum .', ' . Yii::t('app', '{n, plural, one{# платёж} few{# платежа} many{# платежей} other{# платежа}}', ['n' => $paymentsCount]) . ')';
|
||||
} else {
|
||||
$payments = '';
|
||||
}
|
||||
|
||||
$username = null;
|
||||
if ($user) {
|
||||
$username = 'Пользователь #'.$user->id;
|
||||
if(trim($user->email) != "") {
|
||||
$username = $user->email;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
return $user ? join(', ', array_filter([Html::a($username, Url::toRoute(['users/view', 'id' => $user->id])), $city, $payments])) : "Пользователь не известен";
|
||||
}
|
||||
],
|
||||
[
|
||||
'header' => 'Сумма',
|
||||
'content' => function(Payment $model) {
|
||||
return Yii::$app->formatter->asCurrency($model->amount, 'RUB');
|
||||
}
|
||||
],
|
||||
[
|
||||
'header' => 'Тип',
|
||||
'content' => function(Payment $model) {
|
||||
return Payment::getTypeName($model->type_id);
|
||||
}
|
||||
]
|
||||
]
|
||||
]);
|
6
modules/admin/views/plati/index.php
Normal file
6
modules/admin/views/plati/index.php
Normal file
|
@ -0,0 +1,6 @@
|
|||
<?php
|
||||
/* @var $this \yii\web\View */
|
||||
/* @var $dataProvider \yii\data\ActiveDataProvider */
|
||||
?>
|
||||
|
||||
<?=\yii\grid\GridView::widget(["dataProvider" => $dataProvider]); ?>
|
20
modules/admin/views/referrals/index.php
Normal file
20
modules/admin/views/referrals/index.php
Normal file
|
@ -0,0 +1,20 @@
|
|||
<?php
|
||||
/* @var $this \yii\web\View */
|
||||
|
||||
$this->title = "Реферальная система";
|
||||
?>
|
||||
|
||||
<table class="table">
|
||||
<tr>
|
||||
<th>Пользователь</th>
|
||||
<th>Кол-во рефералов</th>
|
||||
<th>Баланс</th>
|
||||
</tr>
|
||||
<?php foreach($refs as $r): ?>
|
||||
<tr>
|
||||
<td><?=$r->email;?></td>
|
||||
<td><?=\app\models\User::find()->where(["ref_id" => $r->id])->count();?></td>
|
||||
<td><?=$r->ref_balance;?></td>
|
||||
</tr>
|
||||
<?php endforeach; ?>
|
||||
</table>
|
34
modules/admin/views/reposts/index.php
Normal file
34
modules/admin/views/reposts/index.php
Normal file
|
@ -0,0 +1,34 @@
|
|||
<?php
|
||||
/* @var $this \yii\web\View */
|
||||
/* @var $dataProvider \yii\data\ActiveDataProvider */
|
||||
|
||||
use yii\grid\GridView;
|
||||
use yii\helpers\Html;
|
||||
|
||||
?>
|
||||
|
||||
<?= GridView::widget([
|
||||
'dataProvider' => $dataProvider,
|
||||
'rowOptions' => function(\app\models\Repost $model) {
|
||||
if ($model->status == 0) return ['class' => 'danger'];
|
||||
return [];
|
||||
},
|
||||
'columns' => [
|
||||
"id",
|
||||
"tm",
|
||||
[
|
||||
"attribute" => "user_id",
|
||||
"content" => function(\app\models\Repost $model) {
|
||||
return Html::a($model->user->email, ["users/view", "id" => $model->user_id]);
|
||||
}
|
||||
],
|
||||
[
|
||||
"attribute" => "vk_id",
|
||||
"content" => function(\app\models\Repost $model) {
|
||||
$link = "https://vk.com/id".$model->vk_id;
|
||||
return Html::a($link, $link);
|
||||
}
|
||||
],
|
||||
"sms_count",
|
||||
]
|
||||
]) ?>
|
41
modules/admin/views/retargeting/index.php
Normal file
41
modules/admin/views/retargeting/index.php
Normal file
|
@ -0,0 +1,41 @@
|
|||
<?php
|
||||
|
||||
use yii\grid\ActionColumn;
|
||||
use yii\grid\GridView;
|
||||
use yii\helpers\ArrayHelper;
|
||||
use yii\helpers\Html;
|
||||
use yii\helpers\Url;
|
||||
|
||||
|
||||
$this->title = 'Ретаргетинг';
|
||||
|
||||
?>
|
||||
|
||||
<h3>Статистика</h3>
|
||||
|
||||
<table class="table table-striped table-bordered">
|
||||
<tr>
|
||||
<th></th>
|
||||
<th>Сегодня</th>
|
||||
<th>Вчера</th>
|
||||
<th>За последние 30 дней</th>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>Кол-во отправленных писем:</td>
|
||||
<td><?= $todaySent ? $todaySent : 0 ?></td>
|
||||
<td><?= $todayRead ? $todayRead : 0 ?></td>
|
||||
<td><?= $todayClick ? $todayClick : 0 ?></td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>Кол-во прочитанных писем:</td>
|
||||
<td><?= $yesterdaySent ?></td>
|
||||
<td><?= $yesterdayRead ?></td>
|
||||
<td><?= $yesterdayClick ?></td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>Кол-во переходов по ссылке:</td>
|
||||
<td><?= $monthSent ?></td>
|
||||
<td><?= $monthRead ?></td>
|
||||
<td><?= $monthClick ?></td>
|
||||
</tr>
|
||||
</table>
|
29
modules/admin/views/settings/_bans.php
Normal file
29
modules/admin/views/settings/_bans.php
Normal file
|
@ -0,0 +1,29 @@
|
|||
<?php
|
||||
|
||||
/* @var $this \yii\web\View */
|
||||
/* @var $dataProvider \yii\data\ActiveDataProvider */
|
||||
|
||||
use yii\grid\GridView;
|
||||
use yii\helpers\Url;
|
||||
use yii\helpers\Html;
|
||||
use app\models\User;
|
||||
|
||||
echo GridView::widget([
|
||||
'dataProvider' => $dataProvider,
|
||||
'columns' => [
|
||||
'id',
|
||||
[
|
||||
'format' => 'raw',
|
||||
'attribute' => 'email',
|
||||
'value' => function(User $model) {
|
||||
return Html::a($model->email, Url::toRoute(['users/view', 'id' => $model->id]));
|
||||
}
|
||||
],
|
||||
[
|
||||
'attribute' => 'ban',
|
||||
'value' => function(User $model) {
|
||||
return User::getBanStatusText($model->ban);
|
||||
}
|
||||
]
|
||||
]
|
||||
]);
|
31
modules/admin/views/settings/_blocked_phones.php
Normal file
31
modules/admin/views/settings/_blocked_phones.php
Normal file
|
@ -0,0 +1,31 @@
|
|||
<?php
|
||||
|
||||
/* @var $this \yii\web\View */
|
||||
/* @var $phones array */
|
||||
|
||||
$count = array_reduce($phones, function($acc, $data) {
|
||||
return [
|
||||
'all' => $acc['all'] += $data['all'],
|
||||
'unconfirmed' => $acc['unconfirmed'] += $data['confirmed'],
|
||||
'confirmed' => $acc['confirmed'] += $data['confirmed'],
|
||||
'vip' => $acc['vip'] += $data['vip']
|
||||
];
|
||||
}, ['all' => 0, 'unconfirmed' => 0, 'confirmed' => 0, 'vip' => 0]);
|
||||
|
||||
?>
|
||||
|
||||
<h3>Всего заблокировано <?= $count['all'] ?> номеров. Подтверждено: <?= $count['confirmed'] ?>. VIP <?= $count['vip'] ?></h3>
|
||||
|
||||
<table class="table table-striped table-bordered">
|
||||
<tr>
|
||||
<th>Дата</th>
|
||||
<th>Количество заблокированных мномеров</th>
|
||||
</tr>
|
||||
|
||||
<?php foreach ($phones as $date => $data): ?>
|
||||
<tr>
|
||||
<td><?= $date ?></td>
|
||||
<td>Всего: <?= $data['all'] ?>, подтверждено: <?= $data['confirmed'] ?>, VIP: <?= $data['vip'] ?>.</td>
|
||||
</tr>
|
||||
<?php endforeach; ?>
|
||||
</table>
|
44
modules/admin/views/settings/_domains.php
Normal file
44
modules/admin/views/settings/_domains.php
Normal file
|
@ -0,0 +1,44 @@
|
|||
<?php
|
||||
|
||||
/* @var $this \yii\web\View */
|
||||
/* @var $model \app\models\UrlFilter */
|
||||
/* @var $dataProvider \yii\data\ActiveDataProvider */
|
||||
|
||||
use app\models\UrlFilter;
|
||||
use yii\grid\GridView;
|
||||
use yii\helpers\Html;
|
||||
use yii\helpers\Url;
|
||||
use yii\widgets\ActiveForm;
|
||||
|
||||
?>
|
||||
|
||||
<?php $form = ActiveForm::begin(); ?>
|
||||
|
||||
<?= $form->field($model, 'url')->textInput() ?>
|
||||
<?= $form->field($model, 'type')->dropDownList(UrlFilter::getTypes()) ?>
|
||||
<?= Html::submitButton('Добавить', ['class' => 'btn btn-success']) ?>
|
||||
|
||||
<?php ActiveForm::end(); ?>
|
||||
|
||||
<hr>
|
||||
|
||||
<?= GridView::widget([
|
||||
'dataProvider' => $dataProvider,
|
||||
'columns' => [
|
||||
'id',
|
||||
'url',
|
||||
[
|
||||
'attribute' => 'type',
|
||||
'value' => function(UrlFilter $model) {
|
||||
return UrlFilter::typeText($model->type);
|
||||
}
|
||||
],
|
||||
[
|
||||
'format' => 'raw',
|
||||
'header' => 'Действия',
|
||||
'value' => function(UrlFilter $model) {
|
||||
return '<a href="' . Url::to(['settings/delete-domain', 'id' => $model->id]) . '" onclick="return confirm(\'Удалить домен?\')"><i class="icon-trash"></i></a>';
|
||||
}
|
||||
]
|
||||
]
|
||||
]) ?>
|
35
modules/admin/views/settings/_fingerprints.php
Normal file
35
modules/admin/views/settings/_fingerprints.php
Normal file
|
@ -0,0 +1,35 @@
|
|||
<?php
|
||||
|
||||
/* @var $this \yii\web\View */
|
||||
/* @var $dataProvider \yii\data\ActiveDataProvider */
|
||||
|
||||
use yii\grid\GridView;
|
||||
use app\models\UserFingerprint;
|
||||
use \app\models\User;
|
||||
use \yii\helpers\ArrayHelper;
|
||||
|
||||
echo GridView::widget([
|
||||
'dataProvider' => $dataProvider,
|
||||
'columns' => [
|
||||
'hash',
|
||||
[
|
||||
'attribute' => 'user_ids',
|
||||
'header' => 'Пользователи',
|
||||
'value' => function ($data) {
|
||||
$userIds = trim(ArrayHelper::getValue($data, 'user_ids'), '{}');
|
||||
$userIds = preg_split('/,/', $userIds);
|
||||
$users = User::find()->where(['id' => $userIds])->all();
|
||||
return join(', ', ArrayHelper::getColumn($users, 'email'));
|
||||
}
|
||||
],
|
||||
[
|
||||
'attribute' => 'ips',
|
||||
'header' => 'IP адреса',
|
||||
'value' => function ($data) {
|
||||
$ips = trim(ArrayHelper::getValue($data, 'ips'), '{}');
|
||||
$ips = preg_split('/,/', $ips);
|
||||
return join(', ', $ips);
|
||||
}
|
||||
],
|
||||
]
|
||||
]);
|
73
modules/admin/views/settings/_search_index.php
Normal file
73
modules/admin/views/settings/_search_index.php
Normal file
|
@ -0,0 +1,73 @@
|
|||
<?php
|
||||
|
||||
/* @var $this \yii\web\View */
|
||||
|
||||
use yii\helpers\Html;
|
||||
use app\models\Settings;
|
||||
|
||||
?>
|
||||
|
||||
<?= Html::beginForm() ?>
|
||||
<table class="table">
|
||||
<tr>
|
||||
<th colspan="2">Индексы поиска</th>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>Индекс поиска оператора</td>
|
||||
<td><?=Html::textInput('search_index_operator', Settings::get('search_index_operator', 0), ['class' => 'form-control']) ?></td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>Индекс поиска фото в Viber</td>
|
||||
<td><?=Html::textInput('search_index_viber', Settings::get('search_index_viber', 7), ['class' => 'form-control']) ?></td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>Индекс поиска во ВКонтакте VIP</td>
|
||||
<td><?=Html::textInput('search_index_vk_vip', Settings::get('search_index_vk_vip', 0), ['class' => 'form-control']) ?></td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>Индекс поиска во ВКонтакте</td>
|
||||
<td><?=Html::textInput('search_index_vk', Settings::get('search_index_vk', 15), ['class' => 'form-control']) ?></td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>Индекс поиска в Facebook</td>
|
||||
<td><?=Html::textInput('search_index_fb', Settings::get('search_index_fb', 15), ['class' => 'form-control']) ?></td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>Индекс поиска по Avito</td>
|
||||
<td><?=Html::textInput('search_index_avito', Settings::get('search_index_avito', 15), ['class' => 'form-control']) ?></td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>Индекс поиска в Google</td>
|
||||
<td><?= Html::textInput('search_index_google', Settings::get('search_index_google', 7), ["class" => 'form-control']) ?></td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>Индекс поиска по Auto.ru</td>
|
||||
<td><?= Html::textInput('search_index_avinfo', Settings::get('search_index_avinfo', 15), ['class' => 'form-control']) ?></td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>Индекс поиска в Sprut</td>
|
||||
<td><?= Html::textInput('search_index_sprut', Settings::get('search_index_sprut', 0), ['class' => 'form-control']) ?></td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>Индекс поиска в Truecaller</td>
|
||||
<td><?= Html::textInput('search_index_truecaller', Settings::get('search_index_truecaller', 15), ['class' => 'form-control']) ?></td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>Индекс поиска в Numbuster</td>
|
||||
<td><?= Html::textInput('search_index_numbuster', Settings::get('search_index_numbuster', 15), ['class' => 'form-control']) ?></td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>Индекс поиска в Инстаграмме</td>
|
||||
<td><?= Html::textInput('search_index_instagram', Settings::get('search_index_instagram', 20), ['class' => 'form-control']) ?></td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>Индекс поиска в Антипарконе</td>
|
||||
<td><?= Html::textInput('search_index_antiparkon', Settings::get('search_index_antiparkon', 5), ['class' => 'form-control']) ?></td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>Индекс поиска в Телеграмме</td>
|
||||
<td><?= Html::textInput('search_index_telegram', Settings::get('search_index_telegram', 7), ['class' => 'form-control']) ?></td>
|
||||
</tr>
|
||||
</table>
|
||||
<?= Html::submitButton('Сохранить', ['class' => 'btn btn-success']) ?>
|
||||
<?= Html::endForm() ?>
|
55
modules/admin/views/settings/index.php
Normal file
55
modules/admin/views/settings/index.php
Normal file
|
@ -0,0 +1,55 @@
|
|||
<?php
|
||||
|
||||
/* @var $this \yii\web\View */
|
||||
/* @var $tab string */
|
||||
/* @var $model \yii\db\ActiveRecord */
|
||||
/* @var $dataProvider \yii\data\ActiveDataProvider */
|
||||
|
||||
use yii\bootstrap\Tabs;
|
||||
use yii\helpers\Url;
|
||||
|
||||
$this->title = 'Настройки';
|
||||
|
||||
echo Tabs::widget([
|
||||
'id' => 'SettingsTabsWidget',
|
||||
'renderTabContent' => false,
|
||||
'items' => [
|
||||
[
|
||||
'label' => 'Индексы поиска',
|
||||
'url' => Url::toRoute(['settings/index', 'tab' => 'index']),
|
||||
'active' => $tab == 'index'
|
||||
],
|
||||
[
|
||||
'label' => 'Заблокированные пользователи',
|
||||
'url' => Url::toRoute(['settings/index', 'tab' => 'bans']),
|
||||
'active' => $tab == 'bans'
|
||||
],
|
||||
[
|
||||
'label' => 'Домены',
|
||||
'url' => Url::toRoute(['settings/index', 'tab' => 'domains']),
|
||||
'active' => $tab == 'domains'
|
||||
],
|
||||
[
|
||||
'label' => 'Статистика по фингерпринтам',
|
||||
'url' => Url::toRoute(['settings/index', 'tab' => 'fingerprints']),
|
||||
'active' => $tab == 'fingerprints'
|
||||
],
|
||||
[
|
||||
'label' => 'Заблокированные номера',
|
||||
'url' => Url::toRoute(['settings/index', 'tab' => 'blocked-phones']),
|
||||
'active' => $tab == 'blocked-phones'
|
||||
]
|
||||
]
|
||||
]);
|
||||
|
||||
echo '<div class="tab-content">';
|
||||
|
||||
switch ($tab) {
|
||||
case 'index': echo $this->render('_search_index'); break;
|
||||
case 'bans': echo $this->render('_bans', compact('dataProvider')); break;
|
||||
case 'domains': echo $this->render('_domains', compact('model', 'dataProvider')); break;
|
||||
case 'fingerprints': echo $this->render('_fingerprints', compact('dataProvider')); break;
|
||||
case 'blocked-phones': echo $this->render('_blocked_phones', compact('phones')); break;
|
||||
}
|
||||
|
||||
echo '</div>';
|
27
modules/admin/views/sites/_form.php
Normal file
27
modules/admin/views/sites/_form.php
Normal file
|
@ -0,0 +1,27 @@
|
|||
<?php
|
||||
|
||||
/* @var $this \yii\web\View */
|
||||
/* @var $model \app\models\Site */
|
||||
|
||||
use yii\helpers\Html;
|
||||
use yii\widgets\ActiveForm;
|
||||
|
||||
?>
|
||||
|
||||
<?php $form = ActiveForm::begin();?>
|
||||
<?= $form->field($model, 'name')->textInput() ?>
|
||||
<?= $form->field($model, 'comment')->textInput() ?>
|
||||
<?= $form->field($model, 'is_demo')->checkbox() ?>
|
||||
<?= $form->field($model, 'type_id')->dropDownList(["1" => "Обычный", 2 => "Новый тип поиска"]) ?>
|
||||
<?= $form->field($model, 'phone')->textInput()->hint("Номер телефон для QIWI кошелька. Пароль должен быть Ag6K2oxG. Нужно отключать подтверждение по смс. По паспортным данных должен находится ИНН на nalog.ru") ?>
|
||||
<?= $form->field($model, 'yandex_money_account')->textInput()->hint("№ кошелька ЯД. По паспортным данных должен находится ИНН на nalog.ru. Настройки -> Все остальное -> Уведомления. Указать http://yamoney.pmadm.ru/pay/result + поставить галочку.") ?>
|
||||
<?= $form->field($model, 'vk_id')->textInput()->hint("Создаем приложение в контакте. Название: ДОМЕН. Тип: веб сайт. Адрес: https://ДОМЕН. Домены: ДОМЕН. Сюда берем ID приложения.") ?>
|
||||
<?= $form->field($model, 'vk_secret')->textInput()->hint("Сюда берем Защищенный ключ") ?>
|
||||
<?= $form->field($model, 'fb_id')->textInput()->hint("Создаем приложение на facebook. Отображаемое имя: ДОМЕН. Настройки -> Основное: Домены приложений: ДОМЕН. Добавляем платформу Веб сайт с адресом: https://ДОМЕН. Отсюда нам нужен Индентификатор приложения") ?>
|
||||
<?= $form->field($model, 'fb_secret')->textInput()->hint("Сюда берем Секрет приложения. Проверка приложения -> Сделать приложение доступным для всех.") ?>
|
||||
<?= $form->field($model, 'gg_id')->textInput()->hint("https://console.developers.google.com , Создаем проект с названием ДОМЕН (точку заменяем на -). Диспетчер API -> Учетные данные. Окно запроса доступа OAuth. Название продукта: ДОМЕН. Учетные данные -> Создать идентификатор клиента OAuth. Веб приложение. Название: ДОМЕН. Разрешенные источники: https://ДОМЕН. Разрешенные URL перенаправления: https://ДОМЕН/auth?authclient=google . Сюда берем идентификатор клиента без пробелов.") ?>
|
||||
<?= $form->field($model, 'gg_secret')->textInput()->hint("Сюда берем секрет клиента ьез пробелов") ?>
|
||||
<?= $form->field($model, 'platiru_id')->textInput()->hint("№ товара в магазине plati.ru") ?>
|
||||
|
||||
<?= Html::submitButton($model->isNewRecord ? 'Добавить' : 'Сохранить', ['class' => 'btn btn-success']) ?>
|
||||
<?php ActiveForm::end(); ?>
|
8
modules/admin/views/sites/create.php
Normal file
8
modules/admin/views/sites/create.php
Normal file
|
@ -0,0 +1,8 @@
|
|||
<?php
|
||||
|
||||
/* @var $this \yii\web\View */
|
||||
/* @var $model \app\models\Site */
|
||||
|
||||
$this->title = 'Добавление сайта';
|
||||
|
||||
echo $this->render('_form', compact('model'));
|
43
modules/admin/views/sites/index.php
Normal file
43
modules/admin/views/sites/index.php
Normal file
|
@ -0,0 +1,43 @@
|
|||
<?php
|
||||
|
||||
/* @var $this \yii\web\View */
|
||||
/* @var $dataProvider \yii\data\ActiveDataProvider */
|
||||
|
||||
use yii\grid\ActionColumn;
|
||||
use yii\grid\GridView;
|
||||
use yii\helpers\Html;
|
||||
|
||||
$this->title = 'Список сайтов';
|
||||
|
||||
echo Html::tag('p', Html::a('Добавить сайт', ['sites/create'], ['class' => 'btn btn-primary']));
|
||||
|
||||
echo GridView::widget([
|
||||
'dataProvider' => $dataProvider,
|
||||
'columns' => [
|
||||
'id',
|
||||
'name',
|
||||
'comment',
|
||||
'is_demo',
|
||||
[
|
||||
'header' => 'Платежи',
|
||||
'content' => function($model) use($payments) {
|
||||
return \Yii::$app->formatter->asCurrency(\yii\helpers\ArrayHelper::getValue($payments, [$model->id, "sum"], 0), "RUB");
|
||||
}
|
||||
],
|
||||
[
|
||||
'header' => 'Поиски',
|
||||
'content' => function($model) use($seaches) {
|
||||
return \yii\helpers\ArrayHelper::getValue($seaches, [$model->id, "count"], 0);
|
||||
}
|
||||
],
|
||||
[
|
||||
'class' => ActionColumn::className(),
|
||||
'template' => '{update} {delete}',
|
||||
'buttons' => [
|
||||
'set-demo' => function ($url, $model, $key) {
|
||||
return $model->is_demo ? Html::a('Выключить demo', ['set-demo', 'id' => $model->id], ['class' => 'btn btn-danger']) : Html::a('Включить demo', ['set-demo', 'id' => $model->id], ['class' => 'btn btn-success']);
|
||||
}
|
||||
]
|
||||
],
|
||||
]
|
||||
]);
|
8
modules/admin/views/sites/update.php
Normal file
8
modules/admin/views/sites/update.php
Normal file
|
@ -0,0 +1,8 @@
|
|||
<?php
|
||||
|
||||
/* @var $this \yii\web\View */
|
||||
/* @var $model \app\models\Site */
|
||||
|
||||
$this->title = 'Редактирование сайта';
|
||||
|
||||
echo $this->render('_form', compact('model'));
|
40
modules/admin/views/stats/detailed.php
Normal file
40
modules/admin/views/stats/detailed.php
Normal file
|
@ -0,0 +1,40 @@
|
|||
<?php
|
||||
|
||||
/* @var $this \yii\web\View */
|
||||
/* @var $type integer */
|
||||
/* @var $date string */
|
||||
/* @var $filter string */
|
||||
/* @var $dataProvider \yii\data\ActiveDataProvider */
|
||||
|
||||
use yii\grid\GridView;
|
||||
use yii\helpers\Html;
|
||||
use yii\helpers\Url;
|
||||
use app\models\ResultCache;
|
||||
|
||||
$this->title = 'Статистика по ' . ResultCache::getTypeName($type) . ' за ' . $date;
|
||||
|
||||
echo Html::dropDownList('filter', $filter, [
|
||||
'all' => 'Все',
|
||||
'found' => 'Найден',
|
||||
'not_found' => 'Не найден'
|
||||
]);
|
||||
|
||||
echo GridView::widget([
|
||||
'dataProvider' => $dataProvider,
|
||||
'filterSelector' => 'select[name="filter"]',
|
||||
'columns' => [
|
||||
[
|
||||
'format' => 'raw',
|
||||
'header' => 'Номер телефона',
|
||||
'value' => function ($row) {
|
||||
return Html::a($row['phone'], Url::to('/' . preg_replace('/^7/', '8', $row['phone'])));
|
||||
}
|
||||
],
|
||||
[
|
||||
'header' => 'Найден',
|
||||
'value' => function ($row) {
|
||||
return $row['success'] ? 'Да' : 'Нет';
|
||||
}
|
||||
]
|
||||
]
|
||||
]);
|
109
modules/admin/views/stats/index.php
Normal file
109
modules/admin/views/stats/index.php
Normal file
|
@ -0,0 +1,109 @@
|
|||
<?php
|
||||
|
||||
/* @var $this \yii\web\View */
|
||||
/* @var $sourcesStats array */
|
||||
/* @var $start string */
|
||||
/* @var $end string */
|
||||
|
||||
use yii\helpers\Html;
|
||||
use yii\helpers\Url;
|
||||
use app\models\ResultCache;
|
||||
|
||||
$this->title = 'Статистика';
|
||||
|
||||
$sourcesDays = array_keys($sourcesStats);
|
||||
|
||||
krsort($sourcesDays);
|
||||
|
||||
$types = [];
|
||||
|
||||
foreach ($sourcesStats as $key => $value) {
|
||||
$types = array_merge($types, array_keys($value));
|
||||
}
|
||||
|
||||
$types = array_filter(array_unique($types));
|
||||
|
||||
$sourcesToday = $sourcesDays[count($sourcesDays) - 1];
|
||||
$sourcesYesterday = $sourcesDays[count($sourcesDays) - 2];
|
||||
|
||||
$latestRequestTime = function($date) {
|
||||
$timestamp = (new DateTime($date))->getTimestamp();
|
||||
|
||||
switch (date('d', $timestamp)) {
|
||||
case date('d', time()):
|
||||
return '<span style="color: green;">' . date('(H:i)', $timestamp) . '</span>';
|
||||
case date('d', strtotime('-1 day')):
|
||||
return '<b><span style="color: red;">' . date('(вчера H:i)', $timestamp) . '</span></b>';
|
||||
}
|
||||
};
|
||||
|
||||
$viberTime = function($date) {
|
||||
$hours = date('H');
|
||||
$time = null;
|
||||
|
||||
if ($hours > 10 && $hours < 22) {
|
||||
$time = '-30 minutes';
|
||||
} else {
|
||||
$time = '-1 hour';
|
||||
}
|
||||
|
||||
if (strtotime($time) > (new DateTime($date))->getTimestamp()) {
|
||||
return 'style="border-bottom: 2px red dashed;"';
|
||||
}
|
||||
|
||||
return null;
|
||||
};
|
||||
|
||||
?>
|
||||
|
||||
<table class="table table-striped table-bordered">
|
||||
<tbody>
|
||||
<tr>
|
||||
<th>Дата</th>
|
||||
<td>-</td>
|
||||
<?php foreach ($sourcesDays as $day): ?>
|
||||
<td><?= $day ?></td>
|
||||
<?php endforeach; ?>
|
||||
</tr>
|
||||
<?php foreach ($types as $type): ?>
|
||||
<tr>
|
||||
<th><?= ResultCache::getTypeName($type) ?></th>
|
||||
|
||||
<?php foreach ($sourcesDays as $day): ?>
|
||||
<?php if (isset($sourcesStats[$day][$type])): ?>
|
||||
<?php if ($day == $sourcesToday && isset($sourcesStats[$sourcesYesterday][$type])): ?>
|
||||
<?php if ($sourcesStats[$day][$type]['success']): ?>
|
||||
<?php $data = (new \yii\db\Query())
|
||||
->select(['phone', new \yii\db\Expression('MAX(tm) as tm')])
|
||||
->from('cache')
|
||||
->where(['type_id' => $type])
|
||||
->andWhere(['and', ['<>', 'data', '[]'], ['<>', 'data', 'null']])
|
||||
->groupBy('phone')
|
||||
->orderBy(['tm' => SORT_DESC])
|
||||
->one();
|
||||
?>
|
||||
<td><span <?= $type == ResultCache::TYPE_VIBER ? $viberTime($data['tm']) : '' ?>><?= Html::a($data['phone'], '/' . preg_replace('/^7/', '8', $data['phone'])) ?> <?= $latestRequestTime($data['tm']) ?></span></td>
|
||||
<?php else: ?>
|
||||
<td>-</td>
|
||||
<?php endif; ?>
|
||||
<td style="cursor: pointer;" onclick="location.href='<?= Url::to(['stats/detailed', 'type' => $type, 'date' => $day]) ?>'" title="Всего запросов: <?= $sourcesStats[$day][$type]['all'] ?>, из них успешных: <?= $sourcesStats[$day][$type]['success'] ?>">
|
||||
<?php $todayPercent = round($sourcesStats[$sourcesToday][$type]['success'] / $sourcesStats[$sourcesToday][$type]['all'] * 100, 2, PHP_ROUND_HALF_DOWN); ?>
|
||||
<?php $yesterdayPercent = round($sourcesStats[$sourcesYesterday][$type]['success'] / $sourcesStats[$sourcesYesterday][$type]['all'] * 100, 2, PHP_ROUND_HALF_DOWN); ?>
|
||||
<span style="color: <?= $todayPercent > ($yesterdayPercent / 2) ? 'green' : 'red' ?>"><?= $todayPercent ?>%</span>
|
||||
</td>
|
||||
<?php else: ?>
|
||||
<td style="cursor: pointer;" onclick="location.href='<?= Url::to(['stats/detailed', 'type' => $type, 'date' => $day]) ?>'" title="Всего запросов: <?= $sourcesStats[$day][$type]['all'] ?>, из них успешных: <?= $sourcesStats[$day][$type]['success'] ?>">
|
||||
<?= round($sourcesStats[$day][$type]['success'] / $sourcesStats[$day][$type]['all'] * 100, 2, PHP_ROUND_HALF_DOWN) ?>%
|
||||
</td>
|
||||
<?php endif; ?>
|
||||
<?php else: ?>
|
||||
<?php if ($day == $sourcesToday): ?>
|
||||
<td>-</td>
|
||||
<?php endif; ?>
|
||||
<td>-</td>
|
||||
<?php endif; ?>
|
||||
<?php endforeach; ?>
|
||||
</tr>
|
||||
<?php endforeach; ?>
|
||||
</tbody>
|
||||
</table>
|
24
modules/admin/views/subscriptions/index.php
Normal file
24
modules/admin/views/subscriptions/index.php
Normal file
|
@ -0,0 +1,24 @@
|
|||
<?php
|
||||
/* @var $this \yii\web\View */
|
||||
|
||||
use yii\helpers\Html;
|
||||
|
||||
/* @var $dataProvider \yii\data\ActiveDataProvider */
|
||||
?>
|
||||
|
||||
<?=\yii\grid\GridView::widget([
|
||||
"dataProvider" => $dataProvider,
|
||||
"columns" => [
|
||||
"id",
|
||||
[
|
||||
"attribute" => "user_id",
|
||||
"content" => function($model) {
|
||||
return Html::a($model->user_id, ["id" => $model->user_id, "users/view"]);
|
||||
}
|
||||
],
|
||||
"transaction_id",
|
||||
"original_transaction_id",
|
||||
"tm_purchase:date",
|
||||
"tm_expires:date"
|
||||
]
|
||||
]);
|
10
modules/admin/views/tickets/_reply.php
Normal file
10
modules/admin/views/tickets/_reply.php
Normal file
|
@ -0,0 +1,10 @@
|
|||
<?php
|
||||
/* @var $this \yii\web\View */
|
||||
/* @var $reply \app\models\TicketReply */
|
||||
?>
|
||||
<li class="list-group-item">
|
||||
<div class="btn-group" style="width: 100%;">
|
||||
<button data-action="send" data-text="<?=$reply->text;?>" type="button" class="btn btn-primary col-md-3"><i class="fa fa-send"></i> Отправить</button>
|
||||
<button data-action="copy" data-text="<?=$reply->text;?>" type="button" class="btn btn-default col-md-9"><?=$reply->text;?></button>
|
||||
</div>
|
||||
</li>
|
144
modules/admin/views/tickets/index.php
Normal file
144
modules/admin/views/tickets/index.php
Normal file
|
@ -0,0 +1,144 @@
|
|||
<?php
|
||||
|
||||
/* @var $this \yii\web\View */
|
||||
/* @var $tickets \yii\data\ActiveDataProvider */
|
||||
/* @var $ticketsNotRead \yii\data\ActiveDataProvider */
|
||||
|
||||
use yii\grid\ActionColumn;
|
||||
use yii\helpers\ArrayHelper;
|
||||
use \app\models\Ticket;
|
||||
use yii\helpers\Html;
|
||||
use yii\helpers\Url;
|
||||
|
||||
$this->title = 'Список запросов';
|
||||
|
||||
echo \yii\grid\GridView::widget([
|
||||
"dataProvider" => $ticketsNotRead,
|
||||
"tableOptions" => [
|
||||
"class" => "tickets"
|
||||
],
|
||||
"rowOptions" => function ($model, $key, $index, $grid) {
|
||||
return ["onclick" => "location.href='".Url::toRoute(["tickets/view", "id" => $model->id])."'", "class" => "ticketRow"];
|
||||
},
|
||||
"caption" => "Открытые тикеты без ответа администратора",
|
||||
"layout" => "{items}\n{summary}\n{pager}",
|
||||
"columns" => [
|
||||
"id",
|
||||
"tm_create",
|
||||
[
|
||||
'attribute' => 'user_id',
|
||||
'content' => function(Ticket $model) {
|
||||
$email = ArrayHelper::getValue($model, 'user.email');
|
||||
return $email?$email:"iOS пользователь";
|
||||
}
|
||||
],
|
||||
[
|
||||
'attribute' => 'subject_id',
|
||||
'content' => function(Ticket $model) {
|
||||
return ArrayHelper::getValue(Ticket::SUBJECTS, $model->subject_id, '-');
|
||||
}
|
||||
],
|
||||
[
|
||||
'attribute' => 'subject',
|
||||
'content' => function(Ticket $model) {
|
||||
return $model->subject;
|
||||
}
|
||||
],
|
||||
[
|
||||
'attribute' => 'status',
|
||||
'content' => function(Ticket $model) {
|
||||
return ArrayHelper::getValue(Ticket::STATUSES, $model->status);
|
||||
}
|
||||
],
|
||||
[
|
||||
'class' => ActionColumn::className(),
|
||||
'template' => '{close} {reopen} {delete}',
|
||||
'buttons' => [
|
||||
'close' => function ($url, $model, $key) {
|
||||
return $model->status!=4?Html::a("Закрыть", $url, [
|
||||
"class" => "btn btn-xs btn-warning",
|
||||
"onclick" => "event.stopPropagation();"
|
||||
]):'';
|
||||
},
|
||||
'reopen' => function ($url, $model, $key) {
|
||||
return $model->status==4?Html::a("Переоткрыть", $url, [
|
||||
"class" => "btn btn-xs btn-warning",
|
||||
"onclick" => "event.stopPropagation();"
|
||||
]):'';
|
||||
},
|
||||
'delete' => function ($url, $model, $key) {
|
||||
return Html::a("Удалить", $url, [
|
||||
"class" => "btn btn-xs btn-danger",
|
||||
"onclick" => "event.stopPropagation();"
|
||||
]);
|
||||
}
|
||||
]
|
||||
],
|
||||
]
|
||||
]);?>
|
||||
<br><br>
|
||||
<?php echo \yii\grid\GridView::widget([
|
||||
"dataProvider" => $tickets,
|
||||
"tableOptions" => [
|
||||
"class" => "tickets"
|
||||
],
|
||||
"rowOptions" => function ($model, $key, $index, $grid) {
|
||||
return ["onclick" => "location.href='".Url::toRoute(["tickets/view", "id" => $model->id])."'", "class" => "ticketRow"];
|
||||
},
|
||||
"caption" => "Все остальные тикеты",
|
||||
"layout" => "{items}\n{summary}\n{pager}",
|
||||
"columns" => [
|
||||
"id",
|
||||
"tm_create",
|
||||
[
|
||||
'attribute' => 'user_id',
|
||||
'content' => function(Ticket $model) {
|
||||
$email = ArrayHelper::getValue($model, 'user.email');
|
||||
return $email?$email:"iOS пользователь";
|
||||
}
|
||||
],
|
||||
[
|
||||
'attribute' => 'subject_id',
|
||||
'content' => function(Ticket $model) {
|
||||
return ArrayHelper::getValue(Ticket::SUBJECTS, $model->subject_id, "-");
|
||||
}
|
||||
],
|
||||
[
|
||||
'attribute' => 'subject',
|
||||
'content' => function(Ticket $model) {
|
||||
return $model->subject;
|
||||
}
|
||||
],
|
||||
[
|
||||
'attribute' => 'status',
|
||||
'content' => function(Ticket $model) {
|
||||
return ArrayHelper::getValue(Ticket::STATUSES, $model->status);
|
||||
}
|
||||
],
|
||||
[
|
||||
'class' => ActionColumn::className(),
|
||||
'template' => '{close} {reopen} {delete}',
|
||||
'buttons' => [
|
||||
'close' => function ($url, $model, $key) {
|
||||
return $model->status!=4?Html::a("Закрыть", $url, [
|
||||
"class" => "btn btn-xs btn-warning",
|
||||
"onclick" => "event.stopPropagation();"
|
||||
]):'';
|
||||
},
|
||||
'reopen' => function ($url, $model, $key) {
|
||||
return $model->status==4?Html::a("Переоткрыть", $url, [
|
||||
"class" => "btn btn-xs btn-warning",
|
||||
"onclick" => "event.stopPropagation();"
|
||||
]):'';
|
||||
},
|
||||
'delete' => function ($url, $model, $key) {
|
||||
return Html::a("Удалить", $url, [
|
||||
"class" => "btn btn-xs btn-danger",
|
||||
"onclick" => "event.stopPropagation();"
|
||||
]);
|
||||
}
|
||||
]
|
||||
],
|
||||
]
|
||||
]);
|
||||
?>
|
172
modules/admin/views/tickets/view.php
Normal file
172
modules/admin/views/tickets/view.php
Normal file
|
@ -0,0 +1,172 @@
|
|||
<?php
|
||||
|
||||
/* @var $this \yii\web\View */
|
||||
/* @var $ticket \app\models\Ticket */
|
||||
/* @var $comment \app\models\TicketComment */
|
||||
/* @var $comments \yii\data\ActiveDataProvider */
|
||||
/* @var $replies \app\models\TicketReply[] */
|
||||
|
||||
use \app\models\Ticket;
|
||||
use yii\grid\GridView;
|
||||
use yii\helpers\ArrayHelper;
|
||||
use yii\helpers\Html;
|
||||
use yii\helpers\Url;
|
||||
use yii\widgets\ActiveForm;
|
||||
|
||||
$this->title = 'Запрос #' . $ticket->id;
|
||||
|
||||
$user = \app\models\User::find()->where(["id" => $ticket->user_id])->one();
|
||||
|
||||
?>
|
||||
|
||||
<div class="row">
|
||||
<div class="col-md-12">
|
||||
<div class="portlet light ">
|
||||
<div class="portlet-title tabbable-line">
|
||||
<div class="caption caption-md">
|
||||
<i class="icon-globe theme-font hide"></i>
|
||||
<span class="caption-subject font-blue-madison bold uppercase">Запрос #<?= $ticket->id ?></span>
|
||||
</div>
|
||||
</div>
|
||||
<div class="portlet-body">
|
||||
<table class="tickets">
|
||||
<tr>
|
||||
<th>Раздел</th>
|
||||
<th>Сайт</th>
|
||||
<th>Дата</th>
|
||||
<th>Тема</th>
|
||||
<th>Статус</th>
|
||||
</tr>
|
||||
<tr>
|
||||
<td><?=ArrayHelper::getValue(Ticket::SUBJECTS, $ticket->subject_id);?></td>
|
||||
<td><?=ArrayHelper::getValue($ticket, 'site.name');?></td>
|
||||
<td><?=$ticket->tm_create;?></td>
|
||||
<td><?=$ticket->subject;?></td>
|
||||
<td><?=ArrayHelper::getValue(Ticket::STATUSES, $ticket->status);?></td>
|
||||
</tr>
|
||||
<?php if(trim($ticket->url) != ""): ?>
|
||||
<tr>
|
||||
<td colspan="5"><?=$ticket->url;?></td>
|
||||
</tr>
|
||||
<?php endif; ?>
|
||||
</table>
|
||||
|
||||
<br />
|
||||
|
||||
<div class="clientticketreplyheader">
|
||||
<table>
|
||||
<tr><td style="padding: 5px; font-size: 13px;">
|
||||
<?php if($ticket->user): ?>
|
||||
<?php $email = $ticket->user->email;?>
|
||||
<strong style="font-weight: bold"><?=Html::a($email?$email:"iOS пользователь", ["users/view", "id" => $ticket->user_id]);?></strong><?=$ticket->user->comment?", ".$ticket->user->comment:"";?><br>Клиент, <?=$ticket->user->ip;?>
|
||||
<?php else: ?>
|
||||
<strong>iOS</strong>
|
||||
<?php endif;?>
|
||||
</td><td><?=$ticket->is_payed?Html::tag("b", "ОПЛАЧЕНО"):"";?></td></tr>
|
||||
</table>
|
||||
</div>
|
||||
<div class="clientticketreply">
|
||||
<?=nl2br($ticket->text);?>
|
||||
</div>
|
||||
|
||||
<br />
|
||||
<?php foreach ($comments->getModels() as $c): ?>
|
||||
<?php if(ArrayHelper::getValue($c, 'user.is_admin', false)): ?>
|
||||
<div class="adminticketreplyheader">
|
||||
<table style="width: 100%">
|
||||
<tr><td style="padding: 5px; font-size: 13px;"><strong style="font-weight: bold">Администратор</strong></td><td style="padding: 5px; font-size: 13px; text-align: right;"><?=$c->tm_create;?></td></tr>
|
||||
</table>
|
||||
</div>
|
||||
<div class="adminticketreply">
|
||||
<?=nl2br($c->text);?>
|
||||
<p style="margin-top: 5px; margin-bottom: 0; text-align: right; font-size: 10px;"><?=Html::a("Удалить", ["tickets/comment-delete", "id" => $c->id]);?></p>
|
||||
</div>
|
||||
<?php else: ?>
|
||||
<div class="clientticketreplyheader">
|
||||
<table style="width: 100%">
|
||||
<tr><td style="padding: 5px; font-size: 13px;"><strong style="font-weight: bold"><?=Html::a($ticket->user->email, ["users/view", "id" => $ticket->user_id]);?></strong><br>Клиент</td><td style="padding: 5px; font-size: 13px; text-align: right;"><?=$c->tm_create;?></td></tr>
|
||||
</table>
|
||||
</div>
|
||||
<div class="clientticketreply">
|
||||
<?=nl2br($c->text);?>
|
||||
<p style="margin-top: 5px; margin-bottom: 0; text-align: right; font-size: 10px;"><?=Html::a("Удалить", ["tickets/comment-delete", "id" => $c->id]);?></p>
|
||||
</div>
|
||||
<?php endif; ?>
|
||||
<br />
|
||||
<?php endforeach; ?>
|
||||
|
||||
<?php if($ticket->status != 4): ?>
|
||||
<?=Html::a("Задача на разработку", ["tickets/develop", "id" => $ticket->id], ["class" => "btn btn-primary"]);?>
|
||||
<?=Html::a("Игнорировать тикет", ["tickets/ignore", "id" => $ticket->id], ["class" => "btn btn-warning"]);?>
|
||||
<?=Html::a("Закрыть тикет", ["tickets/close", "id" => $ticket->id], ["class" => "btn btn-warning"]);?>
|
||||
<?=Html::a("Удалить тикет", ["tickets/delete", "id" => $ticket->id], ["class" => "btn btn-danger"]);?>
|
||||
<br /><br />
|
||||
<div class="row">
|
||||
<div class="col-md-6">
|
||||
<?php $form = ActiveForm::begin([
|
||||
"action" => ["tickets/comment", "id" => $ticket->id]
|
||||
]); ?>
|
||||
<?= $form->field($comment, "text")->textarea(["rows" => 10]); ?>
|
||||
<input value="Добавить" type="submit" class="ticket">
|
||||
<?php ActiveForm::end(); ?>
|
||||
</div>
|
||||
<div class="col-md-6">
|
||||
<label class="control-label">Быстрые ответы</label>
|
||||
<ul class="list-group">
|
||||
<?php foreach ($replies as $reply): ?>
|
||||
<li class="list-group-item">
|
||||
<div class="btn-group" style="width: 100%;">
|
||||
<button data-action="send" data-text="<?=$reply->text;?>" type="button" class="btn btn-primary col-md-3"><i class="fa fa-send"></i> Отправить</button>
|
||||
<button data-action="copy" data-text="<?=$reply->text;?>" type="button" class="btn btn-default col-md-9" style="overflow: hidden; text-overflow: ellipsis"><?=$reply->text;?></button>
|
||||
</div>
|
||||
</li>
|
||||
<?php endforeach; ?>
|
||||
<li class="list-group-item" id="newReply">
|
||||
<div class="input-group">
|
||||
<input class="form-control" id="replyText" placeholder="Введите быстрый ответ" type="text">
|
||||
<span class="input-group-btn">
|
||||
<button class="btn red" id="replyAdd" type="button">Добавить</button>
|
||||
</span>
|
||||
</div>
|
||||
</li>
|
||||
</ul>
|
||||
</div>
|
||||
</div>
|
||||
<?php else: ?>
|
||||
<?=Html::a("Переоткрыть", ["tickets/reopen", "id" => $ticket->id], ["class" => "btn btn-warning"]);?>
|
||||
<?=Html::a("Удалить тикет", ["tickets/delete", "id" => $ticket->id], ["class" => "btn btn-danger"]);?>
|
||||
<?php endif; ?>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<?php if(false):?><script><?php endif; ?>
|
||||
<?php ob_start(); ?>
|
||||
|
||||
$('#replyAdd').click(function() {
|
||||
var text = $('#replyText').val();
|
||||
if(text.trim() === '') {
|
||||
return false;
|
||||
}
|
||||
$.post('<?=Url::toRoute(["tickets/add-reply", "id" => $ticket->id]);?>', {
|
||||
text: text
|
||||
}, function(response) {
|
||||
if(response !== '') {
|
||||
$(response).insertBefore('#newReply');
|
||||
}
|
||||
}, 'html');
|
||||
});
|
||||
|
||||
$( document ).on( "click", "[data-action=\"send\"]", function() {
|
||||
var text = $(this).data("text");
|
||||
$('#<?=Html::getInputId($comment, "text");?>').val(text);
|
||||
$('input.ticket').click();
|
||||
});
|
||||
|
||||
$( document ).on( "click", "[data-action=\"copy\"]", function() {
|
||||
var text = $(this).data("text");
|
||||
$('#<?=Html::getInputId($comment, "text");?>').val(text);
|
||||
});
|
||||
|
||||
<?php $js = ob_get_contents(); ob_end_clean(); $this->registerJs($js); ?>
|
55
modules/admin/views/tokens/index.php
Normal file
55
modules/admin/views/tokens/index.php
Normal file
|
@ -0,0 +1,55 @@
|
|||
<?php
|
||||
|
||||
/* @var $this \yii\web\View */
|
||||
/* @var $model \app\models\Token */
|
||||
/* @var $dataProvider \yii\data\ActiveDataProvider */
|
||||
|
||||
use yii\grid\GridView;
|
||||
use yii\helpers\Html;
|
||||
use yii\helpers\Url;
|
||||
use yii\widgets\ActiveForm;
|
||||
use app\models\Token;
|
||||
|
||||
$this->title = 'Токены';
|
||||
|
||||
?>
|
||||
|
||||
<?php $form = ActiveForm::begin(); ?>
|
||||
|
||||
<?= $form->field($model, 'token')->textInput() ?>
|
||||
<?= $form->field($model, 'type')->dropDownList(Token::getTypes()) ?>
|
||||
<?= $form->field($model, 'server_id')->textInput(['type' => 'number']) ?>
|
||||
<?= Html::submitButton('Добавить', ['class' => 'btn btn-success']) ?>
|
||||
|
||||
<?php ActiveForm::end(); ?>
|
||||
|
||||
<hr>
|
||||
|
||||
<?= GridView::widget([
|
||||
'dataProvider' => $dataProvider,
|
||||
'columns' => [
|
||||
'id',
|
||||
[
|
||||
'attribute' => 'type',
|
||||
'value' => function (Token $model) {
|
||||
return Token::getTypeName($model->type);
|
||||
}
|
||||
],
|
||||
'server_id',
|
||||
'token',
|
||||
[
|
||||
'attribute' => 'status',
|
||||
'value' => function (Token $model) {
|
||||
return Token::getStatusName($model->status);
|
||||
}
|
||||
],
|
||||
'tm_ban',
|
||||
[
|
||||
'format' => 'raw',
|
||||
'header' => 'Действия',
|
||||
'value' => function(Token $model) {
|
||||
return '<a href="' . Url::to(['tokens/delete', 'id' => $model->id]) . '" onclick="return confirm(\'Удалить токен?\')"><i class="icon-trash"></i></a>';
|
||||
}
|
||||
]
|
||||
]
|
||||
]) ?>
|
245
modules/admin/views/users/index.php
Normal file
245
modules/admin/views/users/index.php
Normal file
|
@ -0,0 +1,245 @@
|
|||
<?php
|
||||
|
||||
/* @var $this \yii\web\View */
|
||||
/* @var $dataProvider \yii\data\ActiveDataProvider */
|
||||
/* @var $registrations array */
|
||||
/* @var $tm_start string */
|
||||
/* @var $tm_end string */
|
||||
/* @var $email string */
|
||||
/* @var $registrationConfirms array */
|
||||
/* @var $isVIP boolean */
|
||||
/* @var $isAdmin boolean */
|
||||
/* @var $withChecks boolean */
|
||||
|
||||
use yii\grid\ActionColumn;
|
||||
use yii\grid\GridView;
|
||||
use yii\helpers\ArrayHelper;
|
||||
use yii\helpers\Html;
|
||||
use yii\helpers\Url;
|
||||
use yii\jui\DatePicker;
|
||||
use app\models\User;
|
||||
use app\models\Payment;
|
||||
|
||||
$this->title = 'Пользователи';
|
||||
|
||||
?>
|
||||
|
||||
<div class="portlet light bordered">
|
||||
<div class="portlet-title">
|
||||
<div class="caption">Фильтры</div>
|
||||
</div>
|
||||
<div class="portlet-body form">
|
||||
<?= Html::beginForm(['users/index'], 'GET') ?>
|
||||
<div class="input-group input-medium">
|
||||
<span class="input-group-addon">С</span>
|
||||
<?= DatePicker::widget([
|
||||
'name' => 'tm_start',
|
||||
'value' => $tm_start,
|
||||
'language' => 'ru',
|
||||
'dateFormat' => 'yyyy-MM-dd',
|
||||
'options' => ['class' => 'form-control input-small']
|
||||
]) ?>
|
||||
<span class="input-group-addon">по</span>
|
||||
<?= DatePicker::widget([
|
||||
'name' => 'tm_end',
|
||||
'value' => $tm_end,
|
||||
'language' => 'ru',
|
||||
'dateFormat' => 'yyyy-MM-dd',
|
||||
'options' => ['class' => 'form-control input-small']
|
||||
]) ?>
|
||||
<?= Html::hiddenInput('is_vip', $isVIP) ?>
|
||||
<?= Html::hiddenInput('is_admin', $isAdmin) ?>
|
||||
<?= Html::hiddenInput('with_checks', $withChecks) ?>
|
||||
<span class="input-group-addon"></span>
|
||||
<button type="submit" class="form-control btn btn-primary input-small">Показать</button>
|
||||
</div>
|
||||
<?= Html::endForm() ?>
|
||||
|
||||
<hr>
|
||||
|
||||
<?= Html::beginForm(['users/index'], 'GET') ?>
|
||||
<div class="input-group input-medium">
|
||||
<?= Html::textInput('email', $email, ['class' => 'form-control', 'style' => 'width: 370px;', 'placeholder' => 'Email пользователя']) ?>
|
||||
<?= Html::hiddenInput('is_vip', $isVIP) ?>
|
||||
<?= Html::hiddenInput('is_admin', $isAdmin) ?>
|
||||
<?= Html::hiddenInput('with_checks', $withChecks) ?>
|
||||
<span class="input-group-addon"></span>
|
||||
<button type="submit" class="form-control btn btn-primary input-small">Показать</button>
|
||||
</div>
|
||||
<?= Html::endForm() ?>
|
||||
|
||||
<hr>
|
||||
|
||||
<?= Html::a('VIP', ['users/index',
|
||||
'tm_start' => $tm_start,
|
||||
'tm_end' => $tm_end,
|
||||
'email' => $email,
|
||||
'is_vip' => !$isVIP,
|
||||
'is_admin' => $isAdmin,
|
||||
'with_checks' => $withChecks
|
||||
], ['class' => $isVIP ? 'btn btn-success' : 'btn btn-primary', 'style' => 'width: 145px;']) ?>
|
||||
<?= Html::a('Администратор', ['users/index',
|
||||
'tm_start' => $tm_start,
|
||||
'tm_end' => $tm_end,
|
||||
'email' => $email,
|
||||
'is_vip' => $isVIP,
|
||||
'is_admin' => !$isAdmin,
|
||||
'with_checks' => $withChecks
|
||||
], ['class' => $isAdmin ? 'btn btn-success' : 'btn btn-primary', 'style' => 'width: 170px;']) ?>
|
||||
<?= Html::a('Есть проверки', ['users/index',
|
||||
'tm_start' => $tm_start,
|
||||
'tm_end' => $tm_end,
|
||||
'email' => $email,
|
||||
'is_vip' => $isVIP,
|
||||
'is_admin' => $isAdmin,
|
||||
'with_checks' => !$withChecks
|
||||
], ['class' => $withChecks ? 'btn btn-success' : 'btn btn-primary', 'style' => 'width: 220px;']) ?>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<?php if (!$email): ?>
|
||||
<div class="row">
|
||||
<div class="col-md-4">
|
||||
<table class="table table-striped table-bordered">
|
||||
<tbody>
|
||||
<?php foreach ($registrations as $type): ?>
|
||||
<tr>
|
||||
<th><?= $type['source'] ?$type['source']: 'email' ?></th>
|
||||
<td><?= $type['count'] ?></td>
|
||||
</tr>
|
||||
<?php endforeach; ?>
|
||||
</tbody>
|
||||
</table>
|
||||
</div>
|
||||
</div>
|
||||
<?php endif; ?>
|
||||
|
||||
<?= GridView::widget([
|
||||
'dataProvider' => $dataProvider,
|
||||
'rowOptions' => function(User $model) {
|
||||
if ($model->is_confirm) return ['class' => 'success'];
|
||||
},
|
||||
'columns' => [
|
||||
[
|
||||
'attribute' => 'id',
|
||||
'format' => 'raw',
|
||||
'value' => function($model) {
|
||||
return Html::a($model->id, ['users/view', 'id' => $model->id]);
|
||||
}
|
||||
],
|
||||
[
|
||||
'format' => 'raw',
|
||||
'attribute' => 'email',
|
||||
'value' => function(User $model) {
|
||||
$socials = [];
|
||||
|
||||
foreach ($model->auth as $a) {
|
||||
$link = null;
|
||||
|
||||
switch ($a->source) {
|
||||
case 'vk':
|
||||
$link = 'https://vk.com/id' . $a->source_id;
|
||||
break;
|
||||
case 'facebook':
|
||||
$link = 'https://facebook.com/' . $a->source_id;
|
||||
break;
|
||||
}
|
||||
|
||||
if (is_null($link)) {
|
||||
$source = $a->source;
|
||||
|
||||
if ($source == 'google') {
|
||||
$source .= ' (' . count($model->contacts) . ')';
|
||||
}
|
||||
|
||||
$socials[] = $source;
|
||||
} else {
|
||||
$socials[] = Html::a($a->source, $link);
|
||||
}
|
||||
}
|
||||
|
||||
$username = "";
|
||||
|
||||
if(trim($model->email) != "") $username = $model->email;
|
||||
else {
|
||||
if(preg_match("/-/", $model->uuid)) {
|
||||
$username = "iOS (".$model->uuid.")";
|
||||
} else {
|
||||
$username = "Android (".$model->uuid.")";
|
||||
}
|
||||
}
|
||||
|
||||
return '<a href="' . Url::toRoute(['users/view', 'id' => $model->id]) . '">' . $username . '</a><br>' . join(', ', $socials);
|
||||
}
|
||||
],
|
||||
'checks',
|
||||
[
|
||||
'header' => 'Общая сумма платежей',
|
||||
'content' => function(User $model) {
|
||||
return array_sum(array_map(function(Payment $payment) { return $payment->sum; }, $model->payments));
|
||||
}
|
||||
],
|
||||
[
|
||||
'header' => 'Дата регистрации',
|
||||
'content' => function($model) {
|
||||
return join("<br />", [
|
||||
\Yii::$app->formatter->asDate($model->tm_create, 'dd.MM.yyyy'),
|
||||
$model->ip
|
||||
]);
|
||||
}
|
||||
],
|
||||
[
|
||||
'header' => 'Поисков<br>всего',
|
||||
'content' => function($model) {
|
||||
return count($model->requests);
|
||||
}
|
||||
],
|
||||
[
|
||||
'header' => '%',
|
||||
'content' => function($model) {
|
||||
$index = 0;
|
||||
foreach($model->requests as $r) {
|
||||
$index += array_sum(ArrayHelper::getColumn($r->results, 'index'));
|
||||
}
|
||||
return round(count($model->requests) ? ($index / count($model->requests)) : 0, 2);
|
||||
}
|
||||
],
|
||||
[
|
||||
'header' => 'Поисков<br>за сегодня',
|
||||
'content' => function($model) {
|
||||
return count(array_filter($model->requests, function($r) {
|
||||
return date('Y-m-d', strtotime($r->tm)) == date('Y-m-d');
|
||||
}));
|
||||
}
|
||||
],
|
||||
[
|
||||
'header' => '%<br>за сегодня',
|
||||
'content' => function($model) {
|
||||
$index = 0;
|
||||
|
||||
$requests = array_filter($model->requests, function($r) {
|
||||
return date('Y-m-d', strtotime($r->tm)) == date('Y-m-d');
|
||||
});
|
||||
|
||||
foreach($requests as $r) {
|
||||
$index += array_sum(ArrayHelper::getColumn($r->results, 'index'));
|
||||
}
|
||||
|
||||
return round(count($requests) ? ($index / count($requests)) : 0, 2);
|
||||
}
|
||||
],
|
||||
'comment',
|
||||
[
|
||||
'class' => ActionColumn::className(),
|
||||
'template' => '{set-vip} {set-admin}',
|
||||
'buttons' => [
|
||||
'set-vip' => function ($url, $model, $key) {
|
||||
return $model->is_vip ? Html::a('Убрать VIP', ['set-vip', 'id' => $model->id], ['class' => 'btn btn-danger']) : Html::a('Поставить VIP', ['set-vip', 'id' => $model->id], ['class' => 'btn btn-success']);
|
||||
},
|
||||
'set-admin' => function ($url, $model, $key) {
|
||||
return $model->is_admin ? Html::a('Убрать админа', ['set-admin', 'id' => $model->id], ['class' => 'btn btn-danger']) : Html::a('Поставить админа', ['set-admin', 'id' => $model->id], ['class' => 'btn btn-success']);
|
||||
}
|
||||
]
|
||||
],
|
||||
],
|
||||
]);
|
209
modules/admin/views/users/view.php
Normal file
209
modules/admin/views/users/view.php
Normal file
|
@ -0,0 +1,209 @@
|
|||
<?php
|
||||
|
||||
/* @var $this \yii\web\View */
|
||||
/* @var $model \app\models\User */
|
||||
/* @var $history \yii\data\ActiveDataProvider */
|
||||
/* @var $payments \yii\data\ActiveDataProvider */
|
||||
/* @var $auth \yii\data\ActiveDataProvider */
|
||||
|
||||
use yii\grid\GridView;
|
||||
use yii\helpers\ArrayHelper;
|
||||
use yii\helpers\Json;
|
||||
use yii\helpers\Html;
|
||||
use app\components\SearchHelper;
|
||||
use app\models\Payment;
|
||||
use app\models\ResultCache;
|
||||
use app\models\RequestResult;
|
||||
use app\models\SearchRequest;
|
||||
|
||||
$this->title = 'Пользователь #' . $model->id;
|
||||
|
||||
$index = 0;
|
||||
|
||||
foreach($model->requests as $r) {
|
||||
$index += array_sum(ArrayHelper::getColumn($r->results, 'index'));
|
||||
}
|
||||
|
||||
$index = round(count($model->requests) ? ($index / count($model->requests)) : 0, 2);
|
||||
|
||||
|
||||
$indexToday = 0;
|
||||
|
||||
$requests = array_filter($model->requests, function($r) {
|
||||
return date('Y-m-d', strtotime($r->tm)) == date('Y-m-d');
|
||||
});
|
||||
|
||||
foreach($requests as $r) {
|
||||
$indexToday += array_sum(ArrayHelper::getColumn($r->results, 'index'));
|
||||
}
|
||||
|
||||
$indexToday = round(count($requests) ? ($indexToday / count($requests)) : 0, 2);
|
||||
|
||||
?>
|
||||
|
||||
<div class="row">
|
||||
<div class="col-md-12">
|
||||
<div class="portlet light ">
|
||||
<div class="portlet-title tabbable-line">
|
||||
<div class="caption caption-md">
|
||||
<i class="icon-globe theme-font hide"></i>
|
||||
<span class="caption-subject font-blue-madison bold uppercase">Пользователь #<?= $model->id ?></span>
|
||||
</div>
|
||||
</div>
|
||||
<div class="portlet-body">
|
||||
<p>E-mail: <?= $model->email ?>, Пароль: <?= $model->password ?>, Дата регистрации: <?= $model->tm_create ?></p>
|
||||
<p><b><?= Yii::t('app', 'Остаток: {n, plural, =0{проверок нет} one{# проверка} few{# проверки} many{# проверок} other{# проверок}}', ['n' => $model->checks]) ?>, Общая сумма платежей: <?= array_sum(array_map(function(Payment $payment) { return $payment->sum; }, $model->payments)) ?> рублей</b></p>
|
||||
<p>Поисков всего: <?= count($model->requests) ?>, Средний индекс поиска: <?= $index ?>%, Поисков за сегодня: <?= count(array_filter($model->requests, function($r) {
|
||||
return date('Y-m-d', strtotime($r->tm)) == date('Y-m-d');
|
||||
})) ?>, Средний индекс поиска за сегодня: <?= $indexToday ?>%</p>
|
||||
|
||||
<?php if ($success = \Yii::$app->session->getFlash('success')): ?>
|
||||
<div class="alert alert-success"><strong><?= $success ?></strong></div>
|
||||
<?php endif; ?>
|
||||
|
||||
<div class="row">
|
||||
<div class="col-md-3" style="margin-top: 25px;">
|
||||
<?= Html::beginForm('', 'POST', ['class' => 'form-inline']) ?>
|
||||
<div class="form-group">
|
||||
<input name="checks" value="10" class="form-control input-small">
|
||||
<button type="submit" class="btn btn-primary" style="display: inline-block">Начислить</button>
|
||||
</div>
|
||||
<?= Html::endForm() ?>
|
||||
|
||||
<?= $model->is_vip ? Html::a('Убрать VIP', ['set-vip', 'id' => $model->id], ['class' => 'btn btn-danger', 'style' => 'margin-top: 15px;']) : Html::a('Поставить VIP', ['set-vip', 'id' => $model->id], ['class' => 'btn btn-success', 'style' => 'margin-top: 15px;']) ?>
|
||||
|
||||
<?= $model->is_admin ? Html::a('Убрать админа', ['set-admin', 'id' => $model->id], ['class' => 'btn btn-danger', 'style' => 'margin-top: 15px;']) : Html::a('Поставить админа', ['set-admin', 'id' => $model->id], ['class' => 'btn btn-success', 'style' => 'margin-top: 15px;']) ?>
|
||||
</div>
|
||||
|
||||
<div class="col-md-4">
|
||||
<?php $form = \yii\widgets\ActiveForm::begin(['method' => 'POST']); ?>
|
||||
<?= $form->field($model, 'comment')->textInput() ?>
|
||||
<p><?= Html::submitButton('Сохранить комментарий', ['class' => 'btn btn-primary']) ?></p>
|
||||
<?php \yii\widgets\ActiveForm::end(); ?>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<hr>
|
||||
|
||||
<h2>Платежи</h2>
|
||||
|
||||
<?= GridView::widget([
|
||||
'dataProvider' => $payments,
|
||||
'columns' => [
|
||||
'id',
|
||||
'tm',
|
||||
'sum',
|
||||
'amount',
|
||||
[
|
||||
'header' => 'Тип',
|
||||
'attribute' => 'type_id',
|
||||
'content' => function(Payment $model) {
|
||||
switch ($model->type_id) {
|
||||
case Payment::TYPE_QIWI: return "Qiwi Wallet";
|
||||
case Payment::TYPE_YANDEX: return "Яндекс.Деньги Card";
|
||||
case Payment::TYPE_WEBMONEY: return "WebMoney ";
|
||||
case Payment::TYPE_QIWI_TERMINAL: return "Qiwi терминал";
|
||||
case Payment::TYPE_YANDEX_WALLET: return "Яндекс.Деньги Wallet";
|
||||
}
|
||||
return "";
|
||||
}
|
||||
],
|
||||
'operation_id',
|
||||
'operation_label'
|
||||
]
|
||||
]) ?>
|
||||
|
||||
<hr>
|
||||
|
||||
<h2>История поиска</h2>
|
||||
|
||||
<?= GridView::widget([
|
||||
'dataProvider' => $history,
|
||||
'columns' => [
|
||||
'tm',
|
||||
[
|
||||
'format' => 'raw',
|
||||
'attribute' => 'phone',
|
||||
'value' => function(SearchRequest $model) {
|
||||
$phone = preg_replace('/^7/', '8', $model->phone);
|
||||
return '<a href="/' . $phone . '">' . $phone . '</a>';
|
||||
}
|
||||
],
|
||||
[
|
||||
'attribute' => 'ip',
|
||||
'value' => function(SearchRequest $model) {
|
||||
return join(', ', [$model->ip, SearchHelper::City($model->ip)]);
|
||||
}
|
||||
],
|
||||
[
|
||||
'header' => 'Индекс поиска',
|
||||
'value' => function(SearchRequest $model) {
|
||||
if ($model->is_payed) {
|
||||
return array_sum(array_map(function(RequestResult $result) {
|
||||
return $result->index;
|
||||
}, $model->results));
|
||||
}
|
||||
|
||||
$names = $photos = [];
|
||||
$caches = RequestResult::find()
|
||||
->where(['request_id' => $model->id])
|
||||
->andWhere(['not in', 'type_id', ResultCache::inactiveTypes()])->all();
|
||||
|
||||
foreach ($caches as $c) {
|
||||
$data = Json::decode($c->data);
|
||||
if (!$data) continue;
|
||||
$names = ArrayHelper::merge($names, ArrayHelper::getColumn($data, 'name'));
|
||||
$photos = ArrayHelper::merge($photos, ArrayHelper::getColumn($data, 'photo'));
|
||||
}
|
||||
|
||||
$names = array_filter($names);
|
||||
$photos = array_filter($photos);
|
||||
$finds = [];
|
||||
|
||||
if ($names) $finds[] = 'Имя';
|
||||
if ($photos) $finds[] = 'Фото';
|
||||
|
||||
return $finds ? join(', ', $finds) : 'Ничего не найдено';
|
||||
}
|
||||
],
|
||||
[
|
||||
'header' => 'Стоимость',
|
||||
'value' => function(SearchRequest $model) {
|
||||
$type = '';
|
||||
|
||||
switch ($model->is_payed) {
|
||||
case 0: $type = 'Бесплатный (нет проверок)'; break;
|
||||
case 1: $type = 'Платный'; break;
|
||||
case 2: $type = 'Бесплатный (не нашли)'; break;
|
||||
}
|
||||
|
||||
if (!$model->user_id) $type .= ', Аноним';
|
||||
|
||||
return $type;
|
||||
}
|
||||
],
|
||||
]
|
||||
]) ?>
|
||||
|
||||
<hr>
|
||||
|
||||
<h2>Лог авторизаций</h2>
|
||||
|
||||
<?= GridView::widget([
|
||||
'dataProvider' => $auth,
|
||||
'columns' => [
|
||||
'id',
|
||||
[
|
||||
'attribute' => 'site_id',
|
||||
'value' => function (\app\models\UserAuthLog $model) {
|
||||
return ArrayHelper::getValue($model, 'site.name');
|
||||
}
|
||||
],
|
||||
'ip',
|
||||
'tm'
|
||||
]
|
||||
]) ?>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
22
modules/admin/views/wallets/_form.php
Normal file
22
modules/admin/views/wallets/_form.php
Normal file
|
@ -0,0 +1,22 @@
|
|||
<?php
|
||||
|
||||
/* @var $this \yii\web\View */
|
||||
/* @var $model \app\models\Wallet */
|
||||
|
||||
use yii\helpers\ArrayHelper;
|
||||
use yii\helpers\Html;
|
||||
use yii\widgets\ActiveForm;
|
||||
use app\models\Site;
|
||||
use app\models\Wallet;
|
||||
|
||||
$form = ActiveForm::begin(['method' => 'POST']);
|
||||
echo $form->field($model, 'type_id')->dropDownList(Wallet::getWalletTypes());
|
||||
echo $form->field($model, 'site_id')->dropDownList(ArrayHelper::map(Site::find()->all(), 'id', 'name'), ['prompt' => 'Нет']);
|
||||
echo $form->field($model, 'wallet_id');
|
||||
echo $form->field($model, 'login');
|
||||
echo $form->field($model, 'password');
|
||||
echo $form->field($model, 'phone');
|
||||
echo $form->field($model, 'status')->checkbox();
|
||||
echo $form->field($model, 'comment')->textarea();
|
||||
echo Html::submitButton('Сохранить', ['class' => 'btn btn-success']);
|
||||
$form::end();
|
8
modules/admin/views/wallets/create.php
Normal file
8
modules/admin/views/wallets/create.php
Normal file
|
@ -0,0 +1,8 @@
|
|||
<?php
|
||||
|
||||
/* @var $this \yii\web\View */
|
||||
/* @var $model \app\models\Wallet */
|
||||
|
||||
$this->title = 'Добавление кошелька';
|
||||
|
||||
echo $this->render('_form', compact('model'));
|
83
modules/admin/views/wallets/index.php
Normal file
83
modules/admin/views/wallets/index.php
Normal file
|
@ -0,0 +1,83 @@
|
|||
<?php
|
||||
|
||||
/* @var $this \yii\web\View */
|
||||
/* @var $dataProvider \yii\data\ActiveDataProvider */
|
||||
|
||||
use yii\grid\ActionColumn;
|
||||
use yii\grid\GridView;
|
||||
use yii\helpers\ArrayHelper;
|
||||
use yii\helpers\Html;
|
||||
use yii\helpers\Url;
|
||||
use app\models\Wallet;
|
||||
|
||||
$this->title = 'Кошельки';
|
||||
|
||||
$total = array_sum(ArrayHelper::getColumn($dataProvider->models, 'balance'));
|
||||
?>
|
||||
|
||||
<?= Html::tag('p', Html::a('Добавить кошелёк', ['wallets/create'], ['class' => 'btn btn-primary'])) ?>
|
||||
|
||||
<b>Всего: <?= Yii::$app->formatter->asCurrency($total, 'RUB') ?></b><br><br>
|
||||
|
||||
<?= GridView::widget([
|
||||
'dataProvider' => $dataProvider,
|
||||
'rowOptions' => function($model) {
|
||||
if (is_null($model->tm_last_transaction_out)) return [];
|
||||
if (time() - strtotime($model->tm_last_transaction_out) > 60 * 60 * 48) return ['class' => 'danger'];
|
||||
return ['class' => 'success'];
|
||||
},
|
||||
'columns' => [
|
||||
[
|
||||
'attribute' => 'type_id',
|
||||
'header' => 'Тип / сайт',
|
||||
'content' => function($model) {
|
||||
$type = "";
|
||||
switch ($model->type_id) {
|
||||
case Wallet::TYPE_YANDEX: $type = 'Яндекс.Деньги'; break;
|
||||
case Wallet::TYPE_QIWI: $type = 'Qiwi кошелек'; break;
|
||||
}
|
||||
return join("<br />", [$type, ArrayHelper::getValue($model, ['site', 'name'])]);
|
||||
}
|
||||
],
|
||||
[
|
||||
'attribute' => 'wallet_id',
|
||||
'header' => 'Кошелек / номер телефона',
|
||||
'content' => function($model) {
|
||||
$content = [$model->wallet_id];
|
||||
if($model->type_id == Wallet::TYPE_YANDEX) {
|
||||
$content[] = $model->phone;
|
||||
}
|
||||
return join("<br />", $content);
|
||||
}
|
||||
],
|
||||
[
|
||||
"header" => 'Логин / пароль',
|
||||
"content" => function($model) {
|
||||
return join("<br />", [$model->login, $model->password]);
|
||||
}
|
||||
],
|
||||
[
|
||||
"attribute" => 'balance',
|
||||
"content" => function($model) {
|
||||
return Yii::$app->formatter->asCurrency($model->balance, 'RUB');
|
||||
}
|
||||
],
|
||||
'tm_last_balance',
|
||||
[
|
||||
"header" => 'Приход / Расход',
|
||||
'content' => function($model) {
|
||||
return join("<br />", [Yii::$app->formatter->asRelativeTime($model->tm_last_transaction), Yii::$app->formatter->asRelativeTime($model->tm_last_transaction_out)]);
|
||||
}
|
||||
],
|
||||
[
|
||||
"header" => 'Комментарий',
|
||||
'content' => function($model) {
|
||||
return nl2br($model->comment);
|
||||
}
|
||||
],
|
||||
[
|
||||
'class' => ActionColumn::className(),
|
||||
'template' => '{view}',
|
||||
],
|
||||
],
|
||||
]) ?>
|
8
modules/admin/views/wallets/view.php
Normal file
8
modules/admin/views/wallets/view.php
Normal file
|
@ -0,0 +1,8 @@
|
|||
<?php
|
||||
|
||||
/* @var $this \yii\web\View */
|
||||
/* @var $model \app\models\Wallet */
|
||||
|
||||
$this->title = 'Редактирование кошелька';
|
||||
|
||||
echo $this->render('_form', compact('model'));
|
Loading…
Add table
Add a link
Reference in a new issue