portal.mkgtu.ru/common/modules/abiturient/models/CheckAllApplication.php

568 lines
26 KiB
PHP
Raw Permalink Normal View History

2024-03-28 09:51:45 +03:00
<?php
namespace common\modules\abiturient\models;
use common\components\UserReferenceTypeManager\UserReferenceTypeManager;
use common\models\AttachmentType;
use common\modules\abiturient\models\bachelor\BachelorApplication;
use common\modules\abiturient\models\bachelor\BachelorSpeciality;
use common\modules\abiturient\models\bachelor\EducationData;
use common\modules\abiturient\models\interfaces\IDraftable;
use common\modules\abiturient\models\parentData\ParentData;
use common\modules\abiturient\models\questionary\QuestionarySettings;
use Yii;
use yii\base\UserException;
use yii\bootstrap4\Html;
use yii\helpers\Url;
class CheckAllApplication
{
private function cleanMessage(array $message): string
{
$message = implode(", ", $message);
$messagePrefix = Yii::t(
'abiturient/bachelor/check-all-application/all',
'Текст префикса ошибки валидации данных анкеты или заявления: `Необходимо заполнить`'
);
$message = str_replace("{$messagePrefix} «", '', $message);
return '<br>' . str_replace('».', '', $message);
}
public function validateAbiturientQuestionary(AbiturientQuestionary $questionary, array $additional_application_types = []): array
{
if (empty($questionary)) {
return [
false,
''
];
}
$message = [];
if (!$questionary->validate()) {
foreach ($questionary->errors as $error) {
$message[] = $error[0];
}
}
$personalData = $questionary->personalData;
if (empty($personalData)) {
$personalData = new PersonalData(['questionary_id' => $questionary->id]);
}
if ($personalData->validation_extender) {
$personalData->validation_extender->additional_application_types = $additional_application_types;
}
if (!$personalData->validate()) {
foreach ($personalData->errors as $error) {
$message[] = $error[0];
}
}
$passports = $questionary->passportData;
if ($passports) {
foreach ($passports as $passport) {
if (!$passport->validate()) {
foreach ($passport->errors as $error) {
$message[] = 'Паспорт: ' . $error[0];
}
}
}
if (!$questionary->isPassportsRequiredFilesAttached()) {
$message[] = Yii::t(
'abiturient/bachelor/check-all-application/all',
'Текст ошибки при отсутствии скан-копии паспорта в анкете; при валидации данных анкеты или заявления: `Отсутствует скан-копия паспорта`'
);
}
if (!$questionary->isPreviousPassportsFilled()) {
$message[] = Yii::t(
'abiturient/bachelor/check-all-application/all',
'Текст ошибки при отсутствии информации о предыдущем паспорте в анкете: `Отсутствует информация о предыдущем документе, удостоверяющем личность.`'
) . ' ' . Html::a(
Yii::t(
'abiturient/bachelor/check-all-application/all',
'Текст ссылки для пропуска проверки на наличие предыдущих документов: `У меня нет информации о предыдущих документах, удостоверяющих личность.`'
),
Url::to(['/abiturient/have-no-previous-passport', 'id' => $questionary->id]),
);
}
} else {
$message[] = Yii::t(
'abiturient/bachelor/check-all-application/all',
'Текст ошибки при отсутствии паспорта в анкете; при валидации данных анкеты или заявления: `Не указано ни одного паспорта`'
);
}
if (!$questionary->isRequiredCommonFilesAttached()) {
$message[] = Yii::t(
'abiturient/bachelor/check-all-application/all',
'Текст ошибки при отсутствии обязательной скан-копии в анкете; при валидации данных анкеты: `Не заполнены обязательные скан-копии в разделе Анкета`'
);
}
$parentsData = $questionary->parentData ?? [];
foreach ($parentsData as $parentData) {
$parentPersonalData = $parentData->personalData;
$parent = $parentData->stringify();
if (is_null($parentPersonalData)) {
$message[] = Yii::t(
'abiturient/bachelor/check-all-application/all',
'Текст ошибки при добавлении родителя с не заполненным персональными данными; при валидации данных анкеты или заявления: `Для добавленного родителя или законного представителя ({parent}) отсутствуют персональные данные.`',
['parent' => $parent]
);
continue;
}
if (is_null($parentPersonalData->citizenship) && QuestionarySettings::getSettingByName('require_ctitizenship_parent')) {
$message[] = Yii::t(
'abiturient/bachelor/check-all-application/all',
'Текст ошибки при добавлении родителя с не заполненным данными о гражданстве; при валидации данных анкеты или заявления: `Для добавленного родителя или законного представителя ({parent}) отсутствуют данные о гражданстве.`',
['parent' => $parent]
);
}
}
$addressData = $questionary->addressData;
if (empty($addressData)) {
$addressData = new AddressData(['questionary_id' => $questionary->id]);
}
if (!$addressData->validate()) {
foreach ($addressData->errors as $error) {
$message[] = $error[0];
}
}
$actualAddressData = $questionary->getOrCreateActualAddressData(false);
if ($actualAddressData->validation_extender) {
$actualAddressData->validation_extender->additional_application_types = $additional_application_types;
$actualAddressData->validation_extender->modelPreparationCallback();
}
if (!$actualAddressData->validate()) {
foreach ($actualAddressData->errors as $error) {
$message[] = $error[0];
}
}
$missing_attachment_type_ids = $questionary->getNotFilledRequiredCommonAttachmentTypeIds();
$missing_attachment_types = AttachmentType::find()->andWhere(['id' => $missing_attachment_type_ids])->all();
foreach ($missing_attachment_types as $attachment_type) {
$message[] = $attachment_type->name;
}
if (empty($message)) {
return [
true,
''
];
} else {
return [
false,
$this->cleanMessage($message)
];
}
}
public function validateAbiturientIalist(BachelorApplication $application): array
{
$ind_achs = $application->individualAchievements;
$message = [];
foreach ($ind_achs as $ach) {
if (!$ach->validate()) {
foreach ($ach->errors as $error) {
$message[] = $error[0];
}
}
}
if (!$application->isIndividualAchievementsRequiredFilesAttached()) {
$message[] = Yii::t(
'abiturient/bachelor/check-all-application/all',
'Текст ошибки при отсутствии скан-копии индивидуального достижения в заявлении; при валидации данных заявления: `Отсутствует скан-копия индивидуального достижения`'
);
}
if (empty($message)) {
return [
true,
''
];
} else {
return [
false,
$this->cleanMessage($message)
];
}
}
public function checkBlockAndUpdate(BachelorApplication $application): array
{
$message = [];
[$update, $block] = NeedBlockAndUpdateProcessor::getProcessedNeedBlockAndUpdate($application);
if ($update) {
$is_versions_mismatch = UserReferenceTypeManager::IsUserRefDataVersionOutdated($application->user);
$message[] = Yii::t(
'abiturient/bachelor/check-all-application/all',
'Текст при невозможности подать заявление так как в Информационной системе вуза есть заявление с более поздней датой: `В приёмной кампании обнаружено заявление с более поздней датой, необходимо актуализировать текущее заявление.`'
);
if ($is_versions_mismatch) {
$message[] = Yii::t(
'abiturient/bachelor/check-all-application/all',
'Сообщение об обнаруженном различии версий данных анкеты в Информационной системе вуза и портале: `Различаются версии данных Анкеты в Личном кабинете поступающего и Информационной системе вуза, необходимо актуализировать данные анкеты перед подачей заявления.`'
);
}
}
if ($block && !Yii::$app->configurationManager->sandboxEnabled) {
$message[] = Yii::t(
'abiturient/bachelor/check-all-application/all',
'Текст при невозможности подать заявление так как в Информационной системе вуза есть не проведённые сущности: `Заявление заблокировано. Для разблокировки обратитесь в приемную кампанию вуза.`'
);
}
if (empty($message)) {
return [
true,
''
];
} else {
return [
false,
$this->cleanMessage($message)
];
}
}
public function validateBachelorEge(bool $hide_ege, BachelorApplication $application): array
{
if ($hide_ege) {
return [
true,
''
];
}
$message = [];
foreach ($application->getSavedEgeResults() as $ege) {
if (!$ege->validate()) {
foreach ($ege->errors as $error) {
$message[] = $error[0];
}
}
}
if ($application->haveUnstagedDisciplineSet()) {
$message[] = Yii::t(
'abiturient/bachelor/check-all-application/all',
'Текст ошибки для отсутствующего набора ВИ; при валидации данных анкеты или заявления: `Необходимо подтвердить набор вступительных испытаний`'
);
}
if ($application->haveUnstagedDisciplineResult()) {
$message[] = Yii::t(
'abiturient/bachelor/check-all-application/all',
'Текст ошибки при не сохранённых результатах ВИ; при валидации данных анкеты или заявления: `Необходимо сохранить результаты вступительных испытаний`'
);
}
$not_filled_attachment_type_ids = $application->getNotFilledRequiredExamsScanTypeIds();
$required_attachment_types = AttachmentType::find()->andWhere(['id' => $not_filled_attachment_type_ids])->all();
foreach ($required_attachment_types as $attachment_type) {
$message[] = $attachment_type->name;
}
$haveValidationErrors = false;
if ($application->type->enable_check_ege) {
$check_errors = [];
foreach ($application->specialities as $speciality) {
$check_error = $speciality->checkBalls();
if ($check_error !== null) {
$check_errors[] = $check_error;
}
}
if ($check_errors) {
$haveValidationErrors = true;
\Yii::$app->session->setFlash('checkEgeErrorsAbit', json_encode($check_errors));
}
}
if ($haveValidationErrors) {
$message[] = Yii::t(
'abiturient/bachelor/check-all-application/all',
'Текст ошибки валидации результатов ВИ; при валидации данных анкеты или заявления: `Ошибка валидации результатов вступительных испытаний`'
);
}
if (empty($message)) {
return [
true,
''
];
} else {
return [
false,
$this->cleanMessage($message)
];
}
}
public function validateBachelorEducation(BachelorApplication $application): array
{
$educations = $application->educations;
$message = [];
if (empty($educations)) {
$educations = [new EducationData()];
}
foreach ($educations as $education) {
if (!$education->validate()) {
foreach ($education->errors as $error) {
$message[] = $error[0];
}
}
}
if (!$application->isEducationDocumentsRequiredFilesAttached()) {
$message[] = Yii::t(
'abiturient/bachelor/check-all-application/all',
'Текст ошибки при отсутствии скан-копии документа об образовании в заявлении; при валидации данных заявления: `Отсутствует скан-копия документа об образовании`'
);
}
$not_filled_attachment_type_ids = $application->getNotFilledRequiredEducationScanTypeIds();
$required_attachment_types = AttachmentType::find()->andWhere(['id' => $not_filled_attachment_type_ids])->all();
foreach ($required_attachment_types as $attachment_type) {
$message[] = $attachment_type->name;
}
if (empty($message)) {
return [
true,
''
];
} else {
return [
false,
$this->cleanMessage($message)
];
}
}
public function validateBachelorPreferences(BachelorApplication $application): array
{
$message = [];
if (!$application->isBachelorPreferencesRequiredFilesAttached()) {
$message[] = Yii::t(
'abiturient/bachelor/check-all-application/all',
'Текст ошибки при отсутствии скан-копии документа об образовании в заявлении; при валидации данных заявления: `Отсутствует скан-копия документа льготы или преимущественного права`'
);
}
if (!$application->isBachelorTargetReceptionsRequiredFilesAttached()) {
$message[] = Yii::t(
'abiturient/bachelor/check-all-application/all',
'Текст ошибки при отсутствии скан-копии документа об образовании в заявлении; при валидации данных заявления: `Отсутствует скан-копия документа о целевом наборе`'
);
}
if (empty($message)) {
return [
true,
''
];
} else {
return [
false,
$this->cleanMessage($message)
];
}
}
public function validateBachelorApplication(BachelorApplication $application): array
{
$message = [];
$specialities = $application->specialities;
if (empty($specialities)) {
$message[] = Yii::t(
'abiturient/bachelor/check-all-application/application',
'Текст ошибки проверки заявления если не выбрано ни одного НП: `Для подачи заявления необходимо выбрать хотя бы одно направление подготовки`'
);
}
$actual_application_container = null;
foreach ($specialities as $speciality) {
$speciality->scenario = BachelorSpeciality::SCENARIO_FULL_VALIDATION;
if (!$speciality->validate() || !$speciality->validateAgreementDate()) {
foreach ($speciality->errors as $errors) {
foreach ($errors as $error) {
$message[] = $error;
}
}
}
[$canSend, $messageSend] = $speciality->canSendByPeriod(
$actual_application_container,
$application->hasAnyNotVerifiedAgreementEntity()
);
if (!$canSend) {
$message[] = $messageSend;
}
}
$not_filled_attachment_type_ids = $application->getNotFilledRequiredSpecialitiesScanTypeIds();
$required_attachment_types = AttachmentType::find()->andWhere(['id' => $not_filled_attachment_type_ids])->all();
$missed_attachments = [];
foreach ($required_attachment_types as $attachment_type) {
$missed_attachments[] = $attachment_type->name;
}
if ($missed_attachments) {
$message[] = Yii::t('abiturient/bachelor/check-all-application/application', 'Текст сообщающий о нехватке обязательных скан-копий: `Необходимо приложить скан-копии:`') . ' ' . implode(', ', $missed_attachments);
}
if (!$application->type->checkResubmitPermission($application->user) && $application->hasApprovedApplication()) {
$message[] = Yii::t('abiturient/bachelor/check-all-application/all', 'Текст ошибки при повторной подаче заявления: `В данную приёмную капанию запрещена подача заявлений после одобрения модератором, для повторной подачи заявления необходимо обратиться в приёмную кампанию.`');
}
if (empty($message)) {
return [
true,
''
];
} else {
return [
false,
$this->cleanMessage($message)
];
}
}
public function checkAllApplication(BachelorApplication $application, bool $write_flash = true)
{
$response = [];
$questionary = $application->abiturientQuestionary;
[$validate, $message] = $this->validateAbiturientQuestionary($questionary);
if (!$validate) {
$response[] = [
'url' => Url::toRoute(['/abiturient/questionary']),
'title' => Yii::t(
'abiturient/bachelor/check-all-application/all',
'Подпись ссылки на раздел "анкеты" в котором произошла ошибка; при валидации данных анкеты или заявления: `Анкета: `'
),
'message' => $message,
];
}
[$validate, $message] = $this->validateBachelorEducation($application);
if (!$validate) {
$response[] = [
'url' => Url::toRoute(['bachelor/education', 'id' => $application->id]),
'title' => Yii::t(
'abiturient/bachelor/check-all-application/all',
'Подпись ссылки на раздел "образование" в котором произошла ошибка; при валидации данных анкеты или заявления: `Образование: `'
),
'message' => $message,
];
}
[$validate, $message] = $this->validateBachelorPreferences($application);
if (!$validate) {
$response[] = [
'url' => Url::toRoute(['bachelor/accounting-benefits', 'id' => $application->id]),
'title' => Yii::t(
'abiturient/bachelor/check-all-application/all',
'Подпись ссылки на раздел "льготы" в котором произошла ошибка; при валидации данных заявления: `Особые условия поступления: `'
),
'message' => $message,
];
}
[$validate, $message] = $this->validateBachelorApplication($application);
if (!$validate) {
$response[] = [
'url' => Url::toRoute(['bachelor/application', 'id' => $application->id]),
'title' => Yii::t(
'abiturient/bachelor/check-all-application/all',
'Подпись ссылки на раздел "направлений подготовки" в котором произошла ошибка; при валидации данных анкеты или заявления: `Направления подготовки: `'
),
'message' => $message,
];
}
[$validate, $message] = $this->validateBachelorEge($application->type->hide_ege, $application);
if (!$validate) {
$response[] = [
'url' => Url::toRoute(['bachelor/ege', 'id' => $application->id]),
'title' => Yii::t(
'abiturient/bachelor/check-all-application/all',
'Подпись ссылки на раздел "вступительных испытаний" в котором произошла ошибка; при валидации данных анкеты или заявления: `Вступительные испытания: `'
),
'message' => $message,
];
}
[$validate, $message] = $this->validateAbiturientIalist($application);
if (!$validate) {
$response[] = [
'url' => Url::toRoute(['/abiturient/ialist']),
'title' => Yii::t(
'abiturient/bachelor/check-all-application/all',
'Подпись ссылки на раздел "индивидуальных достижений" в котором произошла ошибка; при валидации данных анкеты или заявления: `Индивидуальные достижения: `'
),
'message' => $message,
];
}
[$validate, $message] = $this->checkBlockAndUpdate($application);
if (!$validate) {
$response[] = [
'url' => Url::toRoute(['bachelor/application', 'id' => $application->id]),
'title' => Yii::t(
'abiturient/bachelor/check-all-application/all',
'Текст при невозможности подать заявление из-за конфликтов данных с Информационной системой вуза: `Конфликт данных с заявлением в приёмной кампании`'
),
'message' => $message,
];
}
if ($write_flash) {
Yii::$app->session->setFlash('resultOfCheckingAllApplication', $response);
}
return $response;
}
public function handleSentToModerateApplicationCheck(?BachelorApplication $application): array
{
if ($application && $application->draft_status == IDraftable::DRAFT_STATUS_CREATED && $application->hasSentToModerateRecordInHistory()) {
return $this->checkAllApplication($application, false);
}
return [];
}
}