@fayz-ai/inventory 0.0.0-stage → 0.1.0

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.
Files changed (93) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +41 -2
  3. package/dist/chunk-2FXO63QV.js +1732 -0
  4. package/dist/chunk-2FXO63QV.js.map +1 -0
  5. package/dist/chunk-52AJ7H2W.js +116 -0
  6. package/dist/chunk-52AJ7H2W.js.map +1 -0
  7. package/dist/chunk-AFUR3HLA.js +84 -0
  8. package/dist/chunk-AFUR3HLA.js.map +1 -0
  9. package/dist/chunk-EF5LVTOC.js +65 -0
  10. package/dist/chunk-EF5LVTOC.js.map +1 -0
  11. package/dist/chunk-GBIFZCEN.js +33 -0
  12. package/dist/chunk-GBIFZCEN.js.map +1 -0
  13. package/dist/chunk-GDEIBHAB.js +14 -0
  14. package/dist/chunk-GDEIBHAB.js.map +1 -0
  15. package/dist/chunk-JN5AZ656.js +35 -0
  16. package/dist/chunk-JN5AZ656.js.map +1 -0
  17. package/dist/chunk-JX7NCXJQ.js +15 -0
  18. package/dist/chunk-JX7NCXJQ.js.map +1 -0
  19. package/dist/chunk-MCWG3PMP.js +549 -0
  20. package/dist/chunk-MCWG3PMP.js.map +1 -0
  21. package/dist/chunk-RUOX7OOY.js +30 -0
  22. package/dist/chunk-RUOX7OOY.js.map +1 -0
  23. package/dist/chunk-SZXUGORU.js +13 -0
  24. package/dist/chunk-SZXUGORU.js.map +1 -0
  25. package/dist/chunk-W36J5END.js +48 -0
  26. package/dist/chunk-W36J5END.js.map +1 -0
  27. package/dist/chunk-YZDGJBJD.js +53 -0
  28. package/dist/chunk-YZDGJBJD.js.map +1 -0
  29. package/dist/data/mock.d.ts +3 -0
  30. package/dist/data/mock.d.ts.map +1 -0
  31. package/dist/data/mock.js +10 -0
  32. package/dist/data/mock.js.map +1 -0
  33. package/dist/data/provider.d.ts +120 -0
  34. package/dist/data/provider.d.ts.map +1 -0
  35. package/dist/data/provider.js +3 -0
  36. package/dist/data/provider.js.map +1 -0
  37. package/dist/data/supabase.d.ts +3 -0
  38. package/dist/data/supabase.d.ts.map +1 -0
  39. package/dist/data/supabase.js +13 -0
  40. package/dist/data/supabase.js.map +1 -0
  41. package/dist/data/tables.d.ts +25 -0
  42. package/dist/data/tables.d.ts.map +1 -0
  43. package/dist/data/tables.js +3 -0
  44. package/dist/data/tables.js.map +1 -0
  45. package/dist/domain/consumption.d.ts +33 -0
  46. package/dist/domain/consumption.d.ts.map +1 -0
  47. package/dist/domain/consumption.js +3 -0
  48. package/dist/domain/consumption.js.map +1 -0
  49. package/dist/domain/count.d.ts +85 -0
  50. package/dist/domain/count.d.ts.map +1 -0
  51. package/dist/domain/count.js +3 -0
  52. package/dist/domain/count.js.map +1 -0
  53. package/dist/domain/movement.d.ts +101 -0
  54. package/dist/domain/movement.d.ts.map +1 -0
  55. package/dist/domain/movement.js +3 -0
  56. package/dist/domain/movement.js.map +1 -0
  57. package/dist/domain/product.d.ts +245 -0
  58. package/dist/domain/product.d.ts.map +1 -0
  59. package/dist/domain/product.js +3 -0
  60. package/dist/domain/product.js.map +1 -0
  61. package/dist/domain/query.d.ts +12 -0
  62. package/dist/domain/query.d.ts.map +1 -0
  63. package/dist/domain/query.js +3 -0
  64. package/dist/domain/query.js.map +1 -0
  65. package/dist/domain/recipe-sheet.d.ts +133 -0
  66. package/dist/domain/recipe-sheet.d.ts.map +1 -0
  67. package/dist/domain/recipe-sheet.js +3 -0
  68. package/dist/domain/recipe-sheet.js.map +1 -0
  69. package/dist/domain/recipe.d.ts +138 -0
  70. package/dist/domain/recipe.d.ts.map +1 -0
  71. package/dist/domain/recipe.js +3 -0
  72. package/dist/domain/recipe.js.map +1 -0
  73. package/dist/domain/reference-data.d.ts +37 -0
  74. package/dist/domain/reference-data.d.ts.map +1 -0
  75. package/dist/domain/reference-data.js +3 -0
  76. package/dist/domain/reference-data.js.map +1 -0
  77. package/dist/domain/stock.d.ts +132 -0
  78. package/dist/domain/stock.d.ts.map +1 -0
  79. package/dist/domain/stock.js +5 -0
  80. package/dist/domain/stock.js.map +1 -0
  81. package/dist/domain/usage-audit.d.ts +95 -0
  82. package/dist/domain/usage-audit.d.ts.map +1 -0
  83. package/dist/domain/usage-audit.js +3 -0
  84. package/dist/domain/usage-audit.js.map +1 -0
  85. package/dist/lib/idempotency.d.ts +4 -0
  86. package/dist/lib/idempotency.d.ts.map +1 -0
  87. package/dist/lib/idempotency.js +3 -0
  88. package/dist/lib/idempotency.js.map +1 -0
  89. package/dist/store.d.ts +52 -0
  90. package/dist/store.d.ts.map +1 -0
  91. package/dist/store.js +193 -0
  92. package/dist/store.js.map +1 -0
  93. package/package.json +50 -3
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/data/supabase.ts"],"names":[],"mappings":"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","file":"chunk-2FXO63QV.js","sourcesContent":["import type { SupabaseClient } from '@supabase/supabase-js'\nimport { emitDataChanged, getActiveTenantId, getActiveUnitId, getSupabaseClientOptional } from '@fayz-ai/core'\nimport {\n derivedProductType, isNewBarcodePrimary, productImageProblem,\n type CreateProductInput, type Product, type ProductAssetInfo, type ProductBarcode, type ProductVariant, type ProductCategory,\n type ProductClassification, type ProductGeneralExtras, type ProductIngredientInfo, type ProductIntermediateInfo,\n type ProductQuery, type ProductSaleInfo, type ProductTaxInfo, type Supplier,\n} from '../domain/product'\nimport {\n ledgerKind, reversedSourceDelta, signedLedgerQuantity,\n type CreateStockMovementInput, type MovementQuery, type MovementType, type StockMovement,\n} from '../domain/movement'\nimport {\n categoryCounts, expiryWindow, hasHealth, pickRestock, recentMovementCutoff, summarizeStock, toPanelRow,\n type CategoryCount, type InventorySummary, type RestockLine, type StockLocation, type StockPanelQuery,\n type StockPanelRow, type StockPosition,\n} from '../domain/stock'\nimport {\n countProgress,\n type CloseStockCountResult, type OpenStockCountInput, type StockCountItem, type StockCountSession,\n} from '../domain/count'\nimport {\n explodeRecipe,\n type CreateRecipeIngredientInput, type CreateRecipeInput, type Recipe, type RecipeGroup, type RecipeIngredient,\n} from '../domain/recipe'\nimport {\n assertConsumable, assertReversible, consumptionKey, skippedConsumption,\n type ConsumeRecipeForSourceInput, type InventoryConsumptionResult, type ReverseRecipeConsumptionInput,\n} from '../domain/consumption'\nimport type {\n UsageAuditApproveInput, UsageAuditApproveResult, UsageAuditBatchResult, UsageAuditCorrection,\n UsageAuditCorrectionInput, UsageAuditEntry, UsageAuditQuery,\n} from '../domain/usage-audit'\nimport type { PaginatedResult } from '../domain/query'\nimport {\n DEFAULT_STOCK_LOCATION, getDuplicateAutoCreatedLocationIds, getDuplicateDefaultUnitIds, getMissingMeasurementUnits,\n} from '../domain/reference-data'\nimport { createIdempotencyKey, randomId } from '../lib/idempotency'\nimport type { InventoryDataProvider } from './provider'\nimport { PRODUCT_CATEGORY_KIND, T } from './tables'\nimport type {\n IngredientCostSuggestion, IngredientInfo, MeasurementUnit, ProductionStation, RecipeAiSuggestion, RecipeCandidate,\n RecipeExportSheet, RecipeListRow, RecipeOutput, RecipeSheet,\n} from '../domain/recipe-sheet'\nimport type { ProductOptionGroup } from '../domain/product'\n\n// PostgREST rows arrive untyped; each mapper below is where one becomes a domain type.\ntype Row = Record<string, any>\n\nconst PRODUCT_SELECT: string = `*, ${T.productDetails}(*)`\n// `products` carries no balance since spine 188; the view derives stock, reserved and min_stock. Writes still go to `products`.\nconst PRODUCTS_READ = 'v_inventory_products'\nconst USAGE_AUDIT_READ = 'v_inventory_consumption_audit'\nconst COUNT_SESSION_SELECT: string = `*, ${T.stockLocations}(name), ${T.productCategories}(name)`\n\nconst referenceDataPromises = new Map<string, Promise<void>>()\n\nfunction client(): SupabaseClient {\n const supabase = getSupabaseClientOptional() as SupabaseClient | null\n if (!supabase) throw new Error('Supabase not initialized')\n return supabase\n}\n\n/** Services share `products` (spine 191) but hold no stock, so every whole-catalogue read leaves them out. */\nfunction goods(sb: SupabaseClient, columns: string, options?: { count: 'exact' }) {\n return sb.from(PRODUCTS_READ).select(columns, options).neq('kind', 'service')\n}\n\nfunction fail(operation: string, error: { message?: string } | null | undefined): void {\n if (error) throw new Error(`${operation}: ${error.message ?? 'Supabase request failed'}`)\n}\n\n// A API do Supabase devolve no máximo `max_rows` linhas (1000 no cluster) e\n// corta SEM erro. Leitura que pode passar disso pagina com `.range`.\nconst PAGE_ROWS = 1000\n// `.in()` vai na URL: 200 uuids ≈ 7,5 kB, longe do limite do gateway.\nconst IN_CHUNK = 200\n\ntype RangeQuery = PromiseLike<{ data: unknown[] | null; error: { message?: string } | null }>\n\nasync function selectAllRows<T>(page: (from: number, to: number) => RangeQuery, operation: string): Promise<T[]> {\n const out: T[] = []\n for (let from = 0; ; from += PAGE_ROWS) {\n const { data, error } = await page(from, from + PAGE_ROWS - 1)\n fail(operation, error)\n out.push(...((data ?? []) as T[]))\n if (!data || data.length < PAGE_ROWS) return out\n }\n}\n\nasync function selectInChunks<T>(\n ids: string[],\n page: (chunk: string[], from: number, to: number) => RangeQuery,\n operation: string,\n): Promise<T[]> {\n const chunks: string[][] = []\n for (let i = 0; i < ids.length; i += IN_CHUNK) chunks.push(ids.slice(i, i + IN_CHUNK))\n const parts = await Promise.all(chunks.map((chunk) => selectAllRows<T>((from, to) => page(chunk, from, to), operation)))\n return parts.flat()\n}\n\n/**\n * Product and sheet writes announce themselves, naming the record, so open\n * lists re-read just that row instead of the whole catalogue.\n */\nfunction announceWrites(provider: InventoryDataProvider): void {\n const announce = <K extends keyof InventoryDataProvider>(name: K, payloads: (args: any[], result: any) => Array<Parameters<typeof emitDataChanged>[0]>) => {\n const original = provider[name] as unknown as ((...args: any[]) => Promise<any>) | undefined\n if (!original) return\n ;(provider as any)[name] = async (...args: any[]) => {\n const result = await original.apply(provider, args)\n for (const p of payloads(args, result)) emitDataChanged({ source: 'ui', ...p })\n return result\n }\n }\n announce('createProduct', (_a, r) => [{ table: 'products', op: 'create', id: r?.id }])\n announce('updateProduct', ([id]) => [{ table: 'products', op: 'update', id }])\n announce('setIngredientCost', ([id]) => [{ table: 'products', op: 'update', id }])\n // Saving a sheet rewrites its product's cost too.\n announce('saveRecipeSheet', ([sheet], recipeId) => [\n { table: T.recipes, op: sheet?.id ? 'update' : 'create', id: recipeId },\n { table: 'products', op: 'update', id: sheet?.productId },\n ])\n}\n\nfunction mapRecipeOutput(o: any): RecipeOutput {\n return {\n id: o.id,\n productId: o.product_id,\n outputType: o.output_type,\n expectedQuantity: Number(o.expected_quantity) || 0,\n measurementUnitId: o.measurement_unit_id ?? undefined,\n costShare: o.cost_share != null ? Number(o.cost_share) : null,\n }\n}\n\n/**\n * The Fichas Técnicas list as ONE paginated read: product, its details, its\n * sheet, the sheet's lines with each ingredient's cost, and the category, all\n * embedded. The chunked path costs ~15 sequential round trips on a 400-sheet\n * house. Returns null when the embed is refused (a stale relationship cache\n * after a migration, see below) so the caller falls back to that path.\n */\nasync function recipeListInOneQuery(pub: any, productId?: string): Promise<RecipeListRow[] | null> {\n const select = [\n 'id, name, price, image_url, category_id',\n `details:${T.productDetails}!inner(is_for_sale, is_intermediate)`,\n `category:${T.productCategories}!category_id(name)`,\n `recipes:${T.recipes}!product_id(id, description, yield_quantity, preparation_time_minutes, updated_at, is_active,`\n + ` unit:${T.measurementUnits}!yield_unit_id(abbreviation),`\n + ` lines:${T.recipeIngredients}!recipe_id(quantity, ingredient:products!product_id(cost)))`,\n ].join(', ')\n let rows: any[]\n try {\n rows = await selectAllRows<any>((from, to) => {\n let q = pub.from('products').select(select)\n .eq('is_active', true).eq(`${T.productDetails}.is_produced`, true)\n if (productId) q = q.eq('id', productId)\n return q.order('id').range(from, to)\n }, 'Could not read recipe list')\n } catch {\n return null\n }\n rows.sort((a, b) => String(a.name ?? '').localeCompare(String(b.name ?? '')))\n return rows.map((p) => {\n const details = Array.isArray(p.details) ? p.details[0] : p.details\n // Same pick as the chunked path: the most recently updated active sheet.\n const r = ((p.recipes ?? []) as any[]).filter((x) => x.is_active)\n .sort((a, b) => String(b.updated_at ?? '').localeCompare(String(a.updated_at ?? '')))[0]\n const lines = (r?.lines ?? []) as any[]\n return {\n productId: p.id,\n productName: p.name,\n imageUrl: p.image_url ?? undefined,\n categoryName: p.category?.name ?? undefined,\n isForSale: Boolean(details?.is_for_sale),\n isIntermediate: Boolean(details?.is_intermediate),\n recipeId: r?.id,\n description: r?.description ?? undefined,\n ingredientCount: lines.length,\n yieldQuantity: r?.yield_quantity != null ? Number(r.yield_quantity) : undefined,\n yieldUnitAbbr: r?.unit?.abbreviation ?? undefined,\n preparationTimeMinutes: r?.preparation_time_minutes ?? undefined,\n cost: lines.reduce((sum, l) => sum + (Number(l.quantity) || 0) * (Number(l.ingredient?.cost) || 0), 0),\n salePrice: Number(p.price) || 0,\n }\n })\n}\n\n\nfunction snakeToCamel(obj: Row): Row {\n const result: Row = {}\n for (const [key, value] of Object.entries(obj)) {\n result[key.replace(/_([a-z])/g, (_, c: string) => c.toUpperCase())] = value\n }\n return result\n}\n\nfunction camelToSnake(obj: object): Row {\n const result: Row = {}\n for (const [key, value] of Object.entries(obj)) {\n if (key.startsWith('_')) continue\n result[key.replace(/[A-Z]/g, (c) => `_${c.toLowerCase()}`)] = value\n }\n return result\n}\n\n/** PostgREST returns a one-to-one embed as an object or a single-element array. */\nfunction embedded(value: unknown): Row | undefined {\n const one = Array.isArray(value) ? value[0] : value\n return one && typeof one === 'object' ? (one as Row) : undefined\n}\n\n/** Drops the embeds, or snakeToCamel would carry them through under mangled keys. */\nfunction withoutEmbeds(row: Row, keys: string[]): Row {\n const copy = { ...row }\n for (const key of keys) delete copy[key]\n return copy\n}\n\nfunction idsOf(rows: Row[], key: string): string[] {\n return [...new Set(rows.map((row) => row[key]).filter(Boolean))] as string[]\n}\n\nasync function namesById(sb: SupabaseClient, table: string, ids: string[]): Promise<Map<string, string>> {\n const names = new Map<string, string>()\n if (ids.length === 0) return names\n const { data } = await sb.from(table).select('id, name').in('id', ids)\n for (const row of (data ?? []) as Row[]) names.set(row.id, row.name)\n return names\n}\n\nfunction toRecipe(row: Row): Recipe {\n const recipe = snakeToCamel(withoutEmbeds(row, ['products'])) as Recipe\n const product = embedded(row.products)\n if (product) {\n recipe.productName = product.name ?? recipe.productName\n recipe.productSalePrice = product.price ?? undefined\n }\n return recipe\n}\n\nfunction toRecipeIngredient(row: Row): RecipeIngredient {\n const ingredient = snakeToCamel(withoutEmbeds(row, ['products', T.recipeGroups])) as RecipeIngredient\n const group = embedded(row[T.recipeGroups])\n if (group) ingredient.groupName = group.name\n const product = embedded(row.products)\n if (product) {\n const details = embedded(product[T.productDetails])\n ingredient.productName = product.name ?? ingredient.productName\n ingredient.costBasis = {\n cost: Number(product.cost) || 0,\n conversionFactor: details?.conversion_factor ?? undefined,\n purchaseUnitId: details?.purchase_unit_id ?? undefined,\n }\n }\n return ingredient\n}\n\nfunction toCountSession(row: Row): StockCountSession {\n const session = snakeToCamel(withoutEmbeds(row, [T.stockLocations, T.productCategories])) as StockCountSession\n session.stockLocationName = embedded(row[T.stockLocations])?.name\n session.categoryName = embedded(row[T.productCategories])?.name\n session.blind = row.blind ?? true\n return session\n}\n\nfunction toCountItem(row: Row): StockCountItem {\n const item = snakeToCamel(withoutEmbeds(row, ['products'])) as StockCountItem\n const product = embedded(row.products)\n if (product) {\n item.productName = product.name\n item.productSku = product.sku ?? undefined\n }\n item.systemQuantity = Number(row.system_quantity) || 0\n item.countedQuantity = row.counted_quantity == null ? undefined : Number(row.counted_quantity)\n item.unitCost = Number(row.unit_cost) || 0\n return item\n}\n\nfunction toClassification(d: Row): ProductClassification {\n return {\n isIngredient: d.is_ingredient ?? false,\n isForSale: d.is_for_sale ?? false,\n isIntermediate: d.is_intermediate ?? false,\n isAsset: d.is_asset ?? false,\n isProduced: d.is_produced ?? false,\n isResale: d.is_resale ?? false,\n trackByUnitLabel: d.track_by_unit_label ?? false,\n }\n}\n\nfunction toGeneralExtras(d: Row): ProductGeneralExtras {\n return {\n commissionPercent: d.commission_percent ?? undefined,\n chartAccountId: d.chart_account_id ?? undefined,\n contentPerUnit: d.content_per_unit ?? undefined,\n contentUnitId: d.content_unit_id ?? undefined,\n avgPurchasePrice: d.avg_purchase_price ?? undefined,\n avgPurchasePriceUpdatedAt: d.avg_purchase_price_updated_at ?? undefined,\n professionalResalePrice: d.professional_resale_price ?? undefined,\n requireBatchForStock: d.require_batch_for_stock ?? false,\n requireExpiryForStock: d.require_expiry_for_stock ?? false,\n }\n}\n\nfunction toProduct(row: Row): Product {\n const meta = row.metadata ?? {}\n const d = embedded(row[T.productDetails]) ?? {}\n const classification = toClassification(d)\n return {\n classification,\n extras: toGeneralExtras(d),\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: derivedProductType(classification, meta.productType),\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 categoryId: row.category_id ?? undefined,\n measurementUnitId: d.measurement_unit_id ?? undefined,\n purchaseUnitId: d.purchase_unit_id ?? undefined,\n conversionFactor: d.conversion_factor ?? undefined,\n supplierId: d.supplier_id ?? undefined,\n defaultLocationId: d.default_location_id ?? undefined,\n purpose: d.purpose ?? undefined,\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\n/** The satellite columns, or null when the caller touched none of them. */\n/**\n * Products photographed in the store keep their pictures in the shop gallery,\n * never in `products.image_url`. Borrow the cover for the list; a house\n * without the shop (table absent) simply keeps the placeholder.\n */\nasync function fillCoverFromShopGallery(core: any, products: Product[]): Promise<void> {\n const missing = products.filter((p) => !p.imageUrl).map((p) => p.id)\n if (missing.length === 0) return\n // Images hang off the listing's own id, which need not equal the product id.\n const { data, error } = await core.from('plg_shop_products')\n .select('product_id, images:plg_shop_product_images(url, is_primary, sort_order)')\n .in('product_id', missing)\n if (error || !data?.length) return\n const cover = new Map<string, { url: string; rank: number }>()\n for (const listing of data as Array<Record<string, any>>) {\n for (const img of (listing.images ?? []) as Array<Record<string, any>>) {\n const rank = (img.is_primary ? 0 : 1e6) + (img.sort_order ?? 0)\n const current = cover.get(listing.product_id)\n if (img.url && (!current || rank < current.rank)) cover.set(listing.product_id, { url: img.url, rank })\n }\n }\n for (const p of products) {\n if (!p.imageUrl) p.imageUrl = cover.get(p.id)?.url\n }\n}\n\nfunction productDetailsRow(input: Partial<CreateProductInput>): Row | null {\n const row: Row = {}\n if (input.measurementUnitId !== undefined) row.measurement_unit_id = input.measurementUnitId || null\n if (input.purchaseUnitId !== undefined) row.purchase_unit_id = input.purchaseUnitId || null\n if (input.conversionFactor !== undefined) row.conversion_factor = input.conversionFactor ?? 1\n if (input.supplierId !== undefined) row.supplier_id = input.supplierId || null\n if (input.defaultLocationId !== undefined) row.default_location_id = input.defaultLocationId || null\n if (input.purpose !== undefined) row.purpose = input.purpose || null\n\n const c = input.classification\n if (c) {\n if (c.isIngredient !== undefined) row.is_ingredient = c.isIngredient\n if (c.isForSale !== undefined) row.is_for_sale = c.isForSale\n if (c.isIntermediate !== undefined) row.is_intermediate = c.isIntermediate\n if (c.isAsset !== undefined) row.is_asset = c.isAsset\n if (c.isProduced !== undefined) row.is_produced = c.isProduced\n if (c.isResale !== undefined) row.is_resale = c.isResale\n if (c.trackByUnitLabel !== undefined) row.track_by_unit_label = c.trackByUnitLabel\n }\n\n const e = input.extras\n if (e) {\n if (e.commissionPercent !== undefined) row.commission_percent = e.commissionPercent ?? 0\n if (e.chartAccountId !== undefined) row.chart_account_id = e.chartAccountId || null\n if (e.contentPerUnit !== undefined) row.content_per_unit = e.contentPerUnit ?? null\n if (e.contentUnitId !== undefined) row.content_unit_id = e.contentUnitId || null\n if (e.avgPurchasePrice !== undefined) row.avg_purchase_price = e.avgPurchasePrice ?? null\n if (e.professionalResalePrice !== undefined) row.professional_resale_price = e.professionalResalePrice ?? null\n if (e.requireBatchForStock !== undefined) row.require_batch_for_stock = e.requireBatchForStock\n if (e.requireExpiryForStock !== undefined) row.require_expiry_for_stock = e.requireExpiryForStock\n }\n return Object.keys(row).length > 0 ? row : null\n}\n\ninterface InfoTable<V> {\n table: string\n toRow(value: V): Row\n fromRow(row: Row): V\n}\n\nconst ingredientInfo: InfoTable<ProductIngredientInfo> = {\n table: T.productIngredientInfo,\n toRow: (v) => ({\n minimum_quantity: v.minimumQuantity ?? 0,\n maximum_quantity: v.maximumQuantity ?? null,\n reorder_point: v.reorderPoint ?? null,\n lead_time_days: v.leadTimeDays ?? null,\n shelf_life_days: v.shelfLifeDays ?? null,\n storage_temperature: v.storageTemperature || null,\n allowed_supplier_ids: v.allowedSupplierIds?.length ? v.allowedSupplierIds : null,\n notes: v.notes || null,\n }),\n fromRow: (r) => ({\n minimumQuantity: r.minimum_quantity ?? undefined,\n maximumQuantity: r.maximum_quantity ?? undefined,\n reorderPoint: r.reorder_point ?? undefined,\n leadTimeDays: r.lead_time_days ?? undefined,\n shelfLifeDays: r.shelf_life_days ?? undefined,\n storageTemperature: r.storage_temperature ?? undefined,\n allowedSupplierIds: r.allowed_supplier_ids ?? undefined,\n notes: r.notes ?? undefined,\n }),\n}\n\nconst saleInfo: InfoTable<ProductSaleInfo> = {\n table: T.productSaleInfo,\n toRow: (v) => ({\n menu_description: v.menuDescription || null,\n allergens: v.allergens || null,\n preparation_time_minutes: v.preparationTimeMinutes ?? null,\n serves_quantity: v.servesQuantity ?? null,\n calories: v.calories ?? null,\n sold_by_weight: v.soldByWeight ?? false,\n highlight_delivery: v.highlightDelivery ?? false,\n available_for_delivery: v.availableForDelivery ?? true,\n available_for_counter: v.availableForCounter ?? true,\n notes: v.notes || null,\n }),\n fromRow: (r) => ({\n menuDescription: r.menu_description ?? undefined,\n allergens: r.allergens ?? undefined,\n preparationTimeMinutes: r.preparation_time_minutes ?? undefined,\n servesQuantity: r.serves_quantity ?? undefined,\n calories: r.calories ?? undefined,\n soldByWeight: r.sold_by_weight ?? false,\n highlightDelivery: r.highlight_delivery ?? false,\n availableForDelivery: r.available_for_delivery ?? true,\n availableForCounter: r.available_for_counter ?? true,\n notes: r.notes ?? undefined,\n }),\n}\n\nconst intermediateInfo: InfoTable<ProductIntermediateInfo> = {\n table: T.productIntermediateInfo,\n toRow: (v) => ({\n yield_percentage: v.yieldPercentage ?? null,\n preparation_time_minutes: v.preparationTimeMinutes ?? null,\n shelf_life_hours: v.shelfLifeHours ?? null,\n batch_size: v.batchSize ?? null,\n batch_unit_id: v.batchUnitId || null,\n storage_instructions: v.storageInstructions || null,\n notes: v.notes || null,\n }),\n fromRow: (r) => ({\n yieldPercentage: r.yield_percentage ?? undefined,\n preparationTimeMinutes: r.preparation_time_minutes ?? undefined,\n shelfLifeHours: r.shelf_life_hours ?? undefined,\n batchSize: r.batch_size ?? undefined,\n batchUnitId: r.batch_unit_id ?? undefined,\n storageInstructions: r.storage_instructions ?? undefined,\n notes: r.notes ?? undefined,\n }),\n}\n\nconst assetInfo: InfoTable<ProductAssetInfo> = {\n table: T.productAssetInfo,\n toRow: (v) => ({\n asset_value: v.assetValue ?? 0,\n residual_value: v.residualValue ?? 0,\n useful_life_months: v.usefulLifeMonths ?? null,\n depreciation_rate: v.depreciationRate ?? null,\n serial_number: v.serialNumber || null,\n acquisition_date: v.acquisitionDate || null,\n warranty_expiry_date: v.warrantyExpiryDate || null,\n asset_status: v.assetStatus || 'active',\n asset_location: v.assetLocation || null,\n responsible_person_id: v.responsiblePersonId || null,\n insurance_policy: v.insurancePolicy || null,\n last_maintenance_date: v.lastMaintenanceDate || null,\n next_maintenance_date: v.nextMaintenanceDate || null,\n notes: v.notes || null,\n }),\n fromRow: (r) => ({\n assetValue: r.asset_value ?? undefined,\n residualValue: r.residual_value ?? undefined,\n usefulLifeMonths: r.useful_life_months ?? undefined,\n depreciationRate: r.depreciation_rate ?? undefined,\n serialNumber: r.serial_number ?? undefined,\n acquisitionDate: r.acquisition_date ?? undefined,\n warrantyExpiryDate: r.warranty_expiry_date ?? undefined,\n assetStatus: r.asset_status ?? undefined,\n assetLocation: r.asset_location ?? undefined,\n responsiblePersonId: r.responsible_person_id ?? undefined,\n insurancePolicy: r.insurance_policy ?? undefined,\n lastMaintenanceDate: r.last_maintenance_date ?? undefined,\n nextMaintenanceDate: r.next_maintenance_date ?? undefined,\n notes: r.notes ?? undefined,\n }),\n}\n\nconst taxInfo: InfoTable<ProductTaxInfo> = {\n table: T.productTaxInfo,\n toRow: (v) => ({\n tax_group_id: v.taxGroupId || null,\n ncm: v.ncm || null,\n cest: v.cest || null,\n icms_origin: v.icmsOrigin || null,\n icms_rate: v.icmsRate ?? null,\n cfop: v.cfop || null,\n cst: v.cst || null,\n pis_situation: v.pisSituation || null,\n pis_rate: v.pisRate ?? null,\n cofins_situation: v.cofinsSituation || null,\n cofins_rate: v.cofinsRate ?? null,\n base_calculation_mode: v.baseCalculationMode || null,\n benefit_code: v.benefitCode || null,\n poverty_fund_rate: v.povertyFundRate ?? null,\n ibs_cbs_situation: v.ibsCbsSituation || null,\n ibs_cbs_classification: v.ibsCbsClassification || null,\n }),\n fromRow: (r) => ({\n taxGroupId: r.tax_group_id ?? undefined,\n ncm: r.ncm ?? undefined,\n cest: r.cest ?? undefined,\n icmsOrigin: r.icms_origin ?? undefined,\n icmsRate: r.icms_rate ?? undefined,\n cfop: r.cfop ?? undefined,\n cst: r.cst ?? undefined,\n pisSituation: r.pis_situation ?? undefined,\n pisRate: r.pis_rate ?? undefined,\n cofinsSituation: r.cofins_situation ?? undefined,\n cofinsRate: r.cofins_rate ?? undefined,\n baseCalculationMode: r.base_calculation_mode ?? undefined,\n benefitCode: r.benefit_code ?? undefined,\n povertyFundRate: r.poverty_fund_rate ?? undefined,\n ibsCbsSituation: r.ibs_cbs_situation ?? undefined,\n ibsCbsClassification: r.ibs_cbs_classification ?? undefined,\n }),\n}\n\n/** One table per thing the product is, keyed by product. */\nconst INFO_TABLES = { ingredientInfo, saleInfo, intermediateInfo, assetInfo, taxInfo } as const\ntype InfoKey = keyof typeof INFO_TABLES\nconst INFO_KEYS = Object.keys(INFO_TABLES) as InfoKey[]\n\n/**\n * Writes only the fichas the caller mentioned: turning a switch off hides a section and never erases it.\n * A failing ficha (fiscal not installed) does not fail the product save.\n */\nasync function saveProductInfos(\n sb: SupabaseClient,\n tenantId: string | undefined,\n productId: string,\n input: Partial<CreateProductInput>,\n): Promise<string[]> {\n const failures: string[] = []\n for (const key of INFO_KEYS) {\n const value = input[key]\n if (!value) continue\n const def = INFO_TABLES[key] as InfoTable<typeof value>\n const row = { ...def.toRow(value), product_id: productId, tenant_id: tenantId }\n const { error } = await sb.from(def.table).upsert(row, { onConflict: 'product_id' })\n if (error) failures.push(`${def.table}: ${error.message}`)\n }\n\n for (const ch of input.saleChannels ?? []) {\n const { error } = await sb.from(T.productSaleChannels).upsert(\n { tenant_id: tenantId, product_id: productId, channel: ch.channel, price: ch.price ?? 0, active: ch.active ?? true },\n { onConflict: 'product_id,channel' },\n )\n if (error) failures.push(`${T.productSaleChannels}: ${error.message}`)\n }\n return failures\n}\n\nasync function hydrateRecipes(sb: SupabaseClient, rows: Row[]): Promise<Recipe[]> {\n // Explicit reads instead of a PostgREST embed: a stale relationship cache after a migration fails the whole select.\n const productIds = idsOf(rows, 'product_id')\n const productsById = new Map<string, Row>()\n if (productIds.length > 0) {\n const { data, error } = await sb.from('products').select('id, name, price').in('id', productIds)\n fail('Could not read recipe products', error)\n for (const product of (data ?? []) as Row[]) productsById.set(product.id, product)\n }\n return rows.map((row) => toRecipe({ ...row, products: productsById.get(row.product_id) }))\n}\n\nasync function hydrateRecipeIngredients(sb: SupabaseClient, rows: Row[], includeGroups: boolean): Promise<RecipeIngredient[]> {\n const productIds = idsOf(rows, 'product_id')\n const productsById = new Map<string, Row>()\n const detailsByProductId = new Map<string, Row>()\n const unitsById = new Map<string, Row>()\n\n if (productIds.length > 0) {\n const [{ data: products, error: productsError }, { data: details, error: detailsError }] = await Promise.all([\n sb.from('products').select('id, name, cost').in('id', productIds),\n sb.from(T.productDetails).select('product_id, conversion_factor, measurement_unit_id, purchase_unit_id').in('product_id', productIds),\n ])\n fail('Could not read recipe ingredient products', productsError)\n fail('Could not read recipe ingredient details', detailsError)\n for (const product of (products ?? []) as Row[]) productsById.set(product.id, product)\n for (const detail of (details ?? []) as Row[]) detailsByProductId.set(detail.product_id, detail)\n\n const unitIds = [...new Set([\n ...rows.map((row) => row.unit_id),\n ...((details ?? []) as Row[]).map((detail) => detail.measurement_unit_id),\n ].filter(Boolean))] as string[]\n if (unitIds.length > 0) {\n const { data: units, error: unitsError } = await sb.from(T.measurementUnits).select('id, name, abbreviation').in('id', unitIds)\n fail('Could not read recipe ingredient units', unitsError)\n for (const unit of (units ?? []) as Row[]) unitsById.set(unit.id, unit)\n }\n }\n\n const groupsById = new Map<string, Row>()\n const groupIds = includeGroups ? idsOf(rows, 'group_id') : []\n if (groupIds.length > 0) {\n const { data, error } = await sb.from(T.recipeGroups).select('id, name').in('id', groupIds)\n fail('Could not read recipe groups', error)\n for (const group of (data ?? []) as Row[]) groupsById.set(group.id, group)\n }\n\n return rows.map((row) => {\n const product = productsById.get(row.product_id)\n const details = detailsByProductId.get(row.product_id)\n const ingredient = toRecipeIngredient({\n ...row,\n products: product ? { ...product, [T.productDetails]: details } : undefined,\n [T.recipeGroups]: groupsById.get(row.group_id),\n })\n const unitId = row.unit_id ?? details?.measurement_unit_id\n const unit = unitId ? unitsById.get(unitId) : undefined\n ingredient.unitId = unitId ?? ingredient.unitId\n ingredient.unitName = unit?.abbreviation ?? unit?.name ?? ingredient.unitName\n return ingredient\n })\n}\n\nasync function defaultLocationId(sb: SupabaseClient, tenantId: string | undefined): Promise<string | undefined> {\n if (!tenantId) return undefined\n const { data } = await sb.from(T.stockLocations).select('id')\n .eq('tenant_id', tenantId).eq('is_active', true).order('created_at').limit(1)\n return data?.[0]?.id\n}\n\n/** HQ first, because that is the unit `create_tenant` always makes. */\nasync function defaultUnitId(sb: SupabaseClient, tenantId: string): Promise<string | undefined> {\n const { data } = await sb.from('v_units').select('id, kind').eq('tenant_id', tenantId).order('kind', { ascending: true }).limit(50)\n const rows = (data ?? []) as Array<{ id: string; kind?: string | null }>\n return (rows.find((r) => r.kind === 'hq') ?? rows[0])?.id\n}\n\n/**\n * Moves one (product, location, batch, expiry) slot and returns how much on-hand actually changed.\n * On the insert race it retries once against the row the other writer created; the unique slot index makes that safe.\n */\nasync function applyPositionDelta(\n sb: SupabaseClient,\n tenantId: string | undefined,\n slot: Pick<CreateStockMovementInput, 'productId' | 'unitCost' | 'batchNumber' | 'expirationDate'>,\n locationId: string,\n amount: number,\n): Promise<number> {\n const bump = async (): Promise<number | null> => {\n const { data: existing, error } = await sb.from(T.stockPositions).select('id, quantity')\n .eq('product_id', slot.productId)\n .eq('stock_location_id', locationId)\n .is('batch_number', slot.batchNumber ?? null)\n .is('expiration_date', slot.expirationDate ?? null)\n .maybeSingle()\n if (error) throw new Error(error.message)\n if (!existing) return null\n const current = Number(existing.quantity) || 0\n const { error: updateError } = await sb.from(T.stockPositions)\n .update({ quantity: current + amount, unit_cost: slot.unitCost ?? 0 })\n .eq('id', existing.id)\n if (updateError) throw new Error(updateError.message)\n return amount\n }\n\n const bumped = await bump()\n if (bumped !== null) return bumped\n\n const { error: insertError } = await sb.from(T.stockPositions).insert({\n tenant_id: tenantId,\n product_id: slot.productId,\n stock_location_id: locationId,\n quantity: amount,\n unit_cost: slot.unitCost ?? 0,\n batch_number: slot.batchNumber ?? null,\n expiration_date: slot.expirationDate ?? null,\n })\n if (!insertError) return amount\n if (insertError.code === '23505') {\n const retried = await bump()\n if (retried !== null) return retried\n }\n throw new Error(insertError.message)\n}\n\nfunction toUsageAuditEntry(r: Row, names: Map<string, string>): UsageAuditEntry {\n return {\n itemId: r.item_id,\n productId: r.product_id,\n productName: r.product_name ?? undefined,\n productSku: r.product_sku ?? undefined,\n usedAt: r.used_at,\n movementDate: r.movement_date,\n postedQuantity: Number(r.posted_quantity ?? 0),\n netQuantity: Number(r.net_quantity ?? 0),\n // Null is \"no standard to compare to\"; 0 is a standard of zero.\n standardQuantity: r.standard_quantity == null ? null : Number(r.standard_quantity),\n variance: r.variance == null ? null : Number(r.variance),\n unitAbbreviation: r.unit_abbreviation ?? undefined,\n totalCost: Number(r.total_cost ?? 0),\n stockLocationId: r.stock_location_id ?? undefined,\n stockLocationName: r.stock_location_name ?? undefined,\n locationCount: Number(r.location_count ?? 1),\n recipeId: r.recipe_id ?? undefined,\n recipeName: r.recipe_name ?? undefined,\n orderId: r.order_id ?? undefined,\n itemName: r.item_name ?? undefined,\n orderReference: r.order_reference ?? undefined,\n performedById: r.performed_by_id ?? undefined,\n performedByName: r.performed_by_name ?? names.get(r.performed_by_id) ?? undefined,\n customerId: r.customer_id ?? undefined,\n customerName: r.customer_name ?? names.get(r.customer_id) ?? undefined,\n correctedAt: r.corrected_at ?? undefined,\n correctionReason: r.correction_reason ?? undefined,\n isCorrected: Boolean(r.is_corrected),\n source: r.source ?? undefined,\n stockPosted: r.stock_posted == null ? undefined : Boolean(r.stock_posted),\n }\n}\n\n/** The error a function put in its body — the client's own message is generic. */\nasync function invokeFunction<T>(pub: any, name: string, body: Record<string, unknown>): Promise<T> {\n const { data, error } = await pub.functions.invoke(name, { body: { ...body, tenantId: getActiveTenantId() ?? null } })\n if (error) {\n const payload = await (error as { context?: Response }).context?.json?.().catch(() => null)\n throw new Error((payload as { error?: string } | null)?.error ?? error.message)\n }\n const res = (data ?? {}) as Record<string, unknown>\n if (res.ok === false || typeof res.error === 'string') throw new Error(String(res.error ?? 'A IA não respondeu.'))\n return res as T\n}\n\n/**\n * Base unit of each product. The catalogue row comes first; when it is empty —\n * every migrated Artorius product — the unit the product already has on sheet\n * lines answers, because that is the unit those quantities were written in.\n */\nasync function resolveBaseUnits(pub: any, productIds: string[]): Promise<Map<string, string>> {\n const out = new Map<string, string>()\n if (productIds.length === 0) return out\n const { data: details, error } = await pub.from(T.productDetails)\n .select('product_id, measurement_unit_id').in('product_id', productIds)\n fail('Could not read product units', error)\n for (const d of details ?? []) if (d.measurement_unit_id) out.set(d.product_id, d.measurement_unit_id)\n const missing = productIds.filter((id) => !out.has(id))\n if (missing.length > 0) {\n const { data: lines, error: linesError } = await pub.from(T.recipeIngredients)\n .select('product_id, unit_id, created_at').in('product_id', missing).not('unit_id', 'is', null)\n .order('created_at', { ascending: false })\n fail('Could not read sheet units', linesError)\n for (const l of lines ?? []) if (!out.has(l.product_id)) out.set(l.product_id, l.unit_id)\n }\n return out\n}\n\nasync function readIngredientInfo(pub: any, productIds: string[]): Promise<IngredientInfo[]> {\n const ids = [...new Set(productIds.filter(Boolean))]\n if (ids.length === 0) return []\n const [{ data, error }, units] = await Promise.all([\n pub.from('products').select('id, name, cost').in('id', ids),\n resolveBaseUnits(pub, ids),\n ])\n fail('Could not read ingredients', error)\n return (data ?? []).map((p: any) => ({\n productId: p.id,\n name: p.name,\n cost: Number(p.cost) || 0,\n baseUnitId: units.get(p.id),\n }))\n}\n\n\nexport function createSupabaseInventoryProvider(): InventoryDataProvider {\n // The recipe-sheet methods below were written against one client under two names.\n const getClients = () => { const sb = client() as any; return { core: sb, pub: sb } }\n\n const provider: InventoryDataProvider = {\n async ensureReferenceData(): Promise<void> {\n const sb = client()\n const tenantId = getActiveTenantId()\n if (!tenantId) return\n\n const running = referenceDataPromises.get(tenantId)\n if (running) return running\n\n const prepare = (async () => {\n // Fills only what is missing, so tenant customisations stay and repeated mounts are harmless.\n const { data: units, error: unitsError } = await sb.from(T.measurementUnits)\n .select('id, abbreviation, created_at').eq('tenant_id', tenantId)\n if (unitsError) throw new Error(unitsError.message)\n\n const duplicateIds = getDuplicateDefaultUnitIds(units ?? [])\n if (duplicateIds.length > 0) {\n const { error } = await sb.from(T.measurementUnits).delete().in('id', duplicateIds)\n if (error) throw new Error(error.message)\n }\n\n const missing = getMissingMeasurementUnits(units ?? [])\n if (missing.length > 0) {\n const { error } = await sb.from(T.measurementUnits).insert(\n missing.map((unit) => ({ ...unit, tenant_id: tenantId, is_active: true })),\n )\n if (error) throw new Error(error.message)\n }\n\n const { data: locations, error: locationError } = await sb.from(T.stockLocations)\n .select('id, name, created_at').eq('tenant_id', tenantId)\n if (locationError) throw new Error(locationError.message)\n\n const duplicateLocationIds = getDuplicateAutoCreatedLocationIds(locations ?? [])\n if (duplicateLocationIds.length > 0) {\n const { error } = await sb.from(T.stockLocations).delete().in('id', duplicateLocationIds)\n if (error) throw new Error(error.message)\n }\n\n if (!locations || locations.length === 0) {\n // `unit_id` is NOT NULL since spine 136: a place to keep stock belongs to a unit.\n const unitId = getActiveUnitId() ?? (await defaultUnitId(sb, tenantId))\n if (!unitId) throw new Error('inventory: the tenant has no unit to attach the default stock location to')\n const { error } = await sb.from(T.stockLocations).insert({\n tenant_id: tenantId,\n unit_id: unitId,\n ...DEFAULT_STOCK_LOCATION,\n is_active: true,\n })\n if (error) throw new Error(error.message)\n }\n })()\n\n referenceDataPromises.set(tenantId, prepare)\n try {\n await prepare\n } finally {\n if (referenceDataPromises.get(tenantId) === prepare) referenceDataPromises.delete(tenantId)\n }\n },\n\n async getProducts(query: ProductQuery): Promise<PaginatedResult<Product>> {\n const sb = client()\n let qb = goods(sb, PRODUCT_SELECT, { count: 'exact' })\n if (query.search) qb = qb.ilike('name', `%${query.search}%`)\n if (query.productType) qb = qb.eq('metadata->>productType', query.productType)\n if (query.categoryId) qb = qb.eq('category_id', query.categoryId)\n if (query.isActive !== undefined) qb = qb.eq('is_active', query.isActive)\n if (query.lowStockOnly) qb = qb.lte('stock', 0)\n const page = query.page ?? 1\n const pageSize = query.pageSize ?? 50\n const { data, count } = await qb.range((page - 1) * pageSize, page * pageSize - 1).order('created_at', { ascending: false })\n const products = ((data ?? []) as Row[]).map(toProduct)\n await fillCoverFromShopGallery(sb, products)\n return { data: products, total: count ?? 0 }\n },\n\n async getProductById(id: string): Promise<Product | null> {\n const sb = client()\n const { data } = await sb.from(PRODUCTS_READ).select(PRODUCT_SELECT).eq('id', id).single()\n if (!data) return null\n const product = toProduct(data)\n\n // PostgREST does not embed children of a view, so each ficha is its own read; a missing table hides its section.\n const infos = await Promise.all(INFO_KEYS.map(async (key) => {\n const def = INFO_TABLES[key]\n const { data: row, error } = await sb.from(def.table).select('*').eq('product_id', id).maybeSingle()\n return [key, error || !row ? undefined : def.fromRow(row)] as const\n }))\n for (const [key, value] of infos) {\n if (value) Object.assign(product, { [key]: value })\n }\n\n const { data: channels } = await sb.from(T.productSaleChannels).select('channel, price, active').eq('product_id', id)\n if (channels?.length) {\n product.saleChannels = (channels as Row[]).map((c) => ({\n channel: c.channel, price: Number(c.price) || 0, active: c.active ?? true,\n }))\n }\n await fillCoverFromShopGallery(sb, [product])\n return product\n },\n\n async createProduct(input: CreateProductInput): Promise<Product> {\n const sb = client()\n const tenantId = getActiveTenantId()\n const { data, error } = await sb.from('products').insert({\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 is_active: true,\n image_url: input.imageUrl,\n category_id: input.categoryId || null,\n metadata: {\n productType: derivedProductType(input.classification, input.productType),\n barcode: input.barcode,\n brand: input.brand,\n maxQuantity: input.maxQuantity,\n },\n }).select().single()\n if (error) throw new Error(error.message)\n const productId: string = data.id\n\n if (input.minQuantity !== undefined || input.maxQuantity !== undefined) {\n await sb.from(T.productSettings).upsert(\n { tenant_id: tenantId, product_id: productId, min_quantity: input.minQuantity ?? 0, max_quantity: input.maxQuantity ?? null },\n { onConflict: 'tenant_id,product_id,unit_id' },\n )\n }\n\n const details = productDetailsRow(input)\n if (details) {\n const { error: detailsError } = await sb.from(T.productDetails)\n .upsert({ ...details, product_id: productId, tenant_id: tenantId }, { onConflict: 'product_id' })\n if (detailsError) throw new Error(detailsError.message)\n }\n\n const failures = await saveProductInfos(sb, tenantId, productId, input)\n if (failures.length) console.warn('[inventory] product fichas not saved:', failures)\n return (await provider.getProductById(productId)) ?? toProduct(data)\n },\n\n async getProductBarcodes(productId: string): Promise<ProductBarcode[]> {\n const { data } = await client().from(T.productBarcodes)\n .select('id, barcode, barcode_type, description, is_primary')\n .eq('product_id', productId)\n .order('is_primary', { ascending: false })\n .order('created_at', { ascending: true })\n return ((data ?? []) as Row[]).map((r) => ({\n id: r.id,\n barcode: r.barcode,\n barcodeType: r.barcode_type ?? undefined,\n description: r.description ?? undefined,\n isPrimary: r.is_primary ?? false,\n }))\n },\n\n async addProductBarcode(productId: string, input: ProductBarcode): Promise<void> {\n const existing = await provider.getProductBarcodes!(productId)\n const { error } = await client().from(T.productBarcodes).insert({\n tenant_id: getActiveTenantId(),\n product_id: productId,\n barcode: input.barcode.trim(),\n barcode_type: input.barcodeType || 'EAN-13',\n description: input.description || null,\n is_primary: isNewBarcodePrimary(input, existing.length),\n })\n if (error) throw new Error(error.message)\n },\n\n async getProductVariants(productId: string): Promise<ProductVariant[]> {\n const { data } = await client().from('product_variants')\n .select('id, name, sku, is_default, is_active, sort_order')\n .eq('product_id', productId)\n .order('sort_order', { ascending: true })\n .order('created_at', { ascending: true })\n const rows = (data ?? []) as Array<Record<string, any>>\n if (rows.length === 0) return []\n // The balance is kept per variant and unit; the tab shows the total the\n // person is allowed to see.\n const balances = await client().from('stock_balances').select('variant_id, on_hand').in('variant_id', rows.map((r) => r.id))\n const onHand = new Map<string, number>()\n for (const b of (balances.data ?? []) as Array<Record<string, any>>) {\n onHand.set(b.variant_id, (onHand.get(b.variant_id) ?? 0) + (Number(b.on_hand) || 0))\n }\n return rows.map((r) => ({\n id: r.id, name: r.name, sku: r.sku ?? undefined,\n isDefault: !!r.is_default, isActive: r.is_active !== false, onHand: onHand.get(r.id) ?? 0,\n }))\n },\n\n async addProductVariant(productId: string, input: { name: string; sku?: string }): Promise<void> {\n const existing = await provider.getProductVariants!(productId)\n const { error } = await client().from('product_variants').insert({\n tenant_id: getActiveTenantId(),\n product_id: productId,\n name: input.name.trim(),\n sku: input.sku?.trim() || null,\n sort_order: existing.length,\n })\n if (error) throw new Error(error.message)\n },\n\n async setProductVariantActive(id: string, active: boolean): Promise<void> {\n const { error } = await client().from('product_variants').update({ is_active: active }).eq('id', id)\n if (error) throw new Error(error.message)\n },\n\n async removeProductBarcode(id: string): Promise<void> {\n const { error } = await client().from(T.productBarcodes).delete().eq('id', id)\n if (error) throw new Error(error.message)\n },\n\n async setPrimaryProductBarcode(productId: string, id: string): Promise<void> {\n const sb = client()\n // Unmark first: the unique index allows one primary per product.\n await sb.from(T.productBarcodes).update({ is_primary: false }).eq('product_id', productId)\n const { error } = await sb.from(T.productBarcodes).update({ is_primary: true }).eq('id', id)\n if (error) throw new Error(error.message)\n },\n\n async updateProduct(id: string, partial: Partial<Product>): Promise<Product> {\n const sb = client()\n const tenantId = getActiveTenantId()\n const row: Row = {}\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.isActive !== undefined) row.is_active = partial.isActive\n if (partial.imageUrl !== undefined) row.image_url = partial.imageUrl\n if (partial.categoryId !== undefined) row.category_id = partial.categoryId || null\n\n const metaPatch: Row = {}\n if (partial.classification) metaPatch.productType = derivedProductType(partial.classification, partial.productType)\n else if (partial.productType !== undefined) metaPatch.productType = partial.productType\n if (partial.barcode !== undefined) metaPatch.barcode = partial.barcode\n if (partial.brand !== undefined) metaPatch.brand = partial.brand\n if (partial.maxQuantity !== undefined) metaPatch.maxQuantity = partial.maxQuantity\n if (Object.keys(metaPatch).length > 0) {\n // Merge, never replace: keys the caller did not mention must survive.\n const { data: current } = await sb.from('products').select('metadata').eq('id', id).single()\n row.metadata = { ...(current?.metadata ?? {}), ...metaPatch }\n }\n\n if (Object.keys(row).length > 0) {\n const { error } = await sb.from('products').update(row).eq('id', id)\n if (error) throw new Error(error.message)\n }\n\n if (partial.minQuantity !== undefined) {\n await sb.from(T.productSettings).upsert(\n { tenant_id: tenantId, product_id: id, min_quantity: partial.minQuantity },\n { onConflict: 'tenant_id,product_id,unit_id' },\n )\n }\n\n const details = productDetailsRow(partial)\n if (details) {\n const { error: detailsError } = await sb.from(T.productDetails)\n .upsert({ ...details, product_id: id, tenant_id: tenantId }, { onConflict: 'product_id' })\n if (detailsError) throw new Error(detailsError.message)\n }\n\n const failures = await saveProductInfos(sb, tenantId, id, partial)\n if (failures.length) console.warn('[inventory] product fichas not saved:', failures)\n\n const updated = await provider.getProductById(id)\n if (!updated) throw new Error(`Product ${id} not found after update`)\n return updated\n },\n\n async uploadProductImage(productId: string, file: File): Promise<string> {\n const sb = client()\n const tenantId = getActiveTenantId()\n if (!tenantId) throw new Error('Nenhum estabelecimento ativo para enviar a foto.')\n const problem = productImageProblem(file)\n if (problem) throw new Error(problem)\n\n const extension = file.name.split('.').pop()?.toLowerCase().replace(/[^a-z0-9]/g, '') || 'jpg'\n const path = `${tenantId}/products/${productId}/${randomId()}.${extension}`\n const bucket = sb.storage.from('inventory-images')\n const { error: uploadError } = await bucket.upload(path, file, { cacheControl: '31536000', contentType: file.type, upsert: false })\n if (uploadError) throw new Error(uploadError.message)\n\n const { data: { publicUrl } } = bucket.getPublicUrl(path)\n const { error: registerError } = await sb.rpc('inventory_register_product_image', {\n p_product: productId,\n p_storage_path: path,\n p_public_url: publicUrl,\n p_file_name: file.name,\n p_file_size: file.size,\n p_mime_type: file.type,\n })\n if (registerError) {\n // A file with no document row is permanent garbage; removing it keeps a failed register recoverable.\n await bucket.remove([path])\n throw new Error(registerError.message)\n }\n return publicUrl\n },\n\n async getMovements(query: MovementQuery): Promise<PaginatedResult<StockMovement>> {\n const sb = client()\n let qb = sb.from('v_stock_movements').select('*', { count: 'exact' })\n if (query.productId) qb = qb.eq('product_id', query.productId)\n if (query.movementType) {\n qb = qb.in('movement_type', Array.isArray(query.movementType) ? query.movementType : [query.movementType])\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 const { data, count } = await qb.range((page - 1) * pageSize, page * pageSize - 1).order('movement_date', { ascending: false })\n\n const movements = ((data ?? []) as Row[]).map((r) => {\n const movement = snakeToCamel(r) as StockMovement & { productSku?: string }\n movement.productName = r.product_name ?? movement.productName\n movement.productSku = r.product_sku ?? movement.productSku\n movement.stockLocationName = r.stock_location_name ?? movement.stockLocationName\n movement.destinationLocationName = r.destination_location_name ?? movement.destinationLocationName\n return movement\n })\n\n const unnamed = new Set<string>()\n for (const m of movements) {\n if (m.stockLocationId && !m.stockLocationName) unnamed.add(m.stockLocationId)\n if (m.destinationLocationId && !m.destinationLocationName) unnamed.add(m.destinationLocationId)\n }\n if (unnamed.size > 0) {\n const names = await namesById(sb, T.stockLocations, [...unnamed])\n for (const m of movements) {\n if (m.stockLocationId && !m.stockLocationName) m.stockLocationName = names.get(m.stockLocationId)\n if (m.destinationLocationId && !m.destinationLocationName) m.destinationLocationName = names.get(m.destinationLocationId)\n }\n }\n return { data: movements, total: count ?? 0 }\n },\n\n async createMovement(input: CreateStockMovementInput): Promise<StockMovement> {\n const sb = client()\n const tenantId = getActiveTenantId()\n const kind = ledgerKind(input.movementType)\n const line: Row = {\n product_id: input.productId,\n quantity: signedLedgerQuantity(kind, input.quantity),\n ...(input.unitCost != null ? { unit_cost: input.unitCost } : {}),\n ...(input.batchNumber ? { batch_number: input.batchNumber } : {}),\n ...(input.expirationDate ? { expiration_date: input.expirationDate } : {}),\n ...(input.notes ? { notes: input.notes } : {}),\n }\n // The RPC's location argument is required: PostgREST picks the overload by argument names, so it cannot be left out.\n const locationId = input.stockLocationId ?? await defaultLocationId(sb, tenantId)\n if (!locationId) throw new Error('inventory: this tenant has no stock location to record the movement against')\n const idempotencyKey = input.idempotencyKey ?? createIdempotencyKey(`inventory:${kind}`)\n\n // The ledger denies direct writes; these RPCs file the operation and recompute the position in one transaction.\n const { data: operation, error } = kind === 'in'\n ? await sb.rpc('inventory_receive', {\n p_location: locationId,\n p_lines: [line],\n p_document: {\n type: 'manual',\n ...(input.documentNumber ? { ref: input.documentNumber } : {}),\n ...(input.supplierId ? { supplier_id: input.supplierId } : {}),\n ...(input.movementDate ? { date: input.movementDate } : {}),\n },\n p_idempotency_key: idempotencyKey,\n })\n : await sb.rpc('inventory_adjust', {\n p_location: locationId,\n p_lines: [line],\n p_reason: input.reason ?? input.movementType,\n p_idempotency_key: idempotencyKey,\n })\n if (error) throw error\n\n const written = (operation as { movements?: Row[] } | null)?.movements?.[0]\n if (!written) throw new Error('inventory: the ledger accepted the operation but returned no movement')\n const movement = snakeToCamel({ ...written, tenant_id: tenantId, movement_type: input.movementType }) as StockMovement\n\n try {\n const { data: product } = await sb.from(PRODUCTS_READ).select('id, name, stock').eq('id', input.productId).single()\n movement.productName = product?.name\n if (input.stockLocationId) {\n const { data: loc } = await sb.from(T.stockLocations).select('name').eq('id', input.stockLocationId).single()\n movement.stockLocationName = loc?.name\n }\n if (input.destinationLocationId) {\n const { data: loc } = await sb.from(T.stockLocations).select('name').eq('id', input.destinationLocationId).single()\n movement.destinationLocationName = loc?.name\n }\n if (input.supplierId) {\n const { data: supplier } = await sb.from('people').select('name').eq('id', input.supplierId).single()\n movement.supplierName = supplier?.name\n }\n } catch {\n // Labels are optional; the acknowledged movement is returned without them.\n }\n return movement\n },\n\n async reverseMovement(movementId: string): Promise<void> {\n const sb = client()\n const tenantId = getActiveTenantId()\n const { data: row, error } = await sb.from(T.stockMovements).select('*').eq('id', movementId).single()\n if (error) throw new Error(error.message)\n if (!row) throw new Error(`Movement ${movementId} not found`)\n\n const movementType = row.movement_type as MovementType\n const quantity = Number(row.quantity) || 0\n const slot = {\n productId: row.product_id as string,\n unitCost: row.unit_cost ?? 0,\n batchNumber: row.batch_number ?? undefined,\n expirationDate: row.expiration_date ?? undefined,\n }\n\n // `select()` makes a delete RLS refused fail loudly; PostgREST reports deleting nothing as success.\n const { data: deleted, error: deleteError } = await sb.from(T.stockMovements).delete().eq('id', movementId).select('id')\n if (deleteError) throw new Error(deleteError.message)\n if (!deleted || deleted.length === 0) throw new Error(`Movement ${movementId} could not be deleted`)\n\n if (row.stock_location_id) {\n await applyPositionDelta(sb, tenantId, slot, row.stock_location_id, reversedSourceDelta(movementType, quantity))\n if (movementType === 'transfer' && row.destination_location_id) {\n await applyPositionDelta(sb, tenantId, slot, row.destination_location_id, -quantity)\n }\n }\n },\n\n async getPositions(productId: string): Promise<StockPosition[]> {\n const sb = client()\n const { data } = await sb.from(T.stockPositions).select('*').eq('product_id', productId)\n const positions = ((data ?? []) as Row[]).map((r) => snakeToCamel(r) as StockPosition)\n const names = await namesById(sb, T.stockLocations, [...new Set(positions.map((p) => p.stockLocationId).filter(Boolean))] as string[])\n for (const p of positions) {\n if (p.stockLocationId) p.stockLocationName = names.get(p.stockLocationId)\n }\n return positions\n },\n\n /** One line per slot; product and category narrow first so pagination never returns half pages. */\n async getStockPanel(query: StockPanelQuery): Promise<StockPanelRow[]> {\n const sb = client()\n const narrowsProducts = Boolean(query.productSearch || query.categoryId)\n const productSelect: string = PRODUCT_SELECT\n let qp = goods(sb, productSelect)\n if (query.productSearch) qp = qp.ilike('name', `%${query.productSearch}%`)\n if (query.categoryId) qp = qp.eq('category_id', query.categoryId)\n const { data: productRows } = await qp.limit(narrowsProducts ? 1000 : 5000)\n const productsById = new Map(((productRows ?? []) as Row[]).map(toProduct).map((p) => [p.id, p]))\n if (narrowsProducts && productsById.size === 0) return []\n\n let qb = sb.from(T.stockPositions).select('*')\n if (narrowsProducts) qb = qb.in('product_id', [...productsById.keys()])\n if (query.stockLocationId) qb = qb.eq('stock_location_id', query.stockLocationId)\n if (query.batch) qb = qb.ilike('batch_number', `%${query.batch}%`)\n const window = expiryWindow(query.expiry, new Date())\n if (window?.kind === 'expired') qb = qb.lt('expiration_date', window.before)\n else if (window?.kind === 'none') qb = qb.is('expiration_date', null)\n else if (window?.kind === 'within') qb = qb.gte('expiration_date', window.from).lte('expiration_date', window.to)\n const { data: positionRows } = await qb.limit(query.limit ?? 500)\n const positions = (positionRows ?? []) as Row[]\n\n const locationNames = await namesById(sb, T.stockLocations, idsOf(positions, 'stock_location_id'))\n return positions\n .map((r) => toPanelRow(\n {\n id: r.id,\n productId: r.product_id,\n quantity: r.quantity,\n unitCost: r.unit_cost,\n stockLocationId: r.stock_location_id ?? undefined,\n batchNumber: r.batch_number ?? undefined,\n expirationDate: r.expiration_date ?? undefined,\n },\n productsById.get(r.product_id),\n r.stock_location_id ? locationNames.get(r.stock_location_id) : undefined,\n ))\n .filter((row) => hasHealth(row, query.status))\n .sort((a, b) => a.productName.localeCompare(b.productName, 'pt-BR'))\n },\n\n async getLocations(): Promise<StockLocation[]> {\n const { data } = await client().from(T.stockLocations).select('*').eq('is_active', true).order('name')\n return ((data ?? []) as Row[]).map((r) => snakeToCamel(r) as StockLocation)\n },\n\n async createLocation(input): Promise<StockLocation> {\n const { data } = await client().from(T.stockLocations)\n .insert({ ...camelToSnake(input), tenant_id: getActiveTenantId() }).select().single()\n return snakeToCamel(data ?? {}) as StockLocation\n },\n\n async getSuppliers(): Promise<Supplier[]> {\n const { data } = await client().from('people')\n .select('id, name, document_number, phone')\n .eq('kind', 'supplier').eq('is_active', true)\n .order('name').limit(200)\n return ((data ?? []) as Row[]).map((r) => ({\n id: r.id,\n name: r.name,\n documentNumber: r.document_number ?? undefined,\n phone: r.phone ?? undefined,\n }))\n },\n\n async getCategories(): Promise<ProductCategory[]> {\n const { data } = await client().from(T.productCategories).select('*')\n .eq('kind', PRODUCT_CATEGORY_KIND).eq('is_active', true).order('name')\n return ((data ?? []) as Row[]).map((r) => snakeToCamel(r) as ProductCategory)\n },\n\n async getCountSessions(): Promise<StockCountSession[]> {\n const sb = client()\n const { data } = await sb.from(T.countSessions).select(COUNT_SESSION_SELECT).order('opened_at', { ascending: false }).limit(100)\n const sessions = ((data ?? []) as Row[]).map(toCountSession)\n if (sessions.length === 0) return sessions\n\n const { data: lines } = await sb.from(T.countItems)\n .select('session_id, system_quantity, counted_quantity')\n .in('session_id', sessions.map((s) => s.id))\n const bySession = new Map<string, Array<Pick<StockCountItem, 'systemQuantity' | 'countedQuantity'>>>()\n for (const line of (lines ?? []) as Row[]) {\n const items = bySession.get(line.session_id) ?? []\n items.push({\n systemQuantity: Number(line.system_quantity) || 0,\n countedQuantity: line.counted_quantity == null ? undefined : Number(line.counted_quantity),\n })\n bySession.set(line.session_id, items)\n }\n return sessions.map((session) => ({ ...session, ...countProgress(bySession.get(session.id) ?? []) }))\n },\n\n async getCountSession(id: string): Promise<StockCountSession | null> {\n const { data } = await client().from(T.countSessions).select(COUNT_SESSION_SELECT).eq('id', id).maybeSingle()\n return data ? toCountSession(data) : null\n },\n\n async getCountItems(sessionId: string): Promise<StockCountItem[]> {\n const { data } = await client().from(T.countItems).select('*, products(name, sku)').eq('session_id', sessionId)\n return ((data ?? []) as Row[]).map(toCountItem).sort((a, b) => (a.productName ?? '').localeCompare(b.productName ?? ''))\n },\n\n async openCountSession(input: OpenStockCountInput): Promise<StockCountSession> {\n // The snapshot has to be one consistent read, so the RPC opens and snapshots together.\n const { data, error } = await client().rpc('inventory_open_count_session', {\n p_stock_location_id: input.stockLocationId,\n p_category_id: input.categoryId ?? null,\n p_reference: input.reference ?? null,\n p_blind: input.blind ?? true,\n p_notes: input.notes ?? null,\n })\n if (error) throw new Error(error.message)\n const session = await provider.getCountSession(data as string)\n if (!session) throw new Error('Count session could not be read after opening')\n return session\n },\n\n async saveCountEntry(itemId: string, quantity: number | null, notes?: string): Promise<StockCountItem> {\n const sb = client()\n const now = new Date().toISOString()\n const row: Row = { counted_quantity: quantity, counted_at: quantity == null ? null : now, updated_at: now }\n if (notes !== undefined) row.notes = notes || null\n const { data, error } = await sb.from(T.countItems).update(row).eq('id', itemId).select('*, products(name, sku)').single()\n if (error) throw new Error(error.message)\n\n await sb.from(T.countSessions)\n .update({ status: 'counting', updated_at: now })\n .eq('id', data.session_id).eq('status', 'open')\n return toCountItem(data)\n },\n\n async closeCountSession(sessionId: string, reason?: string): Promise<CloseStockCountResult> {\n const { data, error } = await client().rpc('inventory_close_count_session', { p_session_id: sessionId, p_reason: reason ?? null })\n if (error) throw new Error(error.message)\n const result = (data ?? {}) as Row\n if (result.ok === false) throw new Error(result.error ?? 'Could not close the count')\n return {\n sessionId,\n adjustmentsCreated: Number(result.adjustments_created) || 0,\n alreadyClosed: result.already_closed === true,\n }\n },\n\n async cancelCountSession(sessionId: string): Promise<StockCountSession> {\n // The status fence: a closed count has already moved stock.\n const { error } = await client().from(T.countSessions)\n .update({ status: 'cancelled', updated_at: new Date().toISOString() })\n .eq('id', sessionId).neq('status', 'closed')\n if (error) throw new Error(error.message)\n const session = await provider.getCountSession(sessionId)\n if (!session) throw new Error(`Count session ${sessionId} not found`)\n return session\n },\n\n async getRecipes(): Promise<Recipe[]> {\n const sb = client()\n const { data, error } = await sb.from(T.recipes).select('*').eq('is_active', true).order('name')\n fail('Could not read recipes', error)\n return hydrateRecipes(sb, data ?? [])\n },\n\n async getRecipeById(id: string): Promise<Recipe | null> {\n const sb = client()\n const { data, error } = await sb.from(T.recipes).select('*').eq('id', id).maybeSingle()\n fail('Could not read recipe', error)\n if (!data) return null\n return (await hydrateRecipes(sb, [data]))[0] ?? null\n },\n\n async getRecipeIngredients(recipeId: string): Promise<RecipeIngredient[]> {\n const sb = client()\n const { data, error } = await sb.from(T.recipeIngredients).select('*').eq('recipe_id', recipeId).order('display_order')\n fail('Could not read recipe ingredients', error)\n return hydrateRecipeIngredients(sb, data ?? [], true)\n },\n\n async getAllRecipeIngredients(): Promise<RecipeIngredient[]> {\n const sb = client()\n const { data, error } = await sb.from(T.recipeIngredients).select('*').order('display_order')\n fail('Could not read recipe ingredients', error)\n return hydrateRecipeIngredients(sb, data ?? [], false)\n },\n\n async getRecipeGroups(recipeId: string): Promise<RecipeGroup[]> {\n const { data, error } = await client().from(T.recipeGroups).select('*').eq('recipe_id', recipeId).order('display_order')\n fail('Could not read recipe groups', error)\n return ((data ?? []) as Row[]).map((r) => snakeToCamel(r) as RecipeGroup)\n },\n\n async createRecipe(input: CreateRecipeInput): Promise<Recipe> {\n const sb = client()\n const tenantId = getActiveTenantId()\n const { ingredients, ...recipeData } = input\n const { data: recipe, error: recipeError } = await sb.from(T.recipes)\n .insert({ ...camelToSnake(recipeData), tenant_id: tenantId }).select().single()\n fail('Could not create recipe', recipeError)\n if (!recipe) throw new Error('Could not create recipe: Supabase returned no row')\n\n if (ingredients.length > 0) {\n const { error: ingredientsError } = await sb.from(T.recipeIngredients).insert(\n ingredients.map((ing) => ({ ...camelToSnake(ing), recipe_id: recipe.id, tenant_id: tenantId })),\n )\n if (ingredientsError) {\n // A recipe that says it saved with no lines is worse than none; compensate until this is one RPC.\n await sb.from(T.recipes).delete().eq('id', recipe.id)\n fail('Could not create recipe ingredients', ingredientsError)\n }\n }\n\n // One active ficha per product, retired only after the new lines landed.\n if (recipeData.productId) {\n const { error: retireError } = await sb.from(T.recipes)\n .update({ is_active: false })\n .eq('product_id', recipeData.productId)\n .eq('is_active', true)\n .neq('id', recipe.id)\n if (retireError) console.warn('Could not retire previous recipes', retireError.message)\n }\n return snakeToCamel(recipe) as Recipe\n },\n\n async updateRecipe(id: string, patch: Partial<Recipe>): Promise<Recipe> {\n const row: Row = {}\n if (patch.name !== undefined) row.name = patch.name\n if (patch.description !== undefined) row.description = patch.description\n if (patch.productId !== undefined) row.product_id = patch.productId || null\n if (patch.yieldQuantity !== undefined) row.yield_quantity = patch.yieldQuantity\n if (patch.preparationTimeMinutes !== undefined) row.preparation_time_minutes = patch.preparationTimeMinutes\n if (patch.instructions !== undefined) row.instructions = patch.instructions\n if (patch.isActive !== undefined) row.is_active = patch.isActive\n if (patch.metadata !== undefined) row.metadata = patch.metadata\n if (Object.keys(row).length > 0) {\n row.updated_at = new Date().toISOString()\n const { error } = await client().from(T.recipes).update(row).eq('id', id)\n if (error) throw new Error(error.message)\n }\n const updated = await provider.getRecipeById(id)\n if (!updated) throw new Error(`Recipe ${id} not found after update`)\n return updated\n },\n\n async addRecipeIngredient(recipeId: string, input: CreateRecipeIngredientInput): Promise<RecipeIngredient> {\n const sb = client()\n const { data, error } = await sb.from(T.recipeIngredients)\n .insert({ ...camelToSnake(input), recipe_id: recipeId, tenant_id: getActiveTenantId() })\n .select('*').single()\n fail('Could not add recipe ingredient', error)\n if (!data) throw new Error('Could not add recipe ingredient: Supabase returned no row')\n return (await hydrateRecipeIngredients(sb, [data], true))[0]\n },\n\n // --- Ficha Técnica -----------------------------------------------------\n async getRecipeExport(): Promise<RecipeExportSheet[]> {\n const { pub } = getClients()\n const select = [\n 'id, name, price',\n `details:${T.productDetails}!inner(is_produced)`,\n `category:${T.productCategories}!category_id(name)`,\n `recipes:${T.recipes}!product_id(id, yield_quantity, yield_unit_id, preparation_time_minutes, updated_at, is_active,`\n + ` groups:${T.recipeGroups}!recipe_id(id, name, display_order),`\n + ` lines:${T.recipeIngredients}!recipe_id(quantity, unit_id, group_id, display_order, ingredient:products!product_id(id, name, sku, cost)))`,\n ].join(', ')\n const [rows, { data: units }] = await Promise.all([\n selectAllRows<any>((from, to) => pub.from('products').select(select)\n .eq('is_active', true).eq(`${T.productDetails}.is_produced`, true)\n .order('id').range(from, to), 'Could not read recipes for export'),\n pub.from(T.measurementUnits).select('id, abbreviation'),\n ])\n const abbr = new Map<string, string>((units ?? []).map((u: any) => [u.id, u.abbreviation]))\n const byOrder = (a: any, b: any) => (a.display_order ?? 0) - (b.display_order ?? 0)\n return rows\n .sort((a, b) => String(a.name ?? '').localeCompare(String(b.name ?? '')))\n .map((p) => {\n const r = ((p.recipes ?? []) as any[]).filter((x) => x.is_active)\n .sort((a, b) => String(b.updated_at ?? '').localeCompare(String(a.updated_at ?? '')))[0]\n const toLine = (l: any) => ({\n ingredientId: l.ingredient?.id ?? '',\n ingredientName: l.ingredient?.name ?? '—',\n ingredientSku: l.ingredient?.sku ?? undefined,\n unitAbbr: l.unit_id ? abbr.get(l.unit_id) : undefined,\n quantity: Number(l.quantity) || 0,\n unitCost: Number(l.ingredient?.cost) || 0,\n })\n const lines = [...(r?.lines ?? [])].sort(byOrder)\n const groups = [...(r?.groups ?? [])].sort(byOrder).map((g: any) => ({\n name: g.name ?? '',\n lines: lines.filter((l) => l.group_id === g.id).map(toLine),\n }))\n // Lines without a group land in one block, as the editor shows them.\n const loose = lines.filter((l) => !l.group_id || !groups.length)\n if (loose.length) groups.push({ name: '', lines: loose.map(toLine) })\n return {\n productId: p.id,\n productName: p.name,\n categoryName: p.category?.name ?? undefined,\n salePrice: Number(p.price) || 0,\n hasSheet: Boolean(r),\n yieldQuantity: r?.yield_quantity != null ? Number(r.yield_quantity) : undefined,\n yieldUnitAbbr: r?.yield_unit_id ? abbr.get(r.yield_unit_id) : undefined,\n preparationTimeMinutes: r?.preparation_time_minutes ?? undefined,\n groups: groups.filter((g) => g.lines.length),\n }\n })\n },\n\n async getRecipeListRow(productId: string): Promise<RecipeListRow | null> {\n const rows = await recipeListInOneQuery(getClients().pub, productId)\n if (!rows) throw new Error('Could not read recipe list row')\n return rows[0] ?? null\n },\n\n async getRecipeList(): Promise<RecipeListRow[]> {\n const { pub } = getClients()\n const nested = await recipeListInOneQuery(pub)\n if (nested) return nested\n // TUDO paginado: a API devolve no máximo 1000 linhas por consulta\n // (max_rows) e corta calada. Com 381 fichas e 2.684 linhas (Mercado\n // Urbano, 06/10/2026) a tela mostrava 0 insumo e custo 0 em dois terços\n // das fichas — as que caíam depois da milésima linha.\n const produced = await selectAllRows<any>((from, to) => pub.from(T.productDetails)\n .select('product_id, is_for_sale, is_intermediate').eq('is_produced', true).order('product_id').range(from, to), 'Could not read produced products')\n const ids = produced.map((r: any) => r.product_id)\n const flagsOf = new Map<string, any>(produced.map((r: any) => [r.product_id, r]))\n if (ids.length === 0) return []\n const [products, recipes] = await Promise.all([\n selectInChunks<any>(ids, (chunk, from, to) => pub.from('products')\n .select('id, name, price, image_url, is_active, category_id').in('id', chunk).eq('is_active', true)\n .order('id').range(from, to), 'Could not read products'),\n selectInChunks<any>(ids, (chunk, from, to) => pub.from(T.recipes)\n .select('id, product_id, description, yield_quantity, yield_unit_id, preparation_time_minutes, updated_at')\n .in('product_id', chunk).eq('is_active', true).order('id').range(from, to), 'Could not read recipes'),\n ])\n products.sort((a: any, b: any) => String(a.name ?? '').localeCompare(String(b.name ?? '')))\n recipes.sort((a: any, b: any) => String(b.updated_at ?? '').localeCompare(String(a.updated_at ?? '')))\n const recipeByProduct = new Map<string, any>()\n for (const r of recipes) if (!recipeByProduct.has(r.product_id)) recipeByProduct.set(r.product_id, r)\n const recipeIds = [...recipeByProduct.values()].map((r) => r.id)\n const unitIds = [...new Set([...recipeByProduct.values()].map((r) => r.yield_unit_id).filter(Boolean))]\n const categoryIds = [...new Set(products.map((p: any) => p.category_id).filter(Boolean))]\n const [lines, { data: units }, { data: categories }] = await Promise.all([\n selectInChunks<any>(recipeIds, (chunk, from, to) => pub.from(T.recipeIngredients)\n .select('id, recipe_id, product_id, quantity').in('recipe_id', chunk).order('id').range(from, to),\n 'Could not read recipe lines'),\n unitIds.length\n ? pub.from(T.measurementUnits).select('id, abbreviation').in('id', unitIds)\n : Promise.resolve({ data: [] }),\n categoryIds.length\n ? pub.from(T.productCategories).select('id, name').in('id', categoryIds)\n : Promise.resolve({ data: [] }),\n ])\n const categoryName = new Map<string, string>((categories ?? []).map((c: any) => [c.id, c.name]))\n const costIds = [...new Set(lines.map((l: any) => l.product_id))]\n const costRows = await selectInChunks<any>(costIds, (chunk, from, to) => pub.from('products')\n .select('id, cost').in('id', chunk).order('id').range(from, to), 'Could not read ingredient costs')\n const costOf = new Map<string, number>((costRows ?? []).map((p: any) => [p.id, Number(p.cost) || 0]))\n const unitAbbr = new Map<string, string>((units ?? []).map((u: any) => [u.id, u.abbreviation]))\n const count = new Map<string, number>()\n const cost = new Map<string, number>()\n for (const l of lines ?? []) {\n count.set(l.recipe_id, (count.get(l.recipe_id) ?? 0) + 1)\n cost.set(l.recipe_id, (cost.get(l.recipe_id) ?? 0) + (Number(l.quantity) || 0) * (costOf.get(l.product_id) ?? 0))\n }\n return (products ?? []).map((p: any) => {\n const r = recipeByProduct.get(p.id)\n return {\n productId: p.id,\n productName: p.name,\n imageUrl: p.image_url ?? undefined,\n categoryName: p.category_id ? categoryName.get(p.category_id) : undefined,\n isForSale: Boolean(flagsOf.get(p.id)?.is_for_sale),\n isIntermediate: Boolean(flagsOf.get(p.id)?.is_intermediate),\n recipeId: r?.id,\n description: r?.description ?? undefined,\n ingredientCount: r ? count.get(r.id) ?? 0 : 0,\n yieldQuantity: r?.yield_quantity != null ? Number(r.yield_quantity) : undefined,\n yieldUnitAbbr: r?.yield_unit_id ? unitAbbr.get(r.yield_unit_id) : undefined,\n preparationTimeMinutes: r?.preparation_time_minutes ?? undefined,\n cost: r ? cost.get(r.id) ?? 0 : 0,\n salePrice: Number(p.price) || 0,\n }\n })\n },\n\n async searchRecipeCandidates(query: string, kind?: 'sale' | 'intermediate' | null): Promise<RecipeCandidate[]> {\n const { pub } = getClients()\n let flags = pub.from(T.productDetails).select('product_id, is_for_sale, is_intermediate, is_produced, category_id')\n flags = kind === 'sale' ? flags.eq('is_for_sale', true)\n : kind === 'intermediate' ? flags.eq('is_intermediate', true)\n : flags.or('is_for_sale.eq.true,is_intermediate.eq.true,is_produced.eq.true')\n const { data: details, error: dErr } = await flags\n fail('Could not read products', dErr)\n const byId = new Map<string, any>((details ?? []).map((d: any) => [d.product_id, d]))\n if (byId.size === 0) return []\n let q = pub.from('products').select('id, name, image_url, price').in('id', [...byId.keys()])\n .eq('is_active', true).order('name').limit(60)\n if (query.trim()) q = q.ilike('name', `%${query.trim()}%`)\n const { data: products, error } = await q\n fail('Could not search products', error)\n const ids = (products ?? []).map((p: any) => p.id)\n const catIds = [...new Set((products ?? []).map((p: any) => byId.get(p.id)?.category_id).filter(Boolean))]\n const [{ data: recipes }, { data: cats }] = await Promise.all([\n ids.length ? pub.from(T.recipes).select('product_id').in('product_id', ids).eq('is_active', true) : Promise.resolve({ data: [] }),\n catIds.length ? pub.from(T.productCategories).select('id, name').in('id', catIds) : Promise.resolve({ data: [] }),\n ])\n const withRecipe = new Set((recipes ?? []).map((r: any) => r.product_id))\n const catName = new Map((cats ?? []).map((c: any) => [c.id, c.name]))\n return (products ?? []).map((p: any) => {\n const d = byId.get(p.id)\n return {\n productId: p.id,\n name: p.name,\n imageUrl: p.image_url ?? undefined,\n categoryName: d?.category_id ? (catName.get(d.category_id) as string | undefined) : undefined,\n salePrice: Number(p.price) || 0,\n kind: d?.is_for_sale ? 'sale' : d?.is_intermediate ? 'intermediate' : 'produced',\n hasRecipe: withRecipe.has(p.id),\n } as RecipeCandidate\n })\n },\n\n async getRecipeSheet(productId: string): Promise<RecipeSheet | null> {\n const { pub } = getClients()\n const recipeQuery = (select: string) => pub.from(T.recipes).select(select)\n .eq('product_id', productId).eq('is_active', true)\n .order('updated_at', { ascending: false }).limit(1).maybeSingle()\n // Groups, lines and outputs embedded: one round trip instead of two waves.\n const nested = await recipeQuery(`*, groups:${T.recipeGroups}(*), lines:${T.recipeIngredients}(*), outputs:plg_inventory_recipe_outputs(*)`)\n let r: any = nested.data\n let groups: any[] | null\n let lines: any[] | null\n let outputs: RecipeOutput[]\n if (!nested.error) {\n if (!r) return null\n const byOrder = (a: any, b: any) => (a.display_order ?? 0) - (b.display_order ?? 0)\n groups = [...(r.groups ?? [])].sort(byOrder)\n lines = [...(r.lines ?? [])].sort(byOrder)\n outputs = [...(r.outputs ?? [])].sort(byOrder).map(mapRecipeOutput)\n } else {\n const plain = await recipeQuery('*')\n fail('Could not read recipe', plain.error)\n r = plain.data\n if (!r) return null\n const [{ data: g, error: gErr }, { data: l, error: lErr }, o] = await Promise.all([\n pub.from(T.recipeGroups).select('*').eq('recipe_id', r.id).order('display_order'),\n pub.from(T.recipeIngredients).select('*').eq('recipe_id', r.id).order('display_order'),\n provider.getRecipeOutputs!(r.id),\n ])\n fail('Could not read recipe groups', gErr)\n fail('Could not read recipe lines', lErr)\n groups = g; lines = l; outputs = o\n }\n const toLine = (l: any) => ({\n productId: l.product_id,\n quantity: Number(l.quantity) || 0,\n unitId: l.unit_id ?? undefined,\n displayUnitId: l.display_unit_id ?? undefined,\n notes: l.notes ?? undefined,\n })\n const sheetGroups = (groups ?? []).map((g: any) => ({\n name: g.name ?? '',\n stationId: g.station_id ?? undefined,\n preparationNotes: g.preparation_notes ?? undefined,\n estimatedMinutes: g.estimated_minutes ?? undefined,\n ingredients: (lines ?? []).filter((l: any) => l.group_id === g.id).map(toLine),\n }))\n // Lines without a group (sheets the assistant created) land in one block,\n // as V1 does, so saving does not drop them.\n const orphans = (lines ?? []).filter((l: any) => !l.group_id)\n if (orphans.length > 0) sheetGroups.push({ name: 'Componentes', stationId: undefined, preparationNotes: undefined, estimatedMinutes: undefined, ingredients: orphans.map(toLine) })\n return {\n id: r.id,\n productId: r.product_id,\n name: r.name ?? '',\n description: r.description ?? undefined,\n yieldQuantity: Number(r.yield_quantity) || 1,\n yieldUnitId: r.yield_unit_id ?? undefined,\n yieldMode: r.yield_mode === 'batch' ? 'batch' : 'portion',\n preparationTimeMinutes: r.preparation_time_minutes ?? undefined,\n instructions: r.instructions ?? undefined,\n groups: sheetGroups,\n outputs,\n }\n },\n\n async getRecipeOutputs(recipeId: string): Promise<RecipeOutput[]> {\n const { pub } = getClients()\n const { data, error } = await pub.from('plg_inventory_recipe_outputs').select('*')\n .eq('recipe_id', recipeId).order('display_order')\n fail('Could not read recipe outputs', error)\n return (data ?? []).map(mapRecipeOutput)\n },\n\n async getMeasurementUnitList(): Promise<MeasurementUnit[]> {\n const { pub } = getClients()\n const { data, error } = await pub.from(T.measurementUnits).select('id, name, abbreviation')\n .eq('is_active', true).order('name')\n fail('Could not read measurement units', error)\n return (data ?? []) as MeasurementUnit[]\n },\n\n async getProductionStations(): Promise<ProductionStation[]> {\n const { pub } = getClients()\n const { data, error } = await pub.from('plg_inventory_production_stations').select('id, name, unit_id')\n .eq('is_active', true).order('sort_order').order('name')\n fail('Could not read production stations', error)\n return (data ?? []).map((s: any) => ({ id: s.id, name: s.name, unitId: s.unit_id ?? undefined }))\n },\n\n async getIngredientInfo(productIds: string[]): Promise<IngredientInfo[]> {\n return readIngredientInfo(getClients().pub, productIds)\n },\n\n async searchIngredients(query: string): Promise<IngredientInfo[]> {\n const { pub } = getClients()\n const { data: flagged, error: flagError } = await pub.from(T.productDetails)\n .select('product_id').or('is_ingredient.eq.true,is_intermediate.eq.true')\n fail('Could not read ingredients', flagError)\n const ids = (flagged ?? []).map((r: any) => r.product_id)\n if (ids.length === 0) return []\n let q = pub.from('products').select('id').in('id', ids).eq('is_active', true).order('name').limit(25)\n if (query.trim()) q = q.ilike('name', `%${query.trim()}%`)\n const { data, error } = await q\n fail('Could not search ingredients', error)\n const info = await readIngredientInfo(pub, (data ?? []).map((p: any) => p.id))\n return info.sort((a, b) => a.name.localeCompare(b.name, 'pt-BR'))\n },\n\n async saveRecipeSheet(sheet: RecipeSheet, unitCost: number | null): Promise<string> {\n const { pub } = getClients()\n const payload = {\n id: sheet.id ?? null,\n productId: sheet.productId,\n name: sheet.name,\n description: sheet.description ?? '',\n yieldQuantity: sheet.yieldQuantity,\n yieldUnitId: sheet.yieldUnitId ?? '',\n yieldMode: sheet.yieldMode,\n preparationTimeMinutes: sheet.preparationTimeMinutes ?? '',\n instructions: sheet.instructions ?? '',\n unitId: getActiveUnitId() ?? '',\n unitCost: unitCost ?? '',\n groups: sheet.groups,\n outputs: sheet.outputs,\n }\n const { data, error } = await pub.rpc('inventory_save_recipe', { p_recipe: payload })\n if (error) throw new Error(error.message)\n return data as string\n },\n\n async setIngredientCost(productId: string, cost: number): Promise<void> {\n const { pub } = getClients()\n const { error } = await pub.from('products').update({ cost }).eq('id', productId)\n if (error) throw new Error(error.message)\n const { error: detailError } = await pub.from(T.productDetails)\n .update({ avg_purchase_price: cost, avg_purchase_price_updated_at: new Date().toISOString() })\n .eq('product_id', productId)\n if (detailError) throw new Error(detailError.message)\n },\n\n async suggestRecipe(input): Promise<RecipeAiSuggestion> {\n return invokeFunction<RecipeAiSuggestion>(getClients().pub, 'inventory-recipe-ai', { action: 'suggest-recipe', ...input })\n },\n\n async suggestIngredientCost(productId: string, name: string): Promise<IngredientCostSuggestion> {\n return invokeFunction<IngredientCostSuggestion>(getClients().pub, 'inventory-recipe-ai', { action: 'suggest-cost', productId, name })\n },\n\n async uploadAiReference(file: File): Promise<string> {\n const { core } = getClients()\n const tenantId = getActiveTenantId()\n if (!tenantId) throw new Error('Nenhum estabelecimento ativo para enviar a foto.')\n if (!file.type.startsWith('image/')) throw new Error('Selecione um arquivo de imagem.')\n const extension = file.name.split('.').pop()?.toLowerCase().replace(/[^a-z0-9]/g, '') || 'jpg'\n const path = `${tenantId}/ai-references/${crypto.randomUUID()}.${extension}`\n const bucket = core.storage.from('inventory-images')\n const { error } = await bucket.upload(path, file, { contentType: file.type, upsert: false })\n if (error) throw new Error(error.message)\n return bucket.getPublicUrl(path).data.publicUrl\n },\n\n async generateProductImage(input): Promise<string> {\n const res = await invokeFunction<{ imageBase64: string }>(getClients().pub, 'inventory-recipe-ai', { action: 'generate-image', ...input })\n if (!res.imageBase64) throw new Error('A IA não devolveu imagem.')\n return res.imageBase64\n },\n\n // --- Complementos ------------------------------------------------------\n // Written to the menu's modifier tables, linked to the product: the same\n // rows the menu reads. Each product owns its groups, as in V1.\n async getProductOptionGroups(productId: string): Promise<ProductOptionGroup[]> {\n const { pub } = getClients()\n const { data: links, error } = await pub.from('plg_menu_item_modifier_groups')\n .select('group_id, sort_order').eq('product_id', productId).order('sort_order')\n fail('Could not read option groups', error)\n const groupIds = (links ?? []).map((l: any) => l.group_id)\n if (groupIds.length === 0) return []\n const [{ data: groups, error: gErr }, { data: items, error: iErr }] = await Promise.all([\n pub.from('plg_menu_modifier_groups').select('*').in('id', groupIds),\n pub.from('plg_menu_modifiers').select('*').in('group_id', groupIds).order('sort_order'),\n ])\n fail('Could not read option groups', gErr)\n fail('Could not read options', iErr)\n const byId = new Map((groups ?? []).map((g: any) => [g.id, g]))\n return groupIds.map((id: string) => byId.get(id)).filter(Boolean).map((g: any) => ({\n id: g.id,\n name: g.name,\n isActive: g.is_active !== false,\n isRequired: !!g.is_required,\n minSelections: Number(g.min_selections) || 0,\n maxSelections: Number(g.max_selections) || 1,\n items: (items ?? []).filter((i: any) => i.group_id === g.id).map((i: any) => ({\n id: i.id,\n name: i.name,\n priceAdjustment: Number(i.price_adjustment) || 0,\n isActive: i.is_active !== false,\n })),\n }))\n },\n\n async saveProductOptionGroups(productId: string, groups: ProductOptionGroup[]): Promise<ProductOptionGroup[]> {\n const { pub } = getClients()\n const { data, error } = await pub.rpc('menu_save_product_option_groups', {\n p_product: productId,\n p_groups: groups.map((g, gi) => ({\n id: g.id ?? null,\n name: g.name.trim(),\n isActive: g.isActive,\n isRequired: g.isRequired,\n minSelections: g.minSelections,\n maxSelections: g.maxSelections,\n sortOrder: gi,\n items: g.items.map((i, ii) => ({\n id: i.id ?? null,\n name: i.name.trim(),\n priceAdjustment: i.priceAdjustment,\n isActive: i.isActive,\n sortOrder: ii,\n })),\n })),\n })\n if (error) throw new Error(error.message)\n void data\n return provider.getProductOptionGroups!(productId)\n },\n\n async consumeRecipeForSource(input: ConsumeRecipeForSourceInput): Promise<InventoryConsumptionResult> {\n assertConsumable(input)\n const sb = client()\n const idempotencyKey = consumptionKey(input.sourceType, input.sourceId)\n const { data: recipeRow, error: recipeError } = await sb.from(T.recipes).select('*')\n .eq('product_id', input.productId).eq('is_active', true)\n .order('updated_at', { ascending: false }).limit(1).maybeSingle()\n if (recipeError) throw new Error(recipeError.message)\n if (!recipeRow) return skippedConsumption(input, 'no_active_recipe')\n const recipe = toRecipe(recipeRow)\n\n const { data: ingredientRows, error: ingredientError } = await sb.from(T.recipeIngredients)\n .select('*').eq('recipe_id', recipe.id).order('display_order')\n if (ingredientError) throw new Error(ingredientError.message)\n const rows = (ingredientRows ?? []) as Row[]\n\n const productIds = [...new Set(rows.map((row) => String(row.product_id)))]\n const [{ data: settingsRows, error: settingsError }, { data: detailRows, error: detailsError }] = await Promise.all([\n sb.from(T.productSettings)\n .select('product_id, unit_id, measurement_unit_id, default_location_id')\n .in('product_id', productIds)\n .is('unit_id', null),\n sb.from(T.productDetails)\n .select('product_id, measurement_unit_id, default_location_id')\n .in('product_id', productIds),\n ])\n if (settingsError) throw new Error(settingsError.message)\n if (detailsError) throw new Error(detailsError.message)\n const settingsByProduct = new Map(((settingsRows ?? []) as Row[]).map((row) => [String(row.product_id), row]))\n const detailsByProduct = new Map(((detailRows ?? []) as Row[]).map((row) => [String(row.product_id), row]))\n\n const lines = explodeRecipe(recipe, rows.map((row) => {\n const productId = String(row.product_id)\n const settings = settingsByProduct.get(productId)\n const details = detailsByProduct.get(productId)\n return {\n productId,\n quantity: Number(row.quantity),\n locationId: settings?.default_location_id ?? details?.default_location_id,\n unitId: row.unit_id ?? settings?.measurement_unit_id ?? details?.measurement_unit_id ?? undefined,\n }\n }), input.quantity)\n\n const { error: reserveError } = await sb.rpc('inventory_reserve', {\n p_source_type: input.sourceType,\n p_source_id: input.sourceId,\n p_lines: lines.map((line) => ({\n product_id: line.productId,\n location_id: line.locationId,\n quantity: line.quantity,\n ...(line.unitId ? { measurement_unit_id: line.unitId } : {}),\n notes: `Recipe ${recipe.id}`,\n })),\n p_idempotency_key: idempotencyKey,\n })\n if (reserveError) throw new Error(reserveError.message)\n\n const { error: confirmError } = await sb.rpc('inventory_confirm', { p_idempotency_key: idempotencyKey })\n if (confirmError) throw new Error(confirmError.message)\n\n return {\n sourceType: input.sourceType,\n sourceId: input.sourceId,\n idempotencyKey,\n status: 'confirmed',\n recipeId: recipe.id,\n lineCount: lines.length,\n }\n },\n\n async reverseRecipeConsumption(input: ReverseRecipeConsumptionInput): Promise<InventoryConsumptionResult> {\n assertReversible(input)\n const sb = client()\n const idempotencyKey = consumptionKey(input.sourceType, input.sourceId)\n const { count, error: lookupError } = await sb.from(T.reservations)\n .select('id', { count: 'exact', head: true })\n .eq('source_type', input.sourceType)\n .eq('source_id', input.sourceId)\n if (lookupError) throw new Error(lookupError.message)\n if (!count) return skippedConsumption(input, 'nothing_to_reverse')\n\n const { data, error } = await sb.rpc('inventory_reverse', { p_idempotency_key: idempotencyKey, p_reason: input.reason })\n if (error) throw new Error(error.message)\n return {\n sourceType: input.sourceType,\n sourceId: input.sourceId,\n idempotencyKey,\n status: 'reversed',\n lineCount: Number((data as Row | null)?.reversed_lines) || count,\n }\n },\n\n async getUsageAudit(query: UsageAuditQuery): Promise<PaginatedResult<UsageAuditEntry>> {\n const sb = client()\n // `planned`: an exact count through RLS over 100k+ rows is the screen's most expensive query.\n let qb = sb.from(USAGE_AUDIT_READ).select('*', { count: 'planned' })\n if (query.divergentOnly) qb = qb.not('variance', 'is', null).neq('variance', 0)\n if (query.pendingOnly) qb = qb.eq('is_corrected', false)\n // The queue is per unit, and the filter is also what keeps the view's RLS cheap.\n const unitId = getActiveUnitId()\n if (unitId) qb = qb.eq('unit_id', unitId)\n if (query.from) qb = qb.gte('used_at', query.from)\n if (query.search) {\n // Commas and parentheses are the `or=` grammar itself.\n const like = `%${query.search.replace(/[(),]/g, ' ').trim()}%`\n qb = qb.or(`product_name.ilike.${like},performed_by_name.ilike.${like},customer_name.ilike.${like},item_name.ilike.${like}`)\n }\n const page = query.page ?? 1\n const pageSize = query.pageSize ?? 50\n const { data, count, error } = await qb.range((page - 1) * pageSize, page * pageSize - 1).order('used_at', { ascending: false })\n if (error) throw new Error(error.message)\n const rows = (data ?? []) as Row[]\n\n // Names in one later read: resolving them inside the view ran `people` RLS per candidate row.\n const personIds = [...new Set(rows.flatMap((r) => [r.performed_by_id, r.customer_id]).filter(Boolean))] as string[]\n const names = await namesById(sb, 'people', personIds)\n return { data: rows.map((r) => toUsageAuditEntry(r, names)), total: count ?? 0 }\n },\n\n async correctUsage(input: UsageAuditCorrectionInput): Promise<void> {\n const { error } = await client().rpc('inventory_correct_usage', {\n p_item_id: input.itemId,\n p_product_id: input.productId,\n p_quantity: input.quantity,\n p_reason: input.reason,\n })\n if (error) throw new Error(error.message)\n },\n\n async approveUsageBatch(input: UsageAuditApproveInput): Promise<UsageAuditApproveResult> {\n const { data, error } = await client().rpc('inventory_approve_usage_batch', {\n p_lines: input.lines.map((l) => ({ item_id: l.itemId, product_id: l.productId })),\n p_post: input.post,\n p_reason: input.reason ?? null,\n })\n if (error) throw new Error(error.message)\n const r = (data ?? {}) as Row\n return {\n linesApproved: Number(r.lines_approved ?? 0),\n linesPosted: Number(r.lines_posted ?? 0),\n linesSkipped: Number(r.lines_skipped ?? 0),\n linesNoStock: Number(r.lines_no_stock ?? 0),\n missing: ((r.missing ?? []) as Row[]).map((m) => ({\n product: String(m.product), needed: Number(m.needed ?? 0), available: Number(m.available ?? 0),\n })),\n }\n },\n\n async correctUsageBatch(input: { reason: string; lines: UsageAuditCorrection[] }): Promise<UsageAuditBatchResult> {\n const { data, error } = await client().rpc('inventory_correct_usage_batch', {\n p_reason: input.reason,\n // The RPC stores the order as line_no, so the batch reads back as it was typed.\n p_lines: input.lines.map((l) => ({ item_id: l.itemId, product_id: l.productId, quantity: l.quantity })),\n })\n if (error) throw new Error(error.message)\n const r = (data ?? {}) as Row\n return {\n operationId: r.operation_id ?? undefined,\n linesApplied: Number(r.lines_applied ?? 0),\n linesUnchanged: Number(r.lines_unchanged ?? 0),\n }\n },\n\n async getSummary(): Promise<InventorySummary> {\n const sb = client()\n const { data: products } = await goods(sb, 'stock, min_stock, price, is_active').eq('is_active', true)\n const { data: movements } = await sb.from(T.stockMovements).select('movement_type')\n .gte('movement_date', recentMovementCutoff(new Date()))\n return summarizeStock(\n ((products ?? []) as Row[]).map((p) => ({ quantity: p.stock ?? 0, minQuantity: p.min_stock ?? 0, unitValue: p.price ?? 0 })),\n ((movements ?? []) as Row[]).map((m) => m.movement_type),\n )\n },\n\n async getRestockList(limit = 50): Promise<RestockLine[]> {\n const sb = client()\n const { data } = await goods(sb, 'id, name, category_id, stock, min_stock, unit').eq('is_active', true)\n const needs = pickRestock(((data ?? []) as Row[]).map((r) => ({\n productId: r.id as string,\n name: r.name as string,\n categoryId: r.category_id as string | null,\n currentQuantity: Number(r.stock) || 0,\n minQuantity: Number(r.min_stock) || 0,\n unit: r.unit ?? undefined,\n })), limit)\n const names = await namesById(sb, 'categories', [...new Set(needs.map((n) => n.categoryId).filter(Boolean))] as string[])\n return needs.map(({ categoryId, ...rest }) => ({ ...rest, categoryName: categoryId ? names.get(categoryId) : undefined }))\n },\n\n async getCategoryDistribution(): Promise<CategoryCount[]> {\n const sb = client()\n const { data } = await goods(sb, 'category_id').eq('is_active', true)\n const categoryIds = ((data ?? []) as Row[]).map((r) => r.category_id as string | null)\n const names = await namesById(sb, 'categories', [...new Set(categoryIds.filter(Boolean))] as string[])\n return categoryCounts(categoryIds, (id) => names.get(id))\n },\n }\n\n announceWrites(provider)\n return provider\n}\n"]}
@@ -0,0 +1,116 @@
1
+ import { isoDayFrom } from './chunk-GDEIBHAB.js';
2
+ import { emptyMovementTally } from './chunk-AFUR3HLA.js';
3
+
4
+ // src/domain/stock.ts
5
+ function stockHealth(quantity, minQuantity) {
6
+ if (quantity < 0) return "negative";
7
+ if (quantity === 0) return "zero";
8
+ if (minQuantity > 0 && quantity < minQuantity) return "below_min";
9
+ return "ok";
10
+ }
11
+ function hasMinimum(minQuantity) {
12
+ return Number(minQuantity) > 0;
13
+ }
14
+ function isOutOfStock(quantity) {
15
+ return quantity <= 0;
16
+ }
17
+ function isLowStock(quantity, minQuantity) {
18
+ return hasMinimum(minQuantity) && quantity > 0 && quantity <= minQuantity;
19
+ }
20
+ function restockReason(quantity, minQuantity) {
21
+ if (isOutOfStock(quantity)) return "out-of-stock";
22
+ if (isLowStock(quantity, minQuantity)) return "below-minimum";
23
+ return void 0;
24
+ }
25
+ function pickRestock(rows, limit) {
26
+ const rank = (reason) => reason === "below-minimum" ? 0 : 1;
27
+ return rows.flatMap((row) => {
28
+ const reason = restockReason(row.currentQuantity, row.minQuantity);
29
+ return reason ? [{ ...row, reason }] : [];
30
+ }).sort((a, b) => rank(a.reason) - rank(b.reason) || a.name.localeCompare(b.name, "pt-BR")).slice(0, limit);
31
+ }
32
+ function recentMovementCutoff(now) {
33
+ const weekAgo = new Date(now);
34
+ weekAgo.setDate(weekAgo.getDate() - 7);
35
+ return weekAgo.toISOString().slice(0, 10);
36
+ }
37
+ function summarizeStock(activeProducts, recentMovementTypes) {
38
+ const movementsByType = emptyMovementTally();
39
+ for (const type of recentMovementTypes) {
40
+ if (type in movementsByType) movementsByType[type]++;
41
+ }
42
+ return {
43
+ totalProducts: activeProducts.length,
44
+ lowStockCount: activeProducts.filter((p) => isLowStock(p.quantity, p.minQuantity)).length,
45
+ outOfStockCount: activeProducts.filter((p) => isOutOfStock(p.quantity)).length,
46
+ totalStockValue: activeProducts.reduce((sum, p) => sum + (p.quantity || 0) * (p.unitValue || 0), 0),
47
+ recentMovementCount: recentMovementTypes.length,
48
+ movementsByType,
49
+ noMinimumCount: activeProducts.filter((p) => !hasMinimum(p.minQuantity)).length
50
+ };
51
+ }
52
+ function noProductHasMinimum(summary) {
53
+ const total = summary?.totalProducts ?? 0;
54
+ return total > 0 && (summary?.noMinimumCount ?? 0) === total;
55
+ }
56
+ function categoryCounts(categoryIds, nameOf) {
57
+ const tally = /* @__PURE__ */ new Map();
58
+ for (const id of categoryIds) tally.set(id ?? null, (tally.get(id ?? null) ?? 0) + 1);
59
+ return [...tally.entries()].map(([categoryId, count]) => ({
60
+ categoryId,
61
+ name: categoryId ? nameOf(categoryId) ?? "Categoria removida" : "Sem categoria",
62
+ count
63
+ })).sort((a, b) => b.count - a.count);
64
+ }
65
+ function expiryWindow(expiry, today) {
66
+ const day = (d) => isoDayFrom(today, d);
67
+ switch (expiry) {
68
+ case "expired":
69
+ return { kind: "expired", before: day(0) };
70
+ case "none":
71
+ return { kind: "none" };
72
+ case "le30":
73
+ return { kind: "within", from: day(0), to: day(30) };
74
+ case "le60":
75
+ return { kind: "within", from: day(0), to: day(60) };
76
+ case "le90":
77
+ return { kind: "within", from: day(0), to: day(90) };
78
+ default:
79
+ return void 0;
80
+ }
81
+ }
82
+ function isInExpiryWindow(window, expirationDate) {
83
+ if (!window) return true;
84
+ if (window.kind === "none") return !expirationDate;
85
+ if (!expirationDate) return false;
86
+ if (window.kind === "expired") return expirationDate < window.before;
87
+ return expirationDate >= window.from && expirationDate <= window.to;
88
+ }
89
+ function toPanelRow(position, product, stockLocationName) {
90
+ const quantity = Number(position.quantity) || 0;
91
+ const minQuantity = product?.minQuantity ?? 0;
92
+ const unitCost = Number(position.unitCost) || 0;
93
+ return {
94
+ id: position.id,
95
+ productId: position.productId,
96
+ productName: product?.name ?? "\u2014",
97
+ categoryId: product?.categoryId,
98
+ categoryName: product?.categoryName,
99
+ stockLocationId: position.stockLocationId,
100
+ stockLocationName,
101
+ batchNumber: position.batchNumber,
102
+ expirationDate: position.expirationDate,
103
+ quantity,
104
+ minQuantity,
105
+ unitCost,
106
+ totalValue: quantity * unitCost,
107
+ health: stockHealth(quantity, minQuantity)
108
+ };
109
+ }
110
+ function hasHealth(row, statuses) {
111
+ return !statuses || statuses.length === 0 || statuses.includes(row.health);
112
+ }
113
+
114
+ export { categoryCounts, expiryWindow, hasHealth, hasMinimum, isInExpiryWindow, isLowStock, isOutOfStock, noProductHasMinimum, pickRestock, recentMovementCutoff, restockReason, stockHealth, summarizeStock, toPanelRow };
115
+ //# sourceMappingURL=chunk-52AJ7H2W.js.map
116
+ //# sourceMappingURL=chunk-52AJ7H2W.js.map