@fayz-ai/inventory 0.1.11 → 0.2.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.
@@ -31,5 +31,5 @@ function isNewBarcodePrimary(input, existingCount) {
31
31
  }
32
32
 
33
33
  export { PRODUCT_IMAGE_MAX_BYTES, derivedProductType, isNewBarcodePrimary, marginPercent, productImageProblem, stockValue };
34
- //# sourceMappingURL=chunk-JN5AZ656.js.map
35
- //# sourceMappingURL=chunk-JN5AZ656.js.map
34
+ //# sourceMappingURL=chunk-BX73IZYH.js.map
35
+ //# sourceMappingURL=chunk-BX73IZYH.js.map
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/domain/product.ts"],"names":[],"mappings":";AAyOO,SAAS,kBAAA,CAAmB,GAA+C,QAAA,EAAgC;AAChH,EAAA,MAAM,YAAa,QAAA,IAAwC,MAAA;AAC3D,EAAA,IAAI,CAAC,GAAG,OAAO,SAAA;AACf,EAAA,IAAI,CAAA,CAAE,WAAW,OAAO,MAAA;AACxB,EAAA,IAAI,CAAA,CAAE,cAAc,OAAO,YAAA;AAC3B,EAAA,IAAI,CAAA,CAAE,gBAAgB,OAAO,cAAA;AAC7B,EAAA,IAAI,CAAA,CAAE,SAAS,OAAO,OAAA;AACtB,EAAA,OAAO,SAAA;AACT;AAGO,SAAS,aAAA,CAAc,WAAmB,SAAA,EAAkC;AACjF,EAAA,MAAM,IAAA,GAAO,MAAA,CAAO,SAAS,CAAA,IAAK,CAAA;AAClC,EAAA,MAAM,IAAA,GAAO,MAAA,CAAO,SAAS,CAAA,IAAK,CAAA;AAClC,EAAA,IAAI,IAAA,IAAQ,CAAA,IAAK,IAAA,IAAQ,CAAA,EAAG,OAAO,IAAA;AACnC,EAAA,OAAA,CAAS,IAAA,GAAO,QAAQ,IAAA,GAAQ,GAAA;AAClC;AAGO,SAAS,UAAA,CAAW,UAAkB,SAAA,EAAkC;AAC7E,EAAA,MAAM,GAAA,GAAM,MAAA,CAAO,QAAQ,CAAA,IAAK,CAAA;AAChC,EAAA,MAAM,IAAA,GAAO,MAAA,CAAO,SAAS,CAAA,IAAK,CAAA;AAClC,EAAA,IAAI,GAAA,GAAM,CAAA,IAAK,IAAA,KAAS,CAAA,EAAG,OAAO,IAAA;AAClC,EAAA,OAAO,GAAA,GAAM,IAAA;AACf;AAEO,IAAM,uBAAA,GAA0B,IAAI,IAAA,GAAO;AAG3C,SAAS,oBAAoB,IAAA,EAA0D;AAC5F,EAAA,IAAI,CAAC,IAAA,CAAK,IAAA,CAAK,UAAA,CAAW,QAAQ,GAAG,OAAO,iCAAA;AAC5C,EAAA,IAAI,IAAA,CAAK,IAAA,GAAO,uBAAA,EAAyB,OAAO,oCAAA;AAChD,EAAA,OAAO,MAAA;AACT;AAGO,SAAS,mBAAA,CAAoB,OAA0C,aAAA,EAAgC;AAC5G,EAAA,OAAO,KAAA,CAAM,aAAa,aAAA,KAAkB,CAAA;AAC9C","file":"chunk-JN5AZ656.js","sourcesContent":["export type ProductType = 'ingredient' | 'sale' | 'intermediate' | 'asset'\n\nexport type ProductPurpose = 'purchase' | 'sale' | 'both' | 'internal'\n\n/** The seven independent switches; a product can be several things at once, each one opening its own ficha. */\nexport interface ProductClassification {\n isIngredient: boolean\n isForSale: boolean\n isIntermediate: boolean\n isAsset: boolean\n isProduced: boolean\n isResale: boolean\n trackByUnitLabel: boolean\n}\n\nexport interface ProductIngredientInfo {\n minimumQuantity?: number\n maximumQuantity?: number\n /** Sits above the minimum: the balance at which buying should start. */\n reorderPoint?: number\n leadTimeDays?: number\n shelfLifeDays?: number\n storageTemperature?: string\n allowedSupplierIds?: string[]\n notes?: string\n}\n\nexport interface ProductSaleInfo {\n menuDescription?: string\n allergens?: string\n preparationTimeMinutes?: number\n servesQuantity?: number\n calories?: number\n soldByWeight?: boolean\n highlightDelivery?: boolean\n availableForDelivery?: boolean\n availableForCounter?: boolean\n notes?: string\n}\n\nexport interface ProductSaleChannel {\n channel: string\n price: number\n active?: boolean\n}\n\nexport interface ProductIntermediateInfo {\n yieldPercentage?: number\n preparationTimeMinutes?: number\n shelfLifeHours?: number\n batchSize?: number\n batchUnitId?: string\n storageInstructions?: string\n notes?: string\n}\n\nexport interface ProductAssetInfo {\n assetValue?: number\n residualValue?: number\n usefulLifeMonths?: number\n depreciationRate?: number\n serialNumber?: string\n acquisitionDate?: string\n warrantyExpiryDate?: string\n assetStatus?: string\n assetLocation?: string\n responsiblePersonId?: string\n insurancePolicy?: string\n lastMaintenanceDate?: string\n nextMaintenanceDate?: string\n notes?: string\n}\n\n/** The product's exception to its tax group; `undefined` means \"whatever the group says\", never zero. */\nexport interface ProductTaxInfo {\n taxGroupId?: string\n ncm?: string\n cest?: string\n icmsOrigin?: string\n icmsRate?: number\n cfop?: string\n cst?: string\n pisSituation?: string\n pisRate?: number\n cofinsSituation?: string\n cofinsRate?: number\n baseCalculationMode?: string\n benefitCode?: string\n povertyFundRate?: number\n ibsCbsSituation?: string\n ibsCbsClassification?: string\n}\n\nexport interface ProductBarcode {\n id?: string\n barcode: string\n barcodeType?: string\n description?: string\n isPrimary?: boolean\n}\n\n/** One sellable form of a product (size, colour). The default one stands for a product with none. */\nexport interface ProductVariant {\n id: string\n name: string\n sku?: string\n isDefault: boolean\n isActive: boolean\n /** Units in stock across the units the person can see. */\n onHand: number\n}\n\nexport interface ProductGeneralExtras {\n commissionPercent?: number\n chartAccountId?: string\n /** How much of `contentUnitId` fits in one stock unit. */\n contentPerUnit?: number\n contentUnitId?: string\n avgPurchasePrice?: number\n avgPurchasePriceUpdatedAt?: string\n professionalResalePrice?: number\n requireBatchForStock?: boolean\n requireExpiryForStock?: boolean\n}\n\nexport interface Product {\n id: string\n name: string\n description?: string\n sku?: string\n barcode?: string\n brand?: string\n categoryId?: string\n categoryName?: string\n /** Derived from `classification`; see `derivedProductType`. */\n productType: ProductType\n purpose?: ProductPurpose\n classification?: ProductClassification\n ingredientInfo?: ProductIngredientInfo\n saleInfo?: ProductSaleInfo\n saleChannels?: ProductSaleChannel[]\n intermediateInfo?: ProductIntermediateInfo\n assetInfo?: ProductAssetInfo\n taxInfo?: ProductTaxInfo\n currentQuantity: number\n minQuantity: number\n maxQuantity?: number\n costPrice: number\n salePrice?: number\n measurementUnitId?: string\n measurementUnitName?: string\n purchaseUnitId?: string\n /** How many measurement units fit in one purchase unit. 1 when they are the same. */\n conversionFactor?: number\n isActive: boolean\n supplierId?: string\n supplierName?: string\n defaultLocationId?: string\n imageUrl?: string\n extras?: ProductGeneralExtras\n metadata?: Record<string, unknown>\n tenantId: string\n createdAt: string\n updatedAt: string\n}\n\nexport interface ProductCategory {\n id: string\n name: string\n parentId?: string\n isActive: boolean\n tenantId: string\n createdAt: string\n updatedAt: string\n}\n\nexport interface MeasurementUnit {\n id: string\n name: string\n abbreviation: string\n isActive: boolean\n tenantId: string\n createdAt: string\n}\n\nexport interface Supplier {\n id: string\n name: string\n documentNumber?: string\n phone?: string\n}\n\nexport interface CreateProductInput {\n name: string\n description?: string\n sku?: string\n barcode?: string\n brand?: string\n categoryId?: string\n productType: ProductType\n purpose?: ProductPurpose\n minQuantity?: number\n maxQuantity?: number\n costPrice?: number\n salePrice?: number\n measurementUnitId?: string\n purchaseUnitId?: string\n conversionFactor?: number\n supplierId?: string\n defaultLocationId?: string\n imageUrl?: string\n classification?: Partial<ProductClassification>\n extras?: ProductGeneralExtras\n ingredientInfo?: ProductIngredientInfo\n saleInfo?: ProductSaleInfo\n saleChannels?: ProductSaleChannel[]\n intermediateInfo?: ProductIntermediateInfo\n assetInfo?: ProductAssetInfo\n taxInfo?: ProductTaxInfo\n metadata?: Record<string, unknown>\n}\n\nexport interface ProductQuery {\n productType?: ProductType\n categoryId?: string\n search?: string\n lowStockOnly?: boolean\n isActive?: boolean\n page?: number\n pageSize?: number\n}\n\n/** The one type the list facet shows; sale wins because that is what the counter calls the thing. */\nexport function derivedProductType(c: Partial<ProductClassification> | undefined, fallback?: string): ProductType {\n const otherwise = (fallback as ProductType | undefined) ?? 'sale'\n if (!c) return otherwise\n if (c.isForSale) return 'sale'\n if (c.isIngredient) return 'ingredient'\n if (c.isIntermediate) return 'intermediate'\n if (c.isAsset) return 'asset'\n return otherwise\n}\n\n/** Markup over cost, in percent. Null when either price is not filled in: zero means \"not registered\", not \"free\". */\nexport function marginPercent(salePrice: number, costPrice: number): number | null {\n const sale = Number(salePrice) || 0\n const cost = Number(costPrice) || 0\n if (sale <= 0 || cost <= 0) return null\n return ((sale - cost) / cost) * 100\n}\n\n/** On-hand × cost. Null when there is stock but no cost: the value is unknown, not zero. */\nexport function stockValue(quantity: number, costPrice: number): number | null {\n const qty = Number(quantity) || 0\n const cost = Number(costPrice) || 0\n if (qty > 0 && cost === 0) return null\n return qty * cost\n}\n\nexport const PRODUCT_IMAGE_MAX_BYTES = 8 * 1024 * 1024\n\n/** Why a file cannot be a product photo, in the words the screen shows; undefined when it can. */\nexport function productImageProblem(file: { type: string; size: number }): string | undefined {\n if (!file.type.startsWith('image/')) return 'Selecione um arquivo de imagem.'\n if (file.size > PRODUCT_IMAGE_MAX_BYTES) return 'A foto deve ter no máximo 8 MB.'\n return undefined\n}\n\n/** The first barcode a product gets is its primary one unless the caller says otherwise. */\nexport function isNewBarcodePrimary(input: Pick<ProductBarcode, 'isPrimary'>, existingCount: number): boolean {\n return input.isPrimary ?? existingCount === 0\n}\n\n/** A choice group of a product sold (Complementos): «Ponto da carne». */\nexport interface ProductOptionGroup {\n id?: string\n name: string\n isActive: boolean\n isRequired: boolean\n minSelections: number\n maxSelections: number\n items: ProductOptionItem[]\n}\n\nexport interface ProductOptionItem {\n id?: string\n name: string\n priceAdjustment: number\n isActive: boolean\n}\n"]}
1
+ {"version":3,"sources":["../src/domain/product.ts"],"names":[],"mappings":";AA8OO,SAAS,kBAAA,CAAmB,GAA+C,QAAA,EAAgC;AAChH,EAAA,MAAM,YAAa,QAAA,IAAwC,MAAA;AAC3D,EAAA,IAAI,CAAC,GAAG,OAAO,SAAA;AACf,EAAA,IAAI,CAAA,CAAE,WAAW,OAAO,MAAA;AACxB,EAAA,IAAI,CAAA,CAAE,cAAc,OAAO,YAAA;AAC3B,EAAA,IAAI,CAAA,CAAE,gBAAgB,OAAO,cAAA;AAC7B,EAAA,IAAI,CAAA,CAAE,SAAS,OAAO,OAAA;AACtB,EAAA,OAAO,SAAA;AACT;AAGO,SAAS,aAAA,CAAc,WAAmB,SAAA,EAAkC;AACjF,EAAA,MAAM,IAAA,GAAO,MAAA,CAAO,SAAS,CAAA,IAAK,CAAA;AAClC,EAAA,MAAM,IAAA,GAAO,MAAA,CAAO,SAAS,CAAA,IAAK,CAAA;AAClC,EAAA,IAAI,IAAA,IAAQ,CAAA,IAAK,IAAA,IAAQ,CAAA,EAAG,OAAO,IAAA;AACnC,EAAA,OAAA,CAAS,IAAA,GAAO,QAAQ,IAAA,GAAQ,GAAA;AAClC;AAGO,SAAS,UAAA,CAAW,UAAkB,SAAA,EAAkC;AAC7E,EAAA,MAAM,GAAA,GAAM,MAAA,CAAO,QAAQ,CAAA,IAAK,CAAA;AAChC,EAAA,MAAM,IAAA,GAAO,MAAA,CAAO,SAAS,CAAA,IAAK,CAAA;AAClC,EAAA,IAAI,GAAA,GAAM,CAAA,IAAK,IAAA,KAAS,CAAA,EAAG,OAAO,IAAA;AAClC,EAAA,OAAO,GAAA,GAAM,IAAA;AACf;AAEO,IAAM,uBAAA,GAA0B,IAAI,IAAA,GAAO;AAG3C,SAAS,oBAAoB,IAAA,EAA0D;AAC5F,EAAA,IAAI,CAAC,IAAA,CAAK,IAAA,CAAK,UAAA,CAAW,QAAQ,GAAG,OAAO,iCAAA;AAC5C,EAAA,IAAI,IAAA,CAAK,IAAA,GAAO,uBAAA,EAAyB,OAAO,oCAAA;AAChD,EAAA,OAAO,MAAA;AACT;AAGO,SAAS,mBAAA,CAAoB,OAA0C,aAAA,EAAgC;AAC5G,EAAA,OAAO,KAAA,CAAM,aAAa,aAAA,KAAkB,CAAA;AAC9C","file":"chunk-BX73IZYH.js","sourcesContent":["export type ProductType = 'ingredient' | 'sale' | 'intermediate' | 'asset'\n\nexport type ProductPurpose = 'purchase' | 'sale' | 'both' | 'internal'\n\n/** The seven independent switches; a product can be several things at once, each one opening its own ficha. */\nexport interface ProductClassification {\n isIngredient: boolean\n isForSale: boolean\n isIntermediate: boolean\n isAsset: boolean\n isProduced: boolean\n isResale: boolean\n trackByUnitLabel: boolean\n}\n\nexport interface ProductIngredientInfo {\n minimumQuantity?: number\n maximumQuantity?: number\n /** Sits above the minimum: the balance at which buying should start. */\n reorderPoint?: number\n leadTimeDays?: number\n shelfLifeDays?: number\n storageTemperature?: string\n allowedSupplierIds?: string[]\n notes?: string\n}\n\nexport interface ProductSaleInfo {\n menuDescription?: string\n allergens?: string\n preparationTimeMinutes?: number\n servesQuantity?: number\n calories?: number\n soldByWeight?: boolean\n highlightDelivery?: boolean\n availableForDelivery?: boolean\n availableForCounter?: boolean\n notes?: string\n}\n\nexport interface ProductSaleChannel {\n channel: string\n price: number\n active?: boolean\n}\n\nexport interface ProductIntermediateInfo {\n yieldPercentage?: number\n preparationTimeMinutes?: number\n shelfLifeHours?: number\n batchSize?: number\n batchUnitId?: string\n storageInstructions?: string\n notes?: string\n}\n\nexport interface ProductAssetInfo {\n assetValue?: number\n residualValue?: number\n usefulLifeMonths?: number\n depreciationRate?: number\n serialNumber?: string\n acquisitionDate?: string\n warrantyExpiryDate?: string\n assetStatus?: string\n assetLocation?: string\n responsiblePersonId?: string\n insurancePolicy?: string\n lastMaintenanceDate?: string\n nextMaintenanceDate?: string\n notes?: string\n}\n\n/** The product's exception to its tax group; `undefined` means \"whatever the group says\", never zero. */\nexport interface ProductTaxInfo {\n taxGroupId?: string\n ncm?: string\n cest?: string\n icmsOrigin?: string\n icmsRate?: number\n cfop?: string\n cst?: string\n pisSituation?: string\n pisRate?: number\n cofinsSituation?: string\n cofinsRate?: number\n baseCalculationMode?: string\n benefitCode?: string\n povertyFundRate?: number\n ibsCbsSituation?: string\n ibsCbsClassification?: string\n}\n\nexport interface ProductBarcode {\n id?: string\n barcode: string\n barcodeType?: string\n description?: string\n isPrimary?: boolean\n}\n\n/** One sellable form of a product (size, colour). The default one stands for a product with none. */\nexport interface ProductVariant {\n id: string\n name: string\n sku?: string\n isDefault: boolean\n isActive: boolean\n /** Units in stock across the units the person can see. */\n onHand: number\n}\n\nexport interface ProductGeneralExtras {\n commissionPercent?: number\n chartAccountId?: string\n /** How much of `contentUnitId` fits in one stock unit. */\n contentPerUnit?: number\n contentUnitId?: string\n avgPurchasePrice?: number\n avgPurchasePriceUpdatedAt?: string\n professionalResalePrice?: number\n requireBatchForStock?: boolean\n requireExpiryForStock?: boolean\n}\n\nexport interface Product {\n id: string\n name: string\n description?: string\n sku?: string\n barcode?: string\n brand?: string\n categoryId?: string\n categoryName?: string\n /** Derived from `classification`; see `derivedProductType`. */\n productType: ProductType\n purpose?: ProductPurpose\n classification?: ProductClassification\n ingredientInfo?: ProductIngredientInfo\n saleInfo?: ProductSaleInfo\n saleChannels?: ProductSaleChannel[]\n intermediateInfo?: ProductIntermediateInfo\n assetInfo?: ProductAssetInfo\n taxInfo?: ProductTaxInfo\n currentQuantity: number\n minQuantity: number\n maxQuantity?: number\n costPrice: number\n salePrice?: number\n measurementUnitId?: string\n measurementUnitName?: string\n purchaseUnitId?: string\n /** How many measurement units fit in one purchase unit. 1 when they are the same. */\n conversionFactor?: number\n isActive: boolean\n supplierId?: string\n supplierName?: string\n defaultLocationId?: string\n imageUrl?: string\n extras?: ProductGeneralExtras\n metadata?: Record<string, unknown>\n tenantId: string\n createdAt: string\n updatedAt: string\n}\n\nexport interface ProductCategory {\n id: string\n name: string\n parentId?: string\n isActive: boolean\n tenantId: string\n createdAt: string\n updatedAt: string\n}\n\nexport interface MeasurementUnit {\n id: string\n name: string\n abbreviation: string\n isActive: boolean\n tenantId: string\n createdAt: string\n}\n\nexport interface Supplier {\n id: string\n name: string\n documentNumber?: string\n phone?: string\n}\n\nexport interface CreateProductInput {\n name: string\n description?: string\n sku?: string\n barcode?: string\n brand?: string\n categoryId?: string\n productType: ProductType\n purpose?: ProductPurpose\n minQuantity?: number\n maxQuantity?: number\n costPrice?: number\n salePrice?: number\n measurementUnitId?: string\n purchaseUnitId?: string\n conversionFactor?: number\n supplierId?: string\n defaultLocationId?: string\n imageUrl?: string\n classification?: Partial<ProductClassification>\n extras?: ProductGeneralExtras\n ingredientInfo?: ProductIngredientInfo\n saleInfo?: ProductSaleInfo\n saleChannels?: ProductSaleChannel[]\n intermediateInfo?: ProductIntermediateInfo\n assetInfo?: ProductAssetInfo\n taxInfo?: ProductTaxInfo\n metadata?: Record<string, unknown>\n}\n\n/** Where a product is sold: the storefront, the delivery menu, the counter (inventory 032). */\nexport type ProductSalesChannel = 'site' | 'delivery' | 'pos'\n\nexport interface ProductQuery {\n productType?: ProductType\n categoryId?: string\n /** Only products sold on this channel. */\n salesChannel?: ProductSalesChannel\n search?: string\n lowStockOnly?: boolean\n isActive?: boolean\n page?: number\n pageSize?: number\n}\n\n/** The one type the list facet shows; sale wins because that is what the counter calls the thing. */\nexport function derivedProductType(c: Partial<ProductClassification> | undefined, fallback?: string): ProductType {\n const otherwise = (fallback as ProductType | undefined) ?? 'sale'\n if (!c) return otherwise\n if (c.isForSale) return 'sale'\n if (c.isIngredient) return 'ingredient'\n if (c.isIntermediate) return 'intermediate'\n if (c.isAsset) return 'asset'\n return otherwise\n}\n\n/** Markup over cost, in percent. Null when either price is not filled in: zero means \"not registered\", not \"free\". */\nexport function marginPercent(salePrice: number, costPrice: number): number | null {\n const sale = Number(salePrice) || 0\n const cost = Number(costPrice) || 0\n if (sale <= 0 || cost <= 0) return null\n return ((sale - cost) / cost) * 100\n}\n\n/** On-hand × cost. Null when there is stock but no cost: the value is unknown, not zero. */\nexport function stockValue(quantity: number, costPrice: number): number | null {\n const qty = Number(quantity) || 0\n const cost = Number(costPrice) || 0\n if (qty > 0 && cost === 0) return null\n return qty * cost\n}\n\nexport const PRODUCT_IMAGE_MAX_BYTES = 8 * 1024 * 1024\n\n/** Why a file cannot be a product photo, in the words the screen shows; undefined when it can. */\nexport function productImageProblem(file: { type: string; size: number }): string | undefined {\n if (!file.type.startsWith('image/')) return 'Selecione um arquivo de imagem.'\n if (file.size > PRODUCT_IMAGE_MAX_BYTES) return 'A foto deve ter no máximo 8 MB.'\n return undefined\n}\n\n/** The first barcode a product gets is its primary one unless the caller says otherwise. */\nexport function isNewBarcodePrimary(input: Pick<ProductBarcode, 'isPrimary'>, existingCount: number): boolean {\n return input.isPrimary ?? existingCount === 0\n}\n\n/** A choice group of a product sold (Complementos): «Ponto da carne». */\nexport interface ProductOptionGroup {\n id?: string\n name: string\n isActive: boolean\n isRequired: boolean\n minSelections: number\n maxSelections: number\n items: ProductOptionItem[]\n}\n\nexport interface ProductOptionItem {\n id?: string\n name: string\n priceAdjustment: number\n isActive: boolean\n}\n"]}
@@ -1,4 +1,4 @@
1
- import { productImageProblem, derivedProductType, isNewBarcodePrimary } from './chunk-JN5AZ656.js';
1
+ import { productImageProblem, derivedProductType, isNewBarcodePrimary } from './chunk-BX73IZYH.js';
2
2
  import { createIdempotencyKey, randomId } from './chunk-JX7NCXJQ.js';
