4 commits
| Author | SHA1 | Message | Date | |
|---|---|---|---|---|
|
|
9d8c386def |
feat(vat): ставка в стране + опц. переопределение на товаре
Some checks are pending
CI / POS (WPF, Windows) (push) Waiting to run
CI / Backend (.NET 8) (push) Successful in 27s
CI / Web (React + Vite) (push) Successful in 23s
Docker Images / API image (push) Successful in 38s
Docker Images / Web image (push) Successful in 25s
Docker Images / Deploy stage (push) Successful in 18s
Phase5_VatAsCountryProperty: - countries.VatRate (numeric(5,2)) — ставка страны, источник правды. Seed: KZ=16, RU=20, BY=20, DE=19, CN=13, TR=18, UZ=12, KG=12, KR=10, IT=22, PL=23, US=0. - organizations.ShowVatEnabledOnProduct (bool, default false) — флаг отображения на карточке товара. - organizations.DefaultVat удалён (заменён страной). - products.Vat ОСТАЁТСЯ: для KZ есть льготные категории (хлеб/молоко = 0%) и фискальный чек требует ставку на каждой позиции. Country domain: + DefaultCurrency / VatRate (уже было DefaultCurrencyId из Phase4, сейчас дополнено). Organization domain: DefaultVat убран, ShowVatEnabledOnProduct добавлен. Backend: - ProductInput.Vat теперь int? — если UI скрывает поле и прислал null, ProductsController берёт дефолт из страны организации (Country.VatRate при создании; при update сохраняет прежнее значение). - CountriesController.List/Get/Create/Update возвращает/принимает DefaultCurrency и VatRate. - MoySklad импорт: дефолт Vat загружается из страны организации. - SystemReferenceSeeder: новые валюты BYN/UZS/KGS/TRY/KRW/PLN, seed country-currency-vat для всех 12 стран. - OrganizationSettingsController: VatRate read-only из страны, ShowVatEnabledOnProduct редактируется. Web: - Country type + CountriesPage форма редактирования (валюта, ставка НДС). - OrganizationSettingsPage: "Ставка НДС" read-only (берётся из страны, ссылка на /catalog/countries), галочка "Указывать ставку НДС на товаре". - ProductEditPage: блок Ставка НДС % + галка "В том числе НДС" теперь показываются только если showVatEnabledOnProduct=true. В payload при save.mutate отправляется vat=null если скрыто. - ProductsPage: колонка НДС показывается только при включённом флаге. Galleries/products/settings других этапов — не задеты. |
||
|
|
773ecde6ba |
feat(org-settings): Country↔Currency, Organization.DefaultCurrency/MultiCurrency/DefaultVat + UI настроек
Some checks are pending
CI / POS (WPF, Windows) (push) Waiting to run
CI / Backend (.NET 8) (push) Successful in 27s
CI / Web (React + Vite) (push) Successful in 24s
Docker Images / API image (push) Successful in 38s
Docker Images / Web image (push) Successful in 24s
Docker Images / Deploy stage (push) Successful in 18s
Миграция Phase4_CountryCurrencyOrgDefaults: - countries.DefaultCurrencyId (FK → currencies) - organizations.DefaultCurrencyId, MultiCurrencyEnabled, DefaultVat - Seed: KZ→KZT, RU→RUB, BY→BYN, US→USD, DE→EUR, CN→CNY, TR→TRY - Default для org: KZT, vat=16 Backend: - Organization сущность получила DefaultCurrency/MultiCurrencyEnabled/DefaultVat. - OrganizationSettingsController: GET/PUT /api/organization/settings. - DevDataSeeder при создании/backfill орга выставляет KZT + vat=16. Web: - /settings/organization: форма с выбором страны (авто-подтягивает валюту), чекбоксом multi-currency, ставкой НДС по умолчанию. - useOrgSettings() хук. - SupplyEditPage / RetailSaleEditPage / ProductEditPage: select валюты показывается только если multiCurrencyEnabled=true, иначе подтягивается DefaultCurrency организации и рисуется символ валюты справа от цены. - ProductEditPage при создании нового товара берёт VAT из org.DefaultVat. - В sidebar добавлен раздел 'Настройки → Организация', убран Ставки НДС (сущность удалена раньше). |
||
|
|
2fc6d207f3 |
feat(moysklad-import): async jobs с прогрессом + токен в настройках
Some checks are pending
CI / POS (WPF, Windows) (push) Waiting to run
CI / Backend (.NET 8) (push) Successful in 36s
CI / Web (React + Vite) (push) Successful in 23s
Docker Images / API image (push) Successful in 42s
Docker Images / Web image (push) Successful in 25s
Docker Images / Deploy stage (push) Successful in 18s
Pain points:
1. Импорт на ~30k товарах проходит 15-30 мин, nginx рвал на 60s → 504.
2. При импорте/очистке ничего не видно — ни счётчика, ни прогресса.
3. Токен приходилось вводить каждый раз вручную.
Фиксы:
- Async-job pattern: POST /api/admin/moysklad/import-products и
/api/admin/cleanup/all/async возвращают jobId, реальная работа
в Task.Run. GET /api/admin/jobs/{id} — статус +
Total/Created/Updated/Skipped/Deleted/Stage/Message.
- ImportJobRegistry (singleton, in-memory) — хранит job-progress.
- MoySkladImportService обновляет progress по мере пейджинга
(в т.ч. счётчик Created/Updated/Skipped).
- Cleanup разбит на именованные шаги, Stage меняется по мере
"Товары…" → "Группы…" → "Контрагенты…".
- Токен per-organization: Organization.MoySkladToken + миграция
Phase3_OrganizationMoySkladToken. Endpoints:
GET/PUT /api/admin/moysklad/settings.
- Импорт-endpoints больше не требуют token в теле — берут из org.
- HttpContextTenantContext.UseOverride(orgId) — AsyncLocal-scope
для background tasks (HttpContext там нет, а query-filter'у нужен
orgId — ставим через override).
Nginx (host + web-container) получил 60-минутный timeout на
/api/admin/import/ чтобы старый sync-путь тоже не ронять (на
случай если кто-то вернёт sync call).
Web:
- MoySkladImportPage переработан: блок "Токен API" (save/test
mask), блок импорта с кнопками без поля токена.
- JobCard с polling каждые 1.5s отображает живые счётчики и stage.
- DangerZone тоже теперь async с live-прогрессом.
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
|
||
|
|
fd2f5ae4f3 |
Phase 0: project scaffolding and end-to-end auth
- .NET 8 LTS solution with 7 projects (domain/application/infrastructure/api/shared/pos.core/pos[WPF]) - Central package management (Directory.Packages.props), .editorconfig, global.json pin to 8.0.417 - PostgreSQL 14 dev DB via existing brew service; food_market database created - ASP.NET Identity + OpenIddict 5 (password + refresh token flows) with ephemeral dev keys - EF Core 8 + Npgsql; multi-tenant query filter via reflection over ITenantEntity - Initial migration: 13 tables (Identity + OpenIddict + organizations) - AuthorizationController implements /connect/token; seeders create demo org + admin - Protected /api/me endpoint returns current user + org claims - React 19 + Vite 8 + Tailwind v4 SPA with TanStack Query, React Router 7 - Login flow with dev-admin placeholder, bearer interceptor + refresh token fallback - docs/architecture.md, CLAUDE.md, README.md Verified end-to-end: health check, password grant issues JWT with org_id, web app builds successfully (310 kB gzipped). Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com> |