# Cabinet: архитектура модулей

`apps/cabinet` - legacy-монолит личного кабинета на Symfony 5.4. Он обслуживается контейнером `php82`, nginx направляет `cabinet.sovamed.ru` в `apps/cabinet/public/index.php`.

## Слои

```mermaid
flowchart TB
  browser[Browser]
  controllers[Controller\n14 классов]
  forms[Form\n19 классов]
  services[Service\n4 класса]
  bundles[Bundle\nлокальные интеграции]
  repositories[Repository\n21 класс]
  entities[Entity\n21 класс]
  twig[Twig templates]
  assets[Webpack Encore assets]
  db[(PostgreSQL)]
  bitrix[(Bitrix)]
  mis[Infoclinica / MIS]
  external[Calltouch, SMS, Notisend, Yandex Direct]

  browser --> controllers
  controllers --> forms
  controllers --> services
  controllers --> bundles
  controllers --> repositories
  repositories --> entities
  repositories --> db
  controllers --> twig
  twig --> assets
  services --> repositories
  bundles --> bitrix
  bundles --> mis
  bundles --> external
```

## Контроллеры

### Пользовательский кабинет

- `SecurityController` - login/logout, регистрация, восстановление, настройки, платежи, история болезни, направления, refund, проверка авторизации API.
- `DefaultController` - главная кабинета, вызов врача на дом, стоимость услуг, админское обновление прайса, справка.
- `SpecialistController` - каталог врачей, карточка врача, онлайн-специалисты, избранное.
- `WidgetController` - справки, review source, проверка записи/виджета.

Поток защищенной страницы:

```mermaid
sequenceDiagram
  participant User
  participant Security as Security Firewall
  participant Controller
  participant Service
  participant Repository
  participant Twig

  User->>Security: GET / или /payment
  Security->>Controller: проверка сессии / ROLE_USER
  Controller->>Service: подготовка данных
  Service->>Repository: запросы к БД
  Repository-->>Service: сущности
  Service-->>Controller: данные
  Controller->>Twig: render
  Twig-->>User: HTML
```

### Админка и CMS

- `BannerController` - баннеры.
- `CategoryPageController` и `PageController` - категории и страницы.
- `DepartmentController` - отделения.
- `ReviewSourceController` - источники отзывов.
- `WidgetFormController`, `WidgetFormInputController` - конструктор форм виджетов.

Большинство таких контроллеров используют Symfony Forms и Doctrine repositories напрямую.

### API

- `PublicAPIController` - публичные методы `/api`: anonymous reserve, интервалы расписания, данные пользователя, прайс, врачи.
- `InternalAPIController` - swagger, captcha, баннеры, логирование, запись, сообщения, поиск, отделения.
- `CalltouchAPIController` - добавление заявки Calltouch.

## Локальные Bundle-интеграции

В `src/Bundle` находятся не Symfony bundle в классическом смысле, а локальные клиенты/утилиты:

- `Infoclinica\Client` и `Infoclinica\Rest` - низкоуровневый HTTP-клиент и набор методов MIS: записи, профиль, платежи, бонусы, направления, история болезни, login, reserve.
- `Bitrix\Request` - врачи, отзывы, изображения, филиалы, отделения, услуги.
- `Calltouch\Request` - заявки и выборки звонков/обращений.
- `Sms\Manager` и `Notisend\Request` - отправка сообщений.
- `Yandex\Direct` - отчеты и сущности Direct.
- `Crypt\AES` - AES-операции.
- `Helper\AmountInWords` - сумма прописью.
- `Utils\Logger` - логирование.

## Сервисы

- `PriceListService` - фильтрация и построение запросов прайса.
- `SpecialistService` - списки и карточки врачей.
- `SpecialistMoreService` - вычисляемая информация по врачу: локации, цены, отзывы, минимальная цена.
- `UserCleanupService` - очистка просроченных/неподтвержденных пользователей.

## Формы и Twig

```mermaid
flowchart LR
  controller[Controller] --> form[Symfony Form]
  form --> entity[Entity]
  controller --> twig[Twig template]
  twig --> encore[Webpack Encore assets]
  encore --> public[public/build]
```

Формы лежат в `src/Form`; шаблоны - в `templates`; frontend-ассеты - в `assets`; сборка описана в `webpack.config.js` и `package.json`.

## Авторизация

Security использует `LoginFormAuthenticator`. Пользователь берется из `App\Entity\User` по email, пароль хешируется bcrypt. Logout удаляет cookies `CABINET_SESSION`, `WR_SESSION`, `WR_FLASH`, `PLAY_SESSION`, `WR_DETAIL`, `region`.

```mermaid
sequenceDiagram
  participant User
  participant Login as SecurityController
  participant Auth as LoginFormAuthenticator
  participant Provider as User Provider
  participant Session

  User->>Login: POST /login
  Login->>Auth: credentials
  Auth->>Provider: load user by email
  Provider-->>Auth: User
  Auth->>Session: создать сессию
  Session-->>User: cookies
```

## Консольные команды

Команды в `src/Command` синхронизируют данные из Infoclinica/Bitrix, обновляют врачей и прайсы, сравнивают врачей, работают с Yandex Direct, AES и очисткой пользователей.

```mermaid
flowchart TB
  cron[Cron / ручной запуск] --> cmd[Symfony Command]
  cmd --> base[BaseCommand]
  cmd --> bundles[Bundle clients]
  cmd --> services[Services]
  services --> repositories[Repositories]
  repositories --> db[(PostgreSQL)]
```

## Доменные сущности

- `User` - пользователь кабинета: email, роли, пароль, UID, token, ФИО, телефон, флаг подтверждения, активность.
- `SpecialistView` - представление врача: имя, специальность, категория, опыт, описание, alias, `dcode`, регион, услуга, признак ДМС.
- `LocationView` - представление локации врача: `dcode`, отделение, филиал, режим online, ближайшая дата.
- `PriceList`, `PriceDepartment`, `Price` - прайс и группы.
- `Record` и `AlertSms` - запись и связанное SMS-уведомление.
- `City`, `Filial`, `ReviewSource`, `Banner` - региональная структура и источники отзывов.
- `CategoryPage`, `Page` - CMS-страницы.
- `WidgetForm`, `WidgetFormInput` - формы виджетов.
- `DirectCompany`, `DirectReport` - данные Яндекс Директа.

Полная ER-схема вынесена на страницу [Модели данных](../data-model.md).
