commentService = $commentService; $this->benefitsService = $benefitsService; $this->educationService = $educationService; $this->loadScansService = $loadScansService; $this->olympiadsService = $olympiadsService; $this->entrantTestService = $entrantTestService; $this->paidContractService = $paidContractService; $this->changeHistoryService = $changeHistoryService; $this->targetReceptionsService = $targetReceptionsService; $this->accountingBenefitsService = $accountingBenefitsService; $this->admissionAgreementService = $admissionAgreementService; $this->bachelorSpecialityService = $bachelorSpecialityService; $this->centralizedTestingService = $centralizedTestingService; $this->specialityPrioritiesService = $specialityPrioritiesService; $this->individualAchievementService = $individualAchievementService; $this->application1CProcessorService = $application1CProcessorService; parent::__construct($id, $module, $config); } public function behaviors() { return [ 'access' => [ 'class' => AccessControl::class, 'rules' => [ [ 'actions' => [ 'accounting-benefits', 'add-agree', 'add-paid-contract', 'application-change-history', 'application-infinite-scroll-history', 'application', 'autofill-specialty', 'check-can-send-application', 'comment', 'consults', 'create-application', 'decline-agreement', 'delete-centralized-testing', 'download-attached-paid-contract', 'edu-docs', 'edu-levels', 'edu-profile', 'education', 'ege-save-result', 'ege', 'exams', 'load-scans', 'make-copy', 'olympiads-list', 'preference-list', 'print-application-by-full-package', 'print-application-return-form', 'print-enrollment-rejection-form', 'printforms', 'reload-ege', 'remove-agreement-decline', 'remove-attached-paid-contract', 'save-attached-application-files', 'send-application', 'validate-application', 'get-available-parent-specialities', ], 'allow' => true, 'roles' => [User::ROLE_ABITURIENT] ], [ 'actions' => [ 'application-change-history', 'application-infinite-scroll-history', 'download-attached-paid-contract', 'edu-docs', 'edu-levels', 'edu-profile', 'olympiads-list', 'preference-list', 'reload-ege', ], 'allow' => true, 'roles' => [User::ROLE_MANAGER] ], [ 'actions' => [ 'application-change-history', 'application-infinite-scroll-history', ], 'allow' => true, 'roles' => [User::ROLE_VIEWER] ], [ 'actions' => [ 'add-specialities', 'define-discipline-set', 'delete-education', 'removespeciality', 'reorderspeciality', 'save-education', 'update-full-package', ], 'allow' => true, 'roles' => [User::ROLE_MANAGER, User::ROLE_ABITURIENT] ], ], ], [ 'class' => EmailConfirmBehavior::class, 'user' => Yii::$app->user->identity ], 'verbs' => [ 'class' => VerbFilter::class, 'actions' => [ 'save-education' => ['POST'], ], ], ]; } public function actions() { return ['error' => ['class' => ErrorAction::class]]; } public function actionCreateApplication() { $request = Yii::$app->request; $user = Yii::$app->user->identity; if (!$user->canMakeStep('make-application') || !$request->isPost) { return $this->redirect('/abiturient/questionary', 302); } $application_type = $this->application1CProcessorService->getApplicationTypeFromPost($user); if ( !$application_type || !$application_type->haveStageOne() ) { return $this->redirect('/abiturient/questionary', 302); } [$questionary_filled_for_this_type, $error_message] = (new CheckAllApplication())->validateAbiturientQuestionary($user->abiturientQuestionary, [$application_type]); if ( $questionary_filled_for_this_type && $bachelorApplication = $this->application1CProcessorService->createBachelorApplication($user, $application_type) ) { return $this->redirect(Url::toRoute(['bachelor/education', 'id' => $bachelorApplication->id])); } elseif (trim((string)$error_message)) { Yii::$app->session->setFlash('alert', [ 'body' => Yii::t( 'abiturient/header', 'Текст ошибки при выборе ПК: `Для подачи заявления в данную приёмную кампанию необходимо заполнить: {errorMessage}`', ['errorMessage' => $error_message] ), 'options' => ['class' => 'alert-danger'] ]); } return $this->redirect('/abiturient/questionary', 302); } public function actionEducation(int $id) { $user = Yii::$app->user->identity; $this->educationService->checkAccessibility($user, $id); $application = $this->educationService->getApplication($id); if (!$this->educationService->checkIfAbiturientQuestionaryFilled($application)) { Yii::$app->session->setFlash('needToSaveQuestionary', 'true'); return $this->redirect('/abiturient/questionary', 302); } $canEdit = $application->canEdit(); [ 'attachments' => $attachments, 'regulations' => $regulations, ] = $this->educationService->getRegulationsAndAttachmentsForEducation($application); [ 'allowAddNewEducationAfterApprove' => $allowAddNewEducationAfterApprove, 'allowAddNewFileToEducationAfterApprove' => $allowAddNewFileToEducationAfterApprove, 'allowDeleteFileFromEducationAfterApprove' => $allowDeleteFileFromEducationAfterApprove, ] = $this->educationService->getFileControlFlags($application); [ 'isAttachmentsAdded' => $isAttachmentsAdded, 'attachmentErrors' => $attachmentErrors, ] = $this->educationService->checkAttachmentFiles($application, $canEdit); if (Yii::$app->request->isPost) { try { [ 'hasChanges' => $hasChanges, 'attachments' => $attachments, 'regulations' => $regulations, ] = $this->educationService->postProcessingRegulationsAndAttachments( $application, $attachments, $regulations ); } catch (Throwable $th) { $this->educationService->processErrorMessageProcessingSavingAttachment($th, 'BachelorController.actionEducation'); } if (!$hasChanges) { Yii::$app->session->setFlash('alert', [ 'body' => Yii::$app->configurationManager->getText('no_data_saved_text', $application->type ?? null), 'options' => ['class' => 'alert-warning'] ]); } else if (!Yii::$app->user->identity->isModer()) { $nextStepUrl = $this->educationService->getNextStep($application); if ($nextStepUrl) { return $this->redirect($nextStepUrl); } } } return $this->render( 'education', [ 'canEdit' => $canEdit, 'application_comparison' => $this->educationService->getApplicationComparison($user, $application), 'education_datum' => $application->getEducations()->with(['application.user'])->all(), 'status' => Yii::$app->session->getFlash('educationSaved', false), 'hasChangedAttributes' => Yii::$app->session->getFlash('hasChangedAttributes', null), 'attachments' => $attachments, 'isAttachmentsAdded' => $isAttachmentsAdded, 'attachmentErrors' => $attachmentErrors, 'application' => $application, 'regulations' => $regulations, 'allowAddNewEducationAfterApprove' => $allowAddNewEducationAfterApprove, 'allowAddNewFileToEducationAfterApprove' => $allowAddNewFileToEducationAfterApprove, 'allowDeleteFileFromEducationAfterApprove' => $allowDeleteFileFromEducationAfterApprove, ] ); } public function actionSaveEducation(int $app_id, int $edu_id = null) { $user = Yii::$app->user->identity; $this->educationService->checkAccessibility($user, $app_id); $application = $this->educationService->getApplication($app_id); $is_manager = Yii::$app->user->identity->isModer(); if (is_null($application)) { throw new NotFoundHttpException('Не найдено указанное заявление'); } if ($is_manager && !$application->type->moderator_allowed_to_edit) { throw new ForbiddenHttpException('Модератору не разрешено вносить изменения'); } $education = $this->educationService->getEducation($application, $edu_id); [ 'allowAddNewEducationAfterApprove' => $allowAddNewEducationAfterApprove, 'allowAddNewFileToEducationAfterApprove' => $allowAddNewFileToEducationAfterApprove, 'allowDeleteFileFromEducationAfterApprove' => $allowDeleteFileFromEducationAfterApprove, ] = $this->educationService->getFileControlFlags($application); $error_msg = ''; if ( ($is_manager || $allowAddNewEducationAfterApprove || $allowAddNewFileToEducationAfterApprove || $allowDeleteFileFromEducationAfterApprove || $application->canEdit()) && !$education->hasEnlistedBachelorSpecialities() ) { $education->load(Yii::$app->request->post()); $this->educationService->setContractor($education); if ($education->validate()) { [ 'education' => $education, 'educationSaved' => $educationSaved, 'hasChangedAttributes' => $hasChangedAttributes, ] = $this->educationService->educationSaveProcess($application, $education, $is_manager); Yii::$app->session->setFlash('hasChangedAttributes', $hasChangedAttributes); if ($educationSaved) { Yii::$app->session->setFlash('educationSaved', $hasChangedAttributes); if ( !$is_manager && $warningAlertBody = $this->educationService->afterEducationSaveProcessAsNotModerator($application, $education) ) { Yii::$app->session->setFlash('alert', [ 'body' => $warningAlertBody, 'options' => ['class' => 'alert-warning'] ]); } } } else { $error_msg = implode( '\n', array_filter(array_map( function ($error) { return is_array($error) ? array_values($error)[0] : $error; }, $education->errors )) ); Yii::$app->session->setFlash('educationErrors', $error_msg); } } if (!Yii::$app->request->isAjax) { return $this->redirect(Yii::$app->request->referrer ?: Yii::$app->homeUrl); } else { return $this->asJson(['status' => true, 'messages' => []]); } } public function actionDeleteEducation(int $app_id, int $edu_id) { $user = Yii::$app->user->identity; $this->educationService->checkAccessibility($user, $app_id); $application = $this->educationService->getApplication($app_id); $this->educationService->deleteEducation($application, $edu_id); return $this->redirect(Yii::$app->request->referrer ?: Yii::$app->homeUrl); } public function actionEge(int $id) { $user = Yii::$app->user->identity; $this->entrantTestService->checkAccessibility($user, $id); $application = $this->entrantTestService->getApplication($id); if (!$this->entrantTestService->checkIfAbiturientQuestionaryFilled($application)) { return $this->redirect('/abiturient/questionary', 302); } $canEdit = $application->canEdit() && $application->canEditSpecialities(); [ 'attachments' => $attachments, 'regulations' => $regulations, ] = $this->entrantTestService->getRegulationsAndAttachmentsForEntrantTest($application); $egeResult = new EgeResult(); $egeResult->application_id = $application->id; $competitiveGroupEntranceTest = DictionaryCompetitiveGroupEntranceTest::getDataProviderByApplication($application); return $this->render( 'ege', [ 'application_comparison' => $this->entrantTestService->getApplicationComparison($user, $application), 'canEdit' => $canEdit, 'results' => $application->getSavedEgeResults(), 'regulations' => $regulations, 'application' => $application, 'attachments' => $attachments, 'competitiveGroupEntranceTest' => $competitiveGroupEntranceTest, 'newEgeResult' => $egeResult, ] ); } public function actionEgeSaveResult(int $id) { if (!Yii::$app->request->isPost) { return $this->redirect(['ege', 'id' => $id], 302); } $user = Yii::$app->user->identity; $this->entrantTestService->checkAccessibility($user, $id); $application = $this->entrantTestService->getApplication($id); if (!$this->entrantTestService->checkIfAbiturientQuestionaryFilled($application)) { return $this->redirect('/abiturient/questionary', 302); } [ 'attachments' => $attachments, 'regulations' => $regulations, ] = $this->entrantTestService->getRegulationsAndAttachmentsForEntrantTest($application); if (Yii::$app->request->isPost) { try { [ 'hasChanges' => $hasChanges, 'attachments' => $attachments, 'regulations' => $regulations, ] = $this->entrantTestService->postProcessingRegulationsAndAttachments( $application, $attachments, $regulations ); } catch (Throwable $th) { $this->entrantTestService->processErrorMessageProcessingSavingAttachment($th, 'BachelorController.actionEgeSaveResult'); } if (isset($hasChanges) && !$hasChanges) { Yii::$app->session->setFlash('alert', [ 'body' => Yii::$app->configurationManager->getText('no_data_saved_text', $application->type ?? null), 'options' => ['class' => 'alert-warning'] ]); } else if (!Yii::$app->user->identity->isModer()) { $nextStepUrl = $this->entrantTestService->getNextStep($application); if ($nextStepUrl) { return $this->redirect($nextStepUrl); } } } return $this->redirect(Yii::$app->request->referrer); } public function actionComment(int $id) { $user = Yii::$app->user->identity; $this->commentService->checkAccessibility($user, $id); $application = $this->commentService->getApplication($id); if (!$this->commentService->checkIfAbiturientQuestionaryFilled($application)) { Yii::$app->session->setFlash('needToSaveQuestionary', 'true'); return $this->redirect('/abiturient/questionary', 302); } if (!($model = CommentsComing::findOne(['bachelor_application_id' => $id]))) { $model = new CommentsComing(); } $comSaved = null; $alertBody = null; $alertClass = null; $comNotSaved = null; if (Yii::$app->request->isPost) { [ 'comSaved' => $comSaved, 'alertBody' => $alertBody, 'alertClass' => $alertClass, 'comNotSaved' => $comNotSaved, ] = $this->commentService->commentPostProcessing($model, $application, $user->id); } if ($comSaved) { Yii::$app->session->setFlash('comSaved', $comSaved); } if ($comNotSaved) { Yii::$app->session->setFlash('comNotSaved', $comNotSaved); } if ($alertBody && $alertClass) { Yii::$app->session->setFlash('alert', [ 'body' => $alertBody, 'options' => ['class' => $alertClass] ]); } return $this->render('comment', [ 'application' => $application, 'model' => $model, ]); } public function actionApplication(int $id) { $user = Yii::$app->user->identity; $this->bachelorSpecialityService->checkAccessibility($user, $id); $application = $this->bachelorSpecialityService->getApplication($id); if ($application == null) { return $this->redirect('/abiturient/applications', 302); } if (!$this->bachelorSpecialityService->checkIfAbiturientQuestionaryFilled($application)) { return $this->redirect('/abiturient/questionary', 302); } $add_errors_json = Yii::$app->session->get('add_errors'); $add_errors = json_decode((string)$add_errors_json); Yii::$app->session->remove('add_errors'); $canEdit = $application->canEdit(); [ 'attachments' => $attachments, 'regulations' => $regulations, ] = $this->bachelorSpecialityService->getRegulationsAndAttachmentsForEducation($application); if ($canEdit && !$this->specialityPrioritiesService->checkPrioritiesSettled($application)) { $this->specialityPrioritiesService->setUpPriorities($application); } if (!$user->canMakeStep('specialities', $application)) { return $this->redirect(['/bachelor/education', 'id' => $id]); } $specialities = $this->bachelorSpecialityService->getSelectedSpecialityList($application); if (Yii::$app->request->isPost && $canEdit) { [$spec_changed, $has_errors] = $this->bachelorSpecialityService->processLoadedData( $application, $specialities, Yii::$app->request->post(), true ); if (!$has_errors && !$user->isModer()) { $nextStepUrl = $this->bachelorSpecialityService->getNextStep($application); if ($nextStepUrl) { return $this->redirect($nextStepUrl); } } if (!$spec_changed) { Yii::$app->session->setFlash('alert', [ 'body' => Yii::$app->configurationManager->getText('no_data_saved_text', $application->type ?? null), 'options' => ['class' => 'alert-warning'] ]); } } $this->bachelorSpecialityService->validateAllSpecialities($specialities); $spec_Ids = ArrayHelper::getColumn($specialities, 'id'); $agrees = AdmissionAgreement::find()->active()->andWhere(['in', 'speciality_id', $spec_Ids])->all(); $hasAgree = (bool)$agrees; $this->bachelorSpecialityService->checkUpdateContractDocsFrom1C($application, $specialities); $application->setScenario(BachelorApplication::SCENARIO_APPLICATION_WITH_EDUCATION); return $this->render( 'application', ArrayHelper::merge( [ 'hasAgree' => $hasAgree, 'add_errors' => $add_errors, 'application' => $application, 'attachments' => $attachments, 'regulations' => $regulations, 'specialities' => $specialities, 'isPost' => Yii::$app->request->isPost, 'target_receptions' => ArrayHelper::map($application->bachelorTargetReceptions, 'id', 'name'), 'limit_type' => $application->type->campaign->getMaxSpecialityType(), 'max_speciality_count' => $application->type->campaign->max_speciality_count, 'available_specialities' => $this->bachelorSpecialityService->getAvailableSpecialityList($application), 'application_comparison' => $this->bachelorSpecialityService->getApplicationComparison($user, $application), 'bachelorSpecialityService' => $this->bachelorSpecialityService, 'specialityPrioritiesService' => $this->specialityPrioritiesService, ], SpecialityRepository::getSpecialityFiltersData($application) ) ); } public function actionLoadScans(int $id) { $user = Yii::$app->user->identity; $this->loadScansService->checkAccessibility($user, $id); $application = $this->loadScansService->getApplication($id); if ($application == null) { return $this->redirect('/abiturient/applications', 302); } if (!$this->loadScansService->checkIfAbiturientQuestionaryFilled($application)) { Yii::$app->session->setFlash('needToSaveQuestionary', 'true'); return $this->redirect('/abiturient/questionary', 302); } $canEdit = $application->canEdit(); [ 'regulations' => $regulations, 'attachments' => $attachments, ] = $this->loadScansService->getAllRegulationsAndAttachments($application); if (Yii::$app->request->isPost) { try { [ 'hasChanges' => $hasChanges, 'attachments' => $attachments, 'regulations' => $regulations, ] = $this->loadScansService->postProcessingRegulationsAndAttachments( $application, $attachments, $regulations ); } catch (Throwable $th) { $this->loadScansService->processErrorMessageProcessingSavingAttachment($th, 'BachelorController.actionLoadScans'); } if (!$hasChanges) { Yii::$app->session->setFlash('alert', [ 'body' => Yii::$app->configurationManager->getText('no_data_saved_text', $application->type ?? null), 'options' => ['class' => 'alert-warning'] ]); } else if (!Yii::$app->user->identity->isModer()) { $nextStepUrl = $this->loadScansService->getNextStep($application); if ($nextStepUrl) { return $this->redirect($nextStepUrl); } } } [ 'attachmentErrors' => $attachmentErrors, 'isAttachmentsAdded' => $isAttachmentsAdded, ] = $this->loadScansService->checkAttachmentFiles($application, $canEdit); return $this->render( 'load-scans', [ 'application' => $application, 'regulations' => $regulations, 'attachmentErrors' => $attachmentErrors, 'isAttachmentsAdded' => $isAttachmentsAdded, 'full_attachments_package' => $attachments, ] ); } public function actionSendApplication(int $id) { $user = Yii::$app->user->identity; $this->application1CProcessorService->checkAccessibility($user, $id); $application = $this->application1CProcessorService->getApplication($id); if ($application->isArchive()) { Yii::$app->session->setFlash('alert', [ 'body' => Yii::t('abiturient/errors', 'Сообщение поступающему при работе с архивным заявлением: `Вы работаете с неактуальной версией заявления`'), 'options' => ['class' => 'alert-danger'] ]); return $this->redirect(['/abiturient/applications']); } $applicationErrors = (new CheckAllApplication())->checkAllApplication($application); $moderating_now = false; $hasError = !empty($applicationErrors); if (!$hasError && !$application->canBeSentToModerate()) { $moderating_now = true; Yii::$app->session->setFlash('alert', [ 'body' => Yii::$app->configurationManager->getText('sending_error_because_of_moderating_now', $application->type ?? null), 'options' => ['class' => 'alert-danger'] ]); } if ( !$hasError && !$moderating_now && $application->canEdit() && $application->specialities ) { $hasError = true; $addToTimelineCommandConfig = $this->application1CProcessorService->sendApplicationTo1C($user, $application); if ($addToTimelineCommandConfig) { $hasError = false; Yii::$app->commandBus->handle(new AddToTimelineCommand($addToTimelineCommandConfig)); } } Yii::$app->session->setFlash('applicationHasError', $hasError); return $this->redirect($hasError ? Yii::$app->request->referrer : ['abiturient/applications']); } public function actionPreferenceList(int $app_id, $id) { $user = Yii::$app->user->identity; $this->benefitsService->checkAccessibility($user, $app_id); Yii::$app->response->format = Response::FORMAT_JSON; return [ 'output' => $this->benefitsService->getPreferenceListForSelect($app_id), 'selected' => '' ]; } public function actionOlympiadsList(int $app_id, $id) { $user = Yii::$app->user->identity; $this->olympiadsService->checkAccessibility($user, $app_id); Yii::$app->response->format = Response::FORMAT_JSON; return [ 'output' => $this->olympiadsService->getOlympiadsListSelect($app_id, $id), 'selected' => '' ]; } public function actionDeleteCentralizedTesting(int $id, $app_id) { $user = Yii::$app->user->identity; $this->centralizedTestingService->checkAccessibility($user, $app_id); $application = $this->centralizedTestingService->getApplication($app_id); if (!$application) { Yii::$app->session->setFlash('alert', [ 'body' => Yii::t( 'abiturient/applications/all', 'Текст алерта ошибки доступа при попытке архивирования результатов ЦТ; на страницы заявлений поступающего: `Ошибка доступа! Вам не разрешено производить данное действие.`' ), 'options' => ['class' => 'alert-danger'] ]); return $this->redirect('/abiturient/applications', 302); } $centralizedTesting = $this->centralizedTestingService->getCentralizedTesting($application, $id); if (!$centralizedTesting) { Yii::$app->session->setFlash('alert', [ 'body' => Yii::t( '/bachelor/ege/all', 'Текст алерта ошибки не нахождения ЦТ при попытке архивирования результатов ЦТ; на странице ВИ: `Ошибка! Запись не обнаружена.`' ), 'options' => ['class' => 'alert-danger'] ]); return $this->redirect(Url::to(['/bachelor/ege', 'id' => $application->id])); } $centralizedTesting->archive(); Yii::$app->session->setFlash('alert', [ 'body' => Yii::t( '/bachelor/ege/all', 'Текст алерта успешного архивирования результатов ЦТ; на странице ВИ: `Запись успешно удалена.`' ), 'options' => ['class' => 'alert-success'] ]); return $this->redirect(Url::to(['/bachelor/ege', 'id' => $application->id])); } public function actionGetAvailableParentSpecialities() { $applicationId = $this->request->post('applicationId'); $this->response->format = Response::FORMAT_JSON; if (!$applicationId) { return []; } $user = Yii::$app->user->identity; $this->bachelorSpecialityService->checkAccessibility($user, $applicationId); $application = $this->bachelorSpecialityService->getApplication($applicationId); if (!$application->canEdit() || !$application->canEditSpecialities()) { return []; } $specialities = $application->specialities; $speciality_ids = ArrayHelper::getColumn($specialities, 'speciality_id'); $result = []; $processed_parent_spec_ids = []; foreach ($specialities as $speciality) { if ($speciality->speciality->parentCombinedCompetitiveGroupRef) { $parent_speciality = $speciality->speciality->parentCombinedCompetitiveGroupRefSpeciality; if ($parent_speciality && !$application->hasSpeciality($parent_speciality->id)) { if (in_array($parent_speciality->id, $processed_parent_spec_ids)) { continue; } $all_child_specs = $parent_speciality->getChildrenCombinedCompetitiveGroupRefSpecialities()->select('id')->column(); if (count(array_intersect($all_child_specs, $speciality_ids)) != count($all_child_specs)) { continue; } $processed_parent_spec_ids[] = $parent_speciality->id; $result[] = [ 'id' => $parent_speciality->id, 'name' => $parent_speciality->competitiveGroupRef->reference_name, ]; } } } return $result; } public function actionAddSpecialities(int $id) { $user = Yii::$app->user->identity; $this->bachelorSpecialityService->checkAccessibility($user, $id); $application = $this->bachelorSpecialityService->getApplication($id); $errors = []; if ($application == null) { return $this->redirect('/abiturient/questionary', 302); } if (Yii::$app->request->isPost && $application->canEdit()) { if (Yii::$app->request->post('spec') != null) { $postSpecData = Yii::$app->request->post('spec'); $postSpecialityOrder = []; if (EmptyCheck::isNonEmptyJson(Yii::$app->request->post('spec_order'))) { $postSpecialityOrder = json_decode(Yii::$app->request->post('spec_order')); } $errors = $this->specialityPrioritiesService->addSpecialitiesByIds( $application, $postSpecData, $postSpecialityOrder ); } } if ($errors) { Yii::$app->session->set('add_errors', json_encode($errors)); } return $this->redirect(Yii::$app->request->referrer); } public function actionRemovespeciality(int $id) { $user = Yii::$app->user->identity; $this->bachelorSpecialityService->checkAccessibility($user, $id); $application = $this->bachelorSpecialityService->getApplication($id); $is_manager = $user->isModer(); if (!$application) { if ($is_manager) { $this->redirect('/sandbox/index'); } else { $this->redirect('/abiturient/questionary'); } } $redirect_to = $is_manager ? Url::toRoute(['/sandbox/moderate', 'id' => $application->id]) : Url::toRoute(['/bachelor/application', 'id' => $application->id]); if (Yii::$app->request->isPost && $application->canEdit()) { $spec = $this->bachelorSpecialityService->getBachelorSpecialityFromPostByApplication($application); [ 'hasError' => $hasError, 'errorMessage' => $errorMessage ] = $this->bachelorSpecialityService->checkCanRemoveSpeciality($spec); if ($hasError) { Yii::$app->session->setFlash( 'consentAddErrors', $errorMessage ); return $this->redirect($redirect_to); } if ($user->id == $application->user_id || $is_manager) { $this->specialityPrioritiesService->removeSpeciality($application, $spec); if (!$is_manager) { $application->resetStatus(); } } } return $this->redirect($redirect_to); } public function actionReorderspeciality(int $id) { $user = Yii::$app->user->identity; $this->bachelorSpecialityService->checkAccessibility($user, $id); $application = $this->bachelorSpecialityService->getApplication($id); $is_manager = $user->isModer(); if (!$application) { if ($is_manager) { $this->redirect('/sandbox/index'); } else { $this->redirect('/abiturient/questionary'); } } $redirect_to = $is_manager ? Url::toRoute(['/sandbox/moderate', 'id' => $application->id]) : Url::toRoute(['/bachelor/application', 'id' => $application->id]); if (Yii::$app->request->isPost && $application->canEdit()) { $move_type = Yii::$app->request->post("type"); $spec = $this->bachelorSpecialityService->getBachelorSpecialityFromPostByApplication($application); if ($spec && $spec->canEdit()) { $this->specialityPrioritiesService->changeSpecialityPriority($application, $spec, $move_type); if (!$is_manager) { $application->resetStatus(); } } } return $this->redirect($redirect_to); } public function actionAutofillSpecialty($application_id = null) { Yii::$app->response->format = Response::FORMAT_JSON; if (!Yii::$app->request->isPost) { Yii::$app->response->statusCode = 400; Yii::error( 'Ошибка добавления КГ "На общих основаниях", т.к. использовался метод передачи данных отличный от POST: ', 'BachelorControllerForAutofillSpeciality.actionAutofillSpecialty' ); $alert = Alert::widget([ 'options' => ['class' => 'alert-danger'], 'body' => Yii::t( 'abiturient/header/autofill-specialty-modal', 'Текст сообщения об ошибке, если использовался метод передачи данных отличный от POST; в модальном окне автозаполнения НП на панели навигации ЛК: `Не удалось обработать данные. Обратитесь к администратору`' ), ]); return ['error' => $alert]; } $user = Yii::$app->user->identity; $data = [ 'archive' => false, 'user_id' => $user->id, 'id' => $application_id, ]; $application = BachelorApplication::findOne($data); if (!$application) { Yii::$app->response->statusCode = 400; Yii::error( 'Ошибка добавления КГ "На общих основаниях", т.к. заявление не найдено по запросу: ' . print_r($data, true), 'BachelorControllerForAutofillSpeciality.actionAutofillSpecialty' ); $alert = Alert::widget([ 'options' => ['class' => 'alert-danger'], 'body' => Yii::t( 'abiturient/header/autofill-specialty-modal', 'Текст сообщения об ошибке, если не удалось нейти заявление; в модальном окне автозаполнения НП на панели навигации ЛК: `Не удалось найти заявление. Обратитесь к администратору`' ), ]); return ['error' => $alert]; } Yii::$app->session->set('isAutofillSpecialty', true); $allSpecialtyIds = ArrayHelper::getValue(Yii::$app->request->post(), 'allSpecialtyIds', []); $selectedSpecialtyIds = ArrayHelper::getValue(Yii::$app->request->post(), 'selectedSpecialtyIds', []); $notSelectedSpecialtyIds = array_diff($allSpecialtyIds, $selectedSpecialtyIds); if ($notSelectedSpecialtyIds) { Yii::$app->session->set('notSelectedSpecialtyIds', $notSelectedSpecialtyIds); } if (!$selectedSpecialtyIds) { Yii::$app->response->statusCode = 200; return ['message' => '']; } $postSpecData = array_unique($selectedSpecialtyIds); $errors = $this->specialityPrioritiesService->addSpecialitiesByIds($application, $postSpecData); if ($errors) { Yii::$app->response->statusCode = 400; Yii::error( 'Ошибка добавления КГ "На общих основаниях", т.к. возникли ошибки при автоматическом добавлении НП: ' . print_r(Yii::$app->session->get('add_errors'), true), 'BachelorControllerForAutofillSpeciality.actionAutofillSpecialty' ); $alert = Alert::widget([ 'options' => ['class' => 'alert-danger'], 'body' => Yii::t( 'abiturient/header/autofill-specialty-modal', 'Текст сообщения об ошибке, если не удалось добавить КГ "На общих основаниях"; в модальном окне автозаполнения НП на панели навигации ЛК: `Ошибка добавления направления. Повторите попытку позже.`' ), ]); return ['error' => $alert]; } Yii::$app->response->statusCode = 200; return ['message' => '']; } public function actionAddPaidContract($spec_id) { $user = Yii::$app->user->identity; $speciality = BachelorSpeciality::findOne($spec_id); $this->paidContractService->checkAccessibility($user, $speciality->application_id); $application = $this->paidContractService->getApplication($speciality->application_id); $this->paidContractService->uploadAttachment( $user, $application, $speciality ); return $this->redirect(Url::to(['/bachelor/application', 'id' => $application->id]), 302); } public function actionDownloadAttachedPaidContract(int $id) { $user = Yii::$app->user->identity; $speciality = BachelorSpeciality::findOne($id); $this->paidContractService->checkAccessibility($user, $speciality->application_id); $application = $this->paidContractService->getApplication($speciality->application_id); [ 'path' => $path, 'fileName' => $fileName, ] = $this->paidContractService->getPathAndNameAttachment($speciality); if ($path && $fileName) { return Yii::$app->response->sendFile($path, $fileName); } return $this->redirect(Url::to(['/bachelor/application', 'id' => $application->id]), 302); } public function actionRemoveAttachedPaidContract(int $id) { $user = Yii::$app->user->identity; $speciality = BachelorSpeciality::findOne($id); $this->paidContractService->checkAccessibility($user, $speciality->application_id); $application = $this->paidContractService->getApplication($speciality->application_id); if ($speciality && $attached = $speciality->getAttachedPaidContract()) { $attached->safeDelete($user); } return $this->redirect(Url::to(['/bachelor/application', 'id' => $application->id]), 302); } public function actionAddAgree() { $goBackRedirect = $this->goBack( !empty(Yii::$app->request->referrer) ? Yii::$app->request->referrer : null ); $user = Yii::$app->user->identity; $spec_id = (int)Yii::$app->request->post('spec_id'); $speciality = BachelorSpeciality::findOne($spec_id); if ( !$speciality || !Yii::$app->request->isPost ) { return $goBackRedirect; } $id = $speciality->application_id; $this->admissionAgreementService->checkAccessibility($user, $id); $application = $this->admissionAgreementService->getApplication($id); $goBackRedirect = $this->redirect(Url::toRoute(['/bachelor/application', 'id' => $application->id]), 302); [ 'canEdited' => $canEdited, 'consentAddErrors' => $consentAddErrors, ] = $this->admissionAgreementService->checkAgreementAccessibility($application, $speciality); if (!$canEdited) { Yii::$app->session->setFlash('consentAddErrors', $consentAddErrors); return $goBackRedirect; } $this->admissionAgreementService->createAgreements($user, $application, $speciality); return $goBackRedirect; } public function actionEduLevels() { Yii::$app->response->format = Response::FORMAT_JSON; return [ 'output' => $this->educationService->getEducationLevelsDataForSelect(), 'selected' => '' ]; } public function actionEduDocs() { Yii::$app->response->format = Response::FORMAT_JSON; return [ 'output' => $this->educationService->getEducationDocsDataForSelect(), 'selected' => '' ]; } public function actionEduProfile() { Yii::$app->response->format = Response::FORMAT_JSON; [ 'output' => $output, 'selected' => $selectedProfile, ] = $this->educationService->getEducationProfileDataForSelect(); return [ 'output' => $output, 'selected' => $selectedProfile, ]; } public function actionReloadEge(int $id) { $goBackUrl = Yii::$app->request->referrer ?: Yii::$app->homeUrl; if (Yii::$app->user->identity->isModer()) { $goBackUrl = Url::toRoute(['sandbox/moderate', 'id' => $id]); } $user = Yii::$app->user->identity; $this->entrantTestService->checkAccessibility($user, $id); $application = $this->entrantTestService->getApplication($id); if (!$application) { return $this->redirect($goBackUrl); } $this->entrantTestService->solvedConflict($application); Yii::$app->session->setFlash('successEgeReload', true); return $this->redirect($goBackUrl); } public function actionPrintApplicationByFullPackage( int $application_id, $report_type, string $application_build_type = BachelorSpecialityService::BUILD_APPLICATION_TYPE_FULL ) { $user = Yii::$app->user->identity; $this->bachelorSpecialityService->checkAccessibility($user, $application_id); $application = $this->bachelorSpecialityService->getApplication($application_id); if ($application === null) { throw new NotFoundHttpException('Не удалось найти нужное заявление'); } $isSeparateStatementForFullPaymentBudget = $application->type->rawCampaign->separate_statement_for_full_payment_budget; if (!$isSeparateStatementForFullPaymentBudget) { $application_build_type = BachelorSpecialityService::BUILD_APPLICATION_TYPE_FULL; } [ 'fullFileName' => $fullFileName, 'base64FileBinaryCode' => $base64FileBinaryCode, ] = $this->bachelorSpecialityService->getFileApplicationReport( $user, $application, $report_type, Yii::$app->soapClientWebApplication, $this->specialityPrioritiesService, $application_build_type ); Yii::$app->response->sendContentAsFile($base64FileBinaryCode, $fullFileName); } public function actionPrintApplicationReturnForm(int $application_id, $type) { $user = Yii::$app->user->identity; $this->bachelorSpecialityService->checkAccessibility($user, $application_id); $application = $this->bachelorSpecialityService->getApplication($application_id); if ($application === null) { throw new NotFoundHttpException('Не удалось найти нужное заявление'); } $allow_types = [ 'ApplicationReturn', 'AgreementReturn', ]; if (!in_array($type, $allow_types)) { throw new InvalidArgumentException("Некорректный тип печатной формы."); } [ 'fullFileName' => $fullFileName, 'base64FileBinaryCode' => $base64FileBinaryCode, ] = $this->bachelorSpecialityService->getFileApplicationReturnForm( $user, $application, $type, Yii::$app->soapClientWebApplication ); Yii::$app->response->sendContentAsFile($base64FileBinaryCode, $fullFileName); } public function actionPrintEnrollmentRejectionForm(int $bachelor_spec_id) { $user = Yii::$app->user->identity; $bachelor_spec = $this->bachelorSpecialityService->getBachelorSpeciality($bachelor_spec_id); $application = $bachelor_spec->application; $this->bachelorSpecialityService->checkAccessibility($user, $application->id); [ 'fullFileName' => $fullFileName, 'base64FileBinaryCode' => $base64FileBinaryCode, ] = $this->bachelorSpecialityService->getFileEnrollmentRejectionForm( $user, $application, Yii::$app->soapClientWebApplication, $bachelor_spec_id ); Yii::$app->response->sendContentAsFile($base64FileBinaryCode, $fullFileName); } public function actionAccountingBenefits($id = null) { $user = Yii::$app->user->identity; $this->accountingBenefitsService->checkAccessibility($user, $id); $application = $this->accountingBenefitsService->getApplication($id); [ 'attachments' => $targetReceptionAttachments, 'regulations' => $targetReceptionRegulations, ] = $this->targetReceptionsService->getRegulationsAndAttachmentsForTarget($application); [ 'attachments' => $olympAttachments, 'regulations' => $olympRegulations, ] = $this->olympiadsService->getRegulationsAndAttachmentsForOlympiad($application); [ 'attachments' => $preferenceAttachments, 'regulations' => $preferenceRegulations, ] = $this->benefitsService->getRegulationsAndAttachmentsForPreference($application); if (Yii::$app->request->isPost) { try { ['hasChanges' => $hasChanges] = $this->accountingBenefitsService->postProcessingRegulationsAndAttachments( $application, array_merge($targetReceptionAttachments, $olympAttachments, $preferenceAttachments), array_merge($targetReceptionRegulations, $olympRegulations, $preferenceRegulations) ); } catch (Throwable $th) { $this->accountingBenefitsService->processErrorMessageProcessingSavingAttachment($th, 'BachelorController.actionAccountingBenefits'); } if (!$hasChanges) { Yii::$app->session->setFlash('alert', [ 'body' => Yii::$app->configurationManager->getText('no_data_saved_text', $application->type ?? null), 'options' => ['class' => 'alert-warning'] ]); } else if (!Yii::$app->user->identity->isModer()) { $nextStepUrl = $this->accountingBenefitsService->getNextStep($application); if ($nextStepUrl) { return $this->redirect($nextStepUrl); } } } $resultTargets = $this->targetReceptionsService->getTargets($id); $resultBenefits = $this->benefitsService->getBenefits($id); $resultOlympiads = $this->olympiadsService->getOlympiads($id); return $this->render( 'accounting-benefits', [ 'application' => $application, 'application_comparison' => $this->accountingBenefitsService->getApplicationComparison($user, $application), 'resultBenefits' => $resultBenefits, 'resultOlympiads' => $resultOlympiads, 'resultTargets' => $resultTargets, 'targetReceptionRegulations' => $targetReceptionRegulations, 'olympRegulations' => $olympRegulations, 'preferenceRegulations' => $preferenceRegulations, 'targetReceptionAttachments' => $targetReceptionAttachments, 'olympAttachments' => $olympAttachments, 'preferenceAttachments' => $preferenceAttachments, 'targetReceptionsService' => $this->targetReceptionsService, 'olympiadsService' => $this->olympiadsService, 'benefitsService' => $this->benefitsService, ] ); } public function actionDefineDisciplineSet(int $id) { $user = Yii::$app->user->identity; $this->entrantTestService->checkAccessibility($user, $id); $application = $this->entrantTestService->getApplication($id); $hasError = false; if (Yii::$app->request->isPost) { [ 'hasError' => $hasError, 'classForAlert' => $classForAlert, 'messageForAlert' => $messageForAlert, ] = $this->entrantTestService->defineDisciplineSet($application, $user); Yii::$app->session->setFlash('alert', [ 'body' => $messageForAlert, 'options' => ['class' => $classForAlert] ]); } $url = Yii::$app->request->referrer; if (!$hasError) { $url = Url::to(['bachelor/ege', 'id' => $id, '#' => 'bachelor_entrance_test_results']); if (Yii::$app->user->identity->isModer()) { $url = Url::to(['sandbox/moderate', 'id' => $id, '#' => 'forward']); } } return $this->redirect($url); } public function actionDeclineAgreement($id = null) { $user = Yii::$app->user->identity; $agreement_id = $id ?? (int)Yii::$app->request->post('agreement_id'); if (!$agreement = AdmissionAgreement::findOne($agreement_id)) { return $this->redirect(Yii::$app->request->referrer ?? Yii::$app->homeUrl, 302); } $speciality = $agreement->speciality; $id = $speciality->application_id; $this->admissionAgreementService->checkAccessibility($user, $id); $application = $this->admissionAgreementService->getApplication($id); if ( $speciality->is_enlisted || !$application->canEdit() || !$speciality->canAddAgreements() ) { return $this->redirect(Yii::$app->request->referrer ?? Yii::$app->homeUrl, 302); } try { $this->admissionAgreementService->declineAgreements($user, $application, $agreement); } catch (\Throwable $e) { Yii::$app->session->setFlash( 'consentAddErrors', Yii::t('abiturient/bachelor/admission-agreement/all', 'Текст ошибки отзыве согласия на зачисление, на странице НП: `Возникли ошибки при отзыве согласия.`') ); } return $this->redirect(Yii::$app->request->referrer ?? Yii::$app->homeUrl, 302); } public function actionRemoveAgreementDecline() { $user = Yii::$app->user->identity; $agreement_decline_id = (int)Yii::$app->request->post("agreement_decline_id"); if (!$agreement_decline_id) { return $this->redirect(Yii::$app->request->referrer ?? Yii::$app->homeUrl); } $agreement_decline = AgreementDecline::findOne($agreement_decline_id); $agreement = $agreement_decline->agreement; $speciality = $agreement_decline->agreement->speciality; $applicationId = $speciality->application_id; $this->admissionAgreementService->checkAccessibility($user, $applicationId); $application = $this->admissionAgreementService->getApplication($applicationId); if ($agreement_decline->isSentTo1C) { throw new Exception('Невозможно отозвать отзыв согласия на зачисления, так как он уже одобрен'); } $transcation = Yii::$app->db->beginTransaction(); try { $agreement_to_delete = $agreement_decline->agreementToDelete; $agreement_to_delete->archive = true; $agreement_decline->archive(); $agreement->status = AdmissionAgreement::STATUS_VERIFIED; if (!$agreement_to_delete->save(true, ['archive'])) { throw new RecordNotValid($agreement_to_delete); } if (!$agreement->save()) { throw new RecordNotValid($agreement); } $this->admissionAgreementService->changeAgreementDeclineHistoryProcess( $user, $application, $speciality, $agreement ); $transcation->commit(); } catch (Throwable $e) { $transcation->rollBack(); throw $e; } return $this->redirect(Yii::$app->request->referrer ?? Yii::$app->homeUrl); } public function actionApplicationChangeHistory( int $id, int $sort_direction = SORT_ASC, ?int $limit = null, ?int $date_start = null, ?int $date_end = null ) { $user = Yii::$app->user->identity; $this->changeHistoryService->checkAccessibility($user, $id); $application = $this->changeHistoryService->getApplication($id); return $this->renderAjax( 'ajax/_applicationChangeHistory', ['change_history' => $this ->changeHistoryService ->getChangeHistoryByApplicationWithFilters( $user, $application, $sort_direction, $date_start, $date_end, $limit )] ); } public function actionApplicationInfiniteScrollHistory(int $id) { Yii::$app->response->format = Response::FORMAT_JSON; $user = Yii::$app->user->identity; $this->changeHistoryService->checkAccessibility($user, $id); $application = $this->changeHistoryService->getApplication($id); $changeHistories = $this ->changeHistoryService ->getChangeHistoryByApplicationWithFiltersFromPost( $user, $application ); $appendRender = ''; foreach ($changeHistories as $historyRow) { $appendRender .= $this->renderAjax( 'ajax/_applicationChangeHistoryOneNode', ['historyRow' => $historyRow] ); } return ['appendRender' => $appendRender]; } public function actionUpdateFullPackage(int $id, string $baseUrl) { $user = Yii::$app->user->identity; $this->application1CProcessorService->checkAccessibility($user, $id); $application = $this->application1CProcessorService->getApplication($id); if (empty($application)) { throw new NotFoundHttpException("Не удалось найти указанное заявление"); } $transaction = Yii::$app->db->beginTransaction(); try { $application = $this->application1CProcessorService->updateApplication($application); $transaction->commit(); } catch (Throwable $e) { $transaction->rollBack(); throw $e; } return $this->redirect(Url::to([$baseUrl, 'id' => $application->id])); } public function actionMakeCopy(int $id) { $user = Yii::$app->user->identity; $this->application1CProcessorService->checkAccessibility($user, $id); $application = $this->application1CProcessorService->getApplication($id); if (!$application) { return $this->redirect(Yii::$app->request->referrer ?? Yii::$app->homeUrl); } [ 'url' => $url, 'error_alert' => $errorAlert ] = $this->application1CProcessorService->createApplicationCopy($user, $application); if ($errorAlert) { Yii::$app->session->setFlash('alert', [ 'body' => $errorAlert, 'options' => ['class' => 'alert-danger'], ]); } if ($url) { return $this->redirect($url); } return $this->redirect(Yii::$app->request->referrer ?? Yii::$app->homeUrl); } public function actionValidateApplication(int $id) { $user = Yii::$app->user->identity; $this->application1CProcessorService->checkAccessibility($user, $id); $application = $this->application1CProcessorService->getApplication($id); return $this->asJson((new CheckAllApplication())->handleSentToModerateApplicationCheck($application)); } public function actionCheckCanSendApplication(int $id) { $user = Yii::$app->user->identity; $this->individualAchievementService->checkAccessibility($user, $id); $application = $this->individualAchievementService->getApplication($id); $result = $user->canMakeStep('send-application', $application); return $this->asJson($result ? 'true' : 'false'); } public function actionSaveAttachedApplicationFiles(int $id) { $user = Yii::$app->user->identity; $this->bachelorSpecialityService->checkAccessibility($user, $id); $application = $this->bachelorSpecialityService->getApplication($id); [ 'attachments' => $attachments, 'regulations' => $regulations, ] = $this->bachelorSpecialityService->getRegulationsAndAttachmentsForEducation($application); if (!Yii::$app->request->isPost) { return $this->redirect(Url::to(['/bachelor/application', 'id' => $application->id])); } try { [ 'hasChanges' => $hasChanges, 'attachments' => $attachments, 'regulations' => $regulations, ] = $this->bachelorSpecialityService->postProcessingRegulationsAndAttachments( $application, $attachments, $regulations ); } catch (Throwable $th) { $this->bachelorSpecialityService->processErrorMessageProcessingSavingAttachment($th, 'BachelorController.actionSaveAttachedApplicationFiles'); } if (!$hasChanges && !$user->isModer()) { Yii::$app->session->setFlash('alert', [ 'body' => Yii::$app->configurationManager->getText('no_data_saved_text', $application->type ?? null), 'options' => ['class' => 'alert-warning'] ]); } else if (!$user->isModer()) { $nextStepUrl = $this->bachelorSpecialityService->getNextStep($application); if ($nextStepUrl) { return $this->redirect($nextStepUrl); } } return $this->redirect(Url::to(['/bachelor/application', 'id' => $application->id])); } }