# ЭльФиСА — кросс-платформенный клиент (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).