3
3
  import { explodeRecipe } from './chunk-EF5LVTOC.js';
4
4
  import { getDuplicateDefaultUnitIds, getMissingMeasurementUnits, getDuplicateAutoCreatedLocationIds, DEFAULT_STOCK_LOCATION } from './chunk-YZDGJBJD.js';
@@ -690,6 +690,7 @@ function createSupabaseInventoryProvider() {
690
690
  if (query.categoryId) qb = qb.eq("category_id", query.categoryId);
691
691
  if (query.isActive !== void 0) qb = qb.eq("is_active", query.isActive);
692
692
  if (query.lowStockOnly) qb = qb.lte("stock", 0);
693
+ if (query.salesChannel) qb = qb.is(`sold_on_${query.salesChannel}`, true);
693
694
  const page = query.page ?? 1;
694
695
  const pageSize = query.pageSize ?? 50;
695
696
  const { data, count } = await qb.range((page - 1) * pageSize, page * pageSize - 1).order("created_at", { ascending: false });
@@ -1732,5 +1733,5 @@ function createSupabaseInventoryProvider() {
1732
1733
  }
1733
1734
 
1734
1735
  export { createSupabaseInventoryProvider };
1735
- //# sourceMappingURL=chunk-ANURFDX6.js.map
1736
- //# sourceMappingURL=chunk-ANURFDX6.js.map
1736
+ //# sourceMappingURL=chunk-IBQEID2T.js.map
1737
+ //# sourceMappingURL=chunk-IBQEID2T.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/data/supabase.ts"],"names":[],"mappings":"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","file":"chunk-IBQEID2T.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 // The form no longer edits these (the stock minimum lives in product_settings);\n // writing a default here would wipe what older rows still hold.\n ...(v.minimumQuantity !== undefined ? { minimum_quantity: v.minimumQuantity } : {}),\n ...(v.maximumQuantity !== undefined ? { maximum_quantity: v.maximumQuantity } : {}),\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 // Computed columns of the view (inventory 032): filtered server-side, no\n // list of ids in the URL.\n if (query.salesChannel) qb = qb.is(`sold_on_${query.salesChannel}`, true)\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 // The conflict target needs the NULLS NOT DISTINCT index from migration 030;\n // without it Postgres answers 42P10 and the minimum was dropped in silence.\n const { error: settingsError } = 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 if (settingsError) throw new Error(settingsError.message)\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 // Only min_quantity is in the payload, so on conflict PostgREST updates\n // only that column: max_quantity and the rest of the row survive.\n const { error: settingsError } = 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 if (settingsError) throw new Error(settingsError.message)\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"]}
@@ -79,6 +79,7 @@ function createMockInventoryProvider() {
79
79
  if (query.categoryId) results = results.filter((p) => p.categoryId === query.categoryId);
80
80
  if (query.isActive !== void 0) results = results.filter((p) => p.isActive === query.isActive);
81
81
  if (query.lowStockOnly) results = results.filter((p) => p.currentQuantity <= p.minQuantity);
82
+ if (query.salesChannel) results = [];
82
83
  if (query.search) {
83
84
  const s = query.search.toLowerCase();
84
85
  results = results.filter((p) => p.name.toLowerCase().includes(s) || p.sku?.toLowerCase().includes(s) || p.barcode?.includes(s));
@@ -545,5 +546,5 @@ function createMockInventoryProvider() {
545
546
  }
546
547
 
547
548
  export { createMockInventoryProvider };
548
- //# sourceMappingURL=chunk-MCWG3PMP.js.map
549
- //# sourceMappingURL=chunk-MCWG3PMP.js.map
549
+ //# sourceMappingURL=chunk-ZRPPEKZK.js.map
550
+ //# sourceMappingURL=chunk-ZRPPEKZK.js.map