_document_type_validation_extender = new RulesProviderByDocumentType($this); } public static function tableName() { return '{{%education_data}}'; } public static function getBachelorSpecialityEducationDataTable() { return '{{%bachelor_speciality_education_data}}'; } public static function find() { return new EnlistedApplicationQuery(get_called_class()); } public function behaviors() { return [TimestampBehavior::class]; } public function afterFind() { parent::afterFind(); $this->_new_record = false; } public function rules() { $own_rules = [ [ [ 'series', 'number', 'edu_end_year', ], 'trim' ], [ ['archived_at'], 'integer' ], [ [ 'archive', 'have_original', 'read_only', 'notFoundContractor', 'original_from_epgu', ], 'boolean' ], [ [ 'archived_at', 'application_id', 'education_type_id', 'education_level_id', 'document_type_id', 'education_ref_id', 'profile_ref_id', 'contractor_id', ], 'integer' ], [ [ 'series', 'number', 'date_given', 'edu_end_year' ], 'string', 'max' => 100 ], [ [ 'application_id', 'education_type_id', 'document_type_id', 'edu_end_year', ], 'required' ], [ 'edu_end_year', 'checkYear' ], [ [ 'read_only', 'have_original', 'original_from_epgu' ], 'default', 'value' => false ], [ 'series', 'checkSeries' ], [ 'number', 'checkNumber' ], [ 'date_given', 'checkDate' ], [ ['education_ref_id'], 'exist', 'skipOnError' => false, 'targetClass' => StoredEducationReferenceType::class, 'targetAttribute' => ['education_ref_id' => 'id'] ], [ ['profile_ref_id'], 'exist', 'skipOnError' => true, 'targetClass' => StoredProfileReferenceType::class, 'targetAttribute' => ['profile_ref_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 $('#education_data-contractor_not_found_" . ($this->id ?? 'new') . "').not(':checked'); }", ], [ [ 'number', 'date_given', ], 'required' ], ]; } public function scenarios() { $scenarios = parent::scenarios(); $scenarios[self::SCENARIO_CONTRACTOR_MAY_NOT_BE_FOUND] = $scenarios[self::SCENARIO_DEFAULT]; return $scenarios; } public function attributeLabels() { return [ 'number' => Yii::t('abiturient/bachelor/education/education-data', 'Подпись для поля "number" формы "Док. об обр.": `Номер документа`'), 'series' => Yii::t('abiturient/bachelor/education/education-data', 'Подпись для поля "series" формы "Док. об обр.": `Серия документа`'), 'date_given' => Yii::t('abiturient/bachelor/education/education-data', 'Подпись для поля "date_given" формы "Док. об обр.": `Дата выдачи`'), 'profileRef' => Yii::t('abiturient/bachelor/education/education-data', 'Подпись для поля "profileRef" формы "Док. об обр.": `Профиль образования`'), 'attachments' => Yii::t('abiturient/bachelor/education/education-data', 'Подпись для связи со скан-копиями: `Файлы`'), 'edu_end_year' => Yii::t('abiturient/bachelor/education/education-data', 'Подпись для поля "edu_end_year" формы "Док. об обр.": `Год окончания учебного заведения`'), 'contractor_id' => Yii::t('abiturient/bachelor/education/education-data', 'Подпись для поля "contractor_id" формы "Док. об обр.": `Наименование учебного заведения`'), 'have_original' => Yii::t('abiturient/bachelor/education/education-data', 'Подпись для поля "have_original" формы "Док. об обр.": `Вид предоставленного документа`'), 'application_id' => Yii::t('abiturient/bachelor/education/education-data', 'Подпись для поля "application_id" формы "Док. об обр.": `Заявление`'), 'profile_ref_id' => Yii::t('abiturient/bachelor/education/education-data', 'Подпись для поля "profile_ref_id" формы "Док. об обр.": `Профиль образования`'), 'document_type_id' => Yii::t('abiturient/bachelor/education/education-data', 'Подпись для поля "document_type_id" формы "Док. об обр.": `Тип документа`'), 'education_type_id' => Yii::t('abiturient/bachelor/education/education-data', 'Подпись для поля "education_type_id" формы "Док. об обр.": `Вид образования`'), 'education_level_id' => Yii::t('abiturient/bachelor/education/education-data', 'Подпись для поля "education_level_id" формы "Док. об обр.": `Уровень образования`'), 'documentCheckStatus' => Yii::t('abiturient/bachelor/education/education-data', 'Подпись для поля "documentCheckStatus" формы "Док. об обр.": `Статус проверки документа`'), 'profileRefDescription' => Yii::t('abiturient/bachelor/education/education-data', 'Подпись для поля "profileRefDescription" формы "Док. об обр.": `Профиль образования`'), 'documentTypeDescription' => Yii::t('abiturient/bachelor/education/education-data', 'Подпись для поля "documentTypeDescription" формы "Док. об обр.": `Тип документа`'), 'educationTypeDescription' => Yii::t('abiturient/bachelor/education/education-data', 'Подпись для поля "educationTypeDescription" формы "Док. об обр.": `Вид образования`'), 'educationLevelDescription' => Yii::t('abiturient/bachelor/education/education-data', 'Подпись для поля "educationLevelDescription" формы "Док. об обр.": `Уровень образования`'), ]; } public function getApplication() { return $this->hasOne(BachelorApplication::class, ['id' => 'application_id']); } public function getDocumentType() { return $this->hasOne(DocumentType::class, ['id' => 'document_type_id']); } public function getEducationType() { return $this->hasOne(EducationType::class, ['id' => 'education_type_id']); } public function getEducationLevel() { return $this->hasOne(StoredEducationLevelReferenceType::class, ['id' => 'education_level_id']); } public function getBachelorSpecialities(): ActiveQuery { return $this->hasMany(BachelorSpeciality::class, ['id' => 'bachelor_speciality_id']) ->viaTable(EducationData::getBachelorSpecialityEducationDataTable(), ['education_data_id' => 'id']); } public function getProfileRef() { return $this->hasOne(StoredProfileReferenceType::class, ['id' => 'profile_ref_id']); } public function getDescriptionString() { $series = trim($this->series); $number = trim($this->number); $dateGiven = trim($this->date_given); $schoolName = trim($this->schoolName); $result = trim(ArrayHelper::getValue($this, 'educationType.description')); if ($series) { $result .= Yii::t( 'abiturient/bachelor/education/education-data', 'Часть представления серии образования в выпадающем списки, на форме направлений подготовки: ` Серия {series}`', ['series' => $series] ); } if ($number) { $result .= " №{$number}"; } if ($dateGiven) { $result .= Yii::t( 'abiturient/bachelor/education/education-data', 'Часть представления даты выдачи образования в выпадающем списки, на форме направлений подготовки: ` от {dateGiven}`', ['dateGiven' => $dateGiven] ); } if ($schoolName) { $result .= Yii::t( 'abiturient/bachelor/education/education-data', 'Часть представления выдавшей организации образования в выпадающем списки, на форме направлений подготовки: ` выданный {schoolName}`', ['schoolName' => $schoolName] ); } return $result; } public static function build1sStructure(?EducationData $edu_data) { $doc = [ 'EducationDocumentTempGUID' => '', 'EducationTypeRef' => ReferenceTypeManager::getEmptyRefTypeArray(), 'Document' => [ 'DocumentTypeRef' => ReferenceTypeManager::getEmptyRefTypeArray(), 'DocSeries' => '', 'DocNumber' => '', 'DocOrganization' => '', 'IssueDate' => EducationData::EMPTY_DATE, 'DocumentCheckStatusRef' => ReferenceTypeManager::GetReference($edu_data, 'notVerifiedStatusDocumentChecker'), 'ReadOnly' => false, ], 'GraduationYear' => '', 'SubdivisionCode' => '', 'EducationDocumentReferenceType' => ReferenceTypeManager::getEmptyRefTypeArray(), 'ProfileRef' => ReferenceTypeManager::getEmptyRefTypeArray(), ]; if ($edu_data) { $doc = [ 'EducationDocumentTempGUID' => $edu_data->tmp_uuid, 'EducationTypeRef' => ReferenceTypeManager::GetReference($edu_data, 'educationType'), 'Document' => [ 'DocumentTypeRef' => ReferenceTypeManager::GetReference($edu_data, 'documentType'), 'DocSeries' => $edu_data->series, 'DocNumber' => $edu_data->number, 'DocOrganization' => (new ContractorPackageBuilder(null, $edu_data->contractor))->build(), 'IssueDate' => (string)$edu_data->formated_date_given, 'DocumentCheckStatusRef' => $edu_data->buildDocumentCheckStatusRefType(), 'ReadOnly' => $edu_data->read_only ? 1 : 0, ], 'GraduationYear' => (int)$edu_data->edu_end_year, 'SubdivisionCode' => '', 'EducationDocumentReferenceType' => ReferenceTypeManager::GetReference($edu_data, 'educationRef'), 'ProfileRef' => ReferenceTypeManager::getEmptyRefTypeArray(), ]; if ($edu_data->profile_ref_id) { $doc['ProfileRef'] = ReferenceTypeManager::GetReference($edu_data, 'profileRef'); } } return $doc; } public function checkYear($attribute, $params) { if (!((int)$this->$attribute > 1900 && (int)$this->$attribute < (int)(date('Y') + 1))) { $this->addError( $attribute, Yii::t( 'abiturient/bachelor/education/education-data', 'Подсказка с ошибкой для поля "edu_end_year" формы "Док. об обр.": `Год должен быть не ранее 1900 и не позднее текущего`' ) ); } } public function checkDate($attribute, $params) { $app = $this->application; $quest = null; if ($app) { $quest = $app->abiturientQuestionary; } if ($quest && $quest->personalData) { $date_given = strtotime($this->$attribute); $date_birth = strtotime($quest->personalData->birthdate); if ($date_given < $date_birth) { $this->addError( $attribute, Yii::t( 'abiturient/bachelor/education/education-data', 'Подсказка с ошибкой для поля "date_given" формы "Док. об обр.": `Дата выдачи документа должна быть позже даты рождения`' ) ); } } } public static function GetOrCreateFromRaw( string $series, string $number, array $doc_organization, string $date_given, string $edu_end_year, $raw_education_ref, $raw_document_type_ref, $raw_education_type_ref, $rawEducationProfileRef, array $documentCheckStatusRef = [], bool $documentReadOnly = false, BachelorApplication $application ): EducationData { $eduRef = ReferenceTypeManager::GetOrCreateReference( StoredEducationReferenceType::class, $raw_education_ref ); $contractor = ContractorManager::GetOrCreateContractor($doc_organization); $edu_data = null; if (!EmptyCheck::isEmpty($series) || !EmptyCheck::isEmpty($number)) { $edu_data = $application->getEducations() ->andWhere([ EducationData::tableName() . '.series' => $series, EducationData::tableName() . '.number' => $number, ])->one(); } if (empty($edu_data)) { $edu_data = new EducationData(); $edu_data->application_id = $application->id; } $edu_data->read_only = $documentReadOnly; $edu_data->setDocumentCheckStatusFrom1CData($documentCheckStatusRef); $edu_data->education_ref_id = $eduRef->id ?? null; $edu_data->series = $series; $edu_data->number = $number; $edu_data->contractor_id = $contractor->id ?? null; $edu_data->date_given = $date_given; $edu_data->edu_end_year = $edu_end_year; $documentTypeRef = ReferenceTypeManager::GetOrCreateReference( DocumentType::class, $raw_document_type_ref ); $educationTypeRef = ReferenceTypeManager::GetOrCreateReference( EducationType::class, $raw_education_type_ref ); $educationProfileRef = ReferenceTypeManager::GetOrCreateReference( StoredProfileReferenceType::class, $rawEducationProfileRef ); $edu_data->education_type_id = ArrayHelper::getValue($educationTypeRef, 'id'); $edu_data->profile_ref_id = ArrayHelper::getValue($educationProfileRef, 'id'); $edu_data->document_type_id = ArrayHelper::getValue($documentTypeRef, 'id'); $edu_data->validate(); $edu_data->save(false); return $edu_data; } public function getFormated_date_given() { return date('Y-m-d', strtotime($this->date_given)); } public function __set($name, $value) { $value = $this->encodeProp($name, $value); if ($name == 'date_given') { $value = (string)date('d.m.Y', strtotime($value)); } parent::__set($name, $value); } public function checkSeries($attribute, $params) { if ($this->documentType == null) { return true; } if ( $this->documentType->ref_key != Yii::$app->configurationManager->getCode('edu_certificate_doc_type_guid') && $this->documentType->ref_key != Yii::$app->configurationManager->getCode('bak_doc_guid') && $this->documentType->ref_key != Yii::$app->configurationManager->getCode('mag_doc_guid') && $this->documentType->ref_key != Yii::$app->configurationManager->getCode('spec_doc_guid') ) { return true; } return false; } public function checkNumber($attribute, $params) { if ($this->documentType == null) { return; } if ( $this->documentType->ref_key != Yii::$app->configurationManager->getCode('edu_certificate_doc_type_guid') && $this->documentType->ref_key != Yii::$app->configurationManager->getCode('bak_doc_guid') && $this->documentType->ref_key != Yii::$app->configurationManager->getCode('mag_doc_guid') && $this->documentType->ref_key != Yii::$app->configurationManager->getCode('spec_doc_guid') ) { return; } if ($this->documentType->ref_key == Yii::$app->configurationManager->getCode('edu_certificate_doc_type_guid') && mb_strlen((string)$this->$attribute, 'UTF-8') > 100) { $this->addError( $attribute, Yii::t( 'abiturient/bachelor/education/education-data', 'Подсказка с ошибкой для поля "number" формы "Док. об обр.": `Номер аттестата должен быть длиной не более 100 символов`' ) ); } if (($this->documentType->ref_key == Yii::$app->configurationManager->getCode('bak_doc_guid') || $this->documentType->ref_key == Yii::$app->configurationManager->getCode('mag_doc_guid') || $this->documentType->ref_key == Yii::$app->configurationManager->getCode('spec_doc_guid')) && mb_strlen((string)$this->$attribute, 'UTF-8') > 100 ) { $this->addError( $attribute, Yii::t( 'abiturient/bachelor/education/education-data', 'Подсказка с ошибкой для поля "number" формы "Док. об обр.": `Номер диплома должен быть длиной не более 100 символов`' ) ); } } public function getChangeLoggedAttributes() { return [ 'education_type_id' => function ($model) { return ArrayHelper::getValue($model->educationType, 'description'); }, 'education_level_id' => function ($model) { return ArrayHelper::getValue($model->educationLevel, 'reference_name'); }, 'document_type_id' => function ($model) { return ArrayHelper::getValue($model->documentType, 'description'); }, 'series', 'number', 'date_given' => function ($model) { return $model->date_given == '01.01.1970' ? null : $model->date_given; }, 'edu_end_year', 'contractor_id' => function ($model) { return $model->contractor->name ?? ''; } ]; } public function getClassTypeForChangeHistory(): int { return ChangeHistoryClasses::CLASS_EDUCATION_DATA; } public function beforeArchive() { BachelorSpeciality::getDb() ->createCommand("DELETE FROM [[bachelor_speciality_education_data]] WHERE education_data_id = :id", ['id' => $this->id]) ->execute(); BachelorSpeciality::getDb() ->createCommand("UPDATE [[bachelor_speciality]] SET education_id = NULL WHERE education_id = :id", ['id' => $this->id]) ->execute(); } public function getEducationRef() { return $this->hasOne(StoredEducationReferenceType::class, ['id' => 'education_ref_id']); } public function getHaveOriginal() { if ($this->have_original) { return Yii::t( 'abiturient/bachelor/education/education-data', 'Подпись наличия флага "have_original" формы "Док. об обр.": `оригинал`' ); } else { return Yii::t( 'abiturient/bachelor/education/education-data', 'Подпись отсутствия флага "have_original" формы "Док. об обр.": `копия`' ); } } public function stringify(): string { return $this->getDescriptionString(); } public function getRelationsInfo(): array { return [ new AttachmentsRelationPresenter('attachments', [ 'parent_instance' => $this, ]), ]; } public function afterValidate() { (new LoggingAfterValidateHandler()) ->setModel($this) ->invoke(); } public function getIdentityString(): string { $doc_type_uid = ArrayHelper::getValue($this, 'documentType.ref_key', ''); return "{$this->series}_{$this->number}_{$doc_type_uid}"; } public function getEducationTypeDescription() { return ArrayHelper::getValue($this, 'educationType.description'); } public function getDocumentTypeDescription() { return ArrayHelper::getValue($this, 'documentType.description'); } public function getProfileRefDescription() { return ArrayHelper::getValue($this, 'profileRef.reference_name', ''); } public function getEducationLevelDescription() { return ArrayHelper::getValue($this, 'educationLevel.reference_name'); } public function getPropsToCompare(): array { return [ 'educationLevelDescription', 'series', 'number', 'date_given', 'edu_end_year', 'educationTypeDescription', 'documentTypeDescription', 'profileRefDescription', ]; } public static function getRawProfileList(): array { $tnStoredProfileReferenceType = StoredProfileReferenceType::tableName(); return StoredProfileReferenceType::find() ->notMarkedToDelete() ->active() ->andWhere(["{$tnStoredProfileReferenceType}.is_folder" => false]) ->orderBy("{$tnStoredProfileReferenceType}.reference_name") ->all(); } public static function getProfileList(): array { $profiles = EducationData::getRawProfileList(); if (!$profiles) { return []; } return ArrayHelper::map($profiles, 'id', 'reference_name'); } public function getIgnoredOnCopyingAttributes(): array { return [ ...DraftsManager::$attributes_to_ignore, 'application_id' ]; } public function getAttributesToCompare(): array { return [ 'education_type_id', 'education_level_id', 'document_type_id', 'profile_ref_id', ]; } public function hasRelatedBachelorSpecialities(): bool { return $this->getBachelorSpecialities()->exists(); } public static function getTableLink(): string { return 'education_attachment'; } public static function getEntityTableLinkAttribute(): string { return 'education_id'; } public static function getAttachmentTableLinkAttribute(): string { return "attachment_id"; } public static function getModel(): string { return get_called_class(); } public static function getDbTableSchema(): TableSchema { return self::getTableSchema(); } public function getAttachmentType(): ?AttachmentType { return AttachmentManager::GetSystemAttachmentType(AttachmentType::SYSTEM_TYPE_EDUCATION_DOCUMENT); } 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 getName(): string { $doc_name = ArrayHelper::getValue($this, 'documentType.description'); $name = Yii::t('abiturient/bachelor/education/education-data', 'Название сущности: `Документ об образовании`'); return "{$name} {$doc_name} ({$this->series} {$this->number})"; } public function getAttachmentCollection(): ?AttachedEntityAttachmentCollection { return new AttachedEntityAttachmentCollection($this->getUserInstance(), $this, $this->getAttachmentType(), $this->attachments, $this->formName(), 'file'); } public function getAttachmentConnectors(): array { return [ 'application_id' => $this->application->id ]; } public function getUserInstance(): User { return ArrayHelper::getValue($this, 'application.user') ?: new User(); } public function getIsActuallyNewRecord(): bool { return $this->_new_record; } public function beforeDelete() { if (parent::beforeDelete()) { AttachmentManager::unlinkAllAttachment($this); $this->beforeArchive(); return true; } return false; } public function getAttachedFilesInfo(): array { $files = []; foreach ($this->attachments as $achievement) { $files[] = [ $achievement, ArrayHelper::getValue($this, 'documentType'), null ]; } return $files; } public static function getDocumentTypePropertyName(): string { return 'documentType'; } public static function getSubdivisionCodePropertyName(): string { return ''; } public static function getIssuedDatePropertyName(): string { return 'date_given'; } 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 'series'; } public static function getDocumentNumberPropertyName(): string { return 'number'; } public function hasBachelorSpecialities(): bool { return $this->getBachelorSpecialities()->exists(); } public function hasEnlistedBachelorSpecialities(): bool { $tn = BachelorSpeciality::tableName(); return $this->getBachelorSpecialities() ->andWhere(["{$tn}.is_enlisted" => true]) ->exists(); } public function getContractor(): ActiveQuery { return $this->hasOne(Contractor::class, ['id' => 'contractor_id']); } public function getSchoolName(): string { return $this->contractor->name ?? ''; } public function beforeSave($insert) { if (!parent::beforeSave($insert)) { return false; } if (!$this->fillDocumentCheckStatusIfNotVerified()) { return false; } return true; } public static function getEducationTypeList(): array { $tnEducationType = EducationType::tableName(); return ArrayHelper::map( EducationType::find() ->notMarkedToDelete() ->active() ->andWhere(["{$tnEducationType}.is_folder" => false]) ->andWhere(["{$tnEducationType}.id" => EducationDataFilter::find()->select('education_type_id')]) ->orderBy("{$tnEducationType}.description") ->all(), 'id', 'description' ); } }