fix(spool): Add remaining_weight filter for low stock detection
Some checks failed
CI / style (push) Has been cancelled
CI / build-client (push) Has been cancelled
CI / build-amd64 (push) Has been cancelled
CI / build-tester (push) Has been cancelled
CI / test (cockroachdb) (push) Has been cancelled
CI / test (mariadb) (push) Has been cancelled
CI / test (postgres) (push) Has been cancelled
CI / test (sqlite) (push) Has been cancelled
CI / build-arm64 (push) Has been cancelled
CI / build-armv7 (push) Has been cancelled
CI / publish-images (push) Has been cancelled
CI / publish-release (push) Has been cancelled
Some checks failed
CI / style (push) Has been cancelled
CI / build-client (push) Has been cancelled
CI / build-amd64 (push) Has been cancelled
CI / build-tester (push) Has been cancelled
CI / test (cockroachdb) (push) Has been cancelled
CI / test (mariadb) (push) Has been cancelled
CI / test (postgres) (push) Has been cancelled
CI / test (sqlite) (push) Has been cancelled
CI / build-arm64 (push) Has been cancelled
CI / build-armv7 (push) Has been cancelled
CI / publish-images (push) Has been cancelled
CI / publish-release (push) Has been cancelled
- Add remaining_weight_lt and remaining_weight_gt filter params to spool API - Filter uses computed formula: initial_weight - used_weight (falls back to filament.weight) - Update home page to use queryParams instead of Refine filters - Fixes low stock badge count on dashboard Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
This commit is contained in:
@@ -60,20 +60,14 @@ export const Home: React.FC<IResourceComponentsProps> = () => {
|
||||
).length;
|
||||
}, [spoolsResult?.data]);
|
||||
|
||||
// For accurate low stock count, we need all spools
|
||||
// For accurate low stock count, we need all spools with remaining_weight < threshold
|
||||
const { result: lowStockResult } = useList<ISpool>({
|
||||
resource: "spool",
|
||||
pagination: { pageSize: 1000 },
|
||||
filters: [
|
||||
{
|
||||
field: "remaining_weight",
|
||||
operator: "lt",
|
||||
value: LOW_STOCK_THRESHOLD,
|
||||
},
|
||||
],
|
||||
meta: {
|
||||
queryParams: {
|
||||
allow_archived: false,
|
||||
remaining_weight_lt: LOW_STOCK_THRESHOLD,
|
||||
},
|
||||
},
|
||||
});
|
||||
|
||||
@@ -268,6 +268,20 @@ async def find(
|
||||
Optional[bool],
|
||||
Query(title="Needs Weighing", description="Filter by spools that need manual weigh-in."),
|
||||
] = None,
|
||||
remaining_weight_lt: Annotated[
|
||||
Optional[float],
|
||||
Query(
|
||||
title="Remaining Weight Less Than",
|
||||
description="Filter by spools with remaining weight (in grams) less than this value.",
|
||||
),
|
||||
] = None,
|
||||
remaining_weight_gt: Annotated[
|
||||
Optional[float],
|
||||
Query(
|
||||
title="Remaining Weight Greater Than",
|
||||
description="Filter by spools with remaining weight (in grams) greater than this value.",
|
||||
),
|
||||
] = None,
|
||||
sort: Annotated[
|
||||
Optional[str],
|
||||
Query(
|
||||
@@ -313,6 +327,8 @@ async def find(
|
||||
lot_nr=lot_nr,
|
||||
allow_archived=allow_archived,
|
||||
needs_weighing=needs_weighing,
|
||||
remaining_weight_lt=remaining_weight_lt,
|
||||
remaining_weight_gt=remaining_weight_gt,
|
||||
sort_by=sort_by,
|
||||
limit=limit,
|
||||
offset=offset,
|
||||
|
||||
@@ -124,6 +124,8 @@ async def find( # noqa: C901, PLR0912
|
||||
lot_nr: Optional[str] = None,
|
||||
allow_archived: bool = False,
|
||||
needs_weighing: Optional[bool] = None,
|
||||
remaining_weight_lt: Optional[float] = None,
|
||||
remaining_weight_gt: Optional[float] = None,
|
||||
sort_by: Optional[dict[str, SortOrder]] = None,
|
||||
limit: Optional[int] = None,
|
||||
offset: int = 0,
|
||||
@@ -170,6 +172,13 @@ async def find( # noqa: C901, PLR0912
|
||||
),
|
||||
)
|
||||
|
||||
# Filter by remaining_weight (computed as initial_weight - used_weight, falling back to filament.weight)
|
||||
remaining_weight_expr = coalesce(models.Spool.initial_weight, models.Filament.weight) - models.Spool.used_weight
|
||||
if remaining_weight_lt is not None:
|
||||
stmt = stmt.where(remaining_weight_expr < remaining_weight_lt)
|
||||
if remaining_weight_gt is not None:
|
||||
stmt = stmt.where(remaining_weight_expr > remaining_weight_gt)
|
||||
|
||||
total_count = None
|
||||
|
||||
if limit is not None:
|
||||
|
||||
Reference in New Issue
Block a user