@fayz-ai/plugin-inventory 0.1.1
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.
- package/dist/InventoryContext.d.ts +37 -0
- package/dist/InventoryContext.d.ts.map +1 -0
- package/dist/InventoryPage.d.ts +13 -0
- package/dist/InventoryPage.d.ts.map +1 -0
- package/dist/components/InventoryGeneralSettings.d.ts +3 -0
- package/dist/components/InventoryGeneralSettings.d.ts.map +1 -0
- package/dist/components/InventoryOnboarding.d.ts +5 -0
- package/dist/components/InventoryOnboarding.d.ts.map +1 -0
- package/dist/components/InventorySettings.d.ts +8 -0
- package/dist/components/InventorySettings.d.ts.map +1 -0
- package/dist/data/index.d.ts +3 -0
- package/dist/data/index.d.ts.map +1 -0
- package/dist/data/mock.d.ts +3 -0
- package/dist/data/mock.d.ts.map +1 -0
- package/dist/data/supabase.d.ts +3 -0
- package/dist/data/supabase.d.ts.map +1 -0
- package/dist/data/types.d.ts +22 -0
- package/dist/data/types.d.ts.map +1 -0
- package/dist/index.cjs +2936 -0
- package/dist/index.cjs.map +1 -0
- package/dist/index.d.ts +48 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +2930 -0
- package/dist/index.js.map +1 -0
- package/dist/lib/tenant.d.ts +3 -0
- package/dist/lib/tenant.d.ts.map +1 -0
- package/dist/locales/en.d.ts +2 -0
- package/dist/locales/en.d.ts.map +1 -0
- package/dist/locales/index.d.ts +2 -0
- package/dist/locales/index.d.ts.map +1 -0
- package/dist/locales/pt-BR.d.ts +2 -0
- package/dist/locales/pt-BR.d.ts.map +1 -0
- package/dist/registries.d.ts +3 -0
- package/dist/registries.d.ts.map +1 -0
- package/dist/store.d.ts +28 -0
- package/dist/store.d.ts.map +1 -0
- package/dist/types.d.ts +213 -0
- package/dist/types.d.ts.map +1 -0
- package/dist/views/DashboardView.d.ts +8 -0
- package/dist/views/DashboardView.d.ts.map +1 -0
- package/dist/views/MovementHistoryView.d.ts +5 -0
- package/dist/views/MovementHistoryView.d.ts.map +1 -0
- package/dist/views/ProductCrudForm.d.ts +6 -0
- package/dist/views/ProductCrudForm.d.ts.map +1 -0
- package/dist/views/ProductFormView.d.ts +6 -0
- package/dist/views/ProductFormView.d.ts.map +1 -0
- package/dist/views/ProductListView.d.ts +6 -0
- package/dist/views/ProductListView.d.ts.map +1 -0
- package/dist/views/RecipeDetailView.d.ts +6 -0
- package/dist/views/RecipeDetailView.d.ts.map +1 -0
- package/dist/views/RecipeFormView.d.ts +5 -0
- package/dist/views/RecipeFormView.d.ts.map +1 -0
- package/dist/views/RecipesView.d.ts +6 -0
- package/dist/views/RecipesView.d.ts.map +1 -0
- package/dist/views/StockMovementView.d.ts +8 -0
- package/dist/views/StockMovementView.d.ts.map +1 -0
- package/dist/views/dashboardWidgets.d.ts +11 -0
- package/dist/views/dashboardWidgets.d.ts.map +1 -0
- package/dist/views/productEntity.d.ts +6 -0
- package/dist/views/productEntity.d.ts.map +1 -0
- package/package.json +55 -0
- package/src/InventoryContext.tsx +40 -0
- package/src/InventoryPage.tsx +170 -0
- package/src/README.md +177 -0
- package/src/components/InventoryGeneralSettings.tsx +26 -0
- package/src/components/InventoryOnboarding.tsx +60 -0
- package/src/components/InventorySettings.tsx +27 -0
- package/src/data/index.ts +2 -0
- package/src/data/mock.ts +266 -0
- package/src/data/supabase.ts +358 -0
- package/src/data/types.ts +35 -0
- package/src/index.ts +191 -0
- package/src/lib/tenant.ts +4 -0
- package/src/locales/en.ts +242 -0
- package/src/locales/index.ts +7 -0
- package/src/locales/pt-BR.ts +242 -0
- package/src/migrations/001_inventory_base.sql +69 -0
- package/src/migrations/002_recipes.sql +34 -0
- package/src/migrations/003_measurement_units.sql +13 -0
- package/src/registries.ts +111 -0
- package/src/store.ts +127 -0
- package/src/types.ts +256 -0
- package/src/views/DashboardView.tsx +11 -0
- package/src/views/MovementHistoryView.tsx +104 -0
- package/src/views/ProductCrudForm.tsx +99 -0
- package/src/views/ProductFormView.tsx +283 -0
- package/src/views/ProductListView.tsx +107 -0
- package/src/views/RecipeDetailView.tsx +192 -0
- package/src/views/RecipeFormView.tsx +235 -0
- package/src/views/RecipesView.tsx +103 -0
- package/src/views/StockMovementView.tsx +516 -0
- package/src/views/dashboardWidgets.tsx +101 -0
- package/src/views/productEntity.tsx +124 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/InventoryContext.tsx","../src/views/DashboardView.tsx","../src/views/ProductListView.tsx","../src/views/ProductFormView.tsx","../src/views/StockMovementView.tsx","../src/views/MovementHistoryView.tsx","../src/views/RecipesView.tsx","../src/views/RecipeFormView.tsx","../src/views/RecipeDetailView.tsx","../src/components/InventoryGeneralSettings.tsx","../src/components/InventoryOnboarding.tsx","../src/InventoryPage.tsx","../src/views/dashboardWidgets.tsx","../src/data/mock.ts","../src/data/supabase.ts","../src/store.ts","../src/registries.ts","../src/locales/en.ts","../src/locales/pt-BR.ts","../src/locales/index.ts","../src/index.ts"],"names":["t","jsx","jsxs","useTranslation","useState","useEffect","React","SubpageHeader","Package","ArrowDownRight","ArrowUpRight","RefreshCw","ArrowRightLeft","Trash2","useMemo","ListView","Plus","toast","useSaveBar","name","SearchSelect","BookOpen","Layers","Clock","Check","ctx","nextId","createStore"],"mappings":"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","file":"index.js","sourcesContent":["import { createPluginContext, formatCurrency, type CurrencyConfig } from '@fayz-ai/saas'\nimport type { InventoryPluginLabels } from './index'\nimport type { InventoryDataProvider } from './data/types'\nimport type { InventoryUIState } from './store'\n\nexport interface InventoryModules {\n recipes: boolean\n stockLocations: boolean\n batchTracking: boolean\n}\n\nexport type InventoryCurrency = CurrencyConfig\n\nexport interface ProductTypeOption {\n value: string\n label: string\n}\n\nexport interface LocationOption {\n id: string\n name: string\n isHQ?: boolean\n}\n\nexport interface ResolvedInventoryConfig {\n modules: InventoryModules\n labels: InventoryPluginLabels\n currency: InventoryCurrency\n productTypes: ProductTypeOption[]\n locations: LocationOption[]\n}\n\nconst ctx = createPluginContext<ResolvedInventoryConfig, InventoryDataProvider, InventoryUIState>('InventoryPage')\n\nexport const InventoryContextProvider = ctx.ContextProvider\nexport const useInventoryConfig = ctx.useConfig\nexport const useInventoryProvider = ctx.useProvider\nexport const useInventoryStore = ctx.useStore\n\nexport { formatCurrency }\n","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, { useEffect, useState } from 'react'\nimport { Package } from 'lucide-react'\nimport type { ColumnDef } from '@tanstack/react-table'\nimport { ListView } from '@fayz-ai/ui'\nimport { useInventoryConfig, useInventoryStore, formatCurrency } from '../InventoryContext'\nimport { SubpageHeader } from '@fayz-ai/ui'\nimport { useTranslation } from '@fayz-ai/core'\nimport type { ProductType, Product } from '../types'\n\nconst useColumns = (currency: { code: string; locale: string; symbol: string }, t: (key: string) => string): ColumnDef<Product, any>[] => [\n {\n accessorKey: 'name',\n header: t('inventory.productList.product'),\n enableSorting: true,\n cell: ({ row }: any) => (\n <div>\n <p className=\"font-medium\">{row.original.name}</p>\n {row.original.sku && <p className=\"text-xs text-muted-foreground\">{row.original.sku}</p>}\n </div>\n ),\n },\n {\n accessorKey: 'productType',\n header: t('inventory.productList.type'),\n cell: ({ getValue }: any) => (\n <span className=\"inline-flex items-center rounded-full px-2 py-0.5 text-[10px] font-medium bg-muted text-muted-foreground capitalize\">\n {getValue() as string}\n </span>\n ),\n },\n {\n accessorKey: 'currentQuantity',\n header: t('inventory.productList.stock'),\n enableSorting: true,\n meta: { align: 'right' },\n cell: ({ row }: any) => (\n <span className={`text-right block ${row.original.currentQuantity <= row.original.minQuantity ? 'text-destructive font-medium' : ''}`}>\n {row.original.currentQuantity}\n </span>\n ),\n },\n {\n accessorKey: 'costPrice',\n header: t('inventory.productList.cost'),\n meta: { align: 'right' },\n cell: ({ getValue }: any) => (\n <span className=\"text-right block text-muted-foreground\">{formatCurrency(getValue() as number, currency)}</span>\n ),\n },\n {\n id: 'value',\n header: t('inventory.productList.value'),\n meta: { align: 'right' },\n cell: ({ row }: any) => (\n <span className=\"text-right block font-medium\">\n {formatCurrency(row.original.currentQuantity * row.original.costPrice, currency)}\n </span>\n ),\n },\n]\n\nexport function ProductListView({ onNew, onEdit }: {\n onNew?: () => void\n onEdit?: (id: string) => void\n}) {\n const t = useTranslation()\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\n useEffect(() => {\n fetchProducts({ productType: typeFilter as ProductType | undefined, search: search || undefined })\n }, [typeFilter, search])\n\n const columns = useColumns(currency, t)\n\n return (\n <div className=\"space-y-4\">\n <SubpageHeader title={t('inventory.productList.title')} subtitle={t('inventory.productList.subtitle', { count: String(productsTotal) })} />\n\n <ListView<Product>\n columns={columns}\n data={products}\n loading={productsLoading}\n searchPlaceholder={t('inventory.productList.searchPlaceholder')}\n search={search}\n onSearchChange={setSearch}\n searchDebounce={0}\n tags={productTypes.map((t) => ({ value: t.value, label: t.label }))}\n activeTag={typeFilter}\n onTagChange={setTypeFilter}\n newLabel={t('inventory.productList.newProduct')}\n onNew={onNew}\n onRowClick={(row) => onEdit?.(row.id)}\n emptyIcon={Package}\n emptyMessage={t('inventory.productList.empty')}\n emptyActionLabel={onNew ? t('inventory.productList.createFirst') : undefined}\n onEmptyAction={onNew}\n />\n </div>\n )\n}\n","import React, { useState, useEffect } from 'react'\nimport { ImagePlus } from 'lucide-react'\nimport { useInventoryConfig, useInventoryStore, useInventoryProvider, formatCurrency } from '../InventoryContext'\nimport { SubpageHeader, useSaveBar, toast } from '@fayz-ai/ui'\nimport { CurrencyInput } from '@fayz-ai/ui'\nimport { useTranslation } from '@fayz-ai/core'\nimport type { ProductType } from '../types'\n\n// ---------------------------------------------------------------------------\n// Product type descriptions — parametrizable via config\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// ---------------------------------------------------------------------------\n// Section component for grouping form fields\n// ---------------------------------------------------------------------------\n\nfunction FormSection({ title, subtitle, children }: {\n title: string; subtitle?: string; children: React.ReactNode\n}) {\n return (\n <div className=\"rounded-lg border bg-card shadow-sm\">\n <div className=\"px-5 py-3 border-b\">\n <h3 className=\"text-sm font-semibold\">{title}</h3>\n {subtitle && <p className=\"text-[10px] text-muted-foreground mt-0.5\">{subtitle}</p>}\n </div>\n <div className=\"p-5 space-y-4\">\n {children}\n </div>\n </div>\n )\n}\n\n// ---------------------------------------------------------------------------\n// Product form\n// ---------------------------------------------------------------------------\n\nexport function ProductFormView({ editId, onSaved }: { editId?: string; onSaved?: () => void }) {\n const t = useTranslation()\n const { productTypes, currency } = useInventoryConfig()\n const provider = useInventoryProvider()\n const createProduct = useInventoryStore((s) => s.createProduct)\n const isEdit = !!editId\n\n const [loaded, setLoaded] = useState(false)\n const [name, setName] = useState('')\n const [sku, setSku] = useState('')\n const [barcode, setBarcode] = useState('')\n const [brand, setBrand] = useState('')\n const [productType, setProductType] = useState<ProductType>(productTypes[0]?.value as ProductType ?? 'ingredient')\n const [costPrice, setCostPrice] = useState(0)\n const [salePrice, setSalePrice] = useState(0)\n const [minQuantity, setMinQuantity] = useState(0)\n const [maxQuantity, setMaxQuantity] = useState(0)\n const [description, setDescription] = useState('')\n const [saving, setSaving] = useState(false)\n\n // Load existing product for edit\n useEffect(() => {\n if (!editId || loaded) return\n ;(async () => {\n const product = await provider.getProductById(editId)\n if (!product) return\n setName(product.name)\n setSku(product.sku ?? '')\n setBarcode(product.barcode ?? '')\n setBrand(product.brand ?? '')\n setProductType(product.productType)\n setCostPrice(product.costPrice)\n setSalePrice(product.salePrice ?? 0)\n setMinQuantity(product.minQuantity)\n setMaxQuantity(product.maxQuantity ?? 0)\n setDescription(product.description ?? '')\n setLoaded(true)\n })()\n }, [editId])\n\n const fields = { name, sku, barcode, brand, productType, costPrice, salePrice, minQuantity, maxQuantity, description }\n const ready = !editId || loaded\n const snapshot = React.useRef<string | null>(null)\n useEffect(() => {\n if (ready && snapshot.current === null) snapshot.current = JSON.stringify(fields)\n }, [ready])\n const dirty = snapshot.current !== null && JSON.stringify(fields) !== snapshot.current\n useSaveBar({\n dirty,\n saving,\n onSave: () => { void handleSave() },\n onDiscard: () => onSaved?.(),\n saveLabel: t('inventory.productForm.save'),\n })\n\n async function handleSave() {\n if (!name.trim()) { toast.error(t('common.formIncomplete')); return }\n setSaving(true)\n try {\n if (isEdit && editId) {\n await provider.updateProduct(editId, {\n name, sku: sku || undefined, barcode: barcode || undefined, brand: brand || undefined,\n productType, costPrice, salePrice: salePrice || undefined,\n minQuantity, maxQuantity: maxQuantity || undefined, description: description || undefined,\n })\n } else {\n await createProduct({\n name, sku: sku || undefined, barcode: barcode || undefined, brand: brand || undefined,\n productType, costPrice, salePrice: salePrice || undefined,\n minQuantity, maxQuantity: maxQuantity || undefined, description: description || undefined,\n })\n }\n onSaved?.()\n } finally {\n setSaving(false)\n }\n }\n\n const title = isEdit ? (name || t('inventory.productForm.editProduct')) : t('inventory.productForm.newProduct')\n const subtitle = isEdit ? undefined : t('inventory.productForm.addToCatalog')\n const margin = salePrice > 0 && costPrice > 0 ? ((salePrice - costPrice) / costPrice * 100).toFixed(1) : null\n\n return (\n <div className=\"space-y-5\">\n <SubpageHeader\n title={title}\n subtitle={subtitle}\n onBack={onSaved}\n parentLabel={t('inventory.nav.products')}\n />\n\n {/* Section 1: General Info */}\n <FormSection title={t('inventory.productForm.generalInfo')}>\n <div className=\"flex gap-4\">\n {/* Image placeholder */}\n <div className=\"shrink-0\">\n <div className=\"w-20 h-20 rounded-lg border-2 border-dashed border-muted flex items-center justify-center text-muted-foreground hover:border-primary/30 hover:text-primary/50 transition-colors cursor-pointer\">\n <ImagePlus className=\"h-5 w-5\" />\n </div>\n </div>\n\n <div className=\"flex-1 grid gap-3 sm:grid-cols-2\">\n <div className=\"sm:col-span-1\">\n <label className=\"text-xs font-medium text-muted-foreground\">{t('inventory.productForm.name')} *</label>\n <input\n type=\"text\"\n value={name}\n onChange={(e) => setName(e.target.value)}\n placeholder={t('inventory.productForm.namePlaceholder')}\n autoFocus\n className=\"w-full mt-1 rounded-input border border-input bg-card shadow-[inset_0_1px_0_rgb(0_0_0_/0.06)] px-3 py-2 text-sm focus:outline-none focus:ring-2 focus:ring-ring\"\n />\n </div>\n <div>\n <label className=\"text-xs font-medium text-muted-foreground\">{t('inventory.productForm.brand')}</label>\n <input\n type=\"text\"\n value={brand}\n onChange={(e) => setBrand(e.target.value)}\n placeholder={t('inventory.productForm.brandPlaceholder')}\n className=\"w-full mt-1 rounded-input border border-input bg-card shadow-[inset_0_1px_0_rgb(0_0_0_/0.06)] px-3 py-2 text-sm focus:outline-none focus:ring-2 focus:ring-ring\"\n />\n </div>\n </div>\n </div>\n\n <div className=\"grid gap-3 sm:grid-cols-2\">\n <div>\n <label className=\"text-xs font-medium text-muted-foreground\">{t('inventory.productForm.sku')}</label>\n <input type=\"text\" value={sku} onChange={(e) => setSku(e.target.value)} placeholder={t('inventory.productForm.skuPlaceholder')} className=\"w-full mt-1 rounded-input border border-input bg-card shadow-[inset_0_1px_0_rgb(0_0_0_/0.06)] px-3 py-2 text-sm focus:outline-none focus:ring-2 focus:ring-ring\" />\n </div>\n <div>\n <label className=\"text-xs font-medium text-muted-foreground\">{t('inventory.productForm.barcode')}</label>\n <input type=\"text\" value={barcode} onChange={(e) => setBarcode(e.target.value)} placeholder={t('inventory.productForm.barcodePlaceholder')} className=\"w-full mt-1 rounded-input border border-input bg-card shadow-[inset_0_1px_0_rgb(0_0_0_/0.06)] px-3 py-2 text-sm focus:outline-none focus:ring-2 focus:ring-ring\" />\n </div>\n </div>\n\n <div>\n <label className=\"text-xs font-medium text-muted-foreground\">{t('inventory.productForm.description')}</label>\n <textarea\n value={description}\n onChange={(e) => setDescription(e.target.value)}\n rows={2}\n placeholder={t('inventory.productForm.descriptionPlaceholder')}\n className=\"w-full mt-1 rounded-input border border-input bg-card shadow-[inset_0_1px_0_rgb(0_0_0_/0.06)] px-3 py-2 text-sm focus:outline-none focus:ring-2 focus:ring-ring resize-none\"\n />\n </div>\n </FormSection>\n\n {/* Section 2: Classification */}\n <FormSection title={t('inventory.productForm.classification')} subtitle={t('inventory.productForm.classificationDesc')}>\n <div className=\"grid gap-2 sm:grid-cols-2 lg:grid-cols-4\">\n {productTypes.map((pt) => {\n const active = productType === pt.value\n const descKey = TYPE_DESCRIPTION_KEYS[pt.value]\n const desc = descKey ? t(descKey) : ''\n return (\n <button\n key={pt.value}\n onClick={() => setProductType(pt.value as ProductType)}\n className={`rounded-lg border-2 p-3 text-left transition-all ${\n active\n ? 'border-primary bg-primary/5'\n : 'border-transparent bg-muted/20 hover:bg-muted/40'\n }`}\n >\n <p className={`text-sm font-medium ${active ? 'text-primary' : ''}`}>{pt.label}</p>\n {desc && <p className=\"text-[10px] text-muted-foreground mt-0.5 leading-tight\">{desc}</p>}\n </button>\n )\n })}\n </div>\n </FormSection>\n\n {/* Section 3: Pricing */}\n <FormSection title={t('inventory.productForm.pricing')}>\n <div className=\"grid gap-4 sm:grid-cols-3\">\n <CurrencyInput\n label={t('inventory.productForm.costPrice')}\n value={costPrice}\n onChange={setCostPrice}\n symbol={currency.symbol}\n locale={currency.locale}\n currencyCode={currency.code}\n />\n <CurrencyInput\n label={t('inventory.productForm.salePrice')}\n value={salePrice}\n onChange={setSalePrice}\n symbol={currency.symbol}\n locale={currency.locale}\n currencyCode={currency.code}\n />\n <div>\n <label className=\"text-xs font-medium text-muted-foreground\">{t('inventory.productForm.margin')}</label>\n <div className=\"mt-1 rounded-lg border bg-muted/20 px-3 py-2 text-sm tabular-nums text-right\">\n {margin !== null ? (\n <span className={Number(margin) >= 0 ? 'text-success' : 'text-destructive'}>\n {margin}%\n </span>\n ) : (\n <span className=\"text-muted-foreground\">—</span>\n )}\n </div>\n </div>\n </div>\n </FormSection>\n\n {/* Section 4: Stock Levels */}\n <FormSection title={t('inventory.productForm.stockLevels')} subtitle={t('inventory.productForm.stockLevelsDesc')}>\n <div className=\"grid gap-4 sm:grid-cols-2 max-w-md\">\n <div>\n <label className=\"text-xs font-medium text-muted-foreground\">{t('inventory.productForm.minQuantity')}</label>\n <input\n type=\"number\"\n min={0}\n value={minQuantity}\n onChange={(e) => setMinQuantity(Number(e.target.value) || 0)}\n placeholder=\"0\"\n className=\"w-full mt-1 rounded-input border border-input bg-card shadow-[inset_0_1px_0_rgb(0_0_0_/0.06)] px-3 py-2 text-sm focus:outline-none focus:ring-2 focus:ring-ring\"\n />\n <p className=\"text-[10px] text-muted-foreground mt-1\">{t('inventory.productForm.minQuantityHint')}</p>\n </div>\n <div>\n <label className=\"text-xs font-medium text-muted-foreground\">{t('inventory.productForm.maxQuantity')}</label>\n <input\n type=\"number\"\n min={0}\n value={maxQuantity}\n onChange={(e) => setMaxQuantity(Number(e.target.value) || 0)}\n placeholder={t('inventory.productForm.optional')}\n className=\"w-full mt-1 rounded-input border border-input bg-card shadow-[inset_0_1px_0_rgb(0_0_0_/0.06)] px-3 py-2 text-sm focus:outline-none focus:ring-2 focus:ring-ring\"\n />\n <p className=\"text-[10px] text-muted-foreground mt-1\">{t('inventory.productForm.maxQuantityHint')}</p>\n </div>\n </div>\n </FormSection>\n </div>\n )\n}\n","import React, { useState, useEffect, useMemo } from 'react'\nimport { Save, Plus, ArrowUpRight, ArrowDownRight, RefreshCw, ArrowRightLeft, Trash2, Package, Check, Eye } from 'lucide-react'\nimport { useInventoryConfig, useInventoryStore, useInventoryProvider, formatCurrency } from '../InventoryContext'\nimport { cn } from '@fayz-ai/ui'\nimport { SubpageHeader } from '@fayz-ai/ui'\nimport { useTranslation } from '@fayz-ai/core'\nimport { SearchSelect, type SearchSelectOption } from '@fayz-ai/ui'\nimport { DatePicker } from '@fayz-ai/ui'\nimport type { MovementType, StockMovement, StockPosition } from '../types'\n\n// ---------------------------------------------------------------------------\n// Movement type config\n// ---------------------------------------------------------------------------\n\nconst MOVEMENT_TYPES: { value: MovementType; labelKey: string; icon: React.ElementType; color: string; activeColor: string; descKey: string }[] = [\n { value: '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 { value: '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 { value: '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 { value: '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 { value: '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// ---------------------------------------------------------------------------\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-lg 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} · {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\">{movement.movementType === 'entry' ? '+' : '-'}{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 [saving, setSaving] = useState(false)\n const [savedMovement, setSavedMovement] = useState<StockMovement | null>(null)\n\n useEffect(() => { fetchProducts({}); fetchLocations() }, [])\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 = movementType === 'adjustment' || movementType === 'loss'\n const needsDest = movementType === 'transfer'\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 // Build a map of locationId → total quantity from positions\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 const canProceedStep1 = !!productId\n const canProceedStep2 = quantity > 0 && (!needsReason || reason.trim()) && (!needsDest || 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 (!productId || quantity <= 0) return\n setSaving(true)\n try {\n const movement = await createMovement({\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 })\n setSavedMovement(movement)\n } finally {\n setSaving(false)\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={step > 1 ? () => setStep(step - 1) : 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\n key={mt.value}\n onClick={() => setMovementType(mt.value)}\n className={`rounded-lg border-2 p-3 text-left 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 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 && <> · Min: {selectedProduct.minQuantity}</>}\n {selectedProduct.costPrice > 0 && <> · 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\n onClick={() => setStep(2)}\n disabled={!canProceedStep1}\n className=\"inline-flex items-center gap-1.5 rounded-lg 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-lg 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=\"w-full mt-1 rounded-input border border-input bg-card shadow-[inset_0_1px_0_rgb(0_0_0_/0.06)] px-3 py-2 text-sm focus:outline-none focus:ring-2 focus:ring-ring\"\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 <input type=\"number\" min={0} step={0.01} value={unitCost} onChange={(e) => setUnitCost(Number(e.target.value) || 0)} className=\"flex-1 bg-transparent px-2 py-2 text-sm outline-none\" />\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\n key={l.id}\n type=\"button\"\n onClick={() => setLocationId(l.id)}\n className={cn(\n 'rounded-lg 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\n key={l.id}\n type=\"button\"\n onClick={() => setDestLocationId(l.id)}\n className={cn(\n 'rounded-lg 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=\"w-full mt-1 rounded-input border border-input bg-card shadow-[inset_0_1px_0_rgb(0_0_0_/0.06)] px-3 py-2 text-sm focus:outline-none focus:ring-2 focus:ring-ring\" />\n </div>\n )}\n </div>\n\n <div className=\"flex justify-between\">\n <button 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 onClick={() => setStep(3)} disabled={!canProceedStep2} className=\"inline-flex items-center gap-1.5 rounded-lg 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-lg 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} · {quantity} units · {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 <div className=\"rounded-lg 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 <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=\"w-full mt-1 rounded-input border border-input bg-card shadow-[inset_0_1px_0_rgb(0_0_0_/0.06)] px-3 py-2 text-sm focus:outline-none focus:ring-2 focus:ring-ring\" />\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=\"w-full mt-1 rounded-input border border-input bg-card shadow-[inset_0_1px_0_rgb(0_0_0_/0.06)] px-3 py-2 text-sm focus:outline-none focus:ring-2 focus:ring-ring\" />\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=\"w-full mt-1 rounded-input border border-input bg-card shadow-[inset_0_1px_0_rgb(0_0_0_/0.06)] px-3 py-2 text-sm focus:outline-none focus:ring-2 focus:ring-ring resize-none\" />\n </div>\n </div>\n\n <div className=\"flex justify-between\">\n <button onClick={() => 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\n onClick={handleSave}\n disabled={saving}\n className=\"inline-flex items-center gap-1.5 rounded-lg 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, { useEffect, useState, useMemo } from 'react'\nimport { ArrowUpRight, ArrowDownRight, RefreshCw, ArrowRightLeft, Trash2 } from 'lucide-react'\nimport type { ColumnDef } from '@tanstack/react-table'\nimport { ListView } from '@fayz-ai/ui'\nimport { useInventoryStore, formatCurrency, useInventoryConfig } from '../InventoryContext'\nimport { useTranslation } from '@fayz-ai/core'\nimport { SubpageHeader } from '@fayz-ai/ui'\nimport type { MovementType, StockMovement } from '../types'\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\nconst TYPE_COLORS: Record<MovementType, string> = {\n entry: 'text-success',\n exit: 'text-destructive',\n adjustment: 'text-info',\n transfer: 'text-magic',\n loss: 'text-warning',\n}\n\nexport function MovementHistoryView({ onViewDetail }: { onViewDetail?: (id: string) => void } = {}) {\n const t = useTranslation()\n const { currency } = useInventoryConfig()\n const movements = useInventoryStore((s) => s.movements)\n const movementsLoading = useInventoryStore((s) => s.movementsLoading)\n const fetchMovements = useInventoryStore((s) => s.fetchMovements)\n\n const [search, setSearch] = useState('')\n\n useEffect(() => { fetchMovements({ search: search || undefined }) }, [search])\n\n const columns: 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: 'productName', header: t('inventory.history.columnProduct'),\n cell: ({ getValue }: any) => <span className=\"font-medium\">{(getValue() as string) ?? '—'}</span>,\n },\n {\n accessorKey: 'movementType', header: t('inventory.history.columnType'),\n cell: ({ getValue }: any) => {\n const type = getValue() as MovementType\n const Icon = TYPE_ICONS[type] ?? RefreshCw\n const color = TYPE_COLORS[type] ?? 'text-muted-foreground'\n return (\n <span className={`inline-flex items-center gap-1 ${color}`}>\n <Icon className=\"h-3 w-3\" />\n <span className=\"text-xs capitalize\">{type}</span>\n </span>\n )\n },\n },\n {\n id: 'location', 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: t('inventory.history.columnQty'),\n cell: ({ row }: any) => (\n <span className=\"text-right block\">\n {row.original.movementType === 'entry' ? '+' : '-'}{row.original.quantity}\n </span>\n ),\n },\n {\n accessorKey: 'totalCost', header: t('inventory.history.columnTotal'),\n cell: ({ getValue }: any) => (\n <span className=\"text-right block text-muted-foreground\">{formatCurrency(getValue() as number, currency)}</span>\n ),\n },\n ], [currency, t])\n\n return (\n <div className=\"space-y-4\">\n <SubpageHeader title={t('inventory.history.title')} subtitle={t('inventory.history.subtitle')} />\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 emptyMessage={t('inventory.history.noMovements')}\n />\n </div>\n )\n}\n","import React, { useEffect } from 'react'\nimport { BookOpen, Plus, Clock, Layers } from 'lucide-react'\nimport { useInventoryStore } from '../InventoryContext'\nimport { useTranslation } from '@fayz-ai/core'\nimport { SubpageHeader } from '@fayz-ai/ui'\n\nfunction RecipeSkeleton() {\n return (\n <div className=\"grid gap-3 sm:grid-cols-2 lg:grid-cols-3\">\n {[1, 2, 3, 4, 5, 6].map((i) => (\n <div key={i} className=\"rounded-lg border bg-card shadow-sm p-4 space-y-3\">\n <div className=\"flex items-center gap-3\">\n <div className=\"h-9 w-9 rounded-lg bg-muted/40 animate-pulse\" />\n <div className=\"flex-1 space-y-1.5\">\n <div className=\"h-4 w-2/3 rounded bg-muted/40 animate-pulse\" />\n <div className=\"h-3 w-1/2 rounded bg-muted/30 animate-pulse\" />\n </div>\n </div>\n <div className=\"flex gap-3\">\n <div className=\"h-3 w-20 rounded bg-muted/30 animate-pulse\" />\n <div className=\"h-3 w-16 rounded bg-muted/30 animate-pulse\" />\n </div>\n </div>\n ))}\n </div>\n )\n}\n\nexport function RecipesView({ onNew, onView }: { onNew?: () => void; onView?: (id: string) => void }) {\n const t = useTranslation()\n const recipes = useInventoryStore((s) => s.recipes)\n const recipesLoading = useInventoryStore((s) => s.recipesLoading)\n const fetchRecipes = useInventoryStore((s) => s.fetchRecipes)\n\n useEffect(() => { fetchRecipes() }, [])\n\n return (\n <div className=\"space-y-4\">\n <SubpageHeader\n title={t('inventory.recipes.title')}\n subtitle={t('inventory.recipes.productionFormulas', { count: String(recipes.length) })}\n actions={onNew && (\n <button onClick={onNew} className=\"inline-flex items-center gap-1.5 rounded-lg bg-primary border border-primary px-3 py-2 text-sm font-medium text-primary-foreground hover:bg-primary/90 shadow-button-primary active:shadow-button-inset transition-colors\">\n <Plus className=\"h-3.5 w-3.5\" /> {t('inventory.recipes.newRecipe')}\n </button>\n )}\n />\n\n {recipesLoading ? (\n <RecipeSkeleton />\n ) : recipes.length === 0 ? (\n <div className=\"flex flex-col items-center justify-center py-16 text-center rounded-lg border-2 border-dashed border-muted\">\n <div className=\"flex h-12 w-12 items-center justify-center rounded-2xl bg-muted/30 mb-3\">\n <BookOpen className=\"h-5 w-5 text-muted-foreground/40\" />\n </div>\n <p className=\"text-sm text-muted-foreground\">{t('inventory.recipes.noRecipes')}</p>\n <p className=\"text-[10px] text-muted-foreground/60 mt-0.5\">{t('inventory.recipes.recipesDesc')}</p>\n {onNew && <button onClick={onNew} className=\"text-xs text-primary hover:underline mt-2\">{t('inventory.recipes.createFirst')}</button>}\n </div>\n ) : (\n <div className=\"grid gap-3 sm:grid-cols-2 lg:grid-cols-3\">\n {recipes.map((r) => (\n <div\n key={r.id}\n onClick={() => onView?.(r.id)}\n className=\"rounded-lg border bg-card p-4 hover:shadow-sm hover:border-primary/20 transition-all cursor-pointer group\"\n >\n <div className=\"flex items-center gap-3\">\n <div className=\"flex h-9 w-9 items-center justify-center rounded-lg bg-primary/10 text-primary shrink-0 group-hover:bg-primary/15 transition-colors\">\n <BookOpen className=\"h-4 w-4\" />\n </div>\n <div className=\"min-w-0\">\n <h3 className=\"text-sm font-semibold truncate\">{r.name}</h3>\n {r.productName && <p className=\"text-[10px] text-muted-foreground truncate\">{t('inventory.recipes.produces')} {r.productName}</p>}\n </div>\n </div>\n {r.description && (\n <p className=\"text-xs text-muted-foreground mt-2 line-clamp-2\">{r.description}</p>\n )}\n <div className=\"flex items-center gap-4 mt-3 pt-2.5 border-t\">\n {r.ingredientCount != null && (\n <span className=\"inline-flex items-center gap-1 text-[10px] text-muted-foreground\">\n <Layers className=\"h-3 w-3\" /> {t('inventory.recipes.ingredients', { count: String(r.ingredientCount) })}\n </span>\n )}\n {r.preparationTimeMinutes != null && (\n <span className=\"inline-flex items-center gap-1 text-[10px] text-muted-foreground\">\n <Clock className=\"h-3 w-3\" /> {r.preparationTimeMinutes} min\n </span>\n )}\n {r.yieldQuantity > 0 && (\n <span className=\"text-[10px] text-muted-foreground ml-auto\">\n {t('inventory.recipes.yield')} {r.yieldQuantity}{r.yieldUnitName ? ` ${r.yieldUnitName}` : ''}\n </span>\n )}\n </div>\n </div>\n ))}\n </div>\n )}\n </div>\n )\n}\n","import React, { useState } from 'react'\nimport { Plus, Trash2, GripVertical } from 'lucide-react'\nimport { useInventoryStore, useInventoryProvider } from '../InventoryContext'\nimport { toast } from '@fayz-ai/ui'\nimport { SubpageHeader, useSaveBar } from '@fayz-ai/ui'\nimport { useTranslation } from '@fayz-ai/core'\nimport { SearchSelect } from '@fayz-ai/ui'\nimport type { CreateRecipeIngredientInput } from '../types'\n\ninterface FormIngredient {\n _id: string\n productId: string\n productName: string\n quantity: number\n unitId: string\n unitName: string\n notes: string\n}\n\nlet fid = 1\nfunction nextId() { return `ri${fid++}` }\n\nexport function RecipeFormView({ onSaved }: { onSaved?: (id?: string) => void }) {\n const t = useTranslation()\n const provider = useInventoryProvider()\n const createRecipe = useInventoryStore((s) => s.createRecipe)\n\n const [name, setName] = useState('')\n const [description, setDescription] = useState('')\n const [productId, setProductId] = useState('')\n const [productName, setProductName] = useState('')\n const [yieldQuantity, setYieldQuantity] = useState(1)\n const [prepTime, setPrepTime] = useState('')\n const [instructions, setInstructions] = useState('')\n const [ingredients, setIngredients] = useState<FormIngredient[]>([])\n const [saving, setSaving] = useState(false)\n\n function addIngredient() {\n setIngredients([...ingredients, { _id: nextId(), productId: '', productName: '', quantity: 1, unitId: '', unitName: '', notes: '' }])\n }\n\n function updateIngredient(id: string, data: Partial<FormIngredient>) {\n setIngredients(ingredients.map((ing) => ing._id === id ? { ...ing, ...data } : ing))\n }\n\n function removeIngredient(id: string) {\n setIngredients(ingredients.filter((ing) => ing._id !== id))\n }\n\n async function handleSave() {\n if (!name.trim() || !productId || ingredients.length === 0) { toast.error(t('common.formIncomplete')); return }\n setSaving(true)\n try {\n const recipe = await createRecipe({\n name,\n description: description || undefined,\n productId,\n yieldQuantity,\n preparationTimeMinutes: prepTime ? parseInt(prepTime) : undefined,\n instructions: instructions || undefined,\n ingredients: ingredients.filter((i) => i.productId).map((i, idx) => ({\n productId: i.productId,\n quantity: i.quantity,\n unitId: i.unitId || undefined,\n displayOrder: idx,\n notes: i.notes || undefined,\n })),\n })\n onSaved?.(recipe.id)\n } finally { setSaving(false) }\n }\n\n const dirty = !!(name || description || productId || prepTime || instructions || ingredients.length > 0 || yieldQuantity !== 1)\n useSaveBar({\n dirty,\n saving,\n onSave: () => { void handleSave() },\n onDiscard: () => onSaved?.(),\n saveLabel: t('inventory.recipeForm.saveRecipe'),\n })\n\n async function searchProducts(query: string) {\n const result = await provider.getProducts({ search: query, pageSize: 10 })\n return result.data.map((p) => ({ id: p.id, label: p.name, subtitle: p.sku ?? p.productType, data: p }))\n }\n\n async function quickCreateProduct(name: string, type: 'ingredient' | 'sale' = 'ingredient') {\n try {\n const product = await provider.createProduct({ name, productType: type })\n toast.success(`Product \"${name}\" created`)\n return product\n } catch {\n toast.error('Failed to create product')\n return null\n }\n }\n\n return (\n <div className=\"space-y-5\">\n <SubpageHeader\n title={t('inventory.recipeForm.newRecipe')}\n subtitle={t('inventory.recipeForm.subtitle')}\n onBack={() => onSaved?.()}\n parentLabel={t('inventory.nav.recipes')}\n />\n\n <div className=\"grid gap-4 lg:grid-cols-3\">\n {/* Left: Recipe details */}\n <div className=\"rounded-lg border bg-card shadow-sm p-5 space-y-4\">\n <h3 className=\"text-sm font-semibold\">{t('inventory.recipeForm.recipeDetails')}</h3>\n\n <div>\n <label className=\"text-xs font-medium text-muted-foreground\">{t('inventory.recipeForm.recipeName')} *</label>\n <input type=\"text\" value={name} onChange={(e) => setName(e.target.value)} placeholder={t('inventory.recipeForm.recipeNamePlaceholder')} autoFocus className=\"w-full mt-1 rounded-input border border-input bg-card shadow-[inset_0_1px_0_rgb(0_0_0_/0.06)] px-3 py-2 text-sm focus:outline-none focus:ring-2 focus:ring-ring\" />\n </div>\n\n <div>\n <label className=\"text-xs font-medium text-muted-foreground\">{t('inventory.recipeForm.description')}</label>\n <textarea value={description} onChange={(e) => setDescription(e.target.value)} rows={2} placeholder={t('inventory.recipeForm.descriptionPlaceholder')} className=\"w-full mt-1 rounded-input border border-input bg-card shadow-[inset_0_1px_0_rgb(0_0_0_/0.06)] px-3 py-2 text-sm focus:outline-none focus:ring-2 focus:ring-ring resize-none\" />\n </div>\n\n <SearchSelect\n label={`${t('inventory.recipeForm.produces')} *`}\n value={productId}\n displayValue={productName}\n onChange={(id, opt) => { setProductId(id); setProductName(opt?.label ?? '') }}\n onSearch={searchProducts}\n placeholder={t('inventory.recipeForm.searchProduct')}\n allowCreate\n createLabel={t('inventory.recipeForm.createProduct')}\n onCreate={async (q) => {\n const p = await quickCreateProduct(q, 'sale')\n if (p) { setProductId(p.id); setProductName(p.name) }\n }}\n />\n\n <div className=\"grid grid-cols-2 gap-3\">\n <div>\n <label className=\"text-xs font-medium text-muted-foreground\">{t('inventory.recipeForm.yieldQuantity')}</label>\n <input type=\"number\" min={0.01} step={0.01} value={yieldQuantity} onChange={(e) => setYieldQuantity(Number(e.target.value) || 1)} className=\"w-full mt-1 rounded-input border border-input bg-card shadow-[inset_0_1px_0_rgb(0_0_0_/0.06)] px-3 py-2 text-sm focus:outline-none focus:ring-2 focus:ring-ring\" />\n </div>\n <div>\n <label className=\"text-xs font-medium text-muted-foreground\">{t('inventory.recipeForm.prepTime')}</label>\n <input type=\"number\" min={0} value={prepTime} onChange={(e) => setPrepTime(e.target.value)} placeholder=\"—\" className=\"w-full mt-1 rounded-input border border-input bg-card shadow-[inset_0_1px_0_rgb(0_0_0_/0.06)] px-3 py-2 text-sm focus:outline-none focus:ring-2 focus:ring-ring\" />\n </div>\n </div>\n\n <div>\n <label className=\"text-xs font-medium text-muted-foreground\">{t('inventory.recipeForm.instructions')}</label>\n <textarea value={instructions} onChange={(e) => setInstructions(e.target.value)} rows={4} placeholder={t('inventory.recipeForm.instructionsPlaceholder')} className=\"w-full mt-1 rounded-input border border-input bg-card shadow-[inset_0_1px_0_rgb(0_0_0_/0.06)] px-3 py-2 text-sm focus:outline-none focus:ring-2 focus:ring-ring resize-none\" />\n </div>\n </div>\n\n {/* Right: Ingredients */}\n <div className=\"lg:col-span-2 rounded-lg border bg-card shadow-sm overflow-hidden flex flex-col\">\n <div className=\"flex items-center justify-between px-4 py-3 border-b\">\n <h3 className=\"text-sm font-semibold\">{t('inventory.recipeForm.ingredients')}</h3>\n <button onClick={addIngredient} className=\"inline-flex items-center gap-1.5 rounded-lg bg-primary border border-primary px-3 py-1.5 text-xs font-medium text-primary-foreground hover:bg-primary/90 shadow-button-primary active:shadow-button-inset transition-colors\">\n <Plus className=\"h-3 w-3\" /> {t('inventory.recipeForm.addIngredient')}\n </button>\n </div>\n\n <div className=\"flex-1\">\n {ingredients.length === 0 ? (\n <div className=\"py-12 text-center\">\n <p className=\"text-sm text-muted-foreground\">{t('inventory.recipeForm.noIngredients')}</p>\n <button onClick={addIngredient} className=\"text-xs text-primary hover:underline mt-1\">{t('inventory.recipeForm.addFirstIngredient')}</button>\n </div>\n ) : (\n <div className=\"divide-y\">\n {/* Header */}\n <div className=\"grid grid-cols-12 gap-2 px-4 py-2 text-[10px] font-medium text-muted-foreground uppercase tracking-wider bg-muted/20\">\n <div className=\"col-span-5\">{t('inventory.recipeForm.ingredient')}</div>\n <div className=\"col-span-2\">{t('inventory.recipeForm.quantity')}</div>\n <div className=\"col-span-4\">{t('inventory.recipeForm.notes')}</div>\n <div className=\"col-span-1\" />\n </div>\n {ingredients.map((ing, idx) => (\n <div key={ing._id} className=\"grid grid-cols-12 gap-2 px-4 py-2.5 items-center group\">\n <div className=\"col-span-5\">\n <SearchSelect\n value={ing.productId}\n displayValue={ing.productName}\n onChange={(id, opt) => updateIngredient(ing._id, { productId: id, productName: opt?.label ?? '' })}\n onSearch={searchProducts}\n placeholder={t('inventory.recipeForm.searchIngredient')}\n allowCreate\n createLabel={t('inventory.recipeForm.createIngredient')}\n onCreate={async (q) => {\n const p = await quickCreateProduct(q, 'ingredient')\n if (p) updateIngredient(ing._id, { productId: p.id, productName: p.name })\n }}\n />\n </div>\n <div className=\"col-span-2\">\n <input\n type=\"number\"\n min={0.01}\n step={0.01}\n value={ing.quantity}\n onChange={(e) => updateIngredient(ing._id, { quantity: Number(e.target.value) || 0 })}\n className=\"w-full rounded-input border border-input bg-card shadow-[inset_0_1px_0_rgb(0_0_0_/0.06)] px-2 py-1.5 text-sm focus:outline-none focus:ring-2 focus:ring-ring\"\n />\n </div>\n <div className=\"col-span-4\">\n <input\n type=\"text\"\n value={ing.notes}\n onChange={(e) => updateIngredient(ing._id, { notes: e.target.value })}\n placeholder={t('inventory.recipeForm.notesPlaceholder')}\n className=\"w-full rounded-input border border-input bg-card shadow-[inset_0_1px_0_rgb(0_0_0_/0.06)] px-2 py-1.5 text-sm focus:outline-none focus:ring-2 focus:ring-ring\"\n />\n </div>\n <div className=\"col-span-1 flex justify-end\">\n <button onClick={() => removeIngredient(ing._id)} className=\"p-1 text-muted-foreground opacity-0 group-hover:opacity-100 hover:text-destructive transition-all\">\n <Trash2 className=\"h-3.5 w-3.5\" />\n </button>\n </div>\n </div>\n ))}\n </div>\n )}\n </div>\n\n {/* Footer */}\n {ingredients.length > 0 && (\n <div className=\"px-4 py-3 border-t bg-muted/20 text-xs text-muted-foreground\">\n {t('inventory.recipeForm.ingredientsConfigured', { configured: String(ingredients.filter((i) => i.productId).length), total: String(ingredients.length) })}\n </div>\n )}\n </div>\n </div>\n </div>\n )\n}\n","import React, { useEffect, useState } from 'react'\nimport { BookOpen, Clock, Layers, Package } from 'lucide-react'\nimport type { ColumnDef } from '@tanstack/react-table'\nimport { useInventoryProvider } from '../InventoryContext'\nimport { useTranslation } from '@fayz-ai/core'\nimport { Breadcrumb, DataTable } from '@fayz-ai/ui'\nimport type { Recipe, RecipeIngredient } from '../types'\n\nfunction DetailSkeleton() {\n return (\n <div className=\"space-y-5\">\n <div className=\"flex items-center gap-3\">\n <div className=\"h-12 w-12 rounded-xl bg-muted/40 animate-pulse\" />\n <div className=\"space-y-2 flex-1\">\n <div className=\"h-5 w-40 rounded bg-muted/40 animate-pulse\" />\n <div className=\"h-3 w-24 rounded bg-muted/30 animate-pulse\" />\n </div>\n </div>\n <div className=\"rounded-xl border divide-y\">\n {[1, 2, 3].map((i) => (\n <div key={i} className=\"flex items-center gap-3 px-4 py-3\">\n <div className=\"h-3 w-20 rounded bg-muted/30 animate-pulse\" />\n <div className=\"flex-1\" />\n <div className=\"h-3 w-16 rounded bg-muted/40 animate-pulse\" />\n </div>\n ))}\n </div>\n <div className=\"rounded-xl border p-4 space-y-2\">\n {[1, 2, 3, 4].map((i) => (\n <div key={i} className=\"flex items-center gap-3\">\n <div className=\"h-3.5 w-6 rounded bg-muted/30 animate-pulse\" />\n <div className=\"h-3.5 flex-1 rounded bg-muted/30 animate-pulse\" />\n <div className=\"h-3.5 w-12 rounded bg-muted/40 animate-pulse\" />\n </div>\n ))}\n </div>\n </div>\n )\n}\n\nexport function RecipeDetailView({ recipeId, onBack }: { recipeId: string; onBack: () => void }) {\n const t = useTranslation()\n const provider = useInventoryProvider()\n const [recipe, setRecipe] = useState<Recipe | null>(null)\n const [ingredients, setIngredients] = useState<RecipeIngredient[]>([])\n const [loading, setLoading] = useState(true)\n\n useEffect(() => {\n setLoading(true)\n Promise.all([\n provider.getRecipeById(recipeId),\n provider.getRecipeIngredients(recipeId),\n ]).then(([r, ings]) => {\n setRecipe(r)\n setIngredients(ings.sort((a, b) => a.displayOrder - b.displayOrder))\n setLoading(false)\n })\n }, [recipeId])\n\n if (loading) {\n return (\n <div className=\"space-y-6\">\n <Breadcrumb parent={t('inventory.nav.recipes')} current={t('inventory.recipeDetail.loading')} onBack={onBack} />\n <DetailSkeleton />\n </div>\n )\n }\n\n if (!recipe) {\n return (\n <div className=\"space-y-6\">\n <Breadcrumb parent={t('inventory.nav.recipes')} 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 <BookOpen className=\"h-8 w-8 text-muted-foreground/30 mb-2\" />\n <p className=\"text-sm text-muted-foreground\">{t('inventory.recipeDetail.notFound')}</p>\n <button onClick={onBack} className=\"text-xs text-primary hover:underline mt-1\">{t('inventory.recipeDetail.backToList')}</button>\n </div>\n </div>\n )\n }\n\n const ingredientColumns: ColumnDef<RecipeIngredient, any>[] = [\n {\n id: 'index', header: '#',\n cell: ({ row }) => <span className=\"text-xs text-muted-foreground\">{row.index + 1}</span>,\n },\n {\n accessorKey: 'productName', header: t('inventory.recipeDetail.ingredient'),\n cell: ({ getValue }) => <span className=\"font-medium\">{(getValue() as string) || '—'}</span>,\n },\n {\n accessorKey: 'quantity', header: () => <span className=\"block text-right\">{t('inventory.recipeDetail.quantity')}</span>,\n cell: ({ getValue }) => <span className=\"block text-right tabular-nums\">{getValue() as number}</span>,\n },\n {\n accessorKey: 'unitName', header: t('inventory.recipeDetail.unit'),\n cell: ({ getValue }) => <span className=\"text-xs text-muted-foreground\">{(getValue() as string) || '—'}</span>,\n },\n {\n accessorKey: 'notes', header: t('inventory.recipeDetail.notes'),\n cell: ({ getValue }) => <span className=\"text-xs text-muted-foreground\">{(getValue() as string) || '—'}</span>,\n },\n ]\n\n return (\n <div className=\"space-y-6\">\n {/* Breadcrumb */}\n <Breadcrumb parent={t('inventory.nav.recipes')} current={recipe.name} onBack={onBack} />\n\n {/* Hero */}\n <div className=\"flex items-start gap-4\">\n <div className=\"flex h-14 w-14 shrink-0 items-center justify-center rounded-2xl bg-primary/10 text-primary\">\n <BookOpen className=\"h-6 w-6\" />\n </div>\n <div className=\"flex-1 min-w-0\">\n <h1 className=\"text-2xl font-bold text-foreground\">{recipe.name}</h1>\n {recipe.description && <p className=\"text-muted-foreground mt-0.5 text-sm\">{recipe.description}</p>}\n <div className=\"flex items-center gap-3 mt-2\">\n {recipe.isActive ? (\n <span className=\"inline-flex items-center gap-1 text-[10px] text-success\"><span className=\"h-1.5 w-1.5 rounded-full bg-success\" /> {t('inventory.recipeDetail.active')}</span>\n ) : (\n <span className=\"inline-flex items-center gap-1 text-[10px] text-muted-foreground/50\"><span className=\"h-1.5 w-1.5 rounded-full bg-muted-foreground/30\" /> {t('inventory.recipeDetail.inactive')}</span>\n )}\n </div>\n </div>\n </div>\n\n <div className=\"border-t\" />\n\n <div className=\"grid gap-4 lg:grid-cols-3\">\n {/* Left: Info */}\n <div className=\"space-y-4\">\n {/* Metrics */}\n <div className=\"rounded-xl border divide-y\">\n {recipe.productName && (\n <div className=\"flex items-center gap-3 px-4 py-3\">\n <Package className=\"h-4 w-4 text-muted-foreground shrink-0\" />\n <span className=\"text-xs text-muted-foreground flex-1\">{t('inventory.recipeDetail.produces')}</span>\n <span className=\"text-sm font-medium\">{recipe.productName}</span>\n </div>\n )}\n <div className=\"flex items-center gap-3 px-4 py-3\">\n <Layers className=\"h-4 w-4 text-muted-foreground shrink-0\" />\n <span className=\"text-xs text-muted-foreground flex-1\">{t('inventory.recipeDetail.yield')}</span>\n <span className=\"text-sm font-medium\">{recipe.yieldQuantity}{recipe.yieldUnitName ? ` ${recipe.yieldUnitName}` : ''}</span>\n </div>\n {recipe.preparationTimeMinutes != null && (\n <div className=\"flex items-center gap-3 px-4 py-3\">\n <Clock className=\"h-4 w-4 text-muted-foreground shrink-0\" />\n <span className=\"text-xs text-muted-foreground flex-1\">{t('inventory.recipeDetail.prepTime')}</span>\n <span className=\"text-sm font-medium\">{recipe.preparationTimeMinutes} min</span>\n </div>\n )}\n <div className=\"flex items-center gap-3 px-4 py-3\">\n <Layers className=\"h-4 w-4 text-muted-foreground shrink-0\" />\n <span className=\"text-xs text-muted-foreground flex-1\">{t('inventory.recipeDetail.ingredientCount')}</span>\n <span className=\"text-sm font-medium\">{ingredients.length}</span>\n </div>\n </div>\n\n {/* Instructions */}\n {recipe.instructions && (\n <div>\n <h3 className=\"text-sm font-semibold text-foreground mb-1\">{t('inventory.recipeDetail.instructions')}</h3>\n <div className=\"rounded-xl border bg-card shadow-sm px-4 py-3\">\n <p className=\"text-xs text-muted-foreground whitespace-pre-wrap leading-relaxed\">{recipe.instructions}</p>\n </div>\n </div>\n )}\n\n {/* Dates */}\n <div className=\"flex items-center gap-4 text-[10px] text-muted-foreground/50\">\n <span>{t('inventory.recipeDetail.created')} {recipe.createdAt?.slice(0, 10)}</span>\n <span>{t('inventory.recipeDetail.updated')} {recipe.updatedAt?.slice(0, 10)}</span>\n </div>\n </div>\n\n {/* Right: Ingredients table */}\n <div className=\"lg:col-span-2\">\n <h3 className=\"text-sm font-semibold text-foreground mb-2\">{t('inventory.recipeDetail.ingredientsTitle')}</h3>\n {ingredients.length === 0 ? (\n <div className=\"rounded-xl border p-8 text-center\">\n <p className=\"text-xs text-muted-foreground\">{t('inventory.recipeDetail.noIngredients')}</p>\n </div>\n ) : (\n <DataTable columns={ingredientColumns} data={ingredients} variant=\"card\" />\n )}\n </div>\n </div>\n </div>\n )\n}\n","import React from 'react'\nimport { SettingsGroup, ToggleRow } from '@fayz-ai/saas'\nimport { useTranslation } from '@fayz-ai/core'\n\nexport function InventoryGeneralSettings() {\n const t = useTranslation()\n return (\n <div className=\"space-y-4\">\n <SettingsGroup title={t('inventory.settings.stockManagement')} description={t('inventory.settings.stockManagementDesc')}>\n <ToggleRow label={t('inventory.settings.lowStockAlerts')} description={t('inventory.settings.lowStockAlertsDesc')} checked={true} onChange={() => {}} />\n <ToggleRow label={t('inventory.settings.requireReason')} description={t('inventory.settings.requireReasonDesc')} checked={true} onChange={() => {}} />\n <ToggleRow label={t('inventory.settings.autoDeduct')} description={t('inventory.settings.autoDeductDesc')} checked={false} onChange={() => {}} />\n </SettingsGroup>\n\n <SettingsGroup title={t('inventory.settings.products')} description={t('inventory.settings.productsDesc')}>\n <ToggleRow label={t('inventory.settings.requireSku')} description={t('inventory.settings.requireSkuDesc')} checked={false} onChange={() => {}} />\n <ToggleRow label={t('inventory.settings.allowNegative')} description={t('inventory.settings.allowNegativeDesc')} checked={false} onChange={() => {}} />\n </SettingsGroup>\n\n <SettingsGroup title={t('inventory.settings.notifications')} description={t('inventory.settings.notificationsDesc')}>\n <ToggleRow label={t('inventory.settings.lowStockEmail')} description={t('inventory.settings.lowStockEmailDesc')} checked={false} onChange={() => {}} />\n <ToggleRow label={t('inventory.settings.expiryWarnings')} description={t('inventory.settings.expiryWarningsDesc')} checked={true} onChange={() => {}} />\n </SettingsGroup>\n </div>\n )\n}\n","import React, { useState } from 'react'\nimport { Package, Ruler, MapPin, ChevronRight, Check } 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 }) {\n const t = useTranslation()\n const [step, setStep] = useState(0)\n const current = STEPS[step]\n const isLast = step === STEPS.length - 1\n const Icon = current.icon\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={onComplete}>\n <Check className=\"h-4 w-4\" /> {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 onClick={onComplete} className=\"text-xs text-muted-foreground hover:text-foreground transition-colors\">\n {t('inventory.onboarding.skip')}\n </button>\n )}\n </div>\n </div>\n </div>\n )\n}\n","import React, { useState, useMemo } from 'react'\nimport type { StoreApi } from 'zustand/vanilla'\nimport { ModulePage, PageTransition, type ModuleNavItem } from '@fayz-ai/ui'\nimport { InventoryContextProvider, type ResolvedInventoryConfig } from './InventoryContext'\nimport type { InventoryDataProvider } from './data/types'\nimport type { InventoryUIState } from './store'\nimport type { PluginRegistryDef, PluginQuickAction } from '@fayz-ai/core'\nimport { useModuleNavigation, ModuleActionBar, createViewRouter } from '@fayz-ai/saas'\nimport { useTranslation } from '@fayz-ai/core'\nimport { DashboardView } from './views/DashboardView'\nimport { ProductListView } from './views/ProductListView'\nimport { ProductFormView } from './views/ProductFormView'\nimport { StockMovementView } from './views/StockMovementView'\nimport { MovementHistoryView } from './views/MovementHistoryView'\nimport { RecipesView } from './views/RecipesView'\nimport { RecipeFormView } from './views/RecipeFormView'\nimport { RecipeDetailView } from './views/RecipeDetailView'\nimport { InventoryGeneralSettings } from './components/InventoryGeneralSettings'\nimport { InventoryOnboarding } from './components/InventoryOnboarding'\n\nfunction buildNav(config: ResolvedInventoryConfig, view: string, navigate: (v: string) => void, t: (key: string) => string): ModuleNavItem[] {\n const items: ModuleNavItem[] = [\n { id: 'dashboard', label: t('inventory.nav.dashboard'), icon: 'BarChart3', active: view === 'dashboard', onClick: () => navigate('dashboard') },\n {\n id: 'products', label: t('inventory.nav.products'), icon: 'Package', active: view.startsWith('products'),\n children: [\n { id: 'products-new', label: t('inventory.nav.new'), active: view === 'products-new', onClick: () => navigate('products-new') },\n { id: 'products-list', label: t('inventory.nav.list'), active: view === 'products-list', onClick: () => navigate('products-list') },\n ],\n },\n {\n id: 'stock', label: t('inventory.nav.stock'), icon: 'ArrowUpCircle',\n children: [\n { id: 'stock-entry', label: t('inventory.nav.entry'), active: view === 'stock-entry', onClick: () => navigate('stock-entry') },\n { id: 'stock-exit', label: t('inventory.nav.exit'), active: view === 'stock-exit', onClick: () => navigate('stock-exit') },\n { id: 'stock-history', label: t('inventory.nav.history'), active: view === 'stock-history', onClick: () => navigate('stock-history') },\n ],\n },\n ]\n\n if (config.modules.recipes) {\n items.push({\n id: 'recipes', label: config.labels.recipes, icon: 'BookOpen',\n children: [\n { id: 'recipes-list', label: config.labels.recipesList, active: view === 'recipes-list' || view.startsWith('recipes-detail:'), onClick: () => navigate('recipes-list') },\n { id: 'recipes-new', label: config.labels.recipesNew, active: view === 'recipes-new', onClick: () => navigate('recipes-new') },\n ],\n })\n }\n\n return items\n}\n\nexport function InventoryPage({ config, provider, store, registries }: {\n config: ResolvedInventoryConfig\n provider: InventoryDataProvider\n store: StoreApi<InventoryUIState>\n registries?: PluginRegistryDef[]\n}) {\n const t = useTranslation()\n const { view, direction, navigate } = useModuleNavigation('/inventory', {\n dashboard: 0,\n 'products-list': 0, 'products-new': 1,\n 'stock-entry': 1, 'stock-exit': 1, 'stock-history': 0,\n 'recipes-list': 0, 'recipes-new': 1, 'recipes-detail': 1,\n settings: 1,\n }, 'dashboard')\n\n const [onboardingComplete, setOnboardingComplete] = useState(() => {\n try { return localStorage.getItem('saas-core:inventory-onboarded') === 'true' } catch { return false }\n })\n\n const isSettings = view === 'settings'\n const isSummary = view === 'dashboard' || view === ''\n const nav = buildNav(config, view, navigate, t)\n\n const quickActions = useMemo<PluginQuickAction[]>(() => {\n const actions: PluginQuickAction[] = [\n {\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 },\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 (!onboardingComplete) {\n return (\n <InventoryContextProvider config={config} provider={provider} store={store}>\n <InventoryOnboarding onComplete={() => { setOnboardingComplete(true); try { localStorage.setItem('saas-core:inventory-onboarded', 'true') } catch {} }} />\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 <InventoryGeneralSettings />\n </div>\n </PageTransition>\n </InventoryContextProvider>\n )\n }\n\n const renderView = createViewRouter([\n { id: 'products-list', render: () => <ProductListView onNew={() => navigate('products-new')} onEdit={(id) => navigate(`products-edit:${id}`)} /> },\n { id: 'products-new', render: () => <ProductFormView onSaved={() => navigate('products-list')} /> },\n { id: 'products-edit', render: ({ id }) => <ProductFormView editId={id!} onSaved={() => navigate('products-list')} /> },\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}`)} /> },\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 { id: 'recipes-list', render: () => <RecipesView onNew={() => navigate('recipes-new')} onView={(id) => navigate(`recipes-detail:${id}`)} /> },\n { id: 'recipes-new', render: () => <RecipeFormView onSaved={(id) => id ? navigate(`recipes-detail:${id}`) : navigate('recipes-list')} /> },\n { id: 'recipes-detail', render: ({ id }) => <RecipeDetailView recipeId={id!} onBack={() => navigate('recipes-list')} /> },\n { id: 'dashboard', render: () => <DashboardView /> },\n ], 'dashboard')\n\n return (\n <InventoryContextProvider config={config} provider={provider} store={store}>\n <ModulePage\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 settingsLabel=\"Inventory Settings\"\n />\n }\n >\n {renderView(view)}\n </ModulePage>\n </InventoryContextProvider>\n )\n}\n","import React, { useEffect } from 'react'\nimport { ArrowUpRight, ArrowDownRight } from 'lucide-react'\nimport type { StoreApi } from 'zustand'\nimport type { DashboardWidgetDef } from '@fayz-ai/core'\nimport { useTranslation } from '@fayz-ai/core'\nimport {\n KpiCard, Card, CardHeader, CardTitle, CardContent,\n defineKpiWidget, defineCustomWidget,\n} from '@fayz-ai/ui'\nimport { InventoryContextProvider, useInventoryConfig, useInventoryStore, formatCurrency, type ResolvedInventoryConfig } from '../InventoryContext'\nimport type { InventoryDataProvider } from '../data/types'\nimport type { InventoryUIState } from '../store'\n\nfunction useEnsureSummary() {\n const fetchSummary = useInventoryStore((s) => s.fetchSummary)\n useEffect(() => { void fetchSummary() }, [])\n}\n\nfunction StockValueKpi() {\n const t = useTranslation()\n const { currency } = useInventoryConfig()\n const summary = useInventoryStore((s) => s.summary)\n useEnsureSummary()\n return (\n <KpiCard label={t('inventory.dashboard.stockValue')} icon=\"BarChart3\"\n value={formatCurrency(summary?.totalStockValue ?? 0, currency)} sub={t('inventory.dashboard.totalValue')} />\n )\n}\n\nfunction TotalProductsKpi() {\n const t = useTranslation()\n const summary = useInventoryStore((s) => s.summary)\n useEnsureSummary()\n return <KpiCard label={t('inventory.dashboard.totalProducts')} icon=\"Package\" value={String(summary?.totalProducts ?? 0)} sub={t('inventory.dashboard.activeItems')} />\n}\n\nfunction LowStockKpi() {\n const t = useTranslation()\n const summary = useInventoryStore((s) => s.summary)\n useEnsureSummary()\n return <KpiCard label={t('inventory.dashboard.lowStock')} icon=\"AlertTriangle\" value={String(summary?.lowStockCount ?? 0)} sub={t('inventory.dashboard.belowMinimum')} />\n}\n\nfunction OutOfStockKpi() {\n const t = useTranslation()\n const summary = useInventoryStore((s) => s.summary)\n useEnsureSummary()\n return <KpiCard label={t('inventory.dashboard.outOfStock')} icon=\"TrendingDown\" value={String(summary?.outOfStockCount ?? 0)} sub={t('inventory.dashboard.needRestocking')} />\n}\n\nfunction RecentActivityPanel() {\n const t = useTranslation()\n const summary = useInventoryStore((s) => s.summary)\n useEnsureSummary()\n return (\n <Card>\n <CardHeader><CardTitle>{t('inventory.dashboard.recentActivity')}</CardTitle></CardHeader>\n <CardContent>\n <div className=\"flex items-center gap-4 text-sm\">\n <div className=\"flex items-center gap-1.5\">\n <ArrowUpRight className=\"h-3.5 w-3.5 text-success\" />\n <span className=\"text-muted-foreground\">{t('inventory.dashboard.entries')}</span>\n <span className=\"font-medium\">{summary?.movementsByType?.entry ?? 0}</span>\n </div>\n <div className=\"flex items-center gap-1.5\">\n <ArrowDownRight className=\"h-3.5 w-3.5 text-destructive\" />\n <span className=\"text-muted-foreground\">{t('inventory.dashboard.exits')}</span>\n <span className=\"font-medium\">{summary?.movementsByType?.exit ?? 0}</span>\n </div>\n </div>\n <p className=\"mt-2 text-xs text-muted-foreground\">{t('inventory.dashboard.last7Days')}</p>\n </CardContent>\n </Card>\n )\n}\n\nexport function createInventoryDashboardWidgets(ctx: {\n config: ResolvedInventoryConfig\n provider: InventoryDataProvider\n store: StoreApi<InventoryUIState>\n}): DashboardWidgetDef[] {\n const withCtx = (Inner: React.ComponentType): React.ComponentType<unknown> => {\n const Wrapped = () => (\n <InventoryContextProvider config={ctx.config} provider={ctx.provider} store={ctx.store}>\n <Inner />\n </InventoryContextProvider>\n )\n Wrapped.displayName = `InventoryWidget(${Inner.displayName ?? Inner.name})`\n return Wrapped\n }\n\n return [\n // Stock value is inventory's headline KPI on the global home; the rest are\n // home-hidden by default (shown on the inventory plugin-home, addable via Customize).\n defineKpiWidget({ id: 'inventory.kpi.stock-value', title: 'inventory.dashboard.stockValue', domain: 'inventory', defaultOrder: 0, component: withCtx(StockValueKpi) }),\n defineKpiWidget({ id: 'inventory.kpi.total-products', title: 'inventory.dashboard.totalProducts', domain: 'inventory', defaultOrder: 1, defaultVisible: false, component: withCtx(TotalProductsKpi) }),\n defineKpiWidget({ id: 'inventory.kpi.low-stock', title: 'inventory.dashboard.lowStock', domain: 'inventory', defaultOrder: 2, defaultVisible: false, component: withCtx(LowStockKpi) }),\n defineKpiWidget({ id: 'inventory.kpi.out-of-stock', title: 'inventory.dashboard.outOfStock', domain: 'inventory', defaultOrder: 3, defaultVisible: false, component: withCtx(OutOfStockKpi) }),\n defineCustomWidget({ id: 'inventory.panel.recent-activity', title: 'inventory.dashboard.recentActivity', domain: 'inventory', span: 2, defaultOrder: 10, surfaces: ['plugin-home'], component: withCtx(RecentActivityPanel) }),\n ]\n}\n","import type { InventoryDataProvider } from './types'\nimport type {\n Product, StockMovement, StockPosition, StockLocation,\n Recipe, RecipeIngredient,\n CreateProductInput, CreateStockMovementInput, CreateRecipeInput,\n ProductQuery, MovementQuery,\n PaginatedResult, InventorySummary, MovementType,\n} from '../types'\n\nlet nextId = 1\nfunction uid(): string { return String(nextId++) }\nfunction now(): string { return new Date().toISOString() }\nfunction today(): string { return new Date().toISOString().slice(0, 10) }\n\nfunction paginate<T>(items: T[], page?: number, pageSize?: number): PaginatedResult<T> {\n const p = page ?? 1\n const ps = pageSize ?? 50\n const start = (p - 1) * ps\n return { data: items.slice(start, start + ps), total: items.length }\n}\n\ninterface MockStore {\n products: Product[]\n movements: StockMovement[]\n positions: StockPosition[]\n locations: StockLocation[]\n recipes: Recipe[]\n recipeIngredients: RecipeIngredient[]\n}\n\nfunction createStore(): MockStore {\n return {\n products: [],\n movements: [],\n positions: [],\n locations: [\n { id: uid(), name: 'Main Storage', description: 'Primary storage area', isActive: true, tenantId: 'mock-tenant', createdAt: now(), updatedAt: now() },\n ],\n recipes: [],\n recipeIngredients: [],\n }\n}\n\nexport function createMockInventoryProvider(): InventoryDataProvider {\n const store = createStore()\n const tenantId = 'mock-tenant'\n\n const provider: InventoryDataProvider = {\n // --- Products ---\n async getProducts(query: ProductQuery): Promise<PaginatedResult<Product>> {\n let results = [...store.products]\n if (query.productType) results = results.filter((p) => p.productType === query.productType)\n if (query.categoryId) results = results.filter((p) => p.categoryId === query.categoryId)\n if (query.isActive !== undefined) results = results.filter((p) => p.isActive === query.isActive)\n if (query.lowStockOnly) results = results.filter((p) => p.currentQuantity <= p.minQuantity)\n if (query.search) {\n const s = query.search.toLowerCase()\n results = results.filter((p) => p.name.toLowerCase().includes(s) || p.sku?.toLowerCase().includes(s) || p.barcode?.includes(s))\n }\n results.sort((a, b) => b.createdAt.localeCompare(a.createdAt))\n return paginate(results, query.page, query.pageSize)\n },\n\n async getProductById(id: string): Promise<Product | null> {\n return store.products.find((p) => p.id === id) ?? null\n },\n\n async createProduct(input: CreateProductInput): Promise<Product> {\n const product: Product = {\n id: uid(),\n name: input.name,\n description: input.description,\n sku: input.sku,\n barcode: input.barcode,\n brand: input.brand,\n categoryId: input.categoryId,\n productType: input.productType,\n purpose: input.purpose,\n currentQuantity: 0,\n minQuantity: input.minQuantity ?? 0,\n maxQuantity: input.maxQuantity,\n costPrice: input.costPrice ?? 0,\n salePrice: input.salePrice,\n measurementUnitId: input.measurementUnitId,\n isActive: true,\n supplierId: input.supplierId,\n defaultLocationId: input.defaultLocationId,\n imageUrl: input.imageUrl,\n metadata: input.metadata,\n tenantId,\n createdAt: now(),\n updatedAt: now(),\n }\n store.products.push(product)\n return product\n },\n\n async updateProduct(id: string, data: Partial<Product>): Promise<Product> {\n const product = store.products.find((p) => p.id === id)\n if (!product) throw new Error(`Product ${id} not found`)\n Object.assign(product, data, { updatedAt: now() })\n return product\n },\n\n // --- Stock Movements ---\n async getMovements(query: MovementQuery): Promise<PaginatedResult<StockMovement>> {\n let results = [...store.movements]\n if (query.productId) results = results.filter((m) => m.productId === query.productId)\n if (query.movementType) {\n const types = Array.isArray(query.movementType) ? query.movementType : [query.movementType]\n results = results.filter((m) => types.includes(m.movementType))\n }\n if (query.stockLocationId) results = results.filter((m) => m.stockLocationId === query.stockLocationId)\n if (query.dateRange) {\n results = results.filter((m) => m.movementDate >= query.dateRange!.from && m.movementDate <= query.dateRange!.to)\n }\n if (query.search) {\n const s = query.search.toLowerCase()\n results = results.filter((m) => m.productName?.toLowerCase().includes(s) || m.notes?.toLowerCase().includes(s))\n }\n results.sort((a, b) => b.movementDate.localeCompare(a.movementDate))\n return paginate(results, query.page, query.pageSize)\n },\n\n async createMovement(input: CreateStockMovementInput): Promise<StockMovement> {\n const product = store.products.find((p) => p.id === input.productId)\n const location = input.stockLocationId ? store.locations.find((l) => l.id === input.stockLocationId) : undefined\n const unitCost = input.unitCost ?? product?.costPrice ?? 0\n\n const movement: StockMovement = {\n id: uid(),\n productId: input.productId,\n productName: product?.name,\n quantity: input.quantity,\n movementType: input.movementType,\n unitCost,\n totalCost: unitCost * input.quantity,\n stockLocationId: input.stockLocationId,\n stockLocationName: location?.name,\n destinationLocationId: input.destinationLocationId,\n supplierId: input.supplierId,\n documentNumber: input.documentNumber,\n reason: input.reason,\n notes: input.notes,\n movementDate: input.movementDate ?? today(),\n tenantId,\n createdAt: now(),\n }\n store.movements.push(movement)\n\n // Update product quantity\n if (product) {\n if (input.movementType === 'entry') product.currentQuantity += input.quantity\n else if (input.movementType === 'exit' || input.movementType === 'loss') product.currentQuantity -= input.quantity\n // adjustment sets absolute, transfer moves between locations\n product.updatedAt = now()\n }\n\n return movement\n },\n\n // --- Stock Positions ---\n async getPositions(productId: string): Promise<StockPosition[]> {\n return store.positions.filter((p) => p.productId === productId)\n },\n\n // --- Stock Locations ---\n async getLocations(): Promise<StockLocation[]> {\n return store.locations.filter((l) => l.isActive)\n },\n\n async createLocation(data): Promise<StockLocation> {\n const location: StockLocation = {\n id: uid(),\n name: data.name,\n description: data.description,\n isActive: true,\n unitId: data.unitId,\n tenantId,\n createdAt: now(),\n updatedAt: now(),\n }\n store.locations.push(location)\n return location\n },\n\n // --- Recipes ---\n async getRecipes(): Promise<Recipe[]> {\n return store.recipes.filter((r) => r.isActive)\n },\n\n async getRecipeById(id: string): Promise<Recipe | null> {\n return store.recipes.find((r) => r.id === id) ?? null\n },\n\n async getRecipeIngredients(recipeId: string): Promise<RecipeIngredient[]> {\n return store.recipeIngredients.filter((ri) => ri.recipeId === recipeId).sort((a, b) => a.displayOrder - b.displayOrder)\n },\n\n async createRecipe(input: CreateRecipeInput): Promise<Recipe> {\n const product = store.products.find((p) => p.id === input.productId)\n const recipeId = uid()\n const recipe: Recipe = {\n id: recipeId,\n name: input.name,\n description: input.description,\n productId: input.productId,\n productName: product?.name,\n yieldQuantity: input.yieldQuantity,\n yieldUnitId: input.yieldUnitId,\n preparationTimeMinutes: input.preparationTimeMinutes,\n instructions: input.instructions,\n isActive: true,\n ingredientCount: input.ingredients.length,\n tenantId,\n createdAt: now(),\n updatedAt: now(),\n }\n store.recipes.push(recipe)\n\n for (const ing of input.ingredients) {\n const ingProduct = store.products.find((p) => p.id === ing.productId)\n store.recipeIngredients.push({\n id: uid(),\n recipeId,\n productId: ing.productId,\n productName: ingProduct?.name,\n quantity: ing.quantity,\n unitId: ing.unitId,\n displayOrder: ing.displayOrder ?? 0,\n notes: ing.notes,\n createdAt: now(),\n })\n }\n\n return recipe\n },\n\n // --- Summary ---\n async getSummary(): Promise<InventorySummary> {\n const active = store.products.filter((p) => p.isActive)\n const lowStock = active.filter((p) => p.currentQuantity <= p.minQuantity && p.currentQuantity > 0)\n const outOfStock = active.filter((p) => p.currentQuantity <= 0)\n const totalValue = active.reduce((sum, p) => sum + p.currentQuantity * p.costPrice, 0)\n\n const weekAgo = new Date()\n weekAgo.setDate(weekAgo.getDate() - 7)\n const weekAgoStr = weekAgo.toISOString().slice(0, 10)\n const recent = store.movements.filter((m) => m.movementDate >= weekAgoStr)\n\n const movementsByType: Record<MovementType, number> = { entry: 0, exit: 0, adjustment: 0, transfer: 0, loss: 0 }\n for (const m of recent) movementsByType[m.movementType]++\n\n return {\n totalProducts: active.length,\n lowStockCount: lowStock.length,\n outOfStockCount: outOfStock.length,\n totalStockValue: totalValue,\n recentMovementCount: recent.length,\n movementsByType,\n }\n },\n }\n\n return provider\n}\n","import type { InventoryDataProvider } from './types'\nimport type {\n Product, StockMovement, StockPosition, StockLocation,\n Recipe, RecipeIngredient,\n CreateProductInput, CreateStockMovementInput, CreateRecipeInput,\n ProductQuery, MovementQuery,\n PaginatedResult, InventorySummary, MovementType,\n} from '../types'\nimport { getSupabaseClientOptional, getActiveTenantId } from '@fayz-ai/core'\nimport { getInventoryTenantId } from '../lib/tenant'\n\nfunction getTenantId(): string | undefined {\n // Local override wins; else use the app's active tenant so writes pass RLS.\n return getInventoryTenantId() ?? getActiveTenantId()\n}\n\nfunction snakeToCamel(obj: Record<string, unknown>): Record<string, unknown> {\n const result: Record<string, unknown> = {}\n for (const [key, value] of Object.entries(obj)) {\n const camelKey = key.replace(/_([a-z])/g, (_, c) => c.toUpperCase())\n result[camelKey] = value\n }\n return result\n}\n\nfunction camelToSnake(obj: Record<string, unknown>): Record<string, unknown> {\n const result: Record<string, unknown> = {}\n for (const [key, value] of Object.entries(obj)) {\n if (key.startsWith('_')) continue\n const snakeKey = key.replace(/[A-Z]/g, (c) => `_${c.toLowerCase()}`)\n result[snakeKey] = value\n }\n return result\n}\n\n/** Map a saas_core.products row to our Product type */\nfunction mapProductRow(row: Record<string, any>): Product {\n const meta = row.metadata ?? {}\n return {\n id: row.id,\n name: row.name,\n description: row.description,\n sku: row.sku,\n barcode: meta.barcode,\n brand: meta.brand,\n productType: meta.productType ?? 'sale',\n currentQuantity: row.stock ?? 0,\n minQuantity: row.min_stock ?? 0,\n maxQuantity: meta.maxQuantity,\n costPrice: row.cost ?? 0,\n salePrice: row.price,\n isActive: row.is_active ?? true,\n imageUrl: row.image_url,\n metadata: meta,\n tenantId: row.tenant_id,\n createdAt: row.created_at,\n updatedAt: row.updated_at,\n }\n}\n\nexport function createSupabaseInventoryProvider(): InventoryDataProvider {\n // Lazy resolution — Supabase client may not exist at factory time\n // but will be available when methods are called (after createSaasApp initializes it)\n function getClients() {\n const supabase = getSupabaseClientOptional() as any\n if (!supabase) throw new Error('Supabase not initialized')\n return { core: supabase.schema('saas_core'), pub: supabase }\n }\n\n const provider: InventoryDataProvider = {\n // --- Products (saas_core.products) ---\n async getProducts(query: ProductQuery): Promise<PaginatedResult<Product>> {\n const { core, pub } = getClients()\n let qb = core.from('products').select('*', { count: 'exact' })\n if (query.search) qb = qb.ilike('name', `%${query.search}%`)\n if (query.isActive !== undefined) qb = qb.eq('is_active', query.isActive)\n if (query.lowStockOnly) qb = qb.lte('stock', 0) // simplified\n const page = query.page ?? 1\n const pageSize = query.pageSize ?? 50\n qb = qb.range((page - 1) * pageSize, page * pageSize - 1).order('created_at', { ascending: false })\n const { data, count } = await qb\n return { data: (data ?? []).map(mapProductRow), total: count ?? 0 }\n },\n\n async getProductById(id: string): Promise<Product | null> {\n const { core } = getClients()\n const { data } = await core.from('products').select('*').eq('id', id).single()\n return data ? mapProductRow(data) : null\n },\n\n async createProduct(input: CreateProductInput): Promise<Product> {\n const { core } = getClients()\n const tenantId = getTenantId()\n const row: Record<string, unknown> = {\n tenant_id: tenantId,\n name: input.name,\n description: input.description,\n sku: input.sku,\n price: input.salePrice ?? 0,\n cost: input.costPrice ?? 0,\n stock: 0,\n min_stock: input.minQuantity ?? 0,\n is_active: true,\n image_url: input.imageUrl,\n metadata: { productType: input.productType, barcode: input.barcode, brand: input.brand, maxQuantity: input.maxQuantity },\n }\n const { data, error } = await core.from('products').insert(row).select().single()\n if (error) throw new Error(error.message)\n return mapProductRow(data!)\n },\n\n async updateProduct(id: string, partial: Partial<Product>): Promise<Product> {\n const { core } = getClients()\n const row: Record<string, unknown> = {}\n if (partial.name !== undefined) row.name = partial.name\n if (partial.description !== undefined) row.description = partial.description\n if (partial.sku !== undefined) row.sku = partial.sku\n if (partial.salePrice !== undefined) row.price = partial.salePrice\n if (partial.costPrice !== undefined) row.cost = partial.costPrice\n if (partial.minQuantity !== undefined) row.min_stock = partial.minQuantity\n if (partial.isActive !== undefined) row.is_active = partial.isActive\n if (partial.imageUrl !== undefined) row.image_url = partial.imageUrl\n if (partial.productType !== undefined || partial.barcode !== undefined || partial.brand !== undefined) {\n row.metadata = { productType: partial.productType, barcode: partial.barcode, brand: partial.brand }\n }\n const { data, error } = await core.from('products').update(row).eq('id', id).select().single()\n if (error) throw new Error(error.message)\n return mapProductRow(data!)\n },\n\n // --- Stock Movements (via view with product join — single query) ---\n async getMovements(query: MovementQuery): Promise<PaginatedResult<StockMovement>> {\n const { pub } = getClients()\n // Single query via v_stock_movements view (JOINs with saas_core.products)\n let qb = pub.from('v_stock_movements').select('*', { count: 'exact' })\n if (query.productId) qb = qb.eq('product_id', query.productId)\n if (query.movementType) {\n const types = Array.isArray(query.movementType) ? query.movementType : [query.movementType]\n qb = qb.in('movement_type', types)\n }\n if (query.stockLocationId) qb = qb.eq('stock_location_id', query.stockLocationId)\n if (query.dateRange) qb = qb.gte('movement_date', query.dateRange.from).lte('movement_date', query.dateRange.to)\n if (query.search) qb = qb.ilike('product_name', `%${query.search}%`)\n const page = query.page ?? 1\n const pageSize = query.pageSize ?? 50\n qb = qb.range((page - 1) * pageSize, page * pageSize - 1).order('movement_date', { ascending: false })\n const { data, count } = await qb\n\n const movements = (data ?? []).map((r: any) => {\n const mov = snakeToCamel(r) as any\n mov.productName = r.product_name ?? mov.productName\n mov.productSku = r.product_sku ?? mov.productSku\n // View may include location names if the updated migration has been applied\n mov.stockLocationName = r.stock_location_name ?? mov.stockLocationName\n mov.destinationLocationName = r.destination_location_name ?? mov.destinationLocationName\n return mov as StockMovement\n })\n\n // Resolve location names if not provided by the view\n const needsLocationResolve = movements.some(\n (m: any) => (m.stockLocationId && !m.stockLocationName) || (m.destinationLocationId && !m.destinationLocationName)\n )\n if (needsLocationResolve) {\n const locationIds = new Set<string>()\n for (const m of movements) {\n if (m.stockLocationId && !m.stockLocationName) locationIds.add(m.stockLocationId)\n if (m.destinationLocationId && !m.destinationLocationName) locationIds.add(m.destinationLocationId)\n }\n if (locationIds.size > 0) {\n const { data: locs } = await pub.from('stock_locations').select('id, name').in('id', [...locationIds])\n const locMap = new Map((locs ?? []).map((l: any) => [l.id, l.name]))\n for (const m of movements) {\n if (m.stockLocationId && !m.stockLocationName) m.stockLocationName = locMap.get(m.stockLocationId)\n if (m.destinationLocationId && !m.destinationLocationName) m.destinationLocationName = locMap.get(m.destinationLocationId)\n }\n }\n }\n\n return { data: movements, total: count ?? 0 }\n },\n\n async createMovement(input: CreateStockMovementInput): Promise<StockMovement> {\n const { core, pub } = getClients()\n const tenantId = getTenantId()\n const unitCost = input.unitCost ?? 0\n const row = {\n ...camelToSnake(input as any),\n tenant_id: tenantId,\n unit_cost: unitCost,\n total_cost: unitCost * input.quantity,\n movement_date: input.movementDate ?? new Date().toISOString().slice(0, 10),\n }\n const { data, error } = await pub.from('stock_movements').insert(row).select().single()\n if (error) throw new Error(error.message)\n\n // Fetch product name + current stock for the response and stock update\n const { data: product } = await core.from('products').select('id, name, stock').eq('id', input.productId).single()\n\n // Update product stock\n if (product) {\n const delta = (input.movementType === 'entry') ? input.quantity : -(input.quantity)\n if (input.movementType !== 'adjustment' && input.movementType !== 'transfer') {\n await core.from('products').update({ stock: (product.stock ?? 0) + delta }).eq('id', input.productId)\n }\n }\n\n // Update stock_positions when a location is specified (best-effort — don't fail the movement)\n if (input.stockLocationId) {\n try {\n const posDelta = (input.movementType === 'entry') ? input.quantity : -(input.quantity)\n const { data: existing } = await pub.from('stock_positions')\n .select('id, quantity')\n .eq('product_id', input.productId)\n .eq('stock_location_id', input.stockLocationId)\n .maybeSingle()\n\n if (existing) {\n await pub.from('stock_positions')\n .update({ quantity: (existing.quantity ?? 0) + posDelta, unit_cost: input.unitCost ?? 0 })\n .eq('id', existing.id)\n } else {\n await pub.from('stock_positions').insert({\n tenant_id: tenantId,\n product_id: input.productId,\n stock_location_id: input.stockLocationId,\n quantity: Math.max(0, posDelta),\n unit_cost: input.unitCost ?? 0,\n batch_number: input.batchNumber ?? null,\n expiration_date: input.expirationDate ?? null,\n })\n }\n\n // For transfers, also update the destination position\n if (input.movementType === 'transfer' && input.destinationLocationId) {\n const { data: destExisting } = await pub.from('stock_positions')\n .select('id, quantity')\n .eq('product_id', input.productId)\n .eq('stock_location_id', input.destinationLocationId)\n .maybeSingle()\n\n if (destExisting) {\n await pub.from('stock_positions')\n .update({ quantity: (destExisting.quantity ?? 0) + input.quantity, unit_cost: input.unitCost ?? 0 })\n .eq('id', destExisting.id)\n } else {\n await pub.from('stock_positions').insert({\n tenant_id: tenantId,\n product_id: input.productId,\n stock_location_id: input.destinationLocationId,\n quantity: input.quantity,\n unit_cost: input.unitCost ?? 0,\n batch_number: input.batchNumber ?? null,\n expiration_date: input.expirationDate ?? null,\n })\n }\n }\n } catch {\n // stock_positions update is best-effort — log but don't fail the movement\n console.warn('Failed to update stock_positions — table may not exist yet')\n }\n }\n\n const movement = snakeToCamel(data) as any\n movement.productName = product?.name\n // Resolve location name\n if (input.stockLocationId) {\n const { data: loc } = await pub.from('stock_locations').select('name').eq('id', input.stockLocationId).single()\n movement.stockLocationName = loc?.name\n }\n if (input.destinationLocationId) {\n const { data: loc } = await pub.from('stock_locations').select('name').eq('id', input.destinationLocationId).single()\n movement.destinationLocationName = loc?.name\n }\n return movement as StockMovement\n },\n\n // --- Stock Positions ---\n async getPositions(productId: string): Promise<StockPosition[]> {\n const { pub } = getClients()\n const { data } = await pub.from('stock_positions').select('*').eq('product_id', productId)\n return (data ?? []).map((r: any) => snakeToCamel(r) as unknown as StockPosition)\n },\n\n // --- Stock Locations ---\n async getLocations(): Promise<StockLocation[]> {\n const { pub } = getClients()\n const { data } = await pub.from('stock_locations').select('*').eq('is_active', true).order('name')\n return (data ?? []).map((r: any) => snakeToCamel(r) as unknown as StockLocation)\n },\n\n async createLocation(input): Promise<StockLocation> {\n const { pub } = getClients()\n const tenantId = getTenantId()\n const { data } = await pub.from('stock_locations').insert({ ...camelToSnake(input as any), tenant_id: tenantId }).select().single()\n return snakeToCamel(data!) as unknown as StockLocation\n },\n\n // --- Recipes ---\n async getRecipes(): Promise<Recipe[]> {\n const { pub } = getClients()\n const { data } = await pub.from('recipes').select('*').eq('is_active', true).order('name')\n return (data ?? []).map((r: any) => snakeToCamel(r) as unknown as Recipe)\n },\n\n async getRecipeById(id: string): Promise<Recipe | null> {\n const { pub } = getClients()\n const { data } = await pub.from('recipes').select('*').eq('id', id).single()\n return data ? snakeToCamel(data) as unknown as Recipe : null\n },\n\n async getRecipeIngredients(recipeId: string): Promise<RecipeIngredient[]> {\n const { pub } = getClients()\n const { data } = await pub.from('recipe_ingredients').select('*').eq('recipe_id', recipeId).order('display_order')\n return (data ?? []).map((r: any) => snakeToCamel(r) as unknown as RecipeIngredient)\n },\n\n async createRecipe(input: CreateRecipeInput): Promise<Recipe> {\n const { pub } = getClients()\n const tenantId = getTenantId()\n const { ingredients, ...recipeData } = input\n const { data: recipe } = await pub.from('recipes').insert({ ...camelToSnake(recipeData as any), tenant_id: tenantId }).select().single()\n if (recipe && ingredients.length > 0) {\n await pub.from('recipe_ingredients').insert(\n ingredients.map((ing) => ({ ...camelToSnake(ing as any), recipe_id: recipe.id, tenant_id: tenantId }))\n )\n }\n return snakeToCamel(recipe!) as unknown as Recipe\n },\n\n // --- Summary ---\n async getSummary(): Promise<InventorySummary> {\n const { core, pub } = getClients()\n const { data: products } = await core.from('products').select('stock, min_stock, price, is_active').eq('is_active', true)\n const items = products ?? []\n const lowStock = items.filter((p: any) => p.stock > 0 && p.stock <= (p.min_stock ?? 0))\n const outOfStock = items.filter((p: any) => p.stock <= 0)\n const totalValue = items.reduce((sum: number, p: any) => sum + (p.stock ?? 0) * (p.price ?? 0), 0)\n\n const weekAgo = new Date()\n weekAgo.setDate(weekAgo.getDate() - 7)\n const { data: movements } = await pub.from('stock_movements').select('movement_type').gte('movement_date', weekAgo.toISOString().slice(0, 10))\n const movs = movements ?? []\n const movementsByType: Record<MovementType, number> = { entry: 0, exit: 0, adjustment: 0, transfer: 0, loss: 0 }\n for (const m of movs) movementsByType[m.movement_type as MovementType]++\n\n return {\n totalProducts: items.length,\n lowStockCount: lowStock.length,\n outOfStockCount: outOfStock.length,\n totalStockValue: totalValue,\n recentMovementCount: movs.length,\n movementsByType,\n }\n },\n }\n\n return provider\n}\n","import { createStore, type StoreApi } from 'zustand/vanilla'\nimport { dedup } from '@fayz-ai/saas'\nimport { toast } from '@fayz-ai/ui'\nimport type { InventoryDataProvider } from './data/types'\nimport type {\n Product, StockMovement, StockLocation, Recipe,\n InventorySummary, ProductQuery, MovementQuery,\n CreateProductInput, CreateStockMovementInput, CreateRecipeInput,\n} from './types'\n\nexport interface InventoryUIState {\n products: Product[]\n productsTotal: number\n productsLoading: boolean\n productQuery: ProductQuery\n\n movements: StockMovement[]\n movementsTotal: number\n movementsLoading: boolean\n\n locations: StockLocation[]\n locationsLoading: boolean\n\n recipes: Recipe[]\n recipesLoading: boolean\n\n summary: InventorySummary | null\n summaryLoading: boolean\n\n fetchSummary(): Promise<void>\n fetchProducts(query: ProductQuery): Promise<void>\n fetchMovements(query: MovementQuery): Promise<void>\n fetchLocations(): Promise<void>\n fetchRecipes(): Promise<void>\n createProduct(input: CreateProductInput): Promise<Product>\n createMovement(input: CreateStockMovementInput): Promise<StockMovement>\n createRecipe(input: CreateRecipeInput): Promise<Recipe>\n}\n\nexport function createInventoryStore(provider: InventoryDataProvider): StoreApi<InventoryUIState> {\n return createStore<InventoryUIState>((set, get) => ({\n products: [], productsTotal: 0, productsLoading: false, productQuery: {},\n movements: [], movementsTotal: 0, movementsLoading: false,\n locations: [], locationsLoading: false,\n recipes: [], recipesLoading: false,\n summary: null, summaryLoading: false,\n\n async fetchSummary() {\n return dedup('inv:summary', async () => {\n set({ summaryLoading: true })\n const summary = await provider.getSummary()\n set({ summary, summaryLoading: false })\n })\n },\n\n async fetchProducts(query) {\n const key = 'inv:products:' + JSON.stringify(query)\n return dedup(key, async () => {\n set({ productsLoading: true, productQuery: query })\n const result = await provider.getProducts(query)\n set({ products: result.data, productsTotal: result.total, productsLoading: false })\n })\n },\n\n async fetchMovements(query) {\n return dedup('inv:movements:' + JSON.stringify(query), async () => {\n set({ movementsLoading: true })\n const result = await provider.getMovements(query)\n set({ movements: result.data, movementsTotal: result.total, movementsLoading: false })\n })\n },\n\n async fetchLocations() {\n return dedup('inv:locations', async () => {\n set({ locationsLoading: true })\n const locations = await provider.getLocations()\n set({ locations, locationsLoading: false })\n })\n },\n\n async fetchRecipes() {\n set({ recipesLoading: true })\n const recipes = await provider.getRecipes()\n set({ recipes, recipesLoading: false })\n },\n\n async createProduct(input) {\n try {\n const product = await provider.createProduct(input)\n const query = get().productQuery\n const [result, summary] = await Promise.all([provider.getProducts(query), provider.getSummary()])\n set({ products: result.data, productsTotal: result.total, summary })\n toast.success('Product created')\n return product\n } catch (err: any) {\n toast.error('Failed to create product', { description: err?.message })\n throw err\n }\n },\n\n async createMovement(input) {\n try {\n const movement = await provider.createMovement(input)\n const [summary] = await Promise.all([provider.getSummary()])\n set({ summary })\n toast.success('Stock movement recorded')\n return movement\n } catch (err: any) {\n toast.error('Failed to record movement', { description: err?.message })\n throw err\n }\n },\n\n async createRecipe(input) {\n try {\n const recipe = await provider.createRecipe(input)\n const recipes = await provider.getRecipes()\n set({ recipes })\n toast.success('Recipe created')\n return recipe\n } catch (err: any) {\n toast.error('Failed to create recipe', { description: err?.message })\n throw err\n }\n },\n }))\n}\n","import type { PluginRegistryDef } from '@fayz-ai/core'\nimport type { EntityDef } from '@fayz-ai/core'\n\nconst supplierEntity: EntityDef = {\n name: 'Supplier',\n namePlural: 'Suppliers',\n icon: 'Building2',\n layout: 'person',\n displayField: 'name',\n defaultSort: 'name',\n fields: [\n { key: 'name', label: 'Name', type: 'text', required: true, showInTable: true, searchable: true },\n { key: 'phone', label: 'Phone', type: 'phone', showInTable: true },\n { key: 'email', label: 'Email', type: 'email', showInTable: true },\n { key: 'documentNumber', label: 'Tax ID', type: 'text', showInTable: true },\n { key: 'address', label: 'Address', type: 'text' },\n { key: 'notes', label: 'Notes', type: 'textarea' },\n { key: 'isActive', label: 'Active', type: 'boolean', showInTable: true, defaultValue: true },\n ],\n data: {\n table: 'persons',\n schema: 'saas_core',\n tenantScoped: true,\n filters: { kind: 'supplier' },\n defaults: { kind: 'supplier' },\n },\n}\n\nconst measurementUnitEntity: EntityDef = {\n name: 'Measurement Unit',\n namePlural: 'Measurement Units',\n icon: 'Ruler',\n displayField: 'name',\n defaultSort: 'name',\n fields: [\n { key: 'name', label: 'Name', type: 'text', required: true, showInTable: true },\n { key: 'abbreviation', label: 'Abbreviation', type: 'text', required: true, showInTable: true },\n { key: 'isActive', label: 'Active', type: 'boolean', showInTable: true, defaultValue: true },\n ],\n data: { table: 'measurement_units', tenantScoped: true },\n}\n\nconst productCategoryEntity: EntityDef = {\n name: 'Product Category',\n namePlural: 'Product Categories',\n icon: 'Tag',\n displayField: 'name',\n defaultSort: 'name',\n fields: [\n { key: 'name', label: 'Name', type: 'text', required: true, showInTable: true },\n { key: 'parentId', label: 'Parent', type: 'text', showInTable: false },\n { key: 'isActive', label: 'Active', type: 'boolean', showInTable: true, defaultValue: true },\n ],\n data: { table: 'product_categories', tenantScoped: true },\n}\n\nconst stockLocationEntity: EntityDef = {\n name: 'Stock Location',\n namePlural: 'Stock Locations',\n icon: 'Warehouse',\n displayField: 'name',\n defaultSort: 'name',\n fields: [\n { key: 'name', label: 'Name', type: 'text', required: true, showInTable: true },\n { key: 'description', label: 'Description', type: 'textarea', showInTable: true },\n { key: 'isActive', label: 'Active', type: 'boolean', showInTable: true, defaultValue: true },\n ],\n data: { table: 'stock_locations', tenantScoped: true },\n}\n\nexport const inventoryRegistries: PluginRegistryDef[] = [\n // --- Editable ---\n {\n id: 'suppliers',\n entity: supplierEntity,\n icon: 'Building2',\n description: 'Manage your product and material suppliers',\n display: 'table',\n },\n {\n id: 'product-categories',\n entity: productCategoryEntity,\n icon: 'Tag',\n description: 'Product categories for organization',\n display: 'table',\n },\n {\n id: 'stock-locations',\n entity: stockLocationEntity,\n icon: 'Warehouse',\n description: 'Physical storage locations for inventory',\n display: 'table',\n },\n // --- Read-only (system / seeded) ---\n {\n id: 'measurement-units',\n entity: measurementUnitEntity,\n icon: 'Ruler',\n description: 'Standard units of measure',\n display: 'table',\n readOnly: true,\n seedData: [\n { id: 'mu-unit', name: 'Unit', abbreviation: 'un', isActive: true },\n { id: 'mu-box', name: 'Box', abbreviation: 'box', isActive: true },\n { id: 'mu-kg', name: 'Kilogram', abbreviation: 'kg', isActive: true },\n { id: 'mu-g', name: 'Gram', abbreviation: 'g', isActive: true },\n { id: 'mu-l', name: 'Liter', abbreviation: 'L', isActive: true },\n { id: 'mu-ml', name: 'Milliliter', abbreviation: 'mL', isActive: true },\n ],\n },\n]\n","// inventory.* — merged plugin-own + saas-core central i18n\nexport const en: Record<string, string> = {\n \"inventory.dashboard.activeItems\": \"Active items\",\n \"inventory.dashboard.belowMinimum\": \"Below minimum\",\n \"inventory.dashboard.entries\": \"Entries:\",\n \"inventory.dashboard.exits\": \"Exits:\",\n \"inventory.dashboard.last7Days\": \"Last 7 days\",\n \"inventory.dashboard.lowStock\": \"Low Stock\",\n \"inventory.dashboard.needRestocking\": \"Need restocking\",\n \"inventory.dashboard.outOfStock\": \"Out of Stock\",\n \"inventory.dashboard.quickActions\": \"Quick Actions\",\n \"inventory.dashboard.quickActionsDesc\": \"Use the sidebar to record stock entries, exits, or manage products.\",\n \"inventory.dashboard.recentActivity\": \"Recent Activity\",\n \"inventory.dashboard.stockValue\": \"Stock Value\",\n \"inventory.dashboard.totalProducts\": \"Total Products\",\n \"inventory.dashboard.totalValue\": \"Total inventory value\",\n \"inventory.history.noMovements\": \"No movements recorded\",\n \"inventory.history.searchPlaceholder\": \"Search movements...\",\n \"inventory.history.subtitle\": \"All stock movements\",\n \"inventory.history.title\": \"Stock History\",\n \"inventory.nav.dashboard\": \"Dashboard\",\n \"inventory.nav.entry\": \"Entry\",\n \"inventory.nav.exit\": \"Exit\",\n \"inventory.nav.history\": \"History\",\n \"inventory.nav.list\": \"List\",\n \"inventory.nav.new\": \"New\",\n \"inventory.nav.products\": \"Products\",\n \"inventory.nav.stock\": \"Stock\",\n \"inventory.page.newProduct\": \"New Product\",\n \"inventory.page.newProductDesc\": \"Add a product to your catalog\",\n \"inventory.page.settingsSubtitle\": \"Preferences, suppliers, categories, and units\",\n \"inventory.page.settingsTitle\": \"Inventory Settings\",\n \"inventory.page.stockEntry\": \"Stock Entry\",\n \"inventory.page.stockEntryDesc\": \"Record goods received\",\n \"inventory.page.stockExit\": \"Stock Exit\",\n \"inventory.page.stockExitDesc\": \"Record goods used or sold\",\n \"inventory.recipeDetail.active\": \"Active\",\n \"inventory.recipeDetail.backToList\": \"Back to list\",\n \"inventory.recipeDetail.inactive\": \"Inactive\",\n \"inventory.recipeDetail.ingredientCount\": \"Ingredients\",\n \"inventory.recipeDetail.ingredientsTitle\": \"Ingredients\",\n \"inventory.recipeDetail.instructions\": \"Instructions\",\n \"inventory.recipeDetail.noIngredients\": \"No ingredients defined\",\n \"inventory.recipeDetail.notFound\": \"Recipe not found\",\n \"inventory.recipeDetail.prepTime\": \"Prep time\",\n \"inventory.recipeDetail.produces\": \"Produces\",\n \"inventory.recipeDetail.recipes\": \"Recipes\",\n \"inventory.recipeDetail.yield\": \"Yield\",\n \"inventory.recipes.createFirst\": \"Create your first recipe\",\n \"inventory.recipes.ingredients\": \"Ingredients\",\n \"inventory.recipes.newRecipe\": \"New Recipe\",\n \"inventory.recipes.noRecipes\": \"No recipes yet\",\n \"inventory.recipes.produces\": \"Produces:\",\n \"inventory.recipes.productionFormulas\": \"{{count}} production formulas\",\n \"inventory.recipes.recipesDesc\": \"Recipes define how to produce products from ingredients\",\n \"inventory.recipes.title\": \"Recipes\",\n \"inventory.recipes.yield\": \"Yield\",\n \"inventory.stock.additionalDetails\": \"Additional details (optional)\",\n \"inventory.stock.adjustmentDesc\": \"Count correction\",\n \"inventory.stock.adjustmentLabel\": \"Adjustment\",\n \"inventory.stock.back\": \"Back\",\n \"inventory.stock.batchNumber\": \"Batch Number\",\n \"inventory.stock.currentStock\": \"Current Stock\",\n \"inventory.stock.destination\": \"Destination\",\n \"inventory.stock.document\": \"Document\",\n \"inventory.stock.documentNumber\": \"Document Number\",\n \"inventory.stock.entry\": \"Stock Entry\",\n \"inventory.stock.entryDesc\": \"Receiving goods\",\n \"inventory.stock.entryLabel\": \"Entry\",\n \"inventory.stock.exit\": \"Stock Exit\",\n \"inventory.stock.exitDesc\": \"Using or selling\",\n \"inventory.stock.exitLabel\": \"Exit\",\n \"inventory.stock.expirationDate\": \"Expiration Date\",\n \"inventory.stock.fromLocation\": \"From Location\",\n \"inventory.stock.locationLabel\": \"Location\",\n \"inventory.stock.lossDesc\": \"Waste or damage\",\n \"inventory.stock.lossLabel\": \"Loss\",\n \"inventory.stock.movement\": \"Stock Movement\",\n \"inventory.stock.movementDetails\": \"Movement Details\",\n \"inventory.stock.movementType\": \"Movement type\",\n \"inventory.stock.next\": \"Next\",\n \"inventory.stock.notes\": \"Notes\",\n \"inventory.stock.product\": \"Product\",\n \"inventory.stock.quantity\": \"Quantity *\",\n \"inventory.stock.quantityLabel\": \"Quantity\",\n \"inventory.stock.reason\": \"Reason *\",\n \"inventory.stock.reasonLabel\": \"Reason\",\n \"inventory.stock.recordMovement\": \"Record Movement\",\n \"inventory.stock.recorded\": \"Recorded\",\n \"inventory.stock.recording\": \"Recording...\",\n \"inventory.stock.searchProduct\": \"Search by name, SKU, or barcode...\",\n \"inventory.stock.stepOf\": \"Step {{step}} of 3\",\n \"inventory.stock.supplier\": \"Supplier\",\n \"inventory.stock.toLocation\": \"To Location *\",\n \"inventory.stock.total\": \"Total\",\n \"inventory.stock.totalCost\": \"Total Cost\",\n \"inventory.stock.transferDesc\": \"Between locations\",\n \"inventory.stock.transferLabel\": \"Transfer\",\n \"inventory.stock.unitCost\": \"Unit Cost\",\n \"inventory.stock.unitCostLabel\": \"Unit Cost\",\n \"inventory.onboarding.welcome\": \"Welcome to Inventory\",\n \"inventory.onboarding.description\": \"Track products, manage stock levels, and monitor movements across your business.\",\n \"inventory.onboarding.skip\": \"Skip setup\",\n \"inventory.onboarding.getStarted\": \"Get Started\",\n \"inventory.onboarding.units.title\": \"Measurement Units\",\n \"inventory.onboarding.units.description\": \"Default units (Unit, Box, Kg, L, etc.) are ready. Customize them anytime in Settings.\",\n \"inventory.onboarding.locations.title\": \"Stock Locations\",\n \"inventory.onboarding.locations.description\": \"A default storage location has been created. Add more for multi-location tracking.\",\n \"inventory.onboarding.start\": \"Start using Inventory\",\n \"inventory.quickActions.newProduct\": \"New Product\",\n \"inventory.quickActions.newProductDesc\": \"Add a product to your catalog\",\n \"inventory.quickActions.stockEntry\": \"Stock Entry\",\n \"inventory.quickActions.stockEntryDesc\": \"Record goods received\",\n \"inventory.quickActions.stockExit\": \"Stock Exit\",\n \"inventory.quickActions.stockExitDesc\": \"Record goods used or sold\",\n \"inventory.settingsPage.title\": \"Inventory Settings\",\n \"inventory.settingsPage.subtitle\": \"Manage units, categories, and stock locations\",\n \"inventory.settings.stockManagement\": \"Stock Management\",\n \"inventory.settings.stockManagementDesc\": \"How stock levels are tracked\",\n \"inventory.settings.lowStockAlerts\": \"Low stock alerts\",\n \"inventory.settings.lowStockAlertsDesc\": \"Show warnings when products fall below minimum quantity\",\n \"inventory.settings.requireReason\": \"Require reason for adjustments\",\n \"inventory.settings.requireReasonDesc\": \"Make reason mandatory for stock adjustments and losses\",\n \"inventory.settings.autoDeduct\": \"Auto-deduct on service\",\n \"inventory.settings.autoDeductDesc\": \"Automatically deduct products when a service is executed\",\n \"inventory.settings.products\": \"Products\",\n \"inventory.settings.productsDesc\": \"Product catalog behavior\",\n \"inventory.settings.requireSku\": \"Require SKU\",\n \"inventory.settings.requireSkuDesc\": \"Make SKU mandatory when creating products\",\n \"inventory.settings.allowNegative\": \"Allow negative stock\",\n \"inventory.settings.allowNegativeDesc\": \"Allow stock quantities to go below zero\",\n \"inventory.settings.notifications\": \"Notifications\",\n \"inventory.settings.notificationsDesc\": \"Alerts and reminders\",\n \"inventory.settings.lowStockEmail\": \"Low stock email alerts\",\n \"inventory.settings.lowStockEmailDesc\": \"Send email when products reach minimum quantity\",\n \"inventory.settings.expiryWarnings\": \"Expiry date warnings\",\n \"inventory.settings.expiryWarningsDesc\": \"Alert before products expire (batch tracking)\",\n \"inventory.productForm.newProduct\": \"New Product\",\n \"inventory.productForm.editProduct\": \"Edit Product\",\n \"inventory.productForm.updateDetails\": \"Update product details\",\n \"inventory.productForm.addToCatalog\": \"Add a product to your catalog\",\n \"inventory.productForm.cancel\": \"Cancel\",\n \"inventory.productForm.save\": \"Save\",\n \"inventory.productForm.saving\": \"Saving...\",\n \"inventory.productForm.generalInfo\": \"General Information\",\n \"inventory.productForm.name\": \"Name\",\n \"inventory.productForm.namePlaceholder\": \"Product name\",\n \"inventory.productForm.brand\": \"Brand\",\n \"inventory.productForm.brandPlaceholder\": \"Brand name\",\n \"inventory.productForm.sku\": \"SKU\",\n \"inventory.productForm.skuPlaceholder\": \"Internal code\",\n \"inventory.productForm.barcode\": \"Barcode\",\n \"inventory.productForm.barcodePlaceholder\": \"EAN / UPC\",\n \"inventory.productForm.description\": \"Description\",\n \"inventory.productForm.descriptionPlaceholder\": \"Additional information about the product\",\n \"inventory.productForm.classification\": \"Classification\",\n \"inventory.productForm.classificationDesc\": \"How this product is used in your business\",\n \"inventory.productForm.typeIngredient\": \"Raw material used in production or services\",\n \"inventory.productForm.typeSale\": \"Sold directly to customers\",\n \"inventory.productForm.typeIntermediate\": \"Produced internally from other items\",\n \"inventory.productForm.typeAsset\": \"Fixed asset for patrimony tracking\",\n \"inventory.productForm.pricing\": \"Pricing\",\n \"inventory.productForm.costPrice\": \"Cost Price\",\n \"inventory.productForm.salePrice\": \"Sale Price\",\n \"inventory.productForm.margin\": \"Margin\",\n \"inventory.productForm.stockLevels\": \"Stock Levels\",\n \"inventory.productForm.stockLevelsDesc\": \"Minimum and maximum thresholds for alerts\",\n \"inventory.productForm.minQuantity\": \"Minimum Quantity\",\n \"inventory.productForm.minQuantityHint\": \"Alert when stock falls below this\",\n \"inventory.productForm.maxQuantity\": \"Maximum Quantity\",\n \"inventory.productForm.maxQuantityHint\": \"Max capacity for this product\",\n \"inventory.productForm.optional\": \"Optional\",\n \"inventory.productList.title\": \"Products\",\n \"inventory.productList.subtitle\": \"{{count}} products\",\n \"inventory.productList.product\": \"Product\",\n \"inventory.productList.type\": \"Type\",\n \"inventory.productList.stock\": \"Stock\",\n \"inventory.productList.cost\": \"Cost\",\n \"inventory.productList.value\": \"Value\",\n \"inventory.productList.searchPlaceholder\": \"Search products...\",\n \"inventory.productList.newProduct\": \"New Product\",\n \"inventory.productList.empty\": \"No products yet\",\n \"inventory.productList.createFirst\": \"Create your first product\",\n \"inventory.stock.unknownProduct\": \"Unknown Product\",\n \"inventory.stock.reasonLossPlaceholder\": \"e.g. Expired, damaged\",\n \"inventory.stock.reasonAdjustPlaceholder\": \"e.g. Physical count correction\",\n \"inventory.stock.documentPlaceholder\": \"Invoice, receipt, PO...\",\n \"inventory.stock.batchPlaceholder\": \"e.g. LOT001\",\n \"inventory.stock.notesPlaceholder\": \"Additional notes...\",\n \"inventory.recipeDetail.loading\": \"Loading...\",\n \"inventory.recipeDetail.ingredient\": \"Ingredient\",\n \"inventory.recipeDetail.quantity\": \"Quantity\",\n \"inventory.recipeDetail.unit\": \"Unit\",\n \"inventory.recipeDetail.notes\": \"Notes\",\n \"inventory.recipeDetail.created\": \"Created\",\n \"inventory.recipeDetail.updated\": \"Updated\",\n \"inventory.recipeForm.newRecipe\": \"New Recipe\",\n \"inventory.recipeForm.subtitle\": \"Define a production formula\",\n \"inventory.recipeForm.cancel\": \"Cancel\",\n \"inventory.recipeForm.saveRecipe\": \"Save Recipe\",\n \"inventory.recipeForm.saving\": \"Saving...\",\n \"inventory.recipeForm.recipeDetails\": \"Recipe Details\",\n \"inventory.recipeForm.recipeName\": \"Recipe Name\",\n \"inventory.recipeForm.recipeNamePlaceholder\": \"e.g. Tomato Sauce\",\n \"inventory.recipeForm.description\": \"Description\",\n \"inventory.recipeForm.descriptionPlaceholder\": \"Brief description...\",\n \"inventory.recipeForm.produces\": \"Produces (Product)\",\n \"inventory.recipeForm.searchProduct\": \"Search product...\",\n \"inventory.recipeForm.createProduct\": \"Create product\",\n \"inventory.recipeForm.yieldQuantity\": \"Yield Quantity\",\n \"inventory.recipeForm.prepTime\": \"Prep Time (min)\",\n \"inventory.recipeForm.instructions\": \"Instructions\",\n \"inventory.recipeForm.instructionsPlaceholder\": \"Step-by-step preparation instructions...\",\n \"inventory.recipeForm.ingredients\": \"Ingredients\",\n \"inventory.recipeForm.addIngredient\": \"Add Ingredient\",\n \"inventory.recipeForm.noIngredients\": \"No ingredients added\",\n \"inventory.recipeForm.addFirstIngredient\": \"Add your first ingredient\",\n \"inventory.recipeForm.ingredient\": \"Ingredient\",\n \"inventory.recipeForm.quantity\": \"Quantity\",\n \"inventory.recipeForm.notes\": \"Notes\",\n \"inventory.recipeForm.searchIngredient\": \"Search ingredient...\",\n \"inventory.recipeForm.createIngredient\": \"Create ingredient\",\n \"inventory.recipeForm.notesPlaceholder\": \"e.g. diced, fresh\",\n \"inventory.recipeForm.ingredientsConfigured\": \"{{configured}} of {{total}} ingredients configured\",\n \"inventory.title\": \"Inventory\",\n \"inventory.stock.title\": \"Stock\",\n \"inventory.stock.minStock\": \"Min. Stock\",\n \"inventory.stock.adjust\": \"Adjust Stock\",\n \"inventory.stock.lowStock\": \"Low Stock\",\n \"inventory.products.title\": \"Products\",\n \"inventory.products.create\": \"New Product\",\n \"inventory.recipes.create\": \"New Recipe\",\n \"inventory.recipes.addIngredient\": \"Add Ingredient\",\n \"inventory.recipes.cost\": \"Cost\",\n \"inventory.recipes.loading\": \"Loading...\",\n \"inventory.suppliers.title\": \"Suppliers\",\n \"inventory.suppliers.create\": \"New Supplier\",\n \"inventory.movements.title\": \"Movements\",\n \"inventory.movements.in\": \"Stock In\",\n \"inventory.movements.out\": \"Stock Out\",\n \"inventory.settings.title\": \"Inventory Settings\",\n}\n","// inventory.* — merged plugin-own + saas-core central i18n\nexport const ptBR: Record<string, string> = {\n \"inventory.dashboard.activeItems\": \"Itens ativos\",\n \"inventory.dashboard.belowMinimum\": \"Abaixo do mínimo\",\n \"inventory.dashboard.entries\": \"Entradas:\",\n \"inventory.dashboard.exits\": \"Saídas:\",\n \"inventory.dashboard.last7Days\": \"Últimos 7 dias\",\n \"inventory.dashboard.lowStock\": \"Estoque Baixo\",\n \"inventory.dashboard.needRestocking\": \"Precisam reposição\",\n \"inventory.dashboard.outOfStock\": \"Sem Estoque\",\n \"inventory.dashboard.quickActions\": \"Ações Rápidas\",\n \"inventory.dashboard.quickActionsDesc\": \"Use a barra lateral para registrar entradas, saídas ou gerenciar produtos.\",\n \"inventory.dashboard.recentActivity\": \"Atividade Recente\",\n \"inventory.dashboard.stockValue\": \"Valor do Estoque\",\n \"inventory.dashboard.totalProducts\": \"Total de Produtos\",\n \"inventory.dashboard.totalValue\": \"Valor total do estoque\",\n \"inventory.history.noMovements\": \"Nenhuma movimentação registrada\",\n \"inventory.history.searchPlaceholder\": \"Buscar movimentações...\",\n \"inventory.history.subtitle\": \"Todas as movimentações de estoque\",\n \"inventory.history.title\": \"Histórico de Estoque\",\n \"inventory.nav.dashboard\": \"Painel\",\n \"inventory.nav.entry\": \"Entrada\",\n \"inventory.nav.exit\": \"Saída\",\n \"inventory.nav.history\": \"Histórico\",\n \"inventory.nav.list\": \"Lista\",\n \"inventory.nav.new\": \"Novo\",\n \"inventory.nav.products\": \"Produtos\",\n \"inventory.nav.stock\": \"Estoque\",\n \"inventory.page.newProduct\": \"Novo Produto\",\n \"inventory.page.newProductDesc\": \"Adicionar um produto ao seu catálogo\",\n \"inventory.page.settingsSubtitle\": \"Preferências, fornecedores, categorias e unidades\",\n \"inventory.page.settingsTitle\": \"Configurações de Estoque\",\n \"inventory.page.stockEntry\": \"Entrada de Estoque\",\n \"inventory.page.stockEntryDesc\": \"Registrar mercadorias recebidas\",\n \"inventory.page.stockExit\": \"Saída de Estoque\",\n \"inventory.page.stockExitDesc\": \"Registrar mercadorias usadas ou vendidas\",\n \"inventory.recipeDetail.active\": \"Ativa\",\n \"inventory.recipeDetail.backToList\": \"Voltar à lista\",\n \"inventory.recipeDetail.inactive\": \"Inativa\",\n \"inventory.recipeDetail.ingredientCount\": \"Ingredientes\",\n \"inventory.recipeDetail.ingredientsTitle\": \"Ingredientes\",\n \"inventory.recipeDetail.instructions\": \"Instruções\",\n \"inventory.recipeDetail.noIngredients\": \"Nenhum ingrediente definido\",\n \"inventory.recipeDetail.notFound\": \"Receita não encontrada\",\n \"inventory.recipeDetail.prepTime\": \"Tempo de preparo\",\n \"inventory.recipeDetail.produces\": \"Produz\",\n \"inventory.recipeDetail.recipes\": \"Receitas\",\n \"inventory.recipeDetail.yield\": \"Rendimento\",\n \"inventory.recipes.createFirst\": \"Crie sua primeira receita\",\n \"inventory.recipes.ingredients\": \"Ingredientes\",\n \"inventory.recipes.newRecipe\": \"Nova Receita\",\n \"inventory.recipes.noRecipes\": \"Nenhuma receita ainda\",\n \"inventory.recipes.produces\": \"Produz:\",\n \"inventory.recipes.productionFormulas\": \"{{count}} fórmulas de produção\",\n \"inventory.recipes.recipesDesc\": \"Receitas definem como produzir produtos a partir de ingredientes\",\n \"inventory.recipes.title\": \"Receitas\",\n \"inventory.recipes.yield\": \"Rendimento\",\n \"inventory.stock.additionalDetails\": \"Detalhes adicionais (opcional)\",\n \"inventory.stock.adjustmentDesc\": \"Correção de contagem\",\n \"inventory.stock.adjustmentLabel\": \"Ajuste\",\n \"inventory.stock.back\": \"Voltar\",\n \"inventory.stock.batchNumber\": \"Número do Lote\",\n \"inventory.stock.currentStock\": \"Estoque Atual\",\n \"inventory.stock.destination\": \"Destino\",\n \"inventory.stock.document\": \"Documento\",\n \"inventory.stock.documentNumber\": \"Número do Documento\",\n \"inventory.stock.entry\": \"Entrada de Estoque\",\n \"inventory.stock.entryDesc\": \"Recebimento de mercadorias\",\n \"inventory.stock.entryLabel\": \"Entrada\",\n \"inventory.stock.exit\": \"Saída de Estoque\",\n \"inventory.stock.exitDesc\": \"Uso ou venda\",\n \"inventory.stock.exitLabel\": \"Saída\",\n \"inventory.stock.expirationDate\": \"Data de Validade\",\n \"inventory.stock.fromLocation\": \"Local de Origem\",\n \"inventory.stock.locationLabel\": \"Local\",\n \"inventory.stock.lossDesc\": \"Desperdício ou dano\",\n \"inventory.stock.lossLabel\": \"Perda\",\n \"inventory.stock.movement\": \"Movimentação de Estoque\",\n \"inventory.stock.movementDetails\": \"Detalhes da Movimentação\",\n \"inventory.stock.movementType\": \"Tipo de movimentação\",\n \"inventory.stock.next\": \"Próximo\",\n \"inventory.stock.notes\": \"Observações\",\n \"inventory.stock.product\": \"Produto\",\n \"inventory.stock.quantity\": \"Quantidade *\",\n \"inventory.stock.quantityLabel\": \"Quantidade\",\n \"inventory.stock.reason\": \"Motivo *\",\n \"inventory.stock.reasonLabel\": \"Motivo\",\n \"inventory.stock.recordMovement\": \"Registrar Movimentação\",\n \"inventory.stock.recorded\": \"Registrado\",\n \"inventory.stock.recording\": \"Registrando...\",\n \"inventory.stock.searchProduct\": \"Buscar por nome, SKU ou código de barras...\",\n \"inventory.stock.stepOf\": \"Etapa {{step}} de 3\",\n \"inventory.stock.supplier\": \"Fornecedor\",\n \"inventory.stock.toLocation\": \"Local de Destino *\",\n \"inventory.stock.total\": \"Total\",\n \"inventory.stock.totalCost\": \"Custo Total\",\n \"inventory.stock.transferDesc\": \"Entre locais\",\n \"inventory.stock.transferLabel\": \"Transferência\",\n \"inventory.stock.unitCost\": \"Custo Unitário\",\n \"inventory.stock.unitCostLabel\": \"Custo Unitário\",\n \"inventory.onboarding.welcome\": \"Bem-vindo ao Estoque\",\n \"inventory.onboarding.description\": \"Acompanhe produtos, gerencie níveis de estoque e monitore movimentações do seu negócio.\",\n \"inventory.onboarding.skip\": \"Pular configuração\",\n \"inventory.onboarding.getStarted\": \"Começar\",\n \"inventory.onboarding.units.title\": \"Unidades de Medida\",\n \"inventory.onboarding.units.description\": \"Unidades padrão (Unidade, Caixa, Kg, L, etc.) estão prontas. Personalize-as a qualquer momento em Configurações.\",\n \"inventory.onboarding.locations.title\": \"Locais de Estoque\",\n \"inventory.onboarding.locations.description\": \"Um local de armazenamento padrão foi criado. Adicione mais para controle multi-local.\",\n \"inventory.onboarding.start\": \"Começar a usar Estoque\",\n \"inventory.quickActions.newProduct\": \"Novo Produto\",\n \"inventory.quickActions.newProductDesc\": \"Adicionar um produto ao catálogo\",\n \"inventory.quickActions.stockEntry\": \"Entrada de Estoque\",\n \"inventory.quickActions.stockEntryDesc\": \"Registrar mercadorias recebidas\",\n \"inventory.quickActions.stockExit\": \"Saída de Estoque\",\n \"inventory.quickActions.stockExitDesc\": \"Registrar mercadorias usadas ou vendidas\",\n \"inventory.settingsPage.title\": \"Configurações de Estoque\",\n \"inventory.settingsPage.subtitle\": \"Gerenciar unidades, categorias e locais de estoque\",\n \"inventory.settings.stockManagement\": \"Gestão de Estoque\",\n \"inventory.settings.stockManagementDesc\": \"Como os níveis de estoque são rastreados\",\n \"inventory.settings.lowStockAlerts\": \"Alertas de estoque baixo\",\n \"inventory.settings.lowStockAlertsDesc\": \"Mostrar avisos quando produtos ficarem abaixo da quantidade mínima\",\n \"inventory.settings.requireReason\": \"Exigir motivo para ajustes\",\n \"inventory.settings.requireReasonDesc\": \"Tornar obrigatório o motivo para ajustes e perdas de estoque\",\n \"inventory.settings.autoDeduct\": \"Auto-deduzir no serviço\",\n \"inventory.settings.autoDeductDesc\": \"Deduzir automaticamente produtos quando um serviço é executado\",\n \"inventory.settings.products\": \"Produtos\",\n \"inventory.settings.productsDesc\": \"Comportamento do catálogo de produtos\",\n \"inventory.settings.requireSku\": \"Exigir SKU\",\n \"inventory.settings.requireSkuDesc\": \"Tornar SKU obrigatório ao criar produtos\",\n \"inventory.settings.allowNegative\": \"Permitir estoque negativo\",\n \"inventory.settings.allowNegativeDesc\": \"Permitir que quantidades de estoque fiquem abaixo de zero\",\n \"inventory.settings.notifications\": \"Notificações\",\n \"inventory.settings.notificationsDesc\": \"Alertas e lembretes\",\n \"inventory.settings.lowStockEmail\": \"Alertas de estoque baixo por e-mail\",\n \"inventory.settings.lowStockEmailDesc\": \"Enviar e-mail quando produtos atingirem a quantidade mínima\",\n \"inventory.settings.expiryWarnings\": \"Avisos de validade\",\n \"inventory.settings.expiryWarningsDesc\": \"Alertar antes de produtos vencerem (rastreamento de lotes)\",\n \"inventory.productForm.newProduct\": \"Novo Produto\",\n \"inventory.productForm.editProduct\": \"Editar Produto\",\n \"inventory.productForm.updateDetails\": \"Atualizar detalhes do produto\",\n \"inventory.productForm.addToCatalog\": \"Adicionar um produto ao seu catálogo\",\n \"inventory.productForm.cancel\": \"Cancelar\",\n \"inventory.productForm.save\": \"Salvar\",\n \"inventory.productForm.saving\": \"Salvando...\",\n \"inventory.productForm.generalInfo\": \"Informações Gerais\",\n \"inventory.productForm.name\": \"Nome\",\n \"inventory.productForm.namePlaceholder\": \"Nome do produto\",\n \"inventory.productForm.brand\": \"Marca\",\n \"inventory.productForm.brandPlaceholder\": \"Nome da marca\",\n \"inventory.productForm.sku\": \"SKU\",\n \"inventory.productForm.skuPlaceholder\": \"Código interno\",\n \"inventory.productForm.barcode\": \"Código de Barras\",\n \"inventory.productForm.barcodePlaceholder\": \"EAN / UPC\",\n \"inventory.productForm.description\": \"Descrição\",\n \"inventory.productForm.descriptionPlaceholder\": \"Informações adicionais sobre o produto\",\n \"inventory.productForm.classification\": \"Classificação\",\n \"inventory.productForm.classificationDesc\": \"Como este produto é usado no seu negócio\",\n \"inventory.productForm.typeIngredient\": \"Matéria-prima usada na produção ou serviços\",\n \"inventory.productForm.typeSale\": \"Vendido diretamente aos clientes\",\n \"inventory.productForm.typeIntermediate\": \"Produzido internamente a partir de outros itens\",\n \"inventory.productForm.typeAsset\": \"Ativo fixo para controle patrimonial\",\n \"inventory.productForm.pricing\": \"Preços\",\n \"inventory.productForm.costPrice\": \"Preço de Custo\",\n \"inventory.productForm.salePrice\": \"Preço de Venda\",\n \"inventory.productForm.margin\": \"Margem\",\n \"inventory.productForm.stockLevels\": \"Níveis de Estoque\",\n \"inventory.productForm.stockLevelsDesc\": \"Limites mínimo e máximo para alertas\",\n \"inventory.productForm.minQuantity\": \"Quantidade Mínima\",\n \"inventory.productForm.minQuantityHint\": \"Alertar quando o estoque ficar abaixo deste valor\",\n \"inventory.productForm.maxQuantity\": \"Quantidade Máxima\",\n \"inventory.productForm.maxQuantityHint\": \"Capacidade máxima para este produto\",\n \"inventory.productForm.optional\": \"Opcional\",\n \"inventory.productList.title\": \"Produtos\",\n \"inventory.productList.subtitle\": \"{{count}} produtos\",\n \"inventory.productList.product\": \"Produto\",\n \"inventory.productList.type\": \"Tipo\",\n \"inventory.productList.stock\": \"Estoque\",\n \"inventory.productList.cost\": \"Custo\",\n \"inventory.productList.value\": \"Valor\",\n \"inventory.productList.searchPlaceholder\": \"Buscar produtos...\",\n \"inventory.productList.newProduct\": \"Novo Produto\",\n \"inventory.productList.empty\": \"Nenhum produto ainda\",\n \"inventory.productList.createFirst\": \"Crie seu primeiro produto\",\n \"inventory.stock.unknownProduct\": \"Produto Desconhecido\",\n \"inventory.stock.reasonLossPlaceholder\": \"ex. Vencido, danificado\",\n \"inventory.stock.reasonAdjustPlaceholder\": \"ex. Correção de contagem física\",\n \"inventory.stock.documentPlaceholder\": \"Nota fiscal, recibo, PO...\",\n \"inventory.stock.batchPlaceholder\": \"ex. LOT001\",\n \"inventory.stock.notesPlaceholder\": \"Observações adicionais...\",\n \"inventory.recipeDetail.loading\": \"Carregando...\",\n \"inventory.recipeDetail.ingredient\": \"Ingrediente\",\n \"inventory.recipeDetail.quantity\": \"Quantidade\",\n \"inventory.recipeDetail.unit\": \"Unidade\",\n \"inventory.recipeDetail.notes\": \"Observações\",\n \"inventory.recipeDetail.created\": \"Criado\",\n \"inventory.recipeDetail.updated\": \"Atualizado\",\n \"inventory.recipeForm.newRecipe\": \"Nova Receita\",\n \"inventory.recipeForm.subtitle\": \"Definir uma fórmula de produção\",\n \"inventory.recipeForm.cancel\": \"Cancelar\",\n \"inventory.recipeForm.saveRecipe\": \"Salvar Receita\",\n \"inventory.recipeForm.saving\": \"Salvando...\",\n \"inventory.recipeForm.recipeDetails\": \"Detalhes da Receita\",\n \"inventory.recipeForm.recipeName\": \"Nome da Receita\",\n \"inventory.recipeForm.recipeNamePlaceholder\": \"ex. Molho de Tomate\",\n \"inventory.recipeForm.description\": \"Descrição\",\n \"inventory.recipeForm.descriptionPlaceholder\": \"Breve descrição...\",\n \"inventory.recipeForm.produces\": \"Produz (Produto)\",\n \"inventory.recipeForm.searchProduct\": \"Buscar produto...\",\n \"inventory.recipeForm.createProduct\": \"Criar produto\",\n \"inventory.recipeForm.yieldQuantity\": \"Quantidade de Rendimento\",\n \"inventory.recipeForm.prepTime\": \"Tempo de Preparo (min)\",\n \"inventory.recipeForm.instructions\": \"Instruções\",\n \"inventory.recipeForm.instructionsPlaceholder\": \"Instruções de preparo passo a passo...\",\n \"inventory.recipeForm.ingredients\": \"Ingredientes\",\n \"inventory.recipeForm.addIngredient\": \"Adicionar Ingrediente\",\n \"inventory.recipeForm.noIngredients\": \"Nenhum ingrediente adicionado\",\n \"inventory.recipeForm.addFirstIngredient\": \"Adicione seu primeiro ingrediente\",\n \"inventory.recipeForm.ingredient\": \"Ingrediente\",\n \"inventory.recipeForm.quantity\": \"Quantidade\",\n \"inventory.recipeForm.notes\": \"Observações\",\n \"inventory.recipeForm.searchIngredient\": \"Buscar ingrediente...\",\n \"inventory.recipeForm.createIngredient\": \"Criar ingrediente\",\n \"inventory.recipeForm.notesPlaceholder\": \"ex. picado, fresco\",\n \"inventory.recipeForm.ingredientsConfigured\": \"{{configured}} de {{total}} ingredientes configurados\",\n \"inventory.title\": \"Estoque\",\n \"inventory.stock.title\": \"Estoque\",\n \"inventory.stock.minStock\": \"Estoque Mín.\",\n \"inventory.stock.adjust\": \"Ajustar Estoque\",\n \"inventory.stock.lowStock\": \"Estoque Baixo\",\n \"inventory.products.title\": \"Produtos\",\n \"inventory.products.create\": \"Novo Produto\",\n \"inventory.recipes.create\": \"Nova Receita\",\n \"inventory.recipes.addIngredient\": \"Adicionar Ingrediente\",\n \"inventory.recipes.cost\": \"Custo\",\n \"inventory.recipes.loading\": \"Carregando...\",\n \"inventory.suppliers.title\": \"Fornecedores\",\n \"inventory.suppliers.create\": \"Novo Fornecedor\",\n \"inventory.movements.title\": \"Movimentações\",\n \"inventory.movements.in\": \"Entrada\",\n \"inventory.movements.out\": \"Saída\",\n \"inventory.settings.title\": \"Configurações de Estoque\",\n}\n","import { en } from './en'\nimport { ptBR } from './pt-BR'\n\nexport const inventoryLocales: Record<string, Record<string, string>> = {\n en,\n 'pt-BR': ptBR,\n}\n","import React from 'react'\nimport type { PluginManifest, PluginScope, VerticalId } from '@fayz-ai/core'\nimport { InventoryPage } from './InventoryPage'\nimport { createInventoryDashboardWidgets } from './views/dashboardWidgets'\nimport type { ResolvedInventoryConfig } from './InventoryContext'\nimport type { InventoryDataProvider } from './data/types'\nimport { createMockInventoryProvider } from './data/mock'\nimport { createSupabaseInventoryProvider } from './data/supabase'\nimport { createSafeDataProvider, registerTranslations } from '@fayz-ai/core'\nimport { createInventoryStore } from './store'\nimport { inventoryRegistries } from './registries'\nimport { inventoryLocales } from './locales'\nimport { InventoryGeneralSettings } from './components/InventoryGeneralSettings'\n\n// ---------------------------------------------------------------------------\n// Public types\n// ---------------------------------------------------------------------------\n\nexport interface InventoryPluginLabels {\n pageTitle: string\n pageSubtitle: string\n dashboard: string\n products: string\n productsNew: string\n productsList: string\n stock: string\n stockEntry: string\n stockExit: string\n stockHistory: string\n recipes: string\n recipesNew: string\n recipesList: string\n}\n\nexport interface InventoryPluginOptions {\n modules?: {\n recipes?: boolean\n stockLocations?: boolean\n batchTracking?: boolean\n }\n labels?: Partial<InventoryPluginLabels>\n productTypes?: Array<{ value: string; label: string }>\n currency?: { code?: string; locale?: string; symbol?: string }\n navPosition?: number\n navSection?: 'main' | 'secondary'\n scope?: PluginScope\n verticalId?: VerticalId\n dataProvider?: InventoryDataProvider\n locations?: Array<{ id: string; name: string; isHQ?: boolean }>\n}\n\n// ---------------------------------------------------------------------------\n// Defaults\n// ---------------------------------------------------------------------------\n\nconst DEFAULT_LABELS: InventoryPluginLabels = {\n pageTitle: 'Inventory',\n pageSubtitle: 'Product catalog and stock management',\n dashboard: 'Dashboard',\n products: 'Products',\n productsNew: 'New',\n productsList: 'List',\n stock: 'Stock',\n stockEntry: 'Entry',\n stockExit: 'Exit',\n stockHistory: 'History',\n recipes: 'Recipes',\n recipesNew: 'New',\n recipesList: 'List',\n}\n\nconst DEFAULT_CURRENCY = { code: 'BRL', locale: 'pt-BR', symbol: 'R$' }\n\nconst DEFAULT_PRODUCT_TYPES = [\n { value: 'ingredient', label: 'Ingredient' },\n { value: 'sale', label: 'For Sale' },\n { value: 'intermediate', label: 'Intermediate' },\n { value: 'asset', label: 'Asset' },\n]\n\n// ---------------------------------------------------------------------------\n// Config resolver\n// ---------------------------------------------------------------------------\n\nfunction resolveConfig(options?: InventoryPluginOptions): ResolvedInventoryConfig {\n return {\n modules: {\n recipes: options?.modules?.recipes !== false,\n stockLocations: options?.modules?.stockLocations !== false,\n batchTracking: options?.modules?.batchTracking ?? false,\n },\n labels: { ...DEFAULT_LABELS, ...options?.labels },\n currency: { ...DEFAULT_CURRENCY, ...options?.currency },\n productTypes: options?.productTypes ?? DEFAULT_PRODUCT_TYPES,\n locations: options?.locations ?? [],\n }\n}\n\n// ---------------------------------------------------------------------------\n// Factory\n// ---------------------------------------------------------------------------\n\nexport function createInventoryPlugin(options?: InventoryPluginOptions): PluginManifest {\n const config = resolveConfig(options)\n registerTranslations(inventoryLocales)\n const provider = options?.dataProvider ?? createSafeDataProvider(\n () => createSupabaseInventoryProvider(),\n () => createMockInventoryProvider(),\n )\n const store = createInventoryStore(provider)\n const dashboardWidgets = createInventoryDashboardWidgets({ config, provider, store })\n\n const PageComponent: React.FC<any> = () =>\n React.createElement(InventoryPage, { config, provider, store, registries: inventoryRegistries })\n\n return {\n id: 'inventory',\n name: config.labels.pageTitle,\n icon: 'Package',\n version: '1.0.0',\n scope: options?.scope ?? 'universal',\n verticalId: options?.verticalId,\n defaultEnabled: true,\n dependencies: [],\n declaredFeatures: [\n { id: 'inventory', label: config.labels.pageTitle, group: config.labels.pageTitle },\n ...(config.modules.recipes ? [{ id: 'inventory.recipes', label: config.labels.recipes ?? 'Recipes', group: config.labels.pageTitle }] : []),\n ],\n navigation: [\n {\n section: options?.navSection ?? 'main',\n position: options?.navPosition ?? 4,\n label: config.labels.pageTitle,\n route: '/inventory',\n icon: 'Package',\n permission: { feature: 'inventory', action: 'read' as const },\n },\n ],\n routes: [\n {\n path: '/inventory',\n component: PageComponent,\n permission: { feature: 'inventory', action: 'read' as const },\n },\n ],\n widgets: [],\n dashboardWidgets,\n aiTools: [\n {\n id: 'inventory.low-stock',\n name: 'getLowStock',\n description: 'Lists products with stock below minimum threshold.',\n icon: 'AlertTriangle',\n mode: 'read' as const,\n category: 'Inventory',\n parameters: {\n type: 'object' as const,\n properties: {\n threshold: { type: 'number' as const, description: 'Custom stock threshold' },\n },\n },\n suggestions: [\n { label: 'Which products are running low?' },\n { label: 'What ingredients need restocking?', verticalId: 'food' as const },\n { label: 'Show me a stock summary' },\n { label: 'What are my most used products?' },\n ],\n permission: { feature: 'inventory', action: 'read' as const },\n },\n ],\n registries: inventoryRegistries,\n settings: [\n {\n id: 'inventory',\n label: 'Inventory',\n icon: 'Package',\n component: (() => {\n const Tab: React.FC = () => React.createElement(InventoryGeneralSettings)\n Tab.displayName = 'InventorySettingsTab'\n return Tab\n })() as unknown as React.ComponentType<unknown>,\n order: 11,\n permission: { feature: 'inventory', action: 'read' as const },\n },\n ],\n locales: inventoryLocales,\n }\n}\n\nexport type { InventoryDataProvider } from './data/types'\nexport type { ResolvedInventoryConfig } from './InventoryContext'\n"]}
|