diff --git a/src/food-market.web/src/lib/barcode.ts b/src/food-market.web/src/lib/barcode.ts index a3e0666..b798102 100644 --- a/src/food-market.web/src/lib/barcode.ts +++ b/src/food-market.web/src/lib/barcode.ts @@ -6,12 +6,15 @@ import { BarcodeType } from '@/lib/types' function digitsChecksum(first: string, weightAtOdd: number): number { - // Общая EAN/UPC-подобная формула: сумма с чередующимися весами, остаток от 10. - // Нечётные позиции (с индекса 0) — weightAtOdd, чётные — 1. + // Контрольная цифра EAN/UPC: веса идут СПРАВА НАЛЕВО (цифра перед контрольной + // имеет вес 3, затем 1,3,1…). Нельзя привязывать вес к индексу слева: для + // чётной длины тела (EAN-13 = 12 цифр) чётность переворачивается и check-digit + // получается неверным. Для нечётной длины (EAN-8=7, UPC-A=11) результат тот же. let sum = 0 - for (let i = 0; i < first.length; i++) { - const d = first.charCodeAt(i) - 48 - sum += i % 2 === 0 ? d * weightAtOdd : d + let w = weightAtOdd + for (let i = first.length - 1; i >= 0; i--) { + sum += (first.charCodeAt(i) - 48) * w + w = w === weightAtOdd ? 1 : weightAtOdd } return (10 - (sum % 10)) % 10 } diff --git a/src/food-market.web/src/pages/InvoiceReviewPage.tsx b/src/food-market.web/src/pages/InvoiceReviewPage.tsx index 82bd047..477a631 100644 --- a/src/food-market.web/src/pages/InvoiceReviewPage.tsx +++ b/src/food-market.web/src/pages/InvoiceReviewPage.tsx @@ -595,7 +595,9 @@ function ProductSearchDialog({ q, onClose, onPick }: { queryKey: ['product-search', query], queryFn: async () => { if (query.trim().length < 2) return [] - const { data } = await api.get<{ items: ProductSearchHit[] }>(`/api/catalog/products?q=${encodeURIComponent(query)}&pageSize=20`) + // API ждёт параметр `search` (PagedRequest.Search), а не `q` — иначе + // фильтр игнорируется и поиск товара на экране накладной не работает. + const { data } = await api.get<{ items: ProductSearchHit[] }>(`/api/catalog/products?search=${encodeURIComponent(query)}&pageSize=20`) return data.items ?? [] }, enabled: query.trim().length >= 2, diff --git a/src/food-market.web/src/pages/SupplyScanPage.tsx b/src/food-market.web/src/pages/SupplyScanPage.tsx index 3238258..c2e4609 100644 --- a/src/food-market.web/src/pages/SupplyScanPage.tsx +++ b/src/food-market.web/src/pages/SupplyScanPage.tsx @@ -65,8 +65,11 @@ export function SupplyScanPage() { const main = r.data.items?.find(s => s.isMain) ?? r.data.items?.[0] if (main) setStoreId(main.id) }) - api.get('/api/catalog/currencies?pageSize=20').then(r => { - const list = Array.isArray(r.data) ? r.data : [] + // /api/catalog/currencies отдаёт PagedResult {items,...}, а не голый массив — + // раньше Array.isArray(r.data) давал пустой список валют, и черновик приёмки + // сканированием не сохранялся (нет currencyId, в т.ч. KZT по умолчанию). + api.get<{ items: Currency[] }>('/api/catalog/currencies?pageSize=20').then(r => { + const list = r.data?.items ?? [] setCurrencies(list) const kzt = list.find(c => c.code === 'KZT') ?? list[0] if (kzt) setCurrencyId(kzt.id)