== SouceVersionControlOrganizationRevised За Контрола на верзиите на изворниот код користевме Github. Работевме на еден branch. == Структура == roadmap_finki/ ├── app/ # PHP/Laravel код ├── resources/ # Frontend (Blade templates) ├── database/ # Миграции и seeders ├── routes/ # Рутирање ├── bootstrap/ # Иницијализација ├── config/ # Конфигурација ├── storage/ # Датотеки и логови ├── tests/ # Тестирање ├── public/ # Јавни датотеки (CSS, JS, слики) └── vendor/ # Зависности (Composer) == Модели == Models/ ├── User.php # Кориснички профил │ ├── relationships: │ │ └── progress() # HasMany → UserProgress │ └── methods: │ └── role(), isAdmin() │ ├── UserProgress.php # Напредок на корисник (завршени/во прогрес предмети) │ ├── fillable: │ │ ├── user_id │ │ ├── subject_id │ │ ├── study_program_id │ │ ├── career_path_id │ │ ├── status # 'completed' | 'in_progress' │ │ └── completed_at │ └── relationships: │ ├── user() # BelongsTo │ ├── subject() # BelongsTo │ ├── studyProgram() # BelongsTo │ └── careerPath() # BelongsTo │ ├── Subject.php # Предмет/Курс │ ├── attributes: │ │ ├── code # Уникален код (F23L3W004) │ │ ├── name # Англиско име │ │ ├── name_mk # Македонско име │ │ ├── year # 1-4 година │ │ ├── semester_type # 'winter' | 'summer' │ │ ├── subject_type # 'mandatory' | 'elective' │ │ ├── credits # ECTS кредити │ │ └── description, instructors, hours │ ├── relationships: │ │ ├── prerequisites() # BelongsToMany (self-referencing) │ │ ├── requiredBy() # BelongsToMany (inverse) │ │ ├── studyPrograms() # BelongsToMany │ │ ├── careerPaths() # BelongsToMany │ │ └── userProgress() # HasMany │ └── methods: │ ├── getSemesterTypeFromCode() # Извлече W/S од код │ ├── hasPrerequisitesMet() # Проверка на предуслови │ └── getDisplayName() # "CODE - NAME" │ ├── StudyProgram.php # Студиска програма (Computer Science 4-year) │ ├── attributes: │ │ ├── name_mk # Македонско име │ │ ├── name_en # Англиско име │ │ ├── code # Уникален код │ │ ├── duration_years # 1-6 години │ │ └── cycle # 'first' | 'second' │ ├── relationships: │ │ ├── subjects() # BelongsToMany │ │ │ └── pivot: order, type, year, semester_type │ │ └── userProgress() # HasMany │ └── methods: │ ├── getMandatorySubjects() # Само задолжителни │ ├── getElectiveSubjects() # Само изборни │ └── getDisplayName() # "NAME (N години)" │ └── CareerPath.php # Каријерна патека (Full Stack, Data Science, итн.) ├── attributes: │ ├── name # Име на патека │ └── description ├── relationships: │ └── subjects() # BelongsToMany │ └── pivot: career_path_subject └── methods: └── getIcon() # Икона за приказ == Табели во база == users ├── id, name, email, password ├── role (enum: 'admin', 'user') ├── created_at, updated_at └── → hasMany(user_progress) user_progress ├── id, user_id (FK), subject_id (FK) ├── study_program_id (FK), career_path_id (FK, nullable) ├── status (enum: 'completed', 'in_progress') ├── completed_at (timestamp, nullable) └── → belongsTo(user, subject, study_program, career_path) subjects ├── id, code (unique), name, name_mk ├── year (1-4), semester_type, subject_type ├── credits, description, instructions, hours └── → belongsToMany(subject_prerequisites) → belongsToMany(study_programs, career_paths) → hasMany(user_progress) subject_prerequisites ├── subject_id (FK) → pivot table └── prerequisite_id (FK) study_programs ├── id, code (unique), name_mk, name_en ├── duration_years, cycle, description_mk, description_en └── → belongsToMany(subjects) → hasMany(user_progress) study_program_subject (Pivot Table) ├── id, study_program_id (FK), subject_id (FK) ├── type (mandatory/elective) ├── year, semester_type ├── order, timestamps career_paths ├── id, name, description └── → belongsToMany(subjects) career_path_subject (Pivot Table) ├── career_path_id (FK) └── subject_id (FK) == Контролери == Controllers/ ├── RoadmapController.php # Главна логика за roadmap генерирање │ ├── create() # Приказ на форма за создание │ ├── store() # Зачувување на избори и генерирање │ ├── show() # Приказ на зачуван roadmap │ ├── getSubjectsByProgram() # AJAX - предмети по програма │ ├── generateRoadmap() # Приватна: сортирана листа │ └── generateSemesterRoadmap() # Приватна: по години/семестри │ ├── SubjectController.php # CRUD за предметите (Admin) │ ├── index() # Листа со пребарување │ ├── create() # Форма за создание │ ├── store() # Зачувување на предмет │ ├── show() # Преглед │ ├── edit() # Форма за уредување │ ├── update() # Ажурирање │ └── destroy() # Бришење │ ├── StudyProgramController.php # CRUD за студиски програми (Admin) │ ├── index() # Листа со пребарување │ ├── create() # Форма за создание │ ├── store() # Зачувување со предметите │ ├── show() # Преглед со детали │ ├── edit() # Форма за уредување │ ├── update() # Ажурирање со предметите │ └── destroy() # Бришење │ ├── ProfileController.php # Корисничкиот профил │ ├── edit() │ ├── update() │ └── destroy() │ └── (Others: AuthController, DashboardController, итн.) == Middleware == Middleware/ ├── Authenticate.php # Логирана проверка ├── Admin.php # Админ верификација └── (Others) == Requests == Requests/ ├── StoreSubjectRequest.php # Валидација за Subject create/update ├── StudyProgramRequest.php # Валидација за StudyProgram └── (Others) == Views == views/roadmap/ ├── create.blade.php # Форма за создание на roadmap │ ├── Step 1: Избор програма и каријерна патека │ ├── AJAX: Динамичко вчитување на предмети │ ├── Step 2: Избор завршени/во прогрес предмети │ ├── Пребарување предмети │ ├── Организирани по години │ └── JavaScript за обработка │ └── show.blade.php # Приказ на генериран roadmap ├── Header: Програма и патека ├── Progress Summary: 4 картички ├── ECTS Progress Bar: Визуелен напредок ├── Semester-by-Semester Roadmap: │ ├── За секоја година: │ │ ├── Зимски семестар │ │ └─ Летен семестар │ └── За секој предмет: готово/блокирано ├── Препорачани следни чекори: │ ├─ Готови за запишување (зелено) │ └─ Блокирани (црвено) ├── Завршени предмети └─ Во прогрес предмети == Рути во апликацијата == routes/ ├── web.php # Главни рути │ ├── GET / → Welcome │ ├── GET /dashboard → Dashboard │ ├── GET /roadmap/create → RoadmapController@create │ ├── POST /roadmap → RoadmapController@store │ ├── GET /roadmap → RoadmapController@show │ ├── GET /api/study-program/{id}/subjects → RoadmapController@getSubjectsByProgram │ ├── resource /subjects → SubjectController (админ) │ ├── resource /study-programs → StudyProgramController (админ) │ └── (Others: profile, auth) │ ├── auth.php # Автентицирани рути │ ├── Регистрирање │ ├── Логирање │ ├── Password reset │ └── Email verification │