portal.mkgtu.ru/common/services/abiturientController/bachelor/accounting_benefits/BenefitsService.php

432 lines
12 KiB
PHP
Executable File
Raw Permalink 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\accounting_benefits;
use common\components\configurationManager;
use common\components\RegulationRelationManager;
use common\models\AttachmentType;
use common\models\dictionary\AdmissionCategory;
use common\models\dictionary\AdmissionProcedure;
use common\models\dictionary\DocumentType;
use common\models\dictionary\Privilege;
use common\models\dictionary\SpecialMark;
use common\models\dictionary\StoredReferenceType\StoredAdmissionCampaignReferenceType;
use common\models\EmptyCheck;
use common\models\User;
use common\modules\abiturient\models\bachelor\BachelorApplication;
use common\modules\abiturient\models\bachelor\BachelorPreferences;
use yii\base\UserException;
use yii\caching\CacheInterface;
use yii\data\ArrayDataProvider;
use yii\helpers\ArrayHelper;
use yii\web\Request;
class BenefitsService extends AccountingBenefitsService
{
public function getPreferenceListForSelect(int $applicationId): array
{
$output = [];
$params = $this->request->post('depdrop_parents');
if (!EmptyCheck::isLoadingStringOrEmpty($params[0])) {
$admissionCategoryId = $params[0];
$admissionCategory = AdmissionCategory::find()
->active()
->andWhere(['id' => $admissionCategoryId])
->limit(1)
->one();
if ($admissionCategory && $admissionCategory->ref_key == $this->configurationManager->getCode('category_specific_law')) {
$application = $this->getApplication($applicationId);
$items = $application->bachelorPreferencesSpecialRight;
$output = $this->makeDataFormattedForDepDrop(
function ($item) {
return [
'id' => ArrayHelper::getValue($item, 'id'),
'name' => ArrayHelper::getValue($item, 'name'),
];
},
$items
);
}
}
return array_values(ArrayHelper::index($output, 'id'));
}
public function __construct(
Request $request,
CacheInterface $cache,
configurationManager $configurationManager
) {
parent::__construct($request, $cache, $configurationManager);
}
public function getDocTypeDataForSelect(?int $app_id = null): array
{
$output = [];
$selected = '';
$application = $this->getApplication($app_id);
if ($this->request->post('depdrop_parents')) {
$params = $this->request->post('depdrop_parents');
if (!EmptyCheck::isLoadingStringOrEmpty($params[0])) {
$pref = BachelorPreferences::getBenefitByHashKey($params[0]);
$col_name = 'special_mark_id';
if ($pref instanceof Privilege) {
$col_name = 'privilege_id';
}
$benefit = BachelorPreferences::findOne(['id_application' => $app_id, $col_name => $pref->id]);
if (isset($benefit)) {
$selected = $benefit->document_type_id;
}
$output = $this->makeDataFormattedForDepDrop(
function ($item) {
return [
'id' => $item['maxid'],
'name' => $item['description']
];
},
$this->getDocTypesByBachelorPreferenceCodeAndBachelorApplication($application, $pref)
);
if ($benefit && $benefit->document_type_id && !array_filter($output, function ($item) use ($benefit) {
return $item['id'] == $benefit->document_type_id;
})) {
$output[] = [
'id' => $benefit->document_type_id,
'name' => DocumentType::find()
->andWhere(['id' => $benefit->document_type_id])
->select('description')
->scalar()
];
}
}
}
return ['output' => $output, 'selected' => $selected];
}
public function getBenefits($id)
{
$application = $this->getApplication($id);
$benefits = $application
->getBachelorPreferencesSpecialRight()
->all();
$dataProvider = new ArrayDataProvider([
'allModels' => $benefits,
'pagination' => ['pageSize' => 10]
]);
return [
'id' => $id,
'model' => $this->initBenefit($application),
'items' => $this->loadBenefitsLists($application),
'canEdit' => ($application->canEdit() && $application->canEditSpecialities()),
'itemsDoc' => $this->getDocumentItems(),
'providers' => $benefits,
'dataProvider' => $dataProvider,
'action' => '/site/accounting-benefits'
];
}
public function getRegulationsAndAttachmentsForPreference(BachelorApplication $application): array
{
return $this->getRegulationsAndAttachments(
$application,
AttachmentType::RELATED_ENTITY_PREFERENCE,
RegulationRelationManager::RELATED_ENTITY_PREFERENCE
);
}
public function editBenefits(User $currentUser): array
{
$formName = (new BachelorPreferences)->formName();
[
'id' => $id,
'appId' => $appId,
'application' => $application,
] = $this->editAccountingBenefits($formName);
$accountingBenefits = $this->getAccountingBenefitsQueryForEditFunction(
$id,
$appId,
BachelorPreferences::class
)
->notInEnlistedApp()
->one();
if (isset($accountingBenefits)) {
return $this->updateBenefitFromPost(
$currentUser,
$application,
$accountingBenefits
);
}
return [null, false, false];
}
public function saveNewBenefits(User $currentUser, ?int $id): array
{
$formName = (new BachelorPreferences)->formName();
$application = $this->saveNewAccountingBenefits($id, $formName);
$newAccountingBenefits = $this->initBenefit($application);
return $this->updateBenefitFromPost(
$currentUser,
$application,
$newAccountingBenefits
);
}
public function downloadBenefits(User $currentUser, ?int $id): array
{
return $this->generateFilesToDownloadAccountingBenefits(
$currentUser,
$id,
BachelorPreferences::class,
function ($benefit, $_) {
return "{$benefit->getDescription()} ({$benefit->document_series} {$benefit->document_number}).zip";
},
'Не удалось найти льготу или преимущественное право.'
);
}
public function canDownloadBenefits(?int $id = null): bool
{
return $this->canGenerateFilesToDownloadAccountingBenefits($id, BachelorPreferences::class);
}
public function updateBenefitFromPost(
User $currentUser,
BachelorApplication $application,
BachelorPreferences $model
): array {
return $this->updateAccountingBenefitsFromPost(
$currentUser,
$application,
$model,
function ($model) {
$model->olympiad_code = null;
$model->olympiad_id = null;
$model->document_type = ArrayHelper::getValue($model, 'documentType.code');
$model->special_mark_code = ArrayHelper::getValue($model, 'specialMark.code');
$model->privilege_code = ArrayHelper::getValue($model, 'privilege.code');
$model->document_type = ArrayHelper::getValue($model, 'documentType.code');
return $model;
},
'Ошибка при редактировании льгот:'
);
}
public function archiveBenefits(?int $id, User $currentUser, bool $updateApplicationHistory = true): void
{
$this->archiveAccountingBenefit(
$id,
$currentUser,
BachelorPreferences::class,
'Невозможно удалить файл льготы или преимущественного права.',
'Невозможно удалить льготу или преимущественное право.',
$updateApplicationHistory
);
}
protected function initBenefit(BachelorApplication $application): BachelorPreferences
{
return $this->initBachelorPreferences($application, BachelorPreferences::TYPE_PREF);
}
private function loadBenefitsLists(BachelorApplication $application): array
{
$items = [];
$dictionaryBenefitsLists = [
'privilege' => Privilege::class,
'specialMark' => SpecialMark::class,
];
$application->archiveAdmissionCampaignHandler->handle();
foreach ($dictionaryBenefitsLists as $innerJoinTable => $class) {
$items = array_merge(
$items,
$this->getPrivilegeOrSpecialMarkDictionaryDatas($application, $class, $innerJoinTable)
);
}
return $items;
}
private function getPrivilegeOrSpecialMarkDictionaryDatas(
$application,
$class,
$innerJoinTable
): array {
BenefitsService::checkIsCorrectDictionaryBenefitsClass($class);
$items = [];
$tnClass = $class::tableName();
$tnAdmissionProcedure = AdmissionProcedure::tableName();
$tnAdmissionCampaignReferenceType = StoredAdmissionCampaignReferenceType::tableName();
$campaignReferenceUid = $application->type->rawCampaign->referenceType->reference_uid;
$subQuery = $application
->getPreferences()
->innerJoinWith([$innerJoinTable => function ($q) {
$q->innerJoinWith('admissionProcedures', false);
}])
->select("{$tnClass}.id");
$result = $class::find()
->notMarkedToDelete()
->active()
->joinWith('admissionProcedures', false)
->joinWith('admissionProcedures.admissionCampaignRef', false)
->andWhere(["{$tnClass}.is_folder" => false])
->andWhere(["{$tnClass}.archive" => false])
->andWhere(["{$tnAdmissionProcedure}.archive" => false])
->andWhere(["{$tnAdmissionCampaignReferenceType}.reference_uid" => $campaignReferenceUid])
->orFilterWhere(["{$tnClass}.id" => $subQuery])
->orderBy("{$tnClass}.description")
->all();
foreach ($result as $value) {
$items[$value->getHashCode()] = $value->description;
}
return $items;
}
private static function checkIsCorrectDictionaryBenefitsClass(string $benefitsClass): bool
{
$correctBenefitsClasses = [
Privilege::class,
SpecialMark::class,
];
if (in_array(
$benefitsClass,
$correctBenefitsClasses
)) {
return true;
}
throw new UserException("Был передан класс не относящийся к категории «Льгот и преимущественного права» ({$benefitsClass})");
}
}