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

753 lines
29 KiB
PHP
Executable File
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

<?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',
]);
}
}