- Настройки: выпадающий список «Размер шрифта / текста» (90/100/115/130/150%)
- масштаб применяется ко всему главному окну (LayoutTransform), сохраняется
и восстанавливается при старте
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
- Настройки: выпадающий список «Шрифт» со всеми системными шрифтами
(+ «По умолчанию»), с превью каждого шрифта в себе самом
- шрифт применяется ко всему приложению (ресурс AppFontFamily + стиль Window),
сохраняется и восстанавливается при старте
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
- UpdateService: проверка через публичный CDN latest.json (тот же хост, что и
установщик — надёжнее поддомена git), fallback на Gitea, лог в %TEMP%\elfisa-update.log
- Настройки: кнопка «Проверить обновления» (ручной триггер + видимый результат)
- Прайс-лист: убран лимит показа (300 → весь прайс/все совпадения одним запросом)
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Раньше поиск шёл только кнопкой «Найти». Добавлен KeyBinding Enter → SearchCommand
прямо в поле ввода: набрал название, нажал Enter — ищет.
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
LoadPrice дробил прайс на страницы по 20000, а сервер на каждую страницу заново
прогонял тяжёлую оконную дедупликацию + COUNT. При всех подключённых прайсах
(~52к позиций) это ~6-7с. Тянем всё одним запросом → один прогон (~1.2с).
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
- UpdateService (Core): проверка Gitea releases/latest + скачивание установщика с CDN
- UpdateWindow/VM: уведомление «доступно обновление», тихая установка поверх с перезапуском
- ShellView: проверка при старте (один раз, офлайн/ошибки игнорируются)
Закрывает пробел: Avalonia-клиент раньше не умел обновляться (апдейтер был только в WinForms).
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Раздел переделан: вместо поиска по прайсу и корзины с наименованиями — список
неотправленных накладных (черновиков) и кнопка «Отправить все» (плюс отправка
по одной). Отправка создаёт реальный заказ у поставщика и убирает черновик.
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
- Прайс-лист: дропдаун «Мои прайсы» (подключённые прайсы + «Все прайсы»),
выбор фильтрует каталог по price_list_id; один прайс — выбирается сам
- Загрузить: показывает список подключённых прайсов и качает их
- Core: GetBuyerPriceListsAsync + priceListId в GetPriceSummaryAsync
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
- База/дозировка вычисляются на клиенте (порт BuildBaseName/ExtractDosage)
- Три панели: базовые наименования → дозировки (МГ) → предложения поставщиков
- Колонка «Заказ»: ввод числа с клавиатуры (многозначно), Enter — добавить
- Фикс: null-безопасная привязка KeyDown (падало в конструкторе → пустой экран)
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
- при «Сохранить заказ» резервируется настоящий номер через
GET /api/buyer/global-sign/next (fallback ЧРН-… если офлайн)
- при отправке черновика этот EX-номер передаётся в заказ (global_sign),
заказ сохраняет тот же номер
- ApiClient.NextGlobalSignAsync, BuyerOrderCreateRequest.GlobalSign
- DraftStore: номер задаёт вызывающий
Проверено: черновик = EX-0000018, статус «Не отправлен».
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
- CartService: единая корзина для Прайс-листа и Отправить
- Прайс-лист: выбор позиции + кол-во + «Добавить в заказ», индикатор корзины
- Настройки (диалог ⚙ в шапке): адрес API, тема (свет/тьма, применяется
сразу), грузополучатель по умолчанию; сохранение в %APPDATA%
- SettingsStore (Core) + AppConfig читает сохранённый API-адрес
- тема применяется на старте
Проверено вживую: добавление из Прайс-листа в корзину, диалог настроек.
Реальная отправка заказа (POST) — собрана и связана, живой заказ по явному «да»
(автозащита блокирует боевую транзакцию без подтверждения).
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
- Добавлена вкладка «Загрузить» (между Отчёты и Отправить, как в исходной
программе): постраничная загрузка прайса с прогрессом, кэш в памяти
(PriceCache), итог «N позиций от K поставщиков» + timestamp
- Верхняя навигация уплотнена под 8 вкладок (Справочник больше не обрезается)
- Core: PriceCache
Проверено вживую: все 8 вкладок влезают, загрузка прайса работает (500 поз.).
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
- Навигация перенесена из левого сайдбара в ВЕРХНЮЮ горизонтальную
панель, как в исходной программе: логотип слева, вкладки
(иконка+подпись) по центру, пользователь+Выйти справа
- Раздел «Заказы»: мастер-детали (список слева, состав заказа справа
с позициями и итогом), на данных /api/buyer/report
- Числовые колонки выровнены вправо (стиль DataGridCell.num)
- Отчёты: тулбар на WrapPanel, стабильные ширины колонок
Проверено запуском (скриншоты): верхняя навигация, отчёты, заказы.
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
- бирюзовые кнопки (#0F766E) как в шапке, «Сформировать» больше не обрезано
- убрана криво рендерившаяся эмодзи с кнопки ИИ
- поле «Запрос ИИ» нормальной ширины (не на весь экран), фиксированные позиции
- таблица: бирюзовая шапка с белым текстом, чередование строк,
бирюзовое выделение, числа выровнены вправо, сбалансированные ширины колонок
Проверено рендером с тестовыми данными.
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Во второй строке (ИИ) убраны конфликтующие якоря — поле «Запрос ИИ»
тянется по ширине, формат и кнопка пиннятся вправо с пересчётом при
ресайзе, контролы больше не наезжают друг на друга.
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Клиент пишет запрос словами («закупки по поставщикам за июль»,
«топ товаров за 3 месяца», «заказы у Farmsnab»), ИИ на Мак-мини
подбирает тип/период/фильтр, платформа отдаёт данные строго этого
покупателя, собирается Word/Excel и открывается автоматически.
- UCReports: строка «Запрос ИИ» + Word/Excel + кнопка
- ApiClient.GenerateAiReportAsync -> POST {AiBase}/generate
- AppConfig.AiBaseUrl (default https://24pharmdata.ru/ai,
override ELF_AI_BASE_URL для локального теста)
Сервер: Caddy проксирует /ai/* -> Мак-мини (Ollama qwen2.5:7b +
FastAPI). LLM только распознаёт запрос, цифры считает код.
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Новый раздел «Отчёты» в десктопе (buyer-scoped, данные с сервера):
- Мои заказы за период, По поставщикам, По товарам, По аптекам
- фильтр по датам, агрегация клиентски из одного набора строк
- сервер: GET /api/buyer/report скоупит строки по JWT покупателя
(клиент видит ТОЛЬКО свои заказы)
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Апдейтер: повышение прав через cmd.exe /c вместо запуска .cmd напрямую
(ShellExecute runas на .cmd срабатывал не на всех системах — elevated
процесс молча не стартовал, обновление в Program Files не применялось,
клиент зацикливался на уведомлении). Payload переносится в ASCII-путь,
чтобы имя папки из архива не ломало аргумент SRC для robocopy.
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Версия десктопа поднята до 1.0.24.0. Сопровождает серверные фиксы,
которые уже на проде: отправка заказа (глобальный номер заявки),
скоуп прайса покупателя по назначенному прайс-листу.
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Compare OrderDate as real dates (dd.MM.yyyy storage broke across month boundaries) and bump AssemblyVersion so desktop picks up the Gitea release.
Co-authored-by: Cursor <cursoragent@cursor.com>
Store client markup on each Consignee so it survives restarts and price refresh; show only name and address in the selection dialog with a wider window.
Co-authored-by: Cursor <cursoragent@cursor.com>
Apply available buyer/price-list/region discounts to summary.price on download, keep consignee carts separate, and harden SQLite startup/migrations.
Co-authored-by: Cursor <cursoragent@cursor.com>
Persist last successful login only, show active pharmacy in the status bar, and keep settings compact at the bottom-right.
Co-authored-by: Cursor <cursoragent@cursor.com>
Перевести desktop-клиент на работу с текущими buyer orders и локальным SQLite-кешем, чтобы отправка заказов и синхронизация документов работали с уже развернутым сервером без старых MSSQL-зависимостей.
Co-authored-by: Cursor <cursoragent@cursor.com>