portal.mkgtu.ru/common/modules/abiturient/models/parentData/ParentData.php

348 lines
10 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\modules\abiturient\models\parentData;
use common\components\ErrorMessageAnalyzer;
use common\components\ReferenceTypeManager\ReferenceTypeManager;
use common\components\soapException;
use common\components\UserReferenceTypeManager\UserReferenceTypeManager;
use common\models\dictionary\FamilyType;
use common\models\dictionary\StoredReferenceType\StoredUserReferenceType;
use common\models\EntityForDuplicatesFind;
use common\models\errors\RecordNotValid;
use common\models\interfaces\ArchiveModelInterface;
use common\models\relation_presenters\comparison\interfaces\IHaveIdentityProp;
use common\models\relation_presenters\comparison\interfaces\IHaveVirtualPropsToCompare;
use common\models\relation_presenters\OneToOneRelationPresenter;
use common\models\traits\ArchiveTrait;
use common\models\traits\HtmlPropsEncoder;
use common\modules\abiturient\models\AbiturientQuestionary;
use common\modules\abiturient\models\bachelor\changeHistory\ChangeHistoryClasses;
use common\modules\abiturient\models\bachelor\changeHistory\ChangeHistoryDecoratedModel;
use common\modules\abiturient\models\bachelor\changeHistory\interfaces\ChangeLoggedModelInterface;
use common\modules\abiturient\models\drafts\IHasRelations;
use common\modules\abiturient\models\interfaces\ICanBeStringified;
use common\modules\abiturient\models\interfaces\QuestionaryConnectedInterface;
use Throwable;
use Yii;
use yii\base\UserException;
use yii\helpers\ArrayHelper;
class ParentData extends ChangeHistoryDecoratedModel implements
QuestionaryConnectedInterface,
ArchiveModelInterface,
ChangeLoggedModelInterface,
IHasRelations,
IHaveIdentityProp,
IHaveVirtualPropsToCompare,
ICanBeStringified
{
use ArchiveTrait;
use HtmlPropsEncoder;
public static function tableName()
{
return '{{%parent_data}}';
}
public function rules()
{
return [
[
['archived_at'],
'integer'
],
[
[
'questionary_id',
'type_id'
],
'required'
],
[
[
'questionary_id',
'personal_data_id',
'passport_data_id',
'address_data_id',
'type_id',
'created_at',
'updated_at'
],
'integer'
],
[
['archive'],
'boolean'
],
[
['archive'],
'default',
'value' => false
],
[
[
'code',
'email'
],
'string',
'max' => 255
],
[
['questionary_id'],
'exist',
'skipOnError' => true,
'targetClass' => AbiturientQuestionary::class,
'targetAttribute' => ['questionary_id' => 'id']
],
[
['address_data_id'],
'exist',
'skipOnError' => true,
'targetClass' => ParentAddressData::class,
'targetAttribute' => ['address_data_id' => 'id']
],
[
['type_id'],
'exist',
'skipOnError' => true,
'targetClass' => FamilyType::class,
'targetAttribute' => ['type_id' => 'id']
],
[
['passport_data_id'],
'exist',
'skipOnError' => true,
'targetClass' => ParentPassportData::class,
'targetAttribute' => ['passport_data_id' => 'id']
],
[
['personal_data_id'],
'exist',
'skipOnError' => true,
'targetClass' => ParentPersonalData::class,
'targetAttribute' => ['personal_data_id' => 'id']
],
];
}
public function attributeLabels()
{
return [
'type_id' => Yii::t('abiturient/questionary/parent-data', 'Подпись для поля "type_id" формы "Родитель": `Степень родства`'),
'typeName' => Yii::t('abiturient/questionary/parent-data', 'Подпись для поля "typeName" формы "Родитель": `Степень родства`'),
'email' => Yii::t('abiturient/questionary/parent-data', 'Подпись для поля "email" формы "Родитель": `Электронная почта`'),
];
}
public function behaviors()
{
return [
\yii\behaviors\TimestampBehavior::class,
];
}
public function getAddressData()
{
return $this->hasOne(ParentAddressData::class, ['id' => 'address_data_id']);
}
public function getPassportData()
{
return $this->hasOne(ParentPassportData::class, ['id' => 'passport_data_id']);
}
public function getPersonalData()
{
return $this->hasOne(ParentPersonalData::class, ['id' => 'personal_data_id']);
}
public function getAbiturientQuestionary()
{
return $this->hasOne(AbiturientQuestionary::class, ['id' => 'questionary_id']);
}
public function getType()
{
return $this->hasOne(FamilyType::class, ['id' => 'type_id']);
}
public function getParentRef()
{
if (!$this->parent_ref_id && $this->code) {
$userReference = UserReferenceTypeManager::getUserReferenceFrom1CByGuid($this->code);
if (isset($userReference)) {
$this->parent_ref_id = $userReference->id;
$this->save(true, ['parent_ref_id']);
}
}
return $this->hasOne(StoredUserReferenceType::class, ['id' => 'parent_ref_id']);
}
public static function checkInterfaceVersion(string $method_name): void
{
$valid = false;
try {
$result = \Yii::$app->dictionaryManager->GetInterfaceVersion($method_name);
$valid = version_compare($result, '0.0.18.8') >= 0;
} catch (Throwable $e) {
\Yii::error("Не удалось получить версию метода {$method_name}: {$e->getMessage()}");
$valid = false;
}
if (!$valid) {
throw new UserException("Для корректной работы блока родителей необходимо установить все доступные патчи для 1С:Университет ПРОФ");
}
}
public function stringify(): string
{
$firstname = ArrayHelper::getValue($this, 'personalData.firstname');
$middlename = ArrayHelper::getValue($this, 'personalData.middlename');
$lastname = ArrayHelper::getValue($this, 'personalData.lastname');
$passportSeries = ArrayHelper::getValue($this, 'passportData.series');
$passportNumber = ArrayHelper::getValue($this, 'passportData.number');
return "$lastname $firstname $middlename ($passportSeries $passportNumber)";
}
public function getChangeLoggedAttributes()
{
return [
'email',
'type_id' => function ($model) {
return ArrayHelper::getValue($model, 'type.name');
}
];
}
public function getClassTypeForChangeHistory(): int
{
return ChangeHistoryClasses::CLASS_PARENT_DATA;
}
public function getRelationsInfo(): array
{
return [
new OneToOneRelationPresenter('addressData', [
'parent_instance' => $this,
'child_class' => ParentAddressData::class,
'parent_column_name' => 'address_data_id',
'child_column_name' => 'id',
]),
new OneToOneRelationPresenter('passportData', [
'parent_instance' => $this,
'child_class' => ParentPassportData::class,
'parent_column_name' => 'passport_data_id',
'child_column_name' => 'id',
]),
new OneToOneRelationPresenter('personalData', [
'parent_instance' => $this,
'child_class' => ParentPersonalData::class,
'parent_column_name' => 'personal_data_id',
'child_column_name' => 'id',
]),
];
}
public function getIdentityString(): string
{
$fio = ArrayHelper::getValue($this, 'personalData.fullName');
$type = ArrayHelper::getValue($this, 'type.uid');
$personalData = $this->personalData ? $this->personalData->getIdentityString() : '';
$passportData = $this->passportData ? $this->passportData->getIdentityString() : '';
$addressData = $this->addressData ? $this->addressData->getIdentityString() : '';
return "{$type}_{$fio}_{$personalData}_{$passportData}_{$addressData}";
}
public function getVirtualProps(): array
{
return [
'typeName' => function (ParentData $model) {
return ArrayHelper::getValue($model, 'type.name');
}
];
}
public function getEntityForDuplicatesFind(): EntityForDuplicatesFind
{
$passport = ArrayHelper::getValue($this, 'passportData', null);
$passport_data = [];
if ($passport) {
$passport_data[] = [
'type' => $passport->documentType,
'number' => (string)$passport->number,
'series' => (string)$passport->series,
];
}
return new EntityForDuplicatesFind(
(string)ArrayHelper::getValue($this, 'personalData.firstname'),
(string)ArrayHelper::getValue($this, 'personalData.lastname'),
(string)ArrayHelper::getValue($this, 'personalData.middlename'),
(string)ArrayHelper::getValue($this, 'personalData.formated_birthdate'),
(string)ArrayHelper::getValue($this, 'personalData.snils'),
$passport_data
);
}
}