1204 lines
39 KiB
PHP
Executable File
1204 lines
39 KiB
PHP
Executable File
<?php
|
||
|
||
namespace common\modules\abiturient\models\bachelor;
|
||
|
||
use common\components\AfterValidateHandler\LoggingAfterValidateHandler;
|
||
use common\components\EntrantTestManager\CentralizedTestingManager;
|
||
use common\components\EntrantTestManager\EntrantTestManager;
|
||
use common\components\EntrantTestManager\ExamsScheduleManager;
|
||
use common\components\EntrantTestManager\JointEntrantTestManager;
|
||
use common\components\queries\ArchiveQuery;
|
||
use common\components\ReferenceTypeManager\ReferenceTypeManager;
|
||
use common\models\dictionary\DictionaryDateTimeOfExamsSchedule;
|
||
use common\models\dictionary\DictionaryPredmetOfExamsSchedule;
|
||
use common\models\dictionary\DictionaryReasonForExam;
|
||
use common\models\dictionary\ForeignLanguage;
|
||
use common\models\dictionary\StoredReferenceType\SpecialRequirementReferenceType;
|
||
use common\models\dictionary\StoredReferenceType\StoredChildDisciplineReferenceType;
|
||
use common\models\dictionary\StoredReferenceType\StoredDisciplineFormReferenceType;
|
||
use common\models\dictionary\StoredReferenceType\StoredDisciplineReferenceType;
|
||
use common\models\interfaces\ArchiveModelInterface;
|
||
use common\models\relation_presenters\comparison\interfaces\ICanGivePropsToCompare;
|
||
use common\models\relation_presenters\comparison\interfaces\IHaveIdentityProp;
|
||
use common\models\relation_presenters\OneToOneRelationPresenter;
|
||
use common\models\traits\ArchiveTrait;
|
||
use common\models\traits\HasDirtyAttributesTrait;
|
||
use common\models\traits\HtmlPropsEncoder;
|
||
use common\modules\abiturient\models\bachelor\changeHistory\ChangeHistory;
|
||
use common\modules\abiturient\models\bachelor\changeHistory\ChangeHistoryClasses;
|
||
use common\modules\abiturient\models\bachelor\changeHistory\ChangeHistoryDecoratedModel;
|
||
use common\modules\abiturient\models\bachelor\changeHistory\interfaces\ChangeLoggedModelInterface;
|
||
use common\modules\abiturient\models\drafts\IHasRelations;
|
||
use common\modules\abiturient\models\interfaces\ApplicationConnectedInterface;
|
||
use common\modules\abiturient\models\interfaces\ExamInterface;
|
||
use common\modules\abiturient\models\interfaces\ICanBeStringified;
|
||
use common\modules\abiturient\validators\CompetitiveGroupEntranceTestsValidator;
|
||
use common\modules\abiturient\validators\EgeResultValidator;
|
||
use Yii;
|
||
use yii\behaviors\TimestampBehavior;
|
||
use yii\db\ActiveQuery;
|
||
use yii\db\Expression;
|
||
use yii\helpers\ArrayHelper;
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
final class EgeResult extends ChangeHistoryDecoratedModel implements
|
||
ExamInterface,
|
||
ApplicationConnectedInterface,
|
||
ChangeLoggedModelInterface,
|
||
IHaveIdentityProp,
|
||
ICanGivePropsToCompare,
|
||
IHasRelations,
|
||
ArchiveModelInterface,
|
||
ICanBeStringified
|
||
{
|
||
use ArchiveTrait;
|
||
use HtmlPropsEncoder;
|
||
use HasDirtyAttributesTrait;
|
||
|
||
|
||
private $_minimalMaximalScore;
|
||
|
||
|
||
public $_application = null;
|
||
|
||
|
||
public $priority;
|
||
|
||
|
||
public $index = '';
|
||
|
||
public const SCENARIO_SAVE_SETTINGS = 'save_settings';
|
||
|
||
public static function tableName()
|
||
{
|
||
return '{{%bachelor_egeresult}}';
|
||
}
|
||
|
||
public function behaviors()
|
||
{
|
||
return [TimestampBehavior::class];
|
||
}
|
||
|
||
public function afterFind()
|
||
{
|
||
parent::afterFind();
|
||
$this->_oldAttributes = $this->attributes;
|
||
}
|
||
|
||
public function scenarios()
|
||
{
|
||
$scenarios = parent::scenarios();
|
||
$scenarios[EgeResult::SCENARIO_SAVE_SETTINGS] = $scenarios[EgeResult::SCENARIO_DEFAULT];
|
||
return $scenarios;
|
||
}
|
||
|
||
|
||
|
||
|
||
public function rules()
|
||
{
|
||
return [
|
||
[
|
||
'exam_form',
|
||
'safe'
|
||
],
|
||
[
|
||
[
|
||
'status',
|
||
'language_id',
|
||
'archived_at',
|
||
'discipline_id',
|
||
'application_id',
|
||
'cget_exam_form_id',
|
||
'reason_for_exam_id',
|
||
'cget_discipline_id',
|
||
'child_discipline_id',
|
||
'cget_child_discipline_id',
|
||
'special_requirement_ref_id',
|
||
],
|
||
'integer'
|
||
],
|
||
[
|
||
[
|
||
'archive',
|
||
'readonly',
|
||
],
|
||
'boolean',
|
||
],
|
||
[
|
||
[
|
||
'archive',
|
||
'readonly',
|
||
],
|
||
'default',
|
||
'value' => false
|
||
],
|
||
[
|
||
'status',
|
||
'default',
|
||
'value' => EgeResult::STATUS_UNSTAGED
|
||
],
|
||
[
|
||
['status'],
|
||
'in',
|
||
'range' => [
|
||
EgeResult::STATUS_STAGED,
|
||
EgeResult::STATUS_VERIFIED,
|
||
EgeResult::STATUS_UNSTAGED,
|
||
EgeResult::STATUS_NOTVERIFIED,
|
||
]
|
||
],
|
||
[
|
||
['readonly'],
|
||
'in',
|
||
'range' => [false, true]
|
||
],
|
||
[
|
||
[
|
||
'discipline_points',
|
||
'egeyear',
|
||
'exam_form',
|
||
'child_discipline_code'
|
||
],
|
||
'string',
|
||
'max' => 100
|
||
],
|
||
[
|
||
'entrance_test_junction',
|
||
'string',
|
||
'max' => 32
|
||
],
|
||
[
|
||
[
|
||
'cget_discipline_id',
|
||
'cget_child_discipline_id',
|
||
],
|
||
CompetitiveGroupEntranceTestsValidator::class,
|
||
],
|
||
[
|
||
'cget_child_discipline_id',
|
||
'required',
|
||
'when' => function (EgeResult $model) {
|
||
return $model->hasChildren();
|
||
},
|
||
'message' => Yii::t(
|
||
'abiturient/bachelor/ege/ege-result',
|
||
'Подсказка с ошибкой для поля "cget_child_discipline_id"; формы ВИ: `Укажите предмет вступительного испытания`'
|
||
),
|
||
'on' => [self::SCENARIO_SAVE_SETTINGS]
|
||
],
|
||
[
|
||
'cget_exam_form_id',
|
||
'required'
|
||
],
|
||
[
|
||
['reason_for_exam_id'],
|
||
'exist',
|
||
'skipOnError' => false,
|
||
'skipOnEmpty' => true,
|
||
'targetClass' => DictionaryReasonForExam::class,
|
||
'targetAttribute' => ['reason_for_exam_id' => 'id']
|
||
],
|
||
[
|
||
['language_id'],
|
||
'exist',
|
||
'skipOnError' => false,
|
||
'skipOnEmpty' => true,
|
||
'targetClass' => ForeignLanguage::class,
|
||
'targetAttribute' => ['language_id' => 'id']
|
||
],
|
||
[
|
||
['cget_exam_form_id'],
|
||
'exist',
|
||
'skipOnError' => false,
|
||
'skipOnEmpty' => true,
|
||
'targetClass' => StoredDisciplineFormReferenceType::class,
|
||
'targetAttribute' => ['cget_exam_form_id' => 'id']
|
||
],
|
||
[
|
||
['cget_discipline_id'],
|
||
'exist',
|
||
'skipOnError' => false,
|
||
'skipOnEmpty' => true,
|
||
'targetClass' => StoredDisciplineReferenceType::class,
|
||
'targetAttribute' => ['cget_discipline_id' => 'id']
|
||
],
|
||
[
|
||
['cget_child_discipline_id'],
|
||
'exist',
|
||
'skipOnError' => false,
|
||
'skipOnEmpty' => true,
|
||
'targetClass' => StoredChildDisciplineReferenceType::class,
|
||
'targetAttribute' => ['cget_child_discipline_id' => 'id']
|
||
],
|
||
[
|
||
['special_requirement_ref_id'],
|
||
'exist',
|
||
'skipOnError' => false,
|
||
'skipOnEmpty' => true,
|
||
'targetClass' => SpecialRequirementReferenceType::class,
|
||
'targetAttribute' => ['special_requirement_ref_id' => 'id']
|
||
],
|
||
[
|
||
'discipline_points',
|
||
EgeResultValidator::class,
|
||
],
|
||
];
|
||
}
|
||
|
||
public function getReasonForExam()
|
||
{
|
||
return $this->hasOne(DictionaryReasonForExam::class, ['id' => 'reason_for_exam_id']);
|
||
}
|
||
|
||
|
||
|
||
|
||
public function getRawBachelorResultCentralizedTesting()
|
||
{
|
||
return $this->hasOne(BachelorResultCentralizedTesting::class, ['egeresult_id' => 'id']);
|
||
}
|
||
|
||
|
||
|
||
|
||
public function getBachelorResultCentralizedTesting()
|
||
{
|
||
return $this->getRawBachelorResultCentralizedTesting()
|
||
->active();
|
||
}
|
||
|
||
|
||
|
||
|
||
|
||
|
||
public function getOrBuildCentralizedTesting(bool $isCreatedByUser = true): BachelorResultCentralizedTesting
|
||
{
|
||
$centralizedTesting = $this->bachelorResultCentralizedTesting;
|
||
if (!$centralizedTesting) {
|
||
$centralizedTesting = new BachelorResultCentralizedTesting();
|
||
$centralizedTesting->egeresult_id = $this->id;
|
||
$centralizedTesting->isNew = true;
|
||
}
|
||
|
||
if ($isCreatedByUser) {
|
||
$centralizedTesting->scenario = BachelorResultCentralizedTesting::SCENARIO_CREATED_BY_USER;
|
||
}
|
||
|
||
return $centralizedTesting;
|
||
}
|
||
|
||
public function getLanguage()
|
||
{
|
||
return $this->hasOne(ForeignLanguage::class, ['id' => 'language_id']);
|
||
}
|
||
|
||
|
||
|
||
|
||
public function getRawBachelorDatePassingEntranceTest()
|
||
{
|
||
$tn = BachelorDatePassingEntranceTest::tablename();
|
||
return $this->hasOne(BachelorDatePassingEntranceTest::class, ['bachelor_egeresult_id' => 'id'])
|
||
->andWhere(['IS', "{$tn}.parent_id", null]);
|
||
}
|
||
|
||
|
||
|
||
|
||
public function getAllRawBachelorDatePassingEntranceTest()
|
||
{
|
||
return $this->hasMany(BachelorDatePassingEntranceTest::class, ['bachelor_egeresult_id' => 'id']);
|
||
}
|
||
|
||
|
||
|
||
|
||
public function getAllBachelorDatePassingEntranceTest()
|
||
{
|
||
return $this->hasMany(BachelorDatePassingEntranceTest::class, ['bachelor_egeresult_id' => 'id'])
|
||
->active();
|
||
}
|
||
|
||
|
||
|
||
|
||
public function getBachelorDatePassingEntranceTest()
|
||
{
|
||
return $this->getRawBachelorDatePassingEntranceTest()
|
||
->active();
|
||
}
|
||
|
||
|
||
|
||
|
||
|
||
|
||
public function getOrCreateBachelorDatePassingEntranceTest()
|
||
{
|
||
$tn = BachelorDatePassingEntranceTest::tablename();
|
||
$result = $this->getBachelorDatePassingEntranceTest()
|
||
->andWhere(['IS', "{$tn}.parent_id", null])
|
||
->one();
|
||
if (empty($result)) {
|
||
$result = new BachelorDatePassingEntranceTest();
|
||
$result->from_1c = false;
|
||
if (!empty($this->id)) {
|
||
$result->bachelor_egeresult_id = $this->id;
|
||
}
|
||
}
|
||
|
||
return $result;
|
||
}
|
||
|
||
public function getSpecialRequirement()
|
||
{
|
||
return $this->hasOne(SpecialRequirementReferenceType::class, ['id' => 'special_requirement_ref_id']);
|
||
}
|
||
|
||
|
||
|
||
|
||
public function attributeLabels()
|
||
{
|
||
return [
|
||
'status' => Yii::t('abiturient/bachelor/ege/ege-result', 'Подпись для поля "status"; формы ВИ: `Проверено`'),
|
||
'egeyear' => Yii::t('abiturient/bachelor/ege/ege-result', 'Подпись для поля "egeyear"; формы ВИ: `Год`'),
|
||
'exam_form' => Yii::t('abiturient/bachelor/ege/ege-result', 'Подпись для поля "exam_form"; формы ВИ: `Форма сдачи`'),
|
||
'egeyear_id' => Yii::t('abiturient/bachelor/ege/ege-result', 'Подпись для поля "egeyear_id"; формы ВИ: `Заявление`'),
|
||
'language_id' => Yii::t('abiturient/bachelor/ege/ege-result', 'Подпись для поля "language_id"; формы ВИ: `Язык`'),
|
||
'languageName' => Yii::t('abiturient/bachelor/ege/ege-result', 'Подпись для поля "languageName"; формы ВИ: `Язык`'),
|
||
'discipline_id' => Yii::t('abiturient/bachelor/ege/ege-result', 'Подпись для поля "discipline_id"; формы ВИ: `Предмет`'),
|
||
'cgetExamFormName' => Yii::t('abiturient/bachelor/ege/ege-result', 'Подпись для поля "cget_exam_form_id"; формы ВИ: `Форма сдачи`'),
|
||
'cget_exam_form_id' => Yii::t('abiturient/bachelor/ege/ege-result', 'Подпись для поля "cget_exam_form_id"; формы ВИ: `Форма сдачи`'),
|
||
'discipline_points' => Yii::t('abiturient/bachelor/ege/ege-result', 'Подпись для поля "discipline_points"; формы ВИ: `Балл`'),
|
||
'reasonForExamName' => Yii::t('abiturient/bachelor/ege/ege-result', 'Подпись для поля "reasonForExamName" ; формы ВИ: `Основание`'),
|
||
'cgetDisciplineName' => Yii::t('abiturient/bachelor/ege/ege-result', 'Подпись для поля "cgetDisciplineName"; формы ВИ: `Предмет`'),
|
||
'cget_discipline_id' => Yii::t('abiturient/bachelor/ege/ege-result', 'Подпись для поля "cget_discipline_id"; формы ВИ: `Предмет`'),
|
||
'reason_for_exam_id' => Yii::t('abiturient/bachelor/ege/ege-result', 'Подпись для поля "reason_for_exam_id"; формы ВИ: `Основание`'),
|
||
'specialRequirementName' => Yii::t('abiturient/bachelor/ege/ege-result', 'Подпись для поля "specialRequirementName"; формы ВИ: `Специальное условие`'),
|
||
'cgetChildDisciplineName' => Yii::t('abiturient/bachelor/ege/ege-result', 'Подпись для поля "cgetChildDisciplineName"; формы ВИ: `Предмет`'),
|
||
'cget_child_discipline_id' => Yii::t('abiturient/bachelor/ege/ege-result', 'Подпись для поля "cget_child_discipline_id"; формы ВИ: `Предмет`'),
|
||
'special_requirement_ref_id' => Yii::t('abiturient/bachelor/ege/ege-result', 'Подпись для поля "special_requirement_ref_id"; формы ВИ: `Специальное условие`'),
|
||
];
|
||
}
|
||
|
||
public function getApplication()
|
||
{
|
||
return $this->hasOne(BachelorApplication::class, ['id' => 'application_id']);
|
||
}
|
||
|
||
|
||
|
||
|
||
public function getBachelorEntranceTestSets()
|
||
{
|
||
return $this->getRawBachelorEntranceTestSets()
|
||
->active();
|
||
}
|
||
|
||
|
||
|
||
|
||
public function getRawBachelorEntranceTestSets()
|
||
{
|
||
$query = $this->getRawBachelorEntranceTestSetsByEntranceTestParamsOnly();
|
||
|
||
$tnBachelorSpeciality = BachelorSpeciality::tableName();
|
||
$tnBachelorEntranceTestSet = BachelorEntranceTestSet::tableName();
|
||
$subQuery = BachelorSpeciality::find()
|
||
->select("{$tnBachelorSpeciality}.id")
|
||
->andWhere(["{$tnBachelorSpeciality}.application_id" => $this->application_id]);
|
||
|
||
return $query->andOnCondition(['IN', "{$tnBachelorEntranceTestSet}.bachelor_speciality_id", $subQuery]);
|
||
}
|
||
|
||
|
||
|
||
|
||
public function getBachelorEntranceTestSetsByEntranceTestParamsOnly()
|
||
{
|
||
return $this->getRawBachelorEntranceTestSetsByEntranceTestParamsOnly()
|
||
->active();
|
||
}
|
||
|
||
|
||
|
||
|
||
public function getRawBachelorEntranceTestSetsByEntranceTestParamsOnly()
|
||
{
|
||
return $this->hasMany(BachelorEntranceTestSet::class, ['entrance_test_junction' => 'entrance_test_junction']);
|
||
}
|
||
|
||
|
||
|
||
|
||
public function getBachelorSpecialities()
|
||
{
|
||
return $this->hasMany(BachelorSpeciality::class, ['id' => 'bachelor_speciality_id'])
|
||
->via('bachelorEntranceTestSets');
|
||
}
|
||
|
||
|
||
|
||
|
||
public function getRawBachelorSpecialities()
|
||
{
|
||
return $this->hasMany(BachelorSpeciality::class, ['id' => 'bachelor_speciality_id'])
|
||
->via('rawBachelorEntranceTestSets');
|
||
}
|
||
|
||
public function getBachelorSpecialitiesWithEagerLoad()
|
||
{
|
||
$tnBachelorSpeciality = BachelorSpeciality::tableName();
|
||
return $this->getBachelorSpecialities()
|
||
->with(EgeResult::joinListForSpecialty())
|
||
->andWhere(["{$tnBachelorSpeciality}.application_id" => $this->application_id]);
|
||
}
|
||
|
||
public function getRawBachelorSpecialitiesWithEagerLoad()
|
||
{
|
||
$tnBachelorSpeciality = BachelorSpeciality::tableName();
|
||
return $this->getRawBachelorSpecialities()
|
||
->with(EgeResult::joinListForSpecialty())
|
||
->andWhere(["{$tnBachelorSpeciality}.application_id" => $this->application_id]);
|
||
}
|
||
|
||
|
||
|
||
|
||
private static function joinListForSpecialty(): array
|
||
{
|
||
return [
|
||
'admissionCategory',
|
||
'speciality',
|
||
'speciality.campaignRef',
|
||
'speciality.competitiveGroupRef',
|
||
'speciality.curriculumRef',
|
||
'speciality.educationLevelRef',
|
||
'speciality.subdivisionRef',
|
||
];
|
||
}
|
||
|
||
public function getCgetExamForm()
|
||
{
|
||
return $this->hasOne(StoredDisciplineFormReferenceType::class, ['id' => 'cget_exam_form_id']);
|
||
}
|
||
|
||
public function getCgetDiscipline()
|
||
{
|
||
return $this->hasOne(StoredDisciplineReferenceType::class, ['id' => 'cget_discipline_id']);
|
||
}
|
||
|
||
public function getCgetChildDiscipline()
|
||
{
|
||
return $this->hasOne(StoredChildDisciplineReferenceType::class, ['id' => 'cget_child_discipline_id']);
|
||
}
|
||
|
||
public function getCgetEntranceTest()
|
||
{
|
||
return $this->hasOne(CgetEntranceTest::class, [
|
||
'subject_ref_id' => 'cget_discipline_id',
|
||
'entrance_test_result_source_ref_id' => 'cget_exam_form_id',
|
||
]);
|
||
}
|
||
|
||
public function getDisciplineRef()
|
||
{
|
||
if ($this->hasChildren()) {
|
||
return ReferenceTypeManager::GetReference($this->cgetChildDiscipline);
|
||
} else {
|
||
return ReferenceTypeManager::GetReference($this->cgetDiscipline);
|
||
}
|
||
}
|
||
|
||
public function getDisciplineCode()
|
||
{
|
||
if ($this->hasChildren()) {
|
||
return $this->cgetChildDiscipline->reference_id;
|
||
} else {
|
||
return $this->cgetDiscipline->reference_id;
|
||
}
|
||
}
|
||
|
||
public function getClassTypeForChangeHistory(): int
|
||
{
|
||
return ChangeHistoryClasses::CLASS_EXAM_RESULT;
|
||
}
|
||
|
||
public function getDisciplineReferenceName(): string
|
||
{
|
||
$discipline = ArrayHelper::getValue($this, 'cgetDiscipline.reference_name');
|
||
if ($this->cget_child_discipline_id) {
|
||
$childDiscipline = ArrayHelper::getValue($this, 'cgetChildDiscipline.reference_name');
|
||
$discipline .= " ({$childDiscipline})";
|
||
}
|
||
|
||
return $discipline;
|
||
}
|
||
|
||
public function getChangeLoggedAttributes()
|
||
{
|
||
return [
|
||
'discipline_id' => function ($model) {
|
||
return $model->disciplineReferenceName;
|
||
},
|
||
'egeyear',
|
||
'exam_form' => function ($model) {
|
||
return ArrayHelper::getValue($model, 'cgetExamForm.reference_name');
|
||
},
|
||
'discipline_points',
|
||
'reason_for_exam_id' => function ($model) {
|
||
return ArrayHelper::getValue($model, 'reasonForExam.name');
|
||
},
|
||
'language_id' => function ($model) {
|
||
return ArrayHelper::getValue($model, 'language.description');
|
||
},
|
||
];
|
||
}
|
||
|
||
public function getReasonForExamName()
|
||
{
|
||
return ArrayHelper::getValue($this, 'reasonForExam.name');
|
||
}
|
||
|
||
public function getOldClass(): ChangeLoggedModelInterface
|
||
{
|
||
$class = new EgeResult();
|
||
$class->attributes = $this->_oldAttributes;
|
||
return $class;
|
||
}
|
||
|
||
public function getEntityIdentifier(): ?string
|
||
{
|
||
return ArrayHelper::getValue($this, 'disciplineRef.ReferenceName');
|
||
}
|
||
|
||
public function getEntityChangeType(): int
|
||
{
|
||
return ChangeHistory::CHANGE_HISTORY_EXAM_POINTS;
|
||
}
|
||
|
||
public function isEgeChosen()
|
||
{
|
||
return isset($this->cgetExamForm) && $this->cgetExamForm->reference_uid == Yii::$app->configurationManager->getCode('discipline_ege_form');
|
||
}
|
||
|
||
|
||
|
||
|
||
|
||
|
||
private static function getRelatedTestSets(BachelorApplication $application): array
|
||
{
|
||
$tnBachelorEntranceTestSet = BachelorEntranceTestSet::tableName();
|
||
$selectQuery = new Expression("CONCAT(
|
||
{$tnBachelorEntranceTestSet}.bachelor_speciality_id,
|
||
'__',
|
||
{$tnBachelorEntranceTestSet}.entrance_test_junction
|
||
)");
|
||
return BachelorEntranceTestSet::find()
|
||
->select($selectQuery)
|
||
->andWhere([
|
||
'IN', 'entrance_test_junction', $application
|
||
->getEgeResults()
|
||
->select('entrance_test_junction')
|
||
])
|
||
->andWhere([
|
||
'IN', 'bachelor_speciality_id', $application
|
||
->getSpecialitiesWithoutOrdering()
|
||
->select('id')
|
||
])
|
||
->column();
|
||
}
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
public static function loadFromPost(BachelorApplication $application, array $post = []): bool
|
||
{
|
||
$egeAttributesNotToArchive = [];
|
||
$testSetNotToArchiveId = [];
|
||
$selfFormName = (new EgeResult())->formName();
|
||
$any_set_created = false;
|
||
|
||
$beforeLoad = EgeResult::getRelatedTestSets($application);
|
||
|
||
|
||
$posData = ArrayHelper::getValue($post, $selfFormName);
|
||
if (!empty($posData)) {
|
||
foreach ($posData as $bachelorSpecialityId => $subPosData) {
|
||
|
||
|
||
|
||
$speciality = $application->getSpecialities()
|
||
->where([BachelorSpeciality::tableName() . '.id' => $bachelorSpecialityId])
|
||
->one();
|
||
if (empty($speciality)) {
|
||
continue;
|
||
}
|
||
if ($speciality->isWithoutEntranceTests) {
|
||
continue;
|
||
}
|
||
|
||
if ($speciality->is_enlisted) {
|
||
$bachelorEntranceTestSets = $speciality->bachelorEntranceTestSets;
|
||
if (!empty($bachelorEntranceTestSets)) {
|
||
foreach ($bachelorEntranceTestSets as $bachelorEntranceTestSet) {
|
||
$testSetNotToArchiveId[] = $bachelorEntranceTestSet->id;
|
||
$egeAttributesNotToArchive[] = $bachelorEntranceTestSet->entrance_test_junction;
|
||
}
|
||
}
|
||
continue;
|
||
}
|
||
|
||
if (!empty($subPosData)) {
|
||
foreach ($subPosData as $combinations) {
|
||
|
||
|
||
$priority = ArrayHelper::getValue($combinations, 'priority');
|
||
$radioDisciplineId = ArrayHelper::getValue($combinations, 'cget_discipline_id');
|
||
$radioChildDisciplineId = ArrayHelper::getValue($combinations, 'cget_child_discipline_id');
|
||
foreach ($combinations as $combinationKey => $combinationData) {
|
||
if ($combinationKey == 'priority') {
|
||
continue;
|
||
}
|
||
|
||
|
||
$disciplineId = (int)$radioDisciplineId;
|
||
if (empty($radioDisciplineId)) {
|
||
$checkboxDisciplineId = ArrayHelper::getValue($combinationData, 'cget_discipline_id');
|
||
if (empty($checkboxDisciplineId)) {
|
||
continue;
|
||
}
|
||
$disciplineId = (int)$checkboxDisciplineId;
|
||
}
|
||
$childDisciplineId = (int)$radioChildDisciplineId;
|
||
if (empty($radioChildDisciplineId)) {
|
||
$checkboxChildDisciplineId = ArrayHelper::getValue($combinationData, 'cget_child_discipline_id');
|
||
if (!empty($checkboxChildDisciplineId)) {
|
||
$childDisciplineId = (int)$checkboxChildDisciplineId;
|
||
}
|
||
}
|
||
|
||
$examFormId = (int)ArrayHelper::getValue($combinationData, 'cget_exam_form_id');
|
||
if (empty($examFormId)) {
|
||
continue;
|
||
}
|
||
|
||
[$set, $created] = EntrantTestManager::getOrCreateEntrantTestSet(
|
||
$application,
|
||
$speciality,
|
||
$disciplineId,
|
||
$childDisciplineId,
|
||
$examFormId,
|
||
$priority
|
||
);
|
||
$any_set_created = ($any_set_created || $created);
|
||
if (!in_array($set->entrance_test_junction, $egeAttributesNotToArchive)) {
|
||
$egeAttributesNotToArchive[] = $set->entrance_test_junction;
|
||
}
|
||
if (!in_array($set->id, $testSetNotToArchiveId)) {
|
||
$testSetNotToArchiveId[] = $set->id;
|
||
}
|
||
}
|
||
}
|
||
}
|
||
}
|
||
}
|
||
EntrantTestManager::archiveNotActualEntranceTestSetExceptReadOnly($application, $testSetNotToArchiveId);
|
||
EntrantTestManager::archiveNotActualEgeExceptReadOnly($application, $egeAttributesNotToArchive);
|
||
|
||
$afterLoad = EgeResult::getRelatedTestSets($application);
|
||
|
||
return (
|
||
$any_set_created ||
|
||
count($beforeLoad) != count($afterLoad) ||
|
||
count(array_diff($afterLoad, $beforeLoad)) > 0 ||
|
||
count(array_diff($beforeLoad, $afterLoad)) > 0
|
||
);
|
||
}
|
||
|
||
|
||
|
||
|
||
public function beforeDelete()
|
||
{
|
||
if (!parent::beforeDelete()) {
|
||
return false;
|
||
}
|
||
|
||
|
||
$centralizedTesting = $this->getRawBachelorResultCentralizedTesting()->one();
|
||
if ($centralizedTesting && !$centralizedTesting->delete()) {
|
||
return false;
|
||
}
|
||
|
||
|
||
$bachelorDatePassing = $this->getRawBachelorDatePassingEntranceTest()->one();
|
||
if ($bachelorDatePassing && !$bachelorDatePassing->delete()) {
|
||
return false;
|
||
}
|
||
|
||
return true;
|
||
}
|
||
|
||
|
||
|
||
|
||
|
||
|
||
public function beforeSave($insert)
|
||
{
|
||
if (!parent::beforeSave($insert)) {
|
||
return false;
|
||
}
|
||
|
||
$cgetExamFormUid = '';
|
||
$cgetDisciplineUid = '';
|
||
$cgetChildDisciplineUid = '';
|
||
$fieldList = [
|
||
'cgetExamFormUid' => 'cgetExamForm',
|
||
'cgetDisciplineUid' => 'cgetDiscipline',
|
||
'cgetChildDisciplineUid' => 'cgetChildDiscipline',
|
||
];
|
||
|
||
foreach ($fieldList as $varName => $field) {
|
||
$valueReferenceUid = ArrayHelper::getValue($this, "{$field}.reference_uid", null);
|
||
if ($valueReferenceUid) {
|
||
$$varName = $valueReferenceUid;
|
||
}
|
||
}
|
||
|
||
$this->entrance_test_junction = JointEntrantTestManager::buildJointEntrantTestString(
|
||
$cgetDisciplineUid,
|
||
$cgetExamFormUid,
|
||
$cgetChildDisciplineUid
|
||
);
|
||
|
||
return true;
|
||
}
|
||
|
||
public function beforeArchive()
|
||
{
|
||
if (!CentralizedTestingManager::archiveIfExist($this->id)) {
|
||
Yii::error('Ошибка архивирования ЦТ', 'beforeArchive');
|
||
return false;
|
||
}
|
||
if (!ExamsScheduleManager::archiveIfExist($this->bachelorDatePassingEntranceTest)) {
|
||
Yii::error('Ошибка архивирования расписания сдачи ВИ', 'beforeArchive');
|
||
return false;
|
||
}
|
||
|
||
return true;
|
||
}
|
||
|
||
|
||
|
||
|
||
public function isExam()
|
||
{
|
||
$exam_form_uid = $this->cgetExamForm->reference_uid ?? null;
|
||
return Yii::$app->configurationManager->getCode('discipline_ege_form') != $exam_form_uid;
|
||
}
|
||
|
||
|
||
|
||
|
||
public function getLanguageList(int $additional_language_id = null)
|
||
{
|
||
$tnForeignLanguage = ForeignLanguage::tableName();
|
||
return ArrayHelper::map(
|
||
ForeignLanguage::find()
|
||
->notMarkedToDelete()
|
||
->active()
|
||
->orFilterWhere(["{$tnForeignLanguage}.id" => $additional_language_id])
|
||
->orderBy(["{$tnForeignLanguage}.description" => SORT_ASC])
|
||
->all(),
|
||
'id',
|
||
'description'
|
||
);
|
||
}
|
||
|
||
|
||
|
||
|
||
public function getSpecialRequirementList()
|
||
{
|
||
$tnSpecialRequirementReferenceType = SpecialRequirementReferenceType::tableName();
|
||
return ArrayHelper::map(
|
||
SpecialRequirementReferenceType::find()
|
||
->notMarkedToDelete()
|
||
->active()
|
||
->orFilterWhere([
|
||
"{$tnSpecialRequirementReferenceType}.id" => $this->special_requirement_ref_id
|
||
])
|
||
->orderBy(["{$tnSpecialRequirementReferenceType}.reference_name" => SORT_ASC])
|
||
->all(),
|
||
'id',
|
||
'reference_name'
|
||
);
|
||
}
|
||
|
||
|
||
|
||
|
||
public function getReasonForExamList()
|
||
{
|
||
return ArrayHelper::map(
|
||
DictionaryReasonForExam::find()
|
||
->active()
|
||
->orderBy(['name' => SORT_ASC])
|
||
->all(),
|
||
'id',
|
||
'name'
|
||
);
|
||
}
|
||
|
||
|
||
|
||
|
||
public function getYears()
|
||
{
|
||
$years = [];
|
||
$active_year = date('Y');
|
||
for ($i = $active_year - 4; $i <= $active_year; $i++) {
|
||
$years[(string)$i] = $i;
|
||
}
|
||
|
||
return $years;
|
||
}
|
||
|
||
|
||
|
||
|
||
public function hasChildren()
|
||
{
|
||
return isset($this->cget_child_discipline_id);
|
||
}
|
||
|
||
|
||
|
||
|
||
public function getMinimalMaximalScore()
|
||
{
|
||
if (empty($this->_minimalMaximalScore)) {
|
||
$testsSetIds = ArrayHelper::map($this->application->specialities, 'id', 'cget_entrance_test_set_id');
|
||
|
||
$test = CgetEntranceTest::find()
|
||
->joinWith('entranceTestResultSourceRef entranceTestResultSourceRef')
|
||
->select(['min_score'])
|
||
->where(['subject_ref_id' => $this->cget_discipline_id])
|
||
->andWhere(['in', 'cget_entrance_test_set_id', $testsSetIds])
|
||
->andWhere(['entranceTestResultSourceRef.reference_uid' => Yii::$app->configurationManager->getCode('discipline_ege_form')])
|
||
->groupBy(['min_score'])
|
||
->orderBy(['min_score' => SORT_DESC])
|
||
->one();
|
||
|
||
if (empty($test)) {
|
||
return '';
|
||
}
|
||
$this->minimalMaximalScore = $test->min_score;
|
||
}
|
||
return $this->_minimalMaximalScore;
|
||
}
|
||
|
||
|
||
|
||
|
||
public function setMinimalMaximalScore($minimalMaximalScore)
|
||
{
|
||
$this->_minimalMaximalScore = (string)$minimalMaximalScore;
|
||
}
|
||
|
||
|
||
|
||
|
||
|
||
|
||
public static function getAllDisciplineList()
|
||
{
|
||
$result = [];
|
||
$disciplineEgeFormUid = Yii::$app->configurationManager->getCode('discipline_ege_form');
|
||
|
||
$cgetEntranceTestTableName = CgetEntranceTest::tableName();
|
||
$entranceTest = CgetEntranceTest::find()
|
||
->joinWith('entranceTestResultSourceRef entranceTestResultSourceRef')
|
||
->select("{$cgetEntranceTestTableName}.subject_ref_id")
|
||
->where([
|
||
"{$cgetEntranceTestTableName}.archive" => false,
|
||
"entranceTestResultSourceRef.reference_uid" => $disciplineEgeFormUid
|
||
])
|
||
->groupBy(["{$cgetEntranceTestTableName}.subject_ref_id"]);
|
||
|
||
$storedDisciplineReferenceTypeTableName = StoredDisciplineReferenceType::tableName();
|
||
$discipline = StoredDisciplineReferenceType::find()
|
||
->select(["{$storedDisciplineReferenceTypeTableName}.id", "{$storedDisciplineReferenceTypeTableName}.reference_name"])
|
||
->where(["{$storedDisciplineReferenceTypeTableName}.archive" => false])
|
||
->andWhere(['in', "{$storedDisciplineReferenceTypeTableName}.id", $entranceTest])
|
||
->all();
|
||
|
||
if (!empty($discipline)) {
|
||
$result = ArrayHelper::map($discipline, 'id', 'reference_name');
|
||
}
|
||
|
||
return $result;
|
||
}
|
||
|
||
public function afterValidate()
|
||
{
|
||
(new LoggingAfterValidateHandler())
|
||
->setModel($this)
|
||
->invoke();
|
||
}
|
||
|
||
|
||
|
||
|
||
public function getExamScheduleQuery()
|
||
{
|
||
|
||
$tnStoredDisciplineReferenceType = StoredDisciplineReferenceType::tableName();
|
||
$tnStoredDisciplineFormReferenceType = StoredDisciplineFormReferenceType::tableName();
|
||
|
||
|
||
$tnBachelorSpeciality = BachelorSpeciality::tableName();
|
||
$tnDictionaryPredmetOfExamsSchedule = DictionaryPredmetOfExamsSchedule::tableName();
|
||
$tnDictionaryDateTimeOfExamsSchedule = DictionaryDateTimeOfExamsSchedule::tableName();
|
||
return BachelorDatePassingEntranceTest::getExamScheduleBaseDetalizedQuery()
|
||
->andWhere([
|
||
"{$tnDictionaryPredmetOfExamsSchedule}.archive" => false,
|
||
"{$tnBachelorSpeciality}.archive" => false,
|
||
"{$tnBachelorSpeciality}.application_id" => $this->application_id,
|
||
"{$tnStoredDisciplineFormReferenceType}.reference_uid" => $this->cgetExamForm->reference_uid,
|
||
"{$tnStoredDisciplineReferenceType}.reference_uid" => $this->cgetDiscipline->reference_uid,
|
||
])
|
||
->andWhere(['>', "{$tnDictionaryDateTimeOfExamsSchedule}.end_date", time()])
|
||
->andWhere([
|
||
'OR',
|
||
['>', "{$tnDictionaryDateTimeOfExamsSchedule}.registration_date", time()],
|
||
['IN', "{$tnDictionaryDateTimeOfExamsSchedule}.registration_date", [0, null]],
|
||
]);
|
||
}
|
||
|
||
|
||
|
||
|
||
public function getExamSchedule()
|
||
{
|
||
return $this->getExamScheduleQuery()->exists();
|
||
}
|
||
|
||
|
||
|
||
|
||
|
||
|
||
public function getExamScheduleList($date)
|
||
{
|
||
$guidDateTimeList = [];
|
||
$tnDictionaryDateTimeOfExamsSchedule = DictionaryDateTimeOfExamsSchedule::tableName();
|
||
$dates = $this->getExamScheduleQuery()
|
||
->orderBy(["{$tnDictionaryDateTimeOfExamsSchedule}.start_date" => SORT_ASC])
|
||
->all();
|
||
$dateId = $date->date_time_of_exams_schedule_id;
|
||
|
||
$zeroKey = array_key_first($dates);
|
||
$date->scheduleLabel = BachelorDatePassingEntranceTest::humanizer($dates[$zeroKey]['reference_name']);
|
||
|
||
$examDateList = [];
|
||
foreach ($dates as $data) {
|
||
|
||
|
||
$guidDateTimeList[$data['id']] = $data['guid_date_time'];
|
||
$examDateList[$data['id']] = BachelorDatePassingEntranceTest::generateName($data);
|
||
}
|
||
|
||
if (!in_array($dateId, $examDateList)) {
|
||
$additionalDate = BachelorDatePassingEntranceTest::getExamScheduleBaseDetalizedQuery()
|
||
->andWhere(["{$tnDictionaryDateTimeOfExamsSchedule}.id" => $dateId])
|
||
->one();
|
||
if (!empty($additionalDate)) {
|
||
$guidDateTimeList[$additionalDate['id']] = $additionalDate['guid_date_time'];
|
||
$examDateList[$additionalDate['id']] = BachelorDatePassingEntranceTest::generateName($additionalDate);
|
||
}
|
||
}
|
||
|
||
if (!empty($guidDateTimeList)) {
|
||
$date->existGuidDateTimeList = $guidDateTimeList;
|
||
$date->hasChildren = DictionaryDateTimeOfExamsSchedule::find()
|
||
->where(['in', 'predmet_guid', $guidDateTimeList])
|
||
->exists();
|
||
}
|
||
|
||
return $examDateList;
|
||
}
|
||
|
||
public function getIdentityString(): string
|
||
{
|
||
$discipline_uid = ArrayHelper::getValue($this, 'cgetDiscipline.reference_uid', '');
|
||
$child_discipline_uid = ArrayHelper::getValue($this, 'cgetChildDiscipline.reference_uid', '');
|
||
$exam_form_uid = ArrayHelper::getValue($this, 'cgetExamForm.reference_uid', '');
|
||
$egeyear = $this->egeyear;
|
||
$discipline_points = $this->discipline_points;
|
||
return "{$discipline_uid}_{$child_discipline_uid}_{$exam_form_uid}_{$egeyear}_{$discipline_points}";
|
||
}
|
||
|
||
public function getCgetDisciplineName()
|
||
{
|
||
return ArrayHelper::getValue($this, 'cgetDiscipline.reference_name');
|
||
}
|
||
|
||
public function getCgetChildDisciplineName()
|
||
{
|
||
return ArrayHelper::getValue($this, 'cgetChildDiscipline.reference_name');
|
||
}
|
||
|
||
public function getCgetExamFormName()
|
||
{
|
||
return ArrayHelper::getValue($this, 'cgetExamForm.reference_name');
|
||
}
|
||
|
||
public function getLanguageName()
|
||
{
|
||
return ArrayHelper::getValue($this, 'language.description');
|
||
}
|
||
|
||
public function getSpecialRequirementName()
|
||
{
|
||
return ArrayHelper::getValue($this, 'specialRequirement.reference_name');
|
||
}
|
||
|
||
public function getPropsToCompare(): array
|
||
{
|
||
return [
|
||
'cgetDisciplineName',
|
||
'cgetChildDisciplineName',
|
||
'cgetExamFormName',
|
||
'discipline_points',
|
||
'egeyear',
|
||
'languageName',
|
||
'reasonForExamName',
|
||
'specialRequirementName',
|
||
];
|
||
}
|
||
|
||
public function getRelationsInfo(): array
|
||
{
|
||
return [
|
||
new OneToOneRelationPresenter(
|
||
'bachelorResultCentralizedTesting',
|
||
[
|
||
'parent_instance' => $this,
|
||
'child_class' => BachelorResultCentralizedTesting::class,
|
||
'child_column_name' => 'egeresult_id',
|
||
]
|
||
),
|
||
new OneToOneRelationPresenter(
|
||
'bachelorDatePassingEntranceTest',
|
||
[
|
||
'parent_instance' => $this,
|
||
'child_class' => BachelorDatePassingEntranceTest::class,
|
||
'child_column_name' => 'bachelor_egeresult_id',
|
||
'actual_relation_name' => 'rawBachelorDatePassingEntranceTest',
|
||
]
|
||
),
|
||
];
|
||
}
|
||
|
||
public static function getArchiveValue()
|
||
{
|
||
return true;
|
||
}
|
||
|
||
public static function find()
|
||
{
|
||
return new ArchiveQuery(static::class);
|
||
}
|
||
|
||
|
||
|
||
|
||
|
||
|
||
public function isOnlyEgeForThisApplication(array $setsIdsToSkip = []): bool
|
||
{
|
||
$tnBachelorSpeciality = BachelorSpeciality::tableName();
|
||
$tnBachelorEntranceTestSet = BachelorEntranceTestSet::tableName();
|
||
|
||
return !BachelorEntranceTestSet::find()
|
||
->active()
|
||
->joinWith('bachelorSpeciality')
|
||
->andWhere(['NOT IN', "{$tnBachelorEntranceTestSet}.id", $setsIdsToSkip])
|
||
->andWhere(["{$tnBachelorSpeciality}.application_id" => $this->application_id])
|
||
->andWhere(["{$tnBachelorEntranceTestSet}.entrance_test_junction" => $this->entrance_test_junction])
|
||
->exists();
|
||
}
|
||
|
||
|
||
|
||
|
||
public function hasEnlistedBachelorSpecialities(): bool
|
||
{
|
||
$tn = BachelorSpeciality::tableName();
|
||
return $this->getBachelorSpecialities()
|
||
->andWhere(["{$tn}.is_enlisted" => true])
|
||
->andWhere(["{$tn}.application_id" => $this->application_id])
|
||
->exists();
|
||
}
|
||
|
||
public function stringify(): string
|
||
{
|
||
return trim("{$this->disciplineReferenceName} " . ArrayHelper::getValue($this, 'cgetExamForm.reference_name'));
|
||
}
|
||
}
|