request->post('depdrop_parents'); if (!empty($params) && isset($params[0]) && filter_var($params[0], FILTER_VALIDATE_BOOLEAN)) { $tnBachelorSpeciality = BachelorSpeciality::tableName(); $application = $this->getApplication($applicationId); $speciality = $application->getSpecialitiesWithoutOrdering() ->andWhere(["{$tnBachelorSpeciality}.id" => $specialityId]) ->one(); $items = $application ->getBachelorPreferencesOlympForBVI() ->with(['olympiad']) ->all(); $output = $this->makeDataFormattedForDepDrop( function ($item) use ($speciality) { $matched = $item->olympiadMatchedByCurriculum(ArrayHelper::getValue($speciality, 'speciality.curriculumRef')); $tmp = [ 'id' => ArrayHelper::getValue($item, 'id'), 'name' => ArrayHelper::getValue($item, 'name'), ]; if (!$matched) { $tmp['options'] = ['data-not-matched-curriculum' => 1]; } return $tmp; }, $items ); } return array_values(ArrayHelper::index($output, 'id')); } public function __construct( Request $request, CacheInterface $cache, configurationManager $configurationManager ) { parent::__construct($request, $cache, $configurationManager); } public function getOlympTypeDataForSelect(?int $app_id, ?int $id = null): array { $output = []; $selected = ''; $application = $this->getApplication($app_id); if (!isset($_POST['depdrop_parents'])) { return ['output' => $output, 'selected' => $selected]; } $params = $_POST['depdrop_parents']; if (EmptyCheck::isLoadingStringOrEmpty($params[0])) { return ['output' => $output, 'selected' => $selected]; } $olympic = null; $selected = ''; if ($id) { $olympic = BachelorPreferences::findOne(['id_application' => $app_id, 'id' => $id]); } if (isset($olympic)) { $selected = $olympic->special_mark_id; } $output = $this->getCachedOlympSpecialMarks($application, $params[0]); return ['output' => $output, 'selected' => $selected]; } public function getDocTypeOlympiadsDataForSelect(?int $app_id = null): array { $output = []; $selected = ''; $application = $this->getApplication($app_id); if ($this->request->post('depdrop_parents')) { $params = $this->request->post('depdrop_parents'); $specMark = null; $benefit = null; if (!EmptyCheck::isLoadingStringOrEmpty($params[0])) { $specMark = SpecialMark::findOne((int)$params[0]); $benefit = BachelorPreferences::findOne([ 'id_application' => $app_id, 'special_mark_id' => $specMark->id ]); if (isset($benefit)) { $selected = $benefit->document_type_id; } } $output = $this->makeDataFormattedForDepDrop( function ($item) { return [ 'id' => $item['maxid'], 'name' => $item['description'] ]; }, $this->getDocTypesByBachelorPreferenceCodeAndBachelorApplication($application, $specMark) ); if (!is_null($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 getOlympiads(?int $id) { $application = $this->getApplication($id); $model = $this->initOlympiad($application); $campaign_ref_uid = $application->type->rawCampaign->referenceType->reference_uid; $items = $this->cache->getOrSet( "olympiadArray{$campaign_ref_uid}", function () use ($campaign_ref_uid) { return $this->getOlympiadsForCache($campaign_ref_uid); }, 3600 ); $itemsOlymp = array_reduce($this->getCachedOlympSpecialMarks($application), function ($carry, array $item) { $carry[$item['id']] = $item['name']; return $carry; }, []); $itemsDoc = $this->getDocumentItems(); $olympiads = $application ->getBachelorPreferencesOlymp() ->all(); $dataProvider = new ArrayDataProvider([ 'allModels' => $olympiads, 'pagination' => ['pageSize' => 10] ]); $canEdit = ($application->canEdit() && $application->canEditSpecialities()); return [ 'id' => $id, 'model' => $model, 'items' => $items, 'canEdit' => $canEdit, 'itemsDoc' => $itemsDoc, 'providers' => $olympiads, 'itemsOlymp' => $itemsOlymp, 'dataProvider' => $dataProvider, 'action' => '/site/accounting-olympiads' ]; } public function getRegulationsAndAttachmentsForOlympiad(BachelorApplication $application): array { return $this->getRegulationsAndAttachments( $application, AttachmentType::RELATED_ENTITY_OLYMPIAD, RegulationRelationManager::RELATED_ENTITY_OLYMPIAD ); } public function editOlympiads(User $currentUser): array { $formName = (new BachelorPreferences)->formName(); [ 'id' => $id, 'appId' => $appId, 'application' => $application, ] = $this->editAccountingBenefits($formName); $accountingBenefits = $this->getAccountingBenefitsQueryForEditFunction( $id, $appId, BachelorPreferences::class ) ->notInEnlistedAppWithOlympiad() ->one(); if (isset($accountingBenefits)) { return $this->updateOlympicFromPost( $currentUser, $application, $accountingBenefits ); } return [null, false, false]; } public function saveNewOlympiads(User $currentUser, ?int $id): array { $formName = (new BachelorPreferences)->formName(); $application = $this->saveNewAccountingBenefits($id, $formName); $newAccountingBenefits = $this->initOlympiad($application); return $this->updateOlympicFromPost( $currentUser, $application, $newAccountingBenefits ); } public function canDownloadOlympiads(?int $id = null): bool { return $this->canGenerateFilesToDownloadAccountingBenefits($id, BachelorPreferences::class); } public function updateOlympicFromPost( User $currentUser, BachelorApplication $application, BachelorPreferences $model ): array { return $this->updateAccountingBenefitsFromPost( $currentUser, $application, $model, function ($model) { $model->privilege_code = null; $model->privilege_id = null; $model->priority_right = false; $model->individual_value = false; $model->special_mark_code = ArrayHelper::getValue($model, 'specialMark.code'); $model->olympiad_code = ArrayHelper::getValue($model, 'olympiad.code'); $model->document_type = ArrayHelper::getValue($model, 'documentType.code'); return $model; }, 'Ошибка при редактировании олимпиад:' ); } public function getFilterOlympiadsForCache( string $year, string $profile_uid, string $campaign_ref_uid, string $class_uid, string $kind_name ): string { $query = Olympiad::find() ->joinWith('olympiadFilters olympiad_filters', false) ->leftJoin(StoredAdmissionCampaignReferenceType::tableName() . ' campaign_ref', 'campaign_ref.id = olympiad_filters.campaign_ref_id') ->andWhere(['campaign_ref.reference_uid' => $campaign_ref_uid]) ->andWhere(['dictionary_olympiads.archive' => false]) ->andWhere(['olympiad_filters.archive' => false]); if ($kind_name) { $query->joinWith(['olympicKindRef olympic_kind_ref']) ->andWhere(['olympic_kind_ref.reference_name' => $kind_name]); } if ($class_uid) { $query->joinWith(['olympicClassRef olympic_class_ref']) ->andWhere(['olympic_class_ref.reference_uid' => $class_uid]); } if ($profile_uid) { $query->joinWith(['olympicProfileRef olympic_profile_ref']) ->andWhere(['olympic_profile_ref.reference_uid' => $profile_uid]); } if ($year) { $query->andWhere(['dictionary_olympiads.year' => $year]); } $output = $this->makeDataFormattedForDepDrop( function ($o) { return [ 'id' => $o->id, 'name' => $o->getFullName() ]; }, $query->all() ); return json_encode(['output' => $output, 'selected' => '']); } protected function initOlympiad(BachelorApplication $application): BachelorPreferences { return $this->initBachelorPreferences($application, BachelorPreferences::TYPE_OLYMP); } private function getOlympiadsForCache(string $campaignRefUid): array { $items = []; $olympiadArray = Olympiad::find() ->where([ Olympiad::tableName() . '.id' => Olympiad::find() ->select([Olympiad::tableName() . '.id']) ->joinWith('olympiadFilters', false) ->joinWith('olympiadFilters.campaignRef', false) ->andWhere([StoredAdmissionCampaignReferenceType::tableName() . '.reference_uid' => $campaignRefUid]) ->andWhere(['dictionary_olympiads.archive' => false]) ->andWhere([StoredAdmissionCampaignReferenceType::tableName() . '.archive' => false]) ->groupBy([Olympiad::tableName() . '.id']) ]) ->all(); foreach ($olympiadArray as $value) { $items[$value->id] = $value->fullName; } return $items; } private function getOlympSpecialMarksForCache(int $olympiadId = null, string $campaignRefUid): array { $possible_special_mark_ids = OlympiadFilter::find() ->select('special_mark_id') ->joinWith('campaignRef') ->andWhere([StoredAdmissionCampaignReferenceType::tableName() . '.archive' => false]) ->andWhere([StoredAdmissionCampaignReferenceType::tableName() . '.reference_uid' => $campaignRefUid]) ->andFilterWhere([OlympiadFilter::tableName() . '.olympiad_id' => $olympiadId]) ->andWhere([OlympiadFilter::tableName() . '.variant_of_retest_ref_id' => $this->configurationManager->getCode('without_entrant_tests_variant')]); $tnSpecialMark = SpecialMark::tableName(); $result_query = SpecialMark::find() ->notMarkedToDelete() ->active() ->select(['maxid' => 'max(id)', 'code', 'description']) ->andWhere(["{$tnSpecialMark}.id" => $possible_special_mark_ids]) ->andWhere(["{$tnSpecialMark}.archive" => false]) ->groupBy(['code', 'description']); if (!$result_query->exists()) { $result_query = SpecialMark::find() ->notMarkedToDelete() ->active() ->select(['maxid' => 'max(id)', 'code', 'description']) ->andWhere(["{$tnSpecialMark}.archive" => false]) ->groupBy(['code', 'description']); } $output = $this->makeDataFormattedForDepDrop( function (array $value) { return [ 'id' => $value['maxid'], 'name' => $value['description'] ]; }, $result_query ->asArray() ->orderBy("{$tnSpecialMark}.description") ->all() ); return $output; } private function getCachedOlympSpecialMarks(BachelorApplication $application, int $olympiad_id = null): array { $campaign_ref_uid = $application->type->rawCampaign->referenceType->reference_uid; return $this->cache->getOrSet( "getOlympSpecialMarks{$campaign_ref_uid}{$olympiad_id}", function () use ($olympiad_id, $campaign_ref_uid) { return $this->getOlympSpecialMarksForCache($olympiad_id, $campaign_ref_uid); }, 3600 ); } }