forked from aslan/applicant-site
211 lines
10 KiB
PHP
211 lines
10 KiB
PHP
<?php
|
|
|
|
namespace App\Http\Controllers\Api;
|
|
|
|
use App\Enums\ExaminationTypeEnum;
|
|
use App\Http\Controllers\Controller;
|
|
use App\Models\Direction;
|
|
use App\Models\EntranceExamination;
|
|
use App\Services\DirectonHtmlBuilder;
|
|
use App\Services\DirectonHtmlBuilderForCalculator;
|
|
use Illuminate\Http\Request;
|
|
|
|
class CalculatorController extends Controller
|
|
{
|
|
public function findDirectionFromSubjects(Request $request)
|
|
{
|
|
$getJSON = $request->input()['predmets'];
|
|
$calcultatorSubjects = json_decode($getJSON);
|
|
|
|
$filteredDirectionIds = EntranceExamination::all()
|
|
->select("direction_id", "subject_id", "subject_type_id", "examination_type_id")
|
|
->where('examination_type_id', '=', ExaminationTypeEnum::Ege->value)
|
|
->reduce(function (array $carry, $examine) {
|
|
|
|
[
|
|
'direction_id' => $direction_id,
|
|
'subject_id' => $subject_id,
|
|
'subject_type_id' => $subject_type_id
|
|
] = $examine;
|
|
|
|
$carry[$direction_id][$subject_type_id][] = $subject_id;
|
|
$carry[$direction_id][$subject_type_id] = array_unique($carry[$direction_id][$subject_type_id]);
|
|
|
|
return $carry;
|
|
}, []);
|
|
$directionIds = collect($filteredDirectionIds)
|
|
->filter(function ($subjectTypes) use ($calcultatorSubjects) {
|
|
$requiredSubjects = $subjectTypes[1];
|
|
return array_reduce($requiredSubjects, function ($acc, $requiredSubjects) use ($calcultatorSubjects) {
|
|
if (!in_array($requiredSubjects, $calcultatorSubjects)) {
|
|
return false;
|
|
}
|
|
return $acc;
|
|
}, true);
|
|
})
|
|
->filter(function ($subjectTypes) use ($calcultatorSubjects) {
|
|
if (array_key_exists(2, $subjectTypes)) {
|
|
$optionalSubjectsInCalculator = collect($subjectTypes[2])
|
|
->filter(fn($optionalSubject) => in_array($optionalSubject, $calcultatorSubjects));
|
|
return $optionalSubjectsInCalculator->count() !== 0;
|
|
}
|
|
return true;
|
|
})
|
|
->map(fn($subjectTypes, $directionId) => $directionId);
|
|
|
|
$directions = Direction::whereIn('id', $directionIds)->get();
|
|
// dd($directionIds);
|
|
$dataToGenerateHTML = $this->getDirectionsToModals($directionIds);
|
|
// dd($dataToGenerateHTML);
|
|
$generateHtml = function ($acc, $direction) {
|
|
$builder = new DirectonHtmlBuilderForCalculator($direction);
|
|
$offCanvasModal = $builder->getHTML();
|
|
// dd($offCanvasModal);
|
|
return "{$acc} <tr class=\"border-bottom border-white my-3\">
|
|
|
|
<td class='w-25 '>
|
|
<a class=\"hover2 \" type=\"button\" data-bs-toggle=\"offcanvas\"
|
|
data-bs-target=\"#calc-{$direction['id']}\" aria-controls=\"offcanvasScrolling\" role=\"button\"
|
|
>
|
|
{$direction['name']}
|
|
</a>
|
|
{$offCanvasModal}
|
|
</td>
|
|
<td class=\"text-end\"> {$direction['cost_paid_place']['очная']}</td>
|
|
<td class=\"text-end\"> {$direction['period']['очная']}</td>
|
|
|
|
</tr>";
|
|
};
|
|
$html = collect($dataToGenerateHTML)->reduce($generateHtml, '');
|
|
|
|
return response()->json(['html' => $html]);
|
|
}
|
|
|
|
public function getDirectionsToModals($directionIds)
|
|
{
|
|
//phpcs:disable
|
|
$directionsGroups = Direction::with(['department'])
|
|
->leftJoin('direction_direction_profile', 'directions.id', '=', 'direction_direction_profile.direction_id')
|
|
->leftJoin('direction_profiles', 'direction_direction_profile.direction_profile_id', '=', 'direction_profiles.id')
|
|
->leftJoin('departments', 'directions.department_id', '=', 'departments.id')
|
|
->leftJoin('faculties', 'departments.faculty_id', '=', 'faculties.id')
|
|
->leftJoin('education_levels', 'directions.education_level_id', '=', 'education_levels.id')
|
|
->leftJoin('education_forms', 'directions.education_form_id', '=', 'education_forms.id')
|
|
->leftJoin('entrance_examinations', 'entrance_examinations.direction_id', '=', 'directions.id')
|
|
->leftJoin('educational_institutions', 'faculties.educational_institution_id', '=', 'educational_institutions.id')
|
|
->leftJoin('examination_types', 'entrance_examinations.examination_type_id', '=', 'examination_types.id')
|
|
->leftJoin('subject_types', 'entrance_examinations.subject_type_id', '=', 'subject_types.id')
|
|
->leftJoin('subjects', 'entrance_examinations.subject_id', '=', 'subjects.id')
|
|
->select([
|
|
'directions.id as direction_id',
|
|
'directions.code as direction_code',
|
|
'directions.name as direction_name',
|
|
'directions.description as direction_description',
|
|
'directions.budget_places as direction_budget_places',
|
|
'directions.paid_places as direction_paid_places',
|
|
'directions.cost_paid_place as direction_cost_paid_place',
|
|
'directions.period as direction_period',
|
|
'education_levels.name as education_level_name',
|
|
'education_forms.name as education_form_name',
|
|
'faculties.id as faculty_id',
|
|
'faculties.name as faculty_name',
|
|
'faculties.description as faculty_description',
|
|
'educational_institutions.id as educational_institution_id',
|
|
'educational_institutions.name as educational_institution_name',
|
|
'direction_profiles.id as direction_profile_id',
|
|
'entrance_examinations.scores as entrance_examination_score',
|
|
'examination_types.name as examination_type_name',
|
|
'subject_types.name as subject_type_name',
|
|
'subjects.name as subject_name',
|
|
'direction_profiles.name as direction_profile_name',
|
|
])
|
|
->whereIn('directions.id', $directionIds)
|
|
->get()->toArray();
|
|
//phpcs:enable
|
|
$branches = [];
|
|
$directionsGroupWithOutBranch = array_reduce($directionsGroups, function ($acc, $direction) use (&$branches) {
|
|
|
|
if ($direction['educational_institution_id'] == 3) {
|
|
$branches[] = $direction;
|
|
}
|
|
$acc[] = $direction;
|
|
return $acc;
|
|
}, []);
|
|
|
|
$groupedDirections = collect($directionsGroupWithOutBranch)
|
|
->reduce(function ($carry, $item) use ($branches) {
|
|
[
|
|
'direction_id' => $directionId,
|
|
'direction_name' => $directionName,
|
|
'direction_code' => $directionCode,
|
|
'educational_institution_id' => $educational_institution_id,
|
|
'educational_institution_name' => $educationalInstitutionName,
|
|
'faculty_id' => $facultyId,
|
|
'faculty_name' => $facultyName,
|
|
'faculty_description' => $facultyDescription,
|
|
'education_level_name' => $educationLevelName,
|
|
'education_form_name' => $educationFormName,
|
|
'entrance_examination_score' => $entranceExaminationScore,
|
|
'examination_type_name' => $examinationTypeName,
|
|
'subject_type_name' => $subjectTypeName,
|
|
'subject_name' => $subjectName,
|
|
'direction_profile_name' => $directionProfileName,
|
|
'direction_budget_places' => $directionBudgetPlaces,
|
|
'direction_paid_places' => $directionPaidPlaces,
|
|
'direction_cost_paid_place' => $directionCostPaidPlace,
|
|
'direction_period' => $directionPeriod,
|
|
'direction_description' => $directionDescription,
|
|
] = $item;
|
|
|
|
// $carry[$facultyName]['id'] = $facultyId;
|
|
// $carry[$facultyName]['name'] = $facultyName;
|
|
// $carry[$facultyName]['description'] = $facultyDescription;
|
|
$carry[$directionName]['name'] = $directionName;
|
|
$carry[$directionName]['id'] = $directionId;
|
|
$carry[$directionName]['code'] = $directionCode;
|
|
$carry[$directionName]['education_level'] = $educationLevelName;
|
|
$carry[$directionName]['education_form'][] = $educationFormName;
|
|
$carry[$directionName]['education_form'] = array_unique(
|
|
$carry[$directionName]['education_form']
|
|
);
|
|
$carry[$directionName]['entrance_examinations']
|
|
[$examinationTypeName][$subjectTypeName][$subjectName] = $entranceExaminationScore;
|
|
$carry[$directionName]['budget_places']
|
|
[$educationalInstitutionName][$directionProfileName][$educationFormName] = $directionBudgetPlaces;
|
|
|
|
|
|
$carry[$directionName]['paid_places']
|
|
[$educationalInstitutionName][$directionProfileName][$educationFormName] = $directionPaidPlaces;
|
|
|
|
/*$carry[$facultyName]['directions'][$directionName]
|
|
['paid_places'][$educationFormName] = $directionPaidPlaces;*/
|
|
|
|
|
|
$carry[$directionName]
|
|
['cost_paid_place'][$educationFormName] = $directionCostPaidPlace;
|
|
$carry[$directionName]['period'][$educationFormName] = $directionPeriod;
|
|
$carry[$directionName]['description'] = $directionDescription;
|
|
|
|
foreach ($branches as $branch) {
|
|
[
|
|
'direction_name' => $directionNameBranch,
|
|
'educational_institution_name' => $educationalInstitutionNameBranch,
|
|
'direction_profile_name' => $directionProfileNameBranch,
|
|
'education_form_name' => $educationFormNameBranch,
|
|
'direction_budget_places' => $directionBudgetPlacesBranch
|
|
] = $branch;
|
|
if ($directionNameBranch === $directionName) {
|
|
$carry[$directionName]['budget_places']
|
|
[$educationalInstitutionNameBranch][$directionProfileNameBranch]
|
|
[$educationFormNameBranch] = $directionBudgetPlacesBranch;
|
|
}
|
|
}
|
|
|
|
|
|
return $carry;
|
|
}, []);
|
|
|
|
return $groupedDirections;
|
|
}
|
|
}
|