portal.mkgtu.ru/common/models/dictionary/Speciality.php

753 lines
29 KiB
PHP
Raw Permalink Normal View History

2024-03-28 09:51:45 +03:00
<?php
namespace common\models\dictionary;
use common\components\IndependentQueryManager\IndependentQueryManager;
use common\components\queries\ArchiveQuery;
use common\components\ReferenceTypeManager\ReferenceTypeManager;
use common\models\dictionary\StoredReferenceType\StoredAdmissionCampaignReferenceType;
use common\models\dictionary\StoredReferenceType\StoredBudgetLevelReferenceType;
use common\models\dictionary\StoredReferenceType\StoredCompetitiveGroupReferenceType;
use common\models\dictionary\StoredReferenceType\StoredCurriculumReferenceType;
use common\models\dictionary\StoredReferenceType\StoredDetailGroupReferenceType;
use common\models\dictionary\StoredReferenceType\StoredDirectionReferenceType;
use common\models\dictionary\StoredReferenceType\StoredEducationFormReferenceType;
use common\models\dictionary\StoredReferenceType\StoredEducationLevelReferenceType;
use common\models\dictionary\StoredReferenceType\StoredEducationSourceReferenceType;
use common\models\dictionary\StoredReferenceType\StoredProfileReferenceType;
use common\models\dictionary\StoredReferenceType\StoredSubdivisionReferenceType;
use common\models\dictionary\StoredReferenceType\StoredUGSReferenceType;
use common\models\errors\RecordNotFound;
use common\models\interfaces\IArchiveQueryable;
use common\models\ModelLinkedToReferenceType;
use common\models\ToAssocCaster;
use common\models\traits\ScenarioWithoutExistValidationTrait;
use common\modules\abiturient\models\AdditionalReceiptDateControl;
use common\modules\abiturient\models\bachelor\AdmissionCampaign;
use common\modules\abiturient\models\bachelor\ApplicationType;
use common\modules\abiturient\models\bachelor\BachelorSpeciality;
use common\modules\abiturient\models\bachelor\CampaignInfo;
use Yii;
use yii\base\UserException;
use yii\behaviors\TimestampBehavior;
use yii\db\ActiveRecord;
use yii\helpers\ArrayHelper;
class Speciality extends ModelLinkedToReferenceType implements IArchiveQueryable
{
use ScenarioWithoutExistValidationTrait;
protected static $refAdditionalClasses = [
'competitive_group_ref_id' => StoredCompetitiveGroupReferenceType::class,
'subdivision_ref_id' => StoredSubdivisionReferenceType::class,
'direction_ref_id' => StoredDirectionReferenceType::class,
'profile_ref_id' => StoredProfileReferenceType::class,
'education_level_ref_id' => StoredEducationLevelReferenceType::class,
'education_form_ref_id' => StoredEducationFormReferenceType::class,
'education_program_ref_id' => EducationType::class,
'education_source_ref_id' => StoredEducationSourceReferenceType::class,
'budget_level_ref_id' => StoredBudgetLevelReferenceType::class,
'detail_group_ref_id' => StoredDetailGroupReferenceType::class,
'campaign_ref_id' => StoredAdmissionCampaignReferenceType::class,
'curriculum_ref_id' => StoredCurriculumReferenceType::class,
'ugs_ref_id' => StoredUGSReferenceType::class,
'graduating_department_ref_id' => StoredSubdivisionReferenceType::class,
'branch_ref_id' => StoredSubdivisionReferenceType::class,
'parent_combined_competitive_group_ref_id' => StoredCompetitiveGroupReferenceType::class,
];
protected static $refColumns = [
'subdivision_ref_id' => 'SubdivisionRef',
'competitive_group_ref_id' => 'CompetitiveGroupRef',
'direction_ref_id' => 'DirectionRef',
'profile_ref_id' => 'ProfileRef',
'education_level_ref_id' => 'EducationLevelRef',
'education_form_ref_id' => 'EducationFormRef',
'education_program_ref_id' => 'EducationProgramRef',
'education_source_ref_id' => 'EducationSourceRef',
'budget_level_ref_id' => 'LevelBudgetRef',
'detail_group_ref_id' => 'DetailGroupRef',
'campaign_ref_id' => 'CampaignRef',
'curriculum_ref_id' => 'CurriculumRef',
'ugs_ref_id' => 'UGSRef',
'graduating_department_ref_id' => 'GraduatingDepartmentRef',
'branch_ref_id' => 'BranchRef',
'parent_combined_competitive_group_ref_id' => 'ParentCombinedCompetitiveGroupRef',
];
public static function tableName()
{
return '{{%dictionary_speciality}}';
}
public function behaviors()
{
return [
[
'class' => TimestampBehavior::class,
'updatedAtAttribute' => false
]
];
}
public function rules()
{
return [
[
[
'faculty_code',
'faculty_name',
'speciality_code',
'speciality_name',
'group_code',
'group_name'
],
'required'
],
[
[
'faculty_code',
'speciality_code',
'profil_code',
'edulevel_code',
'eduform_code',
'eduprogram_code',
'finance_code',
'group_code',
'speciality_human_code',
'campaign_code',
'detail_group_code',
'budget_level_code',
'budget_level_name'
],
'string',
'max' => 100
],
[
[
'faculty_name',
'speciality_name',
'profil_name',
'edulevel_name',
'eduform_name',
'eduprogram_name',
'finance_name',
'group_name',
'detail_group_name'
],
'string',
'max' => 1000
],
[
[
'receipt_allowed',
'special_right',
'is_combined_competitive_group',
],
'boolean'
],
[
['competitive_group_ref_id'],
'exist',
'skipOnError' => false,
'targetClass' => StoredCompetitiveGroupReferenceType::class,
'targetAttribute' => ['competitive_group_ref_id' => 'id'],
'except' => [static::$SCENARIO_WITHOUT_EXISTS_CHECK]
],
[
['parent_combined_competitive_group_ref_id'],
'exist',
'skipOnError' => false,
'targetClass' => StoredCompetitiveGroupReferenceType::class,
'targetAttribute' => ['parent_combined_competitive_group_ref_id' => 'id'],
'except' => [static::$SCENARIO_WITHOUT_EXISTS_CHECK]
],
[
['subdivision_ref_id'],
'exist',
'skipOnError' => false,
'targetClass' => StoredSubdivisionReferenceType::class,
'targetAttribute' => ['subdivision_ref_id' => 'id'],
'except' => [static::$SCENARIO_WITHOUT_EXISTS_CHECK]
],
[
['graduating_department_ref_id'],
'exist',
'skipOnError' => false,
'targetClass' => StoredSubdivisionReferenceType::class,
'targetAttribute' => ['graduating_department_ref_id' => 'id'],
'except' => [static::$SCENARIO_WITHOUT_EXISTS_CHECK]
],
[
['branch_ref_id'],
'exist',
'skipOnError' => false,
'targetClass' => StoredSubdivisionReferenceType::class,
'targetAttribute' => ['branch_ref_id' => 'id'],
'except' => [static::$SCENARIO_WITHOUT_EXISTS_CHECK]
],
[
['direction_ref_id'],
'exist',
'skipOnError' => false,
'targetClass' => StoredDirectionReferenceType::class,
'targetAttribute' => ['direction_ref_id' => 'id'],
'except' => [static::$SCENARIO_WITHOUT_EXISTS_CHECK]
],
[
['profile_ref_id'],
'exist',
'skipOnError' => false,
'targetClass' => StoredProfileReferenceType::class,
'targetAttribute' => ['profile_ref_id' => 'id'],
'except' => [static::$SCENARIO_WITHOUT_EXISTS_CHECK]
],
[
['education_level_ref_id'],
'exist',
'skipOnError' => false,
'targetClass' => StoredEducationLevelReferenceType::class,
'targetAttribute' => ['education_level_ref_id' => 'id'],
'except' => [static::$SCENARIO_WITHOUT_EXISTS_CHECK]
],
[
['education_form_ref_id'],
'exist',
'skipOnError' => false,
'targetClass' => StoredEducationFormReferenceType::class,
'targetAttribute' => ['education_form_ref_id' => 'id'],
'except' => [static::$SCENARIO_WITHOUT_EXISTS_CHECK]
],
[
['education_program_ref_id'],
'exist',
'skipOnError' => false,
'targetClass' => EducationType::class,
'targetAttribute' => ['education_program_ref_id' => 'id']
],
[
['education_source_ref_id'],
'exist',
'skipOnError' => false,
'targetClass' => StoredEducationSourceReferenceType::class,
'targetAttribute' => ['education_source_ref_id' => 'id'],
'except' => [static::$SCENARIO_WITHOUT_EXISTS_CHECK]
],
[
['budget_level_ref_id'],
'exist',
'skipOnError' => false,
'targetClass' => StoredBudgetLevelReferenceType::class,
'targetAttribute' => ['budget_level_ref_id' => 'id'],
'except' => [static::$SCENARIO_WITHOUT_EXISTS_CHECK]
],
[
['detail_group_ref_id'],
'exist',
'skipOnError' => false,
'targetClass' => StoredDetailGroupReferenceType::class,
'targetAttribute' => ['detail_group_ref_id' => 'id'],
'except' => [static::$SCENARIO_WITHOUT_EXISTS_CHECK]
],
[
['campaign_ref_id'],
'exist',
'skipOnError' => false,
'targetClass' => StoredAdmissionCampaignReferenceType::class,
'targetAttribute' => ['campaign_ref_id' => 'id'],
'except' => [static::$SCENARIO_WITHOUT_EXISTS_CHECK]
],
[
['curriculum_ref_id'],
'exist',
'skipOnError' => false,
'targetClass' => StoredCurriculumReferenceType::class,
'targetAttribute' => ['curriculum_ref_id' => 'id'],
'except' => [static::$SCENARIO_WITHOUT_EXISTS_CHECK]
],
[
['ugs_ref_id'],
'exist',
'skipOnError' => false,
'targetClass' => StoredUGSReferenceType::class,
'targetAttribute' => ['ugs_ref_id' => 'id'],
'except' => [static::$SCENARIO_WITHOUT_EXISTS_CHECK]
],
];
}
public function attributeLabels()
{
return [
'group_code' => Yii::t('abiturient/bachelor/application/dictionary-speciality', 'Подпись для поля "group_code": `Код конкурсной группы`'),
'group_name' => Yii::t('abiturient/bachelor/application/dictionary-speciality', 'Подпись для поля "group_name": `Конкурсная группа`'),
'profil_code' => Yii::t('abiturient/bachelor/application/dictionary-speciality', 'Подпись для поля "profil_code": `Код специализации`'),
'profil_name' => Yii::t('abiturient/bachelor/application/dictionary-speciality', 'Подпись для поля "profil_name": `Специализация`'),
'eduform_code' => Yii::t('abiturient/bachelor/application/dictionary-speciality', 'Подпись для поля "eduform_code": `Код формы обучения`'),
'eduform_name' => Yii::t('abiturient/bachelor/application/dictionary-speciality', 'Подпись для поля "eduform_name": `Форма обучения`'),
'faculty_code' => Yii::t('abiturient/bachelor/application/dictionary-speciality', 'Подпись для поля "faculty_code": `Код факультета`'),
'faculty_name' => Yii::t('abiturient/bachelor/application/dictionary-speciality', 'Подпись для поля "faculty_name": `Название факультета`'),
'finance_code' => Yii::t('abiturient/bachelor/application/dictionary-speciality', 'Подпись для поля "finance_code": `Код источника финансирования`'),
'finance_name' => Yii::t('abiturient/bachelor/application/dictionary-speciality', 'Подпись для поля "finance_name": `Источник финансирования`'),
'edulevel_code' => Yii::t('abiturient/bachelor/application/dictionary-speciality', 'Подпись для поля "edulevel_code": `Код уровня образования`'),
'edulevel_name' => Yii::t('abiturient/bachelor/application/dictionary-speciality', 'Подпись для поля "edulevel_name": `Уровень образования`'),
'special_right' => Yii::t('abiturient/bachelor/application/dictionary-speciality', 'Подпись для поля "special_right": `Преимущественное право`'),
'eduprogram_code' => Yii::t('abiturient/bachelor/application/dictionary-speciality', 'Подпись для поля "eduprogram_code": `Код образовательной программы`'),
'eduprogram_name' => Yii::t('abiturient/bachelor/application/dictionary-speciality', 'Подпись для поля "eduprogram_name": `Образовательная программа`'),
'speciality_code' => Yii::t('abiturient/bachelor/application/dictionary-speciality', 'Подпись для поля "speciality_code": `Код направления`'),
'speciality_name' => Yii::t('abiturient/bachelor/application/dictionary-speciality', 'Подпись для поля "speciality_name": `Наименование направления`'),
'budget_level_name' => Yii::t('abiturient/bachelor/application/dictionary-speciality', 'Подпись для поля "budget_level_name": `Уровень бюджета`'),
'detail_group_name' => Yii::t('abiturient/bachelor/application/dictionary-speciality', 'Подпись для поля "detail_group_name": `Особенность приема`'),
'speciality_human_code' => Yii::t('abiturient/bachelor/application/dictionary-speciality', 'Подпись для поля "speciality_human_code": `Код специальности`'),
'graduatingDepartmentName' => Yii::t('abiturient/bachelor/application/dictionary-speciality', 'Подпись для поля "graduatingDepartmentName": `Кафедра`'),
'curriculum_ref_id' => Yii::t('abiturient/bachelor/application/dictionary-speciality', 'Подпись для поля "curriculum_ref_id": `Учебный план`'),
];
}
public static function find()
{
return new ArchiveQuery(static::class);
}
public static function getArchiveColumn(): string
{
return 'archive';
}
public static function getArchiveValue()
{
return true;
}
public function isSpecialQuota(): bool
{
$detail_group = $this->detailGroupRef;
if (!$detail_group) {
return false;
}
return $detail_group->reference_uid === Yii::$app->configurationManager->getCode('special_quota_detail_group_guid');
}
public function haveOnlyCommonBasis()
{
$eduSourceReferenceUid = $this->educationSourceRef->reference_uid ?? null;
return $eduSourceReferenceUid === BachelorSpeciality::getTargetReceptionBasis() || $eduSourceReferenceUid === BachelorSpeciality::getCommercialBasis();
}
public function getCampaign()
{
return $this->hasOne(AdmissionCampaign::class, ['code' => 'campaign_code'])
->andWhere([AdmissionCampaign::tableName() . '.archive' => false]);
}
public function getCategories(bool $allowBenefitCategories = true)
{
$categories = AdmissionCategory::find()->notMarkedToDelete()->active();
$queryWithOutSpecificLaw = ['!=', 'ref_key', Yii::$app->configurationManager->getCode('category_specific_law')];
if ($allowBenefitCategories) {
if ($this->haveOnlyCommonBasis()) {
$categories->andWhere([
'ref_key' => Yii::$app->configurationManager->getCode('category_all')
]);
} elseif ((bool)$this->special_right) {
$categories->andWhere([
'ref_key' => Yii::$app->configurationManager->getCode('category_specific_law')
]);
} else {
$categories->andWhere($queryWithOutSpecificLaw);
}
} else {
$categories->andWhere($queryWithOutSpecificLaw);
}
return $categories->all();
}
public function getCampaignInfosQuery()
{
return CampaignInfo::find()
->active()
->joinWith('educationLevelRef education_level_ref', false)
->joinWith('educationSourceRef education_source_ref', false)
->joinWith('educationFormRef education_form_ref', false)
->joinWith('detailGroupRef detail_group_ref', false)
->joinWith('admissionCategory admission_category', false)
->joinWith(['campaign' => function ($q) {
$q->joinWith('referenceType campaign_ref', false);
}])
->andWhere([
'campaign_ref.reference_uid' => $this->campaignRef->reference_uid,
'education_source_ref.reference_uid' => $this->educationSourceRef->reference_uid,
'education_form_ref.reference_uid' => $this->educationFormRef->reference_uid,
'detail_group_ref.reference_uid' => ($this->detailGroupRef->reference_uid ?? null),
'education_level_ref.reference_uid' => ($this->educationLevelRef->reference_uid ?? null),
]);
}
public function getAvailableCategories(bool $allowBenefitCategories = true)
{
$categories = $this->getCategories($allowBenefitCategories);
foreach ($categories as $key => $category) {
$infos = $this->getCampaignInfosQuery()
->andWhere([
'admission_category.ref_key' => $category->ref_key,
]);
if ($infos->exists()) {
$date = date('Y-m-d H:i:s');
$info_exists = $infos
->andWhere(['>=', IndependentQueryManager::strToDateTime('campaign_info.date_final'), $date])
->andWhere(['<=', IndependentQueryManager::strToDateTime('campaign_info.date_start'), $date])
->limit(1)
->exists();
if (!$info_exists) {
unset($categories[$key]);
}
}
}
return $categories;
}
public function checkCategory(?string $categoryUid): bool
{
return $this->getCampaignInfosQuery()
->andWhere([
'admission_category.ref_key' => $categoryUid
])
->exists();
}
public function getCampaignRef()
{
return $this->hasOne(StoredAdmissionCampaignReferenceType::class, ['id' => 'campaign_ref_id']);
}
public function getCompetitiveGroupRef()
{
return $this->hasOne(StoredCompetitiveGroupReferenceType::class, ['id' => 'competitive_group_ref_id']);
}
public function getParentCombinedCompetitiveGroupRef()
{
return $this->hasOne(StoredCompetitiveGroupReferenceType::class, ['id' => 'parent_combined_competitive_group_ref_id']);
}
public function getSubdivisionRef()
{
return $this->hasOne(StoredSubdivisionReferenceType::class, ['id' => 'subdivision_ref_id']);
}
public function getDirectionRef()
{
return $this->hasOne(StoredDirectionReferenceType::class, ['id' => 'direction_ref_id']);
}
public function getProfileRef()
{
return $this->hasOne(StoredProfileReferenceType::class, ['id' => 'profile_ref_id']);
}
public function getEducationLevelRef()
{
return $this->hasOne(StoredEducationLevelReferenceType::class, ['id' => 'education_level_ref_id']);
}
public function getEducationFormRef()
{
return $this->hasOne(StoredEducationFormReferenceType::class, ['id' => 'education_form_ref_id']);
}
public function getEducationProgramRef()
{
return $this->hasOne(EducationType::class, ['id' => 'education_program_ref_id']);
}
public function getEducationSourceRef()
{
return $this->hasOne(StoredEducationSourceReferenceType::class, ['id' => 'education_source_ref_id']);
}
public function getBudgetLevelRef()
{
return $this->hasOne(StoredBudgetLevelReferenceType::class, ['id' => 'budget_level_ref_id']);
}
public function getDetailGroupRef()
{
return $this->hasOne(StoredDetailGroupReferenceType::class, ['id' => 'detail_group_ref_id']);
}
public function getCurriculumRef()
{
return $this->hasOne(StoredCurriculumReferenceType::class, ['id' => 'curriculum_ref_id']);
}
public function getUgsRef()
{
return $this->hasOne(StoredUGSReferenceType::class, ['id' => 'ugs_ref_id']);
}
public function getGraduatingDepartmentRef()
{
return $this->hasOne(StoredSubdivisionReferenceType::class, ['id' => 'graduating_department_ref_id']);
}
public function getBranchRef()
{
return $this->hasOne(StoredSubdivisionReferenceType::class, ['id' => 'branch_ref_id']);
}
public function getGraduatingDepartmentName()
{
return ArrayHelper::getValue($this->graduatingDepartmentRef, 'reference_name');
}
public static function getByOneSData(StoredAdmissionCampaignReferenceType $campaign_ref, $application_from_1c): Speciality
{
$row_speciality = ToAssocCaster::getAssoc($application_from_1c);
return Speciality::GetFromRaw(
$campaign_ref,
ReferenceTypeManager::GetOrCreateReference(
StoredCompetitiveGroupReferenceType::class,
$row_speciality['CompetitiveGroupRef'] ?? null
),
ReferenceTypeManager::GetOrCreateReference(
StoredCurriculumReferenceType::class,
$row_speciality['CurriculumRef'] ?? null
),
ReferenceTypeManager::GetOrCreateReference(
StoredProfileReferenceType::class,
$row_speciality['ProfileRef'] ?? null
),
ReferenceTypeManager::GetOrCreateReference(
StoredEducationSourceReferenceType::class,
$row_speciality['EducationSourceRef'] ?? null
),
ReferenceTypeManager::GetOrCreateReference(
StoredBudgetLevelReferenceType::class,
$row_speciality['LevelBudgetRef'] ?? null
)
);
}
public function getParentCombinedCompetitiveGroupRefSpeciality()
{
return $this->hasOne(Speciality::class, [
'campaign_ref_id' => 'campaign_ref_id',
'competitive_group_ref_id' => 'parent_combined_competitive_group_ref_id'
])
->active()
->andWhere([Speciality::tableName() . '.is_combined_competitive_group' => true]);
}
public function getChildrenCombinedCompetitiveGroupRefSpecialities()
{
return $this->hasMany(Speciality::class, [
'campaign_ref_id' => 'campaign_ref_id',
'parent_combined_competitive_group_ref_id' => 'competitive_group_ref_id'
])
->active();
}
public static function GetFromRaw(
?StoredAdmissionCampaignReferenceType $admissionCampaignReferenceType,
?StoredCompetitiveGroupReferenceType $competitiveGroupReferenceType,
?StoredCurriculumReferenceType $curriculumReferenceType,
?StoredProfileReferenceType $profileReferenceType,
?StoredEducationSourceReferenceType $educationSourceReferenceType,
?StoredBudgetLevelReferenceType $budgetLevelReferenceType
): Speciality
{
$local_dict_spec = Speciality::find()
->joinWith([
'campaignRef campaign_ref',
'competitiveGroupRef competitive_group_ref',
'profileRef profile_ref',
'educationSourceRef education_source_ref',
'budgetLevelRef budget_level_ref',
'curriculumRef curriculum_ref',
])
->andWhere([Speciality::tableName() . '.archive' => false])
->andFilterWhere(['campaign_ref.reference_uid' => ArrayHelper::getValue(
$admissionCampaignReferenceType,
'reference_uid'
)])
->andFilterWhere(['competitive_group_ref.reference_uid' => ArrayHelper::getValue(
$competitiveGroupReferenceType,
'reference_uid'
)])
->andFilterWhere(['curriculum_ref.reference_uid' => ArrayHelper::getValue(
$curriculumReferenceType,
'reference_uid'
)])
->andFilterWhere(['profile_ref.reference_uid' => ArrayHelper::getValue(
$profileReferenceType,
'reference_uid'
)])
->andFilterWhere(['education_source_ref.reference_uid' => ArrayHelper::getValue(
$educationSourceReferenceType,
'reference_uid'
)])
->andFilterWhere(['budget_level_ref.reference_uid' => ArrayHelper::getValue(
$budgetLevelReferenceType,
'reference_uid'
)])
->one();
if (empty($local_dict_spec)) {
throw new UserException("Не удалось найти направление подготовки");
}
return $local_dict_spec;
}
public function getAdditionalReceiptDateControls()
{
return $this->hasMany(AdditionalReceiptDateControl::class, [
'campaign_ref_id' => 'campaign_ref_id',
'competitive_group_ref_id' => 'competitive_group_ref_id',
]);
}
public function getFormattedAdditionalReceiptDates()
{
return array_reduce(
$this->additionalReceiptDateControls,
function (string $carry, AdditionalReceiptDateControl $additionalReceiptDateControl) {
if ($carry) {
$carry = "{$carry}; ";
}
return trim("{$carry}{$additionalReceiptDateControl->formatted_date_start} - {$additionalReceiptDateControl->formatted_date_end}");
},
''
);
}
public function isActiveByAdditionalReceiptDateControl(): bool
{
if (!$this->additionalReceiptDateControls) {
return true;
}
$current_time = time();
foreach ($this->additionalReceiptDateControls as $additionalReceiptDateControl) {
if ($additionalReceiptDateControl->date_start_timestamp <= $current_time && $current_time < $additionalReceiptDateControl->date_end_timestamp) {
return true;
}
}
return false;
}
public function isTargetReceipt(): bool
{
$eduSourceReferenceUid = $this->educationSourceRef->reference_uid ?? null;
return $eduSourceReferenceUid == BachelorSpeciality::getTargetReceptionBasis();
}
public function getFullName(ApplicationType $applicationType = null): string
{
$display_speciality_name = ArrayHelper::getValue($applicationType, 'display_speciality_name', true);
$display_group_name = ArrayHelper::getValue($applicationType, 'display_group_name', true);
$display_code = ArrayHelper::getValue($applicationType, 'display_code', true);
$result = '';
if ($display_code) {
$result = $this->speciality_human_code . ' ';
}
$result .= ($display_speciality_name ? ($this->directionRef->reference_name ?? '') : '')
. ' '
. ($display_group_name ? ($this->competitiveGroupRef->reference_name ?? '') : '')
. ' '
. ($this->educationLevelRef->reference_name ?? '');
return trim((string)$result);
}
public function getDictionaryCompetitiveGroupEntranceTests()
{
return $this->hasMany(DictionaryCompetitiveGroupEntranceTest::class, [
'campaign_ref_id' => 'campaign_ref_id',
'curriculum_ref_id' => 'curriculum_ref_id',
'competitive_group_ref_id' => 'competitive_group_ref_id',
]);
}
}