@fayz-ai/plugin-inventory 0.20.1 → 0.20.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../src/views/DashboardView.tsx","../src/views/ProductStockTab.tsx","../src/views/ProductBarcodesTab.tsx","../src/views/ProductVariantsTab.tsx","../src/views/productFichas.ts","../src/views/productEntity.tsx","../src/views/ProductListView.tsx","../src/views/useHasMenu.ts","../src/lib/recipe-units.ts","../src/views/recipe/shared.tsx","../src/views/recipe/IngredientCostDialog.tsx","../src/views/recipe/RecipeAiDialog.tsx","../src/views/recipe/TransformIntermediateDialog.tsx","../src/views/recipe/QuickIngredientDialog.tsx","../src/views/recipe/printRecipe.ts","../src/views/recipe/RecipeEditor.tsx","../src/views/ProductRecipeTab.tsx","../src/views/ProductComplementsTab.tsx","../src/views/recipe/GenerateImageDialog.tsx","../src/views/ProductDetailView.tsx","../src/views/ProductCrudForm.tsx","../src/views/StockMovementView.tsx","../src/views/MovementHistoryView.tsx","../src/views/StockPanelView.tsx","../src/views/StockCountsView.tsx","../src/views/StockCountFormView.tsx","../src/views/StockCountSessionView.tsx","../src/views/recipe/exportRecipesXlsx.ts","../src/views/recipe/SelectProductDialog.tsx","../src/views/RecipesView.tsx","../src/views/UsageAuditView.tsx","../src/views/GapScreens.tsx","../src/components/InventoryOnboarding.tsx","../src/views/InventoryPage.tsx"],"names":["jsx","useTranslation","useState","useCallback","useEffect","toast","jsxs","Button","Plus","ConfirmDialog","Card","CardContent","Input","key","hasMinimum","T","useMemo","formatCurrency","useRef","Modal","ModalContent","ModalHeader","ModalTitle","ModalBody","Loader2","ModalFooter","AiActionButton","ModalDescription","Select","SelectTrigger","SelectValue","SelectContent","SelectItem","num","TooltipProvider","Tooltip","TooltipTrigger","TooltipContent","Package","Trash2","Skeleton","seq","norm","Switch","CurrencyInput","Sparkles","X","Upload","React","errorMessage","createIdempotencyKey","SubpageHeader","MOVEMENT_TYPES","createPendingCommand","t","SearchSelect","Fragment","Check","signedQuantity","ArrowDownRight","ArrowUpRight","RefreshCw","ArrowRightLeft","movementTypeSpec","Field","FilterPanel","FilterPanelField","RequiredFilter","FilterMenuRow","DatePicker","Boxes","CircleDashed","MapPin","Layers","DataTable","CrudListView","Textarea","SegmentedControl","Search","cmvPercent","CMV_TONE","cmvBand","Printer","Pencil","CMV_GOOD_THRESHOLD","CMV_ALERT_THRESHOLD","CountedField","summarizeCount","Badge","ListView","ComingSoon"],"mappings":"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","file":"InventoryPage-JLFAXKRO.js","sourcesContent":["import React from 'react'\nimport { DashboardCanvas } from '@fayz-ai/ui'\n\n/**\n * Inventory overview. KPIs and the activity panel are registered dashboard\n * widgets (see ./dashboardWidgets), rendered through the shared DashboardCanvas;\n * the stock-value KPI also surfaces on the global app home.\n */\nexport function DashboardView() {\n return <DashboardCanvas surface=\"plugin-home\" domain=\"inventory\" showHeader={false} className=\"space-y-6\" />\n}\n","import React, { useCallback, useEffect, useMemo, useRef, useState } from 'react'\nimport { Plus, Undo2 } from 'lucide-react'\nimport type { ColumnDef } from '@tanstack/react-table'\nimport { Button, ConfirmDialog, DataTable, StockEntryForm, toast } from '@fayz-ai/ui'\nimport type { StockEntrySubmit } from '@fayz-ai/ui'\nimport { createPendingCommand, useTranslation } from '@fayz-ai/core'\nimport { useInventoryConfig, useInventoryProvider, formatCurrency } from '../context'\nimport type { Product } from '@fayz-ai/inventory/domain/product'\nimport {\n MOVEMENT_TYPES, movementTypeSpec, type CreateStockMovementInput, type StockMovement,\n} from '@fayz-ai/inventory/domain/movement'\nimport { hasMinimum, type StockPosition } from '@fayz-ai/inventory/domain/stock'\nimport { createIdempotencyKey } from '@fayz-ai/inventory/lib/idempotency'\n\nfunction TableSkeleton() {\n return (\n <div className=\"rounded-card border p-4 space-y-2\">\n {[1, 2, 3].map((i) => (\n <div key={i} className=\"h-3.5 rounded bg-muted/30 animate-pulse\" />\n ))}\n </div>\n )\n}\n\nfunction EmptyLine({ message }: { message: string }) {\n return (\n <div className=\"rounded-card border p-8 text-center\">\n <p className=\"text-xs text-muted-foreground\">{message}</p>\n </div>\n )\n}\n\n/**\n * \"How much costela do I have, where, and where did it go\" — answered on the\n * product itself instead of by filtering the global ledger.\n */\nexport function ProductStockTab({ item, onChanged }: { item: Product; onChanged?: () => void }) {\n const t = useTranslation()\n const { currency } = useInventoryConfig()\n const provider = useInventoryProvider()\n\n const [positions, setPositions] = useState<StockPosition[]>([])\n const [movements, setMovements] = useState<StockMovement[]>([])\n const [loading, setLoading] = useState(true)\n const [confirming, setConfirming] = useState(false)\n const [undoing, setUndoing] = useState(false)\n const [entryVerb, setEntryVerb] = useState<string | null>(null)\n const [saving, setSaving] = useState(false)\n const command = useRef(createPendingCommand<CreateStockMovementInput>(() => createIdempotencyKey('inventory:product-movement'), (input) => input.productId))\n const [pending, setPending] = useState(false)\n\n const load = useCallback(async () => {\n setLoading(true)\n try {\n const [pos, history] = await Promise.all([\n provider.getPositions(item.id),\n provider.getMovements({ productId: item.id, pageSize: 100 }),\n ])\n setPositions(pos)\n setMovements(history.data)\n } finally {\n setLoading(false)\n }\n }, [item.id, provider])\n\n useEffect(() => { void load() }, [load])\n\n /**\n * One movement, through the provider — never a direct write.\n *\n * `createMovement` is the plugin's own contract onto `inventory_receive` /\n * `inventory_adjust`: permission-checked, idempotent, and the only thing that\n * keeps the position and the shared balance in step. A form that inserted a\n * row itself would be a second writer of the book this tab is reading.\n */\n const handleEntry = useCallback(async (entry: StockEntrySubmit) => {\n if (command.current.running) return\n setSaving(true)\n setPending(true)\n try {\n await command.current.run({\n productId: item.id,\n movementType: entry.verb as never,\n quantity: entry.quantity,\n ...(entry.reasonCode ? { reason: entry.reasonCode } : {}),\n ...(entry.note ? { notes: entry.note } : {}),\n ...(entry.occurredOn ? { movementDate: entry.occurredOn } : {}),\n }, (input) => provider.createMovement(input))\n setEntryVerb(null)\n try {\n await load()\n onChanged?.()\n } catch {\n toast.warning(t('inventory.stock.refreshAfterCommit'))\n }\n } catch (error) {\n toast.error(t('inventory.productDetail.movementFailed'), {\n description: (error as Error).message,\n })\n } finally {\n setSaving(false)\n setPending(command.current.pending)\n }\n }, [item.id, provider, load, onChanged, t])\n\n\n // Ordered by when it was RECORDED, not by movement date: undoing means taking\n // back the last thing someone typed, which a backdated entry would hide.\n const ordered = useMemo(\n () => [...movements].sort((a, b) => (b.createdAt ?? b.movementDate).localeCompare(a.createdAt ?? a.movementDate)),\n [movements],\n )\n const lastMovement = ordered[0]\n const onHand = useMemo(() => positions.reduce((sum, p) => sum + (p.quantity ?? 0), 0), [positions])\n\n const movementLabel = (m: StockMovement) => {\n const spec = movementTypeSpec(m.movementType)\n return spec ? t(spec.labelKey) : m.movementType\n }\n\n async function handleUndo() {\n if (!lastMovement) return\n setUndoing(true)\n try {\n await provider.reverseMovement(lastMovement.id)\n toast.success(t('inventory.productDetail.undone'))\n await load()\n onChanged?.()\n } catch (err: any) {\n toast.error(t('inventory.productDetail.undoFailed'), { description: err?.message })\n } finally {\n setUndoing(false)\n setConfirming(false)\n }\n }\n\n const positionColumns: ColumnDef<StockPosition, any>[] = useMemo(() => [\n {\n accessorKey: 'stockLocationName', header: t('inventory.stock.locationLabel'),\n cell: ({ getValue }: any) => <span className=\"font-medium\">{(getValue() as string) ?? '—'}</span>,\n },\n {\n accessorKey: 'batchNumber', header: t('inventory.stock.batchNumber'),\n cell: ({ getValue }: any) => <span className=\"text-xs text-muted-foreground\">{(getValue() as string) || '—'}</span>,\n },\n {\n accessorKey: 'expirationDate', header: t('inventory.stock.expirationDate'),\n cell: ({ getValue }: any) => <span className=\"text-xs text-muted-foreground\">{(getValue() as string) || '—'}</span>,\n },\n {\n accessorKey: 'unitCost', header: () => <span className=\"block text-right\">{t('inventory.stock.unitCostLabel')}</span>,\n cell: ({ getValue }: any) => <span className=\"block text-right text-muted-foreground\">{formatCurrency(Number(getValue()) || 0, currency)}</span>,\n },\n {\n accessorKey: 'quantity', header: () => <span className=\"block text-right\">{t('inventory.stock.quantityLabel')}</span>,\n cell: ({ getValue }: any) => <span className=\"block text-right font-medium tabular-nums\">{getValue() as number}</span>,\n },\n {\n id: 'total', header: () => <span className=\"block text-right\">{t('inventory.stock.totalCost')}</span>,\n cell: ({ row }: any) => (\n <span className=\"block text-right tabular-nums\">\n {formatCurrency((row.original.quantity ?? 0) * (row.original.unitCost ?? 0), currency)}\n </span>\n ),\n },\n ], [currency, t])\n\n const movementColumns: ColumnDef<StockMovement, any>[] = useMemo(() => [\n {\n accessorKey: 'movementDate', header: t('inventory.history.columnDate'),\n cell: ({ getValue }: any) => <span className=\"text-xs text-muted-foreground\">{getValue() as string}</span>,\n },\n {\n accessorKey: 'movementType', header: t('inventory.history.columnType'),\n cell: ({ row }: any) => <span className=\"text-xs\">{movementLabel(row.original)}</span>,\n },\n {\n accessorKey: 'stockLocationName', header: t('inventory.history.columnLocation'),\n cell: ({ row }: any) => (\n <span className=\"text-xs text-muted-foreground\">\n {row.original.stockLocationName ?? '—'}\n {row.original.movementType === 'transfer' && row.original.destinationLocationName && (\n <span> → {row.original.destinationLocationName}</span>\n )}\n </span>\n ),\n },\n {\n accessorKey: 'quantity', header: () => <span className=\"block text-right\">{t('inventory.history.columnQty')}</span>,\n cell: ({ row }: any) => (\n <span className=\"block text-right tabular-nums\">\n {/* The ledger's own sign, not a guess from the verb. A movement\n already carries its direction in `quantity` (an `out` is\n negative), and mapping the verb instead printed every `in` from\n the ledger as a minus — the history read as if a receipt had\n removed stock. */}\n {row.original.quantity > 0 ? '+' : ''}{row.original.quantity}\n </span>\n ),\n },\n {\n accessorKey: 'totalCost', header: () => <span className=\"block text-right\">{t('inventory.history.columnTotal')}</span>,\n cell: ({ getValue }: any) => <span className=\"block text-right text-muted-foreground\">{formatCurrency(Number(getValue()) || 0, currency)}</span>,\n },\n ], [currency, t])\n\n if (loading) return <TableSkeleton />\n\n return (\n <div className=\"space-y-6\">\n <section className=\"space-y-2\">\n <div className=\"flex items-baseline justify-between gap-3\">\n <h3 className=\"text-sm font-semibold text-foreground\">{t('inventory.productDetail.positionsTitle')}</h3>\n <div className=\"flex items-center gap-3\">\n <p className=\"text-xs text-muted-foreground\">\n {t('inventory.productDetail.onHand')} <span className=\"font-medium text-foreground tabular-nums\">{onHand}</span>\n </p>\n {hasMinimum(item.minQuantity) && (\n <p className=\"text-xs text-muted-foreground\">\n {t('inventory.productDetail.minimum')}: <span className=\"font-medium text-foreground tabular-nums\">{item.minQuantity}</span>\n </p>\n )}\n {/* The tab could show a balance and not change it: entries happened\n on the global ledger screen, so \"how much do I have\" and \"I just\n received ten\" were two different places. Entrada opens chosen —\n it is the one a receiving screen is for. */}\n <Button size=\"sm\" onClick={() => setEntryVerb('entry')}>\n <Plus className=\"mr-1.5 h-3.5 w-3.5\" />\n {t('inventory.productDetail.newMovement')}\n </Button>\n </div>\n </div>\n {positions.length === 0\n ? <EmptyLine message={t('inventory.productDetail.noPositions')} />\n : <DataTable columns={positionColumns} data={positions} variant=\"card\" />}\n </section>\n\n <section className=\"space-y-2\">\n <div className=\"flex items-center justify-between\">\n <h3 className=\"text-sm font-semibold text-foreground\">{t('inventory.productDetail.historyTitle')}</h3>\n {lastMovement && (\n <Button\n variant=\"outline\"\n size=\"sm\"\n className=\"text-destructive hover:text-destructive\"\n onClick={() => setConfirming(true)}\n >\n <Undo2 className=\"mr-1.5 h-3.5 w-3.5\" />\n {t('inventory.productDetail.undoLast')}\n </Button>\n )}\n </div>\n {ordered.length === 0\n ? <EmptyLine message={t('inventory.history.noMovements')} />\n : <DataTable columns={movementColumns} data={ordered} variant=\"card\" />}\n </section>\n\n {/* The same form the shop's Posições tab opens — one component in\n @fayz-ai/ui, two plugins, so the reason picker and the running balance\n cannot drift apart. Each writes through its own contract: this one\n through the inventory provider, which is the ledger that owns the\n concept. */}\n <StockEntryForm\n verb={entryVerb}\n onVerbChange={(verb) => { if (!command.current.pending) setEntryVerb(verb) }}\n onClose={() => { if (!command.current.pending) setEntryVerb(null) }}\n verbs={MOVEMENT_TYPES.map((m) => ({\n value: m.value,\n label: t(m.labelKey),\n effect: m.effect,\n }))}\n available={onHand}\n saving={saving}\n readOnly={pending}\n notice={pending ? t('inventory.stock.pendingRetry') : undefined}\n onSubmit={(entry: StockEntrySubmit) => void handleEntry(entry)}\n labels={{\n title: t('inventory.productDetail.newMovement'),\n quantity: t('inventory.history.columnQty'),\n }}\n />\n\n <ConfirmDialog\n open={confirming}\n variant=\"destructive\"\n title={t('inventory.productDetail.undoTitle')}\n description={lastMovement ? t('inventory.productDetail.undoDescription', {\n type: movementLabel(lastMovement),\n quantity: String(lastMovement.quantity),\n date: lastMovement.movementDate,\n }) : undefined}\n confirmLabel={t('inventory.productDetail.undoConfirm')}\n cancelLabel={t('inventory.productForm.cancel')}\n loading={undoing}\n onConfirm={() => void handleUndo()}\n onCancel={() => setConfirming(false)}\n />\n </div>\n )\n}\n","import React, { useCallback, useEffect, useState } from 'react'\nimport { Star, Trash2, Plus } from 'lucide-react'\nimport {\n Button, Card, CardContent, ConfirmDialog, Input, toast,\n Select, SelectTrigger, SelectValue, SelectContent, SelectItem,\n Tooltip, TooltipTrigger, TooltipContent, TooltipProvider,\n} from '@fayz-ai/ui'\nimport { useTranslation } from '@fayz-ai/core'\nimport { useInventoryProvider } from '../context'\nimport type { Product, ProductBarcode } from '@fayz-ai/inventory/domain/product'\n\n// ---------------------------------------------------------------------------\n// Códigos de Barras — a aba que o V1 mostra em TODO produto já salvo.\n//\n// Um código só não serve ao balcão: a mesma mercadoria chega em embalagem de\n// 500 ml e de 1 L, com códigos diferentes, e quem bipa não escolhe qual. O\n// PRINCIPAL é o que a etiqueta imprime, e é único por produto — o banco\n// garante com índice, a tela mostra com a estrela.\n// ---------------------------------------------------------------------------\n\nconst TYPES = ['EAN-13', 'EAN-8', 'UPC-A', 'CODE-128', 'CODE-39', 'DUN-14', 'Interno']\n\nfunction RowSkeleton() {\n return (\n <div className=\"space-y-2\">\n {[1, 2].map((i) => <div key={i} className=\"h-10 rounded bg-muted/30 animate-pulse\" />)}\n </div>\n )\n}\n\nexport function ProductBarcodesTab({ item }: { item: Product }) {\n const t = useTranslation()\n const provider = useInventoryProvider()\n const productId = item?.id\n\n const [rows, setRows] = useState<ProductBarcode[] | null>(null)\n const [code, setCode] = useState('')\n const [type, setType] = useState(TYPES[0])\n const [description, setDescription] = useState('')\n const [saving, setSaving] = useState(false)\n const [removing, setRemoving] = useState<ProductBarcode | null>(null)\n\n const load = useCallback(async () => {\n if (!productId || !provider.getProductBarcodes) { setRows([]); return }\n setRows(await provider.getProductBarcodes(productId))\n }, [productId, provider])\n\n useEffect(() => { void load() }, [load])\n\n // Sem o provider a aba não promete o que não entrega.\n if (!provider.addProductBarcode) {\n return (\n <Card>\n <CardContent className=\"p-8 text-center\">\n <p className=\"text-xs text-muted-foreground\">{t('inventory.barcodes.unavailable')}</p>\n </CardContent>\n </Card>\n )\n }\n\n async function add() {\n const value = code.trim()\n if (!value || !productId) return\n // O mesmo código em dois produtos é uma venda errada no balcão, e o banco\n // recusa com índice único — a mensagem tem de dizer isso, não \"erro\".\n if ((rows ?? []).some((r) => r.barcode === value)) {\n toast.error(t('inventory.barcodes.duplicate'))\n return\n }\n setSaving(true)\n try {\n await provider.addProductBarcode!(productId, { barcode: value, barcodeType: type, description })\n setCode(''); setDescription('')\n await load()\n } catch (error) {\n toast.error(t('inventory.barcodes.duplicate'), { description: String((error as Error)?.message ?? '') })\n } finally {\n setSaving(false)\n }\n }\n\n async function makePrimary(row: ProductBarcode) {\n if (!productId || !row.id || row.isPrimary) return\n await provider.setPrimaryProductBarcode?.(productId, row.id)\n await load()\n }\n\n async function remove() {\n const row = removing\n setRemoving(null)\n if (!row?.id) return\n await provider.removeProductBarcode?.(row.id)\n await load()\n }\n\n return (\n // Não há `TooltipProvider` global: cada consumidor embrulha o seu.\n <TooltipProvider delayDuration={300}>\n <div className=\"space-y-5\">\n <Card>\n <CardContent className=\"pt-4\">\n <div className=\"fz-fields fz-fields-3\">\n <div>\n <label className=\"mb-1 block text-xs font-medium\">{t('inventory.barcodes.code')}</label>\n <Input\n value={code}\n onChange={(e) => setCode(e.target.value)}\n placeholder={t('inventory.barcodes.codePlaceholder')}\n // Um leitor de código de barras digita e manda Enter. Sem isto a\n // pessoa bipa, nada acontece, e ela procura o botão com o leitor\n // na mão.\n onKeyDown={(e) => { if (e.key === 'Enter') { e.preventDefault(); void add() } }}\n />\n </div>\n <div>\n <label className=\"mb-1 block text-xs font-medium\">{t('inventory.barcodes.type')}</label>\n <Select value={type} onValueChange={setType}>\n <SelectTrigger><SelectValue /></SelectTrigger>\n <SelectContent>\n {TYPES.map((v) => <SelectItem key={v} value={v}>{v}</SelectItem>)}\n </SelectContent>\n </Select>\n </div>\n <div>\n <label className=\"mb-1 block text-xs font-medium\">{t('inventory.barcodes.description')}</label>\n <Input\n value={description}\n onChange={(e) => setDescription(e.target.value)}\n placeholder={t('inventory.barcodes.descriptionPlaceholder')}\n />\n </div>\n </div>\n <div className=\"mt-3 flex justify-end\">\n {/* Ação bloqueada DIZ o que falta, em vez de um botão morto. */}\n <Tooltip>\n <TooltipTrigger asChild>\n <span>\n <Button onClick={() => void add()} disabled={!code.trim() || saving}>\n <Plus className=\"mr-1.5 h-3.5 w-3.5\" />\n {t('common.add')}\n </Button>\n </span>\n </TooltipTrigger>\n {!code.trim() && <TooltipContent>{t('inventory.barcodes.needCode')}</TooltipContent>}\n </Tooltip>\n </div>\n </CardContent>\n </Card>\n\n {rows === null && <RowSkeleton />}\n\n {rows !== null && rows.length === 0 && (\n <Card>\n <CardContent className=\"p-8 text-center\">\n <p className=\"text-xs text-muted-foreground\">{t('inventory.barcodes.empty')}</p>\n </CardContent>\n </Card>\n )}\n\n {rows !== null && rows.length > 0 && (\n <Card>\n <CardContent className=\"p-0\">\n <ul className=\"divide-y\">\n {rows.map((row) => (\n <li key={row.id} className=\"flex items-center gap-3 px-4 py-3\">\n <Tooltip>\n <TooltipTrigger asChild>\n <Button variant=\"bare\" size=\"bare\"\n type=\"button\"\n aria-label={row.isPrimary ? t('inventory.barcodes.isPrimary') : t('inventory.barcodes.makePrimary')}\n onClick={() => void makePrimary(row)}\n className=\"shrink-0 rounded p-1 hover:bg-muted\"\n >\n <Star className={`h-4 w-4 ${row.isPrimary ? 'fill-primary text-primary' : 'text-muted-foreground'}`} />\n </Button>\n </TooltipTrigger>\n <TooltipContent>\n {row.isPrimary ? t('inventory.barcodes.isPrimary') : t('inventory.barcodes.makePrimary')}\n </TooltipContent>\n </Tooltip>\n <div className=\"min-w-0 flex-1\">\n <p className=\"font-mono text-sm\">{row.barcode}</p>\n {(row.description || row.barcodeType) && (\n <p className=\"truncate text-xs text-muted-foreground\">\n {[row.barcodeType, row.description].filter(Boolean).join(' · ')}\n </p>\n )}\n </div>\n <Tooltip>\n <TooltipTrigger asChild>\n <Button variant=\"bare\" size=\"bare\"\n type=\"button\"\n aria-label={t('common.delete')}\n onClick={() => setRemoving(row)}\n className=\"shrink-0 rounded p-1 text-muted-foreground hover:bg-muted hover:text-destructive\"\n >\n <Trash2 className=\"h-4 w-4\" />\n </Button>\n </TooltipTrigger>\n <TooltipContent>{t('common.delete')}</TooltipContent>\n </Tooltip>\n </li>\n ))}\n </ul>\n </CardContent>\n </Card>\n )}\n\n <ConfirmDialog\n open={!!removing}\n onCancel={() => setRemoving(null)}\n title={t('inventory.barcodes.removeTitle')}\n description={removing?.barcode}\n confirmLabel={t('common.delete')}\n variant=\"destructive\"\n onConfirm={() => void remove()}\n />\n </div>\n </TooltipProvider>\n )\n}\n","import React, { useCallback, useEffect, useState } from 'react'\nimport { Plus } from 'lucide-react'\nimport { Badge, Button, Card, CardContent, Input, Skeleton, Switch, toast } from '@fayz-ai/ui'\nimport { useTranslation } from '@fayz-ai/core'\nimport { useInventoryProvider } from '../context'\nimport type { Product, ProductVariant } from '@fayz-ai/inventory/domain/product'\n\n// Same shape as the loaded list (name, count, switch), so nothing jumps when the rows arrive.\nfunction ListSkeleton() {\n return (\n <Card>\n <CardContent className=\"p-0\">\n <ul className=\"divide-y\" aria-busy=\"true\">\n {[28, 16, 20].map((width, i) => (\n <li key={i} className=\"flex items-center gap-3 px-4 py-3\">\n <Skeleton className=\"h-4\" style={{ width: `${width}%` }} />\n <span className=\"flex-1\" />\n <Skeleton className=\"h-4 w-24\" />\n <Skeleton className=\"h-5 w-9 rounded-full\" />\n </li>\n ))}\n </ul>\n </CardContent>\n </Card>\n )\n}\n\n/** Sizes and colours of one product. Each keeps its own stock balance; cost stays on the product. */\nexport function ProductVariantsTab({ item }: { item: Product }) {\n const t = useTranslation()\n const provider = useInventoryProvider()\n const productId = item?.id\n\n const [rows, setRows] = useState<ProductVariant[] | null>(null)\n const [name, setName] = useState('')\n const [sku, setSku] = useState('')\n const [saving, setSaving] = useState(false)\n\n const load = useCallback(async () => {\n if (!productId || !provider.getProductVariants) { setRows([]); return }\n // A failed read must not leave the skeleton up forever.\n try {\n setRows(await provider.getProductVariants(productId))\n } catch (error) {\n setRows([])\n toast.error(t('inventory.variants.loadFailed'), { description: String((error as Error)?.message ?? '') })\n }\n }, [productId, provider, t])\n\n useEffect(() => { void load() }, [load])\n\n if (!provider.addProductVariant) {\n return (\n <Card>\n <CardContent className=\"p-8 text-center\">\n <p className=\"text-xs text-muted-foreground\">{t('inventory.variants.unavailable')}</p>\n </CardContent>\n </Card>\n )\n }\n\n async function add() {\n const value = name.trim()\n if (!value || !productId) return\n if ((rows ?? []).some((r) => r.name.trim().toLowerCase() === value.toLowerCase())) {\n toast.error(t('inventory.variants.duplicate'))\n return\n }\n setSaving(true)\n try {\n await provider.addProductVariant!(productId, { name: value, sku })\n setName(''); setSku('')\n await load()\n } catch (error) {\n toast.error(t('inventory.variants.saveFailed'), { description: String((error as Error)?.message ?? '') })\n } finally {\n setSaving(false)\n }\n }\n\n async function toggle(row: ProductVariant, active: boolean) {\n setRows((prev) => (prev ?? []).map((r) => (r.id === row.id ? { ...r, isActive: active } : r)))\n try {\n await provider.setProductVariantActive?.(row.id, active)\n } catch (error) {\n toast.error(t('inventory.variants.saveFailed'), { description: String((error as Error)?.message ?? '') })\n await load()\n }\n }\n\n // The default variant stands in for a product with no sizes. Once it has\n // real ones it is only worth a row while stock still sits on it.\n const sized = (rows ?? []).some((r) => !r.isDefault)\n const shown = (rows ?? []).filter((r) => !r.isDefault || !sized || r.onHand !== 0)\n\n return (\n <div className=\"space-y-5\">\n <Card>\n <CardContent className=\"pt-4\">\n <div className=\"fz-fields fz-fields-3\">\n <div>\n <label className=\"mb-1 block text-xs font-medium\">{t('inventory.variants.name')}</label>\n <Input\n value={name}\n onChange={(e) => setName(e.target.value)}\n placeholder={t('inventory.variants.namePlaceholder')}\n onKeyDown={(e) => { if (e.key === 'Enter') { e.preventDefault(); void add() } }}\n />\n </div>\n <div>\n <label className=\"mb-1 block text-xs font-medium\">{t('inventory.variants.sku')}</label>\n <Input value={sku} onChange={(e) => setSku(e.target.value)} placeholder={t('inventory.variants.skuPlaceholder')} />\n </div>\n <div className=\"flex items-end justify-end\">\n <Button onClick={() => void add()} disabled={!name.trim() || saving}>\n <Plus className=\"mr-1.5 h-3.5 w-3.5\" />\n {t('common.add')}\n </Button>\n </div>\n </div>\n </CardContent>\n </Card>\n\n {rows === null && <ListSkeleton />}\n\n {rows !== null && shown.length === 0 && (\n <Card>\n <CardContent className=\"p-8 text-center\">\n <p className=\"text-xs text-muted-foreground\">{t('inventory.variants.empty')}</p>\n </CardContent>\n </Card>\n )}\n\n {rows !== null && shown.length > 0 && (\n <Card>\n <CardContent className=\"p-0\">\n <ul className=\"divide-y\">\n {shown.map((row) => (\n <li key={row.id} className=\"flex items-center gap-3 px-4 py-3\">\n <div className=\"min-w-0 flex-1\">\n <p className={`flex items-center gap-2 text-sm font-medium ${row.isActive ? '' : 'text-muted-foreground line-through'}`}>\n <span className=\"truncate\">{row.name}</span>\n {row.isDefault && row.name.trim() !== t('inventory.variants.default') && (\n <Badge variant=\"secondary\" className=\"shrink-0\">{t('inventory.variants.default')}</Badge>\n )}\n </p>\n {row.sku && <p className=\"truncate font-mono text-xs text-muted-foreground\">{row.sku}</p>}\n </div>\n <span className=\"shrink-0 text-sm tabular-nums text-muted-foreground\">\n {t('inventory.variants.onHand', { count: row.onHand.toLocaleString('pt-BR') })}\n </span>\n <Switch checked={row.isActive} onCheckedChange={(v) => void toggle(row, v)} aria-label={t('common.active')} />\n </li>\n ))}\n </ul>\n </CardContent>\n </Card>\n )}\n </div>\n )\n}\n","import type { FieldDef, FieldGroup } from '@fayz-ai/core'\nimport type { InventoryCurrency } from '../context'\nimport { T } from '@fayz-ai/inventory/data/tables'\n\n// ---------------------------------------------------------------------------\n// As FICHAS do produto — as abas que nascem de um interruptor.\n//\n// Cada interruptor da Classificação abre uma ABA, como no V1 e com o mesmo\n// nome. A condição mora em `visibleWhen`, campo a campo: quando todos os\n// campos de um grupo se escondem, o grupo não se desenha (`FormGroup` devolve\n// `null`) e a aba inteira some junto, porque `CrudFormPage` não oferece aba\n// vazia — um rótulo que o clique não cumpre é pior que rótulo nenhum.\n//\n// Os vocabulários fiscais são os do V1, valor por valor — um CST ou um CFOP\n// que não bata com o da nota é uma nota rejeitada na SEFAZ, não um rótulo\n// diferente.\n// ---------------------------------------------------------------------------\n\ntype T9n = (key: string, params?: Record<string, string | number>) => string\n\nconst yes = (key: string) => (vals: Record<string, unknown>) => vals[key] === true\n\n/** Os canais do V1. Texto livre no banco: cada praça tem o seu aplicativo. */\nexport const SALE_CHANNELS = [\n { key: 'counter', label: 'Balcão' },\n { key: 'delivery', label: 'Delivery Próprio' },\n { key: 'ifood', label: 'iFood' },\n { key: '99food', label: '99Food' },\n { key: 'keeta', label: 'Keeta' },\n] as const\n\nexport const channelFieldKey = (channel: string) => `saleChannel_${channel}`\n\nconst ICMS_ORIGINS = [\n { value: '0', label: '0 — Nacional' },\n { value: '1', label: '1 — Estrangeira (importação direta)' },\n { value: '2', label: '2 — Estrangeira (adquirida no mercado interno)' },\n { value: '3', label: '3 — Nacional com conteúdo de importação > 40%' },\n { value: '4', label: '4 — Nacional (processos produtivos básicos)' },\n { value: '5', label: '5 — Nacional com conteúdo de importação ≤ 40%' },\n { value: '6', label: '6 — Estrangeira (importação direta, sem similar)' },\n { value: '7', label: '7 — Estrangeira (adquirida internamente, sem similar)' },\n { value: '8', label: '8 — Nacional com conteúdo de importação > 70%' },\n]\n\nconst CST_OPTIONS = [\n { value: '00', label: '00 — Tributada integralmente' },\n { value: '10', label: '10 — Tributada com cobrança de ICMS por ST' },\n { value: '20', label: '20 — Com redução de base de cálculo' },\n { value: '30', label: '30 — Isenta/não tributada com cobrança de ICMS por ST' },\n { value: '40', label: '40 — Isenta' },\n { value: '41', label: '41 — Não tributada' },\n { value: '50', label: '50 — Suspensão' },\n { value: '51', label: '51 — Diferimento' },\n { value: '60', label: '60 — ICMS cobrado anteriormente por ST' },\n { value: '70', label: '70 — Com redução de BC e cobrança de ICMS por ST' },\n { value: '90', label: '90 — Outras' },\n]\n\nconst CFOP_OPTIONS = [\n { value: '5101', label: '5101 — Venda de produção do estabelecimento' },\n { value: '5102', label: '5102 — Venda de mercadoria adquirida' },\n { value: '5103', label: '5103 — Venda de produção, efetuada fora do estabelecimento' },\n { value: '5104', label: '5104 — Venda de mercadoria adquirida, efetuada fora do estabelecimento' },\n { value: '5405', label: '5405 — Venda de mercadoria adquirida com ST' },\n { value: '5949', label: '5949 — Outra saída não especificada' },\n { value: '6101', label: '6101 — Venda de produção (interestadual)' },\n { value: '6102', label: '6102 — Venda de mercadoria adquirida (interestadual)' },\n]\n\nconst PIS_COFINS_OPTIONS = [\n { value: '01', label: '01 — Operação tributável (alíquota normal)' },\n { value: '02', label: '02 — Operação tributável (alíquota diferenciada)' },\n { value: '04', label: '04 — Operação tributável (ST)' },\n { value: '05', label: '05 — Operação tributável (alíquota por unidade)' },\n { value: '06', label: '06 — Operação tributável (alíquota zero)' },\n { value: '07', label: '07 — Operação isenta da contribuição' },\n { value: '08', label: '08 — Operação sem incidência da contribuição' },\n { value: '09', label: '09 — Operação com suspensão da contribuição' },\n { value: '49', label: '49 — Outras operações de saída' },\n { value: '99', label: '99 — Outras operações' },\n]\n\nconst BASE_CALC_OPTIONS = [\n { value: '0', label: '0 — Margem de Valor Agregado (%)' },\n { value: '1', label: '1 — Pauta (valor)' },\n { value: '2', label: '2 — Preço tabelado máximo (valor)' },\n { value: '3', label: '3 — Valor da operação' },\n]\n\nconst ASSET_STATUS_OPTIONS = [\n { value: 'active', label: 'Ativo' },\n { value: 'maintenance', label: 'Em manutenção' },\n { value: 'disposed', label: 'Baixado' },\n { value: 'lost', label: 'Extraviado' },\n]\n\n/**\n * Os sete interruptores e as duas travas de entrada — a seção que decide quais\n * outras existem. Fica numa coluna só porque cada linha é um interruptor com\n * uma explicação, e três por linha espremem a explicação a ponto de ela sumir.\n */\nexport function classificationFields(t: T9n, currency: InventoryCurrency, hasRecipes = true): FieldDef[] {\n const flag = (key: string, label: string, hint: string): FieldDef => ({\n key, label, hint, type: 'boolean', group: 'classification', defaultValue: false, showInTable: false,\n })\n return [\n flag('isIngredient', t('inventory.productForm.flagIngredient'), t('inventory.productForm.flagIngredientHint')),\n flag('isForSale', t('inventory.productForm.flagForSale'), t('inventory.productForm.flagForSaleHint')),\n ...(hasRecipes ? [flag('isIntermediate', t('inventory.productForm.flagIntermediate'), t('inventory.productForm.flagIntermediateHint'))] : []),\n flag('isAsset', t('inventory.productForm.flagAsset'), t('inventory.productForm.flagAssetHint')),\n ...(hasRecipes ? [flag('isProduced', t('inventory.productForm.flagProduced'), t('inventory.productForm.flagProducedHint'))] : []),\n flag('isResale', t('inventory.productForm.flagResale'), t('inventory.productForm.flagResaleHint')),\n flag('trackByUnitLabel', t('inventory.productForm.flagTracked'), t('inventory.productForm.flagTrackedHint')),\n\n {\n key: 'professionalResalePrice', label: t('inventory.productForm.professionalResalePrice'), type: 'currency',\n group: 'classification', showInTable: false,\n currency: currency.code, currencySymbol: currency.symbol, currencyLocale: currency.locale,\n hint: t('inventory.productForm.professionalResalePriceHint'),\n visibleWhen: yes('isResale'),\n },\n\n // A trava vale para QUALQUER produto — revenda também tem lote e validade.\n // No V1 ela vivia escondida na aba Insumo e estava ligada em zero dos 221\n // produtos ativos: a trava existia e ninguém a encontrava.\n flag('requireBatchForStock', t('inventory.productForm.requireBatch'), t('inventory.productForm.requireBatchHint')),\n flag('requireExpiryForStock', t('inventory.productForm.requireExpiry'), t('inventory.productForm.requireExpiryHint')),\n ]\n}\n\n/** Embalagem e conversões — como a casa compra versus como ela conta. */\nexport function packagingFields(t: T9n): FieldDef[] {\n return [\n {\n key: 'contentPerUnit', label: t('inventory.productForm.contentPerUnit'), type: 'number',\n group: 'packaging', min: 0, placeholder: '300', showInTable: false,\n hint: t('inventory.productForm.contentPerUnitHint'),\n },\n {\n key: 'contentUnitId', label: t('inventory.productForm.contentUnit'), type: 'relation',\n group: 'packaging', relation: { table: T.measurementUnits, labelField: 'abbreviation' },\n placeholder: t('inventory.productForm.optional'), showInTable: false,\n },\n {\n key: 'purchaseUnitId', label: t('inventory.productForm.purchaseUnit'), type: 'relation',\n group: 'packaging', relation: { table: T.measurementUnits, labelField: 'abbreviation' },\n placeholder: t('inventory.productForm.optional'), showInTable: false,\n },\n {\n key: 'conversionFactor', label: t('inventory.productForm.conversionFactor'), type: 'number',\n group: 'packaging', min: 0, placeholder: '1', showInTable: false,\n hint: t('inventory.productForm.conversionFactorHint'),\n },\n ]\n}\n\n/** A ficha do insumo: o que a COMPRA precisa saber. */\nexport function ingredientFields(t: T9n): FieldDef[] {\n const when = yes('isIngredient')\n return [\n {\n key: 'ingReorderPoint', label: t('inventory.productForm.ingReorderPoint'), type: 'number', group: 'ingredient', min: 0,\n // O mínimo é o que não se pode furar; este é o aviso que ainda chega a\n // tempo de comprar. Sem a frase, os dois campos parecem o mesmo.\n hint: t('inventory.productForm.ingReorderPointHint'),\n placeholder: t('inventory.productForm.optional'), visibleWhen: when, showInTable: false,\n },\n { key: 'ingLeadTimeDays', label: t('inventory.productForm.ingLeadTime'), type: 'number', group: 'ingredient', min: 0, placeholder: t('inventory.productForm.optional'), visibleWhen: when, showInTable: false },\n { key: 'ingShelfLifeDays', label: t('inventory.productForm.ingShelfLife'), type: 'number', group: 'ingredient', min: 0, placeholder: t('inventory.productForm.optional'), visibleWhen: when, showInTable: false },\n { key: 'ingStorageTemperature', label: t('inventory.productForm.ingStorageTemp'), type: 'text', group: 'ingredient', placeholder: '2°C a 8°C', visibleWhen: when, showInTable: false },\n { key: 'ingNotes', label: t('inventory.productForm.notes'), type: 'textarea', group: 'ingredient', span: 2, visibleWhen: when, showInTable: false },\n ]\n}\n\n/** A ficha de venda: o que o cardápio e o balcão precisam saber. */\nexport function saleFields(t: T9n, currency: InventoryCurrency): FieldDef[] {\n const when = yes('isForSale')\n const channels: FieldDef[] = SALE_CHANNELS.map((ch) => ({\n key: channelFieldKey(ch.key),\n label: ch.label,\n type: 'currency',\n group: 'saleChannels',\n currency: currency.code, currencySymbol: currency.symbol, currencyLocale: currency.locale,\n visibleWhen: when,\n showInTable: false,\n }))\n return [\n { key: 'salePreparationTime', label: t('inventory.productForm.salePrepTime'), type: 'number', group: 'sale', min: 0, placeholder: '15', visibleWhen: when, showInTable: false },\n { key: 'saleServesQuantity', label: t('inventory.productForm.saleServes'), type: 'number', group: 'sale', min: 0, placeholder: '2', visibleWhen: when, showInTable: false },\n { key: 'saleCalories', label: t('inventory.productForm.saleCalories'), type: 'number', group: 'sale', min: 0, placeholder: '350', visibleWhen: when, showInTable: false },\n { key: 'saleMenuDescription', label: t('inventory.productForm.saleMenuDescription'), type: 'textarea', group: 'sale', span: 2, visibleWhen: when, showInTable: false },\n { key: 'saleAllergens', label: t('inventory.productForm.saleAllergens'), type: 'text', group: 'sale', span: 2, placeholder: t('inventory.productForm.saleAllergensPlaceholder'), visibleWhen: when, showInTable: false },\n { key: 'saleSoldByWeight', label: t('inventory.productForm.saleSoldByWeight'), type: 'boolean', group: 'sale', visibleWhen: when, showInTable: false },\n { key: 'saleHighlightDelivery', label: t('inventory.productForm.saleHighlightDelivery'), type: 'boolean', group: 'sale', visibleWhen: when, showInTable: false },\n { key: 'saleAvailableForDelivery', label: t('inventory.productForm.saleAvailableDelivery'), type: 'boolean', group: 'sale', defaultValue: true, visibleWhen: when, showInTable: false },\n { key: 'saleAvailableForCounter', label: t('inventory.productForm.saleAvailableCounter'), type: 'boolean', group: 'sale', defaultValue: true, visibleWhen: when, showInTable: false },\n { key: 'saleNotes', label: t('inventory.productForm.notes'), type: 'textarea', group: 'sale', span: 2, visibleWhen: when, showInTable: false },\n ...channels,\n ]\n}\n\nexport function intermediateFields(t: T9n): FieldDef[] {\n const when = yes('isIntermediate')\n return [\n { key: 'intYieldPercentage', label: t('inventory.productForm.intYield'), type: 'number', group: 'intermediate', min: 0, max: 100, placeholder: '85', visibleWhen: when, showInTable: false },\n { key: 'intPreparationTime', label: t('inventory.productForm.intPrepTime'), type: 'number', group: 'intermediate', min: 0, placeholder: '30', visibleWhen: when, showInTable: false },\n { key: 'intShelfLifeHours', label: t('inventory.productForm.intShelfLifeHours'), type: 'number', group: 'intermediate', min: 0, placeholder: '48', visibleWhen: when, showInTable: false },\n { key: 'intBatchSize', label: t('inventory.productForm.intBatchSize'), type: 'number', group: 'intermediate', min: 0, placeholder: '5', visibleWhen: when, showInTable: false },\n {\n key: 'intBatchUnitId', label: t('inventory.productForm.intBatchUnit'), type: 'relation', group: 'intermediate',\n relation: { table: T.measurementUnits, labelField: 'abbreviation' },\n placeholder: t('inventory.productForm.optional'), visibleWhen: when, showInTable: false,\n },\n { key: 'intStorageInstructions', label: t('inventory.productForm.intStorage'), type: 'textarea', group: 'intermediate', span: 2, visibleWhen: when, showInTable: false },\n { key: 'intNotes', label: t('inventory.productForm.notes'), type: 'textarea', group: 'intermediate', span: 2, visibleWhen: when, showInTable: false },\n ]\n}\n\nexport function assetFields(t: T9n, currency: InventoryCurrency): FieldDef[] {\n const when = yes('isAsset')\n const money = (key: string, label: string): FieldDef => ({\n key, label, type: 'currency', group: 'asset',\n currency: currency.code, currencySymbol: currency.symbol, currencyLocale: currency.locale,\n visibleWhen: when, showInTable: false,\n })\n return [\n money('assetValue', t('inventory.productForm.assetValue')),\n money('assetResidualValue', t('inventory.productForm.assetResidualValue')),\n { key: 'assetUsefulLifeMonths', label: t('inventory.productForm.assetUsefulLife'), type: 'number', group: 'asset', min: 0, placeholder: '60', visibleWhen: when, showInTable: false },\n { key: 'assetDepreciationRate', label: t('inventory.productForm.assetDepreciation'), type: 'number', group: 'asset', min: 0, max: 100, placeholder: '20', visibleWhen: when, showInTable: false },\n { key: 'assetSerialNumber', label: t('inventory.productForm.assetSerial'), type: 'text', group: 'asset', visibleWhen: when, showInTable: false },\n { key: 'assetAcquisitionDate', label: t('inventory.productForm.assetAcquisition'), type: 'date', group: 'asset', visibleWhen: when, showInTable: false },\n { key: 'assetWarrantyExpiryDate', label: t('inventory.productForm.assetWarranty'), type: 'date', group: 'asset', visibleWhen: when, showInTable: false },\n { key: 'assetStatus', label: t('inventory.productForm.assetStatus'), type: 'select', group: 'asset', options: ASSET_STATUS_OPTIONS, defaultValue: 'active', visibleWhen: when, showInTable: false },\n { key: 'assetLocation', label: t('inventory.productForm.assetLocation'), type: 'text', group: 'asset', placeholder: t('inventory.productForm.assetLocationPlaceholder'), visibleWhen: when, showInTable: false },\n {\n // Responsável é uma PESSOA do cadastro, não um nome digitado: é quem\n // responde pelo equipamento quando ele some.\n key: 'assetResponsiblePersonId', label: t('inventory.productForm.assetResponsible'), type: 'relation', group: 'asset',\n relation: { table: 'people', labelField: 'name' },\n placeholder: t('inventory.productForm.optional'), visibleWhen: when, showInTable: false,\n },\n { key: 'assetInsurancePolicy', label: t('inventory.productForm.assetInsurance'), type: 'text', group: 'asset', visibleWhen: when, showInTable: false },\n { key: 'assetLastMaintenanceDate', label: t('inventory.productForm.assetLastMaintenance'), type: 'date', group: 'asset', visibleWhen: when, showInTable: false },\n { key: 'assetNextMaintenanceDate', label: t('inventory.productForm.assetNextMaintenance'), type: 'date', group: 'asset', visibleWhen: when, showInTable: false },\n { key: 'assetNotes', label: t('inventory.productForm.notes'), type: 'textarea', group: 'asset', span: 2, visibleWhen: when, showInTable: false },\n ]\n}\n\n/**\n * A ficha fiscal. Só existe para o que se vende — comprar não emite nota, e\n * pedir NCM de um insumo que nunca sai da casa é campo para ninguém preencher.\n */\nexport function taxFields(t: T9n): FieldDef[] {\n const when = yes('isForSale')\n return [\n {\n key: 'taxGroupId', label: t('inventory.productForm.taxGroup'), type: 'relation', group: 'tax', span: 2,\n relation: { table: 'plg_fiscalbr_tax_groups', labelField: 'name' },\n hint: t('inventory.productForm.taxGroupHint'),\n placeholder: t('inventory.productForm.optional'), visibleWhen: when, showInTable: false,\n },\n { key: 'taxNcm', label: 'NCM', type: 'text', group: 'tax', placeholder: '33059000', hint: t('inventory.productForm.ncmHint'), visibleWhen: when, showInTable: false },\n { key: 'taxCest', label: 'CEST', type: 'text', group: 'tax', placeholder: '0300100', visibleWhen: when, showInTable: false },\n { key: 'taxIcmsOrigin', label: t('inventory.productForm.icmsOrigin'), type: 'select', group: 'tax', options: ICMS_ORIGINS, visibleWhen: when, showInTable: false },\n { key: 'taxIcmsRate', label: t('inventory.productForm.icmsRate'), type: 'number', group: 'tax', min: 0, max: 100, visibleWhen: when, showInTable: false },\n { key: 'taxCfop', label: 'CFOP', type: 'select', group: 'tax', options: CFOP_OPTIONS, visibleWhen: when, showInTable: false },\n { key: 'taxCst', label: 'CST', type: 'select', group: 'tax', options: CST_OPTIONS, hint: t('inventory.productForm.cstHint'), visibleWhen: when, showInTable: false },\n { key: 'taxPisSituation', label: 'PIS', type: 'select', group: 'tax', options: PIS_COFINS_OPTIONS, visibleWhen: when, showInTable: false },\n { key: 'taxPisRate', label: t('inventory.productForm.pisRate'), type: 'number', group: 'tax', min: 0, max: 100, visibleWhen: when, showInTable: false },\n { key: 'taxCofinsSituation', label: 'COFINS', type: 'select', group: 'tax', options: PIS_COFINS_OPTIONS, visibleWhen: when, showInTable: false },\n { key: 'taxCofinsRate', label: t('inventory.productForm.cofinsRate'), type: 'number', group: 'tax', min: 0, max: 100, visibleWhen: when, showInTable: false },\n { key: 'taxBaseCalculationMode', label: t('inventory.productForm.baseCalcMode'), type: 'select', group: 'tax', options: BASE_CALC_OPTIONS, visibleWhen: when, showInTable: false },\n { key: 'taxBenefitCode', label: t('inventory.productForm.benefitCode'), type: 'text', group: 'tax', visibleWhen: when, showInTable: false },\n { key: 'taxPovertyFundRate', label: t('inventory.productForm.povertyFund'), type: 'number', group: 'tax', min: 0, max: 100, visibleWhen: when, showInTable: false },\n // A reforma já está no cadastro do V1 e vem junto: deixar de fora\n // obrigaria a recadastrar o catálogo no dia em que IBS e CBS valerem.\n { key: 'taxIbsCbsSituation', label: t('inventory.productForm.ibsCbsSituation'), type: 'text', group: 'tax', placeholder: '200 — Alíquota reduzida', visibleWhen: when, showInTable: false },\n { key: 'taxIbsCbsClassification', label: t('inventory.productForm.ibsCbsClassification'), type: 'text', group: 'tax', placeholder: '200034 — Fornecimento de alimentos', visibleWhen: when, showInTable: false },\n ]\n}\n\n/**\n * As fichas em ABAS, como no V1 — e com os mesmos nomes.\n *\n * O cadastro do produto tem dez assuntos. Empilhados numa rolagem só, quem veio\n * trocar o preço percorre noventa campos; é por isso que o V1 usa abas, e a\n * aba é parte do fluxo, não enfeite. Uma aba cujo interruptor está desligado\n * não é desenhada (todos os campos somem por `visibleWhen`, e `CrudFormPage`\n * não oferece aba vazia).\n */\nexport function fichaGroups(t: T9n): FieldGroup[] {\n const ing = t('inventory.productForm.ingredientSection')\n const sale = t('inventory.productForm.saleSection')\n const inter = t('inventory.productForm.intermediateSection')\n const asset = t('inventory.productForm.assetSection')\n const tax = t('inventory.productForm.taxSection')\n return [\n // Embalagem fica nos Dados Gerais, como no V1: é como a casa COMPRA a\n // mesma coisa, não outro assunto.\n { id: 'packaging', label: t('inventory.productForm.packaging'), description: t('inventory.productForm.packagingDesc'), columns: 2 },\n\n // Os ícones vêm do ICON_MAP; nome fora dele cai para a casinha em silêncio.\n { id: 'ingredient', tab: ing, tabIcon: 'Wheat', label: ing, description: t('inventory.productForm.ingredientSectionDesc'), columns: 2 },\n { id: 'sale', tab: sale, tabIcon: 'ShoppingCart', label: sale, description: t('inventory.productForm.saleSectionDesc'), columns: 2 },\n { id: 'saleChannels', tab: sale, label: t('inventory.productForm.saleChannelsSection'), description: t('inventory.productForm.saleChannelsSectionDesc'), columns: 3 },\n { id: 'tax', tab: tax, tabIcon: 'Receipt', label: tax, description: t('inventory.productForm.taxSectionDesc'), columns: 2 },\n { id: 'intermediate', tab: inter, tabIcon: 'Workflow', label: inter, description: t('inventory.productForm.intermediateSectionDesc'), columns: 2 },\n { id: 'asset', tab: asset, tabIcon: 'Wrench', label: asset, description: t('inventory.productForm.assetSectionDesc'), columns: 2 },\n ]\n}\n\n// ---------------------------------------------------------------------------\n// O formulário genérico trabalha com um registro PLANO; o produto, no domínio,\n// é um tronco com fichas (insumo, venda, intermediário, patrimônio, fiscal).\n// A tradução entre os dois mora aqui, nas duas direções, e em lugar nenhum\n// mais: a entidade declara os campos, o provider grava as tabelas, e esta é a\n// única peça que sabe que `ingReorderPoint` e\n// `plg_inventory_product_ingredient_info.reorder_point` são a mesma coisa.\n//\n// Os prefixos (`ing`, `sale`, `int`, `asset`, `tax`) existem porque quatro\n// fichas têm um campo chamado «observações» e três têm «tempo de preparo».\n// ---------------------------------------------------------------------------\n\n/** Prefixo → chaves da ficha. A ordem das chaves é a da ficha no domínio. */\nexport const FICHA_KEYS = {\n ingredientInfo: {\n prefix: 'ing',\n // No minimum/maximum here: the stock minimum is the general one\n // (product_settings), the only one alerts and restock read.\n keys: ['reorderPoint', 'leadTimeDays', 'shelfLifeDays', 'storageTemperature', 'notes'],\n },\n saleInfo: {\n prefix: 'sale',\n keys: ['menuDescription', 'allergens', 'preparationTimeMinutes', 'servesQuantity',\n 'calories', 'soldByWeight', 'highlightDelivery', 'availableForDelivery',\n 'availableForCounter', 'notes'],\n },\n intermediateInfo: {\n prefix: 'int',\n keys: ['yieldPercentage', 'preparationTimeMinutes', 'shelfLifeHours', 'batchSize',\n 'batchUnitId', 'storageInstructions', 'notes'],\n },\n assetInfo: {\n prefix: 'asset',\n keys: ['assetValue', 'residualValue', 'usefulLifeMonths', 'depreciationRate',\n 'serialNumber', 'acquisitionDate', 'warrantyExpiryDate', 'assetStatus',\n 'assetLocation', 'responsiblePersonId', 'insurancePolicy',\n 'lastMaintenanceDate', 'nextMaintenanceDate', 'notes'],\n },\n taxInfo: {\n prefix: 'tax',\n keys: ['taxGroupId', 'ncm', 'cest', 'icmsOrigin', 'icmsRate', 'cfop', 'cst',\n 'pisSituation', 'pisRate', 'cofinsSituation', 'cofinsRate',\n 'baseCalculationMode', 'benefitCode', 'povertyFundRate',\n 'ibsCbsSituation', 'ibsCbsClassification'],\n },\n} as const\n\nexport type FichaName = keyof typeof FICHA_KEYS\n\n/**\n * `assetValue` com prefixo `asset` viraria `assetAssetValue`. Quando a chave\n * do domínio já começa pelo prefixo, ela mantém o próprio nome — é o que a\n * entidade declara e é como a pessoa lê na tela.\n */\nexport function flatKey(prefix: string, key: string): string {\n if (key.startsWith(prefix)) return key\n return prefix + key.charAt(0).toUpperCase() + key.slice(1)\n}\n\nconst EMPTY_CLASSIFICATION = {\n isIngredient: false, isForSale: false, isIntermediate: false, isAsset: false,\n isProduced: false, isResale: false, trackByUnitLabel: false,\n}\n\n/** Produto (com fichas) → o registro PLANO que as telas leem. */\nexport function flattenProduct(p: Record<string, any>): Record<string, any> {\n const values: Record<string, any> = {\n name: p.name,\n id: p.id,\n imageUrl: p.imageUrl,\n brand: p.brand ?? '',\n sku: p.sku ?? '',\n barcode: p.barcode ?? '',\n description: p.description ?? '',\n productType: p.productType,\n costPrice: p.costPrice,\n salePrice: p.salePrice ?? 0,\n minQuantity: p.minQuantity,\n maxQuantity: p.maxQuantity ?? 0,\n categoryId: p.categoryId ?? '',\n measurementUnitId: p.measurementUnitId ?? '',\n supplierId: p.supplierId ?? '',\n defaultLocationId: p.defaultLocationId ?? '',\n purchaseUnitId: p.purchaseUnitId ?? '',\n conversionFactor: p.conversionFactor ?? 1,\n ...EMPTY_CLASSIFICATION,\n ...(p.classification ?? {}),\n }\n\n const e = p.extras ?? {}\n values.commissionPercent = e.commissionPercent ?? 0\n values.chartAccountId = e.chartAccountId ?? ''\n values.contentPerUnit = e.contentPerUnit ?? ''\n values.contentUnitId = e.contentUnitId ?? ''\n values.avgPurchasePrice = e.avgPurchasePrice ?? 0\n values.professionalResalePrice = e.professionalResalePrice ?? 0\n values.requireBatchForStock = e.requireBatchForStock ?? false\n values.requireExpiryForStock = e.requireExpiryForStock ?? false\n\n for (const name of Object.keys(FICHA_KEYS) as FichaName[]) {\n const { prefix, keys } = FICHA_KEYS[name]\n const ficha = p[name] ?? {}\n for (const key of keys) values[flatKey(prefix, key)] = (ficha as Record<string, any>)[key] ?? ''\n }\n\n for (const ch of SALE_CHANNELS) {\n const found = (p.saleChannels ?? []).find((c: { channel: string }) => c.channel === ch.key)\n values[channelFieldKey(ch.key)] = found?.price ?? ''\n }\n return values\n}\n\n\nconst num = (v: unknown): number | undefined => {\n if (v === '' || v == null) return undefined\n const n = Number(v)\n return Number.isFinite(n) ? n : undefined\n}\nconst str = (v: unknown): string | undefined => {\n const s = typeof v === 'string' ? v.trim() : v == null ? '' : String(v)\n return s === '' ? undefined : s\n}\n\n/**\n * Valores planos → as fichas do produto.\n *\n * Uma ficha só é enviada quando o interruptor dela está LIGADO: desligar\n * «Patrimônio» esconde a seção e não apaga o valor do equipamento — o dado\n * volta inteiro se o interruptor voltar. É o que o V1 faz, e apagar valor de\n * patrimônio por causa de um clique seria perda silenciosa.\n */\nexport function toFichas(values: Record<string, any>): Record<string, unknown> {\n const out: Record<string, unknown> = {}\n const enabled: Record<FichaName, boolean> = {\n ingredientInfo: values.isIngredient === true,\n saleInfo: values.isForSale === true,\n intermediateInfo: values.isIntermediate === true,\n assetInfo: values.isAsset === true,\n taxInfo: values.isForSale === true,\n }\n // Campos que são número no domínio. O resto viaja como texto.\n const numeric = new Set([\n 'reorderPoint', 'leadTimeDays', 'shelfLifeDays',\n 'preparationTimeMinutes', 'servesQuantity', 'calories',\n 'yieldPercentage', 'shelfLifeHours', 'batchSize',\n 'assetValue', 'residualValue', 'usefulLifeMonths', 'depreciationRate',\n 'icmsRate', 'pisRate', 'cofinsRate', 'povertyFundRate',\n ])\n const boolean = new Set(['soldByWeight', 'highlightDelivery', 'availableForDelivery', 'availableForCounter'])\n\n for (const name of Object.keys(FICHA_KEYS) as FichaName[]) {\n if (!enabled[name]) continue\n const { prefix, keys } = FICHA_KEYS[name]\n // A sheet this house never drew (the sale sheet with no menu) carries no\n // key at all; a boolean read as `false` would otherwise write a row.\n if (!keys.some((key) => flatKey(prefix, key) in values)) continue\n const ficha: Record<string, unknown> = {}\n for (const key of keys) {\n const raw = values[flatKey(prefix, key)]\n if (boolean.has(key)) ficha[key] = raw === true\n else if (numeric.has(key)) ficha[key] = num(raw)\n else ficha[key] = str(raw)\n }\n // Ficha em que NADA foi respondido não vira linha. É o caso da fiscal\n // numa casa sem o plugin fiscal: a seção não foi desenhada, então não há\n // valor nenhum, e gravar uma linha vazia só criaria dado que ninguém pediu\n // numa tabela que talvez nem exista.\n if (Object.values(ficha).every((v) => v === undefined)) continue\n out[name] = ficha\n }\n\n if (enabled.saleInfo) {\n const channels = SALE_CHANNELS\n .map((ch) => ({ channel: ch.key as string, price: num(values[channelFieldKey(ch.key)]) }))\n // Canal sem preço não vira linha: zero gravado afirmaria «de graça neste\n // canal», e vazio quer dizer «usa o preço base».\n .filter((c): c is { channel: string; price: number } => c.price != null && c.price > 0)\n if (channels.length) out.saleChannels = channels\n }\n return out\n}\n\n\n/**\n * O caminho de volta: valores planos → o que o provider grava.\n *\n * Recebe o registro INTEIRO (o plano atual com as alterações por cima), e não\n * só os campos encostados: uma ficha é gravada como linha completa, então\n * mandar meia ficha apagaria o resto dela em silêncio.\n */\nexport function unflattenProduct(values: Record<string, any>): Record<string, unknown> {\n const classification = {\n isIngredient: values.isIngredient === true,\n isForSale: values.isForSale === true,\n isIntermediate: values.isIntermediate === true,\n isAsset: values.isAsset === true,\n isProduced: values.isProduced === true,\n isResale: values.isResale === true,\n trackByUnitLabel: values.trackByUnitLabel === true,\n }\n const patch: Record<string, unknown> = {\n classification,\n extras: {\n commissionPercent: Number(values.commissionPercent) || 0,\n chartAccountId: values.chartAccountId ?? '',\n contentPerUnit: values.contentPerUnit === '' ? undefined : Number(values.contentPerUnit) || undefined,\n contentUnitId: values.contentUnitId ?? '',\n avgPurchasePrice: Number(values.avgPurchasePrice) || undefined,\n professionalResalePrice: Number(values.professionalResalePrice) || undefined,\n requireBatchForStock: values.requireBatchForStock === true,\n requireExpiryForStock: values.requireExpiryForStock === true,\n },\n ...toFichas(values),\n }\n // Os campos do tronco só viajam quando vieram: `undefined` deixa o valor\n // anterior onde está, e '' é uma resposta («limpei isto»).\n const trunk = ['name', 'sku', 'barcode', 'brand', 'description', 'costPrice', 'salePrice',\n 'minQuantity', 'maxQuantity', 'categoryId', 'measurementUnitId', 'supplierId',\n 'defaultLocationId', 'purchaseUnitId', 'conversionFactor', 'isActive'] as const\n for (const key of trunk) {\n if (values[key] !== undefined) patch[key] = values[key]\n }\n return patch\n}\n","import React from 'react'\nimport type { EntityDef, EntityImageConfig, FieldDef } from '@fayz-ai/core'\nimport { RECORD_GROUP, recordRailFields, activeFacet } from '@fayz-ai/core'\nimport { Thumbnail } from '@fayz-ai/ui'\nimport { Package } from 'lucide-react'\nimport { formatCurrency, type InventoryCurrency, type ProductTypeOption } from '../context'\nimport type { InventoryDataProvider } from '@fayz-ai/inventory/data/provider'\nimport { PRODUCT_CATEGORY_KIND, T } from '@fayz-ai/inventory/data/tables'\nimport { hasMinimum, isLowStock, isOutOfStock } from '@fayz-ai/inventory/domain/stock'\nimport { marginPercent, stockValue } from '@fayz-ai/inventory/domain/product'\nimport { ProductStockTab } from './ProductStockTab'\nimport { ProductBarcodesTab } from './ProductBarcodesTab'\nimport { ProductVariantsTab } from './ProductVariantsTab'\nimport {\n classificationFields, packagingFields, ingredientFields, saleFields,\n intermediateFields, assetFields, taxFields, fichaGroups,\n} from './productFichas'\n\n// ---------------------------------------------------------------------------\n// The single source of truth for the Product entity — drives BOTH the generic\n// list (CrudListView columns + facet) and the generic form (CrudFormPage\n// sections). Persistence stays in the inventory provider/store; this only\n// describes fields, columns and layout.\n// ---------------------------------------------------------------------------\n\nconst TYPE_DESCRIPTION_KEYS: Record<string, string> = {\n ingredient: 'inventory.productForm.typeIngredient',\n sale: 'inventory.productForm.typeSale',\n intermediate: 'inventory.productForm.typeIntermediate',\n asset: 'inventory.productForm.typeAsset',\n}\n\n// Same switches ProductCrudForm requires at least one of.\nconst CLASSIFICATION_KEYS = ['isIngredient', 'isForSale', 'isIntermediate', 'isAsset', 'isProduced', 'isResale', 'trackByUnitLabel']\n\ntype T = (key: string, params?: Record<string, string | number>) => string\n\nfunction productImage(provider: InventoryDataProvider): EntityImageConfig {\n return {\n get: (row) => row.imageUrl,\n upload: async (file, row) => {\n if (!row.id) throw new Error('Salve o produto antes de enviar a imagem.')\n if (!provider.uploadProductImage) throw new Error('Envio de imagens indisponível neste ambiente.')\n return provider.uploadProductImage(row.id, file)\n },\n accept: 'image/jpeg,image/png,image/webp,image/heic,image/heif',\n // CrudFormPage keeps this File only in form state. ProductCrudForm consumes\n // it after createProduct returns the new id; it never reaches PostgREST.\n draftField: '_imageFile',\n }\n}\n\nexport function buildProductEntity(\n t: T,\n productTypes: ProductTypeOption[],\n currency: InventoryCurrency,\n /** Called by the Stock tab after it changes stock, so the page can refetch. */\n onStockChanged?: () => void,\n /** Enables the real media slot; list-only consumers may omit it. */\n provider?: InventoryDataProvider,\n /**\n * Esta casa emite nota? Liga a ficha de tributos — e vem LIGADA, como no V1,\n * onde Fiscal aparece em todo produto de venda.\n *\n * A ficha mora numa tabela do plugin fiscal (`plg_fiscalbr_product_tax_info`,\n * migration 011 dele), aplicada no cluster. Um app que não emite nota passa\n * `false` e os dezesseis campos somem — oferecer campo que o banco não tem\n * onde guardar é pior do que não oferecer nenhum.\n */\n hasFiscal = true,\n /** False for a house with no menu: the sale sheet is menu and counter data, not shelf data. */\n hasMenu = true,\n /** False where the house switched technical sheets off: nothing here is produced. */\n hasRecipes = true,\n): EntityDef {\n // O rótulo traduzido vence a literal do manifesto — ver ProductTypeOption.\n const typeName = (pt: ProductTypeOption) => (pt.labelKey ? t(pt.labelKey) : pt.label)\n const typeOptions = productTypes.map((pt) => ({\n label: typeName(pt),\n value: pt.value,\n description: TYPE_DESCRIPTION_KEYS[pt.value] ? t(TYPE_DESCRIPTION_KEYS[pt.value]) : undefined,\n }))\n const typeLabel = (v: unknown) => {\n const found = productTypes.find((p) => p.value === v)\n return found ? typeName(found) : String(v ?? '')\n }\n\n // Field order is chosen so the table columns come out as\n // Product · Type · Stock · Cost · Value while the form groups stay correct.\n const fields: FieldDef[] = [\n // — General Information (form) + Product column (table) —\n {\n key: 'name', label: t('inventory.productForm.name'), type: 'text', required: true,\n group: 'general', placeholder: t('inventory.productForm.namePlaceholder'),\n searchable: true, showInTable: true, sortable: true,\n renderCell: (_v, row: any) => (\n // A foto vem junto do nome, como na lista da loja. O produto de um\n // estoque é uma COISA, e a pessoa que confere a prateleira reconhece a\n // embalagem antes de ler o SKU. `imageUrl` já viajava na linha — só não\n // tinha quem o desenhasse.\n //\n // O quadrado aparece SEMPRE, com foto ou sem: um produto sem imagem\n // que não renderizasse nada puxaria o nome para trás contra as linhas\n // que têm, e a coluna deixaria de ler como coluna.\n <div className=\"flex items-center gap-3\">\n <Thumbnail src={row.imageUrl} icon={Package} />\n <div className=\"min-w-0\">\n <div className=\"flex items-center gap-1.5\">\n <p className={`truncate font-medium ${row.isActive === false ? 'text-muted-foreground' : ''}`}>{row.name}</p>\n {/* Fora de linha tem de SER visível: sem esta marca, desativar um\n produto não mudava nada na tela e a ação parecia não ter feito\n nada. */}\n {row.isActive === false && (\n <span className=\"inline-flex items-center rounded-full bg-muted px-1.5 py-0.5 text-[9px] font-medium text-muted-foreground\">\n {t('inventory.productList.inactive')}\n </span>\n )}\n </div>\n {row.sku && <p className=\"text-xs text-muted-foreground\">{row.sku}</p>}\n </div>\n </div>\n ),\n },\n { key: 'brand', label: t('inventory.productForm.brand'), type: 'text', group: 'general', placeholder: t('inventory.productForm.brandPlaceholder'), showInTable: false },\n { key: 'sku', label: t('inventory.productForm.sku'), type: 'text', group: 'general', placeholder: t('inventory.productForm.skuPlaceholder'), searchable: true, showInTable: false },\n { key: 'barcode', label: t('inventory.productForm.barcode'), type: 'text', group: 'general', placeholder: t('inventory.productForm.barcodePlaceholder'), searchable: true, showInTable: false },\n { key: 'description', label: t('inventory.productForm.description'), type: 'textarea', group: 'general', span: 2, placeholder: t('inventory.productForm.descriptionPlaceholder'), showInTable: false },\n {\n key: 'commissionPercent', label: t('inventory.productForm.commissionPercent'), type: 'number',\n group: 'general', min: 0, max: 100, placeholder: '0', showInTable: false,\n hint: t('inventory.productForm.commissionPercentHint'),\n },\n {\n // Conta de DESPESA: é por ela que a compra deste produto entra no\n // resultado. Sem chave estrangeira no banco porque a casa pode não ter\n // o financeiro instalado — aqui o campo some junto com a tabela.\n key: 'chartAccountId', label: t('inventory.productForm.chartAccount'), type: 'relation',\n group: 'general', relation: { table: 'plg_financial_chart_of_accounts', labelFields: ['code', 'name'] },\n placeholder: t('inventory.productForm.optional'), showInTable: false,\n },\n {\n key: 'avgPurchasePrice', label: t('inventory.productForm.avgPurchasePrice'), type: 'currency',\n group: 'general', currency: currency.code, currencySymbol: currency.symbol, currencyLocale: currency.locale,\n hint: t('inventory.productForm.avgPurchasePriceHint'), showInTable: false,\n },\n\n // — Classification (form: segmented) + Type column (table: badge) —\n // O TIPO continua existindo como coluna e como faceta da lista, mas não é\n // mais pergunta do formulário: ele é DERIVADO dos sete interruptores da\n // Classificação. Perguntar as duas coisas deixaria a tela aceitar um\n // produto marcado «Venda» cuja única ficha é a de insumo.\n {\n key: 'productType', label: t('inventory.productForm.classification'), type: 'segmented',\n options: typeOptions,\n showInForm: false, showInTable: true, sortable: false,\n renderCell: (v, row: any) => {\n // Produto sem NENHUM interruptor ligado não é «Venda» — é um produto\n // que ninguém classificou. Dizer «Venda» aqui era a resposta padrão de\n // um campo vazio, e ela explicava mal por que a ficha não abre aba\n // nenhuma: 1.369 dos 3.334 produtos deste cluster vieram assim de uma\n // importação que não trouxe o tipo.\n const c = row?.classification\n const unset = c && !c.isIngredient && !c.isForSale && !c.isIntermediate && !c.isAsset\n if (unset) {\n return (\n <span className=\"inline-flex items-center rounded-full px-2 py-0.5 text-[10px] font-medium bg-muted/50 text-muted-foreground italic\">\n {t('inventory.productForm.classificationUnset')}\n </span>\n )\n }\n return (\n <span className=\"inline-flex items-center rounded-full px-2 py-0.5 text-[10px] font-medium bg-muted text-muted-foreground\">\n {typeLabel(v)}\n </span>\n )\n },\n },\n\n // Balance and minimum share one cell; the alarm is the summary's `isLowStock`, so a product without a minimum never turns red.\n {\n key: 'currentQuantity', label: t('inventory.productList.stock'), type: 'number',\n showInForm: false, showInTable: true, sortable: true,\n renderCell: (_v, row: any) => {\n const qty = Number(row.currentQuantity) || 0\n const min = Number(row.minQuantity) || 0\n const unit = row.measurementUnitName\n const below = isLowStock(qty, min)\n const empty = isOutOfStock(qty)\n return (\n <span className=\"block text-right\">\n <span className={below ? 'font-medium text-destructive' : empty ? 'text-muted-foreground' : ''}>\n {qty.toLocaleString('pt-BR', { maximumFractionDigits: 3 })}\n {unit ? <span className=\"ml-1 text-xs text-muted-foreground\">{unit}</span> : null}\n </span>\n {/* Sem mínimo não há de que estar abaixo, e escrever \"mín. 0\"\n sugeriria que há. O convite fica no painel, uma vez, em vez de\n repetido em cada uma das 169 linhas. */}\n {hasMinimum(min) && (\n <span className=\"block text-xs text-muted-foreground\">\n mín. {min.toLocaleString('pt-BR', { maximumFractionDigits: 3 })}\n </span>\n )}\n </span>\n )\n },\n },\n\n // — Pricing (form) + Cost column (table) —\n {\n key: 'costPrice', label: t('inventory.productForm.costPrice'), type: 'currency',\n group: 'pricing', currency: currency.code, currencySymbol: currency.symbol, currencyLocale: currency.locale,\n showInTable: true, sortable: false,\n // Mesma regra do preço de venda: custo zero é \"não cadastrado\", não\n // \"custa nada\". E é ele que faz o Valor abaixo mentir.\n renderCell: (v) => {\n const n = Number(v)\n return (\n <span className=\"block text-right text-muted-foreground\">\n {v == null || v === '' || !Number.isFinite(n) || n === 0 ? '—' : formatCurrency(n, currency)}\n </span>\n )\n },\n },\n\n // — Value column (list only): stock × cost —\n {\n key: 'value', label: t('inventory.productList.value'), type: 'number',\n showInForm: false, showInTable: true, sortable: false,\n renderCell: (_v, row: any) => {\n const value = stockValue(row.currentQuantity, row.costPrice)\n if (value === null) {\n return (\n <span className=\"block text-right text-muted-foreground\" title=\"Sem custo cadastrado, o valor deste saldo não pode ser calculado\">\n —\n </span>\n )\n }\n return <span className=\"block text-right font-medium\">{formatCurrency(value, currency)}</span>\n },\n },\n\n {\n key: 'salePrice', label: t('inventory.productForm.salePrice'), type: 'currency', group: 'pricing',\n currency: currency.code, currencySymbol: currency.symbol, currencyLocale: currency.locale,\n // O V1 mostra Custo E Venda lado a lado. Custo sozinho não responde\n // \"quanto isto rende\", e o preço estava só dentro da ficha.\n showInTable: true,\n // Zero aqui é \"não informado\", não \"de graça\" — 100 dos 169 produtos deste\n // tenant estão assim. \"R$ 0,00\" afirmaria um preço; o travessão diz que\n // falta cadastrar, que é a verdade e é o que se pode agir sobre.\n renderCell: (v) => {\n const n = Number(v)\n return (\n <span className=\"block text-right text-muted-foreground\">\n {v == null || v === '' || !Number.isFinite(n) || n === 0 ? '—' : formatCurrency(n, currency)}\n </span>\n )\n },\n // Ingredients and intermediate preparations are inputs, not things sold\n // directly to the customer. If it is sold, it belongs to the menu-item\n // classification and gets the commercial fields there.\n visibleWhen: (vals) => vals.isForSale === true,\n },\n {\n key: 'margin', label: t('inventory.productForm.margin'), type: 'computed', group: 'pricing', showInTable: false,\n visibleWhen: (vals) => vals.isForSale === true,\n compute: (vals) => {\n const m = marginPercent(Number(vals.salePrice), Number(vals.costPrice))\n if (m === null) return null\n return { display: `${m.toFixed(1)}%`, tone: m >= 0 ? 'positive' : 'negative' }\n },\n },\n\n // — Stock Levels (form only) —\n { key: 'minQuantity', label: t('inventory.productForm.minQuantity'), type: 'number', group: 'stock', min: 0, placeholder: '0', hint: t('inventory.productForm.minQuantityHint'), showInTable: false },\n { key: 'maxQuantity', label: t('inventory.productForm.maxQuantity'), type: 'number', group: 'stock', min: 0, placeholder: t('inventory.productForm.optional'), hint: t('inventory.productForm.maxQuantityHint'), showInTable: false },\n\n // — Organisation (form only) — the four links that used to be accepted by\n // CreateProductInput and then silently dropped; they persist in\n // plg_inventory_product_details since migration 005.\n {\n key: 'categoryId', label: t('inventory.productForm.category'), type: 'relation', group: 'organization',\n relation: {\n table: T.productCategories, labelField: 'name', filter: { kind: PRODUCT_CATEGORY_KIND },\n create: { permission: { feature: 'inventory', action: 'edit' } },\n },\n placeholder: t('inventory.productForm.optional'), showInTable: false,\n },\n {\n key: 'measurementUnitId', label: t('inventory.productForm.measurementUnit'), type: 'relation', group: 'organization',\n relation: { table: T.measurementUnits, labelField: 'abbreviation' },\n hint: t('inventory.productForm.measurementUnitHint'),\n placeholder: t('inventory.productForm.optional'), showInTable: false,\n },\n {\n key: 'supplierId', label: t('inventory.productForm.supplier'), type: 'relation', group: 'organization',\n relation: { table: 'people', labelField: 'name', filter: { kind: 'supplier' } },\n placeholder: t('inventory.productForm.optional'), showInTable: false,\n },\n {\n key: 'defaultLocationId', label: t('inventory.productForm.defaultLocation'), type: 'relation', group: 'organization',\n relation: { table: T.stockLocations, labelField: 'name' },\n placeholder: t('inventory.productForm.optional'), showInTable: false,\n },\n // Opening stock: asked once, while creating, and written as an ordinary\n // entry movement after the product exists (ProductCrudForm).\n {\n key: '_initialQty', label: t('inventory.productForm.initialQuantity'), type: 'number', group: 'initialEntry',\n min: 0, placeholder: '0', showInTable: false, showInDetail: false,\n },\n {\n key: '_initialLocationId', label: t('inventory.productForm.initialLocation'), type: 'relation', group: 'initialEntry',\n relation: { table: T.stockLocations, labelField: 'name' },\n hint: t('inventory.productForm.initialLocationHint'),\n placeholder: t('inventory.productForm.optional'), showInTable: false, showInDetail: false,\n visibleWhen: (v) => Number(v._initialQty) > 0,\n },\n {\n key: '_initialUnitCost', label: t('inventory.productForm.initialUnitCost'), type: 'currency', group: 'initialEntry',\n currency: currency.code, currencySymbol: currency.symbol, currencyLocale: currency.locale,\n hint: t('inventory.productForm.initialUnitCostHint'), showInTable: false, showInDetail: false,\n visibleWhen: (v) => Number(v._initialQty) > 0,\n },\n {\n key: '_initialBatch', label: t('inventory.productForm.initialBatch'), type: 'text', group: 'initialEntry',\n required: true, showInTable: false, showInDetail: false,\n visibleWhen: (v) => Number(v._initialQty) > 0 && v.requireBatchForStock === true,\n },\n {\n key: '_initialExpiry', label: t('inventory.productForm.initialExpiry'), type: 'date', group: 'initialEntry',\n required: true, showInTable: false, showInDetail: false,\n visibleWhen: (v) => Number(v._initialQty) > 0 && v.requireExpiryForStock === true,\n },\n // O rail de todo cadastro. `isActive` já era LIDO na lista (a linha\n // aparece esmaecida) e não tinha campo: dava para ver que um produto\n // estava inativo e não dava para reativá-lo.\n ...recordRailFields({ tagsTable: 'products', activeLabel: t('common.active') }),\n\n // As fichas: cada uma nasce de um interruptor da Classificação e some\n // junto com ele. A ordem aqui é a ordem das abas do V1.\n ...packagingFields(t),\n ...classificationFields(t, currency, hasRecipes),\n ...ingredientFields(t),\n ...(hasMenu ? saleFields(t, currency) : []),\n ...(hasRecipes ? intermediateFields(t) : []),\n ...assetFields(t, currency),\n ...(hasFiscal ? taxFields(t) : []),\n ]\n\n return {\n name: t('inventory.stock.product'),\n namePlural: t('inventory.nav.products'),\n icon: 'Package',\n displayField: 'name',\n // General data in the main column, situation (unit, tags, active) beside it.\n formColumns: 2,\n // MOSTRAR e TROCAR são coisas diferentes. `image` só existe quando há\n // provider, porque é ele que sabe enviar o arquivo — mas sem `imageField` a\n // página do produto ficava sem foto mesmo com a foto na linha, enquanto a\n // lista a desenhava. O campo responde por desenhar; `image`, por substituir.\n imageField: 'imageUrl',\n image: provider?.uploadProductImage ? productImage(provider) : undefined,\n fields,\n // A primeira aba é a dos Dados Gerais, na ordem do V1: o que a coisa é,\n // como ela é embalada, o que ela SERVE (a Classificação), preço, estoque e\n // organização. Cada ficha depois disso tem aba própria — é assim no V1, e\n // dez assuntos numa rolagem só fazem quem veio trocar o preço percorrer\n // noventa campos.\n fieldGroups: (() => {\n const fichas = fichaGroups(t)\n const ficha = (id: string) => fichas.find((g) => g.id === id)!\n // Wizard steps for a new product; the ficha groups step by their tab.\n const identity = t('inventory.productForm.stepIdentity')\n const stock = t('inventory.productForm.stepStock')\n return [\n { id: 'general', step: identity, tabIcon: 'Package', label: t('inventory.productForm.generalInfo'), columns: 2 as const, imageSlot: true },\n { ...ficha('packaging'), step: identity },\n {\n id: 'classification', step: t('inventory.productForm.stepClassification'), tabIcon: 'Tags', label: t('inventory.productForm.classification'), description: t('inventory.productForm.classificationDesc'), columns: 2 as const,\n validate: (v: Record<string, unknown>) => (CLASSIFICATION_KEYS.some((k) => v[k] === true) ? null : t('inventory.productForm.classificationRequired')),\n },\n { id: 'pricing', step: t('inventory.productForm.stepPricing'), tabIcon: 'DollarSign', label: t('inventory.productForm.pricing'), columns: 3 as const },\n { id: 'stock', step: stock, tabIcon: 'Warehouse', label: t('inventory.productForm.stockLevels'), description: t('inventory.productForm.stockLevelsDesc'), columns: 2 as const },\n { id: 'organization', step: stock, label: t('inventory.productForm.organization'), description: t('inventory.productForm.organizationDesc'), columns: 2 as const },\n // Daqui em diante é UMA ABA cada, na ordem do V1: Insumo · Venda ·\n // Fiscal · Intermediário · Patrimônio. A aba só aparece com o\n // interruptor dela ligado.\n ficha('ingredient'),\n ...(hasMenu ? [ficha('sale'), ficha('saleChannels')] : []),\n ...(hasFiscal ? [ficha('tax')] : []),\n ...(hasRecipes ? [ficha('intermediate')] : []),\n ficha('asset'),\n {\n id: 'initialEntry', step: t('inventory.productForm.stepInitialEntry'), tabIcon: 'PackageCheck', createOnly: true,\n label: t('inventory.productForm.initialEntrySection'), description: t('inventory.productForm.initialEntrySectionDesc'), columns: 2 as const,\n },\n { ...RECORD_GROUP, step: identity },\n ]\n })(),\n // Duas facetas: o TIPO (o que a coisa é) e a SITUAÇÃO (se vale). A\n // segunda abre em «Ativos», como toda lista de cadastro.\n facets: [\n { field: 'productType', allLabel: t('crud.list.allFacet') },\n activeFacet({ active: t('common.active'), inactive: t('common.inactive'), all: t('crud.list.allFacet') }),\n ],\n detailTabs: [\n // Aparece em TODO produto, como no V1: o código é do produto, não do\n // tipo dele, e é por ele que o balcão acha a mercadoria.\n {\n id: 'barcodes',\n label: t('inventory.barcodes.tab'),\n // `Barcode` NÃO está no ICON_MAP e cairia para a casinha em silêncio.\n icon: 'ScanLine',\n component: ProductBarcodesTab as never,\n },\n {\n id: 'variants',\n label: t('inventory.variants.tab'),\n icon: 'Layers',\n component: ProductVariantsTab as never,\n },\n {\n id: 'stock',\n label: t('inventory.productDetail.stockTab'),\n icon: 'Warehouse',\n component: ProductStockTab as never,\n props: { onChanged: onStockChanged },\n },\n ],\n }\n}\n","import React, { useCallback, useEffect, useMemo, useState } from 'react'\nimport { CircleCheck, CircleSlash, Boxes, Layers, Store } from 'lucide-react'\nimport { CrudListView, usePermissionOptional, type CrudBulkAction } from '@fayz-ai/admin'\nimport { toast, FilterMenuRow, FilterPanel, FilterPanelField, RequiredFilter } from '@fayz-ai/ui'\nimport { useInventoryConfig, useInventoryProvider, useInventoryStore } from '../context'\nimport { useTranslation } from '@fayz-ai/core'\nimport type { Product, ProductCategory, ProductSalesChannel, ProductType } from '@fayz-ai/inventory/domain/product'\nimport { buildProductEntity } from './productEntity'\n\n// O mesmo número que o provider assume quando ninguém pede — declarado aqui\n// porque o rodapé (\"1–50 de 340\") descreve a fatia que ESTA tela pediu, e as\n// duas pontas têm que concordar.\nconst PAGE_SIZE = 50\n\n// Product list, rendered through the generic CrudListView (header · search ·\n// facet pills · table). One shared EntityDef (buildProductEntity) drives both\n// this list and the create/edit form. Data + routing stay in the inventory\n// store / module nav.\nexport function ProductListView({ onNew, onOpen }: {\n onNew?: () => void\n /** Opens the product's own page. Editing starts there, not from the row. */\n onOpen?: (id: string) => void\n}) {\n const t = useTranslation()\n const can = usePermissionOptional()\n const provider = useInventoryProvider()\n const { currency, productTypes } = useInventoryConfig()\n const products = useInventoryStore((s) => s.products)\n const productsTotal = useInventoryStore((s) => s.productsTotal)\n const productsLoading = useInventoryStore((s) => s.productsLoading)\n const fetchProducts = useInventoryStore((s) => s.fetchProducts)\n\n const [search, setSearch] = useState('')\n const [typeFilter, setTypeFilter] = useState<string | undefined>()\n const [activeFilter, setActiveFilter] = useState<string | undefined>()\n // Where it is sold — the storefront, the delivery menu, the counter.\n const [channelFilter, setChannelFilter] = useState<ProductSalesChannel | undefined>()\n // CATEGORIA: o recorte que o V1 tem e esta lista nao tinha. `categoryId` ja\n // existia na consulta do provider — faltava quem o pedisse.\n const [categoryId, setCategoryId] = useState('')\n const [categories, setCategories] = useState<ProductCategory[]>([])\n useEffect(() => {\n let vivo = true\n provider.getCategories().then((rows) => { if (vivo) setCategories(rows) }).catch(() => {})\n return () => { vivo = false }\n }, [provider])\n const [page, setPage] = useState(1)\n const [loadedOnce, setLoadedOnce] = useState(false)\n const [bulkBusy, setBulkBusy] = useState(false)\n\n // O provider SEMPRE paginou — `getProducts` recorta por `range()` e devolve o\n // `count` do conjunto inteiro. Quem não pedia página era esta tela, e sem\n // `onPageChange` o CrudListView não desenha o paginador: o rodapé dizia\n // \"1–50 de 340\" e não havia como chegar nos outros 290.\n //\n // Numa página só, a lista fica na PRIMEIRA. Isso importa numa rede com\n // catálogo grande: filtrar e continuar na página 6 mostraria um vazio que\n // parece \"nenhum resultado\" e não é.\n // ── O RASCUNHO E O RECORTE EM VIGOR ──────────────────────────────────────\n //\n // O V1 monta esta tela como formulario: tipo, categoria, unidade, busca e um\n // «Filtrar» no fim — e nao recarrega a cada campo. Num catalogo de rede cada\n // troca aqui e uma pagina inteira relida do banco.\n const rascunho = useMemo(\n () => ({ productType: typeFilter, categoryId, isActive: activeFilter, salesChannel: channelFilter }),\n [typeFilter, categoryId, activeFilter, channelFilter],\n )\n const [emVigor, setEmVigor] = useState(rascunho)\n const filtrosPendentes = useMemo(\n () => JSON.stringify(rascunho) !== JSON.stringify(emVigor),\n [rascunho, emVigor],\n )\n const aplicarFiltros = useCallback(() => {\n setPage(1)\n setEmVigor(() => rascunho)\n }, [rascunho])\n const limparFiltros = () => {\n setTypeFilter(undefined)\n setCategoryId('')\n setActiveFilter(undefined)\n setChannelFilter(undefined)\n }\n const filtrosAtivos =\n (typeFilter ? 1 : 0) + (categoryId ? 1 : 0) + (activeFilter !== undefined ? 1 : 0) + (channelFilter ? 1 : 0)\n\n const query = useMemo(() => ({\n productType: emVigor.productType as ProductType | undefined,\n categoryId: emVigor.categoryId || undefined,\n search: search || undefined,\n isActive: emVigor.isActive === undefined ? undefined : emVigor.isActive === 'true',\n salesChannel: emVigor.salesChannel,\n page,\n pageSize: PAGE_SIZE,\n }), [emVigor, search, page])\n\n useEffect(() => {\n let active = true\n Promise.resolve(fetchProducts(query))\n .finally(() => { if (active) setLoadedOnce(true) })\n return () => { active = false }\n }, [query])\n\n const entity = useMemo(() => buildProductEntity(t, productTypes, currency), [t, productTypes, currency])\n const runBulk = useCallback(async (rows: Product[], isActive: boolean) => {\n const targets = rows.filter((p) => (p.isActive ?? true) !== isActive)\n if (targets.length === 0) {\n toast.error(t('inventory.productList.bulkNothingToDo'))\n return\n }\n setBulkBusy(true)\n let done = 0\n let failed = 0\n for (const product of targets) {\n try {\n await provider.updateProduct(product.id, { isActive })\n done++\n } catch (err: unknown) {\n failed++\n console.warn('[inventory] updateProduct failed', product.id, err)\n }\n }\n setBulkBusy(false)\n await fetchProducts(query)\n if (done > 0) toast.success(t(isActive ? 'inventory.productList.bulkActivated' : 'inventory.productList.bulkDeactivated', { count: String(done) }))\n if (failed > 0) toast.error(t('inventory.productList.bulkFailed', { count: String(failed) }))\n }, [provider, fetchProducts, query, t])\n\n const bulkActions = useMemo<CrudBulkAction<Product>[] | undefined>(() => {\n if (!can('inventory', 'edit')) return undefined\n return [\n {\n id: 'deactivate',\n label: t('inventory.productList.bulkDeactivate'),\n icon: CircleSlash,\n disabled: bulkBusy,\n onSelect: (rows) => void runBulk(rows, false),\n },\n {\n id: 'activate',\n label: t('inventory.productList.bulkActivate'),\n icon: CircleCheck,\n overflow: true,\n disabled: bulkBusy,\n onSelect: (rows) => void runBulk(rows, true),\n },\n ]\n }, [can, bulkBusy, runBulk, t])\n\n const channelOptions: Array<{ value: ProductSalesChannel; label: string }> = [\n { value: 'site', label: t('inventory.filters.channelSite') },\n { value: 'delivery', label: t('inventory.filters.channelDelivery') },\n { value: 'pos', label: t('inventory.filters.channelPos') },\n ]\n\n const filtros = (\n <FilterPanel\n title={t('inventory.filters.title')}\n dirty={filtrosPendentes}\n onApply={aplicarFiltros}\n applyLabel={t('inventory.filters.apply')}\n pendingTitle={t('inventory.filters.pending')}\n pendingHint={t('inventory.filters.pendingHint')}\n onClear={filtrosAtivos > 0 ? limparFiltros : undefined}\n clearLabel={t('inventory.filters.clear')}\n busy={productsLoading}\n >\n <FilterPanelField label={t('inventory.filters.kind')}>\n <RequiredFilter\n label={t('inventory.filters.kind')}\n value={productTypes.find((p) => p.value === typeFilter)?.label ?? t('inventory.filters.allKinds')}\n icon={Boxes}\n className=\"h-9 w-full justify-start\"\n align=\"start\"\n >\n {(close: () => void) => (\n <div className=\"max-h-72 space-y-0.5 overflow-y-auto\">\n <FilterMenuRow active={!typeFilter} onClick={() => { setTypeFilter(undefined); close() }}>\n {t('inventory.filters.allKinds')}\n </FilterMenuRow>\n {productTypes.map((p) => (\n <FilterMenuRow key={p.value} active={typeFilter === p.value} onClick={() => { setTypeFilter(p.value); close() }}>\n <span className=\"truncate\">{p.label}</span>\n </FilterMenuRow>\n ))}\n </div>\n )}\n </RequiredFilter>\n </FilterPanelField>\n\n {categories.length > 0 && (\n <FilterPanelField label={t('inventory.filters.category')}>\n <RequiredFilter\n label={t('inventory.filters.category')}\n value={categories.find((c) => c.id === categoryId)?.name ?? t('inventory.filters.allCategories')}\n icon={Layers}\n className=\"h-9 w-full justify-start\"\n align=\"start\"\n >\n {(close: () => void) => (\n <div className=\"max-h-72 space-y-0.5 overflow-y-auto\">\n <FilterMenuRow active={!categoryId} onClick={() => { setCategoryId(''); close() }}>\n {t('inventory.filters.allCategories')}\n </FilterMenuRow>\n {categories.map((c) => (\n <FilterMenuRow key={c.id} active={categoryId === c.id} onClick={() => { setCategoryId(c.id); close() }}>\n <span className=\"truncate\">{c.name}</span>\n </FilterMenuRow>\n ))}\n </div>\n )}\n </RequiredFilter>\n </FilterPanelField>\n )}\n\n <FilterPanelField label={t('inventory.filters.channel')}>\n <RequiredFilter\n label={t('inventory.filters.channel')}\n value={channelOptions.find((c) => c.value === channelFilter)?.label ?? t('inventory.filters.allChannels')}\n icon={Store}\n className=\"h-9 w-full justify-start\"\n align=\"start\"\n >\n {(close: () => void) => (\n <div className=\"space-y-0.5\">\n <FilterMenuRow active={!channelFilter} onClick={() => { setChannelFilter(undefined); close() }}>\n {t('inventory.filters.allChannels')}\n </FilterMenuRow>\n {channelOptions.map((c) => (\n <FilterMenuRow key={c.value} active={channelFilter === c.value} onClick={() => { setChannelFilter(c.value); close() }}>\n {c.label}\n </FilterMenuRow>\n ))}\n </div>\n )}\n </RequiredFilter>\n </FilterPanelField>\n\n <FilterPanelField label={t('inventory.filters.status')}>\n <RequiredFilter\n label={t('inventory.filters.status')}\n value={\n activeFilter === undefined\n ? t('inventory.filters.allStatuses')\n : activeFilter === 'true'\n ? t('inventory.productList.active')\n : t('inventory.productList.inactive')\n }\n icon={CircleCheck}\n className=\"h-9 w-full justify-start\"\n align=\"start\"\n >\n {(close: () => void) => (\n <div className=\"space-y-0.5\">\n <FilterMenuRow active={activeFilter === undefined} onClick={() => { setActiveFilter(undefined); close() }}>\n {t('inventory.filters.allStatuses')}\n </FilterMenuRow>\n <FilterMenuRow active={activeFilter === 'true'} onClick={() => { setActiveFilter('true'); close() }}>\n {t('inventory.productList.active')}\n </FilterMenuRow>\n <FilterMenuRow active={activeFilter === 'false'} onClick={() => { setActiveFilter('false'); close() }}>\n {t('inventory.productList.inactive')}\n </FilterMenuRow>\n </div>\n )}\n </RequiredFilter>\n </FilterPanelField>\n </FilterPanel>\n )\n\n return (\n <div className=\"space-y-4\">\n {filtros}\n <CrudListView<Product>\n entityDef={entity}\n items={loadedOnce ? products : null}\n total={productsTotal}\n search={search}\n onSearchChange={(value) => { setPage(1); setSearch(value) }}\n searchPlaceholder={t('inventory.productList.searchPlaceholder')}\n page={page}\n pageSize={PAGE_SIZE}\n onPageChange={setPage}\n bulkActions={bulkActions}\n onNew={onNew}\n // O produto É alcançável pelo agente: o plugin o publica em\n // `queryEntities` com `writable: true`, então `createRecord` resolve o\n // alvo e a porta leva a algum lugar. Ver CrudListView.aiCreate.\n aiCreate={{\n hint: t('inventory.productList.askPlaceholder'),\n description: t('inventory.productList.aiHint'),\n intro: {\n role: 'operations',\n persona: t('inventory.productList.askPersona'),\n pitch: t('inventory.productList.askPitch'),\n description: t('inventory.productList.askDescription'),\n suggestions: [0, 1, 2].map((i) => ({ label: t(`inventory.productList.askSuggestion.${i}`) })),\n },\n }}\n addLabel={t('inventory.productList.newProduct')}\n onRowClick={(row) => onOpen?.((row as { id: string }).id)}\n feature=\"inventory\"\n />\n </div>\n )\n}\n","import { useOfferedPlugins } from '@fayz-ai/admin'\nimport { useInventoryHouseModules } from '../components/InventoryGeneralSettings'\n\n/**\n * Does this account sell from a menu? A shirt for sale is not a dish: prep\n * time, allergens and add-ons only belong where a trade offers the menu.\n * An app with no declared offer keeps the menu sheets, as before.\n */\nexport function useHasMenu(): boolean {\n const offered = useOfferedPlugins()\n return offered.length === 0 || offered.includes('menu')\n}\n\n/** Does this house use technical sheets? Its own switch, over its trade's default. */\nexport function useHasRecipes(): boolean {\n return useInventoryHouseModules().get('recipes')\n}\n","// Unit families and the portion × batch rule of a technical sheet.\n// Mirrors V1 (src/lib/unitConversion.ts + src/lib/recipeYield.ts): the stored\n// quantity is ALWAYS in the ingredient's base unit; a family unit is only how\n// the line is read and typed (0,07 L ⇄ 70 mL).\n\nexport interface UnitLike {\n id: string\n name: string\n abbreviation: string\n}\n\nexport type YieldMode = 'portion' | 'batch'\n\ntype Family = 'mass' | 'volume'\n\n// 'lt' is deliberately absent: in these catalogues LT is a can, not a litre.\nconst FAMILY_BY_ABBR: Record<string, { family: Family; toBase: number }> = {\n kg: { family: 'mass', toBase: 1000 },\n g: { family: 'mass', toBase: 1 },\n mg: { family: 'mass', toBase: 0.001 },\n l: { family: 'volume', toBase: 1000 },\n ml: { family: 'volume', toBase: 1 },\n}\n\nconst norm = (a?: string | null) => (a ?? '').trim().toLowerCase()\n\n/** Stabilises conversion floats (0.07 × 1000 = 70.00000000000001). */\nexport const roundSmart = (v: number): number => parseFloat(v.toFixed(9))\n\nexport function unitFamily(abbr?: string | null) {\n return FAMILY_BY_ABBR[norm(abbr)] ?? null\n}\n\nexport function sameFamilyUnits<U extends UnitLike>(all: U[], baseAbbr?: string | null): U[] {\n const fam = unitFamily(baseAbbr)\n if (!fam) return []\n return all.filter((u) => unitFamily(u.abbreviation)?.family === fam.family)\n}\n\nexport function convertUnit(value: number, fromAbbr?: string | null, toAbbr?: string | null): number | null {\n const f = unitFamily(fromAbbr)\n const t = unitFamily(toAbbr)\n if (!f || !t || f.family !== t.family) return null\n return roundSmart((value * f.toBase) / t.toBase)\n}\n\n/**\n * Reading unit for a base value: the largest family unit where the number is\n * ≥ 1 (0,08 kg → g). Null when the base already reads well.\n */\nexport function bestDisplayUnit<U extends UnitLike>(valueInBase: number, baseAbbr: string | null | undefined, candidates: U[]): U | null {\n const fam = unitFamily(baseAbbr)\n if (!fam || !valueInBase || Math.abs(valueInBase) >= 1) return null\n const opts = candidates\n .map((u) => ({ u, info: unitFamily(u.abbreviation) }))\n .filter((x): x is { u: U; info: { family: Family; toBase: number } } => !!x.info && x.info.family === fam.family)\n .sort((a, b) => b.info.toBase - a.info.toBase)\n for (const o of opts) {\n if (Math.abs((valueInBase * fam.toBase) / o.info.toBase) >= 1) return o.u\n }\n return opts.length ? opts[opts.length - 1].u : null\n}\n\n/** Yield in the product's base unit (2.400 g of a product counted in kg = 2,4). */\nexport function yieldInBase(yieldQty: number, yieldAbbr?: string | null, productAbbr?: string | null): number {\n const q = Number(yieldQty) || 0\n if (q <= 0) return 1\n if (!yieldAbbr || !productAbbr || norm(yieldAbbr) === norm(productAbbr)) return q\n return convertUnit(q, yieldAbbr, productAbbr) ?? q\n}\n\n/** Cost of ONE unit of the product: portion = the sum; batch = sum ÷ yield. */\nexport function costPerUnit(totalCost: number, mode: YieldMode | null | undefined, yieldBase: number): number {\n if (mode !== 'batch') return totalCost\n return yieldBase > 0 ? totalCost / yieldBase : totalCost\n}\n","import { formatCurrency } from '@fayz-ai/core'\nimport { useSaveBar } from '@fayz-ai/ui'\nexport const brl = (v: number) => formatCurrency(Number(v) || 0)\n\n/** The kit has no textarea; this matches its Input. */\nexport const TEXTAREA =\n 'w-full rounded-input border border-input bg-card px-3 py-2 text-sm shadow-[inset_0_1px_0_rgb(0_0_0_/0.06)] placeholder:text-muted-foreground focus:outline-none focus:ring-2 focus:ring-ring resize-y'\n\n/**\n * Registers a tab's form with the page's save bar. Rendered only once the tab\n * has loaded: the product page registers its own (clean) entry, and the bar\n * shows the most recently mounted one — mounting after the page puts the\n * tab's on top.\n */\nexport function SaveBarSlot(props: Parameters<typeof useSaveBar>[0]) {\n useSaveBar(props)\n return null\n}\n","import React, { useState } from 'react'\nimport { Loader2 } from 'lucide-react'\nimport {\n AiActionButton, Button, Input, Modal, ModalContent, ModalHeader, ModalTitle, ModalDescription, ModalBody, ModalFooter, toast,\n} from '@fayz-ai/ui'\nimport { useTranslation } from '@fayz-ai/core'\nimport { useInventoryProvider } from '../../context'\nimport type { IngredientInfo } from '@fayz-ai/inventory/domain/recipe-sheet'\nimport { brl } from './shared'\n\n/** ✎ on a sheet line: the ingredient's cost, for every sheet that uses it. */\nexport function IngredientCostDialog({ ingredient, unitAbbr, onClose, onSaved }: {\n ingredient: IngredientInfo\n unitAbbr?: string\n onClose: () => void\n onSaved: (cost: number) => void\n}) {\n const t = useTranslation()\n const provider = useInventoryProvider()\n const [price, setPrice] = useState(ingredient.cost > 0 ? String(ingredient.cost).replace('.', ',') : '')\n const [reasoning, setReasoning] = useState('')\n const [asking, setAsking] = useState(false)\n const [saving, setSaving] = useState(false)\n const value = parseFloat(price.replace(',', '.')) || 0\n\n const askAi = async () => {\n setAsking(true)\n try {\n const s = await provider.suggestIngredientCost!(ingredient.productId, ingredient.name)\n if (s.suggestedPrice > 0) {\n setPrice(String(s.suggestedPrice).replace('.', ','))\n setReasoning(s.reasoning ?? '')\n // The AI picks its own unit; say which, so a price per kg is not\n // typed into a line counted in grams without anyone noticing.\n if (s.unitAbbreviation && unitAbbr && s.unitAbbreviation.toLowerCase() !== unitAbbr.toLowerCase()) {\n toast.warning(t('inventory.sheet.aiUnitMismatch', { ai: s.unitAbbreviation, unit: unitAbbr }))\n }\n } else {\n toast.error(t('inventory.sheet.aiNoPrice'))\n }\n } catch (e) {\n toast.error(e instanceof Error ? e.message : t('inventory.sheet.aiFailed'))\n } finally {\n setAsking(false)\n }\n }\n\n const save = async () => {\n setSaving(true)\n try {\n await provider.setIngredientCost!(ingredient.productId, value)\n onSaved(value)\n toast.success(t('inventory.sheet.costUpdated', { name: ingredient.name, price: brl(value) }))\n onClose()\n } catch (e) {\n toast.error(e instanceof Error ? e.message : t('inventory.sheet.saveFailed'))\n } finally {\n setSaving(false)\n }\n }\n\n return (\n <Modal open onOpenChange={(o) => { if (!o) onClose() }}>\n <ModalContent size=\"md\">\n <ModalHeader>\n <ModalTitle>{t('inventory.sheet.costDialogTitle')}: <span className=\"text-primary\">{ingredient.name}</span></ModalTitle>\n <ModalDescription>{t('inventory.sheet.costDialogHint')}</ModalDescription>\n </ModalHeader>\n <ModalBody>\n <label className=\"block\">\n <span className=\"mb-1 block text-sm font-medium\">\n {t('inventory.sheet.costPrice')}{unitAbbr ? ` (${t('inventory.sheet.per')} ${unitAbbr})` : ''}\n </span>\n <div className=\"flex gap-2\">\n <Input inputMode=\"decimal\" value={price} onChange={(e) => setPrice(e.target.value)} placeholder=\"0,00\" autoFocus />\n {provider.suggestIngredientCost && (\n <AiActionButton type=\"button\" tone=\"soft\" onClick={() => void askAi()} busy={asking} className=\"shrink-0\">\n IA\n </AiActionButton>\n )}\n </div>\n </label>\n {reasoning && <p className=\"mt-2 text-xs text-muted-foreground\">{reasoning}</p>}\n <p className=\"mt-3 text-xs text-muted-foreground\">{t('inventory.sheet.costAppliesEverywhere')}</p>\n </ModalBody>\n <ModalFooter>\n <Button variant=\"outline\" onClick={onClose} disabled={saving}>{t('common.cancel')}</Button>\n <Button onClick={() => void save()} disabled={saving || value <= 0}>\n {saving ? <Loader2 className=\"mr-2 h-4 w-4 animate-spin\" /> : null}{t('common.save')}\n </Button>\n </ModalFooter>\n {value <= 0 && price !== '' && <p className=\"px-6 pb-4 text-xs text-destructive\">{t('inventory.sheet.costInvalid')}</p>}\n </ModalContent>\n </Modal>\n )\n}\n","import React, { useRef, useState } from 'react'\nimport { Loader2, Sparkles, Upload, X } from 'lucide-react'\nimport {\n AiActionButton, Button, Input, Modal, ModalContent, ModalHeader, ModalTitle, ModalBody, ModalFooter, toast,\n} from '@fayz-ai/ui'\nimport { useTranslation } from '@fayz-ai/core'\nimport { useInventoryProvider } from '../../context'\nimport type { Product } from '@fayz-ai/inventory/domain/product'\nimport type { ProductionStation, RecipeAiSuggestion } from '@fayz-ai/inventory/domain/recipe-sheet'\nimport { TEXTAREA } from './shared'\n\n/** \"Sugerir Ficha Técnica com IA\": fills the sheet on screen; saves nothing. */\nexport function RecipeAiDialog({ product, stations, onClose, onSuggestion }: {\n product: Product\n stations: ProductionStation[]\n onClose: () => void\n onSuggestion: (s: RecipeAiSuggestion) => void\n}) {\n const t = useTranslation()\n const provider = useInventoryProvider()\n const [name, setName] = useState(product.name)\n const [description, setDescription] = useState(product.description ?? '')\n const [instructions, setInstructions] = useState('')\n const [images, setImages] = useState<string[]>(product.imageUrl ? [product.imageUrl] : [])\n const [uploading, setUploading] = useState(false)\n const [loading, setLoading] = useState(false)\n const fileRef = useRef<HTMLInputElement>(null)\n\n const upload = async (file?: File) => {\n if (!file || !provider.uploadAiReference) return\n setUploading(true)\n try {\n const url = await provider.uploadAiReference(file)\n setImages((xs) => [...xs, url])\n } catch (e) {\n toast.error(e instanceof Error ? e.message : t('inventory.sheet.uploadFailed'))\n } finally {\n setUploading(false)\n }\n }\n\n const generate = async () => {\n setLoading(true)\n try {\n const s = await provider.suggestRecipe!({\n productId: product.id, productName: name.trim(), description, imageUrls: images, instructions,\n })\n onSuggestion(s)\n toast.success(t('inventory.sheet.aiApplied'))\n onClose()\n } catch (e) {\n toast.error(e instanceof Error ? e.message : t('inventory.sheet.aiFailed'))\n } finally {\n setLoading(false)\n }\n }\n\n return (\n <Modal open onOpenChange={(o) => { if (!o && !loading) onClose() }}>\n <ModalContent size=\"2xl\">\n <ModalHeader>\n <ModalTitle className=\"flex items-center gap-2\"><Sparkles className=\"h-5 w-5 text-primary\" /> {t('inventory.sheet.aiTitle')}</ModalTitle>\n </ModalHeader>\n <ModalBody className=\"space-y-4\">\n <div>\n <span className=\"mb-1 block text-sm font-medium\">{t('inventory.sheet.aiPhotos')}</span>\n <div className=\"flex flex-wrap gap-2\">\n {images.map((url, i) => (\n <div key={url} className=\"relative h-20 w-20 overflow-hidden rounded-lg border\">\n <img src={url} alt=\"\" className=\"h-full w-full object-cover\" />\n <Button variant=\"bare\" size=\"bare\" type=\"button\" aria-label={t('inventory.sheet.removePhoto')} onClick={() => setImages(images.filter((_, idx) => idx !== i))}\n className=\"font-normal absolute right-1 top-1 rounded-full bg-background/80 p-0.5\">\n <X className=\"h-3 w-3\" />\n </Button>\n </div>\n ))}\n {provider.uploadAiReference && (\n <Button variant=\"bare\" size=\"bare\" type=\"button\" onClick={() => fileRef.current?.click()} disabled={uploading} aria-label={t('inventory.sheet.addPhoto')}\n className=\"font-normal flex h-20 w-20 items-center justify-center rounded-lg border-2 border-dashed transition-colors hover:border-primary/50\">\n {uploading ? <Loader2 className=\"h-5 w-5 animate-spin\" /> : <Upload className=\"h-5 w-5 text-muted-foreground\" />}\n </Button>\n )}\n <input ref={fileRef} type=\"file\" accept=\"image/*\" className=\"hidden\" onChange={(e) => { void upload(e.target.files?.[0]); e.target.value = '' }} />\n </div>\n <p className=\"mt-1 text-xs text-muted-foreground\">{t('inventory.sheet.aiPhotosHint')}</p>\n </div>\n <label className=\"block\">\n <span className=\"mb-1 block text-sm font-medium\">{t('inventory.sheet.aiProductName')}</span>\n <Input value={name} onChange={(e) => setName(e.target.value)} />\n </label>\n <label className=\"block\">\n <span className=\"mb-1 block text-sm font-medium\">{t('inventory.sheet.description')}</span>\n <textarea className={TEXTAREA} rows={2} value={description} onChange={(e) => setDescription(e.target.value)} />\n </label>\n <div className=\"rounded-lg border bg-muted/40 p-3\">\n <div className=\"mb-1 text-xs font-medium\">{t('inventory.sheet.aiStations')}</div>\n <div className=\"flex flex-wrap gap-1.5\">\n {stations.length === 0 && <span className=\"text-xs text-muted-foreground\">{t('inventory.sheet.aiNoStations')}</span>}\n {stations.map((s) => <span key={s.id} className=\"rounded-full border bg-background px-2 py-0.5 text-xs\">{s.name}</span>)}\n </div>\n </div>\n <label className=\"block\">\n <span className=\"mb-1 block text-sm font-medium\">{t('inventory.sheet.aiInstructions')}</span>\n <textarea className={TEXTAREA} rows={3} value={instructions} onChange={(e) => setInstructions(e.target.value)} placeholder={t('inventory.sheet.aiInstructionsPlaceholder')} />\n </label>\n <p className=\"text-xs text-muted-foreground\">{t('inventory.sheet.aiReplaces')}</p>\n </ModalBody>\n <ModalFooter>\n <Button variant=\"outline\" onClick={onClose} disabled={loading}>{t('common.cancel')}</Button>\n <AiActionButton onClick={() => void generate()} busy={loading} busyLabel={t('inventory.sheet.aiGenerating')} disabled={!name.trim()}>\n {t('inventory.sheet.aiGenerate')}\n </AiActionButton>\n </ModalFooter>\n </ModalContent>\n </Modal>\n )\n}\n","import React, { useState } from 'react'\nimport { Loader2 } from 'lucide-react'\nimport {\n Button, Input, Modal, ModalContent, ModalHeader, ModalTitle, ModalDescription, ModalBody, ModalFooter,\n Select, SelectContent, SelectItem, SelectTrigger, SelectValue, toast,\n} from '@fayz-ai/ui'\nimport { useTranslation } from '@fayz-ai/core'\nimport { useInventoryProvider } from '../../context'\nimport type { MeasurementUnit } from '@fayz-ai/inventory/domain/product'\nimport type { RecipeSheetGroup } from '@fayz-ai/inventory/domain/recipe-sheet'\n\n/**\n * ⋮ → \"Transformar em produto intermediário\": a new Intermediário product with\n * this block as its own sheet. Written on confirm, as in V1 (V1-084) — the\n * difference is that its sheet goes through the same atomic save.\n */\nexport function TransformIntermediateDialog({ defaultName, units, group, onClose, onCreated }: {\n defaultName: string\n units: MeasurementUnit[]\n group: Omit<RecipeSheetGroup, 'name'>\n onClose: () => void\n onCreated: (productId: string) => void\n}) {\n const t = useTranslation()\n const provider = useInventoryProvider()\n const kg = units.find((u) => u.abbreviation.toLowerCase() === 'kg') ?? units.find((u) => u.abbreviation.toLowerCase() === 'g')\n const [name, setName] = useState(defaultName.trim())\n const [yieldQty, setYieldQty] = useState('1')\n const [unitId, setUnitId] = useState(kg?.id ?? '')\n const [saving, setSaving] = useState(false)\n const qty = parseFloat(yieldQty.replace(',', '.')) || 0\n const missing = !name.trim() ? t('inventory.sheet.transformNameRequired')\n : qty <= 0 ? t('inventory.sheet.transformYieldRequired')\n : !unitId ? t('inventory.sheet.transformUnitRequired') : null\n\n const create = async () => {\n if (missing) return\n setSaving(true)\n try {\n const dup = await provider.getProducts({ search: name.trim(), pageSize: 5 })\n if (dup.data.some((p) => p.name.trim().toLowerCase() === name.trim().toLowerCase())) {\n toast.error(t('inventory.sheet.transformDuplicate'))\n return\n }\n const product = await provider.createProduct({\n name: name.trim(),\n productType: 'intermediate',\n measurementUnitId: unitId,\n classification: { isIntermediate: true, isIngredient: false, isForSale: false, isAsset: false, isProduced: true },\n })\n await provider.saveRecipeSheet!({\n productId: product.id,\n name: name.trim(),\n yieldQuantity: qty,\n yieldUnitId: unitId,\n yieldMode: 'batch',\n instructions: group.preparationNotes,\n groups: [{ ...group, name: name.trim() }],\n outputs: [],\n }, null)\n toast.success(t('inventory.sheet.transformDone', { name: name.trim() }))\n onCreated(product.id)\n } catch (e) {\n toast.error(e instanceof Error ? e.message : t('inventory.sheet.transformFailed'))\n } finally {\n setSaving(false)\n }\n }\n\n return (\n <Modal open onOpenChange={(o) => { if (!o && !saving) onClose() }}>\n <ModalContent size=\"md\">\n <ModalHeader>\n <ModalTitle>{t('inventory.sheet.transform')}</ModalTitle>\n <ModalDescription>{t('inventory.sheet.transformHint')}</ModalDescription>\n </ModalHeader>\n <ModalBody className=\"space-y-4\">\n <label className=\"block\">\n <span className=\"mb-1 block text-sm font-medium\">{t('inventory.sheet.transformName')} *</span>\n <Input value={name} onChange={(e) => setName(e.target.value)} placeholder={t('inventory.sheet.transformNamePlaceholder')} autoFocus />\n </label>\n <div className=\"grid grid-cols-12 gap-3\">\n <label className=\"col-span-5 block\">\n <span className=\"mb-1 block text-sm font-medium\">{t('inventory.sheet.yield')} *</span>\n <Input type=\"number\" step=\"0.001\" value={yieldQty} onChange={(e) => setYieldQty(e.target.value)} placeholder=\"500\" />\n </label>\n <label className=\"col-span-7 block\">\n <span className=\"mb-1 block text-sm font-medium\">{t('inventory.sheet.unit')} *</span>\n <Select value={unitId || undefined} onValueChange={setUnitId}>\n <SelectTrigger><SelectValue placeholder={t('inventory.sheet.transformUnitPlaceholder')} /></SelectTrigger>\n <SelectContent>\n {units.map((u) => <SelectItem key={u.id} value={u.id}>{u.name} ({u.abbreviation})</SelectItem>)}\n </SelectContent>\n </Select>\n </label>\n </div>\n {missing && <p className=\"text-xs text-muted-foreground\">{missing}</p>}\n </ModalBody>\n <ModalFooter>\n <Button variant=\"outline\" onClick={onClose} disabled={saving}>{t('common.cancel')}</Button>\n <Button onClick={() => void create()} disabled={saving || !!missing}>\n {saving && <Loader2 className=\"mr-2 h-4 w-4 animate-spin\" />}\n {saving ? t('inventory.sheet.transformCreating') : t('inventory.sheet.transformCreate')}\n </Button>\n </ModalFooter>\n </ModalContent>\n </Modal>\n )\n}\n","import React, { useState } from 'react'\nimport { Loader2 } from 'lucide-react'\nimport {\n Button, CurrencyInput, Input, Modal, ModalContent, ModalHeader, ModalTitle, ModalDescription, ModalBody, ModalFooter,\n Select, SelectContent, SelectItem, SelectTrigger, SelectValue, toast,\n} from '@fayz-ai/ui'\nimport { useTranslation } from '@fayz-ai/core'\nimport { useInventoryProvider } from '../../context'\nimport type { IngredientInfo } from '@fayz-ai/inventory/domain/recipe-sheet'\nimport type { MeasurementUnit } from '@fayz-ai/inventory/domain/product'\n\n/**\n * \"Criar insumo\" from a sheet line. The unit is asked for because the line's\n * quantity is stored in it — an ingredient without one can't be costed or\n * converted (g ↔ kg), which is the hole the migrated catalogue already has.\n */\nexport function QuickIngredientDialog({ defaultName, units, onClose, onCreated }: {\n defaultName: string\n units: MeasurementUnit[]\n onClose: () => void\n onCreated: (row: IngredientInfo) => void\n}) {\n const t = useTranslation()\n const provider = useInventoryProvider()\n const [name, setName] = useState(defaultName)\n const [unitId, setUnitId] = useState('')\n const [cost, setCost] = useState(0)\n const [saving, setSaving] = useState(false)\n const missing = !name.trim() ? t('inventory.sheet.quickNameRequired') : !unitId ? t('inventory.sheet.quickUnitRequired') : null\n\n const create = async () => {\n if (missing) return\n setSaving(true)\n try {\n const p = await provider.createProduct({\n name: name.trim(),\n productType: 'ingredient',\n classification: { isIngredient: true },\n measurementUnitId: unitId,\n costPrice: cost > 0 ? cost : undefined,\n })\n toast.success(t('inventory.sheet.ingredientCreated', { name: name.trim() }))\n onCreated({ productId: p.id, name: p.name, cost: Number(p.costPrice) || cost, baseUnitId: p.measurementUnitId ?? unitId })\n } catch (e) {\n toast.error(e instanceof Error ? e.message : t('inventory.sheet.ingredientCreateFailed'))\n } finally {\n setSaving(false)\n }\n }\n\n const unit = units.find((u) => u.id === unitId)\n return (\n <Modal open onOpenChange={(o) => { if (!o && !saving) onClose() }}>\n <ModalContent size=\"md\">\n <ModalHeader>\n <ModalTitle>{t('inventory.sheet.quickTitle')}</ModalTitle>\n <ModalDescription>{t('inventory.sheet.quickHint')}</ModalDescription>\n </ModalHeader>\n <ModalBody className=\"space-y-4\">\n <label className=\"block\">\n <span className=\"mb-1 block text-sm font-medium\">{t('inventory.sheet.quickName')} *</span>\n <Input value={name} onChange={(e) => setName(e.target.value)} autoFocus />\n </label>\n <label className=\"block\">\n <span className=\"mb-1 block text-sm font-medium\">{t('inventory.sheet.quickUnit')} *</span>\n <Select value={unitId || undefined} onValueChange={setUnitId}>\n <SelectTrigger><SelectValue placeholder={t('inventory.sheet.transformUnitPlaceholder')} /></SelectTrigger>\n <SelectContent>\n {units.map((u) => <SelectItem key={u.id} value={u.id}>{u.name} ({u.abbreviation})</SelectItem>)}\n </SelectContent>\n </Select>\n <span className=\"mt-1 block text-xs text-muted-foreground\">{t('inventory.sheet.quickUnitHint')}</span>\n </label>\n <label className=\"block\">\n <span className=\"mb-1 block text-sm font-medium\">\n {t('inventory.sheet.costPrice')}{unit ? ` (${t('inventory.sheet.per')} ${unit.abbreviation})` : ''}\n </span>\n <CurrencyInput value={cost} onChange={setCost} />\n </label>\n {missing && <p className=\"text-xs text-muted-foreground\">{missing}</p>}\n </ModalBody>\n <ModalFooter>\n <Button variant=\"outline\" onClick={onClose} disabled={saving}>{t('common.cancel')}</Button>\n <Button onClick={() => void create()} disabled={saving || !!missing}>\n {saving && <Loader2 className=\"mr-2 h-4 w-4 animate-spin\" />}{t('inventory.sheet.quickCreate')}\n </Button>\n </ModalFooter>\n </ModalContent>\n </Modal>\n )\n}\n","import type { InventoryDataProvider } from '@fayz-ai/inventory/data/provider'\nimport type { RecipeListRow } from '@fayz-ai/inventory/domain/recipe-sheet'\nimport { convertUnit, bestDisplayUnit } from '../../lib/recipe-units'\nimport { openPrintWindow, printDocument } from '@fayz-ai/ui'\nimport { brl } from './shared'\n\nconst esc = (s: unknown) =>\n String(s ?? '').replace(/[&<>\"']/g, (c) => ({ '&': '&amp;', '<': '&lt;', '>': '&gt;', '\"': '&quot;', \"'\": '&#39;' }[c]!))\n\n/**\n * The printable sheet, as V1 prints it, plus what V1 left out: components by\n * station and the preparation text. Opens in a new window and calls print.\n */\nexport async function printRecipe(provider: InventoryDataProvider, row: RecipeListRow): Promise<void> {\n // Open first, synchronously with the click: a window opened after an await\n // is a pop-up and gets blocked.\n const w = openPrintWindow()\n if (!w) throw new Error('Permita pop-ups para imprimir.')\n\n const [sheet, units, stations] = await Promise.all([\n provider.getRecipeSheet!(row.productId),\n provider.getMeasurementUnitList?.() ?? [],\n provider.getProductionStations?.() ?? [],\n ])\n const ids = sheet?.groups.flatMap((g) => g.ingredients.map((l) => l.productId)) ?? []\n const info = new Map((await (provider.getIngredientInfo?.(ids) ?? Promise.resolve([]))).map((i) => [i.productId, i]))\n const unit = new Map(units.map((u) => [u.id, u]))\n const station = new Map(stations.map((s) => [s.id, s.name]))\n const cmv = row.salePrice > 0 && row.cost > 0 ? (row.cost / row.salePrice) * 100 : null\n\n const groupsHtml = (sheet?.groups ?? []).map((g) => {\n const lines = g.ingredients.map((l) => {\n const i = info.get(l.productId)\n const baseAbbr = unit.get(i?.baseUnitId ?? l.unitId ?? '')?.abbreviation\n const display = l.displayUnitId ? unit.get(l.displayUnitId) : bestDisplayUnit(l.quantity, baseAbbr, units)\n const shown = display ? convertUnit(l.quantity, baseAbbr, display.abbreviation) : null\n const cost = (i?.cost ?? 0) * l.quantity\n return `<tr>\n <td>${esc(i?.name ?? '-')}</td>\n <td class=\"num\">${(shown ?? l.quantity).toLocaleString('pt-BR')} ${esc(shown != null ? display!.abbreviation : baseAbbr ?? '')}</td>\n <td class=\"num\">${i?.cost ? brl(i.cost) : '—'}</td>\n <td class=\"num\">${i?.cost ? brl(cost) : '—'}</td>\n <td>${esc(l.notes ?? '')}</td>\n </tr>`\n }).join('')\n return `<h2>${esc(g.name)}${g.stationId && station.get(g.stationId) ? ` <span class=\"muted\">· ${esc(station.get(g.stationId))}</span>` : ''}${g.estimatedMinutes ? ` <span class=\"muted\">· ${g.estimatedMinutes} min</span>` : ''}</h2>\n <table>\n <thead><tr><th>Insumo</th><th class=\"num\">Qtd</th><th class=\"num\">Custo Unit.</th><th class=\"num\">Subtotal</th><th>Obs.</th></tr></thead>\n <tbody>${lines || '<tr><td colspan=\"5\" class=\"empty\">Sem insumos</td></tr>'}</tbody>\n </table>\n ${g.preparationNotes ? `<div class=\"desc\"><b>Modo de preparo:</b> ${esc(g.preparationNotes)}</div>` : ''}`\n }).join('')\n\n printDocument({\n target: w,\n title: `Ficha Técnica - ${row.productName}`,\n css: `\n *{box-sizing:border-box} body{font-family:Arial,Helvetica,sans-serif;color:#111}\n h1{font-size:20px;margin:0 0 4px} h2{font-size:14px;margin:20px 0 4px} .muted{color:#666;font-size:12px;font-weight:normal}\n .meta{display:grid;grid-template-columns:repeat(3,1fr);gap:12px;margin:16px 0;padding:12px;border:1px solid #ddd;border-radius:6px}\n .meta div{font-size:12px} .meta b{display:block;font-size:11px;color:#666;margin-bottom:2px;text-transform:uppercase;letter-spacing:.4px}\n table{width:100%;border-collapse:collapse;margin-top:4px;font-size:13px}\n th,td{border-bottom:1px solid #eee;padding:6px 8px;text-align:left}\n th{background:#f6f6f6;font-size:11px;text-transform:uppercase;letter-spacing:.3px}\n td.num,th.num{text-align:right;font-variant-numeric:tabular-nums} td.empty{text-align:center;color:#888;padding:16px}\n .desc{margin-top:8px;font-size:13px;white-space:pre-wrap}\n \n`,\n body: `\n <h1>Ficha Técnica</h1>\n <div class=\"muted\">${esc(row.productName)}</div>\n ${row.description ? `<div class=\"desc\">${esc(row.description)}</div>` : ''}\n <div class=\"meta\">\n <div><b>Rendimento</b>${row.yieldQuantity ?? '-'} ${esc(row.yieldUnitAbbr ?? '')}</div>\n <div><b>Preparo</b>${row.preparationTimeMinutes ? row.preparationTimeMinutes + ' min' : '-'}</div>\n <div><b>Insumos</b>${row.ingredientCount}</div>\n <div><b>Custo</b>${brl(row.cost)}</div>\n <div><b>Venda</b>${brl(row.salePrice)}</div>\n <div><b>CMV</b>${cmv !== null ? cmv.toFixed(1).replace('.', ',') + '%' : '—'}</div>\n </div>\n ${groupsHtml}\n ${sheet?.instructions ? `<h2>Modo de Preparo Geral / Montagem</h2><div class=\"desc\">${esc(sheet.instructions)}</div>` : ''}\n`,\n })\n}\n","import React, { useCallback, useEffect, useMemo, useState } from 'react'\nimport { Plus, Trash2, MoreVertical, Package, Pencil, Printer } from 'lucide-react'\nimport {\n AiActionButton, Button, Card, CardContent, Input, SearchSelect, Select, SelectContent, SelectItem, SelectTrigger, SelectValue,\n Dropdown, DropdownTrigger, DropdownContent, DropdownItem, DropdownSeparator,\n Tooltip, TooltipTrigger, TooltipContent, TooltipProvider, Skeleton, toast,\n} from '@fayz-ai/ui'\nimport { errorMessage, useTranslation } from '@fayz-ai/core'\nimport { useInventoryProvider } from '../../context'\nimport type { Product, MeasurementUnit } from '@fayz-ai/inventory/domain/product'\nimport type { IngredientInfo, ProductionStation, RecipeOutputType, RecipeSheet } from '@fayz-ai/inventory/domain/recipe-sheet'\nimport {\n bestDisplayUnit, convertUnit, costPerUnit, roundSmart, sameFamilyUnits, yieldInBase, type YieldMode,\n} from '../../lib/recipe-units'\nimport { CMV_TONE, cmvBand, cmvPercent } from '@fayz-ai/inventory/domain/recipe'\nimport { IngredientCostDialog } from './IngredientCostDialog'\nimport { RecipeAiDialog } from './RecipeAiDialog'\nimport { TransformIntermediateDialog } from './TransformIntermediateDialog'\nimport { QuickIngredientDialog } from './QuickIngredientDialog'\nimport { brl, SaveBarSlot, TEXTAREA } from './shared'\nimport { printRecipe } from './printRecipe'\n\ninterface Line {\n key: string\n productId: string\n productName: string\n /** In the reading unit (displayUnitId, or the base when empty). */\n quantity: string\n displayUnitId: string\n notes: string\n /** Name the AI proposed when it found no catalogue match. */\n hint?: string\n}\n\ninterface Group {\n key: string\n name: string\n stationId: string\n preparationNotes: string\n estimatedMinutes: string\n lines: Line[]\n}\n\ninterface Output {\n key: string\n productId: string\n productName: string\n outputType: RecipeOutputType\n expectedQuantity: string\n measurementUnitId: string\n costShare: string\n}\n\nlet seq = 0\nconst key = () => `k${++seq}`\nconst num = (s: string) => parseFloat(String(s).replace(',', '.')) || 0\n\nconst OUTPUT_TYPES: RecipeOutputType[] = ['main', 'coproduct', 'byproduct', 'waste']\n\nexport function RecipeEditor({ product, onSaved }: {\n product: Product\n /** After a save: the product's cost and flags changed. */\n onSaved?: () => void\n}) {\n const t = useTranslation()\n const provider = useInventoryProvider()\n\n const [loading, setLoading] = useState(true)\n const [units, setUnits] = useState<MeasurementUnit[]>([])\n const [stations, setStations] = useState<ProductionStation[]>([])\n const [info, setInfo] = useState<Record<string, IngredientInfo>>({})\n const [productUnitId, setProductUnitId] = useState<string | undefined>(product.measurementUnitId)\n\n const [recipeId, setRecipeId] = useState<string | undefined>()\n const [name, setName] = useState('')\n const [description, setDescription] = useState('')\n const [yieldQuantity, setYieldQuantity] = useState('1')\n const [yieldUnitId, setYieldUnitId] = useState('')\n const [yieldMode, setYieldMode] = useState<YieldMode>('portion')\n const [prepTime, setPrepTime] = useState('')\n const [instructions, setInstructions] = useState('')\n const [groups, setGroups] = useState<Group[]>([])\n const [outputs, setOutputs] = useState<Output[]>([])\n const [dirty, setDirty] = useState(false)\n const [saving, setSaving] = useState(false)\n const [reloadKey, setReloadKey] = useState(0)\n\n const [aiOpen, setAiOpen] = useState(false)\n const [costFor, setCostFor] = useState<IngredientInfo | null>(null)\n const [transformGroup, setTransformGroup] = useState<string | null>(null)\n /** The line a «Criar insumo» fills once the product exists. */\n const [creating, setCreating] = useState<{ groupKey: string; lineKey: string; name: string } | null>(null)\n\n const unitById = useMemo(() => new Map(units.map((u) => [u.id, u])), [units])\n const abbr = useCallback((id?: string) => (id ? unitById.get(id)?.abbreviation : undefined), [unitById])\n\n const remember = useCallback((rows: IngredientInfo[]) => {\n if (rows.length) setInfo((prev) => ({ ...prev, ...Object.fromEntries(rows.map((r) => [r.productId, r])) }))\n }, [])\n\n // --- load -----------------------------------------------------------------\n useEffect(() => {\n let active = true\n setLoading(true)\n void (async () => {\n const [unitRows, stationRows, sheet] = await Promise.all([\n provider.getMeasurementUnitList?.() ?? [],\n provider.getProductionStations?.() ?? [],\n provider.getRecipeSheet?.(product.id) ?? null,\n ])\n const ids = [\n product.id,\n ...(sheet?.groups.flatMap((g) => g.ingredients.map((l) => l.productId)) ?? []),\n ...(sheet?.outputs.map((o) => o.productId) ?? []),\n ]\n const infoRows = await (provider.getIngredientInfo?.(ids) ?? Promise.resolve([]))\n if (!active) return\n const infoMap = Object.fromEntries(infoRows.map((r) => [r.productId, r]))\n const uById = new Map(unitRows.map((u) => [u.id, u]))\n setUnits(unitRows)\n setStations(stationRows)\n setInfo(infoMap)\n setProductUnitId(product.measurementUnitId ?? infoMap[product.id]?.baseUnitId)\n\n if (sheet) {\n setRecipeId(sheet.id)\n setName(sheet.name)\n setDescription(sheet.description ?? '')\n setYieldQuantity(String(sheet.yieldQuantity ?? 1))\n setYieldUnitId(sheet.yieldUnitId ?? '')\n setYieldMode(sheet.yieldMode)\n setPrepTime(sheet.preparationTimeMinutes != null ? String(sheet.preparationTimeMinutes) : '')\n setInstructions(sheet.instructions ?? '')\n setGroups(sheet.groups.map((g) => ({\n key: key(),\n name: g.name,\n stationId: g.stationId ?? '',\n preparationNotes: g.preparationNotes ?? '',\n estimatedMinutes: g.estimatedMinutes != null ? String(g.estimatedMinutes) : '',\n lines: g.ingredients.map((l) => {\n // Stored in the base unit; shown in the saved reading unit, or the\n // one where the number reads ≥ 1 (0,08 kg → 80 g), as V1 does.\n const baseId = infoMap[l.productId]?.baseUnitId ?? l.unitId\n const baseAbbr = baseId ? uById.get(baseId)?.abbreviation : undefined\n let displayId = l.displayUnitId ?? ''\n if (!displayId && baseAbbr) {\n const best = bestDisplayUnit(l.quantity, baseAbbr, unitRows)\n if (best && best.abbreviation !== baseAbbr) displayId = best.id\n }\n const shown = displayId ? convertUnit(l.quantity, baseAbbr, uById.get(displayId)?.abbreviation) : null\n return {\n key: key(),\n productId: l.productId,\n productName: infoMap[l.productId]?.name ?? '',\n quantity: String(shown ?? l.quantity),\n displayUnitId: shown == null ? '' : displayId,\n notes: l.notes ?? '',\n }\n }),\n })))\n setOutputs(sheet.outputs.map((o) => ({\n key: key(),\n productId: o.productId,\n productName: infoMap[o.productId]?.name ?? '',\n outputType: o.outputType,\n expectedQuantity: String(o.expectedQuantity),\n measurementUnitId: o.measurementUnitId ?? '',\n costShare: o.costShare != null ? String(o.costShare) : '',\n })))\n } else {\n setRecipeId(undefined)\n setName(product.name)\n setDescription('')\n setYieldQuantity('1')\n setYieldUnitId('')\n // A new intermediate's sheet is a batch; everything else, a portion.\n setYieldMode(product.classification?.isIntermediate ? 'batch' : 'portion')\n setPrepTime('')\n setInstructions('')\n setGroups([])\n setOutputs([])\n }\n setDirty(false)\n setLoading(false)\n })().catch((e) => {\n if (!active) return\n toast.error(e instanceof Error ? e.message : t('inventory.sheet.loadFailed'))\n setLoading(false)\n })\n return () => { active = false }\n }, [provider, product.id, reloadKey]) // eslint-disable-line react-hooks/exhaustive-deps\n\n // --- edit helpers ----------------------------------------------------------\n const touch = () => setDirty(true)\n const patchGroup = (gk: string, patch: Partial<Group>) => {\n setGroups((gs) => gs.map((g) => (g.key === gk ? { ...g, ...patch } : g))); touch()\n }\n const patchLine = (gk: string, lk: string, patch: Partial<Line>) => {\n setGroups((gs) => gs.map((g) => (g.key !== gk ? g : { ...g, lines: g.lines.map((l) => (l.key === lk ? { ...l, ...patch } : l)) })))\n touch()\n }\n const patchOutput = (ok: string, patch: Partial<Output>) => {\n setOutputs((os) => os.map((o) => (o.key === ok ? { ...o, ...patch } : o))); touch()\n }\n\n const baseAbbrOf = (productId: string) => abbr(info[productId]?.baseUnitId)\n const lineAbbr = (l: Line) => (l.displayUnitId ? abbr(l.displayUnitId) : baseAbbrOf(l.productId))\n const lineQtyInBase = (l: Line): number => {\n const q = num(l.quantity)\n if (!q || !l.displayUnitId) return q\n return convertUnit(q, abbr(l.displayUnitId), baseAbbrOf(l.productId)) ?? q\n }\n const lineCost = (l: Line): number | null => {\n const i = info[l.productId]\n const q = lineQtyInBase(l)\n if (!l.productId || !i || !q || !i.cost) return null\n return roundSmart(q * i.cost)\n }\n\n const changeDisplayUnit = (gk: string, l: Line, toId: string) => {\n const baseId = info[l.productId]?.baseUnitId\n const converted = convertUnit(num(l.quantity), lineAbbr(l), abbr(toId))\n patchLine(gk, l.key, {\n quantity: converted != null && l.quantity !== '' ? String(converted) : l.quantity,\n displayUnitId: toId === baseId ? '' : toId,\n })\n }\n\n // --- numbers ---------------------------------------------------------------\n const totalCost = groups.reduce((s, g) => s + g.lines.reduce((ss, l) => ss + (lineCost(l) ?? 0), 0), 0)\n const productAbbr = abbr(productUnitId)\n const yieldBase = yieldInBase(num(yieldQuantity) || 1, abbr(yieldUnitId), productAbbr)\n const unitCost = costPerUnit(totalCost, yieldMode, yieldBase)\n const salePrice = Number(product.salePrice) || 0\n const cmv = cmvPercent(unitCost, salePrice)\n\n // --- search ----------------------------------------------------------------\n const searchIngredients = useCallback(async (q: string) => {\n const rows = await (provider.searchIngredients?.(q) ?? Promise.resolve([]))\n return rows.map((r) => ({ id: r.productId, label: r.name, subtitle: abbr(r.baseUnitId), data: r }))\n }, [provider, abbr])\n\n\n // --- AI --------------------------------------------------------------------\n const applySuggestion = async (s: Awaited<ReturnType<NonNullable<typeof provider.suggestRecipe>>>) => {\n if (s.yieldQuantity) setYieldQuantity(String(s.yieldQuantity))\n if (s.yieldUnitId) setYieldUnitId(s.yieldUnitId)\n if (s.preparationTimeMinutes) setPrepTime(String(s.preparationTimeMinutes))\n if (s.generalDescription && !description) setDescription(s.generalDescription)\n const ids = s.groups.flatMap((g) => g.ingredients.map((i) => i.productId).filter(Boolean) as string[])\n const rows = ids.length ? await (provider.getIngredientInfo?.(ids) ?? Promise.resolve([])) : []\n remember(rows)\n const byId = new Map(rows.map((r) => [r.productId, r]))\n // Same as V1: the suggestion replaces every component. Nothing is saved.\n setGroups(s.groups.map((g) => ({\n key: key(),\n name: g.name,\n stationId: g.stationId ?? '',\n preparationNotes: g.preparationNotes ?? '',\n estimatedMinutes: '',\n lines: g.ingredients.map((i) => {\n const baseAbbr = abbr((i.productId && byId.get(i.productId)?.baseUnitId) || i.unitId)\n const best = baseAbbr ? bestDisplayUnit(Number(i.quantity) || 0, baseAbbr, units) : null\n const shown = best ? convertUnit(Number(i.quantity) || 0, baseAbbr, best.abbreviation) : null\n return {\n key: key(),\n productId: i.productId ?? '',\n productName: (i.productId && byId.get(i.productId)?.name) || '',\n quantity: String(shown ?? i.quantity ?? ''),\n displayUnitId: shown != null && best ? best.id : '',\n notes: i.notes ?? '',\n hint: i.productId ? undefined : i.productNameHint,\n }\n }),\n })))\n touch()\n }\n\n // --- save ------------------------------------------------------------------\n const save = async () => {\n if (!name.trim()) { toast.error(t('inventory.sheet.nameRequired')); return }\n const usable = outputs.filter((o) => o.productId && num(o.expectedQuantity) > 0 && o.outputType !== 'waste')\n const withShare = usable.filter((o) => o.costShare.trim() !== '')\n if (withShare.length > 0) {\n const sum = withShare.reduce((a, o) => a + num(o.costShare), 0)\n if (withShare.length !== usable.length || Math.abs(sum - 100) > 0.01) {\n toast.error(t('inventory.sheet.outputShareTitle'), { description: t('inventory.sheet.outputShareHint') })\n return\n }\n }\n const sheet: RecipeSheet = {\n id: recipeId,\n productId: product.id,\n name: name.trim(),\n description: description.trim() || undefined,\n yieldQuantity: num(yieldQuantity) || 1,\n yieldUnitId: yieldUnitId || undefined,\n yieldMode,\n preparationTimeMinutes: prepTime ? parseInt(prepTime, 10) : undefined,\n instructions: instructions.trim() || undefined,\n groups: groups\n .filter((g) => g.name.trim() || g.lines.length > 0)\n .map((g) => ({\n name: g.name.trim(),\n stationId: g.stationId || undefined,\n preparationNotes: g.preparationNotes.trim() || undefined,\n estimatedMinutes: g.estimatedMinutes ? parseInt(g.estimatedMinutes, 10) : undefined,\n ingredients: g.lines.filter((l) => l.productId && num(l.quantity) > 0).map((l) => ({\n productId: l.productId,\n quantity: lineQtyInBase(l),\n unitId: info[l.productId]?.baseUnitId,\n displayUnitId: l.displayUnitId || undefined,\n notes: l.notes.trim() || undefined,\n })),\n })),\n outputs: outputs.filter((o) => o.productId && num(o.expectedQuantity) > 0).map((o) => ({\n productId: o.productId,\n outputType: o.outputType,\n expectedQuantity: num(o.expectedQuantity),\n measurementUnitId: o.measurementUnitId || undefined,\n costShare: o.outputType === 'waste' || o.costShare.trim() === '' ? null : num(o.costShare),\n })),\n }\n setSaving(true)\n try {\n const id = await provider.saveRecipeSheet!(sheet, unitCost > 0 ? roundSmart(unitCost) : null)\n setRecipeId(id)\n setDirty(false)\n toast.success(t('inventory.sheet.saved'))\n onSaved?.()\n setReloadKey((k) => k + 1)\n } catch (e) {\n toast.error(e instanceof Error ? e.message : t('inventory.sheet.saveFailed'))\n } finally {\n setSaving(false)\n }\n }\n\n\n if (loading) return <EditorSkeleton />\n\n const stationOptions = stations.map((s) => ({ value: s.id, label: s.name }))\n const unitOptions = units.map((u) => ({ value: u.id, label: `${u.name} (${u.abbreviation})` }))\n\n return (\n <TooltipProvider delayDuration={300}>\n <SaveBarSlot dirty={dirty} saving={saving} onSave={() => { void save() }} onDiscard={() => setReloadKey((k) => k + 1)} saveLabel={t('inventory.sheet.save')} />\n <style>{SHEET_LAYOUT}</style>\n <div className=\"fz-container space-y-6\">\n {/* Header */}\n <div className=\"rs-head\">\n <Field className=\"rs-name\" label={`${t('inventory.sheet.name')} *`}>\n <Input value={name} onChange={(e) => { setName(e.target.value); touch() }} placeholder={t('inventory.sheet.namePlaceholder')} />\n </Field>\n <Field label={t('inventory.sheet.yield')}>\n <Input type=\"number\" step=\"0.01\" value={yieldQuantity} onChange={(e) => { setYieldQuantity(e.target.value); touch() }} placeholder=\"1\" />\n </Field>\n <Field label={t('inventory.sheet.yieldUnit')}>\n <PlainSelect value={yieldUnitId} onChange={(v) => { setYieldUnitId(v); touch() }} options={unitOptions} placeholder={t('inventory.sheet.none')} clearable />\n </Field>\n <Field label={t('inventory.sheet.yieldMode')}>\n <Select value={yieldMode} onValueChange={(v) => { setYieldMode(v as YieldMode); touch() }}>\n <SelectTrigger><SelectValue /></SelectTrigger>\n <SelectContent>\n <SelectItem value=\"portion\">{t('inventory.sheet.yieldMode.portion')}</SelectItem>\n <SelectItem value=\"batch\">{t('inventory.sheet.yieldMode.batch')}</SelectItem>\n </SelectContent>\n </Select>\n </Field>\n <Field label={t('inventory.sheet.prepTime')}>\n <Input type=\"number\" value={prepTime} onChange={(e) => { setPrepTime(e.target.value); touch() }} placeholder=\"30\" />\n </Field>\n <p className=\"rs-full -mt-2 text-xs text-muted-foreground\">{t(`inventory.sheet.yieldMode.${yieldMode}Hint`)}</p>\n <Field className=\"rs-full\" label={t('inventory.sheet.description')}>\n <textarea className={TEXTAREA} rows={2} value={description} onChange={(e) => { setDescription(e.target.value); touch() }} placeholder={t('inventory.sheet.descriptionPlaceholder')} />\n </Field>\n </div>\n\n {/* Cost / price / CMV */}\n <Card>\n <CardContent className=\"grid grid-cols-3 gap-4 py-4\">\n <div>\n <p className=\"text-xs text-muted-foreground\">\n {t('inventory.sheet.costPrice')}{yieldMode === 'batch' && productAbbr ? ` (${t('inventory.sheet.per')} ${productAbbr})` : ''}\n </p>\n <p className=\"text-lg font-semibold tabular-nums\">{brl(unitCost)}</p>\n {yieldMode === 'batch' && <p className=\"text-xs text-muted-foreground\">{t('inventory.sheet.batchCost')}: {brl(totalCost)}</p>}\n </div>\n <div>\n <p className=\"text-xs text-muted-foreground\">{t('inventory.sheet.salePrice')}</p>\n <p className=\"text-lg font-semibold tabular-nums\">{brl(salePrice)}</p>\n </div>\n <div>\n <p className=\"text-xs text-muted-foreground\">{t('inventory.sheet.cmv')}</p>\n {/* No cost means no CMV — \"0,0%\" would read as total margin (V1-083). */}\n <p className={`text-lg font-semibold tabular-nums ${cmv != null ? CMV_TONE[cmvBand(cmv)!] : ''}`}>\n {cmv != null && unitCost > 0 ? `${cmv.toLocaleString('pt-BR', { minimumFractionDigits: 1, maximumFractionDigits: 1 })} %` : '—'}\n </p>\n </div>\n </CardContent>\n </Card>\n\n {/* Components */}\n <div className=\"flex flex-wrap items-center justify-between gap-2\">\n <h3 className=\"text-sm font-semibold\">{t('inventory.sheet.components')}</h3>\n <div className=\"flex items-center gap-2\">\n <Tooltip>\n <TooltipTrigger asChild>\n {/* span: a disabled button fires no hover, and the tooltip is what explains why. */}\n <span>\n <Button\n type=\"button\" variant=\"outline\" size=\"sm\"\n disabled={!recipeId || dirty}\n onClick={() => {\n printRecipe(provider, {\n productId: product.id,\n productName: product.name,\n recipeId,\n description: description || undefined,\n ingredientCount: groups.reduce((n, g) => n + g.lines.length, 0),\n yieldQuantity: num(yieldQuantity) || undefined,\n yieldUnitAbbr: abbr(yieldUnitId),\n preparationTimeMinutes: num(prepTime) || undefined,\n cost: unitCost,\n salePrice,\n isForSale: Boolean(product.classification?.isForSale),\n isIntermediate: Boolean(product.classification?.isIntermediate),\n }).catch((e) => toast.error(errorMessage(e)))\n }}\n >\n <Printer className=\"mr-1 h-3.5 w-3.5\" /> {t('inventory.sheet.print')}\n </Button>\n </span>\n </TooltipTrigger>\n <TooltipContent>\n {!recipeId ? t('inventory.recipes.printNoSheet') : dirty ? t('inventory.sheet.printSaveFirst') : t('inventory.recipes.print')}\n </TooltipContent>\n </Tooltip>\n {provider.suggestRecipe && (\n <AiActionButton type=\"button\" tone=\"soft\" size=\"sm\" onClick={() => setAiOpen(true)}>\n {t('inventory.sheet.suggestAi')}\n </AiActionButton>\n )}\n <Button type=\"button\" variant=\"outline\" size=\"sm\" onClick={() => { setGroups((gs) => [...gs, { key: key(), name: '', stationId: '', preparationNotes: '', estimatedMinutes: '', lines: [] }]); touch() }}>\n <Plus className=\"mr-1 h-3.5 w-3.5\" /> {t('inventory.sheet.addGroup')}\n </Button>\n </div>\n </div>\n\n {groups.length === 0 ? (\n <Card>\n <CardContent className=\"py-8 text-center text-sm text-muted-foreground\">{t('inventory.sheet.noComponents')}</CardContent>\n </Card>\n ) : (\n <div className=\"space-y-4\">\n {groups.map((g) => (\n <Card key={g.key}>\n <div className=\"rs-comp border-b px-4 py-3\">\n <Field label={t('inventory.sheet.componentName')} small>\n <Input value={g.name} onChange={(e) => patchGroup(g.key, { name: e.target.value })} placeholder={t('inventory.sheet.componentNamePlaceholder')} />\n </Field>\n <Field label={t('inventory.sheet.station')} small>\n <PlainSelect value={g.stationId} onChange={(v) => patchGroup(g.key, { stationId: v })} options={stationOptions}\n placeholder={stations.length ? t('inventory.sheet.stationPlaceholder') : t('inventory.sheet.noStations')} clearable />\n </Field>\n <Field label={t('inventory.sheet.estimatedMinutes')} small>\n <Input inputMode=\"numeric\" value={g.estimatedMinutes} onChange={(e) => patchGroup(g.key, { estimatedMinutes: e.target.value.replace(/\\D/g, '') })} placeholder={t('inventory.sheet.estimatedMinutesPlaceholder')} />\n </Field>\n <div className=\"rs-comp-menu flex justify-end\">\n <Dropdown>\n <Tooltip>\n <TooltipTrigger asChild>\n <DropdownTrigger asChild>\n <Button variant=\"ghost\" size=\"icon\" aria-label={t('inventory.sheet.componentMenu')}><MoreVertical className=\"h-4 w-4\" /></Button>\n </DropdownTrigger>\n </TooltipTrigger>\n <TooltipContent>{t('inventory.sheet.componentMenu')}</TooltipContent>\n </Tooltip>\n <DropdownContent align=\"end\" className=\"w-64\">\n <DropdownItem onSelect={() => {\n if (!g.lines.some((l) => l.productId && num(l.quantity) > 0)) { toast.error(t('inventory.sheet.transformNeedsLines')); return }\n setTransformGroup(g.key)\n }}>\n <Package className=\"mr-2 h-4 w-4\" /> {t('inventory.sheet.transform')}\n </DropdownItem>\n <DropdownSeparator />\n <DropdownItem className=\"text-destructive focus:text-destructive\" onSelect={() => { setGroups((gs) => gs.filter((x) => x.key !== g.key)); touch() }}>\n <Trash2 className=\"mr-2 h-4 w-4\" /> {t('inventory.sheet.deleteComponent')}\n </DropdownItem>\n </DropdownContent>\n </Dropdown>\n </div>\n </div>\n\n <CardContent className=\"space-y-3 px-4 pb-4 pt-3\">\n {g.lines.length === 0 ? (\n <p className=\"py-3 text-center text-xs text-muted-foreground\">{t('inventory.sheet.noLines')}</p>\n ) : (\n <div className=\"space-y-2\">\n <div className=\"rs-line-head gap-3 px-1 text-xs font-medium text-muted-foreground\">\n <span>{t('inventory.sheet.ingredient')}</span>\n <span>{t('inventory.sheet.quantity')}</span>\n <span>{t('inventory.sheet.notes')}</span>\n <span className=\"text-right\">{t('inventory.sheet.cost')}</span>\n <span />\n </div>\n {g.lines.map((l) => {\n const i = info[l.productId]\n const baseId = i?.baseUnitId\n const baseAbbr = abbr(baseId)\n const family = baseAbbr ? sameFamilyUnits(units, baseAbbr) : []\n const c = lineCost(l)\n return (\n <div key={l.key} className=\"rs-line\">\n <div className=\"min-w-0\">\n <SearchSelect\n value={l.productId}\n displayValue={l.productName}\n onChange={(id, opt) => {\n if (opt?.data) remember([opt.data as IngredientInfo])\n patchLine(g.key, l.key, { productId: id, productName: opt?.label ?? '', displayUnitId: '', hint: undefined })\n }}\n onSearch={searchIngredients}\n placeholder={t('inventory.sheet.searchIngredient')}\n allowCreate\n createLabel={t('inventory.sheet.createIngredient')}\n onCreate={(q) => setCreating({ groupKey: g.key, lineKey: l.key, name: q })}\n />\n {!l.productId && l.hint && (\n <p className=\"mt-1 flex flex-wrap items-center gap-2 text-[11px] text-amber-600 dark:text-amber-400\">\n <span>{t('inventory.sheet.aiHint')}: <strong>{l.hint}</strong></span>\n <Button type=\"button\" size=\"sm\" variant=\"outline\" className=\"h-6 px-2 text-[11px]\" onClick={() => setCreating({ groupKey: g.key, lineKey: l.key, name: l.hint! })}>\n <Plus className=\"mr-1 h-3 w-3\" /> {t('inventory.sheet.create')}\n </Button>\n </p>\n )}\n </div>\n <div className=\"flex\">\n <Input type=\"number\" step=\"0.001\" className=\"min-w-0 flex-1 rounded-r-none text-right tabular-nums\" value={l.quantity} placeholder=\"0\"\n aria-label={t('inventory.sheet.quantity')}\n onChange={(e) => patchLine(g.key, l.key, { quantity: e.target.value })} />\n {family.length > 1 && baseId ? (\n <Select value={l.displayUnitId || baseId} onValueChange={(v) => changeDisplayUnit(g.key, l, v)}>\n <SelectTrigger className=\"w-[76px] shrink-0 rounded-l-none border-l-0 bg-muted/50 px-2\" aria-label={t('inventory.sheet.unit')}>\n <span>{abbr(l.displayUnitId || baseId) ?? '—'}</span>\n </SelectTrigger>\n <SelectContent>\n {family.map((u) => <SelectItem key={u.id} value={u.id}>{u.abbreviation} ({u.name})</SelectItem>)}\n </SelectContent>\n </Select>\n ) : (\n <span className=\"flex shrink-0 items-center rounded-r-input border border-l-0 border-input bg-muted/50 px-2.5 text-sm text-muted-foreground\">{baseAbbr ?? '—'}</span>\n )}\n </div>\n <Input value={l.notes} onChange={(e) => patchLine(g.key, l.key, { notes: e.target.value })} placeholder={t('inventory.sheet.notes')} aria-label={t('inventory.sheet.notes')} />\n <div className=\"flex items-center justify-end gap-1 text-sm tabular-nums\">\n <span className={c == null ? 'text-muted-foreground' : ''}>{c != null ? brl(c) : '—'}</span>\n {l.productId && i && provider.setIngredientCost && (\n <Tooltip>\n <TooltipTrigger asChild>\n <Button type=\"button\" variant=\"ghost\" size=\"icon\" className=\"h-7 w-7\" aria-label={t('inventory.sheet.updateCost')} onClick={() => setCostFor(i)}>\n <Pencil className=\"h-3.5 w-3.5\" />\n </Button>\n </TooltipTrigger>\n <TooltipContent>\n {i.cost > 0\n ? t('inventory.sheet.updateCostCurrent', { price: brl(i.cost), unit: baseAbbr ? `/${baseAbbr}` : '' })\n : t('inventory.sheet.setCost')}\n </TooltipContent>\n </Tooltip>\n )}\n </div>\n <div className=\"flex justify-end\">\n <Tooltip>\n <TooltipTrigger asChild>\n <Button type=\"button\" variant=\"ghost\" size=\"icon\" className=\"h-8 w-8\" aria-label={t('inventory.sheet.removeLine')}\n onClick={() => patchGroup(g.key, { lines: g.lines.filter((x) => x.key !== l.key) })}>\n <Trash2 className=\"h-3.5 w-3.5\" />\n </Button>\n </TooltipTrigger>\n <TooltipContent>{t('inventory.sheet.removeLine')}</TooltipContent>\n </Tooltip>\n </div>\n </div>\n )\n })}\n </div>\n )}\n <div className=\"flex justify-end\">\n <Button type=\"button\" variant=\"outline\" size=\"sm\" onClick={() => patchGroup(g.key, { lines: [...g.lines, { key: key(), productId: '', productName: '', quantity: '', displayUnitId: '', notes: '' }] })}>\n <Plus className=\"mr-1 h-3.5 w-3.5\" /> {t('inventory.sheet.addLine')}\n </Button>\n </div>\n <Field label={t('inventory.sheet.componentPrep')} small>\n <textarea className={TEXTAREA} rows={2} value={g.preparationNotes} onChange={(e) => patchGroup(g.key, { preparationNotes: e.target.value })} placeholder={t('inventory.sheet.componentPrepPlaceholder')} />\n </Field>\n </CardContent>\n </Card>\n ))}\n </div>\n )}\n\n {/* Outputs */}\n <Card>\n <div className=\"flex items-start justify-between gap-3 px-4 pb-2 pt-4\">\n <div>\n <p className=\"text-sm font-semibold\">{t('inventory.sheet.outputs')}</p>\n <p className=\"mt-0.5 text-xs text-muted-foreground\">{t('inventory.sheet.outputsHint')}</p>\n </div>\n <Button type=\"button\" variant=\"outline\" size=\"sm\" className=\"shrink-0\" onClick={() => {\n setOutputs((os) => [...os, { key: key(), productId: '', productName: '', outputType: os.length === 0 ? 'main' : 'coproduct', expectedQuantity: '', measurementUnitId: yieldUnitId, costShare: '' }])\n touch()\n }}>\n <Plus className=\"mr-1 h-3.5 w-3.5\" /> {t('inventory.sheet.addOutput')}\n </Button>\n </div>\n {outputs.length > 0 && (\n <CardContent className=\"space-y-2 px-4 pb-4 pt-1\">\n <div className=\"rs-out-head gap-3 px-1 text-xs font-medium text-muted-foreground\">\n <span>{t('inventory.sheet.product')}</span>\n <span>{t('inventory.sheet.outputType')}</span>\n <span>{t('inventory.sheet.expectedQty')}</span>\n <span>{t('inventory.sheet.unit')}</span>\n <span>{t('inventory.sheet.costShare')}</span>\n <span />\n </div>\n {outputs.map((o) => (\n <div key={o.key} className=\"rs-out\">\n <SearchSelect value={o.productId} displayValue={o.productName}\n onChange={(id, opt) => patchOutput(o.key, { productId: id, productName: opt?.label ?? '' })}\n onSearch={searchIngredients} placeholder={t('inventory.sheet.searchIngredient')} />\n <Select value={o.outputType} onValueChange={(v) => patchOutput(o.key, { outputType: v as RecipeOutputType })}>\n <SelectTrigger aria-label={t('inventory.sheet.outputType')}><SelectValue /></SelectTrigger>\n <SelectContent>\n {OUTPUT_TYPES.map((ot) => <SelectItem key={ot} value={ot}>{t(`inventory.sheet.outputType.${ot}`)}</SelectItem>)}\n </SelectContent>\n </Select>\n <Input inputMode=\"decimal\" value={o.expectedQuantity} aria-label={t('inventory.sheet.expectedQty')} onChange={(e) => patchOutput(o.key, { expectedQuantity: e.target.value })} />\n <PlainSelect value={o.measurementUnitId} onChange={(v) => patchOutput(o.key, { measurementUnitId: v })} options={unitOptions} placeholder={t('inventory.sheet.unit')} />\n <Input inputMode=\"decimal\" aria-label={t('inventory.sheet.costShare')}\n placeholder={o.outputType === 'waste' ? '—' : t('inventory.sheet.auto')}\n disabled={o.outputType === 'waste'}\n value={o.outputType === 'waste' ? '' : o.costShare}\n onChange={(e) => patchOutput(o.key, { costShare: e.target.value })} />\n <div className=\"flex justify-end\">\n <Tooltip>\n <TooltipTrigger asChild>\n <Button type=\"button\" variant=\"ghost\" size=\"icon\" className=\"h-8 w-8\" aria-label={t('inventory.sheet.removeOutput')}\n onClick={() => { setOutputs((os) => os.filter((x) => x.key !== o.key)); touch() }}>\n <Trash2 className=\"h-3.5 w-3.5\" />\n </Button>\n </TooltipTrigger>\n <TooltipContent>{t('inventory.sheet.removeOutput')}</TooltipContent>\n </Tooltip>\n </div>\n </div>\n ))}\n </CardContent>\n )}\n </Card>\n\n <Field label={t('inventory.sheet.instructions')}>\n <textarea className={TEXTAREA} rows={4} value={instructions} onChange={(e) => { setInstructions(e.target.value); touch() }} placeholder={t('inventory.sheet.instructionsPlaceholder')} />\n </Field>\n\n </div>\n\n {aiOpen && (\n <RecipeAiDialog\n product={product}\n stations={stations}\n onClose={() => setAiOpen(false)}\n onSuggestion={(s) => { void applySuggestion(s) }}\n />\n )}\n {costFor && (\n <IngredientCostDialog\n ingredient={costFor}\n unitAbbr={abbr(costFor.baseUnitId)}\n onClose={() => setCostFor(null)}\n onSaved={(cost) => remember([{ ...costFor, cost }])}\n />\n )}\n {creating && (\n <QuickIngredientDialog\n defaultName={creating.name}\n units={units}\n onClose={() => setCreating(null)}\n onCreated={(row) => {\n remember([row])\n patchLine(creating.groupKey, creating.lineKey, { productId: row.productId, productName: row.name, hint: undefined, displayUnitId: '' })\n setCreating(null)\n }}\n />\n )}\n {transformGroup && (() => {\n const g = groups.find((x) => x.key === transformGroup)\n if (!g) return null\n return (\n <TransformIntermediateDialog\n defaultName={g.name}\n units={units}\n group={{\n stationId: g.stationId || undefined,\n preparationNotes: g.preparationNotes.trim() || undefined,\n ingredients: g.lines.filter((l) => l.productId && num(l.quantity) > 0).map((l) => ({\n productId: l.productId,\n quantity: lineQtyInBase(l),\n unitId: info[l.productId]?.baseUnitId,\n displayUnitId: l.displayUnitId || undefined,\n notes: l.notes.trim() || undefined,\n })),\n }}\n onClose={() => setTransformGroup(null)}\n onCreated={() => {\n // V1: the block leaves this sheet; the intermediate can now be added as an item.\n setGroups((gs) => gs.filter((x) => x.key !== transformGroup))\n setTransformGroup(null)\n touch()\n }}\n />\n )\n })()}\n </TooltipProvider>\n )\n}\n\n// Sized by the PANEL, not the window: the sheet lives in a product page next\n// to the module rail, and `md:` read the 1440px monitor while the panel had\n// 800px — five header fields squeezed to 120px each.\n// An ingredient row is one line from 44rem: it has two fixed fields and two\n// that flex, and stacking it into three lines at 900px tripled the page.\nconst SHEET_LAYOUT = `\n.rs-head{display:grid;gap:1rem;grid-template-columns:repeat(2,minmax(0,1fr))}\n.rs-head>.rs-name,.rs-head>.rs-full{grid-column:1/-1}\n.rs-comp{display:grid;gap:.75rem;grid-template-columns:minmax(0,1fr) auto;align-items:end}\n.rs-comp>*:not(.rs-comp-menu){grid-column:1}\n.rs-comp>.rs-comp-menu{grid-column:2;grid-row:1}\n.rs-line,.rs-out{display:grid;gap:.5rem;border:1px solid hsl(var(--border));border-radius:.5rem;padding:.5rem}\n.rs-line-head,.rs-out-head{display:none}\n.rs-line{grid-template-columns:minmax(0,1fr) auto;align-items:center}\n.rs-line>:nth-child(1),.rs-line>:nth-child(2),.rs-line>:nth-child(3){grid-column:1/-1}\n.rs-line>:nth-child(4){justify-content:flex-start}\n@container (min-width: 30rem){\n .rs-line{grid-template-columns:minmax(0,1fr) minmax(0,1.3fr) auto auto}\n .rs-line>:nth-child(2){grid-column:1}\n .rs-line>:nth-child(3){grid-column:2/-1}\n .rs-line>:nth-child(4){grid-column:1/3;justify-content:flex-end}\n}\n@container (min-width: 44rem){\n .rs-head{grid-template-columns:repeat(4,minmax(0,1fr))}\n .rs-comp{grid-template-columns:minmax(0,1fr) minmax(0,1fr) 9rem auto}\n .rs-comp>*:not(.rs-comp-menu){grid-column:auto}\n .rs-comp>.rs-comp-menu{grid-column:4}\n .rs-line,.rs-line-head{display:grid;grid-template-columns:minmax(0,2fr) 170px minmax(0,1.2fr) 96px 36px;align-items:center;gap:.5rem;border:0;padding:0}\n .rs-line>*{grid-column:auto !important}\n .rs-line>:nth-child(4){justify-content:flex-end}\n}\n@container (min-width: 60rem){\n .rs-head{grid-template-columns:minmax(0,2.2fr) repeat(4,minmax(0,1fr))}\n .rs-head>.rs-name{grid-column:auto}\n .rs-line,.rs-line-head{grid-template-columns:minmax(0,2fr) 200px minmax(0,1.4fr) 120px 36px;gap:.75rem}\n .rs-out,.rs-out-head{display:grid;grid-template-columns:minmax(0,2fr) 150px 110px 160px 100px 36px;align-items:center;gap:.75rem;border:0;padding:0}\n}\n`\n\nfunction Field({ label, children, className, small }: { label: string; children: React.ReactNode; className?: string; small?: boolean }) {\n return (\n <label className={`block ${className ?? ''}`}>\n <span className={`mb-1 block font-medium ${small ? 'text-xs' : 'text-sm'}`}>{label}</span>\n {children}\n </label>\n )\n}\n\n/** A Select with an optional \"Nenhuma\" entry — Radix forbids an empty value. */\nfunction PlainSelect({ value, onChange, options, placeholder, clearable }: {\n value: string\n onChange: (v: string) => void\n options: Array<{ value: string; label: string }>\n placeholder: string\n clearable?: boolean\n}) {\n const NONE = '__none__'\n return (\n <Select value={value || (clearable ? NONE : undefined)} onValueChange={(v) => onChange(v === NONE ? '' : v)}>\n <SelectTrigger aria-label={placeholder}><SelectValue placeholder={placeholder} /></SelectTrigger>\n <SelectContent>\n {clearable && <SelectItem value={NONE}><span className=\"text-muted-foreground\">{placeholder}</span></SelectItem>}\n {options.map((o) => <SelectItem key={o.value} value={o.value}>{o.label}</SelectItem>)}\n </SelectContent>\n </Select>\n )\n}\n\n/** The sheet's own shape: header fields, the three numbers, one component. */\nfunction EditorSkeleton() {\n const bar = 'bg-foreground/[0.08]'\n return (\n <div className=\"space-y-6\" aria-busy=\"true\">\n <div className=\"grid grid-cols-12 gap-4\">\n {['md:col-span-4', 'md:col-span-2', 'md:col-span-2', 'md:col-span-2', 'md:col-span-2'].map((span, i) => (\n <div key={i} className={`col-span-12 space-y-2 ${span}`}>\n <Skeleton className={`h-3.5 w-24 ${bar}`} />\n <Skeleton className={`h-10 w-full rounded-input ${bar}`} />\n </div>\n ))}\n <div className=\"col-span-12 space-y-2\">\n <Skeleton className={`h-3.5 w-28 ${bar}`} />\n <Skeleton className={`h-14 w-full rounded-input ${bar}`} />\n </div>\n </div>\n <div className=\"grid grid-cols-3 gap-4 rounded-card border bg-card p-4\">\n {[0, 1, 2].map((i) => (\n <div key={i} className=\"space-y-2\">\n <Skeleton className={`h-3 w-20 ${bar}`} />\n <Skeleton className={`h-6 w-24 ${bar}`} />\n </div>\n ))}\n </div>\n <div className=\"flex items-center justify-between\">\n <Skeleton className={`h-4 w-64 ${bar}`} />\n <Skeleton className={`h-8 w-56 ${bar}`} />\n </div>\n <div className=\"rounded-card border bg-card\">\n <div className=\"grid grid-cols-3 gap-3 border-b p-4\">\n {[0, 1, 2].map((i) => <Skeleton key={i} className={`h-10 w-full rounded-input ${bar}`} />)}\n </div>\n <div className=\"space-y-3 p-4\">\n {[0, 1, 2, 3, 4].map((i) => (\n <div key={i} className=\"grid grid-cols-[2fr_1fr_1.4fr_80px] gap-3\">\n <Skeleton className={`h-9 rounded-input ${bar}`} />\n <Skeleton className={`h-9 rounded-input ${bar}`} />\n <Skeleton className={`h-9 rounded-input ${bar}`} />\n <Skeleton className={`h-4 self-center ${bar}`} />\n </div>\n ))}\n </div>\n </div>\n </div>\n )\n}\n","import React from 'react'\nimport type { Product } from '@fayz-ai/inventory/domain/product'\nimport { RecipeEditor } from './recipe/RecipeEditor'\n\n/**\n * Ficha Técnica tab of the product — the same sheet the Fichas Técnicas list\n * opens. `onChanged` reloads the product: saving rewrites its cost and marks\n * it as produced.\n */\nexport function ProductRecipeTab({ item, onChanged }: { item: Product; onChanged?: () => void }) {\n return <RecipeEditor product={item} onSaved={onChanged} />\n}\n","import React, { useCallback, useEffect, useState } from 'react'\nimport { ArrowDown, ArrowUp, Plus, Trash2 } from 'lucide-react'\nimport {\n Button, Card, CurrencyInput, Input, Skeleton, Switch, Tooltip, TooltipContent, TooltipProvider, TooltipTrigger,\n toast,\n} from '@fayz-ai/ui'\nimport { useTranslation } from '@fayz-ai/core'\nimport { useInventoryProvider } from '../context'\nimport type { Product, ProductOptionGroup, ProductOptionItem } from '@fayz-ai/inventory/domain/product'\nimport { SaveBarSlot } from './recipe/shared'\n\n// ---------------------------------------------------------------------------\n// Complementos — the choices a product sold carries («Ponto da carne»,\n// «Chantilly»). V1: ProductOptionGroupsManager. Validation is V1's, rule for\n// rule, so a group the till could never satisfy is refused here and not at\n// the counter.\n// ---------------------------------------------------------------------------\n\ntype DraftItem = ProductOptionItem & { key: string }\ntype Draft = Omit<ProductOptionGroup, 'items'> & { key: string; items: DraftItem[] }\n\nlet seq = 0\nconst key = () => `c${++seq}`\nconst newItem = (): DraftItem => ({ key: key(), name: '', priceAdjustment: 0, isActive: true })\nconst newGroup = (): Draft => ({\n key: key(), name: '', isActive: true, isRequired: false, minSelections: 0, maxSelections: 1, items: [newItem()],\n})\n\nconst norm = (v: string) => v.trim().toLocaleLowerCase('pt-BR')\n\nexport function validateOptionGroups(groups: ProductOptionGroup[]): string | null {\n const names = new Set<string>()\n for (const [gi, g] of groups.entries()) {\n const label = g.name.trim() || `Grupo ${gi + 1}`\n if (!norm(g.name)) return `Informe o nome do grupo ${gi + 1}.`\n if (names.has(norm(g.name))) return `O grupo \"${label}\" está duplicado.`\n names.add(norm(g.name))\n if (!Number.isInteger(g.minSelections) || g.minSelections < 0) return `O mínimo de escolhas de \"${label}\" deve ser um número inteiro maior ou igual a zero.`\n if (!Number.isInteger(g.maxSelections) || g.maxSelections < 1) return `O máximo de escolhas de \"${label}\" deve ser um número inteiro maior ou igual a um.`\n if (g.maxSelections < g.minSelections) return `Em \"${label}\", o máximo de escolhas não pode ser menor que o mínimo.`\n if (g.isRequired && g.minSelections < 1) return `O grupo obrigatório \"${label}\" precisa exigir ao menos uma escolha.`\n if (g.items.length === 0) return `Adicione ao menos uma opção ao grupo \"${label}\".`\n if (g.isActive && !g.items.some((i) => i.isActive)) return `Ative ao menos uma opção no grupo \"${label}\".`\n const itemNames = new Set<string>()\n for (const [ii, i] of g.items.entries()) {\n if (!norm(i.name)) return `Informe o nome da opção ${ii + 1} de \"${label}\".`\n if (itemNames.has(norm(i.name))) return `A opção \"${i.name.trim()}\" está duplicada em \"${label}\".`\n itemNames.add(norm(i.name))\n if (!Number.isFinite(i.priceAdjustment) || i.priceAdjustment < 0) return `O acréscimo de \"${i.name.trim()}\" deve ser zero ou um valor positivo.`\n }\n }\n return null\n}\n\nexport function ProductComplementsTab({ item }: { item: Product }) {\n const t = useTranslation()\n const provider = useInventoryProvider()\n const [groups, setGroups] = useState<Draft[] | null>(null)\n const [dirty, setDirty] = useState(false)\n const [saving, setSaving] = useState(false)\n\n const load = useCallback(async () => {\n const rows = await provider.getProductOptionGroups!(item.id)\n setGroups(rows.map((g) => ({ ...g, key: key(), items: g.items.map((i) => ({ ...i, key: key() })) })))\n setDirty(false)\n }, [provider, item.id])\n\n useEffect(() => {\n load().catch((e) => { toast.error(e instanceof Error ? e.message : t('inventory.complements.loadFailed')); setGroups([]) })\n }, [load, t])\n\n const update = (fn: (gs: Draft[]) => Draft[]) => { setGroups((gs) => fn(gs ?? [])); setDirty(true) }\n const patchGroup = (gk: string, patch: Partial<Draft>) => update((gs) => gs.map((g) => (g.key === gk ? { ...g, ...patch } : g)))\n const patchItem = (gk: string, ik: string, patch: Partial<DraftItem>) =>\n update((gs) => gs.map((g) => (g.key !== gk ? g : { ...g, items: g.items.map((i) => (i.key === ik ? { ...i, ...patch } : i)) })))\n const move = (index: number, dir: -1 | 1) => update((gs) => {\n const to = index + dir\n if (to < 0 || to >= gs.length) return gs\n const next = [...gs];\n [next[index], next[to]] = [next[to], next[index]]\n return next\n })\n\n const save = async () => {\n if (!groups) return\n const error = validateOptionGroups(groups)\n if (error) { toast.error(t('inventory.complements.review'), { description: error }); return }\n setSaving(true)\n try {\n const saved = await provider.saveProductOptionGroups!(item.id, groups)\n setGroups(saved.map((g) => ({ ...g, key: key(), items: g.items.map((i) => ({ ...i, key: key() })) })))\n setDirty(false)\n toast.success(t('inventory.complements.saved'))\n } catch (e) {\n toast.error(t('inventory.complements.saveFailed'), { description: e instanceof Error ? e.message : undefined })\n } finally {\n setSaving(false)\n }\n }\n\n\n if (!groups) {\n return (\n <div className=\"space-y-4\">\n <Skeleton className=\"h-5 w-48\" />\n <Skeleton className=\"h-4 w-96 max-w-full\" />\n <Skeleton className=\"h-32 w-full\" />\n </div>\n )\n }\n\n return (\n <TooltipProvider delayDuration={300}>\n <SaveBarSlot dirty={dirty} saving={saving} onSave={() => { void save() }} onDiscard={() => { void load() }} saveLabel={t('inventory.complements.save')} />\n <div className=\"fz-container space-y-5\">\n <div className=\"flex flex-wrap items-start justify-between gap-3\">\n <div>\n <h3 className=\"text-base font-semibold\">{t('inventory.complements.title')}</h3>\n <p className=\"mt-1 max-w-2xl text-sm text-muted-foreground\">{t('inventory.complements.hint')}</p>\n </div>\n <Button type=\"button\" variant=\"outline\" size=\"sm\" onClick={() => update((gs) => [...gs, newGroup()])}>\n <Plus className=\"mr-1.5 h-4 w-4\" /> {t('inventory.complements.newGroup')}\n </Button>\n </div>\n\n {groups.length === 0 && (\n <div className=\"rounded-md border border-dashed px-4 py-10 text-center\">\n <p className=\"text-sm font-medium\">{t('inventory.complements.empty')}</p>\n <p className=\"mt-1 text-sm text-muted-foreground\">{t('inventory.complements.emptyHint')}</p>\n </div>\n )}\n\n {groups.map((g, gi) => (\n <Card key={g.key}>\n <div className=\"space-y-3 p-4\">\n <div className=\"flex flex-wrap items-end gap-3\">\n <label className=\"min-w-[220px] flex-1\">\n <span className=\"mb-1 block text-sm font-medium\">{t('inventory.complements.groupName')}</span>\n <Input value={g.name} onChange={(e) => patchGroup(g.key, { name: e.target.value })} placeholder={t('inventory.complements.groupNamePlaceholder')} />\n </label>\n <label className=\"flex items-center gap-2 pb-2 text-sm\">\n <Switch checked={g.isActive} onCheckedChange={(v) => patchGroup(g.key, { isActive: v })} />\n {t('inventory.complements.active')}\n </label>\n <div className=\"flex items-center pb-0.5\">\n <IconAction label={t('inventory.complements.moveUp')} disabled={gi === 0} onClick={() => move(gi, -1)}><ArrowUp className=\"h-4 w-4\" /></IconAction>\n <IconAction label={t('inventory.complements.moveDown')} disabled={gi === groups.length - 1} onClick={() => move(gi, 1)}><ArrowDown className=\"h-4 w-4\" /></IconAction>\n <IconAction label={t('inventory.complements.deleteGroup')} danger onClick={() => update((gs) => gs.filter((x) => x.key !== g.key))}><Trash2 className=\"h-4 w-4\" /></IconAction>\n </div>\n </div>\n <div className=\"fz-fields grid gap-3 border-t pt-3 md:grid-cols-[minmax(180px,1fr)_140px_140px]\">\n <label className=\"flex items-center gap-2 text-sm\">\n <Switch checked={g.isRequired} onCheckedChange={(v) => patchGroup(g.key, { isRequired: v, minSelections: v ? Math.max(1, g.minSelections) : 0 })} />\n {t('inventory.complements.required')}\n </label>\n <label>\n <span className=\"mb-1 block text-xs font-medium\">{t('inventory.complements.min')}</span>\n <Input type=\"number\" min={g.isRequired ? 1 : 0} step={1} value={g.minSelections} disabled={!g.isRequired}\n onChange={(e) => patchGroup(g.key, { minSelections: Number(e.target.value) })} />\n </label>\n <label>\n <span className=\"mb-1 block text-xs font-medium\">{t('inventory.complements.max')}</span>\n <Input type=\"number\" min={1} step={1} value={g.maxSelections}\n onChange={(e) => patchGroup(g.key, { maxSelections: Number(e.target.value) })} />\n </label>\n </div>\n </div>\n <div className=\"space-y-3 border-t p-4\">\n <div className=\"hidden grid-cols-[minmax(180px,1fr)_160px_90px_40px] gap-3 px-1 text-xs font-medium text-muted-foreground md:grid\">\n <span>{t('inventory.complements.option')}</span><span>{t('inventory.complements.price')}</span><span>{t('inventory.complements.optionActive')}</span><span />\n </div>\n {g.items.map((i) => (\n <div key={i.key} className=\"grid gap-3 rounded-md border p-3 md:grid-cols-[minmax(180px,1fr)_160px_90px_40px] md:items-center md:border-0 md:p-0\">\n <Input value={i.name} onChange={(e) => patchItem(g.key, i.key, { name: e.target.value })} placeholder={t('inventory.complements.optionPlaceholder')} aria-label={t('inventory.complements.option')} />\n <CurrencyInput value={i.priceAdjustment} onChange={(v) => patchItem(g.key, i.key, { priceAdjustment: Number(v) || 0 })} aria-label={t('inventory.complements.price')} />\n <label className=\"flex items-center gap-2 text-sm\">\n <Switch checked={i.isActive} onCheckedChange={(v) => patchItem(g.key, i.key, { isActive: v })} />\n <span className=\"md:sr-only\">{t('inventory.complements.optionActive')}</span>\n </label>\n <IconAction label={t('inventory.complements.deleteOption')} danger onClick={() => patchGroup(g.key, { items: g.items.filter((x) => x.key !== i.key) })}><Trash2 className=\"h-4 w-4\" /></IconAction>\n </div>\n ))}\n <Button type=\"button\" variant=\"ghost\" size=\"sm\" onClick={() => patchGroup(g.key, { items: [...g.items, newItem()] })}>\n <Plus className=\"mr-1.5 h-4 w-4\" /> {t('inventory.complements.addOption')}\n </Button>\n </div>\n </Card>\n ))}\n\n </div>\n </TooltipProvider>\n )\n}\n\nfunction IconAction({ label, onClick, disabled, danger, children }: {\n label: string; onClick: () => void; disabled?: boolean; danger?: boolean; children: React.ReactNode\n}) {\n return (\n <Tooltip>\n <TooltipTrigger asChild>\n <span>\n <Button type=\"button\" variant=\"ghost\" size=\"icon\" aria-label={label} disabled={disabled} onClick={onClick}\n className={danger ? 'text-destructive hover:text-destructive' : undefined}>\n {children}\n </Button>\n </span>\n </TooltipTrigger>\n <TooltipContent>{label}</TooltipContent>\n </Tooltip>\n )\n}\n","import React, { useRef, useState } from 'react'\nimport { Check, Loader2, Sparkles, Upload, X } from 'lucide-react'\nimport {\n AiActionButton, Button, Checkbox, Modal, ModalContent, ModalHeader, ModalTitle, ModalBody, ModalFooter, toast,\n} from '@fayz-ai/ui'\nimport { useTranslation } from '@fayz-ai/core'\nimport { useInventoryProvider } from '../../context'\nimport type { Product } from '@fayz-ai/inventory/domain/product'\nimport { TEXTAREA } from './shared'\n\n/** \"Gerar foto com IA\": generate, look, then apply — applying is the only write. */\nexport function GenerateImageDialog({ product, onClose, onApplied }: {\n product: Product\n onClose: () => void\n onApplied: () => void\n}) {\n const t = useTranslation()\n const provider = useInventoryProvider()\n const [instructions, setInstructions] = useState('')\n const [useCurrent, setUseCurrent] = useState(!!product.imageUrl)\n const [refs, setRefs] = useState<Array<{ file: File; url: string }>>([])\n const [generating, setGenerating] = useState(false)\n const [applying, setApplying] = useState(false)\n const [image, setImage] = useState<string | null>(null)\n const fileRef = useRef<HTMLInputElement>(null)\n\n const generate = async () => {\n setGenerating(true)\n setImage(null)\n try {\n const referenceUrls: string[] = []\n if (useCurrent && product.imageUrl) referenceUrls.push(product.imageUrl)\n for (const r of refs) referenceUrls.push(await provider.uploadAiReference!(r.file))\n setImage(await provider.generateProductImage!({ productId: product.id, instructions, referenceUrls }))\n } catch (e) {\n toast.error(t('inventory.photoAi.failed'), { description: e instanceof Error ? e.message : undefined })\n } finally {\n setGenerating(false)\n }\n }\n\n const apply = async () => {\n if (!image || !provider.uploadProductImage) return\n setApplying(true)\n try {\n const bytes = Uint8Array.from(atob(image), (c) => c.charCodeAt(0))\n await provider.uploadProductImage(product.id, new File([bytes], `ia-${Date.now()}.png`, { type: 'image/png' }))\n toast.success(t('inventory.photoAi.applied'))\n onApplied()\n onClose()\n } catch (e) {\n toast.error(e instanceof Error ? e.message : t('inventory.photoAi.failed'))\n } finally {\n setApplying(false)\n }\n }\n\n return (\n <Modal open onOpenChange={(o) => { if (!o && !generating && !applying) onClose() }}>\n <ModalContent size=\"3xl\" className=\"sm:max-h-[90vh]\">\n <ModalHeader>\n <ModalTitle className=\"flex items-center gap-2\"><Sparkles className=\"h-5 w-5 text-primary\" /> {t('inventory.photoAi.title')}</ModalTitle>\n </ModalHeader>\n <ModalBody className=\"min-h-0 flex-1 space-y-5 overflow-y-auto\">\n <div className=\"space-y-1 rounded-lg border bg-muted/30 p-3 text-sm\">\n <div><span className=\"text-muted-foreground\">{t('inventory.photoAi.product')}:</span> <span className=\"font-medium\">{product.name}</span></div>\n {product.categoryName && <div><span className=\"text-muted-foreground\">{t('inventory.photoAi.category')}:</span> {product.categoryName}</div>}\n {product.description && <div className=\"line-clamp-3\"><span className=\"text-muted-foreground\">{t('inventory.sheet.description')}:</span> {product.description}</div>}\n <p className=\"text-xs text-muted-foreground\">{t('inventory.photoAi.usesSheet')}</p>\n </div>\n\n <div className=\"space-y-2\">\n <span className=\"block text-sm font-medium\">{t('inventory.photoAi.references')}</span>\n {product.imageUrl && (\n <label className=\"flex cursor-pointer items-center gap-3 rounded-lg border p-2 hover:bg-muted/40\">\n <Checkbox checked={useCurrent} onChange={setUseCurrent} />\n <img src={product.imageUrl} alt=\"\" className=\"h-12 w-12 rounded object-cover\" />\n <span className=\"text-sm\">{t('inventory.photoAi.useCurrent')}</span>\n </label>\n )}\n <div className=\"flex flex-wrap gap-2\">\n {refs.map((r, i) => (\n <div key={r.url} className=\"relative h-20 w-20 overflow-hidden rounded-lg border\">\n <img src={r.url} alt=\"\" className=\"h-full w-full object-cover\" />\n <Button variant=\"bare\" size=\"bare\" type=\"button\" aria-label={t('inventory.sheet.removePhoto')} className=\"font-normal absolute right-1 top-1 rounded-full bg-background/80 p-0.5\"\n onClick={() => { URL.revokeObjectURL(r.url); setRefs(refs.filter((_, idx) => idx !== i)) }}>\n <X className=\"h-3 w-3\" />\n </Button>\n </div>\n ))}\n {refs.length < 3 && (\n <Button variant=\"bare\" size=\"bare\" type=\"button\" onClick={() => fileRef.current?.click()} aria-label={t('inventory.sheet.addPhoto')}\n className=\"font-normal whitespace-normal flex h-20 w-20 flex-col items-center justify-center rounded-lg border-2 border-dashed text-muted-foreground hover:border-primary/50\">\n <Upload className=\"mb-1 h-4 w-4\" /><span className=\"text-[10px]\">{t('inventory.photoAi.add')}</span>\n </Button>\n )}\n <input ref={fileRef} type=\"file\" accept=\"image/*\" multiple className=\"hidden\" onChange={(e) => {\n const files = Array.from(e.target.files ?? []).slice(0, 3 - refs.length)\n setRefs((xs) => [...xs, ...files.map((file) => ({ file, url: URL.createObjectURL(file) }))])\n e.target.value = ''\n }} />\n </div>\n </div>\n\n <label className=\"block\">\n <span className=\"mb-1 block text-sm font-medium\">{t('inventory.sheet.aiInstructions')}</span>\n <textarea className={TEXTAREA} rows={3} value={instructions} onChange={(e) => setInstructions(e.target.value)} placeholder={t('inventory.photoAi.instructionsPlaceholder')} />\n </label>\n\n {(generating || image) && (\n <div className=\"flex justify-center rounded-lg border bg-muted/20 p-3\">\n {generating\n ? <div className=\"flex h-64 w-64 flex-col items-center justify-center gap-2 text-sm text-muted-foreground\"><Loader2 className=\"h-6 w-6 animate-spin\" />{t('inventory.photoAi.generating')}</div>\n : <img src={`data:image/png;base64,${image}`} alt=\"\" className=\"max-h-80 rounded-md\" />}\n </div>\n )}\n </ModalBody>\n <ModalFooter>\n <Button variant=\"outline\" onClick={onClose} disabled={generating || applying}>{t('common.cancel')}</Button>\n <AiActionButton tone={image ? 'soft' : 'solid'} onClick={() => void generate()} busy={generating} disabled={applying}>\n {image ? t('inventory.photoAi.again') : t('inventory.photoAi.generate')}\n </AiActionButton>\n {image && (\n <Button onClick={() => void apply()} disabled={applying}>\n {applying ? <Loader2 className=\"mr-2 h-4 w-4 animate-spin\" /> : <Check className=\"mr-2 h-4 w-4\" />}{t('inventory.photoAi.apply')}\n </Button>\n )}\n </ModalFooter>\n </ModalContent>\n </Modal>\n )\n}\n","import React, { useCallback, useEffect, useMemo, useState } from 'react'\nimport { Package } from 'lucide-react'\nimport { CrudDetailPage } from '@fayz-ai/admin'\nimport { useHasMenu, useHasRecipes } from './useHasMenu'\nimport { Button, SubpageHeader } from '@fayz-ai/ui'\nimport { useTranslation } from '@fayz-ai/core'\nimport type { DetailTab, EntityDef } from '@fayz-ai/core'\nimport { useInventoryConfig, useInventoryProvider } from '../context'\nimport type { Product } from '@fayz-ai/inventory/domain/product'\nimport { buildProductEntity } from './productEntity'\nimport { flattenProduct, unflattenProduct } from './productFichas'\nimport { ProductRecipeTab } from './ProductRecipeTab'\nimport { ProductComplementsTab } from './ProductComplementsTab'\nimport { GenerateImageDialog } from './recipe/GenerateImageDialog'\n\nfunction DetailSkeleton() {\n return (\n <div className=\"space-y-5\">\n <div className=\"flex items-center gap-4\">\n <div className=\"h-20 w-20 rounded-2xl bg-muted/40 animate-pulse\" />\n <div className=\"space-y-2 flex-1\">\n <div className=\"h-6 w-56 rounded bg-muted/40 animate-pulse\" />\n <div className=\"h-3 w-32 rounded bg-muted/30 animate-pulse\" />\n </div>\n </div>\n <div className=\"rounded-card border p-4 space-y-2\">\n {[1, 2, 3, 4].map((i) => <div key={i} className=\"h-3.5 rounded bg-muted/30 animate-pulse\" />)}\n </div>\n </div>\n )\n}\n\n/**\n * The product's tabs, in order. One answer for the page and for the edit form,\n * which draws the same strip.\n *\n * Each tab opens with its switch, as in V1: Complementos with «Venda», Ficha\n * Técnica with «Produto produzido». The sheet also opens when asked for by\n * route — «Nova Ficha Técnica» may pick a product not yet produced.\n */\nexport function productRecordTabs({ entity, flat, hasMenu, hasRecipes, withComplements, initialTab, contributedTabs, t, reload }: {\n entity: EntityDef\n flat: Record<string, any> | null\n hasMenu: boolean\n hasRecipes: boolean\n withComplements: boolean\n initialTab?: string\n contributedTabs: DetailTab[]\n t: (key: string) => string\n reload?: () => void\n}): DetailTab[] {\n const extra: DetailTab[] = []\n if (hasMenu && flat?.isForSale && withComplements) {\n extra.push({ id: 'complements', label: t('inventory.complements.tab'), icon: 'ListPlus', component: ProductComplementsTab as never })\n }\n if (hasRecipes && (flat?.isProduced || initialTab === 'recipe')) {\n extra.push({ id: 'recipe', label: t('inventory.productRecipe.tab'), icon: 'ChefHat', component: ProductRecipeTab as never, props: { onChanged: reload } })\n }\n const tabs = entity.detailTabs ?? []\n const stockAt = tabs.findIndex((tab) => tab.id === 'stock')\n const own = stockAt < 0 ? [...tabs, ...extra] : [...tabs.slice(0, stockAt), ...extra, ...tabs.slice(stockAt)]\n return [...own, ...contributedTabs]\n}\n\n/** The product's own page — overview plus the tabs the entity declares. */\nexport function ProductDetailView({ productId, initialTab, onBack, onEdit }: {\n productId: string\n initialTab?: string\n onBack: () => void\n onEdit?: () => void\n}) {\n const t = useTranslation()\n const { currency, productTypes, productDetailTabs: contributedTabs } = useInventoryConfig()\n const provider = useInventoryProvider()\n\n const [product, setProduct] = useState<Product | null>(null)\n const [loading, setLoading] = useState(true)\n const [reloadKey, setReloadKey] = useState(0)\n\n // Handed to the Stock tab: undoing a movement changes the on-hand shown here.\n const reload = useCallback(() => setReloadKey((k) => k + 1), [])\n\n useEffect(() => {\n let active = true\n setLoading(true)\n provider.getProductById(productId)\n .then((p) => { if (active) setProduct(p) })\n .finally(() => { if (active) setLoading(false) })\n return () => { active = false }\n }, [productId, provider, reloadKey])\n\n const hasMenu = useHasMenu()\n const hasRecipes = useHasRecipes()\n const entity = useMemo(\n () => buildProductEntity(t, productTypes, currency, reload, undefined, true, hasMenu, hasRecipes),\n [t, productTypes, currency, reload, hasMenu, hasRecipes],\n )\n\n // A ficha lê o MESMO registro plano que o formulário edita. Sem isto as abas\n // das fichas nunca apareciam aqui: `visibleWhen` pergunta por `isForSale`, e\n // o produto do domínio guarda isso em `classification.isForSale` — a\n // pergunta voltava `undefined` e a aba inteira sumia em silêncio.\n const flat = useMemo(\n () => (product ? flattenProduct(product as unknown as Record<string, any>) : null),\n [product],\n )\n\n // A ficha do produto edita no lugar, como a do cliente. Era a mesma peça\n // genérica dos dois lados e só faltava este sinal: sem `onFieldsSave`, o\n // `CrudDetailPage` entende \"somente leitura\" e nem desenha o lápis — então\n // trocar um preço obrigava a abrir o formulário inteiro.\n //\n // Os campos chegam PLANOS (é o que a ficha desenha) e voltam para as fichas\n // pelo mesmo caminho do formulário: uma escrita só para os campos encostados.\n const saveFields = useCallback(async (values: Record<string, unknown>) => {\n // O registro inteiro com o que foi encostado por cima — ver `unflattenProduct`.\n await provider.updateProduct(productId, unflattenProduct({ ...(flat ?? {}), ...values }) as Partial<Product>)\n reload()\n }, [provider, productId, reload, flat])\n\n const [photoOpen, setPhotoOpen] = useState(false)\n\n // Each tab opens with its switch, as in V1: Complementos with «Venda»,\n // Ficha Técnica with «Produto produzido». The sheet also opens when asked\n // for by route — «Nova Ficha Técnica» may pick a product not yet produced,\n // and saving the sheet is what turns the switch on.\n const entityForDetail = useMemo(() => {\n const detailTabs = productRecordTabs({ entity, flat, hasMenu, hasRecipes, withComplements: Boolean(provider.getProductOptionGroups), initialTab, contributedTabs, t, reload })\n return {\n ...entity,\n detailTabs,\n detailActions: [\n ...(entity.detailActions ?? []),\n ...(provider.generateProductImage && provider.uploadProductImage\n ? [{ id: 'photo-ai', label: t('inventory.photoAi.title'), icon: 'Sparkles', intent: 'secondary' as const, run: () => { setPhotoOpen(true) } }]\n : []),\n ],\n }\n }, [entity, hasMenu, hasRecipes, flat?.isForSale, flat?.isProduced, initialTab, provider, reload, t, contributedTabs])\n\n if (loading) {\n return (\n <div className=\"space-y-6\">\n <SubpageHeader title={t('inventory.nav.products')} onBack={onBack} />\n <DetailSkeleton />\n </div>\n )\n }\n\n if (!product) {\n return (\n <div className=\"space-y-6\">\n <SubpageHeader title={t('inventory.nav.products')} onBack={onBack} />\n <div className=\"flex flex-col items-center justify-center py-16 text-center rounded-lg border-2 border-dashed border-muted\">\n <Package className=\"h-8 w-8 text-muted-foreground/30 mb-2\" />\n <p className=\"text-sm text-muted-foreground\">{t('inventory.productDetail.notFound')}</p>\n <Button variant=\"bare\" size=\"bare\" onClick={onBack} className=\"font-normal text-xs text-primary hover:underline mt-1\">\n {t('inventory.productDetail.backToList')}\n </Button>\n </div>\n </div>\n )\n }\n\n return (\n <>\n <CrudDetailPage\n entityDef={entityForDetail}\n onFieldsSave={saveFields}\n // O produto primeiro (traz saldo, categoria, carimbos), o plano por cima:\n // é ele que responde `isForSale` e companhia.\n item={{ ...(product as unknown as Record<string, any>), ...(flat ?? {}) }}\n namePlural={t('inventory.nav.products')}\n basePath=\"/inventory/products\"\n initialTab={initialTab}\n onBack={onBack}\n onEdit={onEdit}\n feature=\"inventory\"\n />\n {photoOpen && <GenerateImageDialog product={product} onClose={() => setPhotoOpen(false)} onApplied={reload} />}\n </>\n )\n}\n","import { errorMessage } from '@fayz-ai/core'\nimport React from 'react'\nimport { SubpageHeader, toast } from '@fayz-ai/ui'\nimport { useTranslation } from '@fayz-ai/core'\nimport { CrudFormPage, CrudFormSkeleton, useLimitGuard, invalidateLimit, invalidateRelationOptions } from '@fayz-ai/admin'\nimport { useInventoryConfig, useInventoryStore, useInventoryProvider } from '../context'\nimport type { ProductType } from '@fayz-ai/inventory/domain/product'\nimport { buildProductEntity } from './productEntity'\nimport { productRecordTabs } from './ProductDetailView'\nimport { useHasMenu, useHasRecipes } from './useHasMenu'\nimport { SALE_CHANNELS, channelFieldKey, flattenProduct, toFichas } from './productFichas'\nimport { createIdempotencyKey } from '@fayz-ai/inventory/lib/idempotency'\n\n// ---------------------------------------------------------------------------\n// Product create/edit, rendered through the generic CRUD form. The sectioned\n// layout (General Information · Classification · Pricing+Margin · Stock Levels)\n// comes from the shared buildProductEntity (segmented/computed/currency field\n// types). Persistence still flows through the inventory provider/store, so the\n// metadata-JSON column mapping is unchanged.\n// ---------------------------------------------------------------------------\n\n\nexport function ProductCrudForm({ editId, onSaved, onOpenTab }: {\n editId?: string\n onSaved?: () => void\n /** Edit mode shows the product's tab strip; called for a tab the form does not hold. */\n onOpenTab?: (tabId: string) => void\n}) {\n const t = useTranslation()\n const { productTypes, currency, productDetailTabs: contributedTabs } = useInventoryConfig()\n const provider = useInventoryProvider()\n const createProduct = useInventoryStore((s) => s.createProduct)\n const guardProducts = useLimitGuard('products')\n const isEdit = !!editId\n\n const [initialData, setInitialData] = React.useState<Record<string, any> | null>(isEdit ? null : {})\n const [headerName, setHeaderName] = React.useState('')\n const [referenceDataReady, setReferenceDataReady] = React.useState(false)\n\n // Relation selects fetch immediately when the generic form mounts. Prepare\n // the tenant first, then clear any empty result cached by an earlier visit.\n // A provider without this optional capability keeps working unchanged.\n React.useEffect(() => {\n let cancelled = false\n ;(async () => {\n try {\n await provider.ensureReferenceData?.()\n invalidateRelationOptions()\n } catch (error) {\n // Do not turn a reference-data permission problem into a blank form;\n // the select remains usable with whatever rows could be read.\n console.warn('[inventory] Could not prepare reference data', error)\n } finally {\n if (!cancelled) setReferenceDataReady(true)\n }\n })()\n return () => { cancelled = true }\n }, [provider])\n\n // Load the existing product for edit and map it to flat form values.\n React.useEffect(() => {\n if (!editId) return\n let cancelled = false\n ;(async () => {\n const p = await provider.getProductById(editId)\n if (cancelled) return\n setHeaderName(p?.name ?? '')\n setInitialData(p ? flattenProduct(p as unknown as Record<string, any>) : {})\n })()\n return () => { cancelled = true }\n }, [editId])\n\n const hasMenu = useHasMenu()\n const hasRecipes = useHasRecipes()\n const entity = React.useMemo(\n () => buildProductEntity(t, productTypes, currency, undefined, provider, true, hasMenu, hasRecipes),\n [t, productTypes, currency, provider, hasMenu, hasRecipes],\n )\n\n async function save(values: Record<string, any>) {\n const name = String(values.name ?? '').trim()\n if (!name) { toast.error(t('common.formIncomplete')); throw new Error('name required') }\n const classification = {\n isIngredient: values.isIngredient === true,\n isForSale: values.isForSale === true,\n isIntermediate: values.isIntermediate === true,\n isAsset: values.isAsset === true,\n isProduced: values.isProduced === true,\n isResale: values.isResale === true,\n trackByUnitLabel: values.trackByUnitLabel === true,\n }\n // Nenhum interruptor ligado seria um produto sem ficha nenhuma — e sem\n // lugar na lista, porque a faceta lê o tipo derivado. O V1 marca a\n // Classificação como obrigatória pelo mesmo motivo.\n if (!Object.values(classification).some(Boolean)) {\n toast.error(t('inventory.productForm.classificationRequired'))\n throw new Error('classification required')\n }\n const productType = (values.productType ?? productTypes[0]?.value) as ProductType\n const payload = {\n classification,\n extras: {\n commissionPercent: Number(values.commissionPercent) || 0,\n chartAccountId: values.chartAccountId ?? '',\n contentPerUnit: values.contentPerUnit === '' ? undefined : Number(values.contentPerUnit) || undefined,\n contentUnitId: values.contentUnitId ?? '',\n avgPurchasePrice: Number(values.avgPurchasePrice) || undefined,\n professionalResalePrice: Number(values.professionalResalePrice) || undefined,\n requireBatchForStock: values.requireBatchForStock === true,\n requireExpiryForStock: values.requireExpiryForStock === true,\n },\n ...toFichas(values),\n purchaseUnitId: values.purchaseUnitId ?? '',\n conversionFactor: Number(values.conversionFactor) || 1,\n name,\n sku: values.sku || undefined,\n barcode: values.barcode || undefined,\n brand: values.brand || undefined,\n productType,\n costPrice: Number(values.costPrice) || 0,\n // Switching a menu item back to an input must clear the old commercial\n // price as well as hide it; otherwise reports would keep treating the\n // ingredient as sellable even though the form no longer showed why.\n salePrice: classification.isForSale ? (Number(values.salePrice) || undefined) : 0,\n minQuantity: Number(values.minQuantity) || 0,\n maxQuantity: Number(values.maxQuantity) || undefined,\n description: values.description || undefined,\n // Always sent, even when empty: an empty string clears the link, and\n // `undefined` would leave the previous value in place on edit.\n categoryId: values.categoryId ?? '',\n measurementUnitId: values.measurementUnitId ?? '',\n supplierId: values.supplierId ?? '',\n defaultLocationId: values.defaultLocationId ?? '',\n }\n const imageFile = typeof File !== 'undefined' && values._imageFile instanceof File\n ? values._imageFile\n : undefined\n if (isEdit && editId) {\n await provider.updateProduct(editId, payload)\n if (imageFile && provider.uploadProductImage) await provider.uploadProductImage(editId, imageFile)\n } else {\n // Plan quantity guard (client-side, before the provider call). Opens the\n // global UpgradeModal and aborts when the plan's product cap is reached.\n if ((await guardProducts()) === 'blocked') return\n const created = await createProduct(payload)\n if (imageFile && provider.uploadProductImage) {\n try {\n await provider.uploadProductImage(created.id, imageFile)\n } catch (error) {\n // The product already exists. Do not leave the create form in a state\n // where a retry silently creates a duplicate; report only the media\n // failure and let the user replace the photo from edit mode.\n toast.error('Produto criado, mas a foto não foi enviada.', {\n description: errorMessage(error),\n })\n }\n }\n invalidateLimit('products')\n const openingQty = Number(values._initialQty) || 0\n if (openingQty > 0) {\n try {\n await provider.createMovement({\n productId: created.id,\n movementType: 'entry',\n quantity: openingQty,\n unitCost: Number(values._initialUnitCost) || Number(values.costPrice) || undefined,\n stockLocationId: values._initialLocationId || values.defaultLocationId || undefined,\n batchNumber: values._initialBatch || undefined,\n expirationDate: values._initialExpiry || undefined,\n idempotencyKey: createIdempotencyKey('opening-stock'),\n })\n } catch (error) {\n // Same reasoning as the photo: the product exists, so a retry here\n // would duplicate it. Point at the Stock tab instead.\n toast.error(t('inventory.productForm.initialEntryFailed'), { description: errorMessage(error) })\n }\n }\n }\n onSaved?.()\n }\n\n // Same strip as the product's page, so the tabs do not move between reading and editing.\n const formEntity = React.useMemo(() => {\n if (!isEdit || !initialData) return entity\n return {\n ...entity,\n detailTabs: productRecordTabs({ entity, flat: initialData, hasMenu, hasRecipes, withComplements: Boolean(provider.getProductOptionGroups), contributedTabs, t }),\n }\n }, [entity, isEdit, initialData, hasMenu, hasRecipes, provider, contributedTabs, t])\n const ready = Boolean(initialData) && referenceDataReady\n\n const title = isEdit ? (headerName || t('inventory.productForm.editProduct')) : t('inventory.productForm.newProduct')\n const subtitle = isEdit ? undefined : t('inventory.productForm.addToCatalog')\n\n return (\n <div className=\"space-y-5\">\n {/* In edit mode the form draws the record's own header (name, status,\n Cancel) and tab strip; this one covers create and the loading gap. */}\n {(!isEdit || !ready) && (\n <SubpageHeader title={title} subtitle={subtitle} onBack={onSaved} parentLabel={t('inventory.nav.products')} />\n )}\n {/* Enquanto o produto carrega, a forma do formulário — não o vazio. Sem\n isto a tela ficava só com o cabeçalho e uma área em branco, e o\n conteúdo aparecia de uma vez empurrando tudo. */}\n {!ready && <CrudFormSkeleton twoColumn tabs={isEdit} />}\n {ready && (\n <CrudFormPage\n entityDef={formEntity}\n mode={isEdit ? 'edit' : 'create'}\n initialData={initialData!}\n onSubmit={save}\n onCancel={() => onSaved?.()}\n namePlural={t('inventory.nav.products')}\n hideBreadcrumb={!isEdit}\n onRecordTab={isEdit ? onOpenTab : undefined}\n />\n )}\n </div>\n )\n}\n","import React, { useState, useEffect, useMemo, useRef } from 'react'\nimport { Save, Plus, ArrowUpRight, ArrowDownRight, RefreshCw, ArrowRightLeft, Trash2, Package, Check, Eye, Building2 } from 'lucide-react'\nimport { useInventoryConfig, useInventoryStore, useInventoryProvider, formatCurrency } from '../context'\nimport { Button, cn, Input, Textarea } from '@fayz-ai/ui'\nimport { SubpageHeader } from '@fayz-ai/ui'\nimport { createPendingCommand, useTranslation } from '@fayz-ai/core'\nimport { SearchSelect, type SearchSelectOption } from '@fayz-ai/ui'\nimport { DatePicker } from '@fayz-ai/ui'\nimport {\n MOVEMENT_TYPE_VALUES, canRecordMovement, movementNeedsDestination, movementNeedsReason, movementTakesSupplier,\n type CreateStockMovementInput, type MovementType, type StockMovement,\n} from '@fayz-ai/inventory/domain/movement'\nimport type { StockPosition } from '@fayz-ai/inventory/domain/stock'\nimport type { Supplier } from '@fayz-ai/inventory/domain/product'\nimport { createIdempotencyKey } from '@fayz-ai/inventory/lib/idempotency'\n\n/** O razão guarda a quantidade COM sinal; só falta o `+` explícito na entrada. */\nfunction signedQuantity(q: number | string): string {\n const n = Number(q) || 0\n return n > 0 ? `+${n}` : String(n)\n}\n\n// ---------------------------------------------------------------------------\n// Movement type config\n// ---------------------------------------------------------------------------\n\n// Presentation only. Typed as a Record so TypeScript refuses to compile if a\n// MovementType is ever added to the union and not given a card here — the array\n// this used to be would just have silently omitted it from the picker.\nconst MOVEMENT_TYPE_PRESENTATION: Record<MovementType, { labelKey: string; icon: React.ElementType; color: string; activeColor: string; descKey: string }> = {\n entry: { labelKey: 'inventory.stock.entryLabel', icon: ArrowDownRight, color: 'text-success', activeColor: 'border-success bg-success/10 text-success dark:bg-success/10', descKey: 'inventory.stock.entryDesc' },\n exit: { labelKey: 'inventory.stock.exitLabel', icon: ArrowUpRight, color: 'text-destructive', activeColor: 'border-destructive bg-destructive/10 text-destructive dark:bg-destructive/10', descKey: 'inventory.stock.exitDesc' },\n adjustment: { labelKey: 'inventory.stock.adjustmentLabel', icon: RefreshCw, color: 'text-info', activeColor: 'border-info bg-info/10 text-info dark:bg-info/10', descKey: 'inventory.stock.adjustmentDesc' },\n transfer: { labelKey: 'inventory.stock.transferLabel', icon: ArrowRightLeft, color: 'text-magic', activeColor: 'border-magic bg-magic/10 text-magic dark:bg-magic/10', descKey: 'inventory.stock.transferDesc' },\n loss: { labelKey: 'inventory.stock.lossLabel', icon: Trash2, color: 'text-warning', activeColor: 'border-warning bg-warning/10 text-warning dark:bg-warning/10', descKey: 'inventory.stock.lossDesc' },\n}\n\n// Order comes from the canonical vocabulary, so the picker and any importer\n// agree on both the set and its order.\nconst MOVEMENT_TYPES = MOVEMENT_TYPE_VALUES.map((value) => ({ value, ...MOVEMENT_TYPE_PRESENTATION[value] }))\n\n// ---------------------------------------------------------------------------\n// Movement detail card (for viewing a recorded movement)\n// ---------------------------------------------------------------------------\n\nfunction MovementDetail({ movement, currency, onClose }: {\n movement: StockMovement\n currency: { code: string; locale: string; symbol: string }\n onClose: () => void\n}) {\n const t = useTranslation()\n const typeConfig = MOVEMENT_TYPES.find((mt) => mt.value === movement.movementType)\n const TypeIcon = typeConfig?.icon ?? Package\n\n return (\n <div className=\"space-y-4\">\n <SubpageHeader title={movement.productName ?? `#${movement.id.slice(0, 8)}`} onBack={onClose} parentLabel={t('inventory.nav.stock')} />\n\n <div className=\"rounded-card border bg-card shadow-sm p-5 space-y-4\">\n {/* Type + Product hero */}\n <div className=\"flex items-center gap-3\">\n <div className={`flex h-10 w-10 items-center justify-center rounded-xl ${typeConfig?.activeColor ?? 'bg-muted'}`}>\n <TypeIcon className=\"h-5 w-5\" />\n </div>\n <div>\n <p className=\"text-lg font-bold\">{movement.productName ?? t('inventory.stock.unknownProduct')}</p>\n <p className=\"text-xs text-muted-foreground capitalize\">{movement.movementType} &middot; {movement.movementDate}</p>\n </div>\n </div>\n\n {/* Key details grid */}\n <div className=\"grid gap-3 sm:grid-cols-3 pt-2 border-t\">\n <div>\n <p className=\"text-[10px] text-muted-foreground uppercase\">{t('inventory.stock.quantityLabel')}</p>\n <p className=\"text-sm font-semibold\">{signedQuantity(movement.quantity)}</p>\n </div>\n <div>\n <p className=\"text-[10px] text-muted-foreground uppercase\">{t('inventory.stock.unitCostLabel')}</p>\n <p className=\"text-sm font-semibold\">{formatCurrency(movement.unitCost, currency)}</p>\n </div>\n <div>\n <p className=\"text-[10px] text-muted-foreground uppercase\">{t('inventory.stock.totalCost')}</p>\n <p className=\"text-sm font-semibold\">{formatCurrency(movement.totalCost, currency)}</p>\n </div>\n </div>\n\n {/* Optional details */}\n <div className=\"grid gap-3 sm:grid-cols-2 pt-2 border-t\">\n {movement.stockLocationName && (\n <div>\n <p className=\"text-[10px] text-muted-foreground uppercase\">{t('inventory.stock.locationLabel')}</p>\n <p className=\"text-sm\">{movement.stockLocationName}</p>\n </div>\n )}\n {movement.destinationLocationName && (\n <div>\n <p className=\"text-[10px] text-muted-foreground uppercase\">{t('inventory.stock.destination')}</p>\n <p className=\"text-sm\">{movement.destinationLocationName}</p>\n </div>\n )}\n {movement.supplierName && (\n <div>\n <p className=\"text-[10px] text-muted-foreground uppercase\">{t('inventory.stock.supplier')}</p>\n <p className=\"text-sm\">{movement.supplierName}</p>\n </div>\n )}\n {movement.documentNumber && (\n <div>\n <p className=\"text-[10px] text-muted-foreground uppercase\">{t('inventory.stock.document')}</p>\n <p className=\"text-sm\">{movement.documentNumber}</p>\n </div>\n )}\n {movement.reason && (\n <div>\n <p className=\"text-[10px] text-muted-foreground uppercase\">{t('inventory.stock.reasonLabel')}</p>\n <p className=\"text-sm\">{movement.reason}</p>\n </div>\n )}\n </div>\n\n {movement.notes && (\n <div className=\"pt-2 border-t\">\n <p className=\"text-[10px] text-muted-foreground uppercase\">{t('inventory.stock.notes')}</p>\n <p className=\"text-sm mt-0.5\">{movement.notes}</p>\n </div>\n )}\n\n <div className=\"pt-2 border-t\">\n <p className=\"text-[10px] text-muted-foreground\">{t('inventory.stock.recorded')} {new Date(movement.createdAt).toLocaleString()}</p>\n </div>\n </div>\n </div>\n )\n}\n\n// ---------------------------------------------------------------------------\n// Stock movement form\n// ---------------------------------------------------------------------------\n\nexport function StockMovementView({ defaultType, onSaved, viewMovement }: {\n defaultType: MovementType\n onSaved?: () => void\n viewMovement?: StockMovement\n}) {\n const t = useTranslation()\n const { currency, modules } = useInventoryConfig()\n const provider = useInventoryProvider()\n const products = useInventoryStore((s) => s.products)\n const locations = useInventoryStore((s) => s.locations)\n const fetchProducts = useInventoryStore((s) => s.fetchProducts)\n const fetchLocations = useInventoryStore((s) => s.fetchLocations)\n const createMovement = useInventoryStore((s) => s.createMovement)\n\n const [step, setStep] = useState(1)\n const [positions, setPositions] = useState<StockPosition[]>([])\n const [movementType, setMovementType] = useState<MovementType>(defaultType)\n const [productId, setProductId] = useState('')\n const [productLabel, setProductLabel] = useState('')\n const [quantity, setQuantity] = useState(1)\n const [unitCost, setUnitCost] = useState(0)\n const [locationId, setLocationId] = useState('')\n const [destLocationId, setDestLocationId] = useState('')\n const [reason, setReason] = useState('')\n const [documentNumber, setDocumentNumber] = useState('')\n const [notes, setNotes] = useState('')\n const [batchNumber, setBatchNumber] = useState('')\n const [expirationDate, setExpirationDate] = useState('')\n const [suppliers, setSuppliers] = useState<Supplier[]>([])\n const [supplierId, setSupplierId] = useState('')\n const [supplierLabel, setSupplierLabel] = useState('')\n const [saving, setSaving] = useState(false)\n const [savedMovement, setSavedMovement] = useState<StockMovement | null>(null)\n const command = useRef(createPendingCommand<CreateStockMovementInput>(() => createIdempotencyKey('inventory:manual-movement'), (input) => input.productId))\n const [pending, setPending] = useState(false)\n\n useEffect(() => { fetchProducts({}); fetchLocations() }, [])\n\n // Only an entry has a supplier — goods leaving never came from one.\n useEffect(() => {\n if (movementType !== 'entry' || suppliers.length > 0) return\n provider.getSuppliers().then(setSuppliers).catch(() => setSuppliers([]))\n }, [movementType])\n\n // Build a map of locationId → total quantity from positions.\n // NOTE: these useMemo hooks must run before the early returns below, otherwise\n // saving (which flips savedMovement) renders fewer hooks → React error.\n const positionByLocation = useMemo(() => {\n const map: Record<string, number> = {}\n for (const pos of positions) {\n if (pos.stockLocationId) {\n map[pos.stockLocationId] = (map[pos.stockLocationId] ?? 0) + pos.quantity\n }\n }\n return map\n }, [positions])\n\n // Sort locations by stock position (highest first)\n const sortedLocations = useMemo(() => {\n return [...locations].sort((a, b) => (positionByLocation[b.id] ?? 0) - (positionByLocation[a.id] ?? 0))\n }, [locations, positionByLocation])\n\n // If viewing a movement detail\n if (viewMovement) {\n return <MovementDetail movement={viewMovement} currency={currency} onClose={() => onSaved?.()} />\n }\n\n // If just saved — show success with details\n if (savedMovement) {\n return <MovementDetail movement={savedMovement} currency={currency} onClose={() => onSaved?.()} />\n }\n\n const selectedProduct = products.find((p) => p.id === productId)\n const totalCost = quantity * unitCost\n const typeConfig = MOVEMENT_TYPES.find((t) => t.value === movementType)!\n const needsReason = movementNeedsReason(movementType)\n const needsDest = movementNeedsDestination(movementType)\n\n // Product search\n function searchProducts(query: string): SearchSelectOption[] {\n const q = query.toLowerCase()\n return products\n .filter((p) => p.name.toLowerCase().includes(q) || p.sku?.toLowerCase().includes(q) || p.barcode?.includes(q))\n .slice(0, 20)\n .map((p) => ({\n id: p.id,\n label: p.name,\n subtitle: [p.sku, `${t('inventory.stock.currentStock')} ${p.currentQuantity}`].filter(Boolean).join(' · '),\n group: p.productType,\n icon: <Package className=\"h-4 w-4 text-muted-foreground shrink-0\" />,\n data: p,\n }))\n }\n\n // Auto-fill cost when product selected + fetch positions\n function handleProductSelect(id: string, option: SearchSelectOption | null) {\n setProductId(id)\n setProductLabel(option?.label ?? '')\n if (option?.data?.costPrice && unitCost === 0) {\n setUnitCost(option.data.costPrice)\n }\n // Fetch stock positions per location for this product\n if (id) {\n provider.getPositions(id).then(setPositions).catch(() => setPositions([]))\n } else {\n setPositions([])\n }\n }\n\n function searchSuppliers(query: string): SearchSelectOption[] {\n const q = query.toLowerCase()\n return suppliers\n .filter((s) => s.name.toLowerCase().includes(q) || s.documentNumber?.toLowerCase().includes(q))\n .slice(0, 20)\n .map((s) => ({\n id: s.id,\n label: s.name,\n subtitle: s.documentNumber ?? s.phone,\n icon: <Building2 className=\"h-4 w-4 text-muted-foreground shrink-0\" />,\n }))\n }\n\n const canProceedStep1 = !!productId\n const canProceedStep2 = canRecordMovement({ movementType, quantity, reason, destinationLocationId: destLocationId })\n const title = defaultType === 'entry' ? t('inventory.stock.entry') : defaultType === 'exit' ? t('inventory.stock.exit') : t('inventory.stock.movement')\n\n async function handleSave() {\n if (command.current.running || (!command.current.pending && (!productId || quantity <= 0))) return\n setSaving(true)\n setPending(true)\n try {\n const movement = await command.current.run({\n productId,\n quantity,\n movementType,\n unitCost: unitCost || undefined,\n stockLocationId: locationId || undefined,\n destinationLocationId: destLocationId || undefined,\n reason: reason || undefined,\n documentNumber: documentNumber || undefined,\n notes: notes || undefined,\n batchNumber: batchNumber || undefined,\n expirationDate: expirationDate || undefined,\n supplierId: movementTakesSupplier(movementType) ? supplierId || undefined : undefined,\n }, createMovement)\n setSavedMovement(movement)\n } catch {\n // The store reports the failure; retain the immutable attempt for retry.\n } finally {\n setSaving(false)\n setPending(command.current.pending)\n }\n }\n\n return (\n <div className=\"space-y-6\">\n <SubpageHeader\n title={title}\n subtitle={t('inventory.stock.stepOf', { step: String(step) })}\n onBack={() => { if (!command.current.pending && !command.current.running) { if (step > 1) setStep(step - 1); else onSaved?.() } }}\n parentLabel={t('inventory.nav.stock')}\n />\n\n {/* Progress bar */}\n <div className=\"flex gap-1\">\n {[1, 2, 3].map((s) => (\n <div key={s} className={`h-1 flex-1 rounded-full transition-colors ${s <= step ? 'bg-primary' : 'bg-muted'}`} />\n ))}\n </div>\n\n {/* Step 1: What — Type + Product */}\n {step === 1 && (\n <div className=\"space-y-5\">\n {/* Movement type selector */}\n <div>\n <p className=\"text-xs font-medium text-muted-foreground mb-2\">{t('inventory.stock.movementType')}</p>\n <div className=\"grid gap-2 sm:grid-cols-5\">\n {MOVEMENT_TYPES.map((mt) => {\n const Icon = mt.icon\n const active = movementType === mt.value\n return (\n <Button variant=\"bare\" size=\"bare\"\n key={mt.value}\n onClick={() => setMovementType(mt.value)}\n className={`block whitespace-normal rounded-lg border-2 p-3 text-left font-normal transition-all ${active ? mt.activeColor : 'border-transparent bg-card hover:bg-muted/30'}`}\n >\n <Icon className=\"h-4 w-4 mb-1\" />\n <p className=\"text-xs font-medium\">{t(mt.labelKey)}</p>\n <p className=\"text-[9px] text-muted-foreground mt-0.5 hidden sm:block\">{t(mt.descKey)}</p>\n </Button>\n )\n })}\n </div>\n </div>\n\n {/* Product search */}\n <SearchSelect\n data-tour=\"inventory.entry-product\"\n value={productId}\n displayValue={productLabel}\n onChange={handleProductSelect}\n onSearch={searchProducts}\n label={t('inventory.stock.product')}\n required\n placeholder={t('inventory.stock.searchProduct')}\n minChars={1}\n debounce={150}\n renderOption={(opt) => (\n <>\n {opt.icon}\n <div className=\"min-w-0 flex-1\">\n <p className=\"text-sm truncate\">{opt.label}</p>\n {opt.subtitle && <p className=\"text-[10px] text-muted-foreground\">{opt.subtitle}</p>}\n </div>\n </>\n )}\n />\n\n {selectedProduct && (\n <div className=\"rounded-lg bg-muted/30 px-4 py-3 flex items-center justify-between\">\n <div>\n <p className=\"text-sm font-medium\">{selectedProduct.name}</p>\n <p className=\"text-xs text-muted-foreground\">\n {t('inventory.stock.currentStock')} <span className=\"font-medium\">{selectedProduct.currentQuantity}</span>\n {selectedProduct.minQuantity > 0 && <> &middot; Min: {selectedProduct.minQuantity}</>}\n {selectedProduct.costPrice > 0 && <> &middot; Cost: {formatCurrency(selectedProduct.costPrice, currency)}</>}\n </p>\n </div>\n <span className=\"inline-flex items-center rounded-full px-2 py-0.5 text-[9px] font-medium bg-muted text-muted-foreground capitalize\">{selectedProduct.productType}</span>\n </div>\n )}\n\n <div className=\"flex justify-end\">\n <Button variant=\"bare\" size=\"bare\"\n onClick={() => setStep(2)}\n disabled={!canProceedStep1}\n className=\"inline-flex items-center gap-1.5 rounded-button bg-primary border border-primary px-4 py-2 text-sm font-medium text-primary-foreground hover:bg-primary/90 shadow-button-primary active:shadow-button-inset transition-colors disabled:opacity-50\"\n >\n {t('inventory.stock.next')}\n </Button>\n </div>\n </div>\n )}\n\n {/* Step 2: How much — Quantity + Cost + Location */}\n {step === 2 && (\n <div className=\"space-y-5\">\n <div className=\"rounded-card border bg-card shadow-sm p-5 space-y-4\">\n <div className=\"grid gap-4 sm:grid-cols-3\">\n <div>\n <label className=\"text-xs font-medium text-muted-foreground\">{t('inventory.stock.quantity')}</label>\n <Input\n type=\"number\"\n min={0.01}\n step={0.01}\n value={quantity}\n onChange={(e) => setQuantity(Number(e.target.value) || 0)}\n autoFocus\n className=\"mt-1\"\n />\n </div>\n <div>\n <label className=\"text-xs font-medium text-muted-foreground\">{t('inventory.stock.unitCost')}</label>\n <div className=\"flex items-center mt-1 rounded-input border border-input bg-card shadow-[inset_0_1px_0_rgb(0_0_0_/0.06)] focus-within:ring-2 focus-within:ring-primary/20\">\n <span className=\"pl-2.5 text-xs text-muted-foreground\">{currency.symbol}</span>\n <div className=\"flex-1\">\n <Input type=\"number\" min={0} step={0.01} value={unitCost} onChange={(e) => setUnitCost(Number(e.target.value) || 0)} className=\"h-auto rounded-none border-0 bg-transparent p-2 shadow-none focus-visible:ring-0 focus-visible:ring-offset-0\" />\n </div>\n </div>\n </div>\n <div>\n <label className=\"text-xs font-medium text-muted-foreground\">{t('inventory.stock.total')}</label>\n <p className=\"mt-1 px-3 py-2 text-lg font-bold\">{formatCurrency(totalCost, currency)}</p>\n </div>\n </div>\n\n {/* Location — radio-style selector with stock positions */}\n {modules.stockLocations && locations.length > 0 && (\n <div className=\"space-y-3\">\n <div>\n <label className=\"text-xs font-medium text-muted-foreground\">{needsDest ? t('inventory.stock.fromLocation') : t('inventory.stock.locationLabel')}</label>\n <div className=\"flex flex-wrap gap-2 mt-1.5\">\n {sortedLocations.map((l) => {\n const qty = positionByLocation[l.id] ?? 0\n return (\n <Button variant=\"bare\" size=\"bare\"\n key={l.id}\n type=\"button\"\n onClick={() => setLocationId(l.id)}\n className={cn(\n 'rounded-button border-2 px-3 py-2 text-sm font-medium transition-all flex items-center gap-2',\n locationId === l.id\n ? 'border-primary bg-primary/5 text-primary'\n : 'border-transparent bg-muted/30 text-muted-foreground hover:bg-muted/50',\n )}\n >\n <span>{l.name}</span>\n {productId && (\n <span className={cn(\n 'inline-flex items-center rounded-full px-1.5 py-0.5 text-[10px] font-semibold tabular-nums',\n qty > 0\n ? 'bg-success/10 text-success'\n : 'bg-muted text-muted-foreground',\n )}>\n {qty}\n </span>\n )}\n </Button>\n )\n })}\n </div>\n </div>\n {needsDest && (\n <div>\n <label className=\"text-xs font-medium text-muted-foreground\">{t('inventory.stock.toLocation')}</label>\n <div className=\"flex flex-wrap gap-2 mt-1.5\">\n {sortedLocations.filter((l) => l.id !== locationId).map((l) => {\n const qty = positionByLocation[l.id] ?? 0\n return (\n <Button variant=\"bare\" size=\"bare\"\n key={l.id}\n type=\"button\"\n onClick={() => setDestLocationId(l.id)}\n className={cn(\n 'rounded-button border-2 px-3 py-2 text-sm font-medium transition-all flex items-center gap-2',\n destLocationId === l.id\n ? 'border-primary bg-primary/5 text-primary'\n : 'border-transparent bg-muted/30 text-muted-foreground hover:bg-muted/50',\n )}\n >\n <span>{l.name}</span>\n {productId && (\n <span className={cn(\n 'inline-flex items-center rounded-full px-1.5 py-0.5 text-[10px] font-semibold tabular-nums',\n qty > 0\n ? 'bg-success/10 text-success'\n : 'bg-muted text-muted-foreground',\n )}>\n {qty}\n </span>\n )}\n </Button>\n )\n })}\n </div>\n </div>\n )}\n </div>\n )}\n\n {/* Reason (required for adjustment/loss) */}\n {needsReason && (\n <div>\n <label className=\"text-xs font-medium text-muted-foreground\">{t('inventory.stock.reason')}</label>\n <Input type=\"text\" value={reason} onChange={(e) => setReason(e.target.value)} placeholder={movementType === 'loss' ? t('inventory.stock.reasonLossPlaceholder') : t('inventory.stock.reasonAdjustPlaceholder')} className=\"mt-1\" />\n </div>\n )}\n </div>\n\n <div className=\"flex justify-between\">\n <Button variant=\"bare\" size=\"bare\" onClick={() => setStep(1)} className=\"rounded-lg border px-4 py-2 text-sm font-medium hover:bg-muted bg-card shadow-button active:shadow-button-inset transition-colors\">{t('inventory.stock.back')}</Button>\n <Button variant=\"bare\" size=\"bare\" onClick={() => setStep(3)} disabled={!canProceedStep2} className=\"inline-flex items-center gap-1.5 rounded-button bg-primary border border-primary px-4 py-2 text-sm font-medium text-primary-foreground hover:bg-primary/90 shadow-button-primary active:shadow-button-inset transition-colors disabled:opacity-50\">{t('inventory.stock.next')}</Button>\n </div>\n </div>\n )}\n\n {/* Step 3: Review + Optional details + Save */}\n {step === 3 && (\n <div className=\"space-y-5\">\n {/* Summary card */}\n <div className=\"rounded-card border bg-card shadow-sm p-5\">\n <div className=\"flex items-center gap-3 mb-4\">\n <div className={`flex h-10 w-10 items-center justify-center rounded-xl ${typeConfig.activeColor}`}>\n <typeConfig.icon className=\"h-5 w-5\" />\n </div>\n <div>\n <p className=\"font-semibold\">{productLabel}</p>\n <p className=\"text-xs text-muted-foreground capitalize\">{movementType} &middot; {quantity} units &middot; {formatCurrency(totalCost, currency)}</p>\n </div>\n </div>\n\n <div className=\"grid gap-2 sm:grid-cols-3 text-xs border-t pt-3\">\n <div><span className=\"text-muted-foreground\">{t('inventory.stock.quantityLabel')}:</span> <span className=\"font-medium\">{quantity}</span></div>\n <div><span className=\"text-muted-foreground\">{t('inventory.stock.unitCostLabel')}:</span> <span className=\"font-medium\">{formatCurrency(unitCost, currency)}</span></div>\n <div><span className=\"text-muted-foreground\">{t('inventory.stock.total')}:</span> <span className=\"font-bold\">{formatCurrency(totalCost, currency)}</span></div>\n </div>\n </div>\n\n {/* Optional details */}\n {pending && <p role=\"status\" className=\"text-sm text-warning\">{t('inventory.stock.pendingRetry')}</p>}\n <fieldset disabled={pending} className=\"rounded-card border bg-card shadow-sm p-5 space-y-4\">\n <p className=\"text-xs font-medium text-muted-foreground\">{t('inventory.stock.additionalDetails')}</p>\n <div className=\"grid gap-4 sm:grid-cols-2\">\n {movementType === 'entry' && (\n <SearchSelect\n value={supplierId}\n displayValue={supplierLabel}\n onChange={(id, option) => { setSupplierId(id); setSupplierLabel(option?.label ?? '') }}\n onSearch={searchSuppliers}\n label={t('inventory.stock.supplier')}\n placeholder={t('inventory.stock.searchSupplier')}\n noResultsLabel={t('inventory.stock.noSuppliers')}\n minChars={1}\n debounce={150}\n />\n )}\n <div>\n <label className=\"text-xs font-medium text-muted-foreground\">{t('inventory.stock.documentNumber')}</label>\n <Input type=\"text\" value={documentNumber} onChange={(e) => setDocumentNumber(e.target.value)} placeholder={t('inventory.stock.documentPlaceholder')} className=\"mt-1\" />\n </div>\n {modules.batchTracking && (\n <>\n <div>\n <label className=\"text-xs font-medium text-muted-foreground\">{t('inventory.stock.batchNumber')}</label>\n <Input type=\"text\" value={batchNumber} onChange={(e) => setBatchNumber(e.target.value)} placeholder={t('inventory.stock.batchPlaceholder')} className=\"mt-1\" />\n </div>\n <div>\n <label className=\"text-xs font-medium text-muted-foreground\">{t('inventory.stock.expirationDate')}</label>\n <DatePicker value={expirationDate} onChange={setExpirationDate} className=\"mt-1\" />\n </div>\n </>\n )}\n </div>\n <div>\n <label className=\"text-xs font-medium text-muted-foreground\">{t('inventory.stock.notes')}</label>\n <Textarea value={notes} onChange={(e) => setNotes(e.target.value)} rows={2} placeholder={t('inventory.stock.notesPlaceholder')} className=\"mt-1 resize-none\" />\n </div>\n </fieldset>\n\n <div className=\"flex justify-between\">\n <Button variant=\"bare\" size=\"bare\" disabled={pending} onClick={() => { if (!command.current.pending) setStep(2) }} className=\"rounded-lg border px-4 py-2 text-sm font-medium hover:bg-muted bg-card shadow-button active:shadow-button-inset transition-colors\">{t('inventory.stock.back')}</Button>\n <Button variant=\"bare\" size=\"bare\"\n data-tour=\"inventory.entry-save\"\n onClick={handleSave}\n disabled={saving}\n className=\"inline-flex items-center gap-1.5 rounded-button bg-primary border border-primary px-5 py-2 text-sm font-medium text-primary-foreground hover:bg-primary/90 shadow-button-primary active:shadow-button-inset transition-colors disabled:opacity-50\"\n >\n <Check className=\"h-3.5 w-3.5\" /> {saving ? t('inventory.stock.recording') : t('inventory.stock.recordMovement')}\n </Button>\n </div>\n </div>\n )}\n </div>\n )\n}\n","import React, { useCallback, useEffect, useState, useMemo } from 'react'\nimport { ArrowUpRight, ArrowDownRight, RefreshCw, ArrowRightLeft, Trash2, CircleDashed, MapPin } from 'lucide-react'\nimport type { ColumnDef } from '@tanstack/react-table'\nimport { ListView, Button, DatePicker, FilterMenuRow, FilterPanel, FilterPanelField, InlineLink, Modal, ModalContent, RequiredFilter } from '@fayz-ai/ui'\nimport { resolveDocumentOpenerFor } from '@fayz-ai/admin'\nimport { useInventoryStore, formatCurrency, useInventoryConfig } from '../context'\nimport { useTranslation } from '@fayz-ai/core'\nimport { SubpageHeader } from '@fayz-ai/ui'\nimport {\n MOVEMENT_TYPES, movementTypeSpec, normalizeMovementType, type MovementType, type StockMovement,\n} from '@fayz-ai/inventory/domain/movement'\n\n/** O razão guarda a quantidade COM sinal; só falta o `+` explícito na entrada. */\nfunction signedQuantity(q: number | string): string {\n const n = Number(q) || 0\n return n > 0 ? `+${n}` : String(n)\n}\n\nconst TYPE_ICONS: Record<MovementType, React.ElementType> = {\n entry: ArrowDownRight,\n exit: ArrowUpRight,\n adjustment: RefreshCw,\n transfer: ArrowRightLeft,\n loss: Trash2,\n}\n\n/** Translated label for a movement type; falls back to the raw value. */\nfunction movementTypeLabel(type: MovementType, t: (k: string) => string): string {\n const spec = movementTypeSpec(type)\n return spec ? t(spec.labelKey) : type\n}\n\n/** `03/09/2026 às 10:53` — a data com hora, como o V1 escreve. */\nfunction dataHora(iso: string | undefined): string {\n if (!iso) return '—'\n const d = new Date(iso)\n if (Number.isNaN(d.getTime())) return iso.slice(0, 10).split('-').reverse().join('/')\n // Meia-noite em ponto quase sempre é data SEM hora, e «às 00:00» finge uma\n // precisão que o dado não tem.\n const hora = d.getHours() === 0 && d.getMinutes() === 0\n ? ''\n : ` às ${d.toLocaleTimeString('pt-BR', { hour: '2-digit', minute: '2-digit' })}`\n return `${d.toLocaleDateString('pt-BR')}${hora}`\n}\n\n/** Um campo rotulado do cartão: rótulo pequeno em cima, valor embaixo. */\nfunction Field({ label, children }: { label: string; children: React.ReactNode }) {\n return (\n <div className=\"min-w-0\">\n <dt className=\"text-xs text-muted-foreground\">{label}</dt>\n <dd className=\"truncate\">{children}</dd>\n </div>\n )\n}\n\n/**\n * A COR DIZ A DIREÇÃO, e é a primeira coisa que se lê no cartão.\n *\n * O V1 pinta a pílula INTEIRA — fundo verde-claro com texto verde-escuro — e não\n * só a letra. Com fundo neutro e texto colorido, entrada e saída pareciam a mesma\n * coisa até alguém ler a palavra; a cor existe justamente para não precisar ler.\n *\n * Verde entra, vermelho sai. Perda também diminui o saldo, mas é AMARELO de\n * propósito: saída é mercadoria que serviu para alguma coisa e perda é mercadoria\n * que não serviu, e pintá-las igual apagaria a única diferença que importa quando\n * alguém procura por onde o estoque está vazando.\n */\nconst TYPE_COLORS: Record<MovementType, string> = {\n entry: 'bg-success-soft text-success-soft-foreground',\n exit: 'bg-destructive-soft text-destructive-soft-foreground',\n adjustment: 'bg-info-soft text-info-soft-foreground',\n transfer: 'bg-magic-soft text-magic-soft-foreground',\n loss: 'bg-warning-soft text-warning-soft-foreground',\n}\n\nexport function MovementHistoryView({ onViewDetail, onNew, onNewExit }: {\n onViewDetail?: (id: string) => void\n /** Record an entry. This screen is where you already are when the goods arrive. */\n onNew?: () => void\n onNewExit?: () => void\n} = {}) {\n const t = useTranslation()\n const { currency, documentModal } = useInventoryConfig()\n // O documento aberto por cima da lista. A lista NÃO é desmontada: quem fecha\n // volta ao mesmo recorte, à mesma busca e à mesma rolagem.\n const [documento, setDocumento] = useState<StockMovement | null>(null)\n const movements = useInventoryStore((s) => s.movements)\n const movementsLoading = useInventoryStore((s) => s.movementsLoading)\n const fetchMovements = useInventoryStore((s) => s.fetchMovements)\n\n const locations = useInventoryStore((s) => s.locations)\n const fetchLocations = useInventoryStore((s) => s.fetchLocations)\n useEffect(() => { void fetchLocations() }, [fetchLocations])\n\n const [search, setSearch] = useState('')\n\n // ── O RECORTE DO V1, e ele so busca quando mandam ────────────────────────\n //\n // O razao do V1 recorta por tipo, periodo e local, e a lista aqui nao\n // recortava por nada: «o que saiu de Cozinha em setembro?» nao tinha\n // resposta, e a unica saida era rolar o razao inteiro.\n //\n // Rascunho, como nas telas do financeiro: cada campo custa uma leitura do\n // razao, e mexer em tres deles nao pode custar tres.\n const hoje = () => {\n const d = new Date()\n return `${d.getFullYear()}-${String(d.getMonth() + 1).padStart(2, '0')}-${String(d.getDate()).padStart(2, '0')}`\n }\n const trintaDiasAtras = useMemo(() => {\n const d = new Date(); d.setDate(d.getDate() - 29)\n return `${d.getFullYear()}-${String(d.getMonth() + 1).padStart(2, '0')}-${String(d.getDate()).padStart(2, '0')}`\n }, [])\n const [tipos, setTipos] = useState<MovementType[]>([])\n const [locationId, setLocationId] = useState('')\n const [dateFrom, setDateFrom] = useState(trintaDiasAtras)\n const [dateTo, setDateTo] = useState(hoje)\n\n const rascunho = useMemo(\n () => ({ tipos, locationId, from: dateFrom, to: dateTo }),\n [tipos, locationId, dateFrom, dateTo],\n )\n const [emVigor, setEmVigor] = useState(rascunho)\n const filtrosPendentes = useMemo(\n () => JSON.stringify(rascunho) !== JSON.stringify(emVigor),\n [rascunho, emVigor],\n )\n const aplicarFiltros = useCallback(() => setEmVigor(() => rascunho), [rascunho])\n const limparFiltros = () => {\n setTipos([])\n setLocationId('')\n setDateFrom(trintaDiasAtras)\n setDateTo(hoje())\n }\n\n useEffect(() => {\n fetchMovements({\n search: search || undefined,\n movementType: emVigor.tipos.length > 0 ? emVigor.tipos : undefined,\n stockLocationId: emVigor.locationId || undefined,\n dateRange: { from: emVigor.from, to: emVigor.to },\n })\n }, [search, emVigor])\n\n // ---------------------------------------------------------------------------\n // UM CARTÃO POR MOVIMENTO, como no V1.\n // ---------------------------------------------------------------------------\n // A tela do V1 (Estoque → Movimentações) não é tabela: cada movimento é um\n // cartão que começa pelo TIPO, porque o tipo é a informação mais importante da\n // linha, e termina em «Motivo:», porque nenhum movimento existe sem motivo.\n //\n // A tabela que estava aqui espalhava isso em seis colunas estreitas, e o motivo\n // — que responde «de onde vieram essas entradas que eu não lancei?» — virava\n // legenda truncada debaixo do nome do produto.\n //\n // O que o V1 NÃO tem e fica: o LOCAL de estoque. Copiar a forma não é motivo\n // para perder um dado que a V2 já mostrava.\n //\n // Continua dentro do `ListView` — UMA coluna, sem cabeçalho. A busca, o «Nova\n // Movimentação», o estado vazio e os filtros são os mesmos de toda lista do\n // produto; só o desenho da linha muda.\n const columns: ColumnDef<StockMovement, any>[] = useMemo(() => [\n {\n id: 'movimento',\n header: () => null,\n cell: ({ row }: any) => {\n const m = row.original as StockMovement\n // O RAZÃO FALA OUTRA PALAVRA. A view devolve `kind` como `movement_type`,\n // e lá a entrada se chama `in`, não `entry`. O rótulo já normalizava (por\n // isso escrevia «Entrada»), mas os mapas de ícone e cor eram indexados\n // pelo nome canônico — então toda entrada caía no padrão e saía cinza,\n // com o ícone de «atualizar». Normaliza UMA vez, no topo da célula.\n const type = normalizeMovementType(m.movementType) ?? m.movementType\n const Icon = TYPE_ICONS[type] ?? RefreshCw\n const reason: string | undefined = m.reason || undefined\n const doc: string | undefined = m.documentNumber || undefined\n // Um uuid não é número de documento para ninguém: quando a origem é o\n // próprio sistema (a venda que consumiu a receita), o id não vira texto\n // de tela. Melhor não dizer nada do que dizer um uuid.\n const printableDoc = doc && !/^[0-9a-f-]{32,36}$/i.test(doc) ? doc : undefined\n const caption = reason ?? (printableDoc ? `Documento ${printableDoc}` : undefined)\n // O CAMINHO DE VOLTA. A linha sabe que veio de um documento e de QUAL\n // operação; quem sabe desenhá-lo se registrou ao ser carregado. A\n // configuração do app ainda ganha, para o caso de ele querer outra coisa.\n const abrivel = Boolean(documentModal || resolveDocumentOpenerFor(m))\n const total = Number(m.totalCost)\n const temTotal = Number.isFinite(total) && total !== 0\n\n return (\n <div className=\"space-y-3 py-1\">\n {/* ① Tipo e produto, nesta ordem — é como o V1 abre o cartão. */}\n <div className=\"flex flex-wrap items-center gap-2\">\n <span className={`inline-flex shrink-0 items-center gap-1 rounded-full px-2 py-0.5 text-xs font-medium ${TYPE_COLORS[type] ?? 'bg-muted text-muted-foreground'}`}>\n <Icon className=\"h-3 w-3\" aria-hidden />\n {movementTypeLabel(type, t)}\n </span>\n <span className=\"min-w-0 truncate font-semibold\">{m.productName ?? '—'}</span>\n </div>\n\n {/* ② Os campos rotulados. O V1 põe três; o Local entra como quarto\n quando existe, porque perder dado não faz parte de copiar forma. */}\n <dl className=\"grid gap-x-6 gap-y-2 text-sm sm:grid-cols-2 lg:grid-cols-4\">\n <Field label={t('inventory.history.columnQty')}>\n <span className=\"font-medium tabular-nums\">\n {signedQuantity(m.quantity)}\n {m.measurementUnitAbbreviation && (\n <span className=\"ml-1 uppercase text-muted-foreground\">{m.measurementUnitAbbreviation}</span>\n )}\n </span>\n </Field>\n <Field label={t('inventory.history.columnDate')}>\n <span className=\"tabular-nums\">{dataHora(m.movementDate)}</span>\n </Field>\n <Field label={t('inventory.history.columnTotal')}>\n {temTotal ? (\n <span className=\"font-medium tabular-nums\">{formatCurrency(total, currency)}</span>\n ) : (\n // Custo é OPCIONAL na entrada, e o V1 documenta o beco que isso\n // abre: o saldo sobe, o valor do estoque não, e o «Valor Total»\n // da visão geral se descola sem ninguém errar nada. «R$ 0,00»\n // esconderia isso atrás de um número.\n <span\n className=\"text-muted-foreground\"\n title=\"Movimento registrado sem custo: o saldo mudou, o valor do estoque não\"\n >\n —\n </span>\n )}\n </Field>\n {m.stockLocationName && (\n <Field label={t('inventory.history.columnLocation')}>\n <span className=\"truncate\">\n {m.stockLocationName}\n {type === 'transfer' && m.destinationLocationName && <> → {m.destinationLocationName}</>}\n </span>\n </Field>\n )}\n </dl>\n\n {/* ③ O motivo, por último e por extenso. É o fecho do cartão do V1. */}\n <p className=\"text-sm\">\n <span className=\"text-muted-foreground\">Motivo: </span>\n {caption ? (\n abrivel ? (\n // `dashed` e não `solid`: o tracejado é o traço que este produto\n // usa para «esta palavra é um gatilho» — o mesmo da data no\n // cronograma de pagamento e dos controles da barra. Contínuo\n // promete navegação, e aqui nada sai da página.\n //\n // Sem a seta de link externo, pela mesma razão: ela diz «isto te\n // leva embora», e o que acontece é um modal por cima da lista,\n // com a lista intacta atrás.\n <InlineLink\n tone=\"dashed\"\n title={`Abrir ${caption}`}\n // A linha inteira abre o detalhe do movimento; este gatilho abre\n // o DOCUMENTO. Sem parar a propagação, um clique faria as duas.\n onClick={(e) => { e.stopPropagation(); setDocumento(m) }}\n >\n {caption}\n </InlineLink>\n ) : caption\n ) : (\n // Movimento sem motivo é um buraco no razão, e o V1 não deixa\n // criar um pela tela. Dizê-lo é o que faz alguém parar de criar.\n <span className=\"italic text-muted-foreground\">sem motivo registrado</span>\n )}\n </p>\n </div>\n )\n },\n },\n ], [currency, t, documentModal])\n\n return (\n <div className=\"space-y-4\">\n <SubpageHeader title={t('inventory.history.title')} subtitle={t('inventory.history.subtitle')} />\n\n <FilterPanel\n title={t('inventory.filters.title')}\n dirty={filtrosPendentes}\n onApply={aplicarFiltros}\n applyLabel={t('inventory.filters.apply')}\n pendingTitle={t('inventory.filters.pending')}\n pendingHint={t('inventory.filters.pendingHint')}\n onClear={(tipos.length > 0 || locationId) ? limparFiltros : undefined}\n clearLabel={t('inventory.filters.clear')}\n busy={movementsLoading}\n >\n <FilterPanelField label={t('inventory.history.columnType')}>\n <RequiredFilter\n label={t('inventory.history.columnType')}\n value={\n tipos.length === 0\n ? t('inventory.filters.allTypes')\n : tipos.length === 1\n ? movementTypeLabel(tipos[0], t)\n : t('crud.list.selectedMany', { count: tipos.length })\n }\n icon={CircleDashed}\n className=\"h-9 w-full justify-start\"\n align=\"start\"\n >\n <div className=\"space-y-0.5\">\n <FilterMenuRow active={tipos.length === 0} onClick={() => setTipos([])}>\n {t('inventory.filters.allTypes')}\n </FilterMenuRow>\n {MOVEMENT_TYPES.map((spec) => {\n const on = tipos.includes(spec.value)\n return (\n <FilterMenuRow\n key={spec.value}\n active={on}\n onClick={() => setTipos(on ? tipos.filter((v) => v !== spec.value) : [...tipos, spec.value])}\n >\n <span className=\"truncate\">{t(spec.labelKey)}</span>\n </FilterMenuRow>\n )\n })}\n </div>\n </RequiredFilter>\n </FilterPanelField>\n\n {locations.length > 0 && (\n <FilterPanelField label={t('inventory.filters.location')}>\n <RequiredFilter\n label={t('inventory.filters.location')}\n value={locations.find((l) => l.id === locationId)?.name ?? t('inventory.filters.allLocations')}\n icon={MapPin}\n className=\"h-9 w-full justify-start\"\n align=\"start\"\n >\n {(close: () => void) => (\n <div className=\"max-h-72 space-y-0.5 overflow-y-auto\">\n <FilterMenuRow active={!locationId} onClick={() => { setLocationId(''); close() }}>\n {t('inventory.filters.allLocations')}\n </FilterMenuRow>\n {locations.map((l) => (\n <FilterMenuRow key={l.id} active={locationId === l.id} onClick={() => { setLocationId(l.id); close() }}>\n <span className=\"truncate\">{l.name}</span>\n </FilterMenuRow>\n ))}\n </div>\n )}\n </RequiredFilter>\n </FilterPanelField>\n )}\n\n <FilterPanelField label={t('inventory.filters.from')}>\n <DatePicker variant=\"input\" format=\"numeric\" className=\"w-full\" value={dateFrom} onChange={(v) => v && setDateFrom(v)} />\n </FilterPanelField>\n <FilterPanelField label={t('inventory.filters.to')}>\n <DatePicker variant=\"input\" format=\"numeric\" className=\"w-full\" value={dateTo} onChange={(v) => v && setDateTo(v)} />\n </FilterPanelField>\n </FilterPanel>\n\n <ListView<StockMovement>\n columns={columns}\n data={movements}\n loading={movementsLoading}\n searchPlaceholder={t('inventory.history.searchPlaceholder')}\n search={search}\n onSearchChange={setSearch}\n searchDebounce={0}\n onRowClick={onViewDetail ? (row) => onViewDetail(row.id) : undefined}\n newLabel={onNew ? t('inventory.history.newEntry') : undefined}\n onNew={onNew}\n headerActions={onNewExit ? (\n <Button variant=\"outline\" size=\"sm\" onClick={onNewExit}>\n <ArrowUpRight className=\"mr-1.5 h-3.5 w-3.5\" />\n {t('inventory.history.newExit')}\n </Button>\n ) : undefined}\n emptyMessage={t('inventory.history.noMovements')}\n emptyActionLabel={onNew ? t('inventory.history.newEntry') : undefined}\n onEmptyAction={onNew}\n />\n\n {/* O documento que originou o movimento. O Estoque desenha a moldura e\n cuida do abrir/fechar; o conteúdo vem de quem sabe o que é uma NF-e. */}\n <Modal open={Boolean(documento)} onOpenChange={(open) => { if (!open) setDocumento(null) }}>\n {documento && (\n <ModalContent size=\"5xl\" noPadding className=\"sm:max-h-[90vh]\">\n {documentModal\n ? documentModal(documento, () => setDocumento(null))\n : resolveDocumentOpenerFor(documento)?.render(documento, () => setDocumento(null))}\n </ModalContent>\n )}\n </Modal>\n </div>\n )\n}\n","import React, { useCallback, useEffect, useMemo, useState } from 'react'\nimport { CircleDashed, Layers, MapPin, Search, Boxes } from 'lucide-react'\nimport type { ColumnDef } from '@tanstack/react-table'\nimport {\n Button,\n Card, DataTable, FilterMenuRow, FilterPanel, FilterPanelField, Input, RequiredFilter, SegmentedControl,\n} from '@fayz-ai/ui'\nimport { useTranslation } from '@fayz-ai/core'\nimport { useInventoryConfig, useInventoryProvider, useInventoryStore, formatCurrency } from '../context'\nimport type { ProductCategory } from '@fayz-ai/inventory/domain/product'\nimport type { StockHealth, StockPanelRow } from '@fayz-ai/inventory/domain/stock'\n\n// ---------------------------------------------------------------------------\n// O PAINEL DO INVENTÁRIO — quanto há, onde, de que lote e até quando.\n//\n// É a primeira das duas abas do inventário do V1 (Painel · Contagens), e a que\n// não existia aqui: o inventário abria direto na lista de contagens, que\n// responde \"o que já foi conferido\" e não \"o que eu tenho\".\n//\n// UMA LINHA POR POSIÇÃO (produto × local × lote × validade), e não por produto:\n// somado, um lote vencido desaparece dentro de um saldo saudável — e o painel\n// existe justamente para que ele não desapareça.\n//\n// O que o V1 tem e esta tela ainda não: curva ABC e giro de 90 dias. Os dois\n// são análise sobre o histórico de saída, não um campo da posição; entram\n// quando houver de onde calculá-los.\n// ---------------------------------------------------------------------------\n\nconst HEALTH_ORDER: readonly StockHealth[] = ['negative', 'below_min', 'zero', 'ok']\n\nconst HEALTH_TONE: Record<StockHealth, string> = {\n negative: 'bg-destructive-soft text-destructive-soft-foreground',\n below_min: 'bg-warning-soft text-warning-soft-foreground',\n zero: 'bg-muted text-muted-foreground',\n ok: 'bg-success-soft text-success-soft-foreground',\n}\n\nconst EXPIRY_OPTIONS = ['all', 'expired', 'le30', 'le60', 'le90', 'none'] as const\ntype ExpiryFilter = (typeof EXPIRY_OPTIONS)[number]\n\nexport function StockPanelView() {\n const t = useTranslation()\n const provider = useInventoryProvider()\n const { currency } = useInventoryConfig()\n const locations = useInventoryStore((s) => s.locations)\n const fetchLocations = useInventoryStore((s) => s.fetchLocations)\n\n const [categories, setCategories] = useState<ProductCategory[]>([])\n const [rows, setRows] = useState<StockPanelRow[]>([])\n const [loading, setLoading] = useState(false)\n const [suportado, setSuportado] = useState(true)\n\n useEffect(() => { void fetchLocations() }, [fetchLocations])\n useEffect(() => {\n let vivo = true\n provider.getCategories().then((c) => { if (vivo) setCategories(c) }).catch(() => {})\n return () => { vivo = false }\n }, [provider])\n\n // ── O rascunho e o recorte em vigor ─────────────────────────────────────\n //\n // O painel do V1 tem «Aplicar filtros» e não recarrega a cada campo — e com\n // razão: são seis recortes, e a consulta varre as posições do inquilino.\n const [locationId, setLocationId] = useState('')\n const [categoryId, setCategoryId] = useState('')\n const [produto, setProduto] = useState('')\n const [lote, setLote] = useState('')\n const [validade, setValidade] = useState<ExpiryFilter>('all')\n const [saude, setSaude] = useState<StockHealth[]>([])\n\n const rascunho = useMemo(\n () => ({ locationId, categoryId, produto: produto.trim(), lote: lote.trim(), validade, saude }),\n [locationId, categoryId, produto, lote, validade, saude],\n )\n const [emVigor, setEmVigor] = useState(rascunho)\n const filtrosPendentes = useMemo(\n () => JSON.stringify(rascunho) !== JSON.stringify(emVigor),\n [rascunho, emVigor],\n )\n const aplicarFiltros = useCallback(() => setEmVigor(() => rascunho), [rascunho])\n const limparFiltros = () => {\n setLocationId(''); setCategoryId(''); setProduto(''); setLote('')\n setValidade('all'); setSaude([])\n }\n const filtrosAtivos =\n (locationId ? 1 : 0) + (categoryId ? 1 : 0) + (produto.trim() ? 1 : 0) +\n (lote.trim() ? 1 : 0) + (validade !== 'all' ? 1 : 0) + (saude.length > 0 ? 1 : 0)\n\n useEffect(() => {\n if (!provider.getStockPanel) { setSuportado(false); return }\n let vivo = true\n setLoading(true)\n provider.getStockPanel({\n stockLocationId: emVigor.locationId || undefined,\n categoryId: emVigor.categoryId || undefined,\n productSearch: emVigor.produto || undefined,\n batch: emVigor.lote || undefined,\n expiry: emVigor.validade,\n status: emVigor.saude.length > 0 ? emVigor.saude : undefined,\n })\n .then((data) => { if (vivo) setRows(data) })\n .catch(() => { if (vivo) setRows([]) })\n .finally(() => { if (vivo) setLoading(false) })\n return () => { vivo = false }\n }, [provider, emVigor])\n\n const totais = useMemo(() => ({\n linhas: rows.length,\n valor: rows.reduce((soma, r) => soma + r.totalValue, 0),\n }), [rows])\n\n const columns: ColumnDef<StockPanelRow, any>[] = useMemo(() => [\n {\n accessorKey: 'productName', header: t('inventory.panel.columnProduct'),\n cell: ({ row }) => (\n <div className=\"min-w-0\">\n <p className=\"truncate font-medium\">{row.original.productName}</p>\n {row.original.categoryName && (\n <p className=\"truncate text-[10px] text-muted-foreground\">{row.original.categoryName}</p>\n )}\n </div>\n ),\n },\n {\n accessorKey: 'stockLocationName', header: t('inventory.panel.columnLocation'),\n cell: ({ getValue }) => <span className=\"text-xs text-muted-foreground\">{(getValue() as string) ?? '—'}</span>,\n },\n {\n accessorKey: 'batchNumber', header: t('inventory.panel.columnBatch'),\n cell: ({ getValue }) => <span className=\"font-mono text-xs text-muted-foreground\">{(getValue() as string) ?? '—'}</span>,\n },\n {\n accessorKey: 'expirationDate', header: t('inventory.panel.columnExpiry'),\n cell: ({ getValue }) => <span className=\"text-xs text-muted-foreground\">{(getValue() as string) ?? '—'}</span>,\n },\n {\n accessorKey: 'quantity', header: t('inventory.panel.columnQuantity'), enableSorting: true,\n cell: ({ row }) => (\n <span className=\"block text-right tabular-nums\">\n {row.original.quantity}\n {row.original.minQuantity > 0 && (\n <span className=\"ml-1 text-[10px] text-muted-foreground\">/ {row.original.minQuantity}</span>\n )}\n </span>\n ),\n },\n {\n accessorKey: 'totalValue', header: t('inventory.panel.columnValue'), enableSorting: true,\n cell: ({ getValue }) => (\n <span className=\"block text-right tabular-nums\">{formatCurrency(Number(getValue()) || 0, currency)}</span>\n ),\n },\n {\n accessorKey: 'health', header: t('inventory.filters.stockState'),\n cell: ({ getValue }) => {\n const h = getValue() as StockHealth\n return (\n <span className={`inline-flex items-center rounded-full px-2 py-0.5 text-[10px] font-medium ${HEALTH_TONE[h]}`}>\n {t(`inventory.filters.health.${h}`)}\n </span>\n )\n },\n },\n ], [currency, t])\n\n if (!suportado) {\n return (\n <Card className=\"py-16 text-center\">\n <Boxes className=\"mx-auto mb-2 h-8 w-8 text-muted-foreground/30\" />\n <p className=\"text-sm text-muted-foreground\">{t('inventory.panel.unsupported')}</p>\n </Card>\n )\n }\n\n return (\n <div className=\"space-y-4\">\n <FilterPanel\n title={t('inventory.filters.title')}\n dirty={filtrosPendentes}\n onApply={aplicarFiltros}\n applyLabel={t('inventory.filters.apply')}\n pendingTitle={t('inventory.filters.pending')}\n pendingHint={t('inventory.filters.pendingHint')}\n onClear={filtrosAtivos > 0 ? limparFiltros : undefined}\n clearLabel={t('inventory.filters.clear')}\n busy={loading}\n moreLabel={t('inventory.filters.more')}\n lessLabel={t('inventory.filters.less')}\n advancedCount={(lote.trim() ? 1 : 0) + (validade !== 'all' ? 1 : 0)}\n advanced={\n <>\n <FilterPanelField label={t('inventory.panel.columnBatch')}>\n <Input\n value={lote}\n onChange={(e) => setLote(e.target.value)}\n onKeyDown={(e) => { if (e.key === 'Enter') aplicarFiltros() }}\n placeholder={t('inventory.filters.batchPlaceholder')}\n className=\"h-9\"\n />\n </FilterPanelField>\n\n <FilterPanelField label={t('inventory.filters.expiry')}>\n <RequiredFilter\n label={t('inventory.filters.expiry')}\n value={t(`inventory.filters.expiry.${validade}`)}\n icon={CircleDashed}\n className=\"h-9 w-full justify-start\"\n align=\"start\"\n >\n {(close: () => void) => (\n <div className=\"space-y-0.5\">\n {EXPIRY_OPTIONS.map((op) => (\n <FilterMenuRow key={op} active={validade === op} onClick={() => { setValidade(op); close() }}>\n {t(`inventory.filters.expiry.${op}`)}\n </FilterMenuRow>\n ))}\n </div>\n )}\n </RequiredFilter>\n </FilterPanelField>\n </>\n }\n >\n {locations.length > 0 && (\n <FilterPanelField label={t('inventory.filters.location')}>\n <RequiredFilter\n label={t('inventory.filters.location')}\n value={locations.find((l) => l.id === locationId)?.name ?? t('inventory.filters.allLocations')}\n icon={MapPin}\n className=\"h-9 w-full justify-start\"\n align=\"start\"\n >\n {(close: () => void) => (\n <div className=\"max-h-72 space-y-0.5 overflow-y-auto\">\n <FilterMenuRow active={!locationId} onClick={() => { setLocationId(''); close() }}>\n {t('inventory.filters.allLocations')}\n </FilterMenuRow>\n {locations.map((l) => (\n <FilterMenuRow key={l.id} active={locationId === l.id} onClick={() => { setLocationId(l.id); close() }}>\n <span className=\"truncate\">{l.name}</span>\n </FilterMenuRow>\n ))}\n </div>\n )}\n </RequiredFilter>\n </FilterPanelField>\n )}\n\n {categories.length > 0 && (\n <FilterPanelField label={t('inventory.filters.category')}>\n <RequiredFilter\n label={t('inventory.filters.category')}\n value={categories.find((c) => c.id === categoryId)?.name ?? t('inventory.filters.allCategories')}\n icon={Layers}\n className=\"h-9 w-full justify-start\"\n align=\"start\"\n >\n {(close: () => void) => (\n <div className=\"max-h-72 space-y-0.5 overflow-y-auto\">\n <FilterMenuRow active={!categoryId} onClick={() => { setCategoryId(''); close() }}>\n {t('inventory.filters.allCategories')}\n </FilterMenuRow>\n {categories.map((c) => (\n <FilterMenuRow key={c.id} active={categoryId === c.id} onClick={() => { setCategoryId(c.id); close() }}>\n <span className=\"truncate\">{c.name}</span>\n </FilterMenuRow>\n ))}\n </div>\n )}\n </RequiredFilter>\n </FilterPanelField>\n )}\n\n {/* O ESTADO DO ESTOQUE É MULTI-SELEÇÃO, como no V1: «negativo OU abaixo\n do mínimo» é uma pergunta só — a lista do que precisa de compra. */}\n <FilterPanelField label={t('inventory.filters.stockState')} className=\"sm:col-span-2\">\n <div className=\"flex flex-wrap items-center gap-1.5\">\n {HEALTH_ORDER.map((h) => {\n const on = saude.includes(h)\n return (\n <Button variant=\"bare\" size=\"bare\"\n key={h}\n type=\"button\"\n aria-pressed={on}\n onClick={() => setSaude(on ? saude.filter((v) => v !== h) : [...saude, h])}\n className={`font-normal rounded-full border px-2.5 py-1 text-xs transition-colors ${\n on\n ? 'border-primary bg-primary/10 text-primary'\n : 'border-input bg-muted/40 text-muted-foreground hover:bg-muted'\n }`}\n >\n {t(`inventory.filters.health.${h}`)}\n </Button>\n )\n })}\n </div>\n </FilterPanelField>\n </FilterPanel>\n\n {/* A busca do produto mora colada nas linhas, como em toda lista. */}\n <Card className=\"relative px-3 py-1.5\">\n <Search className=\"pointer-events-none absolute left-5 top-1/2 h-3.5 w-3.5 -translate-y-1/2 text-muted-foreground\" />\n <Input\n type=\"text\"\n value={produto}\n onChange={(e) => setProduto(e.target.value)}\n onKeyDown={(e) => { if (e.key === 'Enter') aplicarFiltros() }}\n placeholder={t('inventory.filters.productPlaceholder')}\n aria-label={t('inventory.filters.productPlaceholder')}\n className=\"h-auto rounded-none border-0 bg-transparent py-1.5 pl-8 pr-3 shadow-none focus-visible:ring-0 focus-visible:ring-offset-0\"\n />\n </Card>\n\n <DataTable\n columns={columns}\n data={loading ? [] : rows}\n loading={loading}\n emptyMessage={t('inventory.panel.empty')}\n />\n\n {rows.length > 0 && !loading && (\n <div className=\"flex items-center justify-end gap-6 rounded-lg border bg-muted/30 px-5 py-3 text-sm\">\n <div className=\"flex items-center gap-2\">\n <span className=\"text-muted-foreground\">{t('inventory.panel.totalLines')}</span>\n <span className=\"font-semibold tabular-nums\">{totais.linhas}</span>\n </div>\n <div className=\"h-4 w-px bg-border\" />\n <div className=\"flex items-center gap-2\">\n <span className=\"text-muted-foreground\">{t('inventory.panel.totalValue')}</span>\n <span className=\"font-semibold tabular-nums\">{formatCurrency(totais.valor, currency)}</span>\n </div>\n </div>\n )}\n </div>\n )\n}\n","import React, { useCallback, useEffect, useMemo, useState } from 'react'\nimport { CircleDashed, Layers, MapPin } from 'lucide-react'\nimport { CrudListView } from '@fayz-ai/admin'\nimport { DatePicker, FilterMenuRow, FilterPanel, FilterPanelField, RequiredFilter } from '@fayz-ai/ui'\nimport { useTranslation } from '@fayz-ai/core'\nimport type { EntityDef } from '@fayz-ai/core'\nimport { useInventoryProvider } from '../context'\nimport type { CountSessionStatus, StockCountSession } from '@fayz-ai/inventory/domain/count'\n\nconst COUNT_STATUSES: readonly CountSessionStatus[] = ['open', 'counting', 'closed', 'cancelled']\n\nconst STATUS_TONE: Record<CountSessionStatus, string> = {\n open: 'bg-muted text-muted-foreground',\n counting: 'bg-info-soft text-info-soft-foreground',\n closed: 'bg-success-soft text-success-soft-foreground',\n cancelled: 'bg-muted text-muted-foreground line-through',\n}\n\nfunction buildCountEntity(t: (key: string, params?: Record<string, string>) => string): EntityDef {\n return {\n name: t('inventory.counts.entity'),\n namePlural: t('inventory.counts.title'),\n icon: 'ClipboardList',\n displayField: 'label',\n fields: [\n {\n key: 'label', label: t('inventory.counts.colReference'), type: 'text', searchable: true,\n renderCell: (_v, row: any) => (\n <div>\n <p className=\"font-medium\">{row.label}</p>\n <p className=\"text-xs text-muted-foreground\">{row.stockLocationName ?? '—'}</p>\n </div>\n ),\n },\n {\n key: 'openedAt', label: t('inventory.counts.colOpened'), type: 'text',\n renderCell: (_v, row: any) => (\n <span className=\"text-xs text-muted-foreground\">{row.openedAt?.slice(0, 10) ?? '—'}</span>\n ),\n },\n {\n key: 'status', label: t('inventory.counts.colStatus'), type: 'text',\n renderCell: (_v, row: any) => (\n <span className={`inline-flex items-center rounded-full px-2 py-0.5 text-[10px] font-medium ${STATUS_TONE[row.status as CountSessionStatus]}`}>\n {t(`inventory.counts.status.${row.status}`)}\n </span>\n ),\n },\n {\n key: 'progress', label: t('inventory.counts.colProgress'), type: 'text',\n renderCell: (_v, row: any) => (\n <span className=\"block text-right tabular-nums text-muted-foreground\">\n {t('inventory.counts.progress', { counted: String(row.countedCount ?? 0), total: String(row.itemCount ?? 0) })}\n </span>\n ),\n },\n {\n key: 'divergentCount', label: t('inventory.counts.colDivergent'), type: 'number',\n renderCell: (_v, row: any) => (\n <span className={`block text-right tabular-nums ${row.divergentCount ? 'font-medium text-warning-soft-foreground' : 'text-muted-foreground'}`}>\n {row.divergentCount ?? 0}\n </span>\n ),\n },\n ],\n }\n}\n\n/** The counts a tenant has run — and the way into a new one. */\nexport function StockCountsView({ onNew, onOpen }: {\n onNew?: () => void\n onOpen?: (id: string) => void\n}) {\n const t = useTranslation()\n const provider = useInventoryProvider()\n\n const [sessions, setSessions] = useState<StockCountSession[]>([])\n const [loadedOnce, setLoadedOnce] = useState(false)\n const [search, setSearch] = useState('')\n\n // ── O RECORTE DO V1, na granularidade que uma SESSÃO tem ─────────────────\n //\n // O inventário do V1 recorta por unidade, local, categoria e situação. Uma\n // sessão de contagem carrega local, categoria, situação e a data em que\n // abriu — é o que dá para perguntar aqui, e era exatamente o que faltava:\n // com dezenas de contagens no histórico, «as contagens abertas da Cozinha»\n // só se achava rolando.\n //\n // Tudo do lado do cliente: `getCountSessions` já traz a lista inteira, e um\n // recorte que não vai ao banco aplica na hora — sem rascunho, porque não há\n // consulta para poupar.\n const [locationId, setLocationId] = useState('')\n const [categoryId, setCategoryId] = useState('')\n const [statusFilter, setStatusFilter] = useState<CountSessionStatus[]>([])\n // Periodo pela data de ABERTURA: e a data que a sessao tem desde o primeiro\n // instante. `closedAt` so existe no fim, e recortar por ele esconderia toda\n // contagem em andamento — justamente as que se procura.\n const [dateFrom, setDateFrom] = useState('')\n const [dateTo, setDateTo] = useState('')\n\n const locais = useMemo(() => {\n const vistos = new Map<string, string>()\n for (const s of sessions) {\n if (s.stockLocationId && !vistos.has(s.stockLocationId)) {\n vistos.set(s.stockLocationId, s.stockLocationName ?? s.stockLocationId)\n }\n }\n return [...vistos].map(([id, name]) => ({ id, name })).sort((a, b) => a.name.localeCompare(b.name, 'pt-BR'))\n }, [sessions])\n\n const categorias = useMemo(() => {\n const vistos = new Map<string, string>()\n for (const s of sessions) {\n if (s.categoryId && !vistos.has(s.categoryId)) vistos.set(s.categoryId, s.categoryName ?? s.categoryId)\n }\n return [...vistos].map(([id, name]) => ({ id, name })).sort((a, b) => a.name.localeCompare(b.name, 'pt-BR'))\n }, [sessions])\n\n const filtrosAtivos = (locationId ? 1 : 0) + (categoryId ? 1 : 0) + (statusFilter.length > 0 ? 1 : 0)\n + (dateFrom ? 1 : 0) + (dateTo ? 1 : 0)\n const limparFiltros = () => {\n setLocationId(''); setCategoryId(''); setStatusFilter([]); setDateFrom(''); setDateTo('')\n }\n\n const load = useCallback(async () => {\n setSessions(await provider.getCountSessions())\n setLoadedOnce(true)\n }, [provider])\n\n useEffect(() => { void load() }, [load])\n\n const rows = useMemo(() => {\n const term = search.trim().toLowerCase()\n return sessions\n .filter((session) => !locationId || session.stockLocationId === locationId)\n .filter((session) => !categoryId || session.categoryId === categoryId)\n .filter((session) => statusFilter.length === 0 || statusFilter.includes(session.status))\n .filter((session) => !dateFrom || (session.openedAt ?? '').slice(0, 10) >= dateFrom)\n .filter((session) => !dateTo || (session.openedAt ?? '').slice(0, 10) <= dateTo)\n .map((session) => ({\n ...session,\n label: session.reference || `${session.stockLocationName ?? ''} · ${session.openedAt.slice(0, 10)}`.trim(),\n }))\n .filter((row) => !term || row.label.toLowerCase().includes(term))\n }, [sessions, search, locationId, categoryId, statusFilter, dateFrom, dateTo])\n\n const entity = useMemo(() => buildCountEntity(t), [t])\n\n const filtros = (\n <FilterPanel\n title={t('inventory.filters.title')}\n // Recorte de cliente: não há consulta para poupar, então não há rascunho\n // — o que se escolhe já vale, e a barra de pendência nunca aparece.\n dirty={false}\n onApply={() => {}}\n applyLabel={t('inventory.filters.apply')}\n pendingTitle={t('inventory.filters.pending')}\n onClear={filtrosAtivos > 0 ? limparFiltros : undefined}\n clearLabel={t('inventory.filters.clear')}\n >\n <FilterPanelField label={t('inventory.filters.status')}>\n <RequiredFilter\n label={t('inventory.filters.status')}\n value={\n statusFilter.length === 0\n ? t('inventory.filters.allStatuses')\n : statusFilter.length === 1\n ? t(`inventory.counts.status.${statusFilter[0]}`)\n : t('crud.list.selectedMany', { count: statusFilter.length })\n }\n icon={CircleDashed}\n className=\"h-9 w-full justify-start\"\n align=\"start\"\n >\n <div className=\"space-y-0.5\">\n <FilterMenuRow active={statusFilter.length === 0} onClick={() => setStatusFilter([])}>\n {t('inventory.filters.allStatuses')}\n </FilterMenuRow>\n {COUNT_STATUSES.map((st) => {\n const on = statusFilter.includes(st)\n return (\n <FilterMenuRow\n key={st}\n active={on}\n onClick={() => setStatusFilter(on ? statusFilter.filter((v) => v !== st) : [...statusFilter, st])}\n >\n <span className=\"truncate\">{t(`inventory.counts.status.${st}`)}</span>\n </FilterMenuRow>\n )\n })}\n </div>\n </RequiredFilter>\n </FilterPanelField>\n\n {locais.length > 1 && (\n <FilterPanelField label={t('inventory.filters.location')}>\n <RequiredFilter\n label={t('inventory.filters.location')}\n value={locais.find((l) => l.id === locationId)?.name ?? t('inventory.filters.allLocations')}\n icon={MapPin}\n className=\"h-9 w-full justify-start\"\n align=\"start\"\n >\n {(close: () => void) => (\n <div className=\"max-h-72 space-y-0.5 overflow-y-auto\">\n <FilterMenuRow active={!locationId} onClick={() => { setLocationId(''); close() }}>\n {t('inventory.filters.allLocations')}\n </FilterMenuRow>\n {locais.map((l) => (\n <FilterMenuRow key={l.id} active={locationId === l.id} onClick={() => { setLocationId(l.id); close() }}>\n <span className=\"truncate\">{l.name}</span>\n </FilterMenuRow>\n ))}\n </div>\n )}\n </RequiredFilter>\n </FilterPanelField>\n )}\n\n {categorias.length > 1 && (\n <FilterPanelField label={t('inventory.filters.category')}>\n <RequiredFilter\n label={t('inventory.filters.category')}\n value={categorias.find((c) => c.id === categoryId)?.name ?? t('inventory.filters.allCategories')}\n icon={Layers}\n className=\"h-9 w-full justify-start\"\n align=\"start\"\n >\n {(close: () => void) => (\n <div className=\"max-h-72 space-y-0.5 overflow-y-auto\">\n <FilterMenuRow active={!categoryId} onClick={() => { setCategoryId(''); close() }}>\n {t('inventory.filters.allCategories')}\n </FilterMenuRow>\n {categorias.map((c) => (\n <FilterMenuRow key={c.id} active={categoryId === c.id} onClick={() => { setCategoryId(c.id); close() }}>\n <span className=\"truncate\">{c.name}</span>\n </FilterMenuRow>\n ))}\n </div>\n )}\n </RequiredFilter>\n </FilterPanelField>\n )}\n <FilterPanelField label={t('inventory.filters.from')}>\n <DatePicker variant=\"input\" format=\"numeric\" className=\"w-full\" value={dateFrom} onChange={(v) => setDateFrom(v ?? '')} />\n </FilterPanelField>\n <FilterPanelField label={t('inventory.filters.to')}>\n <DatePicker variant=\"input\" format=\"numeric\" className=\"w-full\" value={dateTo} onChange={(v) => setDateTo(v ?? '')} />\n </FilterPanelField>\n </FilterPanel>\n )\n\n return (\n <div className=\"space-y-4\">\n {filtros}\n <CrudListView\n entityDef={entity}\n items={loadedOnce ? (rows as unknown as Array<{ id: string }>) : null}\n total={rows.length}\n search={search}\n onSearchChange={setSearch}\n searchPlaceholder={t('inventory.counts.searchPlaceholder')}\n onNew={onNew}\n addLabel={t('inventory.counts.newCount')}\n onRowClick={(row) => onOpen?.((row as { id: string }).id)}\n emptyMessage={t('inventory.counts.empty')}\n onRefresh={() => load()}\n feature=\"inventory\"\n />\n </div>\n )\n}\n","import React, { useEffect, useState } from 'react'\nimport { Button, SubpageHeader, Switch, toast, Input, Textarea, Select, SelectContent, SelectItem, SelectTrigger, SelectValue } from '@fayz-ai/ui'\nimport { useTranslation } from '@fayz-ai/core'\nimport { useInventoryProvider } from '../context'\nimport type { ProductCategory } from '@fayz-ai/inventory/domain/product'\nimport type { StockLocation } from '@fayz-ai/inventory/domain/stock'\n\nconst FIELD = 'mt-1'\n// Radix Select reserves the empty string for \"nothing chosen\".\nconst ALL_CATEGORIES = '__all__'\n\n/** Opening a count is four decisions: where, what, blind, and what to call it. */\nexport function StockCountFormView({ onOpened, onCancel }: {\n onOpened: (sessionId: string) => void\n onCancel: () => void\n}) {\n const t = useTranslation()\n const provider = useInventoryProvider()\n\n const [locations, setLocations] = useState<StockLocation[]>([])\n const [categories, setCategories] = useState<ProductCategory[]>([])\n const [locationId, setLocationId] = useState('')\n const [categoryId, setCategoryId] = useState('')\n const [reference, setReference] = useState('')\n const [blind, setBlind] = useState(true)\n const [notes, setNotes] = useState('')\n const [saving, setSaving] = useState(false)\n\n useEffect(() => {\n let active = true\n void Promise.all([provider.getLocations(), provider.getCategories()]).then(([locs, cats]) => {\n if (!active) return\n setLocations(locs)\n setCategories(cats)\n if (locs.length === 1) setLocationId(locs[0].id)\n })\n return () => { active = false }\n }, [provider])\n\n async function handleOpen() {\n if (!locationId) return\n setSaving(true)\n try {\n const session = await provider.openCountSession({\n stockLocationId: locationId,\n categoryId: categoryId || undefined,\n reference: reference.trim() || undefined,\n blind,\n notes: notes.trim() || undefined,\n })\n onOpened(session.id)\n } catch (err: any) {\n toast.error(t('inventory.counts.openFailed'), { description: err?.message })\n } finally {\n setSaving(false)\n }\n }\n\n return (\n <div className=\"space-y-6\">\n <SubpageHeader title={t('inventory.counts.title')} onBack={onCancel} />\n\n <div className=\"rounded-card border bg-card shadow-sm p-5 space-y-4 max-w-2xl\">\n <div>\n <h2 className=\"text-sm font-semibold\">{t('inventory.counts.formTitle')}</h2>\n <p className=\"text-xs text-muted-foreground\">{t('inventory.counts.formSubtitle')}</p>\n </div>\n\n <div className=\"grid gap-4 sm:grid-cols-2\">\n <div>\n <label className=\"text-xs font-medium text-muted-foreground\">{t('inventory.counts.location')}</label>\n <Select value={locationId} onValueChange={setLocationId}>\n <SelectTrigger className={FIELD}><SelectValue placeholder={t('inventory.counts.pickLocation')} /></SelectTrigger>\n <SelectContent>\n {locations.map((l) => <SelectItem key={l.id} value={l.id}>{l.name}</SelectItem>)}\n </SelectContent>\n </Select>\n </div>\n <div>\n <label className=\"text-xs font-medium text-muted-foreground\">{t('inventory.counts.category')}</label>\n <Select value={categoryId || ALL_CATEGORIES} onValueChange={(v) => setCategoryId(v === ALL_CATEGORIES ? '' : v)}>\n <SelectTrigger className={FIELD}><SelectValue /></SelectTrigger>\n <SelectContent>\n <SelectItem value={ALL_CATEGORIES}>{t('inventory.counts.allCategories')}</SelectItem>\n {categories.map((c) => <SelectItem key={c.id} value={c.id}>{c.name}</SelectItem>)}\n </SelectContent>\n </Select>\n </div>\n </div>\n\n <div>\n <label className=\"text-xs font-medium text-muted-foreground\">{t('inventory.counts.reference')}</label>\n <Input\n type=\"text\" className={FIELD} value={reference}\n onChange={(e) => setReference(e.target.value)}\n placeholder={t('inventory.counts.referencePlaceholder')}\n />\n </div>\n\n <div className=\"rounded-lg bg-muted/30 px-4 py-3 flex items-start justify-between gap-4\">\n <div>\n <p className=\"text-sm font-medium\">{t('inventory.counts.blind')}</p>\n <p className=\"text-xs text-muted-foreground\">{t('inventory.counts.blindHint')}</p>\n </div>\n <Switch checked={blind} onCheckedChange={setBlind} size=\"md\" />\n </div>\n\n <div>\n <label className=\"text-xs font-medium text-muted-foreground\">{t('inventory.counts.notes')}</label>\n <Textarea\n className={FIELD} rows={2} value={notes}\n onChange={(e) => setNotes(e.target.value)}\n placeholder={t('inventory.counts.notesPlaceholder')}\n />\n </div>\n\n <div className=\"flex justify-end gap-2\">\n <Button variant=\"outline\" onClick={onCancel}>{t('inventory.counts.cancel')}</Button>\n <Button onClick={() => void handleOpen()} disabled={!locationId || saving}>\n {saving ? t('inventory.counts.opening') : t('inventory.counts.open')}\n </Button>\n </div>\n </div>\n </div>\n )\n}\n","import React, { useCallback, useEffect, useMemo, useRef, useState } from 'react'\nimport { Search } from 'lucide-react'\nimport { Button, Card, ConfirmDialog, FilterPanel, FilterPanelField, SegmentedControl, SubpageHeader, toast, Input } from '@fayz-ai/ui'\nimport { useTranslation } from '@fayz-ai/core'\nimport { useInventoryConfig, useInventoryProvider, formatCurrency } from '../context'\nimport {\n hidesVariance, isCountFinal, lineVariance, statusAfterEntry, summarizeCount,\n type StockCountItem, type StockCountSession,\n} from '@fayz-ai/inventory/domain/count'\n\n/**\n * The counting screen — used standing up, on a phone, in a cold room. One row\n * per product, one big number field, Enter moves to the next line.\n *\n * A blind session hides the system quantity AND the per-line variance until the\n * count is closed. Showing the variance the instant a number is typed would let\n * the counter retype until it reads zero, which is the same rubber stamp blind\n * mode exists to prevent.\n */\nexport function StockCountSessionView({ sessionId, onBack }: {\n sessionId: string\n onBack: () => void\n}) {\n const t = useTranslation()\n const { currency } = useInventoryConfig()\n const provider = useInventoryProvider()\n\n const [session, setSession] = useState<StockCountSession | null>(null)\n const [items, setItems] = useState<StockCountItem[]>([])\n const [drafts, setDrafts] = useState<Record<string, string>>({})\n const [loading, setLoading] = useState(true)\n const [closing, setClosing] = useState(false)\n const [confirmingClose, setConfirmingClose] = useState(false)\n const [confirmingCancel, setConfirmingCancel] = useState(false)\n const inputs = useRef<Array<HTMLInputElement | null>>([])\n\n const load = useCallback(async () => {\n setLoading(true)\n try {\n const [head, lines] = await Promise.all([\n provider.getCountSession(sessionId),\n provider.getCountItems(sessionId),\n ])\n setSession(head)\n setItems(lines)\n setDrafts(Object.fromEntries(\n lines.map((l) => [l.id, l.countedQuantity === undefined ? '' : String(l.countedQuantity)]),\n ))\n } finally {\n setLoading(false)\n }\n }, [provider, sessionId])\n\n useEffect(() => { void load() }, [load])\n\n const summary = useMemo(() => summarizeCount(items), [items])\n\n // ── O RECORTE DA CONTAGEM ────────────────────────────────────────────────\n //\n // Uma contagem de deposito tem centenas de linhas, e a pergunta de quem esta\n // com o coletor na mao e sempre a mesma: «o que ainda falta contar?». Sem\n // recorte, a resposta era rolar ate achar a proxima linha em branco.\n //\n // Recorte de CLIENTE — as linhas ja estao todas na tela —, entao nao ha\n // rascunho: escolher ja vale.\n //\n // O QUE O V1 TEM E ESTA TELA NAO PODE TER: curva ABC, validade, giro de 90\n // dias e lote. Nenhum deles existe em `StockCountItem` — inventa-los aqui\n // seria desenhar um filtro que nao filtra.\n const [situacao, setSituacao] = useState<'all' | 'pending' | 'counted' | 'divergent'>('all')\n const [buscaItem, setBuscaItem] = useState('')\n\n const itensVisiveis = useMemo(() => {\n const termo = buscaItem.trim().toLocaleLowerCase('pt-BR')\n return items\n .filter((item) => {\n if (situacao === 'pending') return item.countedQuantity === undefined\n if (situacao === 'counted') return item.countedQuantity !== undefined\n if (situacao === 'divergent') return lineVariance(item) !== 0\n return true\n })\n .filter((item) => !termo\n || (item.productName ?? '').toLocaleLowerCase('pt-BR').includes(termo)\n || (item.productSku ?? '').toLocaleLowerCase('pt-BR').includes(termo))\n }, [items, situacao, buscaItem])\n const closed = isCountFinal(session?.status)\n const hideVariance = hidesVariance(session)\n\n async function commit(item: StockCountItem, raw: string) {\n const trimmed = raw.trim()\n const next = trimmed === '' ? null : Number(trimmed)\n if (next !== null && !Number.isFinite(next)) return\n const current = item.countedQuantity ?? null\n if (next === current) return\n try {\n const saved = await provider.saveCountEntry(item.id, next)\n setItems((prev) => prev.map((i) => (i.id === item.id ? { ...i, ...saved } : i)))\n if (session) setSession({ ...session, status: statusAfterEntry(session.status) })\n } catch (err: any) {\n toast.error(t('inventory.counts.saveFailed'), { description: err?.message })\n }\n }\n\n async function handleClose() {\n setClosing(true)\n try {\n const result = await provider.closeCountSession(\n sessionId,\n t('inventory.counts.adjustmentReason', { reference: session?.reference ?? '' }),\n )\n toast.success(\n result.alreadyClosed\n ? t('inventory.counts.alreadyClosed')\n : t('inventory.counts.closed', { count: String(result.adjustmentsCreated) }),\n )\n await load()\n } catch (err: any) {\n toast.error(t('inventory.counts.closeFailed'), { description: err?.message })\n } finally {\n setClosing(false)\n setConfirmingClose(false)\n }\n }\n\n function requestClose() {\n if (summary.uncounted > 0) {\n toast.error(t('inventory.counts.incomplete'), {\n description: t('inventory.counts.incompleteDescription', { count: String(summary.uncounted) }),\n })\n return\n }\n setConfirmingClose(true)\n }\n\n async function handleCancel() {\n try {\n await provider.cancelCountSession(sessionId)\n toast.success(t('inventory.counts.cancelled'))\n await load()\n } catch (err: any) {\n toast.error(t('inventory.counts.cancelFailed'), { description: err?.message })\n } finally {\n setConfirmingCancel(false)\n }\n }\n\n if (loading) {\n return (\n <div className=\"space-y-6\">\n <SubpageHeader title={t('inventory.counts.title')} onBack={onBack} />\n <div className=\"rounded-card border p-4 space-y-2\">\n {[1, 2, 3, 4].map((i) => <div key={i} className=\"h-8 rounded bg-muted/30 animate-pulse\" />)}\n </div>\n </div>\n )\n }\n\n if (!session) {\n return (\n <div className=\"space-y-6\">\n <SubpageHeader title={t('inventory.counts.title')} onBack={onBack} />\n <div className=\"rounded-card border p-8 text-center\">\n <p className=\"text-sm text-muted-foreground\">{t('inventory.counts.notFound')}</p>\n </div>\n </div>\n )\n }\n\n return (\n <div className=\"space-y-5\">\n <SubpageHeader title={t('inventory.counts.title')} onBack={onBack} />\n\n <div className=\"rounded-card border bg-card shadow-sm p-4 flex flex-wrap items-center justify-between gap-4\">\n <div className=\"min-w-0\">\n <p className=\"text-sm font-semibold truncate\">\n {session.reference || session.stockLocationName || t('inventory.counts.entity')}\n </p>\n <p className=\"text-xs text-muted-foreground\">\n {session.stockLocationName ?? '—'}\n {session.categoryName && <> &middot; {session.categoryName}</>}\n {' '}&middot; {t(`inventory.counts.status.${session.status}`)}\n {session.blind && <> &middot; {t('inventory.counts.blind')}</>}\n </p>\n </div>\n <div className=\"flex items-center gap-5 text-xs\">\n <div>\n <p className=\"text-muted-foreground\">{t('inventory.counts.counted')}</p>\n <p className=\"font-semibold tabular-nums\">{summary.counted}/{summary.total}</p>\n </div>\n {!hideVariance && (\n <>\n <div>\n <p className=\"text-muted-foreground\">{t('inventory.counts.divergent')}</p>\n <p className=\"font-semibold tabular-nums\">{summary.divergent}</p>\n </div>\n <div>\n <p className=\"text-muted-foreground\">{t('inventory.counts.varianceValue')}</p>\n <p className={`font-semibold tabular-nums ${summary.varianceValue < 0 ? 'text-destructive' : ''}`}>\n {formatCurrency(summary.varianceValue, currency)}\n </p>\n </div>\n </>\n )}\n </div>\n {!closed && (\n <div className=\"flex items-center gap-2\">\n <Button variant=\"outline\" size=\"sm\" onClick={() => setConfirmingCancel(true)}>\n {t('inventory.counts.cancelCount')}\n </Button>\n <Button size=\"sm\" onClick={requestClose}>\n {t('inventory.counts.close')}\n </Button>\n </div>\n )}\n </div>\n\n {/* O recorte, e a busca colada nas linhas — a mesma anatomia das outras\n telas: o que define o que se ve em cima, a busca encostada no\n resultado. */}\n <FilterPanel\n title={t('inventory.filters.title')}\n dirty={false}\n onApply={() => {}}\n applyLabel={t('inventory.filters.apply')}\n pendingTitle={t('inventory.filters.pending')}\n onClear={situacao !== 'all' ? () => setSituacao('all') : undefined}\n clearLabel={t('inventory.filters.clear')}\n >\n <FilterPanelField label={t('inventory.filters.countState')} className=\"sm:col-span-2\">\n <SegmentedControl\n aria-label={t('inventory.filters.countState')}\n value={situacao}\n onChange={(v) => setSituacao(v as typeof situacao)}\n options={[\n { value: 'all', label: t('inventory.filters.countAll') },\n { value: 'pending', label: t('inventory.filters.countPending') },\n { value: 'counted', label: t('inventory.filters.countDone') },\n { value: 'divergent', label: t('inventory.counts.divergent') },\n ]}\n />\n </FilterPanelField>\n </FilterPanel>\n\n <Card className=\"relative px-3 py-1.5\">\n <Search className=\"pointer-events-none absolute left-5 top-1/2 h-3.5 w-3.5 -translate-y-1/2 text-muted-foreground\" />\n <Input\n type=\"text\"\n value={buscaItem}\n onChange={(e) => setBuscaItem(e.target.value)}\n placeholder={t('inventory.filters.itemSearchPlaceholder')}\n aria-label={t('inventory.filters.itemSearchPlaceholder')}\n className=\"h-auto rounded-none border-0 bg-transparent py-1.5 pl-8 pr-3 shadow-none focus-visible:ring-0 focus-visible:ring-offset-0\"\n />\n </Card>\n\n <div className=\"rounded-card border bg-card shadow-sm divide-y\">\n {itensVisiveis.map((item, index) => {\n const variance = lineVariance(item)\n return (\n <div key={item.id} className=\"flex items-center gap-3 px-4 py-3\">\n <div className=\"min-w-0 flex-1\">\n <p className=\"text-sm font-medium truncate\">{item.productName ?? item.productId}</p>\n <p className=\"text-xs text-muted-foreground\">\n {item.productSku ? `${item.productSku} · ` : ''}\n {hideVariance\n ? t('inventory.counts.blindLine')\n : `${t('inventory.counts.systemQty')} ${item.systemQuantity}`}\n </p>\n </div>\n\n {!hideVariance && (\n <span className={`w-16 shrink-0 text-right text-sm tabular-nums ${\n variance === null ? 'text-muted-foreground'\n : variance === 0 ? 'text-muted-foreground'\n : variance > 0 ? 'text-success' : 'text-destructive'\n }`}>\n {variance === null ? '—' : variance > 0 ? `+${variance}` : variance}\n </span>\n )}\n\n <div className=\"w-28 shrink-0\">\n <Input\n ref={(el) => { inputs.current[index] = el }}\n type=\"number\"\n inputMode=\"decimal\"\n step=\"0.01\"\n disabled={closed}\n value={drafts[item.id] ?? ''}\n placeholder={t('inventory.counts.notCounted')}\n onChange={(e) => setDrafts((d) => ({ ...d, [item.id]: e.target.value }))}\n onBlur={() => void commit(item, drafts[item.id] ?? '')}\n onKeyDown={(e) => {\n if (e.key !== 'Enter') return\n e.preventDefault()\n inputs.current[index + 1]?.focus()\n }}\n className=\"h-auto py-2.5 text-right text-base font-medium tabular-nums disabled:opacity-60\"\n />\n </div>\n </div>\n )\n })}\n {itensVisiveis.length === 0 && (\n <p className=\"px-4 py-8 text-center text-xs text-muted-foreground\">{t('inventory.counts.noItems')}</p>\n )}\n </div>\n\n <ConfirmDialog\n open={confirmingClose}\n title={t('inventory.counts.closeTitle')}\n description={t('inventory.counts.closeDescription', { divergent: String(summary.divergent) })}\n confirmLabel={t('inventory.counts.closeConfirm')}\n cancelLabel={t('inventory.counts.cancel')}\n loading={closing}\n onConfirm={() => void handleClose()}\n onCancel={() => setConfirmingClose(false)}\n />\n\n <ConfirmDialog\n open={confirmingCancel}\n variant=\"destructive\"\n title={t('inventory.counts.cancelTitle')}\n description={t('inventory.counts.cancelDescription')}\n confirmLabel={t('inventory.counts.cancelConfirm')}\n cancelLabel={t('inventory.counts.cancel')}\n onConfirm={() => void handleCancel()}\n onCancel={() => setConfirmingCancel(false)}\n />\n </div>\n )\n}\n","import { createXlsxReport, type XlsxSheet } from '@fayz-ai/ui'\nimport type { RecipeExportSheet } from '@fayz-ai/inventory/domain/recipe-sheet'\nimport { CMV_ALERT_THRESHOLD, CMV_GOOD_THRESHOLD } from '@fayz-ai/inventory/domain/recipe'\n\n// The pricing levers the house's own spreadsheet used (minimum ×2,5, ideal ×3,\n// delivery fee between 23 and 30%). They live once, on the summary tab, and\n// every price in the book is a formula over them — change one and the whole\n// menu reprices.\nconst MIN_MARKUP = 2.5\nconst IDEAL_MARKUP = 3\nconst DELIVERY_FEE = 0.25\nconst NO_CATEGORY = 'Sem categoria'\nconst SUMMARY = 'Resumo'\nconst INPUTS = 'Insumos'\n\nconst quote = (sheet: string) => `'${sheet.replace(/'/g, \"''\")}'`\n\nexport async function exportRecipesXlsx(sheets: RecipeExportSheet[], brand?: string): Promise<void> {\n const report = await createXlsxReport({\n title: 'Fichas Técnicas',\n subtitle: 'Custo, CMV e preço sugerido de cada produto produzido',\n brand,\n landscape: true,\n })\n\n // Codes: the product's SKU when it has a unique one, otherwise a stable\n // sequence. Every line looks its cost up here by code.\n const ingredients = new Map<string, { code: string; name: string; unit?: string; cost: number; usedBy: Set<string> }>()\n const skuSeen = new Map<string, number>()\n for (const s of sheets) for (const g of s.groups) for (const l of g.lines) {\n if (l.ingredientSku) skuSeen.set(l.ingredientSku, (skuSeen.get(l.ingredientSku) ?? 0) + (ingredients.has(l.ingredientId) ? 0 : 1))\n if (!ingredients.has(l.ingredientId)) ingredients.set(l.ingredientId, { code: '', name: l.ingredientName, unit: l.unitAbbr, cost: l.unitCost, usedBy: new Set() })\n ingredients.get(l.ingredientId)!.usedBy.add(s.productId)\n }\n const sorted = [...ingredients.entries()].sort((a, b) => a[1].name.localeCompare(b[1].name))\n sorted.forEach(([id, ing], i) => {\n const sku = sheets.flatMap((s) => s.groups.flatMap((g) => g.lines)).find((l) => l.ingredientId === id)?.ingredientSku\n ing.code = sku && skuSeen.get(sku) === 1 ? sku : `INS-${String(i + 1).padStart(4, '0')}`\n })\n\n // --- Resumo: parameters first, so the formulas below can point at them ----\n const summary = report.sheet(SUMMARY, [\n { header: 'Categoria', width: 20 },\n { header: 'Produto', width: 40 },\n { header: 'Rendimento', width: 12 },\n { header: 'Custo da ficha', type: 'currency', width: 15 },\n { header: 'Preço de venda', type: 'currency', width: 15 },\n { header: 'CMV', type: 'percent', width: 10 },\n { header: 'Preço mínimo', type: 'currency', width: 15 },\n { header: 'Preço ideal', type: 'currency', width: 15 },\n { header: 'Preço delivery', type: 'currency', width: 15 },\n { header: 'Situação', width: 16 },\n ], { tab: 'FF1F2937' })\n summary.section('Parâmetros de preço', 'edite aqui: as abas recalculam')\n const paramRow = summary.facts([\n { label: 'Markup mínimo (×)', value: MIN_MARKUP, type: 'number' },\n { label: 'Markup ideal (×)', value: IDEAL_MARKUP, type: 'number' },\n { label: 'Taxa do delivery', value: DELIVERY_FEE, type: 'percent' },\n ])\n const param = {\n min: `${quote(SUMMARY)}!$A$${paramRow}`,\n ideal: `${quote(SUMMARY)}!$B$${paramRow}`,\n fee: `${quote(SUMMARY)}!$C$${paramRow}`,\n }\n summary.blank()\n\n // --- Insumos: the price list every sheet reads -----------------------------\n const inputs = report.sheet(INPUTS, [\n { header: 'Código', width: 12 },\n { header: 'Insumo', width: 44 },\n { header: 'Unid.', width: 8 },\n { header: 'Custo unitário', type: 'currency', width: 15 },\n { header: 'Usado em (fichas)', type: 'integer', width: 16 },\n ], { subtitle: 'Altere o custo de um insumo e todas as fichas que o usam se recalculam' })\n inputs.table(sorted.map(([, ing]) => [ing.code, ing.name, ing.unit ?? '', ing.cost, ing.usedBy.size]))\n const lookup = (codeCell: string, fallback: number) =>\n `IFERROR(VLOOKUP(${codeCell},${quote(inputs.name)}!$A:$D,4,FALSE),${fallback})`\n\n // --- One tab per category ----------------------------------------------------\n const byCategory = new Map<string, RecipeExportSheet[]>()\n for (const s of sheets) {\n const key = s.categoryName?.trim() || NO_CATEGORY\n byCategory.set(key, [...(byCategory.get(key) ?? []), s])\n }\n const categories = [...byCategory.keys()].sort((a, b) => (a === NO_CATEGORY ? 1 : b === NO_CATEGORY ? -1 : a.localeCompare(b)))\n\n type SummaryLine = { category: string; sheet: RecipeExportSheet; at?: { tab: XlsxSheet; section: number; facts: number } }\n const summaryLines: SummaryLine[] = []\n\n for (const category of categories) {\n const items = byCategory.get(category)!\n const withSheet = items.filter((s) => s.hasSheet)\n if (!withSheet.length) {\n summaryLines.push(...items.map((sheet) => ({ category, sheet })))\n continue\n }\n const tab = report.sheet(category, [\n { header: 'Código', width: 12 },\n { header: 'Insumo', width: 42 },\n { header: 'Unid.', width: 8 },\n { header: 'Quantidade', type: 'quantity', width: 13 },\n { header: 'Custo unitário', type: 'currency', width: 15 },\n { header: 'Custo da linha', type: 'currency', width: 15 },\n { header: '% da ficha', type: 'percent', width: 12 },\n ], { subtitle: `${category} · ${withSheet.length} ${withSheet.length === 1 ? 'ficha' : 'fichas'}` })\n\n for (const sheet of items) {\n if (!sheet.hasSheet) { summaryLines.push({ category, sheet }); continue }\n const aside = [\n sheet.yieldQuantity != null ? `Rende ${sheet.yieldQuantity.toLocaleString('pt-BR')}${sheet.yieldUnitAbbr ? ` ${sheet.yieldUnitAbbr}` : ''}` : '',\n sheet.preparationTimeMinutes ? `${sheet.preparationTimeMinutes} min` : '',\n ].filter(Boolean).join(' · ')\n const section = tab.section(sheet.productName, aside || undefined)\n\n // Facts sit above the lines but read the total below them; the row\n // numbers are known once the lines are laid out, so reserve and fill.\n const linesCount = sheet.groups.reduce((n, g) => n + g.lines.length + (sheet.groups.length > 1 || g.name ? 1 : 0), 0)\n const factsRow = tab.nextRow + 1\n const headerRow = factsRow + 1\n const firstLine = headerRow + 1\n const totalRow = firstLine + linesCount\n const cost = `$F$${totalRow}`\n const price = `$C$${factsRow}`\n // Each formula also carries its value today: previews that never\n // recalculate (Quick Look, Drive, phones) would otherwise show blanks.\n const k = figures(sheet)\n tab.facts([\n { label: 'Custo da ficha', value: { formula: cost, result: k.cost }, type: 'currency' },\n { label: 'Preço mínimo', value: { formula: `${cost}*${param.min}`, result: k.min }, type: 'currency' },\n { label: 'Preço de venda', value: sheet.salePrice || null, type: 'currency' },\n { label: 'CMV', value: { formula: `IF(AND(${price}>0,${cost}>0),${cost}/${price},\"\")`, result: k.cmv }, type: 'percent' },\n { label: 'Preço ideal', value: { formula: `${cost}*${param.ideal}`, result: k.ideal }, type: 'currency' },\n { label: 'Preço delivery', value: { formula: `MAX(${price},${cost}*${param.min}/(1-${param.fee}))`, result: k.delivery }, type: 'currency' },\n { label: 'Markup', value: { formula: `IF(${cost}>0,${price}/${cost},\"\")`, result: k.markup }, type: 'number' },\n ])\n tab.highlight(`D${factsRow}`, cmvRules())\n tab.header(undefined, { pin: false })\n\n let zebra = false\n for (const group of sheet.groups) {\n if (sheet.groups.length > 1 || group.name) {\n tab.row(['', group.name || 'Componentes'], { bold: true, tones: [undefined, 'muted'] })\n }\n for (const line of group.lines) {\n const code = ingredients.get(line.ingredientId)?.code ?? ''\n const r = tab.nextRow\n tab.row([\n code,\n line.ingredientName,\n line.unitAbbr ?? '',\n line.quantity,\n { formula: lookup(`$A${r}`, line.unitCost), result: line.unitCost },\n { formula: `D${r}*E${r}`, result: line.quantity * line.unitCost },\n { formula: `IF(${cost}>0,F${r}/${cost},0)`, result: k.cost > 0 ? (line.quantity * line.unitCost) / k.cost : 0 },\n ], { zebra })\n zebra = !zebra\n }\n }\n tab.row(['', 'Total da ficha', '', '', '', { formula: `SUM(F${firstLine}:F${totalRow - 1})`, result: k.cost }, 1], { total: true })\n tab.blank()\n summaryLines.push({ category, sheet, at: { tab, section, facts: factsRow } })\n }\n }\n\n // --- Resumo table, every figure a link back to the tab ---------------------\n summary.section('Produtos', `${sheets.length} produtos produzidos`)\n const first = summary.nextRow + 1\n summary.table(summaryLines.map(({ category, sheet, at }) => {\n if (!at) {\n return [category, sheet.productName, '', null, sheet.salePrice || null, null, null, null, null, 'Sem ficha']\n }\n const k = figures(sheet)\n const result: Record<string, number | string> = { A: k.cost, B: k.min, C: sheet.salePrice, D: k.cmv, E: k.ideal, F: k.delivery }\n const ref = (col: string) => ({ formula: `${quote(at.tab.name)}!$${col}$${at.facts}`, result: result[col] })\n const yieldText = sheet.yieldQuantity != null ? `${sheet.yieldQuantity.toLocaleString('pt-BR')}${sheet.yieldUnitAbbr ? ` ${sheet.yieldUnitAbbr}` : ''}` : ''\n return [\n category,\n { text: sheet.productName, hyperlink: `#${quote(at.tab.name)}!A${at.section}` },\n yieldText,\n ref('A'), ref('C'), ref('D'), ref('B'), ref('E'), ref('F'),\n sheet.salePrice > 0 ? '' : 'Sem preço',\n ]\n }))\n const last = summary.nextRow - 1\n if (last >= first) summary.highlight(`F${first}:F${last}`, cmvRules())\n\n const day = new Date().toISOString().slice(0, 10)\n await report.download(`fichas-tecnicas-${day}`)\n}\n\n/** Today's values of the block's formulas, with the default parameters. */\nfunction figures(sheet: RecipeExportSheet) {\n const cost = sheet.groups.reduce((sum, g) => sum + g.lines.reduce((s, l) => s + l.quantity * l.unitCost, 0), 0)\n const price = sheet.salePrice\n const min = cost * MIN_MARKUP\n return {\n cost,\n min,\n ideal: cost * IDEAL_MARKUP,\n delivery: Math.max(price, min / (1 - DELIVERY_FEE)),\n // No cost is no CMV, as on screen: 0% would read as a perfect margin.\n cmv: price > 0 && cost > 0 ? cost / price : '',\n markup: cost > 0 ? price / cost : '',\n }\n}\n\nfunction cmvRules() {\n return [\n { when: 'lt' as const, value: CMV_GOOD_THRESHOLD / 100, tone: 'good' as const },\n { when: 'gt' as const, value: CMV_ALERT_THRESHOLD / 100, tone: 'high' as const },\n ]\n}\n","import React, { useCallback, useState } from 'react'\nimport { RecordPickerModal } from '@fayz-ai/admin'\nimport { useTranslation } from '@fayz-ai/core'\nimport { useInventoryProvider } from '../../context'\nimport type { RecipeCandidate } from '@fayz-ai/inventory/domain/recipe-sheet'\nimport { brl } from './shared'\n\n/**\n * \"Nova Ficha Técnica\" creates nothing: it picks the product whose sheet opens.\n * Same picker as a new order — photo, search, price. Only what a sheet makes\n * sense for is offered: sold, intermediate or already produced. A pure\n * ingredient is bought, not produced.\n */\nexport function SelectProductDialog({ onClose, onPick }: {\n onClose: () => void\n onPick: (productId: string) => void\n}) {\n const t = useTranslation()\n const provider = useInventoryProvider()\n const [kind, setKind] = useState<'sale' | 'intermediate' | null>(null)\n\n const search = useCallback(\n (term: string) => provider.searchRecipeCandidates?.(term, kind) ?? Promise.resolve([] as RecipeCandidate[]),\n [provider, kind],\n )\n\n return (\n <RecordPickerModal<RecipeCandidate>\n open\n multiple={false}\n onClose={onClose}\n title={t('inventory.recipes.pickTitle')}\n placeholder={t('inventory.recipes.pickPlaceholder')}\n emptyLabel={t('inventory.recipes.pickEmpty')}\n columns={{ product: t('inventory.sheet.product'), meta: t('inventory.recipes.entity'), value: t('inventory.sheet.salePrice') }}\n search={search}\n rowKey={(p) => p.productId}\n renderRow={(p) => ({\n imageUrl: p.imageUrl,\n title: p.name,\n subtitle: [p.categoryName, t(`inventory.recipes.kind.${p.kind}`)].filter(Boolean).join(' · '),\n meta: p.hasRecipe ? t('inventory.recipes.hasSheet') : t('inventory.recipes.noSheetShort'),\n value: p.salePrice > 0 ? brl(p.salePrice) : '—',\n })}\n onConfirm={(rows) => { if (rows[0]) onPick(rows[0].productId) }}\n filters={{\n options: [\n { id: 'sale', label: t('inventory.recipes.kind.sale') },\n { id: 'intermediate', label: t('inventory.recipes.kind.intermediate') },\n ],\n value: kind,\n onChange: (id) => setKind(id as 'sale' | 'intermediate' | null),\n allLabel: t('inventory.recipes.kind.all'),\n }}\n />\n )\n}\n","import { errorMessage } from '@fayz-ai/core'\nimport React, { useMemo, useRef, useState } from 'react'\nimport { CrudListView, PageActions, useAgentSurface, usePersistedState, useRememberedList, useScrollMemory } from '@fayz-ai/admin'\nimport { useTranslation } from '@fayz-ai/core'\nimport type { EntityDef } from '@fayz-ai/core'\nimport {\n Button, PageHeaderActions, Tooltip, TooltipContent, TooltipProvider, TooltipTrigger, toast,\n} from '@fayz-ai/ui'\nimport { AlertTriangle, Clock, Package, Pencil, Plus, Printer, Utensils } from 'lucide-react'\nimport { useInventoryProvider } from '../context'\nimport type { RecipeListRow } from '@fayz-ai/inventory/domain/recipe-sheet'\nimport { CMV_ALERT_THRESHOLD, CMV_GOOD_THRESHOLD, CMV_TONE, cmvBand, cmvPercent } from '@fayz-ai/inventory/domain/recipe'\nimport { RECIPE_SURFACE_INSTRUCTIONS } from '../lib/agent-tools'\nimport { printRecipe } from './recipe/printRecipe'\nimport { exportRecipesXlsx } from './recipe/exportRecipesXlsx'\nimport { SelectProductDialog } from './recipe/SelectProductDialog'\nimport { brl } from './recipe/shared'\n\n// ---------------------------------------------------------------------------\n// Estoque → Fichas Técnicas, as in V1: every active PRODUCED product, with or\n// without a sheet. A produced product with no sheet is the row this screen\n// exists to surface, so it stays in the list with its badge.\n// ---------------------------------------------------------------------------\n\ntype Row = RecipeListRow & { id: string }\n\nfunction buildEntity(\n t: (key: string, params?: Record<string, string>) => string,\n actions: { onPrint: (r: Row) => void; onEdit: (r: Row) => void },\n): EntityDef {\n return {\n name: t('inventory.recipes.entity'),\n namePlural: t('inventory.recipes.title'),\n icon: 'BookOpen',\n displayField: 'productName',\n fields: [\n {\n key: 'productName', label: t('inventory.recipes.colProduct'), type: 'text', searchable: true,\n renderCell: (_v, row: any) => (\n <div className=\"flex min-w-0 items-center gap-3\">\n <div className=\"flex h-10 w-10 shrink-0 items-center justify-center overflow-hidden rounded-lg border bg-muted/40\">\n {row.imageUrl\n ? <img src={row.imageUrl} alt=\"\" className=\"h-full w-full object-cover\" loading=\"lazy\" />\n : <Package className=\"h-4 w-4 text-muted-foreground\" />}\n </div>\n <div className=\"min-w-0 max-w-[11rem] xl:max-w-[14rem] 2xl:max-w-[22rem]\">\n <p className=\"truncate font-medium\" title={row.productName}>{row.productName}</p>\n {row.description && <p className=\"truncate text-xs text-muted-foreground\">{row.description}</p>}\n </div>\n </div>\n ),\n },\n {\n key: 'ingredientCount', label: t('inventory.recipes.colIngredients'), type: 'number',\n renderCell: (_v, row: any) => row.recipeId\n ? <span className=\"inline-flex items-center gap-1 rounded-full bg-muted px-2 py-0.5 text-xs font-medium tabular-nums\"><Utensils className=\"h-3 w-3\" />{row.ingredientCount}</span>\n : <span className=\"inline-flex rounded-full bg-warning-soft px-2 py-0.5 text-[11px] font-medium text-warning-soft-foreground\">{t('inventory.recipes.noSheet')}</span>,\n },\n {\n key: 'yieldQuantity', label: t('inventory.recipes.colYield'), type: 'text',\n renderCell: (_v, row: any) => <span className=\"text-sm tabular-nums\">{row.recipeId && row.yieldQuantity != null ? `${Number(row.yieldQuantity).toLocaleString('pt-BR')}${row.yieldUnitAbbr ? ` ${row.yieldUnitAbbr}` : ''}` : '—'}</span>,\n },\n {\n key: 'preparationTimeMinutes', label: t('inventory.recipes.colPrep'), type: 'text',\n renderCell: (_v, row: any) => row.preparationTimeMinutes\n ? <span className=\"inline-flex items-center gap-1 text-sm text-muted-foreground\"><Clock className=\"h-3.5 w-3.5\" />{row.preparationTimeMinutes} min</span>\n : <span className=\"text-muted-foreground\">—</span>,\n },\n {\n key: 'cost', label: t('inventory.recipes.colCost'), type: 'currency',\n renderCell: (_v, row: any) => <span className=\"block text-right tabular-nums\">{row.recipeId ? brl(row.cost) : '—'}</span>,\n },\n {\n key: 'salePrice', label: t('inventory.recipes.colSale'), type: 'currency',\n renderCell: (_v, row: any) => <span className=\"block text-right tabular-nums\">{row.salePrice > 0 ? brl(row.salePrice) : '—'}</span>,\n },\n {\n key: 'cmv', label: t('inventory.recipes.colCmv'), type: 'number',\n renderCell: (_v, row: any) => {\n // No cost or no price = no CMV. V1 printed 0,0% for an empty sheet,\n // which reads as a perfect margin (V1-083).\n const cmv = row.cost > 0 ? cmvPercent(row.cost, row.salePrice) : null\n return cmv == null\n ? <span className=\"block text-right text-muted-foreground\">—</span>\n : <span className={`block text-right font-medium tabular-nums ${CMV_TONE[cmvBand(cmv)!]}`}>{cmv.toLocaleString('pt-BR', { minimumFractionDigits: 1, maximumFractionDigits: 1 })}%</span>\n },\n },\n {\n key: 'actions', label: '', type: 'text',\n renderCell: (_v, row: any) => (\n <div className=\"flex justify-end gap-1\" onClick={(e) => e.stopPropagation()}>\n <Tooltip>\n <TooltipTrigger asChild>\n {/* Printing a sheet is a desk job; a phone has no printer to send it to. */}\n <span className=\"hidden md:inline-flex\">\n <Button variant=\"ghost\" size=\"icon\" className=\"h-8 w-8\" disabled={!row.recipeId} aria-label={t('inventory.recipes.print')} onClick={() => actions.onPrint(row)}>\n <Printer className=\"h-4 w-4\" />\n </Button>\n </span>\n </TooltipTrigger>\n <TooltipContent>{row.recipeId ? t('inventory.recipes.print') : t('inventory.recipes.printNoSheet')}</TooltipContent>\n </Tooltip>\n <Tooltip>\n <TooltipTrigger asChild>\n <Button variant=\"ghost\" size=\"icon\" className=\"h-8 w-8\" aria-label={t('inventory.recipes.edit')} onClick={() => actions.onEdit(row)}>\n <Pencil className=\"h-4 w-4\" />\n </Button>\n </TooltipTrigger>\n <TooltipContent>{t('inventory.recipes.edit')}</TooltipContent>\n </Tooltip>\n </div>\n ),\n },\n ],\n }\n}\n\n/** Same rule as the CMV column: no cost means no CMV, not a perfect margin. */\nfunction rowCmvBand(r: Row) {\n return cmvBand(r.cost > 0 ? cmvPercent(r.cost, r.salePrice) : null) ?? 'none'\n}\n\nexport function RecipesView({ onOpenProduct }: {\n /** Opens the product on its Ficha Técnica tab. */\n onOpenProduct: (productId: string) => void\n}) {\n const t = useTranslation()\n const provider = useInventoryProvider()\n\n // Back from a product lands on the same rows, filters and position; a save\n // made there re-reads just that row.\n const { rows, error: loadError, reload: load } = useRememberedList<Row>({\n key: 'inventory.recipes',\n load: async () => (await provider.getRecipeList!()).map((r) => ({ ...r, id: r.productId })),\n loadOne: provider.getRecipeListRow\n ? async (id) => { const r = await provider.getRecipeListRow!(id); return r ? { ...r, id: r.productId } : null }\n : undefined,\n // Sheet saves announce their product, so the recipes table itself is not listened to.\n tables: ['products', 'categories', 'plg_inventory_product_details'],\n rowFor: (list, id) => list.find((r) => r.productId === id || r.recipeId === id),\n })\n const [search, setSearch] = usePersistedState('inventory.recipes.search', '')\n const [filters, setFilters] = usePersistedState<Record<string, string | undefined>>('inventory.recipes.filters', {})\n const [collapsedGroups, setCollapsedGroups] = usePersistedState<string[]>('inventory.recipes.collapsed', [])\n const scrollAnchor = useScrollMemory('inventory.recipes')\n const [picking, setPicking] = useState(false)\n\n const visible = useMemo(() => {\n const term = search.trim().toLowerCase()\n if (!rows) return null\n const { kind, category, cmv } = filters\n return rows.filter((r) => {\n if (term && !r.productName.toLowerCase().includes(term) && !(r.description ?? '').toLowerCase().includes(term)) return false\n if (kind === 'sale' && !r.isForSale) return false\n if (kind === 'intermediate' && !r.isIntermediate) return false\n if (category !== undefined && (r.categoryName ?? '') !== category) return false\n if (cmv && rowCmvBand(r) !== cmv) return false\n return true\n })\n }, [rows, search, filters])\n\n const facets = useMemo(() => {\n const categories = [...new Set((rows ?? []).map((r) => r.categoryName ?? ''))]\n .sort((a, b) => (a === '' ? 1 : b === '' ? -1 : a.localeCompare(b)))\n return [\n {\n field: 'kind', label: t('inventory.recipes.filterKind'), allLabel: t('inventory.recipes.filterKindAll'),\n options: [\n { value: 'sale', label: t('inventory.recipes.kindSale') },\n { value: 'intermediate', label: t('inventory.recipes.kindIntermediate') },\n ],\n },\n {\n field: 'category', label: t('inventory.recipes.filterCategory'), allLabel: t('inventory.recipes.filterCategoryAll'),\n options: categories.map((c) => ({ value: c, label: c || t('inventory.recipes.noCategory') })),\n },\n {\n field: 'cmv', label: t('inventory.recipes.filterCmv'), allLabel: t('inventory.recipes.filterCmvAll'),\n options: [\n { value: 'good', label: t('inventory.recipes.cmvGood', { pct: String(CMV_GOOD_THRESHOLD) }) },\n { value: 'attention', label: t('inventory.recipes.cmvAttention', { from: String(CMV_GOOD_THRESHOLD), to: String(CMV_ALERT_THRESHOLD) }) },\n { value: 'high', label: t('inventory.recipes.cmvHigh', { pct: String(CMV_ALERT_THRESHOLD) }) },\n { value: 'none', label: t('inventory.recipes.cmvNone') },\n ],\n },\n ]\n }, [rows, t])\n\n const exportAll = async () => {\n const id = toast.loading(t('inventory.recipes.exporting'))\n try {\n await exportRecipesXlsx(await provider.getRecipeExport!())\n toast.success(t('inventory.recipes.exported'), { id })\n } catch (e) {\n toast.error(errorMessage(e), { id })\n }\n }\n\n const entity = useMemo(() => buildEntity(t, {\n onPrint: (r) => { printRecipe(provider, r).catch((e) => toast.error(errorMessage(e))) },\n onEdit: (r) => onOpenProduct(r.productId),\n }), [t, provider, onOpenProduct])\n\n const groupBy = useMemo(() => ({\n getKey: (r: { id: string }) => (r as Row).categoryName,\n emptyLabel: t('inventory.recipes.noCategory'),\n collapsed: collapsedGroups,\n onCollapsedChange: setCollapsedGroups,\n }), [t, collapsedGroups, setCollapsedGroups])\n\n // The model needs real ids and real costs, not a guess at the catalogue.\n const surfaceRows = useRef<Row[]>([])\n surfaceRows.current = rows ?? []\n const surface = useMemo(() => ({\n id: 'inventory.recipes',\n pluginId: 'inventory',\n role: 'finance' as const,\n instructions: RECIPE_SURFACE_INSTRUCTIONS,\n describe: () => ({\n title: 'Fichas técnicas',\n state: {\n producedWithoutRecipe: surfaceRows.current.filter((r) => !r.recipeId).map((r) => ({ productId: r.productId, name: r.productName })),\n recipes: surfaceRows.current.filter((r) => r.recipeId).map((r) => ({\n id: r.recipeId, productId: r.productId, product: r.productName, cost: r.cost,\n cmv: r.cost > 0 ? cmvPercent(r.cost, r.salePrice) : null,\n })),\n cmvAlertThreshold: CMV_ALERT_THRESHOLD,\n },\n }),\n tools: [],\n }), [])\n useAgentSurface(surface)\n\n if (loadError) {\n return (\n <div className=\"flex min-h-[320px] flex-col items-center justify-center rounded-xl border-2 border-dashed border-destructive/30 bg-destructive/5 px-6 text-center\">\n <AlertTriangle className=\"mb-3 h-8 w-8 text-destructive\" />\n <p className=\"font-medium\">{t('inventory.recipes.loadFailed')}</p>\n <p className=\"mt-1 max-w-xl text-xs text-muted-foreground\">{loadError}</p>\n <Button variant=\"outline\" className=\"mt-4\" onClick={() => void load()}>{t('inventory.recipes.retry')}</Button>\n </div>\n )\n }\n\n return (\n <TooltipProvider delayDuration={300}>\n <div ref={scrollAnchor as React.RefObject<HTMLDivElement>} />\n <PageHeaderActions>\n <PageActions\n actions={[{\n id: 'new-recipe',\n label: t('inventory.recipes.newRecipe'),\n icon: Plus,\n intent: 'primary',\n creates: true,\n permission: { feature: 'inventory', action: 'edit' },\n onSelect: () => setPicking(true),\n }]}\n />\n </PageHeaderActions>\n <CrudListView\n entityDef={entity}\n items={visible as unknown as Array<{ id: string }> | null}\n total={visible?.length ?? 0}\n search={search}\n onSearchChange={setSearch}\n searchPlaceholder={t('inventory.recipes.searchPlaceholder')}\n facets={facets}\n activeFilters={filters}\n onFacetChange={(field, value) => setFilters((prev) => ({ ...prev, [field]: value }))}\n onRowClick={(row) => onOpenProduct((row as unknown as Row).productId)}\n emptyMessage={t('inventory.recipes.noRecipes')}\n onRefresh={() => load()}\n onExport={provider.getRecipeExport ? () => { void exportAll() } : undefined}\n feature=\"inventory\"\n groupBy={groupBy}\n />\n {picking && (\n <SelectProductDialog\n onClose={() => setPicking(false)}\n onPick={(productId) => { setPicking(false); onOpenProduct(productId) }}\n />\n )}\n </TooltipProvider>\n )\n}\n","import React, { useCallback, useEffect, useMemo, useRef, useState } from 'react'\nimport { CalendarRange, Check, ClipboardCheck, ListFilter, PackageCheck } from 'lucide-react'\nimport type { ColumnDef } from '@tanstack/react-table'\nimport {\n ListView, Button, Badge, toast, DraftCommitBar,\n Modal, ModalContent, ModalHeader, ModalTitle, ModalDescription, ModalBody, ModalFooter, Textarea, Input,\n} from '@fayz-ai/ui'\nimport { useTranslation } from '@fayz-ai/core'\nimport { useInventoryStore, useInventoryConfig, formatCurrency } from '../context'\nimport { summarizeCount, type StockCountItem } from '@fayz-ai/inventory/domain/count'\nimport { usageLineKey, type UsageAuditCorrection, type UsageAuditEntry } from '@fayz-ai/inventory/domain/usage-audit'\n\n// ---------------------------------------------------------------------------\n// AUDITORIA DE USO — uma CONTAGEM, não um formulário por linha.\n//\n// A conferência de consumo é o mesmo gesto de uma contagem de estoque: a\n// pessoa desce a lista digitando o que realmente saiu e explica o conjunto uma\n// vez. Por isso esta tela empresta da contagem tudo o que pode: o campo aberto\n// na própria linha, Enter descendo para o próximo, a aritmética de divergência\n// (`summarizeCount`, que já sabe que linha em branco NÃO é linha contada zero)\n// e o fechamento em lote com um motivo só.\n//\n// O QUE ELA NÃO EMPRESTA, DE PROPÓSITO: a contagem tem sessão em banco e grava\n// cada número ao sair do campo, porque alguém pode fechar o navegador no meio\n// do estoque frio — e porque o modo cego precisa que o servidor guarde o\n// número. A auditoria não tem sessão e não deve ter: a migration 001 recusou\n// uma fila justamente para não existir um segundo lugar guardando a mesma\n// quantidade. Então o rascunho vive AQUI, na tela, e só o \"Aplicar\" escreve.\n// ---------------------------------------------------------------------------\n\n/** As três leituras da mesma fila — o que a barra de modos oferece. */\ntype AuditQueue = 'pending' | 'divergent' | 'all'\n\nconst keyOf = usageLineKey\n\n/** Trailing zeros on a quantity read as precision the count never had. */\nfunction formatQuantity(value: number): string {\n return String(Number(value.toFixed(4)))\n}\n\nfunction formatSigned(value: number): string {\n return value > 0 ? `+${formatQuantity(value)}` : formatQuantity(value)\n}\n\n/**\n * O DIA É O DIA, não o fuso.\n *\n * O consumo clínico é gravado com a DATA da execução (`executed_on`), sem\n * hora. A vista a promove a instante em UTC, e mostrá-lo no fuso de quem olha\n * empurrava tudo três horas para trás: o que o injetor lançou hoje aparecia\n * como \"ontem, 21:00\". Quando a linha tem data própria, é ela que manda — sem\n * hora, porque hora ali seria inventada.\n */\nfunction formatUsedAt(iso: string, locale: string, dia?: string | null): string {\n if (dia && /^\\d{4}-\\d{2}-\\d{2}$/.test(dia)) {\n const [a, m, d] = dia.split('-')\n return new Date(Number(a), Number(m) - 1, Number(d))\n .toLocaleDateString(locale, { day: '2-digit', month: '2-digit', year: '2-digit' })\n }\n const date = new Date(iso)\n if (Number.isNaN(date.getTime())) return '—'\n return date.toLocaleString(locale, {\n day: '2-digit', month: '2-digit', year: '2-digit', hour: '2-digit', minute: '2-digit',\n })\n}\n\n/**\n * Empty is \"nobody looked at this line\", never zero — the same rule the count\n * enforces. `null` is untouched, `undefined` is a number that is not a number.\n */\nfunction parseQuantity(raw: string | undefined): number | null | undefined {\n const trimmed = (raw ?? '').trim()\n if (trimmed === '') return null\n // pt-BR types \"2,5\". `type=number` swallows that comma and hands back an\n // empty string, which is how a correction becomes a silent no-op.\n const parsed = Number(trimmed.replace(',', '.'))\n if (!Number.isFinite(parsed) || parsed < 0) return undefined\n return parsed\n}\n\n/**\n * The counted field, on the row.\n *\n * It is controlled by the page — the summary and the bar need every keystroke —\n * and that is only safe because the column definitions above are memoised on\n * stable dependencies. Rebuild them per keystroke and the cell remounts, which\n * takes the caret with it.\n */\nconst CountedField = React.memo(function CountedField({\n entry, value, onChange, onEnter, registerRef, label,\n}: {\n entry: UsageAuditEntry\n value: string\n onChange: (key: string, raw: string) => void\n onEnter: (key: string) => void\n registerRef: (key: string, el: HTMLInputElement | null) => void\n label: string\n}) {\n const key = keyOf(entry)\n const parsed = parseQuantity(value)\n const invalid = parsed === undefined\n const delta = parsed == null || invalid ? null : parsed - entry.netQuantity\n\n return (\n <div className=\"flex items-center justify-end gap-2 whitespace-nowrap\">\n <span\n className={`w-14 text-right text-xs tabular-nums ${\n delta === null || delta === 0 ? 'text-muted-foreground'\n : delta > 0 ? 'text-destructive' : 'text-success'\n }`}\n >\n {delta === null || delta === 0 ? '' : formatSigned(delta)}\n </span>\n <div className=\"w-24 shrink-0\">\n <Input\n ref={(el) => registerRef(key, el)}\n type=\"text\"\n inputMode=\"decimal\"\n aria-label={`${label} — ${entry.productName ?? ''}`.trim()}\n aria-invalid={invalid || undefined}\n value={value}\n placeholder={formatQuantity(entry.netQuantity)}\n onChange={(e) => onChange(key, e.target.value)}\n onKeyDown={(e) => { if (e.key === 'Enter') { e.preventDefault(); onEnter(key) } }}\n className={`h-auto py-2.5 text-right font-medium tabular-nums ${invalid ? 'border-destructive' : ''}`}\n />\n </div>\n </div>\n )\n})\n\n/**\n * A observação, uma vez, para o lote inteiro — a mensagem de commit da\n * conferência. Vai pelo portal do design system: um diálogo desenhado à mão\n * herda a cor do que o abriu e sai quase-branco sobre cartão branco.\n */\nfunction ApplyBatchModal({ open, lines, saving, onCancel, onConfirm }: {\n open: boolean\n lines: Array<{ entry: UsageAuditEntry; quantity: number }>\n saving: boolean\n onCancel: () => void\n onConfirm: (reason: string) => void\n}) {\n const t = useTranslation()\n const [reason, setReason] = useState('')\n\n useEffect(() => { if (open) setReason('') }, [open])\n if (!open) return null\n\n const canSave = reason.trim().length > 0 && !saving\n\n return (\n <Modal open onOpenChange={(next) => { if (!next && !saving) onCancel() }}>\n <ModalContent size=\"sm\">\n <ModalHeader>\n <ModalTitle>{lines.length === 1\n ? t('inventory.usageAudit.applyTitleOne')\n : t('inventory.usageAudit.applyTitle', { count: String(lines.length) })}</ModalTitle>\n <ModalDescription>{t('inventory.usageAudit.applyDescription')}</ModalDescription>\n </ModalHeader>\n <ModalBody className=\"space-y-4\">\n {/* fz-container/fz-fields, não `sm:` — dentro de um diálogo de 448px\n o breakpoint mede a JANELA e insiste em duas colunas de 200. */}\n <div className=\"fz-container rounded-2xl border border-border bg-muted/40 px-3 py-2\">\n <ul className=\"space-y-1 text-xs\">\n {lines.map(({ entry, quantity }) => {\n const unit = entry.unitAbbreviation ? ` ${entry.unitAbbreviation}` : ''\n return (\n <li key={keyOf(entry)} className=\"flex items-baseline justify-between gap-3\">\n <span className=\"min-w-0 truncate\">\n {entry.productName ?? t('inventory.usageAudit.unnamedProduct')}\n </span>\n <span className=\"shrink-0 tabular-nums text-muted-foreground\">\n {formatQuantity(entry.netQuantity)}{unit} → <span className=\"font-medium text-foreground\">\n {formatQuantity(quantity)}{unit}\n </span>\n </span>\n </li>\n )\n })}\n </ul>\n </div>\n\n <div>\n <label htmlFor=\"usage-audit-batch-reason\" className=\"text-xs font-medium text-muted-foreground\">\n {t('inventory.usageAudit.reason')}\n </label>\n <Textarea\n id=\"usage-audit-batch-reason\"\n autoFocus\n value={reason}\n onChange={(e) => setReason(e.target.value)}\n rows={3}\n placeholder={t('inventory.usageAudit.batchReasonPlaceholder')}\n className=\"mt-1 resize-none\"\n />\n {/* Um botão morto em silêncio faz a pessoa clicar de novo mais\n forte. Ele diz o que falta. */}\n <p className={`mt-1 text-[11px] ${reason.trim() ? 'text-muted-foreground' : 'text-warning'}`}>\n {reason.trim()\n ? t('inventory.usageAudit.batchReasonHint')\n : t('inventory.usageAudit.batchReasonRequired')}\n </p>\n </div>\n </ModalBody>\n <ModalFooter>\n <Button variant=\"outline\" size=\"sm\" onClick={onCancel} disabled={saving}>\n {t('inventory.usageAudit.cancel')}\n </Button>\n <Button size=\"sm\" onClick={() => onConfirm(reason.trim())} disabled={!canSave}>\n {t('inventory.usageAudit.applyConfirm')}\n </Button>\n </ModalFooter>\n </ModalContent>\n </Modal>\n )\n}\n\nexport function UsageAuditView() {\n const t = useTranslation()\n const { currency } = useInventoryConfig()\n const entries = useInventoryStore((s) => s.usageAudit)\n const total = useInventoryStore((s) => s.usageAuditTotal)\n const loading = useInventoryStore((s) => s.usageAuditLoading)\n const fetchUsageAudit = useInventoryStore((s) => s.fetchUsageAudit)\n const correctUsageBatch = useInventoryStore((s) => s.correctUsageBatch)\n const approveUsageBatch = useInventoryStore((s) => s.approveUsageBatch)\n const patchUsageAuditEntries = useInventoryStore((s) => s.patchUsageAuditEntries)\n\n const [search, setSearch] = useState('')\n // A tela abre na DIVERGÊNCIA, e isso é o V1, não uma otimização disfarçada:\n // a `Auditoria de Uso` de lá é uma FILA de conferência, e o que entra nela é\n // a linha cujo usado difere do padrão da ficha. Abrir em \"tudo\" é oferecer\n // 116.911 consumos ordenados por data para mostrar os 50 primeiros — uma\n // pergunta que ninguém faz e que a vista não consegue responder com índice,\n // porque a ordenação atravessa um UNION ALL e obriga a materializar os dois\n // ramos. Medido no Espaço Facial: \"tudo\" custa 2,8 s no banco e estoura os\n // 8 s do PostgREST; a fila de divergências custa 0,53 s e traz as 172 linhas\n // que alguém de fato precisa conferir.\n //\n // \"Tudo\" continua a um clique de distância, na aba ao lado.\n // O PADRÃO É \"PENDENTES\", que é o que o V1 abre: *\"Revise e aprove os\n // produtos utilizados nos atendimentos\"*, com o contador de pendentes no\n // canto. Abrir em \"fora do padrão\" escondia justamente o que o injetor\n // acabou de lançar — um consumo igual ao da ficha técnica tem variação zero\n // e nunca aparecia ali.\n const [queue, setQueue] = useState<AuditQueue>('pending')\n const [drafts, setDrafts] = useState<Record<string, string>>({})\n const [confirming, setConfirming] = useState(false)\n const [saving, setSaving] = useState(false)\n // O estado inicial da loja é lista vazia com `carregando` FALSO, então entre\n // a primeira pintura e a primeira resposta a tela dizia \"Nenhum consumo fora\n // do padrão\" — a mesma frase que ela usa para \"conferi e está tudo certo\".\n // Duas coisas diferentes com a mesma cara: quem abriu a tela concluía que não\n // havia nada a conferir quando havia 17.\n const [loadedOnce, setLoadedOnce] = useState(false)\n // A FILA TEM UM PERÍODO, e o padrão é curto de propósito.\n //\n // A vista atravessa a história inteira do consumo — 116.939 linhas neste\n // tenant — e ordenar tudo por data estourou o tempo do PostgREST mesmo já\n // filtrando por divergência: o banco leva 1,4 s sozinho e a requisição da\n // tela voltava `canceling statement due to statement timeout`. Com uma\n // janela de 30 dias o mesmo pedido custa 0,65 s.\n //\n // Não é só desempenho: a fila do V1 é o que CHEGOU para conferir, não o\n // arquivo. O período fica à vista e \"Tudo\" continua a um clique.\n const [dias, setDias] = useState<number | null>(30)\n // Falhar não é estar vazio. Com o erro engolido num toast que some, a tela\n // ficava dizendo \"Nenhum consumo fora do padrão\" sobre uma consulta que\n // nunca respondeu — a frase de quem conferiu tudo, na tela de quem não viu\n // nada.\n const [erro, setErro] = useState<string | null>(null)\n\n const desde = useMemo(() => {\n if (dias == null) return undefined\n const d = new Date()\n d.setDate(d.getDate() - dias)\n return d.toISOString()\n }, [dias])\n\n useEffect(() => {\n let active = true\n setErro(null)\n fetchUsageAudit({\n search: search || undefined,\n divergentOnly: queue === 'divergent',\n pendingOnly: queue === 'pending',\n from: desde,\n })\n .catch((err: any) => {\n if (active) setErro(err?.message ?? String(err))\n toast.error(t('inventory.usageAudit.loadFailed'), { description: err?.message })\n })\n .finally(() => { if (active) setLoadedOnce(true) })\n return () => { active = false }\n }, [search, queue, desde])\n\n const locale = currency.locale ?? 'pt-BR'\n\n // Enter desce para o próximo campo, como na contagem. A ordem é a da lista\n // em tela, guardada numa ref para que as colunas não precisem ser refeitas a\n // cada tecla — refazê-las remonta a célula e leva o foco embora.\n const fieldRefs = useRef(new Map<string, HTMLInputElement | null>())\n const order = useRef<string[]>([])\n order.current = entries.map(keyOf)\n\n const registerRef = useCallback((key: string, el: HTMLInputElement | null) => {\n if (el) fieldRefs.current.set(key, el)\n else fieldRefs.current.delete(key)\n }, [])\n\n const focusNext = useCallback((key: string) => {\n const index = order.current.indexOf(key)\n const next = order.current[index + 1]\n if (next) fieldRefs.current.get(next)?.focus()\n }, [])\n\n const setDraft = useCallback((key: string, raw: string) => {\n setDrafts((prev) => ({ ...prev, [key]: raw }))\n }, [])\n\n const draftsRef = useRef(drafts)\n draftsRef.current = drafts\n\n // A aritmética é a da contagem, literalmente: a linha da auditoria vira uma\n // linha de contagem onde \"o sistema\" é o que o razão já baixou.\n const summary = useMemo(() => summarizeCount(entries.map((entry) => ({\n id: keyOf(entry),\n productId: entry.productId,\n systemQuantity: entry.netQuantity,\n countedQuantity: parseQuantity(drafts[keyOf(entry)]) ?? undefined,\n unitCost: entry.netQuantity ? entry.totalCost / entry.netQuantity : 0,\n }) as StockCountItem)), [entries, drafts])\n\n const pending = useMemo(() => entries\n .map((entry) => ({ entry, quantity: parseQuantity(drafts[keyOf(entry)]) }))\n .filter((line): line is { entry: UsageAuditEntry; quantity: number } =>\n typeof line.quantity === 'number' && line.quantity !== line.entry.netQuantity),\n [entries, drafts])\n\n const invalidCount = useMemo(\n () => entries.filter((entry) => parseQuantity(drafts[keyOf(entry)]) === undefined).length,\n [entries, drafts])\n\n // Quais linhas ESTA sessão acabou de conferir, e como.\n //\n // O banco guarda `is_corrected`, que quer dizer \"alguém já olhou\" — e é a\n // mesma marca de uma correção de quantidade. Para o rótulo do selo eu preciso\n // do verbo que ACABOU de ser usado (baixou ou só aprovou), e isso a linha\n // recarregada não distingue. Vive na tela porque é da tela: some na próxima\n // carga, quando a linha sai da fila por mérito próprio.\n const [conferidas, setConferidas] = useState<Record<string, 'posted' | 'approved'>>({})\n // As linhas em voo — uma aprovação solta ou um lote inteiro.\n const [aprovando, setAprovando] = useState<Set<string>>(new Set())\n\n /**\n * Aprovar N linhas de uma vez — uma da fileira de botões, ou as marcadas.\n *\n * NÃO RECARREGA A FILA. Conferir é descer a lista clicando, e recarregar a\n * cada clique jogava a tabela fora: a rolagem voltava ao topo e a linha\n * seguinte — justamente onde a pessoa ia clicar — mudava de lugar. O servidor\n * já respondeu o que aconteceu; a tela escreve isso nas linhas atingidas\n * (`patchUsageAuditEntries`) e fica parada.\n */\n const aprovarLinhas = useCallback(async (alvos: UsageAuditEntry[], baixar: boolean) => {\n if (!alvos.length) return\n const chaves = alvos.map(keyOf)\n setAprovando((prev) => new Set([...prev, ...chaves]))\n try {\n const lines = alvos.map((e) => ({ itemId: e.itemId, productId: e.productId }))\n const r = await approveUsageBatch({ post: baixar, lines })\n\n // SEM SALDO NÃO É SUCESSO. A linha continua na fila, e a mensagem diz o\n // produto e o número — \"dê entrada ou aprove sem baixar\" é a decisão de\n // quem está no estoque, não do sistema.\n const semSaldo = r.linesNoStock ?? 0\n const passaram = baixar ? r.linesPosted : r.linesApproved\n if (baixar && r.linesPosted === 0 && semSaldo > 0) {\n const f = r.missing?.[0]\n toast.warning(t('inventory.usageAudit.noStock'), {\n description: f ? `${f.product} — precisa ${f.needed}, há ${f.available}` : undefined,\n })\n return\n }\n toast.success(baixar\n ? t('inventory.usageAudit.posted', { count: String(r.linesPosted) })\n : t('inventory.usageAudit.approved', { count: String(r.linesApproved) }), {\n // Um lote parcial precisa dizer quantas ficaram para trás, ou some a\n // diferença entre \"aprovei 12\" e \"pedi 15\".\n description: semSaldo > 0\n ? t('inventory.usageAudit.batchNoStock', { count: String(semSaldo) })\n : undefined,\n })\n\n // MARCA SÓ O QUE PASSOU. Num lote parcial o servidor diz quantas linhas\n // venceram, não QUAIS — então só posso escrever o selo quando todas\n // passaram. Com sobra, a fila se recarrega e cada linha volta com a\n // verdade do banco, que é melhor que a tela adivinhar qual foi.\n if (semSaldo > 0 || passaram !== alvos.length) {\n await fetchUsageAudit({\n search: search || undefined,\n divergentOnly: queue === 'divergent',\n pendingOnly: queue === 'pending',\n from: desde,\n })\n return\n }\n patchUsageAuditEntries(lines, { isCorrected: true, ...(baixar ? { stockPosted: true } : {}) })\n setConferidas((prev) => {\n const next = { ...prev }\n for (const k of chaves) next[k] = baixar ? 'posted' : 'approved'\n return next\n })\n } catch (err: any) {\n toast.error(t('inventory.usageAudit.approveFailed'), { description: err?.message })\n } finally {\n setAprovando((prev) => {\n const next = new Set(prev)\n for (const k of chaves) next.delete(k)\n return next\n })\n }\n }, [approveUsageBatch, patchUsageAuditEntries, fetchUsageAudit, search, queue, desde, t])\n\n // As três leituras que a célula faz sem entrar na lista de dependências das\n // colunas. Ver o comentário no fim de `columns`.\n const conferidasRef = useRef(conferidas)\n conferidasRef.current = conferidas\n const aprovandoRef = useRef(aprovando)\n aprovandoRef.current = aprovando\n const aprovarLinhasRef = useRef(aprovarLinhas)\n aprovarLinhasRef.current = aprovarLinhas\n\n async function apply(reason: string) {\n setSaving(true)\n try {\n const lines: UsageAuditCorrection[] = pending.map(({ entry, quantity }) => ({\n itemId: entry.itemId, productId: entry.productId, quantity,\n }))\n const outcome = await correctUsageBatch({ reason, lines })\n toast.success(outcome.linesApplied === 1\n ? t('inventory.usageAudit.batchAppliedOne')\n : t('inventory.usageAudit.batchApplied', { count: String(outcome.linesApplied) }))\n setDrafts({})\n setConfirming(false)\n } catch (err: any) {\n toast.error(t('inventory.usageAudit.batchFailed'), { description: err?.message })\n } finally {\n setSaving(false)\n }\n }\n\n const columns: ColumnDef<UsageAuditEntry, any>[] = useMemo(() => [\n {\n id: 'product', header: t('inventory.usageAudit.columnProduct'),\n cell: ({ row }: any) => {\n const entry = row.original as UsageAuditEntry\n return (\n /* NOME LONGO NÃO EMPURRA A TABELA. \"Ao Redor da Boca e Código de\n Barras - Ultraformer\" alargava a coluna e espremia quantidade,\n profissional e as ações para fora da tela. Aqui o nome tem teto e\n corta com reticências — o inteiro fica no `title`, a um passar de\n mouse, e a linha continua legível no celular. */\n <div className=\"min-w-[10rem] max-w-[18rem]\">\n <div className=\"truncate font-medium\" title={entry.productName ?? undefined}>\n {entry.productName ?? t('inventory.usageAudit.unnamedProduct')}\n </div>\n {/* The sold line only earns a second row when it is not the product\n itself — \"Shampoo X / Shampoo X\" says nothing twice. */}\n {entry.itemName && entry.itemName !== entry.productName && (\n <div className=\"truncate text-xs text-muted-foreground\" title={entry.itemName}>{entry.itemName}</div>\n )}\n </div>\n )\n },\n },\n {\n id: 'quantity', header: t('inventory.usageAudit.columnQuantity'),\n cell: ({ row }: any) => {\n const entry = row.original as UsageAuditEntry\n const unit = entry.unitAbbreviation ? ` ${entry.unitAbbreviation}` : ''\n // The standard only earns a line when it disagrees — that is the V1\n // reading: the quiet row is the one that matched.\n const off = entry.variance != null && entry.variance !== 0\n return (\n <div className=\"whitespace-nowrap\">\n <span className={off ? 'font-medium text-warning' : 'font-medium'}>\n {formatQuantity(entry.netQuantity)}{unit}\n </span>\n {off && entry.standardQuantity != null && (\n <span className=\"ml-2 text-xs text-muted-foreground\">\n {t('inventory.usageAudit.standard')}: {formatQuantity(entry.standardQuantity)}{unit}\n </span>\n )}\n {/* O selo diz o VERBO quando ele acabou de ser usado nesta tela —\n \"Baixado\" e \"Aprovado\" não são a mesma coisa, e o banco guarda\n as duas sob a mesma marca de \"alguém já olhou\". Linha que já\n chegou conferida continua dizendo \"Corrigido\", que é o que ela\n é sem que a tela precise inventar o resto. */}\n {(entry.isCorrected || conferidasRef.current[keyOf(entry)]) && (\n <Badge\n variant={conferidasRef.current[keyOf(entry)] ? 'success' : 'outline'}\n className=\"ml-2 text-[10px]\"\n >\n {conferidasRef.current[keyOf(entry)] === 'posted'\n ? t('inventory.usageAudit.badgePosted')\n : conferidasRef.current[keyOf(entry)] === 'approved'\n ? t('inventory.usageAudit.badgeApproved')\n : t('inventory.usageAudit.corrected')}\n </Badge>\n )}\n </div>\n )\n },\n },\n {\n id: 'location', header: t('inventory.usageAudit.columnLocation'),\n cell: ({ row }: any) => {\n const entry = row.original as UsageAuditEntry\n return (\n <span className=\"text-xs text-muted-foreground whitespace-nowrap\">\n {entry.stockLocationName ?? t('inventory.usageAudit.noLocation')}\n {entry.locationCount > 1 && ` +${entry.locationCount - 1}`}\n </span>\n )\n },\n },\n {\n id: 'usedAt', header: t('inventory.usageAudit.columnWhen'),\n cell: ({ row }: any) => (\n <span className=\"text-xs text-muted-foreground whitespace-nowrap\">\n {formatUsedAt((row.original as UsageAuditEntry).usedAt, locale, (row.original as UsageAuditEntry).movementDate)}\n </span>\n ),\n },\n {\n id: 'performedBy', header: t('inventory.usageAudit.columnPerformedBy'),\n cell: ({ row }: any) => {\n const entry = row.original as UsageAuditEntry\n return (\n <span className=\"block max-w-[10rem] truncate text-xs\" title={entry.performedByName ?? undefined}>\n {entry.performedByName ?? <span className=\"text-muted-foreground\">—</span>}\n </span>\n )\n },\n },\n {\n id: 'customer', header: t('inventory.usageAudit.columnCustomer'),\n cell: ({ row }: any) => {\n const entry = row.original as UsageAuditEntry\n return (\n <span className=\"block max-w-[12rem] truncate text-xs text-muted-foreground\" title={entry.customerName ?? undefined}>\n {entry.customerName ?? '—'}\n </span>\n )\n },\n },\n {\n id: 'cost', header: t('inventory.usageAudit.columnCost'),\n cell: ({ row }: any) => (\n <span className=\"block text-right text-xs text-muted-foreground\">\n {formatCurrency((row.original as UsageAuditEntry).totalCost, currency)}\n </span>\n ),\n },\n {\n // O campo fica ABERTO na linha: conferir é descer a lista digitando,\n // não abrir um diálogo por item.\n id: 'counted', header: () => (\n <span className=\"block text-right\">{t('inventory.usageAudit.columnCounted')}</span>\n ),\n cell: ({ row }: any) => {\n const entry = row.original as UsageAuditEntry\n return (\n <CountedField\n entry={entry}\n value={draftsRef.current[keyOf(entry)] ?? ''}\n onChange={setDraft}\n onEnter={focusNext}\n registerRef={registerRef}\n label={t('inventory.usageAudit.columnCounted')}\n />\n )\n },\n },\n {\n // AS DUAS AÇÕES DO V1, na linha, com os verbos dele.\n //\n // \"Baixar no estoque\" aceita E desconta; \"Aprovar\" aceita e não mexe no\n // saldo — é o consumo que não sai da prateleira da casa (produto do\n // próprio cliente, amostra, item já baixado por fora). Separá-las é o\n // que impede que conferir vire baixa automática.\n id: 'acoes', header: () => <span className=\"block text-right\">{t('inventory.usageAudit.columnActions')}</span>,\n cell: ({ row }: any) => {\n const entry = row.original as UsageAuditEntry\n const key = keyOf(entry)\n // Conferida é conferida: oferecer de novo os dois verbos convida a\n // aprovar duas vezes a mesma linha.\n const feito = !!conferidasRef.current[key]\n const ocupado = aprovandoRef.current.has(key)\n if (feito) return <span className=\"block text-right text-xs text-muted-foreground\">—</span>\n return (\n <div className=\"flex items-center justify-end gap-1\">\n <Button variant=\"bare\" size=\"bare\"\n type=\"button\"\n disabled={ocupado}\n onClick={() => void aprovarLinhasRef.current([entry], true)}\n title={t('inventory.usageAudit.postHint')}\n className=\"disabled:pointer-events-auto rounded-button bg-foreground px-2 py-1 text-[11px] font-semibold text-background disabled:opacity-40\"\n >\n {t('inventory.usageAudit.post')}\n </Button>\n <Button variant=\"bare\" size=\"bare\"\n type=\"button\"\n disabled={ocupado}\n onClick={() => void aprovarLinhasRef.current([entry], false)}\n title={t('inventory.usageAudit.approveHint')}\n className=\"disabled:pointer-events-auto rounded-button border border-input px-2 py-1 text-[11px] font-medium hover:bg-muted disabled:opacity-40\"\n >\n {t('inventory.usageAudit.approve')}\n </Button>\n </div>\n )\n },\n },\n // As colunas NÃO dependem de `conferidas` nem de `aprovando`: refazê-las\n // remonta a célula do campo aberto e leva o foco junto — o mesmo motivo que\n // já obrigava `draftsRef`. As duas leituras voláteis vão por ref, e quem\n // repinta a linha é o `usageAudit` do store, que a aprovação acabou de\n // mudar.\n ], [currency, locale, t, setDraft, focusNext, registerRef])\n\n const costDelta = summary.varianceValue\n\n return (\n <div className=\"space-y-3\">\n {/* UM DESENHO DE FILTRO SÓ.\n A fila (Pendentes · Divergentes · Todos) era uma banda de abas por\n cima da tabela, e o período uma pastilha dentro dela: dois controles\n que reduzem a MESMA lista, em duas alturas diferentes, com dois\n desenhos. Os dois viraram pastilha na linha da busca. \"Todos\" é a\n pastilha limpa — é o que `allLabel` já significa em toda a casa. */}\n {erro && (\n <p className=\"rounded-xl border border-destructive/40 bg-destructive/10 px-3 py-2 text-xs text-destructive\">\n {t('inventory.usageAudit.loadFailed')} — {erro}\n </p>\n )}\n\n {/* O período viaja na MESMA linha da busca, como toda pastilha de filtro\n da casa: recortar e buscar reduzem a mesma lista. A fileira de botões\n que ele era antes gastava uma linha acima da tabela para mostrar o\n tempo todo duas opções que não estavam valendo. */}\n <ListView<UsageAuditEntry>\n columns={columns}\n data={entries}\n loading={loading || !loadedOnce}\n total={total}\n getRowId={(row) => keyOf(row)}\n // CONFERIR EM LOTE — os MESMOS dois verbos da linha, sobre o que\n // estiver marcado. Descer 172 linhas clicando duas vezes em cada uma é\n // a fila do Espaço Facial inteira num dia; marcar o bloco que já foi\n // olhado e aprovar de uma vez é o gesto que a contagem sempre teve e\n // esta tela não.\n //\n // Linha já conferida sai do lote em silêncio: o servidor a recusaria,\n // e um \"aprovei 12 de 15\" sem dizer por quê é pior que não oferecê-la.\n bulkActions={[\n {\n id: 'post',\n label: t('inventory.usageAudit.post'),\n icon: PackageCheck,\n onSelect: (rows) => aprovarLinhas(rows.filter((r) => !conferidas[keyOf(r)]), true),\n },\n {\n id: 'approve',\n label: t('inventory.usageAudit.approve'),\n icon: Check,\n onSelect: (rows) => aprovarLinhas(rows.filter((r) => !conferidas[keyOf(r)]), false),\n },\n ]}\n searchPlaceholder={t('inventory.usageAudit.searchPlaceholder')}\n search={search}\n onSearchChange={setSearch}\n searchDebounce={300}\n filterDefs={[\n {\n id: 'queue',\n label: t('inventory.usageAudit.filterLabel'),\n icon: ListFilter,\n allLabel: t('inventory.usageAudit.filterAll'),\n options: [\n { value: 'pending', label: t('inventory.usageAudit.filterPending') },\n { value: 'divergent', label: t('inventory.usageAudit.filterDivergent') },\n ],\n value: queue === 'all' ? undefined : queue,\n onChange: (v) => setQueue((v as AuditQueue) ?? 'all'),\n },\n {\n id: 'period',\n label: t('inventory.usageAudit.periodLabel'),\n icon: CalendarRange,\n allLabel: t('inventory.usageAudit.periodAll'),\n options: [\n { value: '30', label: t('inventory.usageAudit.period30') },\n { value: '90', label: t('inventory.usageAudit.period90') },\n ],\n value: dias == null ? undefined : String(dias),\n onChange: (v) => setDias(v ? Number(v) : null),\n },\n ]}\n filtersLabel={t('inventory.usageAudit.filtersLabel')}\n onClearFilters={() => { setQueue('all'); setDias(null) }}\n emptyMessage={erro\n ? t('inventory.usageAudit.loadFailed')\n : queue === 'divergent'\n ? t('inventory.usageAudit.emptyDivergent')\n : queue === 'pending'\n ? t('inventory.usageAudit.emptyPending')\n : t('inventory.usageAudit.empty')}\n />\n\n <DraftCommitBar\n open={pending.length > 0 || invalidCount > 0}\n icon={ClipboardCheck}\n title={pending.length === 0\n ? t('inventory.usageAudit.draftCheck')\n : pending.length === 1\n ? t('inventory.usageAudit.draftOne')\n : t('inventory.usageAudit.draftMany', { count: String(pending.length) })}\n hint={costDelta === 0\n ? t('inventory.usageAudit.draftHint')\n : t('inventory.usageAudit.draftCost', { value: formatCurrency(costDelta, currency) })}\n commitDisabledReason={invalidCount > 0\n ? t('inventory.usageAudit.draftInvalid', { count: String(invalidCount) })\n : pending.length === 0\n ? t('inventory.usageAudit.draftNothing')\n : undefined}\n discardLabel={t('inventory.usageAudit.discard')}\n onDiscard={() => setDrafts({})}\n commitLabel={t('inventory.usageAudit.apply', { count: String(pending.length) })}\n onCommit={() => setConfirming(true)}\n busy={saving}\n />\n\n <ApplyBatchModal\n open={confirming}\n lines={pending}\n saving={saving}\n onCancel={() => setConfirming(false)}\n onConfirm={(reason) => void apply(reason)}\n />\n </div>\n )\n}\n","// ---------------------------------------------------------------------------\n// O que o Estoque do V1 tem e este ainda não.\n// ---------------------------------------------------------------------------\n// Lido do menu do V1 da Artorius (captura de 30/09/2026) e medido no banco de\n// produção. Os números são de lá: quantas linhas existem, e quantas são da\n// Artorius. Um «em breve» sem tamanho não ajuda a priorizar.\n//\n// A Produção fica DE FORA por decisão do founder — são seis telas (Visão Geral,\n// Planejamento, Ordens, Execução, Lotes & Rastreabilidade, Custos & Rendimentos)\n// e um assunto próprio, não um buraco do estoque.\n// ---------------------------------------------------------------------------\nimport React from 'react'\nimport { ComingSoon } from '@fayz-ai/ui'\n\n/** Transferência entre locais de estoque. */\nexport function TransfersView() {\n return (\n <ComingSoon\n title=\"Transferências\"\n summary=\"Mover saldo de um local de estoque para outro — da câmara fria para o salão, do depósito para a cozinha — sem que isso vire entrada nem saída.\"\n v1Path=\"Estoque → Transferências\"\n measured=\"7 transferências no V1 inteiro, nenhuma da Artorius. Eles têm 5 locais de estoque e movimentam tudo por entrada de nota.\"\n missing={[\n 'A transferência é DOIS movimentos ligados, não um: sai de um local e entra no outro pelo mesmo custo',\n 'O movimento de estoque do V2 já tem `destination_location_id` — falta a tela e a regra de aprovação',\n 'O V1 tem aprovador de transferência (stock_transfer_approvers); decidir se isso vem junto',\n ]}\n />\n )\n}\n\n/** Requisição interna — a cozinha pede ao depósito. */\nexport function RequisitionsView() {\n return (\n <ComingSoon\n title=\"Requisições\"\n summary=\"O pedido interno: a cozinha requisita do depósito, alguém separa, e a baixa acontece quando sai — não quando foi pedido.\"\n v1Path=\"Estoque → Requisições\"\n measured=\"ZERO requisições no V1 inteiro, em nenhum cliente. A tela existe lá e nunca foi usada.\"\n missing={[\n 'Antes de construir: confirmar que alguém quer. Nenhum cliente do V1 usou isto em nenhum momento',\n 'O V1 tem sete tabelas para o assunto (requisição, item, lote, modelo, evento, ajuste, idempotência) e nenhuma linha',\n 'Se vier, é fluxo de pedido→separação→baixa, com o saldo reservado no meio',\n ]}\n />\n )\n}\n\n/** Locais de estoque — cadastro que a Artorius USA. */\nexport function StockLocationsView() {\n return (\n <ComingSoon\n title=\"Locais de Estoque\"\n summary=\"Onde a mercadoria fica: depósito, câmara congelada, salão. Cada movimento acontece em um local, e o saldo é por local.\"\n v1Path=\"Estoque → Locais de Estoque\"\n measured=\"A Artorius tem 5 locais no V1 e 6 já migrados para cá (Estoque principal, CÂMARA CONGELADA…). O dado atravessou; falta a tela para mexer nele.\"\n missing={[\n 'A tabela `plg_inventory_stock_locations` já existe e já recebeu os locais — é CRUD, não porte de regra',\n 'A conciliação de nota já escolhe o local; hoje quem cria um novo tem de pedir a alguém',\n 'Ligar local à unidade, que é o que a RLS usa para decidir quem vê qual saldo',\n ]}\n />\n )\n}\n\n/** Controle de temperatura — HACCP de cozinha. */\nexport function TemperatureView() {\n return (\n <ComingSoon\n title=\"Controle de Temperatura\"\n summary=\"O registro de temperatura dos equipamentos — câmara, freezer, balcão — com a leitura de cada turno e o alerta quando sai da faixa.\"\n v1Path=\"Estoque → Controle de Temperatura\"\n measured=\"70 pontos de controle e 138 leituras no V1, nenhum da Artorius. É a vigilância sanitária de quem já foi cobrado por ela.\"\n missing={[\n 'Cadastrar o ponto de controle (equipamento, faixa aceitável, quantas leituras por dia)',\n 'A leitura do turno, com quem leu e quando — é prova para a fiscalização',\n 'O alerta quando sai da faixa; sem isso o registro vira papel passado',\n ]}\n />\n )\n}\n\n/** Indicadores de estoque. */\nexport function StockIndicatorsView() {\n return (\n <ComingSoon\n title=\"Indicadores\"\n summary=\"Ponto de pedido, estoque mínimo e máximo por produto e por local — e o que está abaixo do mínimo agora.\"\n v1Path=\"Estoque → Indicadores\"\n measured=\"Nenhum parâmetro cadastrado no V1, em nenhum cliente (`stock_center_product_params` está vazia). A Artorius compra por hábito, não por ponto de pedido.\"\n missing={[\n 'O parâmetro por produto × local: mínimo, máximo, ponto de pedido',\n 'A lista do que está abaixo do mínimo — o painel do Estoque já mostra «estoque baixo», mas com limiar chutado',\n 'Sugestão de compra a partir disso é o passo seguinte, e é o que liga o estoque à Entrada de Notas',\n ]}\n />\n )\n}\n\n/** Alteração em massa de produtos — sub-item de Produtos no V1. */\nexport function BulkProductEditView() {\n return (\n <ComingSoon\n title=\"Alteração em massa\"\n summary=\"Mudar preço, custo, categoria ou unidade de muitos produtos de uma vez, sem abrir um por um.\"\n v1Path=\"Estoque → Produtos → Alteração em massa\"\n measured=\"A Tati editou 184 produtos no V1 em quatro dias. Um por um.\"\n missing={[\n 'Selecionar por filtro (categoria, tipo, fornecedor) e aplicar a mudança ao conjunto',\n 'Pré-visualizar o que vai mudar ANTES de gravar — alteração em massa errada é difícil de desfazer',\n 'Registrar quem mudou o quê: é a diferença entre correção e acidente',\n ]}\n />\n )\n}\n","import React, { useState } from 'react'\nimport { Package, Ruler, MapPin, ChevronRight, Check, Loader2 } from 'lucide-react'\nimport { useTranslation } from '@fayz-ai/core'\nimport { Button } from '@fayz-ai/ui'\n\nconst STEPS = [\n { id: 'welcome', icon: Package, titleKey: 'inventory.onboarding.welcome', descKey: 'inventory.onboarding.description' },\n { id: 'units', icon: Ruler, titleKey: 'inventory.onboarding.units.title', descKey: 'inventory.onboarding.units.description' },\n { id: 'locations', icon: MapPin, titleKey: 'inventory.onboarding.locations.title', descKey: 'inventory.onboarding.locations.description' },\n]\n\nexport function InventoryOnboarding({ onComplete }: { onComplete: () => void | Promise<void> }) {\n const t = useTranslation()\n const [step, setStep] = useState(0)\n const [preparing, setPreparing] = useState(false)\n const [error, setError] = useState('')\n const current = STEPS[step]\n const isLast = step === STEPS.length - 1\n const Icon = current.icon\n\n async function complete() {\n if (preparing) return\n setPreparing(true)\n setError('')\n try {\n await onComplete()\n } catch {\n setError(t('inventory.onboarding.setupError'))\n } finally {\n setPreparing(false)\n }\n }\n\n return (\n <div className=\"flex items-center justify-center py-12\">\n <div className=\"w-full max-w-lg\">\n <div className=\"flex items-center gap-1 mb-8\">\n {STEPS.map((_, i) => (\n <div key={i} className={`h-1 flex-1 rounded-full transition-colors ${i <= step ? 'bg-primary' : 'bg-muted'}`} />\n ))}\n </div>\n <div className=\"rounded-card border bg-card p-8 text-center space-y-6 shadow-sm\">\n <div className=\"flex justify-center\">\n <div className=\"flex h-16 w-16 items-center justify-center rounded-2xl bg-primary/10\">\n <Icon className=\"h-8 w-8 text-primary\" />\n </div>\n </div>\n <div>\n <h2 className=\"text-xl font-bold\">{t(current.titleKey)}</h2>\n <p className=\"text-sm text-muted-foreground mt-2 max-w-sm mx-auto\">{t(current.descKey)}</p>\n </div>\n <div className=\"flex items-center justify-center gap-3 pt-2\">\n {step > 0 && (\n <Button variant=\"outline\" size=\"lg\" onClick={() => setStep(step - 1)}>{t('common.back')}</Button>\n )}\n {isLast ? (\n <Button variant=\"default\" size=\"lg\" onClick={() => void complete()} disabled={preparing}>\n {preparing ? <Loader2 className=\"h-4 w-4 animate-spin\" /> : <Check className=\"h-4 w-4\" />}\n {preparing ? t('inventory.onboarding.preparing') : t('inventory.onboarding.start')}\n </Button>\n ) : (\n <Button variant=\"default\" size=\"lg\" onClick={() => setStep(step + 1)}>\n {step === 0 ? t('inventory.onboarding.getStarted') : t('common.continue')} <ChevronRight className=\"h-4 w-4\" />\n </Button>\n )}\n </div>\n {step === 0 && (\n <Button variant=\"bare\" size=\"bare\" onClick={() => void complete()} disabled={preparing} className=\"font-normal text-xs text-muted-foreground hover:text-foreground transition-colors disabled:opacity-50\">\n {t('inventory.onboarding.skip')}\n </Button>\n )}\n {error && <p role=\"alert\" className=\"text-sm text-destructive\">{error}</p>}\n </div>\n </div>\n </div>\n )\n}\n","import React, { useMemo } from 'react'\nimport type { StoreApi } from 'zustand/vanilla'\nimport { ModulePage, PageTransition, ComingSoon, type ModuleNavItem } from '@fayz-ai/ui'\nimport { InventoryContextProvider, type ResolvedInventoryConfig } from '../context'\nimport type { InventoryDataProvider } from '@fayz-ai/inventory/data/provider'\nimport type { InventoryUIState } from '@fayz-ai/inventory/store'\nimport type { PluginRegistryDef, PluginQuickAction } from '@fayz-ai/core'\nimport { useModuleNavigation, ModuleActionBar, createViewRouter, PluginSettingsPanel, RegistryCrudView, useTenantPluginSettings, usePluginOnboardingGate, PluginOnboardingGateSkeleton } from '@fayz-ai/admin'\nimport { useTranslation } from '@fayz-ai/core'\nimport { DashboardView } from './DashboardView'\nimport { ProductListView } from './ProductListView'\nimport { ProductCrudForm } from './ProductCrudForm'\nimport { ProductDetailView } from './ProductDetailView'\nimport { StockMovementView } from './StockMovementView'\nimport { MovementHistoryView } from './MovementHistoryView'\nimport { StockPanelView } from './StockPanelView'\nimport { StockCountsView } from './StockCountsView'\nimport { StockCountFormView } from './StockCountFormView'\nimport { StockCountSessionView } from './StockCountSessionView'\nimport { RecipesView } from './RecipesView'\nimport { UsageAuditView } from './UsageAuditView'\nimport {\n StockLocationsView, TemperatureView, BulkProductEditView,\n StockIndicatorsView, TransfersView, RequisitionsView,\n} from './GapScreens'\nimport { InventoryGeneralSettings, INVENTORY_MODULE_DEFAULTS, useInventoryHouseModules } from '../components/InventoryGeneralSettings'\nimport { InventoryOnboarding } from '../components/InventoryOnboarding'\n\ntype HouseModules = Pick<typeof INVENTORY_MODULE_DEFAULTS, 'requisitions' | 'usageAudit' | 'temperature' | 'hiddenViews'>\n\nfunction buildNav(config: ResolvedInventoryConfig, view: string, navigate: (v: string) => void, t: (key: string) => string, house: HouseModules): ModuleNavItem[] {\n const items: ModuleNavItem[] = [\n // Tudo o que se faz COM o catálogo mora aqui: a lista, como ela se agrupa\n // (Categorias) e como se mexe em muitos de uma vez. A primeira filha\n // chama-se «Produtos» e não «Lista» porque o nome de uma tela é o que ela\n // mostra, e «Lista» só diz o formato.\n // O Resumo abre o módulo: é a única tela daqui que responde sem que se peça\n // nada — quanto vale o estoque, quantos itens, o que está abaixo do mínimo.\n { id: 'dashboard', label: t('inventory.nav.dashboard'), icon: 'BarChart3', active: view === 'dashboard', onClick: () => navigate('dashboard') },\n // Depois dele, o catálogo: a lista, como ela se agrupa (Categorias) e como\n // se mexe em muitos de uma vez.\n ...(config.modules.products ? [{\n id: 'products', label: t('inventory.nav.products'), icon: 'Package',\n active: view.startsWith('products') || view === 'product-categories' || view === 'bulk-products',\n children: [\n { id: 'products-new', kind: 'action' as const, label: t('inventory.nav.new'), active: view === 'products-new', onClick: () => navigate('products-new') },\n { id: 'products-list', label: t('inventory.nav.products'), defaultChild: true, active: view === 'products-list' || view.startsWith('products-') && view.includes(':') && !view.startsWith('products-recipe:'), onClick: () => navigate('products-list') },\n { id: 'product-categories', label: t('registry.product-categories'), active: view === 'product-categories', onClick: () => navigate('product-categories') },\n { id: 'bulk-products', label: 'Alteração em massa', active: view === 'bulk-products', onClick: () => navigate('bulk-products') },\n ],\n } as ModuleNavItem] : []),\n // «Inventário» é a CONTAGEM, e não um agrupamento: é assim que a palavra é\n // usada em quem veio do V1 — «vou fazer o inventário» quer dizer ir à\n // prateleira conferir. O saldo que o sistema calcula sozinho é o Resumo, e\n // ele abre o módulo lá em cima.\n {\n // DUAS ABAS, como no V1: o Painel diz QUANTO HÁ; as Contagens dizem o\n // que já foi conferido. O inventário abria direto na segunda, e a\n // pergunta que todo mundo faz primeiro não tinha tela.\n id: 'inventory', label: t('inventory.nav.inventory'), icon: 'ClipboardCheck',\n active: view === 'stock-panel' || view.startsWith('stock-counts'),\n children: [\n { id: 'stock-panel', label: t('inventory.nav.panel'), defaultChild: true, active: view === 'stock-panel', onClick: () => navigate('stock-panel') },\n { id: 'stock-counts', label: t('inventory.nav.counts'), active: view.startsWith('stock-counts'), onClick: () => navigate('stock-counts') },\n ],\n },\n // MOVIMENTAÇÕES É UMA LINHA SÓ, e ela leva direto para a lista.\n //\n // Entrada e saída eram filhas «ação» da aba: um grupo que abre para\n // oferecer dois formulários e o destino real no meio deles. Quem clica em\n // «Movimentações» quer ver o que entrou e o que saiu — lançar é o botão\n // que a própria lista já tem no cabeçalho, e é lá que a ação pertence.\n {\n id: 'stock-history', label: t('inventory.nav.stock'), icon: 'ArrowUpCircle',\n active: view === 'stock-history' || view === 'stock-entry' || view === 'stock-exit',\n onClick: () => navigate('stock-history'),\n },\n // ── Linha própria, como no V1 ────────────────────────────────────────\n //\n // Estas quatro moravam dentro de um grupo «Reposição», juntas pela pergunta\n // que respondem. Quem veio do V1 não as procura por pergunta: lá elas são\n // linhas do menu, com estes nomes, e um grupo a mais é um clique a mais\n // para descobrir que a tela mudou de lugar e não de função.\n //\n // Transferências vem logo depois de Movimentações porque é o mesmo assunto\n // — mercadoria andando —, e Indicadores depois dela porque é de saldo que\n // ele fala. A Ficha Técnica fecha o bloco, vizinha das Receitas: a receita\n // diz do que o prato é feito, a ficha diz quanto ele custa e quanto a\n // panela rende.\n { id: 'transfers', label: 'Transferências', icon: 'ArrowLeftRight', active: view === 'transfers', onClick: () => navigate('transfers') },\n { id: 'stock-indicators', label: 'Indicadores', icon: 'Target', active: view === 'stock-indicators', onClick: () => navigate('stock-indicators') },\n ...(house.requisitions ? [{ id: 'requisitions', label: 'Requisições', icon: 'ClipboardList', active: view === 'requisitions', onClick: () => navigate('requisitions') }] : []),\n // Fichas Técnicas sits here, after Requisições, as in V1 (pushed below\n // only when the house uses recipes).\n ...(config.modules.recipes ? [{\n // The app's own label wins when it picked one; otherwise the dictionary.\n id: 'recipes',\n label: config.labels.recipes && config.labels.recipes !== 'Recipes' ? config.labels.recipes : t('inventory.nav.recipes'),\n icon: 'BookOpen',\n // One entry, as in V1: «Nova Ficha Técnica» is the list's own button.\n active: view === 'recipes' || view === 'recipes-list' || view.startsWith('products-recipe:'),\n onClick: () => navigate('recipes-list'),\n }] : []),\n // Auditoria de Uso fica FORA do Inventário: ela não pergunta quanto há,\n // pergunta se o que saiu bate com o que foi vendido. É a única tela daqui\n // que olha para o consumo e não para o saldo.\n //\n // \"Nova contagem\" não está na navegação: era uma AÇÃO dentro de um menu, e\n // a lista de contagens já tem o \"+\" no cabeçalho dela.\n ...(house.usageAudit ? [{\n id: 'stock-usage-audit', label: t('inventory.nav.usageAudit'), icon: 'ScanSearch',\n active: view === 'stock-usage-audit',\n onClick: () => navigate('stock-usage-audit'),\n }] : []),\n // Produção fica de fora por decisão do founder: são seis telas e um assunto\n // próprio, não um buraco do estoque.\n //\n // «Locais» e não «Cadastros»: cadastro é o que TODA tela desta lista faz.\n // O que junta estas duas é o lugar físico — onde a mercadoria está e a que\n // temperatura ela está lá. A alteração em massa saiu daqui: ela mexe no\n // catálogo, não no armazém, e agora mora com os Produtos.\n {\n id: 'stock-setup', label: 'Locais', icon: 'Warehouse',\n active: ['stock-locations', 'temperature'].some((v) => view === v),\n children: [\n { id: 'stock-locations', label: 'Locais', defaultChild: true, active: view === 'stock-locations', onClick: () => navigate('stock-locations') },\n ...(house.temperature ? [{ id: 'temperature', label: 'Temperatura', active: view === 'temperature', onClick: () => navigate('temperature') }] : []),\n ],\n },\n ]\n\n\n // As abas emprestadas entram DEPOIS das próprias, na ordem em que o app as\n // passou. Entrada de Notas é a primeira delas.\n for (const extra of config.extraViews) {\n if (house.hiddenViews.includes(extra.id)) continue\n const own = [extra.id, ...(extra.children ?? []).map((c) => c.id)]\n const hits = (id: string) => view === id || view.startsWith(`${id}/`) || view.startsWith(`${id}:`)\n items.push({\n id: extra.id,\n label: extra.label,\n icon: extra.icon,\n active: own.some(hits),\n // Com filhos, o PAI não navega — quem navega é o filho padrão, como o grupo\n // «Estoque» já faz com `stock-history`. Dar `onClick` ao pai E injetá-lo\n // como primeiro filho deslocava a pílula em um: a tela certa aparecia com o\n // nome da vizinha em destaque.\n ...(extra.children?.length\n ? {\n children: [\n { id: extra.id, label: extra.defaultChildLabel ?? 'Entrada', defaultChild: true, active: hits(extra.id), onClick: () => navigate(extra.id) },\n ...extra.children.map((c) => ({ id: c.id, label: c.label, active: hits(c.id), onClick: () => navigate(c.id) })),\n ],\n }\n : { onClick: () => navigate(extra.id) }),\n })\n }\n\n return items\n}\n\nexport function InventoryPage({ config: appConfig, provider, store, registries }: {\n config: ResolvedInventoryConfig\n provider: InventoryDataProvider\n store: StoreApi<InventoryUIState>\n registries?: PluginRegistryDef[]\n}) {\n const t = useTranslation()\n // Receita é DECISÃO DA CASA. O aplicativo diz se OFERECE ficha técnica; a\n // conta diz se usa. `&&` e não `??`: o que o pacote não oferece o toggle não\n // ressuscita. Ver INVENTORY_MODULE_DEFAULTS.\n const houseModules = useInventoryHouseModules()\n const recipesOn = houseModules.get('recipes')\n const config = useMemo<ResolvedInventoryConfig>(\n () => appConfig.modules.recipes && recipesOn\n ? appConfig\n : { ...appConfig, modules: { ...appConfig.modules, recipes: false } },\n [appConfig, recipesOn],\n )\n const { view, direction, navigate } = useModuleNavigation('/inventory', {\n dashboard: 0,\n 'products-list': 0, 'products-new': 1, 'products-detail': 1,\n 'stock-entry': 1, 'stock-exit': 1, 'stock-history': 0, 'stock-counts': 0, 'stock-counts-new': 1,\n 'stock-usage-audit': 0,\n 'recipes-list': 0, 'products-recipe': 1,\n settings: 1,\n }, 'dashboard')\n\n const checkExistingData = React.useCallback(\n async () => (await provider.getProducts({ pageSize: 1 })).total > 0,\n [provider],\n )\n const onboarding = usePluginOnboardingGate('saas-core:inventory-onboarded', checkExistingData)\n\n const isSettings = view === 'settings'\n const isSummary = view === 'dashboard' || view === ''\n const nav = buildNav(config, view, navigate, t, {\n requisitions: houseModules.get('requisitions'),\n usageAudit: houseModules.get('usageAudit'),\n temperature: houseModules.get('temperature'),\n hiddenViews: houseModules.get('hiddenViews'),\n })\n\n const completeOnboarding = React.useCallback(async () => {\n await provider.ensureReferenceData?.()\n onboarding.complete()\n }, [provider, onboarding.complete])\n\n const quickActions = useMemo<PluginQuickAction[]>(() => {\n const actions: PluginQuickAction[] = [\n // Dropped with the catalogue module: offering \"new product\" while the\n // screen is gone would dead-end the user.\n ...(config.modules.products ? [{\n id: 'new-product',\n label: t('inventory.quickActions.newProduct'),\n icon: 'Package',\n description: t('inventory.quickActions.newProductDesc'),\n action: () => navigate('products-new'),\n } as PluginQuickAction] : []),\n {\n id: 'stock-entry',\n label: t('inventory.quickActions.stockEntry'),\n icon: 'ArrowUpRight',\n description: t('inventory.quickActions.stockEntryDesc'),\n action: () => navigate('stock-entry'),\n },\n {\n id: 'stock-exit',\n label: t('inventory.quickActions.stockExit'),\n icon: 'ArrowDownRight',\n description: t('inventory.quickActions.stockExitDesc'),\n action: () => navigate('stock-exit'),\n },\n ]\n return actions\n }, [])\n\n if (isSummary && onboarding.status === 'checking') {\n return (\n <InventoryContextProvider config={config} provider={provider} store={store}>\n <PluginOnboardingGateSkeleton />\n </InventoryContextProvider>\n )\n }\n\n if (isSummary && onboarding.status === 'needed') {\n return (\n <InventoryContextProvider config={config} provider={provider} store={store}>\n <InventoryOnboarding onComplete={completeOnboarding} />\n </InventoryContextProvider>\n )\n }\n\n if (isSettings && registries && registries.length > 0) {\n return (\n <InventoryContextProvider config={config} provider={provider} store={store}>\n <PageTransition transitionKey=\"settings\" direction={direction}>\n <div style={{ padding: '24px' }}>\n <div style={{ marginBottom: '16px' }}>\n <h1 style={{ fontSize: '20px', fontWeight: 600, margin: 0 }}>{t('inventory.settingsPage.title')}</h1>\n <p style={{ color: 'var(--muted-foreground, #6b7280)', margin: '4px 0 0', fontSize: '14px' }}>\n {t('inventory.settingsPage.subtitle')}\n </p>\n </div>\n <PluginSettingsPanel\n title={t('inventory.settingsPage.title')}\n generalSettings={<InventoryGeneralSettings config={appConfig} />}\n registries={registries}\n hostPluginId=\"inventory\"\n routeBase=\"/inventory/settings\"\n />\n </div>\n </PageTransition>\n </InventoryContextProvider>\n )\n }\n\n const renderView = createViewRouter([\n // Routes go with the module, not just the nav entry: leaving them mounted\n // keeps a second product form reachable by URL.\n ...(config.modules.products ? [\n { id: 'products', render: () => <ProductListView onNew={() => navigate('products-new')} onOpen={(id: string) => navigate(`products-detail:${id}`)} /> },\n { id: 'products-list', render: () => <ProductListView onNew={() => navigate('products-new')} onOpen={(id: string) => navigate(`products-detail:${id}`)} /> },\n { id: 'products-new', render: () => <ProductCrudForm onSaved={() => navigate('products-list')} /> },\n { id: 'products-edit', render: ({ id }: { id?: string }) => <ProductCrudForm editId={id!} onSaved={() => navigate(`products-detail:${id}`)} onOpenTab={(tab) => navigate(`products-${tab}:${id}`)} /> },\n { id: 'products-detail', render: ({ id }: { id?: string }) => <ProductDetailView productId={id!} onBack={() => navigate('products-list')} onEdit={() => navigate(`products-edit:${id}`)} /> },\n // Every tab writes `/products/<id>/<tab>` into the URL, so each of those\n // links has to come back to the same page with that tab open. Only\n // `stock` had a route: reloading on any other tab fell through to the\n // module's first screen.\n ...['stock', 'variants', 'barcodes', 'complements', ...config.productDetailTabs.map((tab) => tab.id)].map((tab) => ({\n id: `products-${tab}`,\n render: ({ id }: { id?: string }) => <ProductDetailView productId={id!} initialTab={tab} onBack={() => navigate('products-list')} onEdit={() => navigate(`products-edit:${id}`)} />,\n })),\n ] : []),\n { id: 'stock-entry', render: () => <StockMovementView defaultType=\"entry\" onSaved={() => navigate('stock-history')} /> },\n { id: 'stock-exit', render: () => <StockMovementView defaultType=\"exit\" onSaved={() => navigate('stock-history')} /> },\n { id: 'stock-history', render: () => <MovementHistoryView onViewDetail={(id) => navigate(`stock-detail:${id}`)} onNew={() => navigate('stock-entry')} onNewExit={() => navigate('stock-exit')} /> },\n { id: 'stock-detail', render: ({ id }) => {\n const movement = store.getState().movements.find((m) => m.id === id)\n return movement\n ? <StockMovementView defaultType={movement.movementType} viewMovement={movement} onSaved={() => navigate('stock-history')} />\n : <MovementHistoryView onViewDetail={(mid) => navigate(`stock-detail:${mid}`)} />\n } },\n // One route id for both: `/inventory/stock/counts/<uuid>` parses back as\n // `stock-counts:<id>`, not `stock-counts-detail:<id>`.\n { id: 'stock-panel', render: () => <StockPanelView /> },\n { id: 'stock-counts', render: ({ id }: { id?: string }) => id\n ? <StockCountSessionView sessionId={id} onBack={() => navigate('stock-counts')} />\n : <StockCountsView onNew={() => navigate('stock-counts-new')} onOpen={(sid) => navigate(`stock-counts:${sid}`)} /> },\n { id: 'stock-usage-audit', render: () => <UsageAuditView /> },\n { id: 'stock-counts-new', render: () => <StockCountFormView onOpened={(sid) => navigate(`stock-counts:${sid}`)} onCancel={() => navigate('stock-counts')} /> },\n { id: 'recipes', render: () => <RecipesView onOpenProduct={(pid) => navigate(`products-recipe:${pid}`)} /> },\n { id: 'recipes-list', render: () => <RecipesView onOpenProduct={(pid) => navigate(`products-recipe:${pid}`)} /> },\n // The sheet lives in the product, on its tab — the same page Produtos opens.\n { id: 'products-recipe', render: ({ id }: { id?: string }) => <ProductDetailView productId={id!} initialTab=\"recipe\" onBack={() => navigate('recipes-list')} onEdit={() => navigate(`products-edit:${id}`)} /> },\n // Telas emprestadas por outro plugin — hoje a Entrada de Notas, que é assunto\n // de estoque e não linha de rail (no V1: Estoque → Notas Fiscais → Entrada).\n ...config.extraViews.flatMap((v) => [\n { id: v.id, render: () => <>{v.render()}</> },\n ...(v.children ?? []).map((c) => ({ id: c.id, render: () => <>{c.render()}</> })),\n ]),\n // As telas que ainda não existem. Cada uma diz o que falta e o tamanho do\n // buraco, medido no V1 — ver `./GapScreens`.\n // Categorias e Locais NÃO são «em breve»: o plugin já declara os dois como\n // cadastro (`data/registries`), e eles só viviam atrás de Configurações —\n // onde ninguém procura o lugar onde a carne fica. `RegistryCrudView` é o\n // mesmo CRUD que a página de ajustes desenha, agora na aba onde o assunto\n // está. Sem o cadastro declarado (um app que corte o registro), cai no\n // «em breve» de antes.\n //\n // Sem `embedded`: aqui o cadastro É a tela — a aba do módulo leva a ele e a\n // nada mais. `embedded` é para o cadastro montado NO MEIO de outra tela, ao\n // lado de outros blocos, e o que ele faz é tirar o «Adicionar» da barra do\n // topo e largá-lo numa fileira própria, encostado à direita do corpo. Com\n // isso, Locais e Categorias eram as duas únicas listas do Estoque cujo botão\n // de criar ficava em outro lugar que o de Produtos e o de Contagens.\n // The module writes a view id as a path (`product-categories` is\n // `/product/categories`), so the registry's base path and its own\n // new/edit addresses have to be spelled the same way or \"New\" lands on 404.\n ...['', '-new', '-edit', '-detail'].flatMap((suffix) => [\n { id: `product-categories${suffix}`, render: () => {\n const reg = registries?.find((r) => r.id === 'product-categories')\n return reg ? <RegistryCrudView registry={reg} basePath=\"/inventory/product/categories\" /> : <ComingSoon title=\"Categorias\" summary=\"Como o catálogo se agrupa.\" v1Path=\"Estoque → Produtos → Categorias\" missing={['Este aplicativo não declarou o cadastro de categorias']} />\n } },\n { id: `stock-locations${suffix}`, render: () => {\n const reg = registries?.find((r) => r.id === 'stock-locations')\n return reg ? <RegistryCrudView registry={reg} basePath=\"/inventory/stock/locations\" /> : <StockLocationsView />\n } },\n ]),\n { id: 'temperature', render: () => <TemperatureView /> },\n { id: 'bulk-products', render: () => <BulkProductEditView /> },\n { id: 'stock-indicators', render: () => <StockIndicatorsView /> },\n { id: 'transfers', render: () => <TransfersView /> },\n { id: 'requisitions', render: () => <RequisitionsView /> },\n // The old placeholder's address lands on the real list.\n { id: 'technical-sheet', render: () => <RecipesView onOpenProduct={(pid) => navigate(`products-recipe:${pid}`)} /> },\n { id: 'dashboard', render: () => <DashboardView /> },\n ], 'dashboard')\n\n return (\n <InventoryContextProvider config={config} provider={provider} store={store}>\n <ModulePage\n navVariant={config.moduleNav}\n title={config.labels.pageTitle}\n subtitle={config.labels.pageSubtitle}\n nav={nav}\n showHeader={isSummary}\n viewKey={view}\n direction={direction}\n headerAction={\n <ModuleActionBar\n quickActions={quickActions}\n settingsPath={registries && registries.length > 0 ? '/settings/inventory' : undefined}\n />\n }\n >\n {renderView(view)}\n </ModulePage>\n </InventoryContextProvider>\n )\n}\n"]}