# ЭльФиСА — кросс-платформенный клиент (Avalonia)

Порт десктопного клиента с WinForms на **Avalonia UI** (.NET 8) —
работает на **Windows, macOS и Linux** из одного кода. Начат как замена
WinForms-версии (которая только под Windows).

## Что уже готово (фундамент + эталонный экран)
- **Elfisa.Core** — переносимая бизнес-логика (без UI): `ApiClient`
  (логин, отчёт покупателя, ИИ-отчёт), DTO, `AppConfig`, `Session`.
- **Дизайн-система** в фирменной бирюзе (#0F766E): светлая/тёмная тема,
  стили кнопок, полей, карточек, таблицы, сайдбара (`Styles/Elfisa.axaml`).
- **Экран входа** (`LoginView`) — реальная авторизация через `/auth/login`.
- **Шелл** (`ShellView`) — сайдбар-навигация + карточка пользователя + выход.
- **Отчёты** (`ReportsView`) — ПОЛНОСТЬЮ рабочий эталонный раздел:
  период, 4 типа отчёта (агрегация как в WinForms), авто-загрузка,
  свободный **ИИ-запрос → Word/Excel** (через `/ai`), таблица с динамическими
  колонками. Данные скоупятся по JWT — только заказы этого покупателя.
- Заглушки остальных разделов (Прайс-лист, Заказы, Накладные, Отправить,
  Отказы, Справочник).

## Архитектура
MVVM (CommunityToolkit.Mvvm) + ViewLocator (VM → View по имени).
```
Program → App → MainWindow(RootViewModel)
  RootViewModel: LoginViewModel  ⇄  ShellViewModel
  ShellViewModel.CurrentPage: ReportsViewModel | PlaceholderPageViewModel | …
```
Вся сетевая логика — в `Elfisa.Core` (переиспользуется и десктопом, и
будущим мобильным/веб-клиентом Avalonia).

## Запуск
```bash
dotnet run --project src/Elfisa.Avalonia
```
Dev-автологин (удобно при разработке — минуя экран входа):
```bash
# Windows PowerShell
$env:ELF_DEV_USER="user@example.com"; $env:ELF_DEV_PASS="***"; dotnet run --project src/Elfisa.Avalonia
```
Переопределение адресов (по умолчанию https://24pharmdata.ru и .../ai):
`ELF_API_BASE_URL`, `ELF_AI_BASE_URL`.

Сборка под конкретную ОС:
```bash
dotnet publish src/Elfisa.Avalonia -c Release -r osx-arm64 --self-contained   # Mac (M-серия)
dotnet publish src/Elfisa.Avalonia -c Release -r win-x64  --self-contained    # Windows
```

## Дорожная карта портирования
Логика этих экранов частично уже есть в WinForms `ApiClient` — переносится
в `Elfisa.Core` метод за методом, UI пишется по образцу `ReportsView`.

| Раздел | Что нужно | Сложность |
|---|---|---|
| ✅ Прайс-лист | поиск + грид (/api/supplier-prices/summary) | готово (без добавления в заказ) |
| ✅ Заказы | список + карточка заказа с позициями | готово |
| ✅ Накладные | реестр приходных документов | готово |
| ✅ Отчёты | 4 типа + ИИ → Word/Excel | готово |
| ✅ Справочник | профиль + грузополучатели | готово |
| ✅ Отправить | поиск → корзина → создание заказа (POST /api/buyer/orders) | готов UI; реальная отправка не тестировалась (создаёт заказ на проде) |
| ⏳ Отказы | список отказных позиций | нужен серверный эндпоинт (RefuseItemsCount есть только в локальной БД WinForms) |
| ⏳ Автообновление | аналог AutoUpdater под каждую ОС | не начато |

**Прайс-лист/Заказы/Накладные** строятся на рабочих эндпоинтах
(`supplier-prices/summary`, `buyer/report`). «Родные» `buyer/orders` и
`buyer/catalog` возвращают 500 (баг квотинга PascalCase в GORM-билдере).
Фикс для **buyer/orders** готов и застейджен (`es_api_service.exe.new`,
apply-new-exe.bat) — после деплоя Заказы/Накладные перейдут на него.
Каталог не используется (берём рабочий summary), его фикс — по желанию.

Осталось: **Отправить** (корзина + создание заказа + DBF) и **Отказы**,
плюс автообновление и сохранение сессии. Логика переносится из WinForms,
переписывается только UI (XAML).
