portal.mkgtu.ru/common/models/traits/DocumentCheckStatusTrait.php

199 lines
5.0 KiB
PHP
Raw Permalink Normal View History

2024-03-28 09:51:45 +03:00
<?php
namespace common\models\traits;
use common\components\ReferenceTypeManager\ReferenceTypeManager;
use common\models\Attachment;
use common\models\dictionary\StoredReferenceType\StoredDocumentCheckStatusReferenceType;
use common\models\interfaces\AttachmentLinkableEntity;
use Yii;
use yii\base\UserException;
use yii\db\ActiveQuery;
use yii\helpers\ArrayHelper;
trait DocumentCheckStatusTrait
{
public function getDocumentCheckStatusRefType(): ActiveQuery
{
return $this->hasOne(StoredDocumentCheckStatusReferenceType::class, ['id' => 'document_check_status_ref_id']);
}
public function getDocumentCheckStatus(): string
{
$documentCheckStatusRefType = $this->documentCheckStatusRefType;
return $documentCheckStatusRefType ? $documentCheckStatusRefType->humanReadableName : '';
}
public function getDocumentCheckStatusIcon(string $text = ''): string
{
$documentCheckStatusRefType = $this->documentCheckStatusRefType;
return $documentCheckStatusRefType ? $documentCheckStatusRefType->getIcon($text) : '';
}
public function fillDocumentCheckStatusIfNotVerified(): bool
{
if ($this->document_check_status_ref_id) {
return true;
}
$this->setDocumentCheckStatusNotVerified();
return true;
}
public function setDocumentCheckStatusNotVerified(): void
{
$notVerifiedStatusDocumentCheck = $this->getNotVerifiedStatusDocumentChecker();
if ($notVerifiedStatusDocumentCheck) {
$this->document_check_status_ref_id = $notVerifiedStatusDocumentCheck->id;
}
}
public function getNotVerifiedStatusDocumentChecker(): ?StoredDocumentCheckStatusReferenceType
{
return StoredDocumentCheckStatusReferenceType::findOne([
'id' => Yii::$app->configurationManager->getCode('not_verified_status_document_checker')
]);
}
public function buildAttachmentHash(): array
{
if (!$this instanceof AttachmentLinkableEntity) {
return [];
}
$attachments = $this->getAttachments()->all();
$attachedFileHashList = [];
foreach ($attachments as $attachment) {
if ($linkedFile = $attachment->linkedFile) {
$attachedFileHashList[] = $linkedFile->real_file_name;
}
}
return $attachedFileHashList;
}
public function checkIfDocumentIsChanged(array $attachedFileHashList, bool $checkAttachments = true): bool
{
if ($this->read_only || $this->isNewRecord) {
return true;
}
$notVerifiedStatusDocumentCheck = $this->getNotVerifiedStatusDocumentChecker();
if (
$notVerifiedStatusDocumentCheck &&
$this->document_check_status_ref_id == $notVerifiedStatusDocumentCheck->id
) {
return true;
}
$existAttachedFileHashList = [];
if ($checkAttachments) {
$existAttachedFileHashList = $this->buildAttachmentHash();
if (count($existAttachedFileHashList) != count($attachedFileHashList)) {
return false;
}
}
$attributes = $this->getAttributes();
unset($attributes['updated_at']);
$oldAttributes = $this->getOldAttributes();
unset($oldAttributes['updated_at']);
$diff = array_merge(
array_diff($attributes, $oldAttributes),
array_diff($oldAttributes, $attributes),
array_diff($existAttachedFileHashList, $attachedFileHashList),
array_diff($attachedFileHashList, $existAttachedFileHashList),
);
if (count($diff) > 0) {
return false;
}
return true;
}
public function convertFlagAccordingDocumentStatus(bool $externalFlagAllowsSomething = true): bool
{
return $externalFlagAllowsSomething && !$this->read_only;
}
public function buildDocumentCheckStatusRefType()
{
$notVerifiedStatusDocumentChecker = ArrayHelper::getValue($this, 'notVerifiedStatusDocumentChecker');
$documentCheckStatusRefType = ArrayHelper::getValue($this, 'documentCheckStatusRefType') ?? $notVerifiedStatusDocumentChecker;
if (!$documentCheckStatusRefType) {
throw new UserException('Не удалось собрать структуру статуса документа.');
}
return ReferenceTypeManager::GetReference($documentCheckStatusRefType);
}
public function setDocumentCheckStatusFrom1CData(array $rawDocumentCheckStatus): void
{
if (!$rawDocumentCheckStatus) {
return;
}
$documentCheckStatusRef = ReferenceTypeManager::GetOrCreateReference(
StoredDocumentCheckStatusReferenceType::class,
$rawDocumentCheckStatus
);
if (!$documentCheckStatusRef) {
return;
}
$this->document_check_status_ref_id = $documentCheckStatusRef->id;
}
}