==UseCaseRealisations
== ИД 1 ==
Откако корисникот ќе се најави оди да си одбере предмети.
**Студентот клика на "Предмети"**
- GET барање кон `/subjects` рута
- `SubjectController@index()` акција се активира
Си бира година, како и кариерна патека и смер.
**Серверот прикажува листа на сите предмети**
{{{#!php
// SubjectController.php
public function index(Request $request)
{
$subjects = Subject::with('prerequisites')
->orderBy('code')
->paginate(15);
return view('admin.subjects.index', [
'subjects' => $subjects
]);
}
}}}
Откако ќе одбере му дава листа на предмети популирани од база, за неговиот смер и година. Сортирани по зимски и летен семестар.
== ИД 2 ==
**Серверот филтрира по пребарување**
{{{#!php
// SubjectController.php
public function index(Request $request)
{
$query = Subject::query();
// Филтрирање по пребарување
if ($request->filled('search')) {
$search = $request->input('search');
$query->where('code', 'LIKE', "%{$search}%")
->orWhere('name', 'LIKE', "%{$search}%")
->orWhere('name_mk', 'LIKE', "%{$search}%");
}
// Филтрирање по година
if ($request->filled('year')) {
$query->where('year', $request->input('year'));
}
// Филтрирање по семестар
if ($request->filled('semester')) {
$query->where('semester_type', $request->input('semester'));
}
// Филтрирање по тип
if ($request->filled('type')) {
$query->where('subject_type', $request->input('type'));
}
$subjects = $query->with('prerequisites')
->orderBy('code')
->paginate(15);
return view('admin.subjects.index', ['subjects' => $subjects]);
}
}}}
Откако тој ќе си ги пополни си оди директно на Генерирај роадмап копчето.
== ИД 3 ==
1. **Студентот кликне на "Создај мој план/Roadmap"**
- GET барање кон `/roadmap/create`
- `RoadmapController@create()` се активира
Тука е даден целиот опис на академскиот роадмап и кои се препорачани предмети според избирачката (опционално) кариера.
**Серверот враќа форма за креирање**
{{{#!php
// RoadmapController.php
public function create()
{
$studyPrograms = StudyProgram::all();
$careerPaths = CareerPath::all();
return view('roadmap.create', [
'studyPrograms' => $studyPrograms,
'careerPaths' => $careerPaths
]);
}
}}}
**Апликацијата прикажува ЧЕКОР 1: Избор програма и кариера**
{{{#!html
}}}
**JavaScriptAJAX барање за предмети**
{{{#!js
// views/roadmap/create.blade.php
document.getElementById('programSelect').addEventListener('change', function() {
const programId = this.value;
if (!programId) return;
// AJAX fetch за да добиeме предмети од оваа програма
fetch(`/api/study-program/${programId}/subjects`, {
method: 'GET',
headers: {
'Accept': 'application/json'
}
})
.then(response => response.json())
.then(data => {
displaySubjectsByYear(data.subjects);
})
.catch(error => console.error('Error:', error));
});
}}}
**Серверот враќа JSON со предмети**
{{{#!php
// RoadmapController.php
public function getSubjectsByProgram($programId)
{
$program = StudyProgram::findOrFail($programId);
// Вчитај сите предмети од програмата со pivot info
$subjects = $program->subjects()
->with('prerequisites')
->get()
->map(function($subject) {
return [
'id' => $subject->id,
'code' => $subject->code,
'name_mk' => $subject->name_mk,
'name_en' => $subject->name_en,
'year' => $subject->pivot->year,
'semester_type' => $subject->pivot->semester_type,
'type' => $subject->pivot->type,
'credits' => $subject->credits,
'prerequisites' => $subject->prerequisites->pluck('id')
];
});
return response()->json(['subjects' => $subjects]);
}
}}}
\\
**JavaScript приказует ЧЕКОР 2: Избор завршени предмети**
{{{#!js
function displaySubjectsByYear(subjects) {
// Организирај по години
const subjectsByYear = {};
subjects.forEach(subject => {
if (!subjectsByYear[subject.year]) {
subjectsByYear[subject.year] = [];
}
subjectsByYear[subject.year].push(subject);
});
// Креирај HTML за секоја година
let html = '
';
Object.keys(subjectsByYear).sort().forEach(year => {
html += `