1026 lines
34 KiB
PHP
Executable File
1026 lines
34 KiB
PHP
Executable File
<?php
|
||
|
||
namespace common\modules\abiturient\models\bachelor;
|
||
|
||
use common\components\AfterValidateHandler\LoggingAfterValidateHandler;
|
||
use common\components\ApplicationSendHandler\FullPacketSendHandler\SerializersForOneS\ContractorPackageBuilder;
|
||
use common\components\AttachmentManager;
|
||
use common\components\queries\EnlistedApplicationQuery;
|
||
use common\components\ReferenceTypeManager\ContractorManager;
|
||
use common\components\ReferenceTypeManager\exceptions\ReferenceManagerCannotSerializeDataException;
|
||
use common\components\ReferenceTypeManager\exceptions\ReferenceManagerValidationException;
|
||
use common\components\ReferenceTypeManager\exceptions\ReferenceManagerWrongReferenceTypeClassException;
|
||
use common\components\ReferenceTypeManager\ReferenceTypeManager;
|
||
use common\components\validation_rules_providers\RulesProviderByDocumentType;
|
||
use common\models\Attachment;
|
||
use common\models\attachment\attachmentCollection\AttachedEntityAttachmentCollection;
|
||
use common\models\AttachmentType;
|
||
use common\models\dictionary\Contractor;
|
||
use common\models\dictionary\DocumentType;
|
||
use common\models\dictionary\EducationDataFilter;
|
||
use common\models\dictionary\EducationType;
|
||
use common\models\dictionary\StoredReferenceType\StoredDocumentCheckStatusReferenceType;
|
||
use common\models\dictionary\StoredReferenceType\StoredEducationLevelReferenceType;
|
||
use common\models\dictionary\StoredReferenceType\StoredEducationReferenceType;
|
||
use common\models\dictionary\StoredReferenceType\StoredProfileReferenceType;
|
||
use common\models\EmptyCheck;
|
||
use common\models\errors\RecordNotValid;
|
||
use common\models\interfaces\ArchiveModelInterface;
|
||
use common\models\interfaces\AttachmentLinkableEntity;
|
||
use common\models\interfaces\dynamic_validation_rules\IHavePropsRelatedToDocumentType;
|
||
use common\models\interfaces\IHaveDocumentCheckStatus;
|
||
use common\models\interfaces\IHaveIgnoredOnCopyingAttributes;
|
||
use common\models\relation_presenters\AttachmentsRelationPresenter;
|
||
use common\models\relation_presenters\comparison\interfaces\ICanGivePropsToCompare;
|
||
use common\models\relation_presenters\comparison\interfaces\IHaveIdentityProp;
|
||
use common\models\traits\ArchiveTrait;
|
||
use common\models\traits\DocumentCheckStatusTrait;
|
||
use common\models\traits\EnlistedApplicationQueryTrait;
|
||
use common\models\traits\FileAttachTrait;
|
||
use common\models\traits\HasDirtyAttributesTrait;
|
||
use common\models\traits\HtmlPropsEncoder;
|
||
use common\models\User;
|
||
use common\modules\abiturient\models\bachelor\changeHistory\ChangeHistoryClasses;
|
||
use common\modules\abiturient\models\bachelor\changeHistory\ChangeHistoryDecoratedModel;
|
||
use common\modules\abiturient\models\drafts\DraftsManager;
|
||
use common\modules\abiturient\models\drafts\IHasRelations;
|
||
use common\modules\abiturient\models\interfaces\ApplicationConnectedInterface;
|
||
use common\modules\abiturient\models\interfaces\ICanAttachFile;
|
||
use common\modules\abiturient\models\interfaces\ICanBeStringified;
|
||
use stdClass;
|
||
use Yii;
|
||
use yii\behaviors\TimestampBehavior;
|
||
use yii\db\ActiveQuery;
|
||
use yii\db\TableSchema;
|
||
use yii\helpers\ArrayHelper;
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
class EducationData extends ChangeHistoryDecoratedModel implements
|
||
ApplicationConnectedInterface,
|
||
ArchiveModelInterface,
|
||
IHaveIdentityProp,
|
||
ICanGivePropsToCompare,
|
||
IHaveIgnoredOnCopyingAttributes,
|
||
AttachmentLinkableEntity,
|
||
ICanAttachFile,
|
||
IHasRelations,
|
||
IHavePropsRelatedToDocumentType,
|
||
IHaveDocumentCheckStatus,
|
||
ICanBeStringified
|
||
{
|
||
use ArchiveTrait;
|
||
use DocumentCheckStatusTrait;
|
||
use EnlistedApplicationQueryTrait;
|
||
use FileAttachTrait;
|
||
use HasDirtyAttributesTrait;
|
||
use HtmlPropsEncoder;
|
||
|
||
const EMPTY_DATE = '0001-01-01';
|
||
|
||
const SCENARIO_CONTRACTOR_MAY_NOT_BE_FOUND = 'contractor_may_not_be_found';
|
||
|
||
public $tmp_uuid;
|
||
|
||
public $notFoundContractor;
|
||
|
||
protected bool $_new_record = true;
|
||
|
||
protected ?RulesProviderByDocumentType $_document_type_validation_extender = null;
|
||
|
||
public function __construct($config = [])
|
||
{
|
||
parent::__construct($config);
|
||
$this->_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'
|
||
);
|
||
}
|
||
}
|