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})"); } }