_document_type_validation_extender = new RulesProviderByDocumentType($this); } public static function tableName() { return '{{%bachelor_preferences}}'; } public static function find() { return new EnlistedApplicationQueryForBachelorPreferences(get_called_class()); } public function setPreferenceType(string $preferenceType): void { $this->preferenceType = $preferenceType; $this->scenario = $preferenceType; } public function behaviors() { return [TimestampBehavior::class]; } public function rules() { $own_rules = [ [ [ 'document_series', 'document_number', ], 'trim' ], [ [ 'code', 'document_series', 'document_number', 'olympiad_code', 'document_date', 'privilege_code', 'special_mark_code', 'document_type', ], 'string' ], [ [ 'from1c', 'archive', 'read_only', 'priority_right', 'individual_value', 'notFoundContractor', ], 'boolean' ], [ [ 'archived_at', 'id_application', 'privilege_id', 'special_mark_id', 'document_type_id', 'olympiad_id', 'contractor_id', ], 'integer' ], [ 'document_type_id', 'required' ], [ ['code'], 'required', 'on' => [self::TYPE_PREF] ], [ 'olympiad_id', 'required', 'on' => [self::TYPE_OLYMP] ], [ ['privilege_id'], 'required', 'when' => function (BachelorPreferences $model) { return !$model->special_mark_id; }, 'whenClient' => "function(attribute, value) { return false; }", 'on' => [self::TYPE_PREF] ], [ ['special_mark_id'], 'required', 'when' => function (BachelorPreferences $model) { return !$model->privilege_id; }, 'whenClient' => "function(attribute, value) { return false; }", 'on' => [self::TYPE_PREF] ], [ [ 'read_only', 'archive', ], 'default', 'value' => false ], [ 'file', 'safe', 'on' => [self::SCENARIO_RECOVER] ], [ ['privilege_id'], 'exist', 'skipOnError' => false, 'targetClass' => Privilege::class, 'targetAttribute' => ['privilege_id' => 'id'] ], [ ['special_mark_id'], 'exist', 'skipOnError' => false, 'targetClass' => SpecialMark::class, 'targetAttribute' => ['special_mark_id' => 'id'] ], [ ['document_type_id'], 'exist', 'skipOnError' => false, 'targetClass' => DocumentType::class, 'targetAttribute' => ['document_type_id' => 'id'] ], [ ['olympiad_id'], 'exist', 'skipOnError' => false, 'targetClass' => Olympiad::class, 'targetAttribute' => ['olympiad_id' => 'id'] ], [ ['document_check_status_ref_id'], 'exist', 'skipOnError' => true, 'targetClass' => StoredDocumentCheckStatusReferenceType::class, 'targetAttribute' => ['document_check_status_ref_id' => 'id'], ], ]; return [...$this->_document_type_validation_extender->getRules(), ...$own_rules]; } public function ownRequiredRules(): array { return [ [ ['contractor_id'], 'required', 'whenClient' => "function(model, attribute) { return !+$(attribute.input).attr('data-skip_validation'); }" ], [ [ 'document_series', 'document_number', 'document_date', ], 'required' ], ]; } public function attributeLabels() { return [ 'code' => Yii::t('abiturient/bachelor/application/bachelor-preferences', 'Подпись для поля "code" формы "льгот-БВИ": `Льготы доступные для выбора`'), 'file' => Yii::t('abiturient/bachelor/application/bachelor-preferences', 'Подпись для поля "file" формы "льгот-БВИ": `Копия документа`'), 'year' => Yii::t('abiturient/bachelor/application/bachelor-preferences', 'Подпись для поля "year" формы "льгот-БВИ": `Год`'), 'olympiadYear' => Yii::t('abiturient/bachelor/application/bachelor-preferences', 'Подпись для поля "olympiadYear" формы "льгот-БВИ": `Год`'), 'filename' => Yii::t('abiturient/bachelor/application/bachelor-preferences', 'Подпись для поля "filename" формы "льгот-БВИ": `Имя файла`'), 'description' => Yii::t('abiturient/bachelor/application/bachelor-preferences', 'Подпись для поля "description" формы "льгот-БВИ": `Описание`'), 'olympiad_id' => Yii::t('abiturient/bachelor/application/bachelor-preferences', 'Подпись для поля "olympiad_id" формы "льгот-БВИ": `Олимпиада`'), 'privilege_id' => Yii::t('abiturient/bachelor/application/bachelor-preferences', 'Подпись для поля "privilege_id" формы "льгот-БВИ": `Тип льготы`'), 'document_date' => Yii::t('abiturient/bachelor/application/bachelor-preferences', 'Подпись для поля "document_date" формы "льгот-БВИ": `Дата выдачи`'), 'document_type' => Yii::t('abiturient/bachelor/application/bachelor-preferences', 'Подпись для поля "document_type" формы "льгот-БВИ": `Тип документа`'), 'olympiad_code' => Yii::t('abiturient/bachelor/application/bachelor-preferences', 'Подпись для поля "olympiad_code" формы "льгот-БВИ": `Олимпиада`'), 'olympiadName' => Yii::t('abiturient/bachelor/application/bachelor-preferences', 'Подпись для поля "olympiadName" формы "льгот-БВИ": `Наименование олимпиады`'), 'olympiadClass' => Yii::t('abiturient/bachelor/application/bachelor-preferences', 'Подпись для поля "olympiadClass" формы "льгот-БВИ": `Класс`'), 'id_application' => Yii::t('abiturient/bachelor/application/bachelor-preferences', 'Подпись для поля "id_application" формы "льгот-БВИ": `ID ПК`'), 'priority_right' => Yii::t('abiturient/bachelor/application/bachelor-preferences', 'Подпись для поля "priority_right" формы "льгот-БВИ": `Преимущественное право (поступаю на общих основаниях)`'), 'privilege_code' => Yii::t('abiturient/bachelor/application/bachelor-preferences', 'Подпись для поля "privilege_code" формы "льгот-БВИ": `Тип льготы`'), 'document_number' => Yii::t('abiturient/bachelor/application/bachelor-preferences', 'Подпись для поля "document_number" формы "льгот-БВИ": `Номер`'), 'document_series' => Yii::t('abiturient/bachelor/application/bachelor-preferences', 'Подпись для поля "document_series" формы "льгот-БВИ": `Серия`'), 'special_mark_id' => Yii::t('abiturient/bachelor/application/bachelor-preferences', 'Подпись для поля "special_mark_id" формы "льгот-БВИ": `Тип льготы`'), 'document_type_id' => Yii::t('abiturient/bachelor/application/bachelor-preferences', 'Подпись для поля "document_type_id" формы "льгот-БВИ": `Тип документа`'), 'individual_value' => Yii::t('abiturient/bachelor/application/bachelor-preferences', 'Подпись для поля "individual_value" формы "льгот-БВИ": `Льгота`'), 'special_mark_code' => Yii::t('abiturient/bachelor/application/bachelor-preferences', 'Подпись для поля "special_mark_code" формы "льгот-БВИ": `Тип льготы`'), 'benefitDescription' => Yii::t('abiturient/bachelor/application/bachelor-preferences', 'Подпись для поля "benefitDescription" формы "льгот-БВИ": `Описание льготы`'), 'contractor_id' => Yii::t('abiturient/bachelor/application/bachelor-preferences', 'Подпись для поля "contractor_id" формы "льгот-БВИ": `Кем выдано`'), 'documentTypeDescription' => Yii::t('abiturient/bachelor/application/bachelor-preferences', 'Подпись для поля "documentTypeDescription" формы "льгот-БВИ": `Тип документа`'), 'specialMarkDescription' => Yii::t('abiturient/bachelor/application/bachelor-preferences', 'Подпись для поля "specialMarkDescription" формы "льгот-БВИ": `Особая отметка`'), 'humanized_priority_right' => Yii::t('abiturient/bachelor/application/bachelor-preferences', 'Подпись для поля "humanized_priority_right" формы "льгот-БВИ": `Преимущественное право (поступаю на общих основаниях)`'), 'humanized_individual_value' => Yii::t('abiturient/bachelor/application/bachelor-preferences', 'Подпись для поля "humanized_individual_value" формы "льгот-БВИ": `Льгота`'), 'benefitSign' => Yii::t('abiturient/bachelor/application/bachelor-preferences', 'Подпись для поля "benefitSign" формы "льгот-БВИ": `Отличительный признак`'), 'attachments' => Yii::t('abiturient/bachelor/application/bachelor-preferences', 'Подпись для файлов формы "льгот-БВИ": `Файл`'), 'documentCheckStatus' => Yii::t('abiturient/bachelor/application/bachelor-preferences', 'Подпись для поля "documentCheckStatus" формы "льгот-БВИ": `Статус проверки документа`'), ]; } public function scenarios() { $scenarios = parent::scenarios(); $scenarios[self::SCENARIO_RECOVER] = $scenarios[self::SCENARIO_DEFAULT]; $scenarios[self::SCENARIO_ARCHIVE] = ['archive']; return $scenarios; } public function getApplication() { return $this->hasOne(BachelorApplication::class, ['id' => 'id_application']); } public function getDescription() { $result = ''; if ($this->olympiad) { $ol = $this->olympiad; $result = $ol->name ?? ''; } if ($this->privilege) { $priv = $this->privilege; $result = $priv->description ?? ''; } if ($this->specialMark) { $spec = $this->specialMark; $result = $spec->description ?? ''; } return $result; } public function getDocumentType() { return $this->hasOne( DocumentType::class, ['id' => 'document_type_id'] ); } public function isOlymp(): bool { return !empty($this->olympiad); } public function checkAccess($user) { $application = $this->application; if ($user->isModer()) { return true; } if (isset($application) && $user->id == $application->user_id) { return true; } return false; } public function getAttachmentTypeName(): ?string { $res = "{$this->getBenefitSign()}: "; $res .= $this->getName(); return $res; } public static function getTableLink(): string { return 'preference_attachment'; } public static function getEntityTableLinkAttribute(): string { return 'preference_id'; } public static function getAttachmentTableLinkAttribute(): string { return 'attachment_id'; } public function getRawBachelorSpecialities() { return $this->hasMany(BachelorSpeciality::class, ['preference_id' => 'id']); } public function getBachelorSpecialities() { return $this->getRawBachelorSpecialities()->active(); } public function getRawBachelorSpecialitiesWithOlympiad() { return $this->hasMany(BachelorSpeciality::class, ['bachelor_olympiad_id' => 'id']); } public function getBachelorSpecialitiesWithOlympiad() { return $this->getRawBachelorSpecialitiesWithOlympiad()->active(); } public function beforeArchive() { $this->setScenario(self::SCENARIO_ARCHIVE); foreach ($this->getRawBachelorSpecialities()->all() as $speciality) { $speciality->preference_id = null; $speciality->save(false); } } public function getAttachments(): ActiveQuery { return $this->getRawAttachments() ->andOnCondition([Attachment::tableName() . '.deleted' => false]); } public function getRawAttachments(): ActiveQuery { return $this->hasMany(Attachment::class, ['id' => self::getAttachmentTableLinkAttribute()]) ->viaTable(self::getTableLink(), [self::getEntityTableLinkAttribute() => 'id']); } public function getAttachmentCollection(): FileToShowInterface { $customIndex = $this->preferenceType === self::TYPE_OLYMP ? 'olymp' : 'pref'; return new AttachedEntityAttachmentCollection( ArrayHelper::getValue($this, 'application.user'), $this, AttachmentManager::GetSystemAttachmentType(AttachmentType::SYSTEM_TYPE_PREFERENCE), $this->attachments, $this->formName(), 'file', $customIndex ); } public static function getModel(): string { return get_called_class(); } public static function getDbTableSchema(): TableSchema { return parent::getTableSchema(); } public function getAttachmentType(): ?AttachmentType { return AttachmentManager::GetSystemAttachmentType(AttachmentType::SYSTEM_TYPE_PREFERENCE); } public function getName(): string { return "{$this->getDescription()} (Серия {$this->document_series} № {$this->document_number})"; } public function stringify(): string { return $this->getName(); } public static function getApplicationIdColumn(): string { return 'id_application'; } public function getOlympiad() { return $this->hasOne(Olympiad::class, ['id' => 'olympiad_id']); } public function getSpecialMark() { return $this->hasOne(SpecialMark::class, ['id' => 'special_mark_id']); } public function getPrivilege() { return $this->hasOne(Privilege::class, ['id' => 'privilege_id']); } public function getAttachmentConnectors(): array { return ['application_id' => $this->application->id]; } public function afterFind() { parent::afterFind(); $this->_new_record = false; } public function getUserInstance(): User { return ArrayHelper::getValue($this, 'application.user') ?: new User(); } public function getChangeLoggedAttributes() { return [ 'olympiad_id' => function ($model) { return ArrayHelper::getValue($model, 'olympiad.name'); }, 'document_series', 'document_number', 'contractor_id' => function ($model) { return $model->contractor->name ?? ''; }, 'document_date', 'document_type', 'priority_right', 'privilege_id' => function ($model) { return ArrayHelper::getValue($model, 'privilege.description'); }, 'special_mark_id' => function ($model) { return ArrayHelper::getValue($model, 'specialMark.description'); }, ]; } public function getClassTypeForChangeHistory(): int { return ChangeHistoryClasses::CLASS_BACHELOR_PREFERENCES; } public function beforeValidate() { $this->special_mark_code = ArrayHelper::getValue($this, 'specialMark.code'); $this->olympiad_code = ArrayHelper::getValue($this, 'olympiad.olympicRef.reference_id'); $this->privilege_code = ArrayHelper::getValue($this, 'privilege.code'); $this->document_type = ArrayHelper::getValue($this, 'documentType.code'); return parent::beforeValidate(); } public function beforeDelete() { if (parent::beforeDelete()) { AttachmentManager::unlinkAllAttachment($this); $this->beforeArchive(); return true; } else { return false; } } public function afterValidate() { (new LoggingAfterValidateHandler()) ->setModel($this) ->invoke(); } public static function GetOrCreateFromRaw( string $document_series, string $document_number, array $document_organization, string $document_date, $raw_privilege_ref, $raw_olympic_ref, $raw_special_mark_ref, $raw_document_type_ref, array $documentCheckStatusRef = [], bool $documentReadOnly = false, BachelorApplication $application, array $ids_to_ignore = [] ): BachelorPreferences { $contractor = ContractorManager::GetOrCreateContractor($document_organization); $benefit = $application->getPreferences() ->joinWith([ 'privilege p', 'specialMark sp', 'olympiad.olympicRef or', 'documentType dt' ]) ->andFilterWhere(['not', [BachelorPreferences::tableName() . '.id' => $ids_to_ignore]]) ->andWhere([ BachelorPreferences::tableName() . '.document_series' => $document_series, BachelorPreferences::tableName() . '.document_number' => $document_number, BachelorPreferences::tableName() . '.contractor_id' => $contractor->id ?? null, ]) ->andFilterWhere([ 'p.ref_key' => ReferenceTypeManager::GetOrCreateReference( Privilege::class, $raw_privilege_ref )->ref_key ?? null ]) ->andFilterWhere([ 'or.reference_uid' => ArrayHelper::getValue( ReferenceTypeManager::GetOrCreateReference( Olympiad::class, $raw_olympic_ref ), 'olympicRef.reference_uid' ) ]) ->andFilterWhere([ 'sp.ref_key' => ReferenceTypeManager::GetOrCreateReference( SpecialMark::class, $raw_special_mark_ref )->ref_key ?? null ]) ->andFilterWhere([ 'dt.ref_key' => ReferenceTypeManager::GetOrCreateReference( DocumentType::class, $raw_document_type_ref )->ref_key ?? null ]) ->one(); if (!$benefit) { $benefit = new BachelorPreferences(); $benefit->id_application = $application->id; } $benefit->read_only = $documentReadOnly; $benefit->setDocumentCheckStatusFrom1CData($documentCheckStatusRef); $benefit->from1c = true; $benefit->document_series = $document_series; $benefit->document_number = $document_number; $benefit->contractor_id = $contractor->id ?? null; $benefit->document_date = date('d.m.Y', strtotime($document_date)); $olympRef = ReferenceTypeManager::GetOrCreateReference(Olympiad::class, $raw_olympic_ref); $benefit->olympiad_id = $olympRef->id ?? null; $benefit->privilege_id = ReferenceTypeManager::GetOrCreateReference(Privilege::class, $raw_privilege_ref)->id ?? null; $benefit->special_mark_id = ReferenceTypeManager::GetOrCreateReference(SpecialMark::class, $raw_special_mark_ref)->id ?? null; $docType = ReferenceTypeManager::GetOrCreateReference(DocumentType::class, $raw_document_type_ref); $benefit->document_type_id = $docType->id ?? null; $benefit->document_type = $docType->code ?? null; $benefit->privilege_code = null; $benefit->special_mark_code = null; $benefit->olympiad_code = null; $benefit->archive = false; if (!$benefit->save(false)) { throw new RecordNotValid($benefit); } return $benefit; } public function getRelationsInfo(): array { return [ new AttachmentsRelationPresenter('attachments', [ 'parent_instance' => $this, ]), ]; } public function getIdentityString(): string { $privilege_uid = ArrayHelper::getValue($this, 'privilege.ref_key', ''); $spec_mark_uid = ArrayHelper::getValue($this, 'specialMark.ref_key', ''); $olymp_uid = ArrayHelper::getValue($this, 'olympiad.olympicRef.reference_uid', ''); $document_uid = ArrayHelper::getValue($this, 'documentType.ref_key', ''); return "{$privilege_uid}_{$spec_mark_uid}_{$olymp_uid}_{$document_uid}_{$this->document_series}_{$this->document_number}"; } public function getOlympiadName() { return ArrayHelper::getValue($this, 'olympiad.name'); } public function getDocumentTypeDescription() { return ArrayHelper::getValue($this, 'documentType.description'); } public function getOlympiadYear() { return ArrayHelper::getValue($this, 'olympiad.year'); } public function getOlympiadClass() { return ArrayHelper::getValue($this, 'olympiad.class'); } public function getBenefitDescription() { $lgota = $this->privilege; if (!$lgota) { $lgota = $this->specialMark; } return ArrayHelper::getValue($lgota, 'description'); } public function getSpecialMarkDescription() { return ArrayHelper::getValue($this, 'specialMark.description'); } public function getBenefitSign() { if ($this->isOlymp()) { return Yii::t( 'abiturient/bachelor/application/bachelor-preferences', 'Подпись для олимпиады: `Олимпиада`' ); } if ($this->priority_right && !$this->individual_value) { return Yii::t( 'abiturient/bachelor/application/bachelor-preferences', 'Подпись для преимущественного права: `Преимущественное право`' ); } elseif ($this->priority_right && $this->individual_value) { return Yii::t( 'abiturient/bachelor/application/bachelor-preferences', 'Подпись для преимущественного права: `Преимущественное право`' ) . ' / ' . Yii::t( 'abiturient/bachelor/application/bachelor-preferences', 'Подпись для льготы: `Льгота`' ); } elseif (!$this->priority_right && $this->individual_value) { return Yii::t( 'abiturient/bachelor/application/bachelor-preferences', 'Подпись для льготы: `Льгота`' ); } return ''; } public function getHumanized_priority_right() { return $this->priority_right ? Yii::t( 'abiturient/bachelor/application/bachelor-preferences', 'Подпись наличия флага особого права таблицы льгот; в блоке льгот на стр. просмотра заявления: `Да`' ) : Yii::t( 'abiturient/bachelor/application/bachelor-preferences', 'Подпись отсутствия флага особого права таблицы льгот; в блоке льгот на стр. просмотра заявления: `Нет`' ); } public function getHumanized_individual_value() { return $this->individual_value ? Yii::t( 'abiturient/bachelor/application/bachelor-preferences', 'Подпись наличия флага особого права таблицы льгот; в блоке льгот на стр. просмотра заявления: `Да`' ) : Yii::t( 'abiturient/bachelor/application/bachelor-preferences', 'Подпись отсутствия флага особого права таблицы льгот; в блоке льгот на стр. просмотра заявления: `Нет`' ); } public function getPropsToCompare(): array { return ArrayHelper::merge( array_diff( array_keys($this->attributes), [ 'id_application', 'olympiad_code', 'privilege_code', 'special_mark_code', 'document_type', 'from1c', 'file', 'code', 'size', ] ), [ 'olympiadName', 'olympiadYear', 'olympiadClass', 'benefitSign', 'documentTypeDescription', 'benefitDescription', 'specialMarkDescription', 'description', 'humanized_priority_right', 'humanized_individual_value', ] ); } public function getIsActuallyNewRecord(): bool { return $this->_new_record; } public static function getBenefitByHashKey(string $hash_key): ActiveRecord { $reference = null; $params = explode('_', $hash_key); if ($params[1] == SpecialMark::KEY) { $reference = SpecialMark::findByUID($params[0]); } else { $reference = Privilege::findByUID($params[0]); } return $reference; } public function getCode(): ?string { $benefit = $this->privilege; if (!$benefit) { $benefit = $this->specialMark; } return ArrayHelper::getValue($benefit, 'hashCode'); } public function setCode(string $hash_code) { $params = explode('_', $hash_code); $reference = BachelorPreferences::getBenefitByHashKey($hash_code); if ($params[1] == SpecialMark::KEY) { $this->special_mark_code = $reference->ref_key; $this->special_mark_id = $reference->id; } else { $this->privilege_code = $reference->ref_key; $this->privilege_id = $reference->id; } if ($params[2] != 2) { $this->priority_right = $params[2]; } } public function getAttachedFilesInfo(): array { $files = []; foreach ($this->attachments as $attachment) { $files[] = [ $attachment, ArrayHelper::getValue($this, 'documentType'), null ]; } return $files; } public function getIgnoredOnCopyingAttributes(): array { return [ ...DraftsManager::$attributes_to_ignore, 'id_application' ]; } public function hasEnlistedBachelorSpecialitiesQueryTemplate(string $bachelorSpecialitiesQueryGetter): bool { $tn = BachelorSpeciality::tableName(); return $this->{$bachelorSpecialitiesQueryGetter}() ->andWhere(["{$tn}.is_enlisted" => true]) ->exists(); } public function hasEnlistedBachelorSpecialities(): bool { return $this->hasEnlistedBachelorSpecialitiesQueryTemplate('getBachelorSpecialities'); } public function olympiadMatchedByCurriculum(StoredCurriculumReferenceType $curriculumReferenceType): bool { return $this->olympiad ->getOlympiadFilters() ->joinWith(['curriculumRef']) ->andWhere([ StoredCurriculumReferenceType::tableName() . '.reference_uid' => $curriculumReferenceType->reference_uid ]) ->exists(); } public function hasEnlistedBachelorSpecialitiesWithOlympiad(): bool { return $this->hasEnlistedBachelorSpecialitiesQueryTemplate('getBachelorSpecialitiesWithOlympiad'); } public function getContractor(): ActiveQuery { return $this->hasOne(Contractor::class, ['id' => 'contractor_id']); } public static function getDocumentTypePropertyName(): string { return 'documentType'; } public static function getSubdivisionCodePropertyName(): string { return ''; } public static function getIssuedDatePropertyName(): string { return 'document_date'; } public static function getDateOfEndPropertyName(): string { return ''; } public static function getAdditionalPropertyName(): string { return ''; } public static function getIssuedByPropertyName(): string { return 'contractor_id'; } public static function getDocumentSeriesPropertyName(): string { return 'document_series'; } public static function getDocumentNumberPropertyName(): string { return 'document_number'; } public function beforeSave($insert) { if (!parent::beforeSave($insert)) { return false; } if (!$this->fillDocumentCheckStatusIfNotVerified()) { return false; } return true; } }