portal.mkgtu.ru/common/services/abiturientController/bachelor/BachelorService.php

364 lines
11 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\services\abiturientController\bachelor;
use common\components\AttachmentManager;
use common\components\PageRelationManager;
use common\components\RegulationManager;
use common\models\Attachment;
use common\models\attachment\attachmentCollection\ApplicationAttachmentCollection;
use common\models\AttachmentType;
use common\models\errors\RecordNotFound;
use common\models\relation_presenters\comparison\EntitiesComparator;
use common\models\relation_presenters\comparison\results\ComparisonResult;
use common\models\User;
use common\models\UserRegulation;
use common\modules\abiturient\models\bachelor\ApplicationHistory;
use common\modules\abiturient\models\bachelor\BachelorApplication;
use common\modules\abiturient\models\bachelor\BachelorSpeciality;
use common\modules\abiturient\models\drafts\DraftsManager;
use common\modules\abiturient\models\interfaces\IDraftable;
use common\modules\abiturient\models\repositories\FileRepository;
use common\modules\abiturient\models\repositories\RegulationRepository;
use common\modules\abiturient\models\services\NextStepService;
use common\services\abiturientController\BaseService;
use Throwable;
use Yii;
use yii\helpers\ArrayHelper;
use yii\helpers\Url;
class BachelorService extends BaseService
{
public function checkAccessibility(User $currentUser, int $id): void
{
BachelorApplication::checkAccessibility($currentUser, $id);
}
public function getApplication(int $id): BachelorApplication
{
$application = BachelorApplication::findOne($id);
if (!$application) {
throw new RecordNotFound('Заявление не найдено');
}
$application->archiveAdmissionCampaignHandler->handle();
return $application;
}
public function getBachelorSpeciality(int $bachelor_spec_id): BachelorSpeciality
{
$bachelor_spec = BachelorSpeciality::findOne($bachelor_spec_id);
if (!$bachelor_spec) {
throw new RecordNotFound('Направление не найдено');
}
return $bachelor_spec;
}
public function getApplicationComparison(User $currentUser, BachelorApplication $application): ?ComparisonResult
{
$applicationComparison = null;
$actualApplication = $this->getActualApplication($currentUser, $application);
if (
$actualApplication &&
$actualApplication->id != $application->id &&
$application->draft_status != IDraftable::DRAFT_STATUS_APPROVED
) {
$applicationComparison = EntitiesComparator::compare($actualApplication, $application);
};
return $applicationComparison;
}
public function checkIfAbiturientQuestionaryFilled(BachelorApplication $application): bool
{
return !($application->abiturientQuestionary == null || $application->abiturientQuestionary->isNotFilled());
}
public function checkAttachmentFiles(
BachelorApplication $application,
bool $canEdit,
?string $attachmentTypeRelatedEntity = null
): array {
$attachmentErrors = [];
$isAttachmentsAdded = false;
$required_attachments_check = Attachment::getNotFilledRequiredAttachmentTypeIds(
$application->getEduAttachments()->with(['attachmentType'])->all(),
AttachmentType::GetRequiredCommonAttachmentTypeIds($attachmentTypeRelatedEntity, ArrayHelper::getValue($application, 'type.campaign.referenceType.reference_uid'))
);
if ($required_attachments_check && $canEdit) {
$types = AttachmentType::find()->where(['in', 'id', $required_attachments_check])->select(['id', 'name'])->asArray()->all();
$attachmentErrors = ArrayHelper::map($types, 'id', 'name');
} else {
$isAttachmentsAdded = true;
}
return [
'isAttachmentsAdded' => $isAttachmentsAdded,
'attachmentErrors' => $attachmentErrors,
];
}
public function processErrorMessageProcessingSavingAttachment(
Throwable $th,
?string $path = null
): void {
Yii::$app->session->setFlash('alert', [
'body' => Yii::t('abiturient/errors', 'Сообщение поступающему о ошибке сохранения формы скан-копий: `Возникла ошибка сохранения формы. Обратитесь к администратору.`'),
'options' => ['class' => 'alert-danger']
]);
Yii::error("Ошибка обработки формы сохранения скан-копий: {$th->getMessage()} в:" . PHP_EOL . $th->getTraceAsString(), $path);
}
private function getActualApplication(User $currentUser, BachelorApplication $application): ?BachelorApplication
{
$actualApplication = null;
if ($application->draft_status != IDraftable::DRAFT_STATUS_APPROVED) {
$actualApplication = DraftsManager::getActualApplication($currentUser, $application->type);
}
return $actualApplication;
}
protected function getRegulationsAndAttachments(
BachelorApplication $application,
string $relatedEntityTypeAttachments,
string $relatedEntityTypeRegulations
): array {
return [
'attachments' => $this->getAttachmentList($application, $relatedEntityTypeAttachments),
'regulations' => $this->getRegulationList($application, $relatedEntityTypeRegulations),
];
}
protected function postProcessingRegulationsAndAttachments(
BachelorApplication $application,
array $attachments,
array $regulations
): array {
if ($this->updateAttachments($application, $attachments, $regulations)) {
return [
'hasChanges' => true,
'attachments' => $attachments,
'regulations' => $regulations,
];
}
foreach ($regulations as $regulation) {
if (
$regulation->isNewRecord &&
(!(int)$regulation->is_confirmed && (int)$regulation->regulation->confirm_required)
) {
$regulation->addError('is_confirmed', Yii::t(
'abiturient/attachment-widget',
'Подсказка с ошибкой для поля "is_confirmed" на форме виджета сканов: `Необходимо подтвердить прочтение нормативного документа`'
));
}
}
return [
'hasChanges' => false,
'attachments' => $attachments,
'regulations' => $regulations,
];
}
protected function getAttachmentList(BachelorApplication $application, $relatedEntity = null)
{
if ($relatedEntity === null) {
$relatedEntity = PageRelationManager::GetFullRelatedListForApplication();
}
return FileRepository::GetAttachmentCollectionsFromTypes($application, $relatedEntity);
}
private function getRegulationList(BachelorApplication $application, $relatedEntity)
{
$regulations = [];
$existing_regulation = $application->getRegulations($relatedEntity)->all();
$regulation_to_add = RegulationRepository::GetNotExistingRegulationsForEntity($relatedEntity, ArrayHelper::getColumn($existing_regulation, 'regulation_id'));
foreach ($regulation_to_add as $regulation) {
$userRegulation = new UserRegulation();
$userRegulation->regulation_id = $regulation->id;
$userRegulation->application_id = $application->id;
$userRegulation->owner_id = $application->user->id;
$regulations[] = $userRegulation;
}
$regulations = array_merge($regulations, $existing_regulation);
foreach ($regulations as $regulation) {
if ($regulation->regulation->attachment_type && $regulation->getAttachments()->exists()) {
$regulationAttachment = new Attachment();
$regulationAttachment->owner_id = $application->user_id;
$regulationAttachment->attachment_type_id = $regulation->regulation->attachment_type;
$regulation->setRawAttachment($regulationAttachment);
}
}
ArrayHelper::multisort($regulations, 'regulation_id', SORT_ASC, SORT_NUMERIC);
return $regulations;
}
private function updateAttachments(
BachelorApplication $application,
array $attachments,
array $userRegulations,
bool $updateHistory = false,
?int $appHistoryType = null
): bool {
$has_changes = false;
if (RegulationManager::handleRegulations($userRegulations, $this->request)) {
$application->resetStatus();
$has_changes = true;
}
$all_new_attachments = AttachmentManager::handleAttachmentUpload($attachments, $userRegulations);
if ($all_new_attachments) {
$application->resetStatus();
$has_changes = true;
}
if ($updateHistory) {
$relatedEntities = [];
$entitiesToHistory = [];
if ($all_new_attachments && !$appHistoryType) {
$attachmentTypes = AttachmentType::find()
->select(['id', 'related_entity'])
->andWhere([
'id' => ArrayHelper::getColumn($all_new_attachments, 'attachment_type_id'),
'hidden' => false
])
->asArray()
->all();
$relatedEntities = ArrayHelper::map($attachmentTypes, 'id', 'related_entity');
$entitiesToHistory = [
AttachmentType::RELATED_ENTITY_APPLICATION => ApplicationHistory::TYPE_SPECIALITY_CHANGED,
AttachmentType::RELATED_ENTITY_EDUCATION => ApplicationHistory::TYPE_EDUCATION_CHANGED,
AttachmentType::RELATED_ENTITY_EGE => ApplicationHistory::TYPE_EXAM_CHANGED,
];
}
foreach ($all_new_attachments as $attachment) {
if (!empty($entitiesToHistory)) {
$appHistoryType = $entitiesToHistory[$relatedEntities[$attachment->attachment_type_id]] ?? null;
}
if (!is_null($appHistoryType)) {
$application->addApplicationHistory($appHistoryType);
}
}
}
return $has_changes;
}
protected function getNextStep(BachelorApplication $application, string $currentStep): string
{
$next_step_service = new NextStepService($application);
if ($next_step_service->getUseNextStepForwarding()) {
$next_step = $next_step_service->getNextStep($currentStep);
if ($next_step) {
return Url::to($next_step_service->getUrlByStep($next_step));
}
}
return '';
}
}