Перейти к основному содержимому

Модели и доменная логика

Верхнеуровневая карта моделей

ПапкаНазначение
app/Models/Education/AcademyАкадемические годы, недели, кабинеты, преподаватели, классы
app/Models/Education/ProgramПредметы, уровни, темы, модули
app/Models/Education/CatalogПродукты, сезоны, тарифы, страницы и карточки продуктов
app/Models/Education/LearningГруппы, дисциплины, расписания, занятия
app/Models/Education/DictionaryСправочники типов, форматов, статусов
app/Models/LandingЛендинги, redirects, proxy pages, banners, roadmap config
app/Models/CoreПользовательские поля и интеграционные модели
app/Models/Core/IntegrationGK/MK integration models
app/Models/User.phpПользователь, доступ в Filament, profile/auth данные
app/Models/Role.phpCustom role model для Spatie Permission

Центральная цепочка каталога

Subject / DifficultyLevel / ProductType

Product

ProductOffering actual=true

Tariff + Status + Format + Lessons + Groups

ProductCard + ProductPage

Public catalog / product widgets

Product

Product — основная сущность каталога.

Ключевые поля:

  • subject_id;
  • subsubject_id;
  • product_type_id;
  • product_subtype_id;
  • difficulty_level_id;
  • name;
  • custom_fields;
  • invisible_in_roadmap;
  • active.

Ключевые связи:

  • card();
  • page();
  • actualProductOffering();
  • subject();
  • subsubject();
  • difficultyLevel();
  • productType();
  • productSubtype();
  • productGoals();
  • productOfferings();
  • groupLessons();
  • groupDisciplines();
  • seriesElements().

Computed attributes:

  • title — тип продукта + название;
  • label — название, тип, предмет, уровень;
  • current_price — цена текущего актуального offering, если тариф не special.

ProductOffering

ProductOffering — сезон/предложение продукта.

Ключевые поля:

  • product_id;
  • academic_year_id;
  • product_format_id;
  • tracks;
  • tariff_id;
  • start_date;
  • end_date;
  • actual;
  • page_status_id;
  • status_id;
  • status_movement_start_date;
  • tariff_movement_start_date.

Важные side effects:

  • при создании подставляет текущий academic year;
  • при сохранении status подтягивает format/page status;
  • при сохранении actual offering снимает actual с остальных offering этого продукта;
  • при изменении default lesson duration обновляет связанные product lessons.

Ключевые связи:

  • productLessons();
  • groupDisciplines();
  • statusSections();
  • pageStatus();
  • status();
  • product();
  • academicYear();
  • tariff();
  • productFormat().

Tariff

Tariff описывает цену.

Ключевые поля:

  • product_type_id;
  • name;
  • currency;
  • default_hours;
  • per_hour_price;
  • discount_percent;
  • is_discount;
  • is_season_discount;
  • tariff_type_id;
  • special.

Важная логика:

  • если special = true, цена и старая цена сбрасываются, currency становится -;
  • если price <= 0, tariff type становится FREE;
  • если есть discount, tariff type становится DISCOUNT или SEASON_DISCOUNT;
  • иначе tariff type STANDARD.

Subject и DifficultyLevel

Subject — предмет. При создании автоматически создаёт SubjectRoadmapConfig.

DifficultyLevel — уровень сложности внутри subject. При создании создаёт DifficultyLevelRoadmapConfig. При сохранении синхронизирует дерево top/sub levels через таблицу difficulty_levels_tree.

Topic и TopicModule

Topic — тема программы.

Связи:

  • difficulty level;
  • topic module;
  • product lessons через pivot;
  • mini group modules через pivot;
  • products вычисляются через product lessons и actual offerings.

GroupDiscipline

GroupDiscipline связывает учебную группу/дисциплину с product offering, преподавателем, кабинетом и расписанием.

Важные side effects:

  • вне console при сохранении может создать Group, если group_id отсутствует;
  • при изменении start/end date обновляет schedules;
  • при изменении teacher/room обновляет schedules;
  • при изменении дат пересчитывает даты product offering;
  • computed cipher строится из предмета, уровня, дня недели и времени.

Landing models

МодельНазначение
LandingRedirectRedirect rules из БД
LandingProxyPageDynamic proxy routes
LandingLayoutТипы layouts для proxy pages
LandingPageCacheEntryСостояние page cache
LandingNullPrefixPageСтраницы без prefix
LandingBannerБаннеры
LandingBannerTypeТипы баннеров
CatalogFilterНастройки фильтров каталога
CatalogSeoPhraseSEO-фразы каталога

Core/Integration models

Core/Integration содержит модели для внешних систем GK/MK:

  • GKUser;
  • MKUser;
  • MKClass;
  • MKCourse;
  • MKJoin;
  • MKLesson.

LoginByGkUHash использует GKUser для auto-login.

MkApi работает с внешним MK API через MK_API_KEY.