diff --git a/src/food-market.api/Controllers/Catalog/ProductsController.cs b/src/food-market.api/Controllers/Catalog/ProductsController.cs index 43acfc0..1e0acca 100644 --- a/src/food-market.api/Controllers/Catalog/ProductsController.cs +++ b/src/food-market.api/Controllers/Catalog/ProductsController.cs @@ -79,7 +79,8 @@ private async Task ResolveDefaultVatAsync(CancellationToken ct) [FromQuery] Packaging? packaging, [FromQuery] bool? isMarked, [FromQuery] bool? isActive, - [FromQuery] bool? hasBarcode, + [FromQuery] decimal? purchasePriceFrom, + [FromQuery] decimal? purchasePriceTo, CancellationToken ct) { var q = QueryIncludes().AsNoTracking(); @@ -102,8 +103,8 @@ private async Task ResolveDefaultVatAsync(CancellationToken ct) if (packaging is not null) q = q.Where(p => p.Packaging == packaging); if (isMarked is not null) q = q.Where(p => p.IsMarked == isMarked); if (isActive is not null) q = q.Where(p => p.IsActive == isActive); - if (hasBarcode is not null) - q = hasBarcode == true ? q.Where(p => p.Barcodes.Any()) : q.Where(p => !p.Barcodes.Any()); + if (purchasePriceFrom is not null) q = q.Where(p => p.PurchasePrice >= purchasePriceFrom); + if (purchasePriceTo is not null) q = q.Where(p => p.PurchasePrice <= purchasePriceTo); if (!string.IsNullOrWhiteSpace(req.Search)) { diff --git a/src/food-market.web/src/pages/ProductsPage.tsx b/src/food-market.web/src/pages/ProductsPage.tsx index ed6e9ff..fbbfe48 100644 --- a/src/food-market.web/src/pages/ProductsPage.tsx +++ b/src/food-market.web/src/pages/ProductsPage.tsx @@ -8,6 +8,7 @@ import { Plus, Filter, X, FolderTree } from 'lucide-react' import { useCatalogList } from '@/lib/useCatalog' import { useOrgSettings } from '@/lib/useOrgSettings' import { ProductGroupTree } from '@/components/ProductGroupTree' +import { MoneyInput } from '@/components/Field' import { packagingLabel, type Product } from '@/lib/types' const URL = '/api/catalog/products' @@ -20,7 +21,8 @@ interface Filters { isService: TriFilter packaging: number | null // null = все, 1/2/3 = Piece/Weight/Liquid isMarked: TriFilter - hasBarcode: TriFilter + purchasePriceFrom: number | null + purchasePriceTo: number | null } const defaultFilters: Filters = { @@ -29,7 +31,8 @@ const defaultFilters: Filters = { isService: 'all', packaging: null, isMarked: 'all', - hasBarcode: 'all', + purchasePriceFrom: null, + purchasePriceTo: null, } const toExtra = (f: Filters): Record => { @@ -39,7 +42,8 @@ const toExtra = (f: Filters): Record { if (f.isService !== 'all') n++ if (f.packaging) n++ if (f.isMarked !== 'all') n++ - if (f.hasBarcode !== 'all') n++ + if (f.purchasePriceFrom != null) n++ + if (f.purchasePriceTo != null) n++ return n } @@ -217,7 +222,29 @@ export function ProductsPage() { {showMarked && ( { setFilters({ ...filters, isMarked: v }); setPage(1) }} /> )} - { setFilters({ ...filters, hasBarcode: v }); setPage(1) }} yesLabel="есть" noLabel="нет" /> +
+ Закупочная цена +
+ { setFilters({ ...filters, purchasePriceFrom: n }); setPage(1) }} + currencyCode={org.data?.defaultCurrencyCode ?? undefined} + currencySymbol={org.data?.defaultCurrencySymbol ?? undefined} + allowFractional={org.data?.allowFractionalPrices ?? false} + placeholder="от" + /> +
+
+ { setFilters({ ...filters, purchasePriceTo: n }); setPage(1) }} + currencyCode={org.data?.defaultCurrencyCode ?? undefined} + currencySymbol={org.data?.defaultCurrencySymbol ?? undefined} + allowFractional={org.data?.allowFractionalPrices ?? false} + placeholder="до" + /> +
+
{activeCount > 0 && (