portal.mkgtu.ru/backend/controllers/ManageController.php

441 lines
16 KiB
PHP
Raw Normal View History

2024-03-28 09:51:45 +03:00
<?php
namespace backend\controllers;
use backend\components\ReportsPreprocessor;
use backend\components\XLSXWriter;
use backend\models\ManageAC;
use backend\models\ManagerAllowChat;
use backend\models\ManagerNotificationsConfigurator;
use backend\models\RBACAuthAssignment;
use backend\models\RBACAuthItem;
use common\models\dictionary\StoredReferenceType\StoredAdmissionCampaignReferenceType;
use common\models\dictionary\StoredReferenceType\StoredDirectionReferenceType;
use common\models\User;
use common\modules\abiturient\models\bachelor\ApplicationType;
use common\modules\abiturient\models\bachelor\BachelorApplication;
use common\modules\abiturient\models\bachelor\ModerateHistory;
use Yii;
use yii\base\DynamicModel;
use yii\data\ActiveDataProvider;
use yii\db\Query;
use yii\filters\AccessControl;
use yii\helpers\ArrayHelper;
use yii\web\Controller;
class ManageController extends Controller
{
public function behaviors()
{
return [
'access' => [
'class' => AccessControl::class,
'rules' => [[
'allow' => true,
'roles' => [User::ROLE_ADMINISTRATOR]
]],
],
];
}
public function actionModerateReport()
{
$model = new DynamicModel(['username', 'campaign', 'timeStart', 'timeStop']);
$model->addRule(
[
'username',
'campaign',
'timeStart',
'timeStop'
],
'string'
);
$tnUser = User::tableName();
$tnModerateHistory = ModerateHistory::tableName();
if ($model->load(Yii::$app->request->post()) && $model->validate()) {
$query = ModerateHistory::getModerateQuery(
$model->username,
$model->campaign,
$model->timeStart,
$model->timeStop
);
$query = $query
->select(["{$tnModerateHistory}.user_id", "{$tnUser}.username", "{$tnUser}.id"])
->distinct();
} else {
$query = (new Query())
->from("{$tnModerateHistory}")
->select(["{$tnModerateHistory}.user_id", "{$tnUser}.username", "{$tnUser}.id"])
->distinct()
->innerJoin("{$tnUser}", "{$tnUser}.id = {$tnModerateHistory}.user_id")
->orderBy("{$tnUser}.id");
}
$dataProvider = new ActiveDataProvider([
'query' => $query,
'pagination' => ['pageSize' => 100]
]);
$applicationType = ApplicationType::find()->all();
$applicationTypeArray = [];
if (!empty($applicationType)) {
$applicationTypeArray = ArrayHelper::map($applicationType, 'campaign_id', 'name');
}
$moderateName = User::findActive()
->andWhere([
'in',
'id',
RBACAuthAssignment::find()
->select(['user_id'])
->where(['in', 'item_name', ['manager', 'administrator']])
])
->all();
$moderateNameArray = [];
if (!empty($moderateName)) {
$moderateNameArray = ArrayHelper::map($moderateName, 'username', 'username');
}
return $this->render(
'moderate_report',
[
'model' => $model,
'dataProvider' => $dataProvider,
'moderateNameArray' => $moderateNameArray,
'applicationTypeArray' => $applicationTypeArray,
]
);
}
public function actionReport()
{
$model = new DynamicModel(['username', 'campaign', 'timeStart', 'timeStop']);
$model->addRule(
[
'username',
'campaign',
'timeStart',
'timeStop'
],
'string'
);
$tnUser = User::tableName();
$thModerateHistory = ModerateHistory::tableName();
$thRBACAuthAssignment = RBACAuthAssignment::tableName();
if ($model->load(Yii::$app->request->post()) && $model->validate()) {
$query = ModerateHistory::getModerateQuery(
$model->username,
$model->campaign,
$model->timeStart,
$model->timeStop
);
} else {
$query = ModerateHistory::find()
->innerJoin("{$tnUser}", "{$tnUser}.id = {$thModerateHistory}.user_id")
->orderBy("{$tnUser}.id");
}
$query = $query
->distinct()
->select(["{$thModerateHistory}.user_id", "{$tnUser}.username", "{$tnUser}.id"])
->leftJoin(
$thRBACAuthAssignment,
"{$thModerateHistory}.user_id = {$thRBACAuthAssignment}.user_id"
)
->andWhere(["{$thRBACAuthAssignment}.item_name" => User::ROLE_MANAGER]);
$dataProvider = new ActiveDataProvider([
'query' => $query,
'pagination' => ['pageSize' => 100]
]);
$applicationType = ApplicationType::find()->all();
$applicationTypeArray = [];
if (!empty($applicationType)) {
$applicationTypeArray = ArrayHelper::map($applicationType, 'campaign_id', 'name');
}
$moderateName = User::findActive()
->andWhere([
'in',
'id',
RBACAuthAssignment::find()
->select(['user_id'])
->where(['in', 'item_name', [User::ROLE_MANAGER]])
])
->all();
$moderateNameArray = [];
if (!empty($moderateName)) {
$moderateNameArray = ArrayHelper::map($moderateName, 'username', 'username');
}
return $this->render(
'report',
[
'model' => $model,
'dataProvider' => $dataProvider,
'moderateNameArray' => $moderateNameArray,
'applicationTypeArray' => $applicationTypeArray,
]
);
}
public function actionSpecReport($type = '')
{
$label = [
'from1C' => 'Наличие в 1С',
'campaign_code' => 'Код ПК',
'speciality_code' => 'Код НП',
'applications_count' => 'Количество',
'abit_status' => 'Статус заявления',
'abit_draft_status' => 'Состояние черновика',
'speciality_name' => 'Наименование НП',
];
$userQuery = User::find()
->select(['id', '(user_ref_id is not null) AS from1C']);
$subBachelorApplicationQuery = BachelorApplication::find()
->select(['user_id', 'MAX(draft_status) AS max_draft_status'])
->where(['archive' => false])
->groupBy('user_id');
$query = (new Query())
->select([
StoredDirectionReferenceType::tableName() . '.reference_name speciality_name',
StoredDirectionReferenceType::tableName() . '.reference_id speciality_code',
StoredAdmissionCampaignReferenceType::tableName() . '.reference_id campaign_code',
'user_v1.from1C',
'bachelor_application.status AS abit_status',
'bachelor_application.draft_status AS abit_draft_status',
'COUNT(*) AS applications_count'
])
->from('bachelor_application')
->leftJoin('bachelor_speciality', 'bachelor_application.id = bachelor_speciality.application_id')
->leftJoin('dictionary_speciality', 'bachelor_speciality.speciality_id = dictionary_speciality.id')
->leftJoin(StoredDirectionReferenceType::tableName(), 'dictionary_speciality.direction_ref_id =' . StoredDirectionReferenceType::tableName() . '.id')
->leftJoin(StoredAdmissionCampaignReferenceType::tableName(), 'dictionary_speciality.campaign_ref_id =' . StoredAdmissionCampaignReferenceType::tableName() . '.id')
->leftJoin(
['user_v1' => $userQuery],
'bachelor_application.user_id = user_v1.id'
)
->leftJoin(
['draftless_bachelor_application' => $subBachelorApplicationQuery],
'bachelor_application.user_id = draftless_bachelor_application.user_id'
)
->andWhere(['bachelor_application.archive' => false])
->andWhere(['dictionary_speciality.archive' => false])
->andWhere('bachelor_application.draft_status = draftless_bachelor_application.max_draft_status')
->andWhere([
'IN', 'bachelor_application.status',
[
BachelorApplication::STATUS_SENT,
BachelorApplication::STATUS_CREATED,
BachelorApplication::STATUS_APPROVED,
BachelorApplication::STATUS_NOT_APPROVED,
BachelorApplication::STATUS_SENT_AFTER_APPROVED,
BachelorApplication::STATUS_WANTS_TO_RETURN_ALL,
BachelorApplication::STATUS_SENT_AFTER_NOT_APPROVED,
]
])
->andWhere([
'NOT IN', 'bachelor_application.draft_status',
[BachelorApplication::DRAFT_STATUS_MODERATING,]
])
->groupBy([
StoredDirectionReferenceType::tableName() . '.reference_name',
StoredDirectionReferenceType::tableName() . '.reference_id',
StoredAdmissionCampaignReferenceType::tableName() . '.reference_id',
'user_v1.from1C',
'abit_status',
'abit_draft_status',
]);
if ($type == 'make-report') {
$specList = $query->all();
if (empty($specList)) {
return $this->goBack();
}
$headerRow = array_keys(ArrayHelper::getValue($specList, '0') ?? []);
$headerRow = array_map(
function ($attr) use ($label) {
return $label[$attr] ?? '-';
},
$headerRow
);
$writer = new XLSXWriter();
$writer->setAuthor('Some Author');
$writer->writeSheetRow('Sheet1', $headerRow);
foreach ($specList as $row) {
$writer->writeSheetRow('Sheet1', ReportsPreprocessor::preprocessRow($row));
}
$data = date('d.m.Y');
return Yii::$app->response->sendContentAsFile($writer->writeToString(), "Отчёт по специальностям от {$data}.xlsx");
} else {
$dataProvider = new ActiveDataProvider([
'query' => $query,
'pagination' => ['pageSize' => 100]
]);
return $this->render(
'spec_report',
[
'label' => $label,
'dataProvider' => $dataProvider,
]
);
}
}
public function actionIndex()
{
$tnUser = User::tableName();
$tnManageAC = ManageAC::tableName();
$tnRBACAuthAssignment = RBACAuthAssignment::tableName();
$dataProvider = new ActiveDataProvider([
'query' => (new Query())
->from($tnRBACAuthAssignment)
->distinct()
->select([
"{$tnRBACAuthAssignment}.user_id",
"{$tnUser}.username",
"{$tnUser}.id"
])
->leftJoin(
$tnManageAC,
"{$tnRBACAuthAssignment}.user_id = {$tnManageAC}.rbac_auth_assignment_user_id"
)
->leftJoin(
$tnUser,
"{$tnUser}.id = {$tnRBACAuthAssignment}.user_id"
)
->where(["{$tnRBACAuthAssignment}.item_name" => RBACAuthItem::MANAGER])
->orderBy("{$tnUser}.id"),
]);
return $this->render(
'index',
['dataProvider' => $dataProvider]
);
}
public function actionView($id)
{
$user = User::findOne($id);
$application_type = ApplicationType::find()
->active()
->all();
$manage_ac = ManageAC::find()
->select(['application_type_id'])
->where(['rbac_auth_assignment_user_id' => $id])
->asArray()
->all();
$array_manger_ac = [];
foreach ($manage_ac as $m) {
$array_manger_ac[] = intval($m['application_type_id']);
}
return $this->render(
'view',
[
'user' => $user,
'application_type' => $application_type,
'array_manger_ac' => $array_manger_ac,
]
);
}
public function actionUpdate($id)
{
$user = User::findOne($id);
$manager_notifications_configurator = ManagerNotificationsConfigurator::getInstance($user);
if (Yii::$app->request->isPost) {
ManagerAllowChat::loadFromPost($id);
$formName = (new ManageAC())->formName();
$data = Yii::$app->request->post($formName);
$manageAc = ManageAC::find()
->select(['application_type_id'])
->where(['rbac_auth_assignment_user_id' => $id])
->all();
$manageAcInDb = [];
foreach ($manageAc as $m) {
$manageAcInDb[] = $m->application_type_id;
}
$manageAcPost = [];
foreach ($data as $m) {
$postAtId = intval($m['application_type_id']);
if (!empty($postAtId)) {
$manageAcPost[] = $postAtId;
}
}
$onDelete = array_diff($manageAcInDb, $manageAcPost);
$onSave = array_diff($manageAcPost, $manageAcInDb);
foreach ($onDelete as $idDelete) {
$ms = ManageAC::findAll([
'application_type_id' => $idDelete,
'rbac_auth_assignment_user_id' => $id
]);
foreach ($ms as $m) {
$m->delete();
}
}
foreach ($onSave as $atId) {
$m = new ManageAC();
$m->rbac_auth_assignment_user_id = $id;
$m->application_type_id = $atId;
$m->save();
}
$manager_notifications_configurator->load(Yii::$app->request->post()) && $manager_notifications_configurator->save();
return $this->redirect('index');
}
$applicationType = ApplicationType::find()
->active()
->all();
$manageAc = ManageAC::find()
->select(['application_type_id'])
->where(['rbac_auth_assignment_user_id' => $id])
->asArray()
->all();
$arrayManageAc = [];
foreach ($manageAc as $m) {
$arrayManageAc[] = intval($m['application_type_id']);
}
$managerAllowChat = ManagerAllowChat::getOrCreate($id);
if (!$managerAllowChat->nickname) {
$managerAllowChat->nickname = ManagerAllowChat::generateTemporaryNick($user);
}
return $this->render(
'update',
[
'user' => $user,
'arrayManageAc' => $arrayManageAc,
'applicationType' => $applicationType,
'managerAllowChat' => $managerAllowChat,
'manager_notifications_configurator' => $manager_notifications_configurator,
]
);
}
}