360 lines
12 KiB
PHP
360 lines
12 KiB
PHP
|
<?php
|
|||
|
|
|||
|
namespace backend\controllers;
|
|||
|
|
|||
|
use common\helpers\Functions;
|
|||
|
use common\models\Attachment;
|
|||
|
use common\models\AttachmentArchive;
|
|||
|
use common\models\AttachmentType;
|
|||
|
use common\models\AttachmentTypeTemplate;
|
|||
|
use common\models\dictionary\DocumentType;
|
|||
|
use common\models\dictionary\StoredReferenceType\StoredAvailableDocumentTypeFilterReferenceType;
|
|||
|
use common\models\errors\RecordNotValid;
|
|||
|
use common\models\IndividualAchievementDocumentType;
|
|||
|
use common\models\query\ActiveRecordDataProvider;
|
|||
|
use common\models\settings\CodeSetting;
|
|||
|
use common\models\User;
|
|||
|
use common\modules\abiturient\models\bachelor\AdmissionCampaign;
|
|||
|
use Yii;
|
|||
|
use yii\data\ActiveDataProvider;
|
|||
|
use yii\filters\AccessControl;
|
|||
|
use yii\filters\VerbFilter;
|
|||
|
use yii\helpers\ArrayHelper;
|
|||
|
use yii\helpers\Url;
|
|||
|
use yii\web\Controller;
|
|||
|
use yii\web\HttpException;
|
|||
|
use yii\web\NotFoundHttpException;
|
|||
|
|
|||
|
class ScanController extends Controller
|
|||
|
{
|
|||
|
public function behaviors()
|
|||
|
{
|
|||
|
return [
|
|||
|
'verbs' => [
|
|||
|
'class' => VerbFilter::class,
|
|||
|
'actions' => [
|
|||
|
'delete' => ['post'],
|
|||
|
'restore' => ['post']
|
|||
|
]
|
|||
|
],
|
|||
|
'access' => [
|
|||
|
'class' => AccessControl::class,
|
|||
|
'rules' => [
|
|||
|
[
|
|||
|
'allow' => true,
|
|||
|
'roles' => [User::ROLE_ADMINISTRATOR]
|
|||
|
],
|
|||
|
],
|
|||
|
],
|
|||
|
];
|
|||
|
}
|
|||
|
|
|||
|
public function actionDownload($id)
|
|||
|
{
|
|||
|
$attachment = Attachment::findOne((int)$id);
|
|||
|
if ($attachment != null) {
|
|||
|
$path = $attachment->getAbsPath();
|
|||
|
if ($path && file_exists($path)) {
|
|||
|
return Yii::$app->response->sendFile($path);
|
|||
|
} else {
|
|||
|
Yii::$app->session->setFlash('fileErorr', 'Отсутствует файл');
|
|||
|
return $this->redirect('/admin/scan/index', 302);
|
|||
|
}
|
|||
|
}
|
|||
|
throw new NotFoundHttpException();
|
|||
|
}
|
|||
|
|
|||
|
|
|||
|
public function actionDeletefile($id)
|
|||
|
{
|
|||
|
$attachment = Attachment::findOne((int)$id);
|
|||
|
if ($attachment != null) {
|
|||
|
$attachment->delete();
|
|||
|
}
|
|||
|
|
|||
|
if (Yii::$app->request->referrer) {
|
|||
|
return $this->redirect(Yii::$app->request->referrer);
|
|||
|
} else {
|
|||
|
return $this->goHome();
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
public function actionSolveConflict($id)
|
|||
|
{
|
|||
|
$newType = Yii::$app->request->post('type');
|
|||
|
foreach (Attachment::findAll(['attachment_type_id' => $id]) as $item) {
|
|||
|
$history = new AttachmentArchive();
|
|||
|
$arr = $item->toArray();
|
|||
|
$history->attributes = $arr;
|
|||
|
$history->attachment_id = $item->id;
|
|||
|
$history->save();
|
|||
|
}
|
|||
|
Attachment::updateAll(['attachment_type_id' => $newType], ['attachment_type_id' => $id]);
|
|||
|
return $this->redirect('/admin/scan/index', 302);
|
|||
|
}
|
|||
|
|
|||
|
public function actionIndex()
|
|||
|
{
|
|||
|
$model = CodeSetting::findOne(['name' => 'scan_sort_code']);
|
|||
|
|
|||
|
$scansQuery = AttachmentType::find()
|
|||
|
->where([
|
|||
|
'from1c' => [null, false],
|
|||
|
'system_type' => AttachmentType::SYSTEM_TYPE_COMMON
|
|||
|
])
|
|||
|
->orderBy('custom_order');
|
|||
|
$scansDataProvider = new ActiveDataProvider([
|
|||
|
'query' => $scansQuery
|
|||
|
]);
|
|||
|
$iaQuery = IndividualAchievementDocumentType::find()
|
|||
|
->joinWith(['campaign', 'availableDocumentTypeFilterRef'])
|
|||
|
->where([IndividualAchievementDocumentType::tableName() . '.archive' => false])
|
|||
|
->orderBy(IndividualAchievementDocumentType::tableName() . '.custom_order');
|
|||
|
$iaDataProvider = new ActiveRecordDataProvider([
|
|||
|
'primary_column' => IndividualAchievementDocumentType::tableName() . '.id',
|
|||
|
'query' => $iaQuery,
|
|||
|
]);
|
|||
|
$iaDataProvider->sort->attributes['campaign.name'] = [
|
|||
|
'asc' => [
|
|||
|
AdmissionCampaign::tableName() . '.name' => SORT_ASC,
|
|||
|
],
|
|||
|
'desc' => [
|
|||
|
AdmissionCampaign::tableName() . '.name' => SORT_DESC,
|
|||
|
],
|
|||
|
];
|
|||
|
$iaDataProvider->sort->attributes['availableDocumentTypeFilterRef.0.reference_name'] = [
|
|||
|
'asc' => [
|
|||
|
StoredAvailableDocumentTypeFilterReferenceType::tableName() . '.reference_name' => SORT_ASC,
|
|||
|
],
|
|||
|
'desc' => [
|
|||
|
StoredAvailableDocumentTypeFilterReferenceType::tableName() . '.reference_name' => SORT_DESC,
|
|||
|
],
|
|||
|
];
|
|||
|
|
|||
|
$conflicts = Attachment::find()
|
|||
|
->leftJoin('attachment_type', 'attachment_type.id = attachment.attachment_type_id')
|
|||
|
->where(['attachment_type.id' => null]);
|
|||
|
|
|||
|
$conflictsPKs = ArrayHelper::getColumn($conflicts->all(), 'application.type.campaign');
|
|||
|
$conflictsPKs = ArrayHelper::map($conflictsPKs, 'referenceType.reference_uid', 'name');
|
|||
|
return $this->render("index", [
|
|||
|
'scansDataProvider' => $scansDataProvider,
|
|||
|
'conflicts' => $conflicts,
|
|||
|
'conflictsPKs' => $conflictsPKs,
|
|||
|
'admissionCampaigns' => AdmissionCampaign::find()->with('referenceType')->where(['archive' => false])->all(),
|
|||
|
'iaDocTypes' => $iaDataProvider,
|
|||
|
'orderValue' => $model->value,
|
|||
|
]);
|
|||
|
}
|
|||
|
|
|||
|
public function actionSetScanSort()
|
|||
|
{
|
|||
|
$orderValue = Yii::$app->request->post('order', null);
|
|||
|
if ($orderValue === null) {
|
|||
|
return $this->redirect(Yii::$app->request->referrer);
|
|||
|
}
|
|||
|
$model = CodeSetting::findOne(['name' => 'scan_sort_code']);
|
|||
|
$model->value = $orderValue;
|
|||
|
if (!$model->save()) {
|
|||
|
throw new RecordNotValid($model);
|
|||
|
}
|
|||
|
return $this->redirect(Yii::$app->request->referrer);
|
|||
|
}
|
|||
|
|
|||
|
public function actionSortScanCopys()
|
|||
|
{
|
|||
|
$request = Yii::$app->request;
|
|||
|
$counter = 1;
|
|||
|
if ($request->isAjax) {
|
|||
|
try {
|
|||
|
$post = $request->post('arrayData');
|
|||
|
$postArray = explode(',', $post);
|
|||
|
foreach ($postArray as $value) {
|
|||
|
$model = AttachmentType::findOne(['id' => (int)$value]);
|
|||
|
$model->custom_order = $counter++;
|
|||
|
if (!$model->save()) {
|
|||
|
throw new RecordNotValid($model);
|
|||
|
}
|
|||
|
}
|
|||
|
} catch (\Throwable $e) {
|
|||
|
throw new HttpException('500', 'Данные не сохранены');
|
|||
|
}
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
public function actionSortIaScanCopys()
|
|||
|
{
|
|||
|
$request = Yii::$app->request;
|
|||
|
$counter = 1;
|
|||
|
if ($request->isAjax) {
|
|||
|
try {
|
|||
|
$post = $request->post('arrayData');
|
|||
|
$postArray = explode(',', $post);
|
|||
|
foreach ($postArray as $value) {
|
|||
|
$model = IndividualAchievementDocumentType::findOne(['id' => (int)$value]);
|
|||
|
$model->custom_order = $counter++;
|
|||
|
if (!$model->save()) {
|
|||
|
throw new RecordNotValid($model);
|
|||
|
}
|
|||
|
}
|
|||
|
} catch (\Throwable $e) {
|
|||
|
throw new HttpException('500', 'Данные не сохранены');
|
|||
|
}
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
public function actionCreate()
|
|||
|
{
|
|||
|
return $this->createOrUpdateProcessor('create');
|
|||
|
}
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
private function processDocumentTypeSave(AttachmentType $attachmentType)
|
|||
|
{
|
|||
|
if (!empty($attachmentType->document_type_guid)) {
|
|||
|
$docType = DocumentType::findOne(['ref_key' => $attachmentType->document_type_guid]);
|
|||
|
if (!is_null($docType)) {
|
|||
|
$attachmentType->document_type_id = $docType->id;
|
|||
|
if ($attachmentType->validate(['document_type_id'])) {
|
|||
|
$attachmentType->save(false, ['document_type_id']);
|
|||
|
}
|
|||
|
}
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
public function actionRestore(int $scan_id)
|
|||
|
{
|
|||
|
$attachmentType = AttachmentType::findOne($scan_id);
|
|||
|
if (!$attachmentType) {
|
|||
|
throw new NotFoundHttpException('Не найдено');
|
|||
|
}
|
|||
|
$attachmentType->hidden = false;
|
|||
|
$attachmentType->save(true, ['hidden']);
|
|||
|
return $this->redirect(['index']);
|
|||
|
}
|
|||
|
|
|||
|
public function actionUpdate(int $id)
|
|||
|
{
|
|||
|
return $this->createOrUpdateProcessor('update', $id);
|
|||
|
}
|
|||
|
|
|||
|
private function getDocumentTypeList(): array
|
|||
|
{
|
|||
|
$tnDocumentType = DocumentType::tableName();
|
|||
|
return ArrayHelper::map(
|
|||
|
DocumentType::find()
|
|||
|
->notMarkedToDelete()
|
|||
|
->active()
|
|||
|
->orderBy("{$tnDocumentType}.description")
|
|||
|
->all(),
|
|||
|
'ref_key',
|
|||
|
'description'
|
|||
|
);
|
|||
|
}
|
|||
|
|
|||
|
public function actionDelete($id)
|
|||
|
{
|
|||
|
$type = AttachmentType::findOne($id);
|
|||
|
$result = true;
|
|||
|
if (isset($type)) {
|
|||
|
$result = $type->delete();
|
|||
|
}
|
|||
|
if (!$result) {
|
|||
|
if ($type->system_type == AttachmentType::SYSTEM_TYPE_COMMON && $type->hide()) {
|
|||
|
Yii::$app->session->setFlash('scans-msg', 'Не удалось удалить тип скан-копии так как к ней поступающими приложены файлы, тип скан-копии был помечен как скрытый');
|
|||
|
} else {
|
|||
|
Yii::$app->session->setFlash('scans-error', 'Не удалось удалить тип скан-копии так как к ней поступающими приложены файлы');
|
|||
|
}
|
|||
|
}
|
|||
|
return $this->redirect(Url::toRoute('scan/index'), 302);
|
|||
|
}
|
|||
|
|
|||
|
private function createOrUpdateProcessor(string $viewPath, ?int $id = null)
|
|||
|
{
|
|||
|
$model = new AttachmentType();
|
|||
|
if ($id) {
|
|||
|
$model = AttachmentType::findOne($id);
|
|||
|
}
|
|||
|
if (Yii::$app->request->isPost) {
|
|||
|
if ($model->load(Yii::$app->request->post()) && $model->save()) {
|
|||
|
$this->processDocumentTypeSave($model);
|
|||
|
$this->processAttachmentTypeTemplate($model);
|
|||
|
return $this->redirect(['index']);
|
|||
|
}
|
|||
|
if ($model->errors) {
|
|||
|
$flatten_errors = implode(', ', Functions::array_flatten($model->errors));
|
|||
|
Yii::$app->session->setFlash('alert', [
|
|||
|
'body' => "Не удалось сохранить изменения: {$flatten_errors}",
|
|||
|
'options' => ['class' => 'alert-danger']
|
|||
|
]);
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
$entities = AttachmentType::GetRelatedList(!!$model->from1c);
|
|||
|
return $this->render(
|
|||
|
$viewPath,
|
|||
|
[
|
|||
|
'model' => $model,
|
|||
|
'entities' => $entities,
|
|||
|
'document_types' => $this->getDocumentTypeList()
|
|||
|
]
|
|||
|
);
|
|||
|
}
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
private function processAttachmentTypeTemplate(AttachmentType $attachmentType): void
|
|||
|
{
|
|||
|
$attachmentTypeWithLoadedPost = $attachmentType->getOrBuildAttachmentTypeTemplate();
|
|||
|
$attachmentTypeWithLoadedPost->user_id = Yii::$app->user->identity->id;
|
|||
|
$attachmentTypeWithLoadedPost->uploadFromPost();
|
|||
|
}
|
|||
|
|
|||
|
public function actionSystemScansTemplate()
|
|||
|
{
|
|||
|
$scansQuery = AttachmentType::find()
|
|||
|
->where(['!=', 'system_type', AttachmentType::SYSTEM_TYPE_COMMON])
|
|||
|
->orderBy('custom_order');
|
|||
|
$scansDataProvider = new ActiveDataProvider([
|
|||
|
'query' => $scansQuery
|
|||
|
]);
|
|||
|
|
|||
|
return $this->render(
|
|||
|
'system-scans-template',
|
|||
|
['scansDataProvider' => $scansDataProvider]
|
|||
|
);
|
|||
|
}
|
|||
|
|
|||
|
public function actionSystemScansTemplateUpdate(int $id)
|
|||
|
{
|
|||
|
$tnAttachmentType = AttachmentType::tableName();
|
|||
|
$tnAttachmentTypeTemplate = AttachmentTypeTemplate::tableName();
|
|||
|
$model = AttachmentTypeTemplate::find()
|
|||
|
->joinWith('attachmentType')
|
|||
|
->andWhere(['!=', "{$tnAttachmentType}.system_type", AttachmentType::SYSTEM_TYPE_COMMON])
|
|||
|
->andWhere(["{$tnAttachmentTypeTemplate}.attachment_type_id" => $id])
|
|||
|
->one();
|
|||
|
if (!$model) {
|
|||
|
$model = new AttachmentTypeTemplate();
|
|||
|
$model->attachment_type_id = $id;
|
|||
|
}
|
|||
|
|
|||
|
if ($model->load(Yii::$app->request->post())) {
|
|||
|
$model->user_id = Yii::$app->user->identity->id;
|
|||
|
$model->uploadFromPost();
|
|||
|
|
|||
|
return $this->redirect(['system-scans-template']);
|
|||
|
}
|
|||
|
|
|||
|
return $this->render(
|
|||
|
'system-scans-template-update',
|
|||
|
['model' => $model]
|
|||
|
);
|
|||
|
}
|
|||
|
}
|