portal.mkgtu.ru/common/modules/abiturient/controllers/AbiturientController.php

1120 lines
42 KiB
PHP
Raw Normal View History

2024-03-28 09:51:45 +03:00
<?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']);
}
}