Commit Graph

59 Commits

Author SHA1 Message Date
Exest
2420a71ace Avalonia: сборка заказа в Прайс-листе (панель «Мой заказ») + черновики в «Заказы»
- Прайс-лист: 2 колонки — каталог + «Мой заказ» (состав/кол-во/итог/
  грузополучатель/комментарий) + «Сохранить заказ»
- Сохранить -> локальный черновик (DraftStore, %APPDATA%)
- Заказы: черновики вверху «Не отправлен» + «Отправить заказ»/«Удалить»
- как в WinForms: собрал -> сохранил (не отправлен) -> отправил отдельно

Проверено вживую: сборка, сохранение, черновик в Заказах.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-08-08 11:43:47 +03:00
Exest
c677345ba6 Avalonia: общая корзина, добавление из Прайс-листа, Настройки
- CartService: единая корзина для Прайс-листа и Отправить
- Прайс-лист: выбор позиции + кол-во + «Добавить в заказ», индикатор корзины
- Настройки (диалог ⚙ в шапке): адрес API, тема (свет/тьма, применяется
  сразу), грузополучатель по умолчанию; сохранение в %APPDATA%
- SettingsStore (Core) + AppConfig читает сохранённый API-адрес
- тема применяется на старте

Проверено вживую: добавление из Прайс-листа в корзину, диалог настроек.
Реальная отправка заказа (POST) — собрана и связана, живой заказ по явному «да»
(автозащита блокирует боевую транзакцию без подтверждения).

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-08-08 11:26:53 +03:00
Exest
43468ac693 Avalonia: раздел «Загрузить» (скачивание прайса) + уплотнение верхней панели
- Добавлена вкладка «Загрузить» (между Отчёты и Отправить, как в исходной
  программе): постраничная загрузка прайса с прогрессом, кэш в памяти
  (PriceCache), итог «N позиций от K поставщиков» + timestamp
- Верхняя навигация уплотнена под 8 вкладок (Справочник больше не обрезается)
- Core: PriceCache

Проверено вживую: все 8 вкладок влезают, загрузка прайса работает (500 поз.).

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-08-08 11:05:52 +03:00
Exest
b13a867f8d Avalonia: раздел «Отправить» (корзина + создание заказа)
- Отправить: поиск по прайсу → корзина (кол-во через NumericUpDown,
  сумма/итого) → выбор грузополучателя + комментарий → создание заказа
  POST /api/buyer/orders
- Core: CreateOrderAsync + DTO (BuyerOrderCreateRequest/ItemReq/Response)
- Отказы: заглушка с точным пояснением (нужен серверный эндпоинт;
  RefuseItemsCount живёт только в локальной SQLite WinForms)

Итог: 6/7 разделов функциональны (Прайс-лист, Заказы, Накладные, Отчёты,
Справочник, Отправить), Отказы — заглушка. Собирается.
⚠️ Реальная отправка заказа (POST) не тестировалась — создаёт заказ на
проде; проверять вживую отдельно.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-08-08 10:30:57 +03:00
Exest
77dfb08ef4 Avalonia: Прайс-лист, Накладные, Справочник (5/7 разделов рабочие)
- Прайс-лист: поиск + грид на рабочем /api/supplier-prices/summary
  (наименование, форма, производитель, поставщик, цена)
- Накладные: реестр приходных документов (из buyer/report)
- Справочник: профиль покупателя + грузополучатели (buyer/locations)
- Core: GetPriceSummaryAsync, GetBuyerLocationsAsync + DTO
- README: статус разделов + примечание про buyer/orders 500 (фикс застейджен)

Рабочие: Прайс-лист, Заказы, Накладные, Отчёты, Справочник.
Осталось: Отправить (корзина+DBF), Отказы (нужен эндпоинт), автообновление.
Собирается; рантайм новых 3 разделов не проверен (клиент за игрой — окна не поднимал).

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-08-08 10:20:36 +03:00
Exest
132ce1531f Avalonia: верхняя навигация (как в WinForms) + раздел «Заказы»
- Навигация перенесена из левого сайдбара в ВЕРХНЮЮ горизонтальную
  панель, как в исходной программе: логотип слева, вкладки
  (иконка+подпись) по центру, пользователь+Выйти справа
