1120 lines
42 KiB
PHP
Executable File
1120 lines
42 KiB
PHP
Executable File
<?php
|
||
|
||
namespace common\modules\abiturient\controllers;
|
||
|
||
use common\commands\command\AddToTimelineCommand;
|
||
use common\components\applyingSteps\ApplicationApplyingStep;
|
||
use common\components\behaviors\emailConfirmBehavior\EmailConfirmBehavior;
|
||
use common\models\dictionary\Fias;
|
||
use common\models\dictionary\FiasDoma;
|
||
use common\models\EmptyCheck;
|
||
use common\models\errors\RecordNotValid;
|
||
use common\models\IndividualAchievementDocumentType;
|
||
use common\models\settings\SandboxSetting;
|
||
use common\models\User;
|
||
use common\modules\abiturient\models\AbiturientQuestionary;
|
||
use common\modules\abiturient\models\ActualAddressData;
|
||
use common\modules\abiturient\models\AddressData;
|
||
use common\modules\abiturient\models\bachelor\ApplicationType;
|
||
use common\modules\abiturient\models\parentData\ParentData;
|
||
use common\modules\abiturient\models\PersonalData;
|
||
use common\modules\abiturient\models\questionary\QuestionarySettings;
|
||
use common\services\abiturientController\bachelor\Application1CProcessorService;
|
||
use common\services\abiturientController\bachelor\ApplicationsService;
|
||
use common\services\abiturientController\bachelor\IndividualAchievementService;
|
||
use common\services\abiturientController\questionary\AddressDataService;
|
||
use common\services\abiturientController\questionary\AvatarService;
|
||
use common\services\abiturientController\questionary\InitializationQuestionaryService;
|
||
use common\services\abiturientController\questionary\ParentDataService;
|
||
use common\services\abiturientController\questionary\PassportDataService;
|
||
use common\services\abiturientController\questionary\QuestionaryService;
|
||
use Throwable;
|
||
use Yii;
|
||
use yii\base\UserException;
|
||
use yii\bootstrap4\Html;
|
||
use yii\data\ActiveDataProvider;
|
||
use yii\db\StaleObjectException;
|
||
use yii\filters\AccessControl;
|
||
use yii\filters\VerbFilter;
|
||
use yii\helpers\ArrayHelper;
|
||
use yii\helpers\Url;
|
||
use yii\web\Controller;
|
||
use yii\web\ErrorAction;
|
||
use yii\web\NotFoundHttpException;
|
||
use yii\web\Response;
|
||
|
||
|
||
|
||
|
||
class AbiturientController extends Controller
|
||
{
|
||
|
||
private IndividualAchievementService $individualAchievementService;
|
||
|
||
|
||
private QuestionaryService $questionaryService;
|
||
|
||
|
||
private PassportDataService $passportDataService;
|
||
|
||
|
||
private AvatarService $avatarService;
|
||
|
||
|
||
private ApplicationsService $applicationsService;
|
||
|
||
|
||
private AddressDataService $addressDataService;
|
||
|
||
|
||
private InitializationQuestionaryService $initializationQuestionaryService;
|
||
|
||
|
||
private ParentDataService $parentDataService;
|
||
|
||
|
||
private Application1CProcessorService $application1CProcessorService;
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
public function __construct(
|
||
$id,
|
||
$module,
|
||
AvatarService $avatarService,
|
||
ParentDataService $parentDataService,
|
||
AddressDataService $addressDataService,
|
||
QuestionaryService $questionaryService,
|
||
ApplicationsService $applicationsService,
|
||
PassportDataService $passportDataService,
|
||
IndividualAchievementService $individualAchievementService,
|
||
InitializationQuestionaryService $initializationQuestionaryService,
|
||
Application1CProcessorService $application1CProcessorService,
|
||
$config = []
|
||
) {
|
||
$this->avatarService = $avatarService;
|
||
$this->parentDataService = $parentDataService;
|
||
$this->addressDataService = $addressDataService;
|
||
$this->questionaryService = $questionaryService;
|
||
$this->applicationsService = $applicationsService;
|
||
$this->passportDataService = $passportDataService;
|
||
$this->individualAchievementService = $individualAchievementService;
|
||
$this->initializationQuestionaryService = $initializationQuestionaryService;
|
||
$this->application1CProcessorService = $application1CProcessorService;
|
||
|
||
parent::__construct($id, $module, $config);
|
||
}
|
||
|
||
public function getViewPath()
|
||
{
|
||
return Yii::getAlias('@common/modules/abiturient/views/abiturient');
|
||
}
|
||
|
||
public function behaviors()
|
||
{
|
||
$sandboxEnabled = SandboxSetting::findOne(['name' => 'sandbox_enabled']);
|
||
if ($sandboxEnabled == null) {
|
||
$sandboxEnabled = 0;
|
||
}
|
||
return [
|
||
'access' => [
|
||
'class' => AccessControl::class,
|
||
'rules' => [
|
||
[
|
||
'actions' => [
|
||
'applications',
|
||
'area',
|
||
'city',
|
||
'delete-parent-data',
|
||
'delete-passport',
|
||
'have-no-previous-passport',
|
||
'ia-doc-types',
|
||
'ialist',
|
||
'index',
|
||
'mark-return-application',
|
||
'mark-reject-enrollment',
|
||
'parent-form',
|
||
'postalindex',
|
||
'questionary',
|
||
'region',
|
||
'remove-application',
|
||
'set-parent-data',
|
||
'set-passport',
|
||
'street',
|
||
'test',
|
||
'update-contact',
|
||
'update',
|
||
'village',
|
||
],
|
||
'allow' => true,
|
||
'roles' => [User::ROLE_ABITURIENT]
|
||
],
|
||
[
|
||
'actions' => [
|
||
'addia',
|
||
'delete-photo',
|
||
'get-education-by-document-type',
|
||
'ia-file-required',
|
||
'passport-grid',
|
||
'passport-modals',
|
||
'upload-photo',
|
||
],
|
||
'allow' => true,
|
||
'roles' => [User::ROLE_ABITURIENT, User::ROLE_MANAGER]
|
||
],
|
||
[
|
||
'actions' => [
|
||
'area',
|
||
'city',
|
||
'ia-doc-types',
|
||
'postalindex',
|
||
'region',
|
||
'street',
|
||
'village',
|
||
],
|
||
'allow' => true,
|
||
'roles' => [User::ROLE_MANAGER]
|
||
],
|
||
[
|
||
'actions' => ['return-application', 'reject-enrollment'],
|
||
'allow' => $sandboxEnabled->value == 1,
|
||
'roles' => [User::ROLE_MANAGER]
|
||
],
|
||
[
|
||
'actions' => ['return-application', 'reject-enrollment'],
|
||
'allow' => $sandboxEnabled->value == 0,
|
||
'roles' => [User::ROLE_ABITURIENT]
|
||
]
|
||
],
|
||
|
||
'denyCallback' => function () {
|
||
$this->redirect('/');
|
||
}
|
||
],
|
||
[
|
||
'class' => EmailConfirmBehavior::class,
|
||
'user' => Yii::$app->user->identity
|
||
],
|
||
'verbs' => [
|
||
'class' => VerbFilter::class,
|
||
'actions' => [
|
||
'passport-grid' => ['GET'],
|
||
'passport-modals' => ['GET'],
|
||
'set-passport' => ['POST']
|
||
],
|
||
],
|
||
];
|
||
}
|
||
|
||
public function actions()
|
||
{
|
||
return ['error' => ['class' => ErrorAction::class]];
|
||
}
|
||
|
||
public function actionIndex()
|
||
{
|
||
$timeZoneError = $this->initializationQuestionaryService->checkTimeZone();
|
||
|
||
$user = Yii::$app->user->identity;
|
||
if ($user->canViewStep('my-applications') && !$timeZoneError) {
|
||
return $this->redirect('/abiturient/applications', 302);
|
||
}
|
||
$user->syncApplicationsAndQuestionaryWith1C();
|
||
|
||
$campaignStartDates = [];
|
||
$abiturientQuestionary = new AbiturientQuestionary();
|
||
$canCreateQuestionary = $abiturientQuestionary->canCreateQuestionary();
|
||
if (!$canCreateQuestionary) {
|
||
$campaignStartDates = $abiturientQuestionary->getCampaignsStartDates();
|
||
}
|
||
return $this->render(
|
||
'index',
|
||
[
|
||
'timeZoneError' => $timeZoneError,
|
||
'campaignStartDates' => $campaignStartDates,
|
||
'canCreateQuestionary' => $canCreateQuestionary,
|
||
]
|
||
);
|
||
}
|
||
|
||
public function actionUpdate()
|
||
{
|
||
$user = Yii::$app->user->identity;
|
||
|
||
if ($user->abiturientQuestionary && !$user->abiturientQuestionary->getLinkedBachelorApplication()->exists()) {
|
||
AbiturientQuestionary::UpdateDataFromOneS($user->abiturientQuestionary);
|
||
}
|
||
return $this->redirect('/abiturient/questionary', 302);
|
||
}
|
||
|
||
public function actionQuestionary(int $app_id = null)
|
||
{
|
||
$user = Yii::$app->user->identity;
|
||
$this->questionaryService->checkAccessibilityToRelatedBachelorApplication($user, $app_id);
|
||
$current_application = $this->questionaryService->getRelatedBachelorApplication($user, $app_id);
|
||
|
||
[
|
||
'questionary' => $questionary,
|
||
'needRefreshPage' => $needRefreshPage,
|
||
] = $this->questionaryService->getQuestionary($user);
|
||
if ($needRefreshPage) {
|
||
return $this->redirect('/abiturient/questionary', 302);
|
||
}
|
||
|
||
if (!$user->canMakeStep('questionary', $current_application)) {
|
||
return $this->redirect('/abiturient/index', 302);
|
||
}
|
||
|
||
$request = Yii::$app->request;
|
||
$regulations = $this->questionaryService->getRegulations($user, $questionary);
|
||
$edit_block_reasons = [];
|
||
|
||
$canEdit = !$questionary || $questionary->canEditQuestionary();
|
||
if (
|
||
$canEdit &&
|
||
$questionary &&
|
||
AbiturientQuestionary::isBlockedAfterApprove($questionary)
|
||
) {
|
||
$edit_block_reasons = [
|
||
Yii::t(
|
||
'abiturient/questionary/all',
|
||
'Текст ошибки с предупреждением о блокировке анкеты на редактирование на странице анкеты поступающего: `Запрещено редактирование анкеты после проверки модератором`'
|
||
)
|
||
];
|
||
$canEdit = false;
|
||
}
|
||
$personal_data = $this->questionaryService->getQuestionnaireDependentModels($questionary, 'personalData', PersonalData::class);
|
||
$address_data = $this->questionaryService->getQuestionnaireDependentModels($questionary, 'addressData', AddressData::class);
|
||
$actualAddressData = $this->questionaryService->getQuestionnaireDependentModels($questionary, 'actualAddressData', ActualAddressData::class);
|
||
$actualAddressData->validation_extender ? $actualAddressData->validation_extender->modelPreparationCallback() : null;
|
||
$abitAvatar = $questionary->getComputedAbiturientAvatar();
|
||
$attachments = $this->questionaryService->getAttachments($questionary);
|
||
|
||
if ($request->isPost) {
|
||
$anyAttachmentChanged = $this->questionaryService->saveRegulationsOrAttachmentsWithChangesReturned($questionary, $regulations, $attachments, $canEdit);
|
||
|
||
if ($canEdit) {
|
||
[
|
||
'validated' => $validated,
|
||
'isSaved' => $isSaved,
|
||
'anyDataChanged' => $anyDataChanged,
|
||
] = $this->questionaryService->processFromPost(
|
||
$user,
|
||
$questionary,
|
||
$personal_data,
|
||
$address_data,
|
||
$actualAddressData
|
||
);
|
||
|
||
$anyDataChanged = $anyDataChanged || $anyAttachmentChanged;
|
||
if ($validated) {
|
||
if ($anyDataChanged) {
|
||
$user->resetApplicationStatuses();
|
||
} else {
|
||
Yii::$app->session->setFlash('alert', [
|
||
'body' => Yii::$app->configurationManager->getText('no_data_saved_text', ArrayHelper::getValue($user, 'applications.0.type')),
|
||
'options' => ['class' => 'alert-warning']
|
||
]);
|
||
}
|
||
|
||
Yii::$app->session->setFlash('questionaryIsSaved', $isSaved);
|
||
return $this->redirect('/abiturient/questionary', 302);
|
||
}
|
||
}
|
||
}
|
||
|
||
[
|
||
'attachmentErrors' => $attachmentErrors,
|
||
'isAttachmentsAdded' => $isAttachmentsAdded,
|
||
] = $this->questionaryService->checkAttachmentFiles($questionary, $canEdit);
|
||
|
||
$hasApplicationType = ApplicationType::find()->active()->exists();
|
||
|
||
$confirmEmail = Yii::$app->configurationManager->getCode('confirm-email');
|
||
$canChangeFio = QuestionarySettings::getSettingByName('can_change_fio_after_first_application');
|
||
$canChangePassport = QuestionarySettings::getSettingByName('can_change_passport_after_first_application');
|
||
|
||
return $this->render(
|
||
'questionary',
|
||
[
|
||
'questionary_comparison' => $this->questionaryService->getQuestionaryComparison($user, $questionary),
|
||
'questionary' => $questionary,
|
||
'personal_data' => $personal_data,
|
||
'current_application' => $current_application,
|
||
'address_data' => $address_data,
|
||
'actual_address_data' => $actualAddressData,
|
||
'passports' => new ActiveDataProvider([
|
||
'query' => $questionary->getPassportData()
|
||
]),
|
||
'parents' => new ActiveDataProvider([
|
||
'query' => $questionary->getParentData()
|
||
]),
|
||
'edit_block_reasons' => $edit_block_reasons,
|
||
'abitAvatar' => $abitAvatar,
|
||
'attachments' => $attachments,
|
||
'regulations' => $regulations,
|
||
'isAttachmentsAdded' => $isAttachmentsAdded,
|
||
'attachmentErrors' => $attachmentErrors,
|
||
'isPost' => Yii::$app->request->isPost,
|
||
'hasApplicationType' => $hasApplicationType,
|
||
'canEdit' => $canEdit,
|
||
'confirmEmail' => $confirmEmail === '1',
|
||
'canChangeFio' => ($canChangeFio && !$questionary->isNotCreatedDraft()) || $canEdit,
|
||
'canChangePassport' => ($canChangePassport && !$questionary->isNotCreatedDraft()) || $canEdit,
|
||
]
|
||
);
|
||
}
|
||
|
||
public function actionDeletePassport()
|
||
{
|
||
if (!Yii::$app->request->isAjax) {
|
||
throw new UserException('Is not ajax');
|
||
}
|
||
|
||
$user = Yii::$app->user->identity;
|
||
$questionary = $user->abiturientQuestionary;
|
||
|
||
$this->passportDataService->deletePassportData($user, $questionary);
|
||
return $this->renderAjax(
|
||
'questionary_partial/_document_grid',
|
||
$this->passportDataService->renderPassports($questionary)
|
||
);
|
||
}
|
||
|
||
|
||
|
||
|
||
public function actionSetPassport()
|
||
{
|
||
if (Yii::$app->request->isPost) {
|
||
$user = Yii::$app->user->identity;
|
||
$questionary = $user->abiturientQuestionary;
|
||
|
||
$this->passportDataService->setPassportData($user, $questionary);
|
||
}
|
||
|
||
if (!Yii::$app->request->isAjax) {
|
||
return $this->redirect(Yii::$app->request->referrer ?? ['/abiturient/questionary']);
|
||
} else {
|
||
return $this->asJson(['status' => true, 'messages' => []]);
|
||
}
|
||
}
|
||
|
||
public function actionPassportGrid($questionary_id)
|
||
{
|
||
if (!Yii::$app->request->isAjax) {
|
||
throw new UserException('Is not ajax');
|
||
}
|
||
|
||
$questionary = AbiturientQuestionary::findOne($questionary_id);
|
||
|
||
return $this->renderAjax(
|
||
'questionary_partial/_document_grid',
|
||
$this->passportDataService->renderPassports($questionary)
|
||
);
|
||
}
|
||
|
||
public function actionPassportModals(int $questionary_id, ?int $app_id = null)
|
||
{
|
||
$user = Yii::$app->user->identity;
|
||
$this->passportDataService->checkAccessibility($user, $questionary_id);
|
||
|
||
if (!Yii::$app->request->isAjax) {
|
||
throw new UserException('Is not ajax');
|
||
}
|
||
|
||
$questionary = AbiturientQuestionary::findOne($questionary_id);
|
||
$passports = new ActiveDataProvider([
|
||
'query' => $questionary->getPassportData()
|
||
]);
|
||
|
||
$action = $user->isModer() ?
|
||
'/sandbox/set-passport' : '/abiturient/set-passport';
|
||
|
||
$related_application = null;
|
||
if ($questionary->user) {
|
||
$related_application = $this->questionaryService->getRelatedBachelorApplication($questionary->user, $app_id);
|
||
}
|
||
|
||
return $this->renderAjax('questionary_partial/_passportModals', [
|
||
'isReadonly' => !$questionary->canEditQuestionary(),
|
||
'passports' => $passports,
|
||
'action' => $action,
|
||
'application' => $related_application,
|
||
]);
|
||
}
|
||
|
||
public function actionDeleteParentData()
|
||
{
|
||
if (!Yii::$app->request->isAjax) {
|
||
throw new UserException('Is not ajax');
|
||
}
|
||
|
||
$user = Yii::$app->user->identity;
|
||
$id = ArrayHelper::getValue($this->request->post(), 'parentDataId');
|
||
|
||
$parentData = ParentData::findOne($id);
|
||
if ($parentData != null) {
|
||
$this->parentDataService->checkAccessibility($user, $parentData->questionary_id);
|
||
|
||
$parentData->archive();
|
||
}
|
||
|
||
$this->parentDataService->parentDataChangedEvent($user);
|
||
return $this->renderParents($user->abiturientQuestionary);
|
||
}
|
||
|
||
|
||
public function actionSetParentData()
|
||
{
|
||
if (!Yii::$app->request->isAjax) {
|
||
throw new UserException('Is not ajax');
|
||
}
|
||
|
||
$user = Yii::$app->user->identity;
|
||
$questionary = $user->abiturientQuestionary;
|
||
|
||
$parentData = $this->parentDataService->getOrBuildParentData(
|
||
$user,
|
||
$questionary,
|
||
'ParentData.id'
|
||
);
|
||
[
|
||
'parentData' => $parentData,
|
||
'addressData' => $addressData,
|
||
'passportData' => $passportData,
|
||
'personalData' => $personalData,
|
||
] = $this->parentDataService->loadParentData(
|
||
$parentData
|
||
);
|
||
|
||
$transaction = $parentData->getDb()->beginTransaction();
|
||
|
||
try {
|
||
$success = $this->parentDataService->setParentData(
|
||
$user,
|
||
$parentData,
|
||
$passportData,
|
||
$personalData,
|
||
$addressData
|
||
);
|
||
|
||
if (!$success) {
|
||
$transaction->rollBack();
|
||
Yii::$app->response->statusCode = 400;
|
||
return Html::errorSummary([$personalData, $addressData, $passportData, $parentData], [
|
||
'header' => '<div class="alert alert-danger">',
|
||
'footer' => '</div>'
|
||
]);
|
||
} else {
|
||
$transaction->commit();
|
||
}
|
||
} catch (Throwable $e) {
|
||
$transaction->rollBack();
|
||
throw $e;
|
||
}
|
||
|
||
return $this->renderParents($questionary);
|
||
}
|
||
|
||
public function actionApplications()
|
||
{
|
||
$user = Yii::$app->user->identity;
|
||
if (!$user->canMakeStep('my-applications')) {
|
||
return $this->redirect('/abiturient/index', 302);
|
||
}
|
||
|
||
return $this->render(
|
||
'applications',
|
||
['applications' => $this->applicationsService->getApplications($user)]
|
||
);
|
||
}
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
public function actionRemoveApplication()
|
||
{
|
||
if (!Yii::$app->request->isPost) {
|
||
return $this->redirect('/abiturient/applications', 302);
|
||
}
|
||
$appId = (int) Yii::$app->request->post('appid');
|
||
|
||
$user = Yii::$app->user->identity;
|
||
$this->applicationsService->checkAccessibility($user, $appId);
|
||
$application = $this->applicationsService->getApplication($appId);
|
||
if (!$application) {
|
||
return $this->redirect('/abiturient/applications');
|
||
}
|
||
|
||
$this->applicationsService->archiveApplications($user, $application);
|
||
|
||
return $this->redirect('/abiturient/applications', 302);
|
||
}
|
||
|
||
public function actionRegion()
|
||
{
|
||
$regions = $this->addressDataService->getAllRegions();
|
||
$results = $this->addressDataService->formattingDataForSelector($regions, "{{name}} {{short}}");
|
||
|
||
return $this->asJson(['results' => $results, 'selected' => '', 'pagination' => ['more' => !empty($regions)]]);
|
||
}
|
||
|
||
public function actionArea()
|
||
{
|
||
['parents' => $parents] = $this->addressDataService->getDepDropParamsFromPost();
|
||
|
||
if (
|
||
EmptyCheck::isEmpty($parents) ||
|
||
EmptyCheck::isLoadingStringOrEmpty($parents[0])
|
||
) {
|
||
return $this->asJson(['results' => '', 'selected' => '']);
|
||
}
|
||
|
||
$areas = $this->addressDataService->getAllAreas($parents[0]);
|
||
$results = $this->addressDataService->formattingDataForSelector($areas);
|
||
return $this->asJson(['results' => $results, 'selected' => '', 'pagination' => ['more' => !empty($areas)]]);
|
||
}
|
||
|
||
public function actionCity()
|
||
{
|
||
[
|
||
'params' => $params,
|
||
'parents' => $parents,
|
||
] = $this->addressDataService->getDepDropParamsFromPost();
|
||
|
||
if (
|
||
EmptyCheck::isEmpty($params) ||
|
||
EmptyCheck::isLoadingStringOrEmpty($params[0])
|
||
) {
|
||
return $this->asJson(['results' => '', 'selected' => '']);
|
||
}
|
||
|
||
$cities = $this->addressDataService->getAllCities($params[0], $parents[0]);
|
||
$results = $this->addressDataService->formattingDataForSelector($cities);
|
||
|
||
return $this->asJson(['results' => $results, 'selected' => '', 'pagination' => ['more' => !empty($cities)]]);
|
||
}
|
||
|
||
public function actionVillage()
|
||
{
|
||
[
|
||
'params' => $params,
|
||
'parents' => $parents,
|
||
] = $this->addressDataService->getDepDropParamsFromPost();
|
||
|
||
if (
|
||
EmptyCheck::isEmpty($params) ||
|
||
EmptyCheck::isLoadingStringOrEmpty($params[0])
|
||
) {
|
||
return $this->asJson(['results' => '', 'selected' => '']);
|
||
}
|
||
|
||
$villages = $this->addressDataService->getAllVillages($params[0], $parents[0], $parents[1]);
|
||
$template = '{{name}}';
|
||
if (EmptyCheck::isLoadingStringOrEmpty($parents[0])) {
|
||
$template = '{{name}} ({{areaName}} {{areaShort}})';
|
||
}
|
||
$results = $this->addressDataService->formattingDataForSelector($villages, $template);
|
||
return $this->asJson(['results' => $results, 'selected' => '', 'pagination' => ['more' => !empty($villages)]]);
|
||
}
|
||
|
||
public function actionStreet()
|
||
{
|
||
[
|
||
'params' => $params,
|
||
'parents' => $parents,
|
||
] = $this->addressDataService->getDepDropParamsFromPost();
|
||
|
||
if (
|
||
EmptyCheck::isEmpty($params) ||
|
||
EmptyCheck::isLoadingStringOrEmpty($params[0])
|
||
) {
|
||
return $this->asJson(['results' => '', 'selected' => '']);
|
||
}
|
||
|
||
$streets = $this->addressDataService->getAllStreets($params[0], $params[1], $parents[0], $parents[1]);
|
||
$results = $this->addressDataService->formattingDataForSelector($streets, "{{name}} {{short}}");
|
||
|
||
return $this->asJson(['results' => $results, 'selected' => '', 'pagination' => ['more' => !empty($streets)]]);
|
||
}
|
||
|
||
public function actionPostalindex()
|
||
{
|
||
$sid = ArrayHelper::getValue(Yii::$app->request->post(), 'sid', '');
|
||
if (!$sid) {
|
||
return '';
|
||
}
|
||
$fiasExists = Fias::find()
|
||
->andWhere(['code' => $sid])
|
||
->exists();
|
||
|
||
if (!$fiasExists) {
|
||
return '';
|
||
}
|
||
|
||
$house = ArrayHelper::getValue(Yii::$app->request->post(), 'house', '');
|
||
$housing = ArrayHelper::getValue(Yii::$app->request->post(), 'housing', '');
|
||
|
||
return FiasDoma::streetIndex($sid, $house, $housing);
|
||
}
|
||
|
||
public function actionIalist(int $id)
|
||
{
|
||
$user = Yii::$app->user->identity;
|
||
$this->individualAchievementService->checkAccessibility($user, $id);
|
||
$application = $this->individualAchievementService->getApplication($id);
|
||
$application->archiveAdmissionCampaignHandler->handle();
|
||
|
||
if (!$this->individualAchievementService->checkIfAbiturientQuestionaryFilled($application)) {
|
||
Yii::$app->session->setFlash('needToSaveQuestionary', 'true');
|
||
return $this->redirect('/abiturient/questionary', 302);
|
||
}
|
||
|
||
if (!$user->canMakeStep('ia-list', $application)) {
|
||
return $this->redirect('/abiturient/index', 302);
|
||
}
|
||
$ind_achs = new ActiveDataProvider([
|
||
'query' => $application->getIndividualAchievements()
|
||
]);
|
||
$hasError = false;
|
||
$error = Yii::$app->session->get('ia_error');
|
||
|
||
if ($error == '1') {
|
||
$hasError = true;
|
||
Yii::$app->session->set('ia_error', '0');
|
||
}
|
||
|
||
return $this->render(
|
||
'ialist',
|
||
[
|
||
'application_comparison' => $this->individualAchievementService->getApplicationComparison($user, $application),
|
||
'ind_achs' => $ind_achs,
|
||
'application' => $application,
|
||
'canEdit' => ($application->canEdit() && $application->canEditSpecialities()),
|
||
'hasError' => $hasError,
|
||
'user' => $user
|
||
]
|
||
);
|
||
}
|
||
|
||
public function actionIaFileRequired()
|
||
{
|
||
$document_type_id = Yii::$app->request->post('document_type_id');
|
||
if (!is_null($document_type_id)) {
|
||
$type = IndividualAchievementDocumentType::findOne($document_type_id);
|
||
if (!empty($type)) {
|
||
return $this->asJson((bool)$type->scan_required);
|
||
}
|
||
}
|
||
return $this->asJson(false);
|
||
}
|
||
|
||
public function actionIaDocTypes()
|
||
{
|
||
Yii::$app->response->format = Response::FORMAT_JSON;
|
||
|
||
return $this->individualAchievementService->getIndividualAchievementDocumentTypesDataForSelect();
|
||
}
|
||
|
||
public function actionGetEducationByDocumentType(int $app_id, int $ia_document_type_id)
|
||
{
|
||
|
||
Yii::$app->response->format = Response::FORMAT_JSON;
|
||
|
||
$user = Yii::$app->user->identity;
|
||
$this->individualAchievementService->checkAccessibility($user, $app_id);
|
||
$ia_document_type = IndividualAchievementDocumentType::findOne($ia_document_type_id);
|
||
if (is_null($ia_document_type)) {
|
||
throw new NotFoundHttpException('Тип документа не найден');
|
||
}
|
||
$document_type = $ia_document_type->documentTypeRef;
|
||
$application = $this->individualAchievementService->getApplication($app_id);
|
||
|
||
$education = $application->getEducations()
|
||
->joinWith(['documentType document_type'])
|
||
->andWhere(['document_type.ref_key' => $document_type->ref_key])
|
||
->one();
|
||
return [
|
||
'matched' => $education ? [
|
||
'id' => $education->id,
|
||
'series' => $education->series,
|
||
'number' => $education->number,
|
||
'document_type_id' => $education->document_type_id,
|
||
'issued_by' => $education->getSchoolName(),
|
||
'issued_at' => $education->date_given,
|
||
'contractor_id' => $education->contractor_id,
|
||
'files' => $education->getAttachments()
|
||
->joinWith(['linkedFile linked_file'])
|
||
->select(['linked_file.upload_name'])
|
||
->column()
|
||
] : null
|
||
];
|
||
}
|
||
|
||
public function actionAddia(int $app_id, $id = null)
|
||
{
|
||
$user = Yii::$app->user->identity;
|
||
$this->individualAchievementService->checkAccessibility($user, $app_id);
|
||
|
||
$application = $this->individualAchievementService->getApplication($app_id);
|
||
|
||
if (!Yii::$app->request->isPost) {
|
||
return $this->redirect(Yii::$app->request->referrer);
|
||
}
|
||
$ia = $this->individualAchievementService->getOrCrateIndividualAchievement(
|
||
$user,
|
||
$application,
|
||
$id
|
||
);
|
||
|
||
if ($this->individualAchievementService->fillFromEducationData($application, $ia)) {
|
||
return $this->redirect(Yii::$app->request->referrer);
|
||
}
|
||
|
||
$transaction = Yii::$app->db->beginTransaction();
|
||
if ($transaction === null) {
|
||
throw new UserException('Невозможно создать транзакцию.');
|
||
}
|
||
|
||
try {
|
||
$hasChangedAttributes = $this->individualAchievementService->savingProcess($application, $ia);
|
||
|
||
$transaction->commit();
|
||
} catch (Throwable $e) {
|
||
$transaction->rollBack();
|
||
throw $e;
|
||
}
|
||
|
||
$alertBody = Yii::$app->configurationManager->getText('no_data_saved_text');
|
||
$alertClass = 'alert-warning';
|
||
if ($hasChangedAttributes) {
|
||
$alertBody = Yii::t(
|
||
'abiturient/bachelor/individual-achievement/all',
|
||
'Текст сообщения успешного сохранения формы на стр. индивидуальных достижений: `Форма сохранена успешно.`'
|
||
);
|
||
$alertClass = 'alert-success';
|
||
}
|
||
|
||
Yii::$app->session->setFlash('alert', [
|
||
'body' => $alertBody,
|
||
'options' => ['class' => $alertClass]
|
||
]);
|
||
|
||
return $this->redirect(Yii::$app->request->referrer);
|
||
}
|
||
|
||
public function actionUpdateContact()
|
||
{
|
||
$user = Yii::$app->user->identity;
|
||
if (Yii::$app->request->isPost && $user->userRef) {
|
||
$this->questionaryService->updateContactFromPost($user);
|
||
}
|
||
return $this->redirect(Url::toRoute(['/abiturient/questionary']), 302);
|
||
}
|
||
|
||
public function actionReturnApplication(int $id)
|
||
{
|
||
$user = Yii::$app->user->identity;
|
||
$this->applicationsService->checkAccessibility($user, $id);
|
||
$application = $this->applicationsService->getApplication($id);
|
||
|
||
$sandboxEnabled = Yii::$app->configurationManager->getSandboxEnabled();
|
||
if (
|
||
!$application ||
|
||
($sandboxEnabled && !$user->isModer()) ||
|
||
(!$sandboxEnabled && $application->user_id != $user->id)
|
||
) {
|
||
return $this->redirect(Yii::$app->request->referrer ?? Yii::$app->homeUrl);
|
||
}
|
||
|
||
$errorMessage = $this->applicationsService->returnApplication(
|
||
$application,
|
||
$sandboxEnabled
|
||
);
|
||
if (!$errorMessage) {
|
||
Yii::$app->commandBus->handle(new AddToTimelineCommand([
|
||
'category' => 'abiturient',
|
||
'event' => 'application_return',
|
||
'data' => [
|
||
'public_identity' => $user->getPublicIdentity(),
|
||
'user_id' => $user->getId(),
|
||
'campaign' => $application->type->campaignName,
|
||
]
|
||
]));
|
||
}
|
||
$url = '/abiturient/applications';
|
||
if ($sandboxEnabled && $user->isModer()) {
|
||
$url = Url::toRoute(['/sandbox/index']);
|
||
if ($errorMessage) {
|
||
$url = Url::toRoute(['/sandbox/moderate', 'id' => $application->id]);
|
||
$returnApplicationStepsInfo = [
|
||
'status' => ApplicationApplyingStep::STEP_STATUS_FAILED,
|
||
'errors' => [$errorMessage],
|
||
'name' => Yii::t(
|
||
'abiturient/applications/all',
|
||
'Тело ошибки отзыва заявление; на странице заявлений поступающего: `Возникли ошибки.`'
|
||
),
|
||
'shortName' => 'return-application-steps',
|
||
'statusMessage' => Yii::t(
|
||
'abiturient/applications/all',
|
||
'Тело ошибки отзыва заявление; на странице заявлений поступающего: `Во время отзыва заявления.`'
|
||
),
|
||
];
|
||
Yii::$app->session->setFlash('returnApplicationStepsInfo', $returnApplicationStepsInfo);
|
||
}
|
||
}
|
||
return $this->redirect($url);
|
||
}
|
||
|
||
public function actionMarkReturnApplication(int $id)
|
||
{
|
||
$user = Yii::$app->user->identity;
|
||
$this->applicationsService->checkAccessibility($user, $id);
|
||
$application = $this->applicationsService->getApplication($id);
|
||
|
||
if ($application->isArchive()) {
|
||
Yii::$app->session->setFlash('alert', [
|
||
'body' => Yii::t('abiturient/errors', 'Сообщение поступающему при работе с архивным заявлением: `Вы работаете с неактуальной версией заявления`'),
|
||
'options' => ['class' => 'alert-danger']
|
||
]);
|
||
return $this->redirect(['/abiturient/applications']);
|
||
}
|
||
$transaction = Yii::$app->db->beginTransaction();
|
||
try {
|
||
$this->applicationsService->markReturnApplication($user, $application);
|
||
|
||
$transaction->commit();
|
||
} catch (Throwable $e) {
|
||
$transaction->rollBack();
|
||
throw $e;
|
||
}
|
||
return $this->redirect('/abiturient/applications');
|
||
}
|
||
|
||
public function actionMarkRejectEnrollment(int $bachelor_spec_id)
|
||
{
|
||
$bachelor_spec = $this->applicationsService->getBachelorSpeciality($bachelor_spec_id);
|
||
$application = $bachelor_spec->application;
|
||
$user = Yii::$app->user->identity;
|
||
|
||
$this->applicationsService->checkAccessibility($user, $application->id);
|
||
|
||
if ($application->isArchive()) {
|
||
Yii::$app->session->setFlash('alert', [
|
||
'body' => Yii::t('abiturient/errors', 'Сообщение поступающему при работе с архивным заявлением: `Вы работаете с неактуальной версией заявления`'),
|
||
'options' => ['class' => 'alert-danger']
|
||
]);
|
||
return $this->redirect(['/abiturient/applications']);
|
||
}
|
||
$transaction = Yii::$app->db->beginTransaction();
|
||
try {
|
||
$application_to_send = $this->applicationsService->markRejectEnrollment($user, $bachelor_spec);
|
||
$this->application1CProcessorService->sendApplicationTo1C($user, $application_to_send);
|
||
|
||
$transaction->commit();
|
||
} catch (Throwable $e) {
|
||
$transaction->rollBack();
|
||
throw $e;
|
||
}
|
||
return $this->redirect('/abiturient/applications');
|
||
}
|
||
|
||
public function actionRejectEnrollment(int $bachelor_spec_id)
|
||
{
|
||
$bachelor_spec = $this->applicationsService->getBachelorSpeciality($bachelor_spec_id);
|
||
$application = $bachelor_spec->application;
|
||
$user = Yii::$app->user->identity;
|
||
|
||
$this->applicationsService->checkAccessibility($user, $application->id);
|
||
|
||
$sandboxEnabled = Yii::$app->configurationManager->getSandboxEnabled();
|
||
if (
|
||
!$application ||
|
||
($sandboxEnabled && !$user->isModer()) ||
|
||
(!$sandboxEnabled && $application->user_id != $user->id)
|
||
) {
|
||
return $this->redirect(Yii::$app->request->referrer ?? Yii::$app->homeUrl);
|
||
}
|
||
|
||
$errorMessage = $this->applicationsService->rejectEnrollment(
|
||
$user,
|
||
$bachelor_spec,
|
||
$sandboxEnabled
|
||
);
|
||
|
||
if (!$errorMessage) {
|
||
Yii::$app->commandBus->handle(new AddToTimelineCommand([
|
||
'category' => 'abiturient',
|
||
'event' => 'enrollment_rejection',
|
||
'data' => [
|
||
'public_identity' => $user->getPublicIdentity(),
|
||
'user_id' => $user->getId(),
|
||
'campaign' => $application->type->campaignName,
|
||
]
|
||
]));
|
||
}
|
||
|
||
$url = '/abiturient/applications';
|
||
if ($sandboxEnabled && $user->isModer()) {
|
||
$url = Url::toRoute(['/sandbox/index']);
|
||
if ($errorMessage) {
|
||
$url = Url::toRoute(['/sandbox/moderate', 'id' => $application->id]);
|
||
$returnApplicationStepsInfo = [
|
||
'status' => ApplicationApplyingStep::STEP_STATUS_FAILED,
|
||
'errors' => [$errorMessage],
|
||
'name' => Yii::t(
|
||
'abiturient/applications/all',
|
||
'Тело ошибки отзыва заявление; на странице заявлений поступающего: `Возникли ошибки.`'
|
||
),
|
||
'shortName' => 'return-application-steps',
|
||
'statusMessage' => Yii::t(
|
||
'abiturient/applications/all',
|
||
'Тело ошибки отзыва заявление; на странице заявлений поступающего: `Во время отказа от зачисления.`'
|
||
),
|
||
];
|
||
Yii::$app->session->setFlash('returnApplicationStepsInfo', $returnApplicationStepsInfo);
|
||
}
|
||
}
|
||
return $this->redirect($url);
|
||
}
|
||
|
||
private function renderParents(AbiturientQuestionary $questionary)
|
||
{
|
||
return $this->renderAjax("questionary_partial/parentData/_parent_grid", [
|
||
'parents' => new ActiveDataProvider([
|
||
'query' => $questionary->getParentData()
|
||
]),
|
||
'canEdit' => $questionary->canEditQuestionary(),
|
||
]);
|
||
}
|
||
|
||
public function actionParentForm(?int $current_application_id = null)
|
||
{
|
||
$user = Yii::$app->user->identity;
|
||
$this->questionaryService->checkAccessibilityToRelatedBachelorApplication($user, $current_application_id);
|
||
$current_application = $this->questionaryService->getRelatedBachelorApplication($user, $current_application_id);
|
||
|
||
[
|
||
'questionary' => $questionary,
|
||
'needRefreshPage' => $_,
|
||
] = $this->questionaryService->getQuestionary($user);
|
||
|
||
$model = $this->parentDataService->getOrBuildParentData(
|
||
$user,
|
||
$questionary,
|
||
'parentDataId'
|
||
);
|
||
$canEdit = $questionary->canEditQuestionary();
|
||
|
||
$action = Url::to(array_merge(
|
||
['/abiturient/set-parent-data'],
|
||
$model->id ? ['id' => $model->id] : []
|
||
));
|
||
|
||
return $this->renderAjax(
|
||
'questionary_partial/parentData/_parentForm',
|
||
[
|
||
'model' => $model,
|
||
'familyTypes' => $this->parentDataService->getFamilyTypes(),
|
||
'passportTypes' => $this->parentDataService->getAllIdentityDocuments(),
|
||
'document_type' => $this->parentDataService->getDocumentTypeID(),
|
||
'keynum' => $model->id,
|
||
'action' => $action,
|
||
'canEdit' => $canEdit,
|
||
'isReadonly' => !$canEdit,
|
||
'application' => $current_application,
|
||
]
|
||
);
|
||
}
|
||
|
||
public function actionUploadPhoto(int $questionary_id)
|
||
{
|
||
Yii::$app->response->format = Response::FORMAT_JSON;
|
||
$user = Yii::$app->user->identity;
|
||
|
||
$this->avatarService->checkAccessibility($user, $questionary_id);
|
||
$questionary = $this->avatarService->getQuestionaryById($user, $questionary_id);
|
||
|
||
$error = '';
|
||
$status = false;
|
||
$fileLink = '';
|
||
$transaction = Yii::$app->db->beginTransaction();
|
||
try {
|
||
[
|
||
'error' => $error,
|
||
'status' => $status,
|
||
'fileLink' => $fileLink,
|
||
] = $this->avatarService->uploadAvatar($questionary);
|
||
|
||
$transaction->commit();
|
||
} catch (Throwable $e) {
|
||
$transaction->rollBack();
|
||
|
||
$status = false;
|
||
$error = 'Возникла критическая ошибка обработки фотографии.';
|
||
|
||
Yii::error(
|
||
"Возникла критическая ошибка обработки фотографии. По причине: {$e->getMessage()}",
|
||
'AbiturientController.actionUploadPhoto'
|
||
);
|
||
}
|
||
return [
|
||
'error' => $error,
|
||
'status' => $status,
|
||
'filelink' => $fileLink,
|
||
];
|
||
}
|
||
|
||
public function actionDeletePhoto(int $questionary_id)
|
||
{
|
||
Yii::$app->response->format = Response::FORMAT_JSON;
|
||
$user = Yii::$app->user->identity;
|
||
|
||
$this->avatarService->checkAccessibility($user, $questionary_id);
|
||
$questionary = $this->avatarService->getQuestionaryById($user, $questionary_id);
|
||
|
||
try {
|
||
return ['status' => $this->avatarService->deleteAvatar($questionary)];
|
||
} catch (Throwable $e) {
|
||
return ['status' => false, 'error' => $e->getMessage()];
|
||
}
|
||
}
|
||
|
||
public function actionHaveNoPreviousPassport(int $id)
|
||
{
|
||
$user = Yii::$app->user->identity;
|
||
$questionary = $this->passportDataService->getQuestionaryById($user, $id);
|
||
|
||
$questionary->have_no_previous_passport = true;
|
||
if (!$questionary->save()) {
|
||
throw new RecordNotValid($questionary);
|
||
}
|
||
|
||
Yii::$app->session->setFlash('alert', [
|
||
'body' => Yii::t(
|
||
'abiturient/questionary/all',
|
||
'Текст при успешном сохранении пометки об отсутствии предыдущего паспорта: `Информация успешно сохранена, можете вернуться к подаче заявления.`'
|
||
),
|
||
'options' => ['class' => 'alert-success']
|
||
]);
|
||
|
||
return $this->redirect(['/abiturient/questionary']);
|
||
}
|
||
}
|