- Раздел «Заказы»: мастер-детали (список слева, состав заказа справа
  с позициями и итогом), на данных /api/buyer/report
- Числовые колонки выровнены вправо (стиль DataGridCell.num)
- Отчёты: тулбар на WrapPanel, стабильные ширины колонок

Проверено запуском (скриншоты): верхняя навигация, отчёты, заказы.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-08-08 10:00:57 +03:00
Exest
f6a1012e9b Avalonia кросс-платформенный клиент: фундамент + раздел «Отчёты»
Порт десктопа с WinForms на Avalonia (.NET 8, Win/macOS/Linux).

- Elfisa.Core: переносимая логика (ApiClient: логин/отчёт/ИИ, DTO, Session)
- Дизайн-система в бирюзе #0F766E (свет/тьма, кнопки/поля/карточки/таблица/сайдбар)
- Экран входа (реальный /auth/login), шелл с сайдбар-навигацией
- «Отчёты»: 4 типа + авто-загрузка + ИИ-запрос -> Word/Excel, динамические колонки
- Заглушки остальных разделов + README с дорожной картой портирования

Проверено запуском: логин, живые данные покупателя, тема, таблица (скриншот).
dev-автологин по ELF_DEV_USER/ELF_DEV_PASS.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-08-07 18:21:10 +03:00
Exest
a4880d7c50 v1.0.29: раздел «Отчёты» в стиле приложения
- бирюзовые кнопки (#0F766E) как в шапке, «Сформировать» больше не обрезано
- убрана криво рендерившаяся эмодзи с кнопки ИИ
- поле «Запрос ИИ» нормальной ширины (не на весь экран), фиксированные позиции
- таблица: бирюзовая шапка с белым текстом, чередование строк,
  бирюзовое выделение, числа выровнены вправо, сбалансированные ширины колонок

Проверено рендером с тестовыми данными.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-08-07 16:57:22 +03:00
Exest
4b43907353 v1.0.28: фикс раскладки раздела «Отчёты»
Во второй строке (ИИ) убраны конфликтующие якоря — поле «Запрос ИИ»
тянется по ширине, формат и кнопка пиннятся вправо с пересчётом при
ресайзе, контролы больше не наезжают друг на друга.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-08-07 16:45:52 +03:00
Exest
4d398aca84 v1.0.27: ИИ-отчёты по запросу в разделе «Отчёты»
Клиент пишет запрос словами («закупки по поставщикам за июль»,
«топ товаров за 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>
2026-08-07 16:24:19 +03:00
Exest
f7fb7ed1b0 Release v1.0.26: раздел «Отчёты» для покупателя
Новый раздел «Отчёты» в десктопе (buyer-scoped, данные с сервера):
- Мои заказы за период, По поставщикам, По товарам, По аптекам
- фильтр по датам, агрегация клиентски из одного набора строк
- сервер: GET /api/buyer/report скоупит строки по JWT покупателя
  (клиент видит ТОЛЬКО свои заказы)

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-08-07 14:06:41 +03:00
Exest
557f8667ad Release v1.0.25: fix auto-updater elevation
Апдейтер: повышение прав через cmd.exe /c вместо запуска .cmd напрямую
(ShellExecute runas на .cmd срабатывал не на всех системах — elevated
процесс молча не стартовал, обновление в Program Files не применялось,
клиент зацикливался на уведомлении). Payload переносится в ASCII-путь,
чтобы имя папки из архива не ломало аргумент SRC для robocopy.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-08-07 10:38:08 +03:00
Exest
b10eba0984 Release v1.0.24
Версия десктопа поднята до 1.0.24.0. Сопровождает серверные фиксы,
которые уже на проде: отправка заказа (глобальный номер заявки),
скоуп прайса покупателя по назначенному прайс-листу.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-08-06 18:03:00 +03:00
Exest
63abfd4e31 Release v1.0.23: global order numbers EX-####### (GLOBAL_SIGN).
Desktop reserves/sends EX numbers from server; supplier DBF gets GLOBAL_SIGN column.
2026-08-05 18:59:43 +03:00
Exest
d2a1a86794 Release v1.0.22: fix auto-update loop on Program Files installs.
Auto-updater now requests UAC elevation, force-unlocks the exe, and verifies the copy before restart.

Co-authored-by: Cursor <cursoragent@cursor.com>
2026-08-05 17:09:57 +03:00
2659de14b9 Release v1.0.21: consignees from web, remove test pharmacies. 2026-08-05 15:22:44 +03:00
Exest
166a431bda Release v1.0.20: fix Orders date filter hiding new carts.
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>
2026-08-03 14:01:44 +03:00
Exest
cdb2d353a5 Release v1.0.19 desktop build.
Co-authored-by: Cursor <cursoragent@cursor.com>
2026-07-31 17:21:07 +03:00
Exest
0253bdf022 Bump to v1.0.18 with valid release timestamp.
Co-authored-by: Cursor <cursoragent@cursor.com>
2026-07-31 17:21:07 +03:00
Exest
621f6a6cf3 Bump to v1.0.17 retest after hang fix.
Co-authored-by: Cursor <cursoragent@cursor.com>
2026-07-31 17:18:59 +03:00
Exest
03c71b8e78 Fix update hang: allow dialog close after download; harden updater wait.
Co-authored-by: Cursor <cursoragent@cursor.com>
2026-07-31 17:18:11 +03:00
Exest
2230d4c73f Bump to v1.0.15 auto-update retest target.
Co-authored-by: Cursor <cursoragent@cursor.com>
2026-07-31 13:49:23 +03:00
Exest
28f0886b32 Fix auto-update exit crash after download (Application.Exit from async).
Co-authored-by: Cursor <cursoragent@cursor.com>
2026-07-31 13:48:56 +03:00
Exest
d80953baad Bump to v1.0.13 to exercise in-app auto-updater.
Co-authored-by: Cursor <cursoragent@cursor.com>
2026-07-31 13:45:39 +03:00
Exest
3039c324be Add in-app auto-updater that preserves local database.
Co-authored-by: Cursor <cursoragent@cursor.com>
2026-07-31 13:44:44 +03:00
Exest
7497ee2d4f Bump desktop to v1.0.11 for forced-update smoke test.
Co-authored-by: Cursor <cursoragent@cursor.com>
2026-07-31 13:39:46 +03:00
Exest
b69e1b4498 Add forced update check against Gitea releases.
Block startup when a newer Release exists; keep offline pharmacies working.

Co-authored-by: Cursor <cursoragent@cursor.com>
2026-07-31 12:58:36 +03:00
Magomed
09535e9b02 Optimize price-list name search for large catalogs.
Replace O(n^2) per-keystroke rebuild with indexed unique names, a single-pass filter, and debounce so typing stays responsive with ~15k items.
2026-07-30 18:36:35 +03:00
Exest
9dfdb913cb Use server final price on download without local markup math.
Server now sums price-list, region and buyer markups; desktop must not re-apply discounts.

Co-authored-by: Cursor <cursoragent@cursor.com>
2026-07-30 15:40:36 +03:00
Magomed
d68155b8ef Persist per-pharmacy markup percent and simplify consignee picker UI.
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>
2026-07-30 14:53:28 +03:00
Magomed
3d253a2f54 Fix SQLite BadImageFormat by disabling Prefer32Bit and syncing interop arch.
Ensure SQLite.Interop.dll next to the exe always matches process bitness from x86/x64.

Co-authored-by: Cursor <cursoragent@cursor.com>
2026-07-30 14:27:41 +03:00
Magomed
fd5bd18c66 Add per-pharmacy carts and client-side summed discount pricing.
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>
2026-07-30 14:07:47 +03:00
Magomed
458b70e036 Add multi-pharmacy LocationId, batched price download, and SQL debug tools.
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>
2026-07-29 10:09:04 +03:00
Magomed
babc067863 Add dedicated settings dialog in main window and keep auth form login-only.
Co-authored-by: Cursor <cursoragent@cursor.com>
2026-07-28 12:26:16 +03:00
Exest
e35e67849f v1.0.4: адаптация desktop к текущему buyer API
Перевести desktop-клиент на работу с текущими buyer orders и локальным SQLite-кешем, чтобы отправка заказов и синхронизация документов работали с уже развернутым сервером без старых MSSQL-зависимостей.

Co-authored-by: Cursor <cursoragent@cursor.com>
2026-07-28 11:41:00 +03:00
Exest
4b3b2c8ca8 v1.0.3: передача item_name и item_code при отправке заказа на сервер 2026-07-21 13:16:11 +03:00
Magomed
7f3bc2eb35 Focus offers grid on MG select so qty can be typed immediately. 2026-07-20 20:02:58 +03:00
Magomed
5c439fe780 Apply client markup_percent from price API and fix truncated download logs.
Co-authored-by: Cursor <cursoragent@cursor.com>
2026-07-20 11:36:20 +03:00
Motylek13
999cfe4121
Прогресс загрузки прайса 0–100% и экспорт накладных (#1)
## Summary
- Реальный прогресс загрузки прайса 0–100%: по байтам при скачивании,
затем по позициям при обработке и сохранении в БД
- Настройка папки экспорта накладных и CSV-экспорт из контекстного меню

## Test plan
- [ ] Запустить обновление прайса и убедиться, что полоска идёт от 0 до
100 с текстом «сколько / сколько»
- [ ] В авторизации задать папку экспорта накладных
- [ ] Экспортировать накладную в CSV через контекстное меню
2026-07-18 15:47:31 +03:00
Magomed
1f6f442b21 Show real 0-100% download progress from transferred bytes and saved rows.
Co-authored-by: Cursor <cursoragent@cursor.com>
2026-07-18 15:46:14 +03:00
Magomed
9ee5561f3d Add invoice export folder setting and CSV export from context menu.
Users can choose the export directory in auth settings; right-click on an invoice saves a UTF-8 CSV into that folder.

Co-authored-by: Cursor <cursoragent@cursor.com>
2026-07-18 13:34:48 +03:00
Magomed
5e24cc95b0 Add animated progress bar during price list download.
Show marquee while waiting for the API and determinate progress while saving rows so the UI no longer looks frozen.

Co-authored-by: Cursor <cursoragent@cursor.com>
2026-07-18 13:27:42 +03:00
Magomed
bcd57db153 Прайс: тянем весь прайс одним запросом (limit большой) вместо постраничного OFFSET — уходит 500 на больших каталогах; таймаут HTTP 120с 2026-07-17 17:45:42 +03:00
Magomed
cdfd8353ec Прайс: загрузка всего прайса постранично (limit/offset вместо потолка 5000) — локальный поиск теперь находит все позиции 2026-07-17 12:56:41 +03:00
Magomed
a6601567f2 Improve order UX and harden API debugging.
Prompt for Location ID after login, move cart delete there, refine price-list Backspace navigation, and log every API failure with stack and response body.

Co-authored-by: Cursor <cursoragent@cursor.com>
2026-07-16 16:31:00 +03:00
Magomed
74390c4918 Add name/MG browse flow in price list and harden grid hover.
Show names on the left and dosages on the right after selection, then open supplier offers for the chosen pair. Persist TradeName/Dosage on download and avoid crashes when rebinding or pressing Escape.

Co-authored-by: Cursor <cursoragent@cursor.com>
2026-07-16 14:42:30 +03:00
Magomed
c447048b66 Add invoice request from orders and fix overlapping context menus.
Enable Получить накладную for sent orders, build local invoices without refusals, and stop the tab close menu from covering dedicated grid menus. Also fix price-list Backspace search and refresh the Release dist binaries.

Co-authored-by: Cursor <cursoragent@cursor.com>
2026-07-16 14:00:50 +03:00
Exest
1edb2387eb Авторизация: логин идёт на адрес из поля URL API (сохранение до входа) 2026-07-15 13:18:49 +03:00
Magomed
0c73d7e40b Fix price list parsing crashes and invoice grid initialization.
Harden UCPriceList number parsing and selection handling after download, guard ModernDataGridView row header autosize, and refresh price list from menu load action.

Co-authored-by: Cursor <cursoragent@cursor.com>
2026-07-15 12:15:40 +03:00
Magomed
5cc202dea7 Polish cart tabs and dialog chrome for light/dark themes.
Add ModernTabControl/SplitContainer for cart UI without system borders, fix button corner artifacts and dialog text contrast, and use TitleBarTop green for auth header in light mode.

Co-authored-by: Cursor <cursoragent@cursor.com>
2026-07-14 20:32:54 +03:00