@fayz-ai/shop 0.10.0 → 0.12.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.
- package/dist/{chunk-IL6GA4ER.js → chunk-2WACO2TG.js} +3 -3
- package/dist/{chunk-IL6GA4ER.js.map → chunk-2WACO2TG.js.map} +1 -1
- package/dist/{chunk-RGTIJQJL.js → chunk-6BO2TMZ5.js} +3 -3
- package/dist/{chunk-RGTIJQJL.js.map → chunk-6BO2TMZ5.js.map} +1 -1
- package/dist/{chunk-XOP6SHPB.js → chunk-NWW3WJ7Y.js} +4 -10
- package/dist/chunk-NWW3WJ7Y.js.map +1 -0
- package/dist/{chunk-XERLK5LD.js → chunk-STRNMFC4.js} +28 -5
- package/dist/chunk-STRNMFC4.js.map +1 -0
- package/dist/{chunk-U3O2I3RM.js → chunk-U6HV3LVP.js} +385 -23
- package/dist/chunk-U6HV3LVP.js.map +1 -0
- package/dist/data/checkout-gateways.d.ts +28 -0
- package/dist/data/checkout-gateways.d.ts.map +1 -0
- package/dist/data/customer-search.d.ts +3 -0
- package/dist/data/customer-search.d.ts.map +1 -0
- package/dist/data/functions.d.ts +9 -0
- package/dist/data/functions.d.ts.map +1 -0
- package/dist/data/media.d.ts +37 -0
- package/dist/data/media.d.ts.map +1 -0
- package/dist/data/mock-provider.d.ts +40 -8
- package/dist/data/mock-provider.d.ts.map +1 -1
- package/dist/data/provider.d.ts +205 -7
- package/dist/data/provider.d.ts.map +1 -1
- package/dist/data/supabase-provider.d.ts +118 -5
- package/dist/data/supabase-provider.d.ts.map +1 -1
- package/dist/data/tables.d.ts +3 -0
- package/dist/data/tables.d.ts.map +1 -1
- package/dist/entities/index.d.ts +0 -1
- package/dist/entities/index.d.ts.map +1 -1
- package/dist/entities.js +2 -2
- package/dist/index.d.ts +16 -5
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +925 -60
- package/dist/index.js.map +1 -1
- package/dist/inventory/index.d.ts +2 -2
- package/dist/inventory/index.d.ts.map +1 -1
- package/dist/inventory/stock-types.d.ts +60 -1
- package/dist/inventory/stock-types.d.ts.map +1 -1
- package/dist/inventory/supabase-stock-store.d.ts +1 -0
- package/dist/inventory/supabase-stock-store.d.ts.map +1 -1
- package/dist/inventory.js +1 -1
- package/dist/lib/commerce.d.ts.map +1 -1
- package/dist/lib/document.d.ts +13 -0
- package/dist/lib/document.d.ts.map +1 -0
- package/dist/lib/variant-matrix.d.ts +120 -0
- package/dist/lib/variant-matrix.d.ts.map +1 -0
- package/dist/mock.js +2 -2
- package/dist/providers/checkout.d.ts +129 -0
- package/dist/providers/checkout.d.ts.map +1 -0
- package/dist/providers/index.d.ts +5 -0
- package/dist/providers/index.d.ts.map +1 -0
- package/dist/providers/shipping.d.ts +43 -0
- package/dist/providers/shipping.d.ts.map +1 -0
- package/dist/providers.js +70 -0
- package/dist/providers.js.map +1 -0
- package/dist/runtime.js +3 -3
- package/dist/shipping/label-provider.d.ts +43 -0
- package/dist/shipping/label-provider.d.ts.map +1 -0
- package/dist/types.d.ts +475 -0
- package/dist/types.d.ts.map +1 -1
- package/package.json +8 -4
- package/dist/chunk-U3O2I3RM.js.map +0 -1
- package/dist/chunk-XERLK5LD.js.map +0 -1
- package/dist/chunk-XOP6SHPB.js.map +0 -1
- package/dist/entities/sidecar.d.ts +0 -9
- package/dist/entities/sidecar.d.ts.map +0 -1
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/lib/commerce.ts","../src/data/supabase-provider.ts","../src/lib/emails.ts","../src/lib/message-events.ts"],"names":["error"],"mappings":"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","file":"index.js","sourcesContent":["import { getShopProvider } from './runtime'\nimport type { ShopProvider } from '../data/provider'\nimport type {\n CartTotals, DiscountValidation, InventoryCheck, InventoryIssue, InventoryLine, Order,\n} from '../types'\n\n// ---------------------------------------------------------------------------\n// Commerce primitive APIs (FAY-1193)\n//\n// Provider-agnostic helpers that custom app workflows call instead of re-deriving\n// discount/inventory/total logic. They take an explicit ShopProvider (default:\n// the configured runtime provider) so they work the same against mock or Supabase.\n//\n// NOTE: when run in the browser these compute the *advisory* answer (UI preview).\n// The authoritative values are recomputed server-side in the shop_place_order RPC\n// — the browser can never set what it pays.\n// ---------------------------------------------------------------------------\n\nfunction round2(n: number): number {\n return Math.round(n * 100) / 100\n}\n\n/** Validate a discount code against the provider: existence, status, date window, usage limit, supported type. */\nexport async function validateDiscount(\n input: { code: string; subtotal?: number; customerId?: string },\n provider: ShopProvider = getShopProvider(),\n): Promise<DiscountValidation> {\n const code = input.code.trim()\n if (!code) return { valid: false, code: null, type: null, value: 0, reason: 'empty' }\n\n const list = await provider.listDiscounts({ status: 'active' })\n const discount = list.find((d) => (d.code ?? '').toUpperCase() === code.toUpperCase())\n if (!discount) return { valid: false, code: null, type: null, value: 0, reason: 'not_found' }\n\n const now = new Date().toISOString()\n if (discount.startsAt > now) return { valid: false, code: discount.code, type: discount.type, value: 0, reason: 'not_started' }\n if (discount.endsAt && discount.endsAt < now) return { valid: false, code: discount.code, type: discount.type, value: 0, reason: 'expired' }\n if (discount.usageLimit != null && discount.timesUsed >= discount.usageLimit) {\n return { valid: false, code: discount.code, type: discount.type, value: 0, reason: 'usage_limit' }\n }\n if (discount.type !== 'percentage' && discount.type !== 'fixed_amount') {\n return { valid: false, code: discount.code, type: discount.type, value: 0, reason: 'unsupported' }\n }\n return { valid: true, code: discount.code, type: discount.type, value: discount.value }\n}\n\n/** Apply a validated discount to a subtotal, clamped to [0, subtotal]. Pure. */\nexport function applyDiscount(validation: DiscountValidation, subtotal: number): { discountTotal: number; code: string | null } {\n if (!validation.valid) return { discountTotal: 0, code: null }\n if (validation.type === 'percentage') {\n return { discountTotal: round2(Math.min(subtotal, (subtotal * validation.value) / 100)), code: validation.code }\n }\n if (validation.type === 'fixed_amount') {\n return { discountTotal: round2(Math.min(subtotal, validation.value)), code: validation.code }\n }\n return { discountTotal: 0, code: validation.code }\n}\n\n/** Report out-of-stock / unavailable lines against current catalog inventory. No mutation. */\nexport async function checkInventory(\n lines: InventoryLine[],\n provider: ShopProvider = getShopProvider(),\n): Promise<InventoryCheck> {\n const issues: InventoryIssue[] = []\n for (const line of lines) {\n const product = await provider.getProduct(line.productId)\n if (!product || product.status !== 'active') {\n issues.push({ productId: line.productId, name: product?.name ?? line.productId, requested: line.quantity, available: 0 })\n continue\n }\n if (product.inventoryCount < line.quantity) {\n issues.push({ productId: line.productId, name: product.name, requested: line.quantity, available: product.inventoryCount })\n }\n }\n return { ok: issues.length === 0, issues }\n}\n\n/**\n * Recompute cart totals from authoritative catalog prices (ignores any client\n * unitPrice), applying a validated discount and shipping. Tax is 0 in v1 (hook).\n */\nexport async function computeCartTotals(\n input: { lines: InventoryLine[]; discountCode?: string; customerId?: string; shipping?: number },\n provider: ShopProvider = getShopProvider(),\n): Promise<CartTotals> {\n const lines: CartTotals['lines'] = []\n let subtotal = 0\n for (const line of input.lines) {\n const product = await provider.getProduct(line.productId)\n if (!product) continue\n const lineTotal = round2(product.price * line.quantity)\n subtotal += lineTotal\n lines.push({ productId: product.id, name: product.name, sku: product.sku, unitPrice: product.price, quantity: line.quantity, lineTotal })\n }\n subtotal = round2(subtotal)\n\n let discountTotal = 0\n let discountCode: string | null = null\n if (input.discountCode) {\n const applied = applyDiscount(\n await validateDiscount({ code: input.discountCode, subtotal, customerId: input.customerId }, provider),\n subtotal,\n )\n discountTotal = applied.discountTotal\n discountCode = applied.code\n }\n\n const shippingTotal = round2(Math.max(input.shipping ?? 0, 0))\n const taxTotal = 0\n const total = round2(Math.max(subtotal - discountTotal + shippingTotal + taxTotal, 0))\n return { lines, subtotal, discountTotal, discountCode, taxTotal, shippingTotal, total }\n}\n\n/** A customer's orders (scoped by id; RLS-enforced to the owner on Supabase). */\nexport async function getCustomerOrders(\n customerId: string,\n provider: ShopProvider = getShopProvider(),\n): Promise<Order[]> {\n return provider.listOrders({ customerId, limit: 100 })\n}\n","import { getSupabaseClientOptional } from '@fayz-ai/core'\nimport { resolveEntityStore } from '../entities/entity-store'\nimport type { EntityRecord, EntityRecordInput, ListEntityRecordsOptions } from '../entities/entity-store'\nimport { createSupabaseEntityStore } from '../entities/supabase-entity-store'\nimport { SIDECAR_TABLE, validateSidecarWrite } from '../entities/sidecar'\nimport type { ShopProvider } from './provider'\nimport type { ComputeAction, RuleCartSnapshot } from '../rules/rule-types'\nimport { getShopTenantId } from './tenant'\nimport { T } from './tables'\nimport type {\n Product, ProductImage, ProductOption, ProductVariant, ProductVariantSet, Category,\n Order, ShopCustomer, Discount,\n CreateProductInput, UpdateProductInput, ListProductsOptions,\n CreateCategoryInput, UpdateCategoryInput,\n CreateOrderInput, UpdateOrderInput, ListOrdersOptions, PlaceOrderInput,\n CreateCustomerInput, UpdateCustomerInput, ListCustomersOptions, ResolveCustomerInput,\n CreateDiscountInput, UpdateDiscountInput, ListDiscountsOptions, OrderItem,\n SalesChannel, CreateSalesChannelInput, UpdateSalesChannelInput,\n ShippingZone, CreateShippingZoneInput, UpdateShippingZoneInput,\n Collection, CreateCollectionInput, UpdateCollectionInput, CustomerGroup, CreateCustomerGroupInput, UpdateCustomerGroupInput, CustomerSegment, CreateCustomerSegmentInput, UpdateCustomerSegmentInput, GiftCard, CreateGiftCardInput, UpdateGiftCardInput, EmailTemplate, UpsertEmailTemplateInput, MediaFile,\n} from '../types'\n\nfunction getDb(): any {\n const supabase = getSupabaseClientOptional()\n if (!supabase) throw new Error('@fayz-ai/shop: Supabase client not initialized. Call setGlobalSupabaseClient() first.')\n return supabase\n}\n\nconst getTenantId = getShopTenantId\n\nfunction slugify(name: string): string {\n return name.toLowerCase().replace(/[^a-z0-9]+/g, '-').replace(/^-|-$/g, '')\n}\n\nfunction asUuid(value: string | null | undefined): string | null {\n if (!value) return null\n return /^[0-9a-f]{8}-[0-9a-f]{4}-[1-5][0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}$/i.test(value)\n ? value\n : null\n}\n\n/** 8 bare digits, zero-padded — the shape shipping_zones stores and compares. */\nfunction toPostalDigits(value: string | undefined | null): string | undefined {\n const digits = String(value ?? '').replace(/\\D/g, '')\n return digits ? digits.padStart(8, '0').slice(0, 8) : undefined\n}\n\nfunction rowToShippingZone(row: any): ShippingZone {\n return {\n id: row.id,\n tenantId: row.tenant_id,\n name: row.name,\n carrier: row.carrier ?? null,\n postalFrom: String(row.postal_from ?? '').trim(),\n postalTo: String(row.postal_to ?? '').trim(),\n rate: Number(row.rate ?? 0),\n freeAbove: row.free_above == null ? null : Number(row.free_above),\n etaMinDays: row.eta_min_days ?? null,\n etaMaxDays: row.eta_max_days ?? null,\n active: row.active ?? true,\n sortOrder: row.sort_order ?? 0,\n }\n}\n\nfunction shippingZonePayload(input: Partial<CreateShippingZoneInput>): Record<string, unknown> {\n const payload: Record<string, unknown> = {}\n if (input.name !== undefined) payload.name = input.name\n if (input.carrier !== undefined) payload.carrier = input.carrier || null\n if (input.postalFrom !== undefined) payload.postal_from = toPostalDigits(input.postalFrom)\n if (input.postalTo !== undefined) payload.postal_to = toPostalDigits(input.postalTo)\n if (input.rate !== undefined) payload.rate = input.rate\n if (input.freeAbove !== undefined) payload.free_above = input.freeAbove ?? null\n if (input.etaMinDays !== undefined) payload.eta_min_days = input.etaMinDays ?? null\n if (input.etaMaxDays !== undefined) payload.eta_max_days = input.etaMaxDays ?? null\n if (input.active !== undefined) payload.active = input.active\n if (input.sortOrder !== undefined) payload.sort_order = input.sortOrder\n return payload\n}\n\nfunction rowToProduct(row: any): Product {\n return {\n id: row.id,\n tenantId: row.tenant_id,\n name: row.name,\n slug: row.slug ?? slugify(row.name),\n description: row.description,\n price: row.price ?? 0,\n compareAtPrice: row.compare_at_price,\n currency: row.currency ?? 'BRL',\n status: row.status ?? 'active',\n inventoryCount: row.inventory_count ?? 0,\n sku: row.sku,\n sortOrder: row.sort_order ?? 0,\n metadata: row.metadata ?? {},\n images: Array.isArray(row.images) ? row.images.map(rowToImage) : [],\n categoryId: row.category_id,\n categoryName: row.category_name ?? null,\n isPhysical: row.is_physical ?? true,\n weight: row.weight,\n weightUnit: row.weight_unit ?? 'kg',\n createdAt: row.created_at,\n updatedAt: row.updated_at,\n }\n}\n\nfunction rowToImage(row: any): ProductImage {\n return {\n id: row.id,\n productId: row.product_id,\n url: row.url,\n altText: row.alt_text,\n sortOrder: row.sort_order ?? 0,\n isPrimary: row.is_primary ?? false,\n createdAt: row.created_at,\n }\n}\n\nfunction rowToCategory(row: any): Category {\n return {\n id: row.id,\n tenantId: row.tenant_id,\n name: row.name,\n slug: row.slug ?? slugify(row.name),\n description: row.description,\n parentId: row.parent_id,\n sortOrder: row.sort_order ?? 0,\n createdAt: row.created_at,\n }\n}\n\n/**\n * Order items were being passed through raw, so every snake_case column arrived\n * undefined on the camelCase type: unit_price, image_url and product_id were all\n * lost. `total` survived only because the name matches in both, which is exactly\n * why the bug looked like \"price is zero\" instead of \"nothing is mapped\".\n */\nfunction rowToOrderItem(row: any): OrderItem {\n return {\n id: row.id,\n orderId: row.order_id,\n productId: row.product_id ?? null,\n name: row.name,\n sku: row.sku ?? null,\n quantity: row.quantity ?? 0,\n unitPrice: row.unit_price ?? 0,\n total: row.total ?? 0,\n imageUrl: row.image_url ?? null,\n }\n}\n\nfunction rowToOrder(row: any): Order {\n return {\n id: row.id,\n tenantId: row.tenant_id,\n orderNumber: row.order_number,\n status: row.status ?? 'open',\n financialStatus: row.financial_status ?? 'pending',\n fulfillmentStatus: row.fulfillment_status ?? 'unfulfilled',\n currency: row.currency ?? 'BRL',\n subtotal: row.subtotal ?? 0,\n taxTotal: row.tax_total ?? 0,\n discountTotal: row.discount_total ?? 0,\n shippingTotal: row.shipping_total ?? 0,\n total: row.total ?? 0,\n customerId: row.customer_id,\n customerName: row.customer_name,\n customerEmail: row.customer_email,\n discountCode: row.discount_code,\n notes: row.notes,\n shippingAddress: row.shipping_address ?? null,\n paymentMethodKind: row.payment_method_kind ?? null,\n paidAt: row.paid_at ?? null,\n items: Array.isArray(row.items) ? row.items.map(rowToOrderItem) : [],\n createdAt: row.created_at,\n updatedAt: row.updated_at,\n }\n}\n\nfunction rowToCustomer(row: any): ShopCustomer {\n return {\n id: row.id,\n tenantId: row.tenant_id,\n firstName: row.first_name,\n lastName: row.last_name ?? '',\n email: row.email,\n phone: row.phone,\n notes: row.notes,\n ordersCount: row.orders_count ?? 0,\n totalSpent: row.total_spent ?? 0,\n createdAt: row.created_at,\n updatedAt: row.updated_at,\n }\n}\n\nfunction rowToDiscount(row: any): Discount {\n return {\n id: row.id,\n tenantId: row.tenant_id,\n title: row.title,\n code: row.code,\n type: row.type,\n method: row.method ?? 'code',\n value: row.value ?? 0,\n usageLimit: row.usage_limit,\n oncePerCustomer: row.once_per_customer ?? false,\n minSubtotal: row.min_subtotal ?? null,\n appliesTo: row.applies_to ?? 'all',\n productIds: row.product_ids ?? [],\n categoryIds: row.category_ids ?? [],\n startsAt: row.starts_at,\n endsAt: row.ends_at,\n status: row.status ?? 'active',\n timesUsed: row.times_used ?? 0,\n createdAt: row.created_at,\n updatedAt: row.updated_at,\n }\n}\n\nfunction rowToSalesChannel(row: any): SalesChannel {\n return {\n id: row.id,\n tenantId: row.tenant_id,\n kind: row.kind,\n label: row.label,\n url: row.url,\n enabled: row.enabled ?? true,\n position: row.position ?? 0,\n createdAt: row.created_at,\n updatedAt: row.updated_at,\n }\n}\n\nfunction segmentPayload(input: Partial<CreateCustomerSegmentInput>): Record<string, unknown> {\n const p: Record<string, unknown> = {}\n if (input.name !== undefined) p.name = input.name\n if (input.description !== undefined) p.description = input.description\n if (input.minOrders !== undefined) p.min_orders = nullableNumber(input.minOrders)\n if (input.maxOrders !== undefined) p.max_orders = nullableNumber(input.maxOrders)\n if (input.minSpent !== undefined) p.min_spent = nullableNumber(input.minSpent)\n if (input.maxSpent !== undefined) p.max_spent = nullableNumber(input.maxSpent)\n if (input.joinedAfter !== undefined) p.joined_after = input.joinedAfter || null\n if (input.joinedBefore !== undefined) p.joined_before = input.joinedBefore || null\n return p\n}\n\nconst GIFT_CODE_ALPHABET = 'ABCDEFGHJKLMNPQRTUVWXY2346789'\nconst IMAGE_EXTENSIONS = new Set(['png', 'jpg', 'jpeg', 'gif', 'webp', 'svg', 'avif', 'bmp'])\nconst VIDEO_EXTENSIONS = new Set(['mp4', 'mov', 'webm', 'm4v', 'avi', 'mkv'])\n\nfunction generateGiftCardCode(): string {\n const bytes = new Uint8Array(12)\n globalThis.crypto.getRandomValues(bytes)\n const chars = Array.from(bytes, (b) => GIFT_CODE_ALPHABET[b % GIFT_CODE_ALPHABET.length])\n return `${chars.slice(0, 4).join('')}-${chars.slice(4, 8).join('')}-${chars.slice(8, 12).join('')}`\n}\n\nexport function mediaKindOf(name: string, mime?: string | null): MediaFile['kind'] {\n if (mime?.startsWith('image/')) return 'image'\n if (mime?.startsWith('video/')) return 'video'\n const ext = (name.split('.').pop() ?? '').toLowerCase()\n if (IMAGE_EXTENSIONS.has(ext)) return 'image'\n if (VIDEO_EXTENSIONS.has(ext)) return 'video'\n return 'document'\n}\n\n// ---------------------------------------------------------------------------\n// Mapeadores das entidades resgatadas da onda de 04-ago. Nenhum toca variante\n// nem o ledger de estoque — esses seguem os desta branch.\n// ---------------------------------------------------------------------------\n\nfunction nullableNumber(value: unknown): number | null {\n if (value === null || value === undefined || value === '') return null\n const n = Number(value)\n return Number.isFinite(n) ? n : null\n}\n\nfunction rowToCollection(row: any): Collection {\n // Members arrive as the embedded join rows; the editorial order lives on the\n // join, so sort by it here rather than trusting PostgREST's arrival order.\n const members = (row.members ?? []) as Array<{ product_id: string; position: number | null }>\n return {\n id: row.id,\n tenantId: row.tenant_id,\n title: row.title,\n handle: row.handle ?? slugify(row.title ?? ''),\n description: row.description ?? null,\n imageUrl: row.image_url ?? null,\n seoTitle: row.seo_title ?? null,\n seoDescription: row.seo_description ?? null,\n published: row.published ?? true,\n sortOrder: row.sort_order ?? 0,\n productIds: [...members]\n .sort((a, b) => (a.position ?? 0) - (b.position ?? 0))\n .map((m) => m.product_id),\n createdAt: row.created_at,\n updatedAt: row.updated_at ?? row.created_at,\n }\n}\n\nfunction rowToCustomerGroup(row: any): CustomerGroup {\n const members = (row.members ?? []) as Array<{ customer_id: string }>\n return {\n id: row.id,\n tenantId: row.tenant_id,\n name: row.name,\n description: row.description ?? null,\n color: row.color ?? null,\n customerIds: members.map((m) => m.customer_id),\n createdAt: row.created_at,\n updatedAt: row.updated_at ?? row.created_at,\n }\n}\n\nfunction rowToCustomerSegment(row: any): CustomerSegment {\n return {\n id: row.id,\n tenantId: row.tenant_id,\n name: row.name,\n description: row.description ?? null,\n minOrders: nullableNumber(row.min_orders),\n maxOrders: nullableNumber(row.max_orders),\n minSpent: nullableNumber(row.min_spent),\n maxSpent: nullableNumber(row.max_spent),\n joinedAfter: row.joined_after ?? null,\n joinedBefore: row.joined_before ?? null,\n createdAt: row.created_at,\n updatedAt: row.updated_at ?? row.created_at,\n }\n}\n\n// A plg_automations_templates row: `event_key` carries the owning module\n// ('shop.order_shipped') and the shop's own vocabulary is what follows the dot.\nconst SHOP_EVENT_PREFIX = 'shop.'\nconst EMAIL_CHANNEL = 'email'\n\nfunction rowToEmailTemplate(row: any): EmailTemplate {\n return {\n id: row.id,\n tenantId: row.tenant_id,\n event: String(row.event_key ?? '').slice(SHOP_EVENT_PREFIX.length) as EmailTemplate['event'],\n // NULL stays NULL: the catalog resolves the default (resolveEmailTemplates),\n // not this mapping. Collapsing to `false` here would silently disable every\n // template whose row exists only because its text was edited.\n enabled: row.enabled ?? null,\n // Empty string and NULL both mean \"no override\" — a subject the merchant\n // cleared should fall back to the default, not send a blank subject line.\n subject: row.subject || null,\n body: row.body || null,\n updatedAt: row.updated_at ?? row.created_at,\n }\n}\n\nfunction rowToGiftCard(row: any): GiftCard {\n return {\n id: row.id,\n tenantId: row.tenant_id,\n code: String(row.code ?? '').toUpperCase(),\n initialBalance: Number(row.initial_balance ?? 0),\n balance: Number(row.balance ?? 0),\n currency: row.currency ?? 'BRL',\n status: (row.status ?? 'active') as GiftCard['status'],\n expiresAt: row.expires_at ?? null,\n customerId: row.customer_id ?? null,\n customerEmail: row.customer_email ?? null,\n note: row.note ?? null,\n createdAt: row.created_at,\n updatedAt: row.updated_at ?? row.created_at,\n }\n}\n\nexport class SupabaseShopProvider implements ShopProvider {\n // ---------------------------------------------------------------------------\n // Products\n // ---------------------------------------------------------------------------\n\n async listProducts(options?: ListProductsOptions): Promise<Product[]> {\n const db = getDb()\n const tenantId = getTenantId()\n let q = db.from(T.products).select(`*, images:${T.productImages}(*)`)\n if (tenantId) q = q.eq('tenant_id', tenantId)\n if (options?.status) q = q.eq('status', options.status)\n if (options?.categoryId) q = q.eq('category_id', options.categoryId)\n if (options?.slug) q = q.eq('slug', options.slug)\n if (options?.search) q = q.ilike('name', `%${options.search}%`)\n q = q.order(options?.orderBy ?? 'sort_order', { ascending: options?.order !== 'desc' })\n if (options?.limit) q = q.limit(options.limit)\n if (options?.offset) q = q.range(options.offset, (options.offset ?? 0) + (options.limit ?? 50) - 1)\n const { data, error } = await q\n if (error) throw error\n return (data ?? []).map(rowToProduct)\n }\n\n async getProduct(id: string): Promise<Product | null> {\n const db = getDb()\n const { data, error } = await db\n .from(T.products)\n .select(`*, images:${T.productImages}(*)`)\n .eq('id', id)\n .maybeSingle()\n if (error) throw error\n return data ? rowToProduct(data) : null\n }\n\n /** Option axes + variants from the 0028 tables (spine M5). The storefront\n * RLS on both tables already restricts anon reads to active variants of\n * publicly readable products; the status filter here keeps the admin path\n * (authenticated tenant member, who CAN see archived rows) consistent. */\n async getProductVariants(productId: string): Promise<ProductVariantSet> {\n const db = getDb()\n const [optionsRes, variantsRes] = await Promise.all([\n db.from(T.productOptions).select('*').eq('product_id', productId).order('position', { ascending: true }),\n db\n .from(T.productVariants)\n .select('*')\n .eq('product_id', productId)\n .eq('status', 'active')\n .order('position', { ascending: true }),\n ])\n if (optionsRes.error) throw optionsRes.error\n if (variantsRes.error) throw variantsRes.error\n const options: ProductOption[] = (optionsRes.data ?? []).map((row: any) => ({\n id: row.id,\n name: row.name,\n values: Array.isArray(row.values) ? row.values.map(String) : [],\n position: row.position ?? 0,\n }))\n const variants: ProductVariant[] = (variantsRes.data ?? []).map((row: any) => ({\n id: row.id,\n productId: row.product_id,\n options: row.options && typeof row.options === 'object' ? row.options : {},\n sku: row.sku ?? null,\n price: row.price == null ? null : Number(row.price),\n compareAtPrice: row.compare_at_price == null ? null : Number(row.compare_at_price),\n inventoryCount: row.inventory_count ?? 0,\n position: row.position ?? 0,\n status: row.status ?? 'active',\n imageId: row.image_id ?? null,\n }))\n return { options, variants }\n }\n\n async createProduct(input: CreateProductInput): Promise<Product> {\n const db = getDb()\n const tenantId = getTenantId()\n const { data, error } = await db\n .from(T.products)\n .insert({\n tenant_id: tenantId,\n name: input.name,\n slug: input.slug ?? slugify(input.name),\n description: input.description ?? null,\n price: input.price,\n compare_at_price: input.compareAtPrice ?? null,\n currency: input.currency ?? 'BRL',\n status: input.status ?? 'active',\n inventory_count: input.inventoryCount ?? 0,\n sku: input.sku ?? null,\n sort_order: input.sortOrder ?? 0,\n metadata: input.metadata ?? {},\n category_id: input.categoryId ?? null,\n is_physical: input.isPhysical ?? true,\n weight: input.weight ?? null,\n weight_unit: input.weightUnit ?? 'kg',\n })\n .select(`*, images:${T.productImages}(*)`)\n .single()\n if (error) throw error\n return rowToProduct(data)\n }\n\n async updateProduct(id: string, input: UpdateProductInput): Promise<Product> {\n const db = getDb()\n const updates: Record<string, unknown> = {}\n if (input.name !== undefined) { updates.name = input.name; updates.slug = input.slug ?? slugify(input.name) }\n if (input.slug !== undefined) updates.slug = input.slug\n if (input.description !== undefined) updates.description = input.description\n if (input.price !== undefined) updates.price = input.price\n if (input.compareAtPrice !== undefined) updates.compare_at_price = input.compareAtPrice\n if (input.currency !== undefined) updates.currency = input.currency\n if (input.status !== undefined) updates.status = input.status\n if (input.inventoryCount !== undefined) updates.inventory_count = input.inventoryCount\n if (input.sku !== undefined) updates.sku = input.sku\n if (input.categoryId !== undefined) updates.category_id = input.categoryId\n if (input.isPhysical !== undefined) updates.is_physical = input.isPhysical\n if (input.weight !== undefined) updates.weight = input.weight\n const { data, error } = await db\n .from(T.products).update(updates).eq('id', id)\n .select(`*, images:${T.productImages}(*)`)\n .single()\n if (error) throw error\n return rowToProduct(data)\n }\n\n async deleteProduct(id: string): Promise<void> {\n const { error } = await getDb().from(T.products).delete().eq('id', id)\n if (error) throw error\n }\n\n async uploadProductImage(productId: string, file: File): Promise<ProductImage> {\n const db = getDb()\n const tenantId = getTenantId()\n const path = `${tenantId}/products/${productId}/${Date.now()}-${file.name}`\n const { error: uploadErr } = await db.storage.from('shop-images').upload(path, file)\n if (uploadErr) throw uploadErr\n const { data: { publicUrl } } = db.storage.from('shop-images').getPublicUrl(path)\n\n // Every upload used to land as sort_order 0 / is_primary false, so a product\n // whose only photo was uploaded here had NO primary at all, and a second one\n // tied with the first for position. New photos now go to the end, and the\n // first photo a product ever gets becomes its primary.\n const { data: existing } = await db\n .from(T.productImages)\n .select('id,sort_order')\n .eq('product_id', productId)\n .order('sort_order', { ascending: false })\n .limit(1)\n const first = !existing || existing.length === 0\n const nextOrder = first ? 0 : (existing[0].sort_order ?? 0) + 1\n\n const { data, error } = await db\n .from(T.productImages)\n .insert({\n product_id: productId, tenant_id: tenantId, url: publicUrl,\n sort_order: nextOrder, is_primary: first,\n })\n .select().single()\n if (error) throw error\n return rowToImage(data)\n }\n\n async updateProductImage(\n imageId: string,\n input: { isPrimary?: boolean; sortOrder?: number; altText?: string | null },\n ): Promise<ProductImage> {\n const db = getDb()\n const updates: Record<string, unknown> = {}\n if (input.sortOrder !== undefined) updates.sort_order = input.sortOrder\n if (input.altText !== undefined) updates.alt_text = input.altText\n if (input.isPrimary !== undefined) updates.is_primary = input.isPrimary\n\n // Demote the incumbent first. Doing it after would leave a window with two\n // primaries, and if the second statement failed the product would keep two\n // for good.\n if (input.isPrimary) {\n const { data: target } = await db\n .from(T.productImages).select('product_id').eq('id', imageId).single()\n if (target?.product_id) {\n await db.from(T.productImages)\n .update({ is_primary: false })\n .eq('product_id', target.product_id)\n .neq('id', imageId)\n }\n }\n\n const { data, error } = await db\n .from(T.productImages).update(updates).eq('id', imageId).select().single()\n if (error) throw error\n return rowToImage(data)\n }\n\n async deleteProductImage(imageId: string): Promise<void> {\n const { error } = await getDb().from(T.productImages).delete().eq('id', imageId)\n if (error) throw error\n }\n\n // ---------------------------------------------------------------------------\n // Categories\n // ---------------------------------------------------------------------------\n\n async listCategories(): Promise<Category[]> {\n const db = getDb()\n const tenantId = getTenantId()\n let q = db.from(T.categories).select('*').order('sort_order', { ascending: true })\n if (tenantId) q = q.eq('tenant_id', tenantId)\n const { data, error } = await q\n if (error) throw error\n return (data ?? []).map(rowToCategory)\n }\n\n async createCategory(input: CreateCategoryInput): Promise<Category> {\n const db = getDb()\n const { data, error } = await db\n .from(T.categories)\n .insert({ tenant_id: getTenantId(), name: input.name, slug: input.slug ?? slugify(input.name), description: input.description ?? null, parent_id: input.parentId ?? null, sort_order: input.sortOrder ?? 0 })\n .select().single()\n if (error) throw error\n return rowToCategory(data)\n }\n\n async updateCategory(id: string, input: UpdateCategoryInput): Promise<Category> {\n const db = getDb()\n const updates: Record<string, unknown> = {}\n if (input.name !== undefined) updates.name = input.name\n if (input.slug !== undefined) updates.slug = input.slug\n if (input.description !== undefined) updates.description = input.description\n if (input.parentId !== undefined) updates.parent_id = input.parentId\n if (input.sortOrder !== undefined) updates.sort_order = input.sortOrder\n const { data, error } = await db.from(T.categories).update(updates).eq('id', id).select().single()\n if (error) throw error\n return rowToCategory(data)\n }\n\n async deleteCategory(id: string): Promise<void> {\n const { error } = await getDb().from(T.categories).delete().eq('id', id)\n if (error) throw error\n }\n\n // ---------------------------------------------------------------------------\n // Orders\n // ---------------------------------------------------------------------------\n\n async listOrders(options?: ListOrdersOptions): Promise<Order[]> {\n const db = getDb()\n const tenantId = getTenantId()\n let q = db.from(T.orders).select(`*, items:${T.orderItems}(*)`)\n if (tenantId) q = q.eq('tenant_id', tenantId)\n if (options?.status) q = q.eq('status', options.status)\n if (options?.financialStatus) q = q.eq('financial_status', options.financialStatus)\n if (options?.fulfillmentStatus) q = q.eq('fulfillment_status', options.fulfillmentStatus)\n if (options?.customerId) q = q.eq('customer_id', options.customerId)\n if (options?.customerEmail) q = q.eq('customer_email', options.customerEmail)\n if (options?.search) q = q.or(`customer_name.ilike.%${options.search}%,customer_email.ilike.%${options.search}%`)\n q = q.order('created_at', { ascending: false })\n if (options?.limit) q = q.limit(options.limit)\n const { data, error } = await q\n if (error) throw error\n return (data ?? []).map(rowToOrder)\n }\n\n async getOrder(id: string): Promise<Order | null> {\n const { data, error } = await getDb()\n .from(T.orders).select(`*, items:${T.orderItems}(*)`)\n .eq('id', id).maybeSingle()\n if (error) throw error\n return data ? rowToOrder(data) : null\n }\n\n async createOrder(input: CreateOrderInput): Promise<Order> {\n const db = getDb()\n const tenantId = getTenantId()\n const subtotal = input.items.reduce((s, i) => s + i.quantity * i.unitPrice, 0)\n const discountTotal = input.discountTotal ?? 0\n const shippingTotal = input.shippingTotal ?? 0\n const total = Math.round((subtotal - discountTotal + shippingTotal) * 100) / 100\n const { data: order, error: orderErr } = await db\n .from(T.orders)\n .insert({ tenant_id: tenantId, customer_id: input.customerId ?? null, customer_name: input.customerName ?? null, customer_email: input.customerEmail ?? null, currency: input.currency ?? 'BRL', notes: input.notes ?? null, subtotal, discount_total: discountTotal, shipping_total: shippingTotal, discount_code: input.discountCode ?? null, total, status: 'open', financial_status: 'pending', fulfillment_status: 'unfulfilled' })\n .select().single()\n if (orderErr) throw orderErr\n const items = input.items.map(i => ({ order_id: order.id, product_id: asUuid(i.productId), name: i.name, sku: i.sku ?? null, quantity: i.quantity, unit_price: i.unitPrice, total: i.quantity * i.unitPrice, image_url: i.imageUrl ?? null }))\n await db.from(T.orderItems).insert(items)\n return this.getOrder(order.id) as Promise<Order>\n }\n\n async updateOrder(id: string, input: UpdateOrderInput): Promise<Order> {\n const updates: Record<string, unknown> = {}\n if (input.status !== undefined) updates.status = input.status\n if (input.financialStatus !== undefined) updates.financial_status = input.financialStatus\n if (input.fulfillmentStatus !== undefined) updates.fulfillment_status = input.fulfillmentStatus\n if (input.notes !== undefined) updates.notes = input.notes\n const { error } = await getDb().from(T.orders).update(updates).eq('id', id)\n if (error) throw error\n return this.getOrder(id) as Promise<Order>\n }\n\n // -------------------------------------------------------------------------\n // Delivery zones\n //\n // Postal codes are stored as 8 bare digits so the range test in\n // shop_quote_shipping is a plain BETWEEN. Accepting '22.041-001' from the\n // form and normalising here means the merchant never has to think about it.\n // -------------------------------------------------------------------------\n async listShippingZones(): Promise<ShippingZone[]> {\n const tenantId = getTenantId()\n const { data, error } = await getDb()\n .from(T.shippingZones)\n .select('*')\n .eq('tenant_id', tenantId)\n .order('sort_order', { ascending: true })\n .order('postal_from', { ascending: true })\n if (error) throw error\n return (data ?? []).map(rowToShippingZone)\n }\n\n async createShippingZone(input: CreateShippingZoneInput): Promise<ShippingZone> {\n const tenantId = getTenantId()\n if (!tenantId) throw new Error('@fayz-ai/shop: createShippingZone requires a tenant id.')\n const { data, error } = await getDb()\n .from(T.shippingZones)\n .insert({ tenant_id: tenantId, ...shippingZonePayload(input) })\n .select()\n .single()\n if (error) throw error\n return rowToShippingZone(data)\n }\n\n async updateShippingZone(id: string, input: UpdateShippingZoneInput): Promise<ShippingZone> {\n const { data, error } = await getDb()\n .from(T.shippingZones)\n .update(shippingZonePayload(input))\n .eq('id', id)\n .select()\n .single()\n if (error) throw error\n return rowToShippingZone(data)\n }\n\n async deleteShippingZone(id: string): Promise<void> {\n const { error } = await getDb().from(T.shippingZones).delete().eq('id', id)\n if (error) throw error\n }\n\n /**\n * Settle a pending order: the merchant confirming that the money arrived.\n *\n * Goes through the RPC rather than an UPDATE so the payment ledger row in\n * public.transactions closes in the same transaction as the order — set\n * financial_status by hand and the order says paid while the ledger still\n * says pending. Since 0019 the RPC also enforces who may call it: a member of\n * the owning tenant, or a PSP webhook with the service role.\n */\n async confirmPayment(id: string, reference?: string): Promise<Order | null> {\n const { error } = await getDb().rpc('shop_confirm_payment', {\n p_order_id: id,\n p_reference: reference ?? null,\n })\n if (error) throw error\n return this.getOrder(id)\n }\n\n // Trusted placement — delegates all price/discount/inventory authority to the\n // shop_place_order RPC (SECURITY DEFINER). The browser never sets a price.\n async placeOrder(input: PlaceOrderInput): Promise<Order> {\n const db = getDb()\n const tenantId = input.tenantId ?? getTenantId()\n if (!tenantId) throw new Error('@fayz-ai/shop: placeOrder requires a tenant id (configure the shop tenant resolver).')\n const { data, error } = await db.rpc('shop_place_order', {\n p_tenant_id: tenantId,\n // variant_id rides on each line (0029): the RPC prices and decrements\n // the variant when present, product-level otherwise. Pre-0029 servers\n // ignore unknown jsonb keys, so this stays compatible either way.\n p_items: input.items.map(i => ({\n product_id: i.productId,\n variant_id: asUuid(i.variantId) ?? undefined,\n quantity: i.quantity,\n options_label: i.optionsLabel ?? null,\n })),\n p_customer_id: asUuid(input.customerId),\n p_customer_name: input.customer?.name ?? null,\n p_customer_email: input.customer?.email ?? null,\n p_currency: input.currency ?? 'BRL',\n p_discount_code: input.discountCode ?? null,\n p_shipping_total: input.shippingTotal ?? 0,\n // snake_case keys on purpose: the RPC freezes this jsonb onto the\n // order and public.addresses uses these exact column names.\n p_shipping_address: input.shippingAddress\n ? {\n postal_code: input.shippingAddress.postalCode,\n street: input.shippingAddress.street,\n number: input.shippingAddress.number ?? null,\n complement: input.shippingAddress.complement ?? null,\n district: input.shippingAddress.district ?? null,\n city: input.shippingAddress.city,\n state: input.shippingAddress.state,\n country: input.shippingAddress.country ?? 'BR',\n recipient: input.shippingAddress.recipient ?? null,\n phone: input.shippingAddress.phone ?? null,\n label: input.shippingAddress.label ?? null,\n }\n : null,\n p_payment_method: input.paymentMethod ?? null,\n p_notes: input.notes ?? null,\n // Only when something contributed: p_metadata exists from 0029 on, and\n // a pre-0029 server rejects unknown NAMED arguments (unlike unknown\n // jsonb keys). Absent metadata therefore must not send the key at all.\n ...(input.metadata !== undefined ? { p_metadata: input.metadata } : {}),\n })\n if (error) throw error\n const orderId = typeof data === 'string' ? data : (data?.id ?? data?.order_id ?? data)\n const order = await this.getOrder(orderId)\n if (!order) throw new Error('@fayz-ai/shop: placeOrder did not return a persisted order.')\n return order\n }\n\n // ---------------------------------------------------------------------------\n // Customers\n // ---------------------------------------------------------------------------\n\n async listCustomers(options?: ListCustomersOptions): Promise<ShopCustomer[]> {\n const db = getDb()\n const tenantId = getTenantId()\n let q = db.from(T.customers).select('*').order('first_name', { ascending: true })\n if (tenantId) q = q.eq('tenant_id', tenantId)\n if (options?.search) q = q.or(`first_name.ilike.%${options.search}%,last_name.ilike.%${options.search}%,email.ilike.%${options.search}%`)\n if (options?.limit) q = q.limit(options.limit)\n const { data, error } = await q\n if (error) throw error\n return (data ?? []).map(rowToCustomer)\n }\n\n async getCustomer(id: string): Promise<ShopCustomer | null> {\n const { data, error } = await getDb().from(T.customers).select('*').eq('id', id).maybeSingle()\n if (error) throw error\n return data ? rowToCustomer(data) : null\n }\n\n async createCustomer(input: CreateCustomerInput): Promise<ShopCustomer> {\n const { data, error } = await getDb()\n .from(T.customers)\n .insert({ tenant_id: getTenantId(), first_name: input.firstName, last_name: input.lastName ?? '', email: input.email ?? null, phone: input.phone ?? null, notes: input.notes ?? null })\n .select().single()\n if (error) throw error\n return rowToCustomer(data)\n }\n\n async updateCustomer(id: string, input: UpdateCustomerInput): Promise<ShopCustomer> {\n const updates: Record<string, unknown> = {}\n if (input.firstName !== undefined) updates.first_name = input.firstName\n if (input.lastName !== undefined) updates.last_name = input.lastName\n if (input.email !== undefined) updates.email = input.email\n if (input.phone !== undefined) updates.phone = input.phone\n if (input.notes !== undefined) updates.notes = input.notes\n const { data, error } = await getDb().from(T.customers).update(updates).eq('id', id).select().single()\n if (error) throw error\n return rowToCustomer(data)\n }\n\n async deleteCustomer(id: string): Promise<void> {\n const { error } = await getDb().from(T.customers).delete().eq('id', id)\n if (error) throw error\n }\n\n // Find-or-create + link to auth.uid server-side (SECURITY DEFINER RPC), so the\n // browser never supplies the auth id and \"my orders\" is RLS-scoped to the owner.\n async resolveCustomer(input: ResolveCustomerInput): Promise<ShopCustomer> {\n const db = getDb()\n const tenantId = input.tenantId ?? getTenantId()\n if (!tenantId) throw new Error('@fayz-ai/shop: resolveCustomer requires a tenant id.')\n const { data, error } = await db.rpc('shop_resolve_customer', {\n p_tenant_id: tenantId,\n p_email: input.email,\n p_name: input.name ?? null,\n })\n if (error) throw error\n const row = Array.isArray(data) ? data[0] : data\n if (!row) throw new Error('@fayz-ai/shop: resolveCustomer returned no row.')\n return rowToCustomer(row)\n }\n\n // ---------------------------------------------------------------------------\n // Promotions (spine M6) — evaluation happens INSIDE the database via the\n // SECURITY DEFINER function (migrations/0033), so an anonymous storefront\n // never reads promotion rows or codes directly: it sends the cart snapshot\n // and receives ordered actions. The function mirrors the TS reference\n // evaluator (src/rules/evaluator.ts), which is the tested spec.\n // ---------------------------------------------------------------------------\n\n async evaluatePromotions(input: { cart: RuleCartSnapshot }): Promise<ComputeAction[]> {\n const db = getDb()\n const tenantId = getTenantId()\n if (!tenantId) throw new Error('@fayz-ai/shop: evaluatePromotions requires a tenant id (configure the shop tenant resolver).')\n const cart = input.cart\n const { data, error } = await db.rpc('shop_compute_promotion_actions', {\n p_tenant_id: tenantId,\n // The serializable RuleCartSnapshot, snake_case on the wire — the same\n // contract 0033 documents for p_cart.\n p_cart: {\n items: cart.items.map((item) => ({\n id: item.id ?? item.productId,\n product_id: item.productId,\n quantity: item.quantity,\n unit_price: item.unitPrice,\n category_id: item.categoryId ?? null,\n collection_id: item.collectionId ?? null,\n })),\n shipping_total: cart.shippingTotal ?? null,\n region: cart.region ?? null,\n customer: cart.customer\n ? { email: cart.customer.email ?? null, tags: cart.customer.tags ?? [] }\n : null,\n codes: cart.codes ?? [],\n },\n })\n if (error) throw error\n const rows: Array<Record<string, unknown>> = Array.isArray(data) ? data : []\n return rows.map((row): ComputeAction => {\n const code = (row.code as string | null) ?? null\n if (row.action === 'addShippingDiscount') {\n return { action: 'addShippingDiscount', promotionId: String(row.promotion_id), code, amount: Number(row.amount) }\n }\n if (row.action === 'addFreeItem') {\n return { action: 'addFreeItem', promotionId: String(row.promotion_id), code, productId: String(row.product_id), quantity: Number(row.quantity) }\n }\n return { action: 'addItemDiscount', promotionId: String(row.promotion_id), code, itemId: String(row.item_id), amount: Number(row.amount) }\n })\n }\n\n // ---------------------------------------------------------------------------\n // Discounts\n // ---------------------------------------------------------------------------\n\n async listDiscounts(options?: ListDiscountsOptions): Promise<Discount[]> {\n const db = getDb()\n const tenantId = getTenantId()\n let q = db.from(T.discounts).select('*').order('created_at', { ascending: false })\n if (tenantId) q = q.eq('tenant_id', tenantId)\n if (options?.status) q = q.eq('status', options.status)\n if (options?.type) q = q.eq('type', options.type)\n if (options?.search) q = q.ilike('title', `%${options.search}%`)\n if (options?.limit) q = q.limit(options.limit)\n const { data, error } = await q\n if (error) throw error\n return (data ?? []).map(rowToDiscount)\n }\n\n async getDiscount(id: string): Promise<Discount | null> {\n const { data, error } = await getDb().from(T.discounts).select('*').eq('id', id).maybeSingle()\n if (error) throw error\n return data ? rowToDiscount(data) : null\n }\n\n async createDiscount(input: CreateDiscountInput): Promise<Discount> {\n const { data, error } = await getDb()\n .from(T.discounts)\n .insert({ tenant_id: getTenantId(), title: input.title, code: input.code ?? null, type: input.type, method: input.method ?? 'code', value: input.value, usage_limit: input.usageLimit ?? null, once_per_customer: input.oncePerCustomer ?? false, min_subtotal: input.minSubtotal ?? null, applies_to: input.appliesTo ?? 'all', product_ids: input.productIds ?? [], category_ids: input.categoryIds ?? [], starts_at: input.startsAt ?? new Date().toISOString(), ends_at: input.endsAt ?? null, status: input.status ?? 'active', times_used: 0 })\n .select().single()\n if (error) throw error\n return rowToDiscount(data)\n }\n\n async updateDiscount(id: string, input: UpdateDiscountInput): Promise<Discount> {\n const updates: Record<string, unknown> = {}\n if (input.title !== undefined) updates.title = input.title\n if (input.code !== undefined) updates.code = input.code\n if (input.type !== undefined) updates.type = input.type\n if (input.value !== undefined) updates.value = input.value\n if (input.usageLimit !== undefined) updates.usage_limit = input.usageLimit\n if (input.minSubtotal !== undefined) updates.min_subtotal = input.minSubtotal\n if (input.appliesTo !== undefined) updates.applies_to = input.appliesTo\n if (input.productIds !== undefined) updates.product_ids = input.productIds\n if (input.categoryIds !== undefined) updates.category_ids = input.categoryIds\n if (input.status !== undefined) updates.status = input.status\n if (input.endsAt !== undefined) updates.ends_at = input.endsAt\n const { data, error } = await getDb().from(T.discounts).update(updates).eq('id', id).select().single()\n if (error) throw error\n return rowToDiscount(data)\n }\n\n async deleteDiscount(id: string): Promise<void> {\n const { error } = await getDb().from(T.discounts).delete().eq('id', id)\n if (error) throw error\n }\n\n // ---------------------------------------------------------------------------\n // Sales channels\n // ---------------------------------------------------------------------------\n\n async listSalesChannels(): Promise<SalesChannel[]> {\n const db = getDb()\n const tenantId = getTenantId()\n let q = db.from(T.salesChannels).select('*').order('position', { ascending: true })\n if (tenantId) q = q.eq('tenant_id', tenantId)\n const { data, error } = await q\n if (error) throw error\n return (data ?? []).map(rowToSalesChannel)\n }\n\n async createSalesChannel(input: CreateSalesChannelInput): Promise<SalesChannel> {\n const { data, error } = await getDb()\n .from(T.salesChannels)\n .insert({ tenant_id: getTenantId(), kind: input.kind, label: input.label, url: input.url ?? null, enabled: input.enabled ?? true, position: input.position ?? 0 })\n .select().single()\n if (error) throw error\n return rowToSalesChannel(data)\n }\n\n async updateSalesChannel(id: string, input: UpdateSalesChannelInput): Promise<SalesChannel> {\n const updates: Record<string, unknown> = {}\n if (input.kind !== undefined) updates.kind = input.kind\n if (input.label !== undefined) updates.label = input.label\n if (input.url !== undefined) updates.url = input.url\n if (input.enabled !== undefined) updates.enabled = input.enabled\n if (input.position !== undefined) updates.position = input.position\n const { data, error } = await getDb().from(T.salesChannels).update(updates).eq('id', id).select().single()\n if (error) throw error\n return rowToSalesChannel(data)\n }\n\n async deleteSalesChannel(id: string): Promise<void> {\n const { error } = await getDb().from(T.salesChannels).delete().eq('id', id)\n if (error) throw error\n }\n\n // ---------------------------------------------------------------------------\n // Custom entities (spine M4). Storage resolves through the EntityStore\n // indirection (I5): a promoted entity's registered store wins; everything\n // else reads/writes the generic jsonb table (migration 0030), whose row\n // access is the RLS generated from each declaration (I6).\n // ---------------------------------------------------------------------------\n\n private entityStore(entity: string) {\n return resolveEntityStore(entity, createSupabaseEntityStore)\n }\n\n async listEntityRecords(entity: string, options?: ListEntityRecordsOptions): Promise<EntityRecord[]> {\n return this.entityStore(entity).list(options)\n }\n\n async getEntityRecord(entity: string, id: string): Promise<EntityRecord | null> {\n return this.entityStore(entity).get(id)\n }\n\n async getEntityRecordBySlug(entity: string, slug: string): Promise<EntityRecord | null> {\n return this.entityStore(entity).getBySlug(slug)\n }\n\n async createEntityRecord(entity: string, input: EntityRecordInput): Promise<EntityRecord> {\n return this.entityStore(entity).create(input)\n }\n\n async updateEntityRecord(entity: string, id: string, input: Partial<EntityRecordInput>): Promise<EntityRecord> {\n return this.entityStore(entity).update(id, input)\n }\n\n async deleteEntityRecord(entity: string, id: string): Promise<void> {\n return this.entityStore(entity).delete(id)\n }\n\n // Sidecar fields on core records (migration 0031): one row per\n // (reference, reference_id), validated on write against defineSidecarFields.\n\n async getEntityFields(reference: string, referenceId: string): Promise<Record<string, unknown> | null> {\n const { data, error } = await getDb()\n .from(SIDECAR_TABLE)\n .select('data')\n .eq('reference', reference)\n .eq('reference_id', referenceId)\n .maybeSingle()\n if (error) throw error\n return data ? (data.data ?? {}) : null\n }\n\n async setEntityFields(reference: string, referenceId: string, fields: Record<string, unknown>): Promise<Record<string, unknown>> {\n validateSidecarWrite(reference, fields)\n const { data, error } = await getDb()\n .from(SIDECAR_TABLE)\n .upsert(\n { tenant_id: getTenantId(), reference, reference_id: referenceId, data: fields },\n { onConflict: 'tenant_id,reference,reference_id' },\n )\n .select('data')\n .single()\n if (error) throw error\n return data.data ?? {}\n }\n\n // -------------------------------------------------------------------------\n // Coleções, grupos/segmentos, vale-presente, e-mails e mídia.\n // -------------------------------------------------------------------------\n\nasync listCollections(): Promise<Collection[]> {\n const db = getDb()\n const tenantId = getTenantId()\n let q = db\n .from(T.collections)\n .select(`*, members:${T.collectionProducts}(product_id, position)`)\n .order('sort_order', { ascending: true })\n if (tenantId) q = q.eq('tenant_id', tenantId)\n const { data, error } = await q\n if (error) throw error\n return (data ?? []).map(rowToCollection)\n }\n\n async getCollection(id: string): Promise<Collection | null> {\n const { data, error } = await getDb()\n .from(T.collections)\n .select(`*, members:${T.collectionProducts}(product_id, position)`)\n .eq('id', id)\n .maybeSingle()\n if (error) throw error\n return data ? rowToCollection(data) : null\n }\n\n async createCollection(input: CreateCollectionInput): Promise<Collection> {\n const db = getDb()\n const tenantId = getTenantId()\n const { data, error } = await db\n .from(T.collections)\n .insert({\n tenant_id: tenantId,\n title: input.title,\n handle: input.handle?.trim() || slugify(input.title),\n description: input.description ?? null,\n image_url: input.imageUrl ?? null,\n seo_title: input.seoTitle ?? null,\n seo_description: input.seoDescription ?? null,\n published: input.published ?? true,\n sort_order: input.sortOrder ?? 0,\n })\n .select().single()\n if (error) throw error\n await this.syncCollectionProducts(data.id, tenantId, input.productIds)\n return (await this.getCollection(data.id)) ?? rowToCollection(data)\n }\n\n async updateCollection(id: string, input: UpdateCollectionInput): Promise<Collection> {\n const db = getDb()\n const updates: Record<string, unknown> = {}\n if (input.title !== undefined) updates.title = input.title\n if (input.handle !== undefined) updates.handle = input.handle?.trim() || slugify(String(input.title ?? ''))\n if (input.description !== undefined) updates.description = input.description\n if (input.imageUrl !== undefined) updates.image_url = input.imageUrl\n if (input.seoTitle !== undefined) updates.seo_title = input.seoTitle\n if (input.seoDescription !== undefined) updates.seo_description = input.seoDescription\n if (input.published !== undefined) updates.published = input.published\n if (input.sortOrder !== undefined) updates.sort_order = input.sortOrder\n\n if (Object.keys(updates).length > 0) {\n const { error } = await db.from(T.collections).update(updates).eq('id', id)\n if (error) throw error\n }\n // `undefined` means \"leave the membership alone\" — an edit that only renamed\n // the collection must not empty it.\n if (input.productIds !== undefined) {\n await this.syncCollectionProducts(id, getTenantId(), input.productIds)\n }\n const updated = await this.getCollection(id)\n if (!updated) throw new Error('Collection not found')\n return updated\n }\n\n async deleteCollection(id: string): Promise<void> {\n // Members go with it via ON DELETE CASCADE.\n const { error } = await getDb().from(T.collections).delete().eq('id', id)\n if (error) throw error\n }\n\n async listCustomerGroups(): Promise<CustomerGroup[]> {\n const db = getDb()\n const tenantId = getTenantId()\n let q = db\n .from(T.customerGroups)\n .select(`*, members:${T.customerGroupMembers}(customer_id)`)\n .order('name', { ascending: true })\n if (tenantId) q = q.eq('tenant_id', tenantId)\n const { data, error } = await q\n if (error) throw error\n return (data ?? []).map(rowToCustomerGroup)\n }\n\n async createCustomerGroup(input: CreateCustomerGroupInput): Promise<CustomerGroup> {\n const tenantId = getTenantId()\n const { data, error } = await getDb()\n .from(T.customerGroups)\n .insert({\n tenant_id: tenantId,\n name: input.name,\n description: input.description ?? null,\n color: input.color ?? null,\n })\n .select().single()\n if (error) throw error\n await this.syncGroupMembers(data.id, tenantId, input.customerIds)\n return { ...rowToCustomerGroup(data), customerIds: input.customerIds ?? [] }\n }\n\n async updateCustomerGroup(id: string, input: UpdateCustomerGroupInput): Promise<CustomerGroup> {\n const db = getDb()\n const updates: Record<string, unknown> = {}\n if (input.name !== undefined) updates.name = input.name\n if (input.description !== undefined) updates.description = input.description\n if (input.color !== undefined) updates.color = input.color\n if (Object.keys(updates).length > 0) {\n const { error } = await db.from(T.customerGroups).update(updates).eq('id', id)\n if (error) throw error\n }\n // undefined means \"leave the membership alone\" — renaming a group must not\n // empty it.\n if (input.customerIds !== undefined) {\n await this.syncGroupMembers(id, getTenantId(), input.customerIds)\n }\n const { data, error } = await db\n .from(T.customerGroups)\n .select(`*, members:${T.customerGroupMembers}(customer_id)`)\n .eq('id', id).single()\n if (error) throw error\n return rowToCustomerGroup(data)\n }\n\n async deleteCustomerGroup(id: string): Promise<void> {\n // Members go with it via ON DELETE CASCADE. The CUSTOMERS are untouched —\n // deleting a grouping must never delete the people in it.\n const { error } = await getDb().from(T.customerGroups).delete().eq('id', id)\n if (error) throw error\n }\n\n async listCustomerSegments(): Promise<CustomerSegment[]> {\n const db = getDb()\n const tenantId = getTenantId()\n let q = db.from(T.customerSegments).select('*').order('name', { ascending: true })\n if (tenantId) q = q.eq('tenant_id', tenantId)\n const { data, error } = await q\n if (error) throw error\n return (data ?? []).map(rowToCustomerSegment)\n }\n\n async createCustomerSegment(input: CreateCustomerSegmentInput): Promise<CustomerSegment> {\n const { data, error } = await getDb()\n .from(T.customerSegments)\n .insert({ tenant_id: getTenantId(), ...segmentPayload(input), name: input.name })\n .select().single()\n if (error) throw error\n return rowToCustomerSegment(data)\n }\n\n async updateCustomerSegment(id: string, input: UpdateCustomerSegmentInput): Promise<CustomerSegment> {\n const { data, error } = await getDb()\n .from(T.customerSegments).update(segmentPayload(input)).eq('id', id).select().single()\n if (error) throw error\n return rowToCustomerSegment(data)\n }\n\n async deleteCustomerSegment(id: string): Promise<void> {\n const { error } = await getDb().from(T.customerSegments).delete().eq('id', id)\n if (error) throw error\n }\n\n async listGiftCards(): Promise<GiftCard[]> {\n const db = getDb()\n const tenantId = getTenantId()\n let q = db.from(T.giftCards).select('*').order('created_at', { ascending: false })\n if (tenantId) q = q.eq('tenant_id', tenantId)\n const { data, error } = await q\n if (error) throw error\n return (data ?? []).map(rowToGiftCard)\n }\n\n async createGiftCard(input: CreateGiftCardInput): Promise<GiftCard> {\n const amount = Number(input.initialBalance) || 0\n const { data, error } = await getDb()\n .from(T.giftCards)\n .insert({\n tenant_id: getTenantId(),\n code: (input.code?.trim() || generateGiftCardCode()).toUpperCase(),\n initial_balance: amount,\n // A new card is worth its face value. The admin never types the\n // remaining balance at issue — that is what redemption is for.\n balance: amount,\n currency: input.currency ?? 'BRL',\n status: input.status ?? 'active',\n expires_at: input.expiresAt ?? null,\n customer_id: asUuid(input.customerId),\n customer_email: input.customerEmail ?? null,\n note: input.note ?? null,\n })\n .select().single()\n if (error) throw error\n return rowToGiftCard(data)\n }\n\n async updateGiftCard(id: string, input: UpdateGiftCardInput): Promise<GiftCard> {\n const updates: Record<string, unknown> = {}\n if (input.code !== undefined) updates.code = input.code.trim().toUpperCase()\n if (input.balance !== undefined) updates.balance = input.balance\n if (input.status !== undefined) updates.status = input.status\n if (input.expiresAt !== undefined) updates.expires_at = input.expiresAt\n if (input.customerId !== undefined) updates.customer_id = asUuid(input.customerId)\n if (input.customerEmail !== undefined) updates.customer_email = input.customerEmail\n if (input.note !== undefined) updates.note = input.note\n const { data, error } = await getDb().from(T.giftCards).update(updates).eq('id', id).select().single()\n if (error) throw error\n return rowToGiftCard(data)\n }\n\n async deleteGiftCard(id: string): Promise<void> {\n const { error } = await getDb().from(T.giftCards).delete().eq('id', id)\n if (error) throw error\n }\n\n async listEmailTemplates(): Promise<EmailTemplate[]> {\n const db = getDb()\n const tenantId = getTenantId()\n // Only this store's own events: the table is shared with every other module\n // that sends a message, so an unfiltered read would hand the shop screens\n // rows whose event key their catalog cannot resolve.\n let q = db.from(T.messageTemplates).select('*')\n .like('event_key', `${SHOP_EVENT_PREFIX}%`)\n .eq('channel', EMAIL_CHANNEL)\n if (tenantId) q = q.eq('tenant_id', tenantId)\n const { data, error } = await q\n if (error) throw error\n return (data ?? []).map(rowToEmailTemplate)\n }\n\n async upsertEmailTemplate(input: UpsertEmailTemplateInput): Promise<EmailTemplate> {\n const payload: Record<string, unknown> = {\n tenant_id: getTenantId(),\n event_key: `${SHOP_EVENT_PREFIX}${input.event}`,\n channel: EMAIL_CHANNEL,\n }\n if (input.enabled !== undefined) payload.enabled = input.enabled\n if (input.subject !== undefined) payload.subject = input.subject\n if (input.body !== undefined) payload.body = input.body\n // Upsert on (tenant, event, channel): the row is an override that may not\n // exist yet, and toggling a never-customised template is the common case.\n const { data, error } = await getDb()\n .from(T.messageTemplates)\n .upsert(payload, { onConflict: 'tenant_id,event_key,channel' })\n .select().single()\n if (error) throw error\n return rowToEmailTemplate(data)\n }\n\n async listMediaFiles(): Promise<MediaFile[]> {\n const db = getDb()\n const tenantId = getTenantId()\n if (!tenantId) return []\n const bucket = db.storage.from(T.mediaBucket)\n\n // The bucket is laid out {tenant}/library and {tenant}/products/{id}, and\n // storage.list walks one level at a time. Bounded to the tenant root plus\n // one level: that covers both layouts without an unbounded recursion over a\n // depth we do not control.\n const listAt = async (prefix: string): Promise<{ prefix: string; entry: any }[]> => {\n const { data, error } = await bucket.list(prefix, {\n limit: 1000,\n sortBy: { column: 'created_at', order: 'desc' },\n })\n if (error) return []\n return (data ?? []).map((entry: any) => ({ prefix, entry }))\n }\n\n const top = await listAt(tenantId)\n // An entry with no `id` is a folder placeholder, not an object.\n const folders = top.filter(({ entry }) => !entry.id).map(({ entry }) => `${tenantId}/${entry.name}`)\n const nested = (await Promise.all(folders.map(listAt))).flat()\n\n return [...top, ...nested]\n .filter(({ entry }) => entry.id)\n .map(({ prefix, entry }) => {\n const path = `${prefix}/${entry.name}`\n const { data: { publicUrl } } = bucket.getPublicUrl(path)\n const file: MediaFile = {\n id: path,\n name: entry.name,\n url: publicUrl,\n kind: mediaKindOf(entry.name, entry.metadata?.mimetype),\n size: Number(entry.metadata?.size ?? 0),\n extension: (entry.name.split('.').pop() ?? '').toUpperCase(),\n createdAt: entry.created_at ?? entry.updated_at ?? '',\n }\n return file\n })\n .sort((a, b) => b.createdAt.localeCompare(a.createdAt))\n }\n\n async uploadMediaFile(file: File): Promise<MediaFile> {\n const db = getDb()\n const tenantId = getTenantId()\n if (!tenantId) throw new Error('@fayz-ai/shop: no active tenant for media upload')\n // `library/` keeps hand-uploaded assets out of products/{id}, so deleting a\n // product never takes a banner the merchant uploaded here down with it.\n const path = `${tenantId}/library/${Date.now()}-${file.name}`\n const bucket = db.storage.from(T.mediaBucket)\n const { error } = await bucket.upload(path, file)\n if (error) throw error\n const { data: { publicUrl } } = bucket.getPublicUrl(path)\n return {\n id: path,\n name: file.name,\n url: publicUrl,\n kind: mediaKindOf(file.name, file.type),\n size: file.size,\n extension: (file.name.split('.').pop() ?? '').toUpperCase(),\n createdAt: new Date().toISOString(),\n }\n }\n\n async deleteMediaFile(id: string): Promise<void> {\n const { error } = await getDb().storage.from(T.mediaBucket).remove([id])\n if (error) throw error\n }\n\nprivate async syncCollectionProducts(\n collectionId: string,\n tenantId: string | undefined,\n productIds: string[] | undefined,\n ): Promise<void> {\n if (productIds === undefined) return\n const db = getDb()\n const { error: delErr } = await db\n .from(T.collectionProducts).delete().eq('collection_id', collectionId)\n if (delErr) throw delErr\n if (productIds.length === 0) return\n const rows = productIds.map((productId, position) => ({\n collection_id: collectionId, product_id: productId, tenant_id: tenantId, position,\n }))\n const { error } = await db.from(T.collectionProducts).insert(rows)\n if (error) throw error\n }\n\n private async syncGroupMembers(\n groupId: string,\n tenantId: string | undefined,\n customerIds: string[] | undefined,\n ): Promise<void> {\n if (customerIds === undefined) return\n const db = getDb()\n const { error: delErr } = await db\n .from(T.customerGroupMembers).delete().eq('group_id', groupId)\n if (delErr) throw delErr\n if (customerIds.length === 0) return\n const rows = customerIds.map((customerId) => ({\n group_id: groupId, customer_id: customerId, tenant_id: tenantId,\n }))\n const { error } = await db.from(T.customerGroupMembers).insert(rows)\n if (error) throw error\n }\n}\n\nexport function createSupabaseShopProvider(): ShopProvider {\n return new SupabaseShopProvider()\n}\n","import type { EmailEventKey, EmailTemplate, EmailTemplateKind } from '../types'\n\n// ---------------------------------------------------------------------------\n// The store's email event catalog.\n//\n// It lives in CODE, not the database: fulfilment is what fires \"order shipped\",\n// so an event only exists if code emits it. A catalog table would need a\n// migration per new event and would keep orphan rows when one went away.\n//\n// The database holds only the merchant's OVERRIDE (plg_automations_templates):\n// on or off, and the text where they rewrote it. No row means \"use the default\n// here\" — true for most stores, and it lets improvements to the default text\n// reach everyone who never customised.\n// ---------------------------------------------------------------------------\n\nexport interface EmailEventDef {\n event: EmailEventKey\n kind: EmailTemplateKind\n /** Template name in the list. */\n title: string\n /** What it does, in one line. */\n description: string\n /** When it fires — the \"event\" half of the pair. */\n trigger: string\n defaultSubject: string\n defaultBody: string\n /** lucide icon for the row. */\n icon: string\n /** On by default in a new store. Order confirmation is the only email a buyer\n * EXPECTS; the rest are the merchant's choice. */\n defaultEnabled: boolean\n}\n\n/** Placeholders the send substitutes. Documented here because this is what the\n * merchant may type in the editor without breaking anything. */\nexport const EMAIL_PLACEHOLDERS = [\n '{{store_name}}', '{{customer_name}}', '{{order_number}}', '{{order_total}}',\n '{{order_items}}', '{{tracking_code}}', '{{cart_url}}',\n] as const\n\nexport const SHOP_EMAIL_EVENTS: EmailEventDef[] = [\n {\n event: 'order_confirmation', kind: 'transactional', icon: 'CircleCheck',\n title: 'Confirmação de pedido',\n description: 'Enviado quando o cliente conclui a compra',\n trigger: 'Imediatamente após o checkout',\n defaultSubject: 'Pedido #{{order_number}} confirmado',\n defaultBody:\n 'Olá {{customer_name}},\\n\\nRecebemos seu pedido #{{order_number}}.\\n\\n{{order_items}}\\n\\nTotal: {{order_total}}\\n\\nObrigado por comprar na {{store_name}}!',\n defaultEnabled: true,\n },\n {\n event: 'order_paid', kind: 'transactional', icon: 'CreditCard',\n title: 'Pagamento aprovado',\n description: 'Enviado quando o pagamento é confirmado',\n trigger: 'Quando o pagamento é aprovado',\n defaultSubject: 'Pagamento aprovado — pedido #{{order_number}}',\n defaultBody:\n 'Olá {{customer_name}},\\n\\nSeu pagamento de {{order_total}} foi aprovado. Já estamos preparando o pedido #{{order_number}}.\\n\\n{{store_name}}',\n defaultEnabled: false,\n },\n {\n event: 'order_shipped', kind: 'transactional', icon: 'Truck',\n title: 'Pedido enviado',\n description: 'Enviado quando o pedido sai para entrega, com o rastreio',\n trigger: 'Quando a entrega é marcada como enviada',\n defaultSubject: 'Seu pedido saiu para entrega — #{{order_number}}',\n defaultBody:\n 'Olá {{customer_name}},\\n\\nSeu pedido #{{order_number}} está a caminho.\\n\\nRastreio: {{tracking_code}}\\n\\n{{store_name}}',\n defaultEnabled: false,\n },\n {\n event: 'order_delivered', kind: 'transactional', icon: 'PackageCheck',\n title: 'Pedido entregue',\n description: 'Enviado quando a entrega é concluída',\n trigger: 'Quando a entrega é marcada como concluída',\n defaultSubject: 'Seu pedido chegou — #{{order_number}}',\n defaultBody:\n 'Olá {{customer_name}},\\n\\nSeu pedido #{{order_number}} foi entregue. Esperamos que goste!\\n\\n{{store_name}}',\n defaultEnabled: false,\n },\n {\n event: 'order_cancelled', kind: 'transactional', icon: 'CircleX',\n title: 'Pedido cancelado',\n description: 'Enviado quando um pedido é cancelado',\n trigger: 'Quando o pedido é cancelado',\n defaultSubject: 'Pedido #{{order_number}} cancelado',\n defaultBody:\n 'Olá {{customer_name}},\\n\\nSeu pedido #{{order_number}} foi cancelado. Se você não pediu isso, responda este e-mail.\\n\\n{{store_name}}',\n defaultEnabled: false,\n },\n {\n event: 'refund_confirmation', kind: 'transactional', icon: 'RotateCcw',\n title: 'Reembolso processado',\n description: 'Enviado quando um reembolso é processado',\n trigger: 'Quando o pagamento é estornado',\n defaultSubject: 'Reembolso emitido — pedido #{{order_number}}',\n defaultBody:\n 'Olá {{customer_name}},\\n\\nO reembolso de {{order_total}} do pedido #{{order_number}} foi processado. O prazo de crédito depende do seu banco.\\n\\n{{store_name}}',\n defaultEnabled: false,\n },\n {\n event: 'customer_welcome', kind: 'transactional', icon: 'Mail',\n title: 'Boas-vindas',\n description: 'Enviado quando um cliente cria conta na loja',\n trigger: 'Quando o cliente se cadastra',\n defaultSubject: 'Bem-vindo(a) à {{store_name}}',\n defaultBody:\n 'Olá {{customer_name}},\\n\\nSua conta na {{store_name}} está pronta. Bom proveito!\\n\\n{{store_name}}',\n defaultEnabled: false,\n },\n {\n event: 'abandoned_cart', kind: 'marketing', icon: 'ShoppingCart',\n title: 'Carrinho abandonado',\n description: 'Enviado quando o cliente deixa itens no carrinho sem finalizar',\n trigger: '1 hora após o abandono do carrinho',\n defaultSubject: 'Você esqueceu alguns itens no carrinho',\n defaultBody:\n 'Olá {{customer_name}},\\n\\nSeus itens ainda estão te esperando.\\n\\n{{cart_url}}\\n\\n{{store_name}}',\n defaultEnabled: false,\n },\n]\n\n/**\n * Substitutes the placeholders. Beside the catalog because PREVIEW and SEND must\n * agree: a screen doing its own `replace` has the merchant approve one text and\n * the customer receive another.\n *\n * An unknown placeholder stays visible as `{{foo}}` on purpose — in the preview\n * that exposes the typo; hiding it would hide the gap until the email had gone.\n */\nexport function renderEmailTemplate(text: string, values: Record<string, string>): string {\n return text.replace(/\\{\\{\\s*(\\w+)\\s*\\}\\}/g, (whole, key: string) => values[key] ?? whole)\n}\n\n/** Sample data for the preview. From no real order — the screen says so. */\nexport const EMAIL_PREVIEW_SAMPLE: Record<string, string> = {\n store_name: 'Sua Loja',\n customer_name: 'Maria Silva',\n order_number: '1042',\n order_total: 'R$ 189,90',\n order_items: '1 × Camiseta Clássica — R$ 89,90\\n2 × Caneca Esmaltada — R$ 100,00',\n tracking_code: 'BR123456789BR',\n cart_url: 'https://sualoja.com.br/carrinho',\n}\n\nexport interface ResolvedEmailTemplate extends EmailEventDef {\n /** The merchant's override, when there is one. */\n override: EmailTemplate | null\n enabled: boolean\n /** Text in force: the merchant's if any, else the default. */\n subject: string\n body: string\n /** true when the merchant rewrote the text — the list flags it. */\n customized: boolean\n}\n\n/**\n * Joins the code catalog with the database overrides. A function and not a\n * query: the merge must give the same answer in the list, the editor and the\n * send, and three places doing the same `??` is how they start to disagree.\n */\nexport function resolveEmailTemplates(overrides: EmailTemplate[]): ResolvedEmailTemplate[] {\n const byEvent = new Map(overrides.map((o) => [o.event, o]))\n return SHOP_EMAIL_EVENTS.map((def) => {\n const override = byEvent.get(def.event) ?? null\n return {\n ...def,\n override,\n enabled: override?.enabled ?? def.defaultEnabled,\n subject: override?.subject ?? def.defaultSubject,\n body: override?.body ?? def.defaultBody,\n customized: Boolean(override?.subject || override?.body),\n }\n })\n}\n","import type { PluginEventDefinition, MessageDefaultsDef, EventField } from '@fayz-ai/core'\nimport { SHOP_EMAIL_EVENTS } from './emails'\n\n// ---------------------------------------------------------------------------\n// The FACTS the store emits and, separately, the text we suggest for each.\n//\n// buildShopDomainEvents() the fact's contract: what happened, what data\n// comes with it, whether it is audited. Webhooks\n// and the audit trail read this.\n// buildShopMessageDefaults() a REACTION to the fact: which channel, which\n// text. Only automations read it.\n//\n// Merging the two would mean whoever writes a Google Calendar integration has to\n// import email vocabulary to find out what fields \"order paid\" carries — and an\n// event with no text could not exist.\n// ---------------------------------------------------------------------------\n\n/** The fields every order event carries. */\nconst ORDER_FIELDS: EventField[] = [\n { name: 'order_number', label: 'Número do pedido', type: 'string', example: '1042' },\n { name: 'order_total', label: 'Total', type: 'money', example: 'R$ 189,90' },\n { name: 'order_items', label: 'Itens', type: 'string', example: '1 × Camiseta Clássica — R$ 89,90\\n2 × Caneca Esmaltada — R$ 100,00' },\n { name: 'customer_name', label: 'Cliente', type: 'string', example: 'Maria Silva' },\n { name: 'store_name', label: 'Loja', type: 'string', example: 'Sua Loja' },\n]\n\nconst TRACKING_FIELD: EventField = {\n name: 'tracking_code', label: 'Código de rastreio', type: 'string', example: 'BR123456789BR',\n}\nconst CART_FIELD: EventField = {\n name: 'cart_url', label: 'Link do carrinho', type: 'url', example: 'https://sualoja.com.br/carrinho',\n}\n\n/** Fields per event — what the emitter actually sends in each. */\nconst FIELDS_BY_EVENT: Record<string, EventField[]> = {\n order_shipped: [...ORDER_FIELDS, TRACKING_FIELD],\n order_delivered: [...ORDER_FIELDS, TRACKING_FIELD],\n abandoned_cart: [...ORDER_FIELDS, CART_FIELD],\n}\n\n/**\n * Facts that are NOT audited: nobody performed them. \"Abandoned cart\" is the\n * absence of an act, and a trail full of non-acts is a trail nobody reads.\n */\nconst NOT_AUDITED = new Set(['abandoned_cart'])\n\nexport function buildShopDomainEvents(): PluginEventDefinition[] {\n return SHOP_EMAIL_EVENTS.map((def) => ({\n name: `shop.${def.event}`,\n title: def.title,\n description: def.description,\n trigger: def.trigger,\n icon: def.icon,\n fields: FIELDS_BY_EVENT[def.event] ?? ORDER_FIELDS,\n audit: !NOT_AUDITED.has(def.event),\n }))\n}\n\n/** Events whose WhatsApp notification is routine in a Brazilian store. */\nconst WHATSAPP_EVENTS = new Set(['order_confirmation', 'order_shipped', 'abandoned_cart'])\n\n/** WhatsApp text is short and subject-less — not the email body, truncated. */\nconst WHATSAPP_BODY: Record<string, string> = {\n order_confirmation:\n 'Oi {{customer_name}}! Recebemos seu pedido #{{order_number}} ✅\\n\\nTotal: {{order_total}}\\n\\nQualquer dúvida é só chamar aqui. — {{store_name}}',\n order_shipped:\n 'Oi {{customer_name}}! Seu pedido #{{order_number}} saiu para entrega 🚚\\n\\nRastreio: {{tracking_code}}\\n\\n— {{store_name}}',\n abandoned_cart:\n 'Oi {{customer_name}}! Vi que ficaram itens no seu carrinho 🛒\\n\\nQuer que eu segure para você?\\n{{cart_url}}\\n\\n— {{store_name}}',\n}\n\nexport function buildShopMessageDefaults(): MessageDefaultsDef[] {\n return SHOP_EMAIL_EVENTS.map((def) => {\n const whatsapp = WHATSAPP_EVENTS.has(def.event) ? WHATSAPP_BODY[def.event] : undefined\n return {\n eventKey: `shop.${def.event}`,\n kind: def.kind,\n channels: whatsapp ? (['email', 'whatsapp'] as const).slice() : ['email' as const],\n defaults: {\n email: { subject: def.defaultSubject, body: def.defaultBody },\n ...(whatsapp ? { whatsapp: { body: whatsapp } } : {}),\n },\n // Only email inherits \"on by default\". WhatsApp bills per message and\n // needs an approved number — switching itself on would spend someone's\n // money unasked.\n defaultEnabled: { email: def.defaultEnabled },\n }\n })\n}\n"]}
|
|
1
|
+
{"version":3,"sources":["../src/lib/commerce.ts","../src/data/functions.ts","../src/data/checkout-gateways.ts","../src/data/customer-search.ts","../src/data/supabase-provider.ts","../src/shipping/label-provider.ts","../src/lib/document.ts","../src/lib/emails.ts","../src/lib/message-events.ts"],"names":["payload","error"],"mappings":"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","file":"index.js","sourcesContent":["import { getShopProvider } from './runtime'\nimport type { ShopProvider } from '../data/provider'\nimport type {\n CartTotals, DiscountValidation, InventoryCheck, InventoryIssue, InventoryLine, Order,\n} from '../types'\n\n// ---------------------------------------------------------------------------\n// Commerce primitive APIs (FAY-1193)\n//\n// Provider-agnostic helpers that custom app workflows call instead of re-deriving\n// discount/inventory/total logic. They take an explicit ShopProvider (default:\n// the configured runtime provider) so they work the same against mock or Supabase.\n//\n// NOTE: when run in the browser these compute the *advisory* answer (UI preview).\n// The authoritative values are recomputed server-side in the shop_place_order RPC\n// — the browser can never set what it pays.\n// ---------------------------------------------------------------------------\n\nfunction round2(n: number): number {\n return Math.round(n * 100) / 100\n}\n\n/** Validate a discount code against the provider: existence, status, date window, usage limit, supported type. */\nexport async function validateDiscount(\n input: { code: string; subtotal?: number; customerId?: string },\n provider: ShopProvider = getShopProvider(),\n): Promise<DiscountValidation> {\n const code = input.code.trim()\n if (!code) return { valid: false, code: null, type: null, value: 0, reason: 'empty' }\n\n // A porta certa primeiro: valida UM código no servidor. A listagem abaixo\n // continua para provider que não a tem (mock, broker), mas ela não serve à\n // vitrine — `anon` não pode ler a tabela, e se pudesse levaria todos os\n // cupons da loja para o navegador.\n if (typeof provider.validateDiscountCode === 'function') {\n return await provider.validateDiscountCode(code, input.subtotal)\n }\n\n const list = await provider.listDiscounts({ status: 'active' })\n const discount = list.find((d) => (d.code ?? '').toUpperCase() === code.toUpperCase())\n if (!discount) return { valid: false, code: null, type: null, value: 0, reason: 'not_found' }\n\n const now = new Date().toISOString()\n if (discount.startsAt > now) return { valid: false, code: discount.code, type: discount.type, value: 0, reason: 'not_started' }\n if (discount.endsAt && discount.endsAt < now) return { valid: false, code: discount.code, type: discount.type, value: 0, reason: 'expired' }\n if (discount.usageLimit != null && discount.timesUsed >= discount.usageLimit) {\n return { valid: false, code: discount.code, type: discount.type, value: 0, reason: 'usage_limit' }\n }\n if (discount.type !== 'percentage' && discount.type !== 'fixed_amount') {\n return { valid: false, code: discount.code, type: discount.type, value: 0, reason: 'unsupported' }\n }\n return { valid: true, code: discount.code, type: discount.type, value: discount.value }\n}\n\n/** Apply a validated discount to a subtotal, clamped to [0, subtotal]. Pure. */\nexport function applyDiscount(validation: DiscountValidation, subtotal: number): { discountTotal: number; code: string | null } {\n if (!validation.valid) return { discountTotal: 0, code: null }\n if (validation.type === 'percentage') {\n return { discountTotal: round2(Math.min(subtotal, (subtotal * validation.value) / 100)), code: validation.code }\n }\n if (validation.type === 'fixed_amount') {\n return { discountTotal: round2(Math.min(subtotal, validation.value)), code: validation.code }\n }\n return { discountTotal: 0, code: validation.code }\n}\n\n/** Report out-of-stock / unavailable lines against current catalog inventory. No mutation. */\nexport async function checkInventory(\n lines: InventoryLine[],\n provider: ShopProvider = getShopProvider(),\n): Promise<InventoryCheck> {\n const issues: InventoryIssue[] = []\n for (const line of lines) {\n const product = await provider.getProduct(line.productId)\n if (!product || product.status !== 'active') {\n issues.push({ productId: line.productId, name: product?.name ?? line.productId, requested: line.quantity, available: 0 })\n continue\n }\n if (product.inventoryCount < line.quantity) {\n issues.push({ productId: line.productId, name: product.name, requested: line.quantity, available: product.inventoryCount })\n }\n }\n return { ok: issues.length === 0, issues }\n}\n\n/**\n * Recompute cart totals from authoritative catalog prices (ignores any client\n * unitPrice), applying a validated discount and shipping. Tax is 0 in v1 (hook).\n */\nexport async function computeCartTotals(\n input: { lines: InventoryLine[]; discountCode?: string; customerId?: string; shipping?: number },\n provider: ShopProvider = getShopProvider(),\n): Promise<CartTotals> {\n const lines: CartTotals['lines'] = []\n let subtotal = 0\n for (const line of input.lines) {\n const product = await provider.getProduct(line.productId)\n if (!product) continue\n const lineTotal = round2(product.price * line.quantity)\n subtotal += lineTotal\n lines.push({ productId: product.id, name: product.name, sku: product.sku, unitPrice: product.price, quantity: line.quantity, lineTotal })\n }\n subtotal = round2(subtotal)\n\n let discountTotal = 0\n let discountCode: string | null = null\n if (input.discountCode) {\n const applied = applyDiscount(\n await validateDiscount({ code: input.discountCode, subtotal, customerId: input.customerId }, provider),\n subtotal,\n )\n discountTotal = applied.discountTotal\n discountCode = applied.code\n }\n\n const shippingTotal = round2(Math.max(input.shipping ?? 0, 0))\n const taxTotal = 0\n const total = round2(Math.max(subtotal - discountTotal + shippingTotal + taxTotal, 0))\n return { lines, subtotal, discountTotal, discountCode, taxTotal, shippingTotal, total }\n}\n\n/** A customer's orders (scoped by id; RLS-enforced to the owner on Supabase). */\nexport async function getCustomerOrders(\n customerId: string,\n provider: ShopProvider = getShopProvider(),\n): Promise<Order[]> {\n return provider.listOrders({ customerId, limit: 100 })\n}\n","// Calling the store's edge functions from the BACK OFFICE.\n//\n// The storefront talks to them through the REST client, which carries its own\n// `functionsUrl`. The console talks through the Supabase client, whose URL is\n// derived from the project — enough in production, not enough in development,\n// where the acquirer's key may live in a local vault and a local bench answers\n// instead of the cloud. Hence the optional override, set by the app the same\n// way `setShopTenantResolver` is: the SDK reads nobody's env.\n\nlet _functionsUrl: string | null = null\n\nexport function setShopFunctionsUrl(url: string | null): void {\n _functionsUrl = url ? url.replace(/\\/+$/u, '') : null\n}\n\nexport function getShopFunctionsUrl(): string | null {\n return _functionsUrl\n}\n\n/** Answers `ok` apart from the body: a refusal carries a message worth showing. */\nexport async function callShopFunction(\n db: any,\n slug: string,\n body: Record<string, unknown>,\n): Promise<{ ok: boolean; status: number; payload: any }> {\n const override = getShopFunctionsUrl()\n if (override) {\n // The session token rides along, exactly as functions.invoke would attach\n // it. A function that guards on membership (labels spend money) refuses\n // every call without it, and the bench would look broken when it is not.\n let token: string | null = null\n try {\n token = (await db?.auth?.getSession?.())?.data?.session?.access_token ?? null\n } catch {\n /* signed out, or a client without auth: the function decides */\n }\n const response = await fetch(`${override}/${slug}`, {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n ...(token ? { Authorization: `Bearer ${token}` } : {}),\n },\n body: JSON.stringify(body),\n })\n const payload = await response.json().catch(() => null)\n return { ok: response.ok, status: response.status, payload }\n }\n\n const { data, error } = await db.functions.invoke(slug, { body })\n if (!error) return { ok: true, status: 200, payload: data }\n\n // supabase-js hides the function's own body inside the error context. Without\n // digging it out, a refusal written for the merchant reads as \"Edge Function\n // returned a non-2xx status code\".\n const status = Number((error as any)?.context?.status ?? 502)\n let payload: any = null\n try {\n payload = await (error as any)?.context?.json?.()\n } catch {\n /* non-JSON body: the status stands */\n }\n return { ok: false, status, payload: payload ?? { error: error.message } }\n}\n","// Which edge function charges for which acquirer.\n//\n// This table is what replaces the sentence that used to sit in CheckoutPage:\n// *\"a função tem UM provedor gravado dentro dela: pedir a ela uma cobrança de\n// outro adquirente não dá cobrança errada, dá erro na cara do comprador.\"* That\n// is still true of each function — they disagree about their body, their host,\n// their credential and their status vocabulary, so they are separate functions —\n// and a store with two acquirers on the shelf needs something that knows which\n// door to knock on.\n//\n// It is a MAP and not a switch, and it lives here rather than in the storefront,\n// because three places were about to hold the same list: the page that decides\n// whether the buyer sees a QR code at all, and the two provider methods that\n// call the functions. A gateway present in one and missing from another is a\n// checkout that offers to charge and then cannot.\n//\n// A provider absent from this table is not broken — it is an acquirer the\n// merchant selected for their own records, whose money arrives some other way.\n// The buyer is then routed to the no-charge path and the order stays `pending`\n// until the merchant confirms, which is exactly what happened before any gateway\n// existed.\n\n/** The pair of functions one acquirer needs: one to open a charge, one to settle it. */\nexport interface CheckoutGateway {\n /** Reprices the cart, freezes a session and opens the charge. Creates no order. */\n open: string\n /** Asks the acquirer whether the money landed, and writes the order if it did. */\n settle: string\n}\n\n/**\n * Every acquirer this repo can actually charge with, by the slug stored in\n * `plg_shop_settings.payment_provider` — which is the `ConnectorDefinition.id`,\n * not the catalogue slug.\n *\n * AppMax is deliberately absent. Its pair (`shop-checkout-pay` /\n * `shop-payment-status`) belongs to the older shape where the order was written\n * BEFORE the charge, so it does not answer this contract; it is reached by its\n * own path and is not a session gateway.\n *\n * Stripe Connect is absent for the plain reason: it has no data plane yet.\n * Listing it here would offer a QR code no function can open.\n */\nconst GATEWAYS: Readonly<Record<string, CheckoutGateway>> = Object.freeze({\n abacatepay: Object.freeze({ open: 'shop-checkout-open', settle: 'shop-checkout-settle' }),\n vindi: Object.freeze({ open: 'vindi-checkout-open', settle: 'vindi-checkout-settle' }),\n})\n\n/**\n * The acquirers a storefront may offer an online charge for.\n *\n * Derived from the table rather than written beside it: a gateway added to one\n * and forgotten in the other is the failure this module exists to make\n * impossible.\n */\nexport const CHARGEABLE_PROVIDERS: readonly string[] = Object.freeze(Object.keys(GATEWAYS))\n\n/** Whether this acquirer can take money online here. */\nexport function isChargeableProvider(provider: string | null | undefined): boolean {\n return checkoutGateway(provider) !== null\n}\n\n/**\n * The pair for an acquirer, or null.\n *\n * Null for an unknown provider AND for an absent one, because they mean the same\n * thing to every caller: there is no online charge, take the other path. An\n * empty string is the merchant's explicit *\"eu confirmo à mão\"* and lands here\n * too — see `resolvePaymentProvider`, which treats it as a decision rather than\n * an absence.\n */\nexport function checkoutGateway(provider: string | null | undefined): CheckoutGateway | null {\n const slug = String(provider ?? '').trim()\n if (!slug) return null\n return GATEWAYS[slug] ?? null\n}\n","// ---------------------------------------------------------------------------\n// Finding a customer by what the merchant actually types.\n//\n// The console searched with ONE `or()` over the whole string, so \"maria silva\"\n// was matched against first_name, last_name and email as a single value and\n// found nobody — the customer was there, spelled exactly like that, split over\n// two columns. Every word now has to match SOMETHING, and the words are ANDed:\n// \"maria silva\" needs maria in one column and silva in another.\n// ---------------------------------------------------------------------------\n\nconst COLUMNS = ['first_name', 'last_name', 'email', 'phone'] as const\n\n/** One PostgREST `or()` expression per word. Chained, they AND together. */\nexport function customerSearchFilters(term: string | undefined | null): string[] {\n return String(term ?? '')\n .trim()\n .split(/\\s+/u)\n // PostgREST reads these as syntax, and a stray comma would split the filter\n // into two conditions the caller never wrote.\n .map((word) => word.replace(/[%,()]/gu, ''))\n .filter(Boolean)\n .map((word) => COLUMNS.map((column) => `${column}.ilike.%${word}%`).join(','))\n}\n","import { getSupabaseClientOptional } from '@fayz-ai/core'\nimport { resolveEntityStore } from '../entities/entity-store'\nimport type { EntityRecord, EntityRecordInput, ListEntityRecordsOptions } from '../entities/entity-store'\nimport { createSupabaseEntityStore } from '../entities/supabase-entity-store'\nimport type { ShopProvider } from './provider'\nimport type { ComputeAction, RuleCartSnapshot } from '../rules/rule-types'\nimport { getShopTenantId } from './tenant'\nimport { callShopFunction } from './functions'\nimport { checkoutGateway } from './checkout-gateways'\nimport { customerSearchFilters } from './customer-search'\nimport { T } from './tables'\nimport { displayNameOf, mediaKindOf, mergeMediaFiles, productImageToMediaFile, storagePathOf } from './media'\nimport { resolveStockStore } from '../inventory/stock-store'\nimport { createSupabaseStockStore, rowToStockLocation } from '../inventory/supabase-stock-store'\nimport type {\n StockLocation, CreateStockLocationInput, UpdateStockLocationInput,\n} from '../inventory/stock-types'\nimport { OPENING_BALANCE_REASON } from '../inventory/vocabulary'\nimport { normalizeVariantAxes, validateVariantAxes, variantOptionsKey } from '../lib/variant-matrix'\nimport type {\n Product, ProductImage, ProductOption, ProductOptionInput, ProductVariant, ProductVariantSet,\n CreateProductVariantInput, UpdateProductVariantInput, Category,\n Order, ShopCustomer, Discount,\n CreateProductInput, UpdateProductInput, ListProductsOptions,\n CreateCategoryInput, UpdateCategoryInput,\n CreateOrderInput, UpdateOrderInput, ListOrdersOptions, PlaceOrderInput,\n CreateCustomerInput, UpdateCustomerInput, ListCustomersOptions, ResolveCustomerInput,\n CreateDiscountInput, UpdateDiscountInput, ListDiscountsOptions, OrderItem,\n CheckoutSessionInput, CheckoutSession, CheckoutSettlement, ShippingQuoteOption, CustomerAddress, ShippingAgency,\n SalesChannel, CreateSalesChannelInput, UpdateSalesChannelInput,\n ShippingZone, CreateShippingZoneInput, UpdateShippingZoneInput,\n ShippingProfile, CreateShippingProfileInput, UpdateShippingProfileInput,\n ShippingPackage, ShippingPackageKind, CreateShippingPackageInput, UpdateShippingPackageInput,\n ShippingSettings, UpdateShippingSettingsInput,\n StoreSettings, UpdateStoreSettingsInput, PaymentMethodKind, CheckoutFieldKey, CheckoutFieldPolicy,\n DeliveryCheck,\n Collection, CreateCollectionInput, UpdateCollectionInput, CustomerGroup, CreateCustomerGroupInput, UpdateCustomerGroupInput, CustomerSegment, CreateCustomerSegmentInput, UpdateCustomerSegmentInput, GiftCard, CreateGiftCardInput, UpdateGiftCardInput, EmailTemplate, UpsertEmailTemplateInput, MediaFile,\n} from '../types'\n\nfunction getDb(): any {\n const supabase = getSupabaseClientOptional()\n if (!supabase) throw new Error('@fayz-ai/shop: Supabase client not initialized. Call setGlobalSupabaseClient() first.')\n return supabase\n}\n\nconst getTenantId = getShopTenantId\n\nfunction slugify(name: string): string {\n return name.toLowerCase().replace(/[^a-z0-9]+/g, '-').replace(/^-|-$/g, '')\n}\n\nfunction asUuid(value: string | null | undefined): string | null {\n if (!value) return null\n return /^[0-9a-f]{8}-[0-9a-f]{4}-[1-5][0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}$/i.test(value)\n ? value\n : null\n}\n\n/** 8 bare digits, zero-padded — the shape shipping_zones stores and compares. */\nfunction toPostalDigits(value: string | undefined | null): string | undefined {\n const digits = String(value ?? '').replace(/\\D/g, '')\n return digits ? digits.padStart(8, '0').slice(0, 8) : undefined\n}\n\nfunction rowToVariant(row: any): ProductVariant {\n return {\n id: row.id,\n productId: row.product_id,\n options: row.options && typeof row.options === 'object' ? row.options : {},\n sku: row.sku ?? null,\n // numeric(12,2) arrives as a string on the wire; Number() once, here.\n price: row.price == null ? null : Number(row.price),\n compareAtPrice: row.compare_at_price == null ? null : Number(row.compare_at_price),\n inventoryCount: row.inventory_count ?? 0,\n position: row.position ?? 0,\n status: row.status ?? 'active',\n imageId: row.image_id ?? null,\n isDefaultVariant: row.is_default_variant ?? false,\n // Null inherits the product's, the way `price` has since 0028.\n weight: numOrNull(row.weight),\n weightUnit: row.weight_unit ?? null,\n heightCm: numOrNull(row.height_cm),\n widthCm: numOrNull(row.width_cm),\n lengthCm: numOrNull(row.length_cm),\n }\n}\n\n/**\n * The writable variant columns, and only the ones actually present in the input\n * — `undefined` must mean \"leave it\" while `null` means \"clear it\", because on\n * this table null is the load-bearing value: it is what \"inherit the product's\"\n * is spelled as, for price since 0028 and for the dimensions since 0046.\n */\nfunction variantPatch(input: UpdateProductVariantInput): Record<string, unknown> {\n const patch: Record<string, unknown> = {}\n const map: Record<string, string> = {\n sku: 'sku', price: 'price', compareAtPrice: 'compare_at_price', position: 'position',\n status: 'status', imageId: 'image_id', weight: 'weight', weightUnit: 'weight_unit',\n heightCm: 'height_cm', widthCm: 'width_cm', lengthCm: 'length_cm',\n }\n for (const [key, column] of Object.entries(map)) {\n const value = (input as Record<string, unknown>)[key]\n if (value === undefined) continue\n // A blank SKU is NO sku. 0028's unique index is partial on `sku IS NOT NULL`,\n // so two variants left empty in the grid would collide on '' instead.\n patch[column] = key === 'sku' && typeof value === 'string' && value.trim() === '' ? null : value\n }\n return patch\n}\n\n/**\n * plg_shop_settings → StoreSettings, and the reason this is not a `{...row}`\n * spread: EVERY absent column has to come back as `undefined`, not as `false` or\n * `[]`. `undefined` is how the whole stack says \"the merchant has not decided\",\n * which is what keeps eight live storefronts on their existing behaviour. A\n * mapper that coalesced to false would silently turn every unset toggle into a\n * decision to turn it off.\n *\n * The RPC (shop_store_settings) returns a SUBSET of these columns, so the same\n * mapper serves both reads: a key the RPC does not select is simply undefined.\n */\nfunction rowToStoreSettings(row: any): StoreSettings {\n const bool = (v: unknown): boolean | undefined => (v == null ? undefined : Boolean(v))\n const methods = Array.isArray(row.payment_methods) && row.payment_methods.length > 0\n ? (row.payment_methods as PaymentMethodKind[])\n : undefined\n const fields = row.checkout_fields && typeof row.checkout_fields === 'object' && Object.keys(row.checkout_fields).length > 0\n ? (row.checkout_fields as Partial<Record<CheckoutFieldKey, CheckoutFieldPolicy>>)\n : undefined\n return {\n currency: row.currency ?? undefined,\n locale: row.locale ?? undefined,\n showOutOfStock: bool(row.show_out_of_stock),\n requireSku: bool(row.require_sku),\n stockOwnership: row.stock_ownership ?? undefined,\n paymentMethods: methods,\n paymentProvider: row.payment_provider ?? undefined,\n guestCheckout: bool(row.guest_checkout),\n requireConfirmedEmail: bool(row.require_confirmed_email),\n marketingOptIn: bool(row.marketing_opt_in),\n discountsEnabled: bool(row.discounts_enabled),\n checkoutFields: fields,\n autoFulfill: row.auto_fulfill ?? undefined,\n notifyNewOrder: bool(row.notify_new_order),\n notifyLowStock: bool(row.notify_low_stock),\n handlingNote: row.handling_note ?? undefined,\n carrierQuotes: bool(row.carrier_quotes),\n }\n}\n\n/**\n * The write side of the same asymmetry: only keys the caller actually passed are\n * sent. A screen that renders one section must be able to save that section\n * without restating — and thereby overwriting — every other one.\n */\nfunction storeSettingsPayload(input: UpdateStoreSettingsInput): Record<string, unknown> {\n const payload: Record<string, unknown> = {}\n if (input.currency !== undefined) payload.currency = input.currency\n if (input.locale !== undefined) payload.locale = input.locale\n if (input.showOutOfStock !== undefined) payload.show_out_of_stock = input.showOutOfStock\n if (input.requireSku !== undefined) payload.require_sku = input.requireSku\n if (input.stockOwnership !== undefined) payload.stock_ownership = input.stockOwnership\n if (input.paymentMethods !== undefined) payload.payment_methods = input.paymentMethods\n // '' is STORED, not turned into NULL: it is the merchant answering \"nenhum,\n // confirmo à mão\", and NULL is never having answered. Collapsing the two made\n // the payments screen re-adopt the connected gateway on the next load, so the\n // choice could not be made at all.\n if (input.paymentProvider !== undefined) payload.payment_provider = input.paymentProvider ?? null\n if (input.guestCheckout !== undefined) payload.guest_checkout = input.guestCheckout\n if (input.requireConfirmedEmail !== undefined) payload.require_confirmed_email = input.requireConfirmedEmail\n if (input.marketingOptIn !== undefined) payload.marketing_opt_in = input.marketingOptIn\n if (input.discountsEnabled !== undefined) payload.discounts_enabled = input.discountsEnabled\n if (input.checkoutFields !== undefined) payload.checkout_fields = input.checkoutFields ?? {}\n if (input.autoFulfill !== undefined) payload.auto_fulfill = input.autoFulfill\n if (input.notifyNewOrder !== undefined) payload.notify_new_order = input.notifyNewOrder\n if (input.notifyLowStock !== undefined) payload.notify_low_stock = input.notifyLowStock\n if (input.handlingNote !== undefined) payload.handling_note = input.handlingNote || null\n if (input.carrierQuotes !== undefined) payload.carrier_quotes = input.carrierQuotes\n return payload\n}\n\nfunction rowToShippingZone(row: any): ShippingZone {\n return {\n id: row.id,\n tenantId: row.tenant_id,\n name: row.name,\n carrier: row.carrier ?? null,\n postalFrom: String(row.postal_from ?? '').trim(),\n postalTo: String(row.postal_to ?? '').trim(),\n rate: Number(row.rate ?? 0),\n freeAbove: row.free_above == null ? null : Number(row.free_above),\n etaMinDays: row.eta_min_days ?? null,\n etaMaxDays: row.eta_max_days ?? null,\n active: row.active ?? true,\n sortOrder: row.sort_order ?? 0,\n excluded: row.excluded ?? false,\n profileId: row.profile_id ?? null,\n }\n}\n\nfunction rowToShippingProfile(row: any): ShippingProfile {\n return {\n id: row.id,\n tenantId: row.tenant_id,\n name: row.name,\n // undefined, never false: NULL means \"inherit the store's decision\", and a\n // mapper that coalesced would turn every new profile into one that refuses\n // the gateway.\n carrierQuotes: row.carrier_quotes == null ? undefined : Boolean(row.carrier_quotes),\n isDefault: row.is_default ?? false,\n }\n}\n\nfunction shippingProfilePayload(input: Partial<CreateShippingProfileInput>): Record<string, unknown> {\n const payload: Record<string, unknown> = {}\n if (input.name !== undefined) payload.name = input.name\n if (input.carrierQuotes !== undefined) payload.carrier_quotes = input.carrierQuotes ?? null\n if (input.isDefault !== undefined) payload.is_default = input.isDefault\n return payload\n}\n\n/** 8 bare digits, or null for \"not told yet\". Refuses a half-typed postcode\n * instead of storing it — 0058's CHECK would refuse it anyway, in Postgrese. */\nfunction toOriginPostalCode(raw: string | null | undefined): string | null {\n const digits = String(raw ?? '').replace(/\\D/g, '')\n if (!digits) return null\n if (digits.length !== 8) throw new Error('O CEP do local precisa ter 8 dígitos.')\n return digits\n}\n\n/** A stable handle for imports and ERP connectors, derived from the name so the\n * merchant is never asked for one. */\nfunction toLocationCode(name: string): string {\n const slug = name.normalize('NFD').replace(/[\\u0300-\\u036f]/g, '')\n .toLowerCase().replace(/[^a-z0-9]+/g, '-').replace(/^-|-$/g, '').slice(0, 40)\n return slug || 'local'\n}\n\n/**\n * The two refusals a merchant can actually trigger, said in Portuguese. Both\n * come back as Postgres codes the settings screen would otherwise print raw.\n */\nfunction locationWriteError(error: { code?: string; message?: string }): Error {\n if (error?.code === '23505') return new Error('Já existe um local com esse nome.')\n if (error?.code === '23503') {\n return new Error(\n 'Este local já tem movimentações de estoque. Arquive-o em vez de excluir — o histórico aponta para ele.',\n )\n }\n return new Error(error?.message ?? 'Não foi possível salvar o local.')\n}\n\nfunction stockLocationPayload(input: Partial<CreateStockLocationInput>): Record<string, unknown> {\n const payload: Record<string, unknown> = {}\n if (input.name !== undefined) payload.name = input.name\n if (input.code !== undefined) payload.code = input.code\n if (input.kind !== undefined) payload.kind = input.kind\n if (input.isSellable !== undefined) payload.is_sellable = input.isSellable\n if (input.isDefault !== undefined) payload.is_default = input.isDefault\n if (input.status !== undefined) payload.status = input.status\n if (input.postalCode !== undefined) payload.postal_code = toOriginPostalCode(input.postalCode)\n if (input.city !== undefined) payload.city = input.city || null\n if (input.state !== undefined) payload.state = input.state || null\n if (input.street !== undefined) payload.street = input.street || null\n // What a carrier label needs on top of a postcode (0061).\n if (input.number !== undefined) payload.number = input.number || null\n if (input.district !== undefined) payload.district = input.district || null\n if (input.complement !== undefined) payload.complement = input.complement || null\n if (input.document !== undefined) payload.document = String(input.document ?? '').replace(/\\D/gu, '') || null\n if (input.phone !== undefined) payload.phone = String(input.phone ?? '').replace(/\\D/gu, '') || null\n if (input.email !== undefined) payload.email = input.email || null\n if (input.carrierAgencies !== undefined) payload.carrier_agencies = input.carrierAgencies ?? {}\n if (input.shipsOnline !== undefined) payload.ships_online = input.shipsOnline\n if (input.fulfillmentProvider !== undefined) {\n payload.fulfillment_provider = input.fulfillmentProvider || null\n }\n return payload\n}\n\nfunction shippingZonePayload(input: Partial<CreateShippingZoneInput>): Record<string, unknown> {\n const payload: Record<string, unknown> = {}\n if (input.name !== undefined) payload.name = input.name\n if (input.carrier !== undefined) payload.carrier = input.carrier || null\n if (input.postalFrom !== undefined) payload.postal_from = toPostalDigits(input.postalFrom)\n if (input.postalTo !== undefined) payload.postal_to = toPostalDigits(input.postalTo)\n if (input.rate !== undefined) payload.rate = input.rate\n if (input.freeAbove !== undefined) payload.free_above = input.freeAbove ?? null\n if (input.etaMinDays !== undefined) payload.eta_min_days = input.etaMinDays ?? null\n if (input.etaMaxDays !== undefined) payload.eta_max_days = input.etaMaxDays ?? null\n if (input.active !== undefined) payload.active = input.active\n if (input.sortOrder !== undefined) payload.sort_order = input.sortOrder\n if (input.excluded !== undefined) payload.excluded = input.excluded\n if (input.profileId !== undefined) payload.profile_id = input.profileId ?? null\n return payload\n}\n\nfunction rowToShippingPackage(row: any): ShippingPackage {\n return {\n id: row.id,\n tenantId: row.tenant_id,\n name: row.name,\n kind: (row.kind ?? 'box') as ShippingPackageKind,\n heightCm: Number(row.height_cm ?? 0),\n widthCm: Number(row.width_cm ?? 0),\n lengthCm: Number(row.length_cm ?? 0),\n emptyWeightGrams: Number(row.empty_weight_grams ?? 0),\n isDefault: row.is_default ?? false,\n active: row.active ?? true,\n }\n}\n\nfunction shippingPackagePayload(input: Partial<CreateShippingPackageInput>): Record<string, unknown> {\n const payload: Record<string, unknown> = {}\n if (input.name !== undefined) payload.name = input.name\n if (input.kind !== undefined) payload.kind = input.kind\n if (input.heightCm !== undefined) payload.height_cm = input.heightCm\n if (input.widthCm !== undefined) payload.width_cm = input.widthCm\n if (input.lengthCm !== undefined) payload.length_cm = input.lengthCm\n if (input.emptyWeightGrams !== undefined) payload.empty_weight_grams = input.emptyWeightGrams\n if (input.isDefault !== undefined) payload.is_default = input.isDefault\n if (input.active !== undefined) payload.active = input.active\n return payload\n}\n\nfunction rowToProduct(row: any): Product {\n return {\n id: row.id,\n tenantId: row.tenant_id,\n name: row.name,\n slug: row.slug ?? slugify(row.name),\n description: row.description,\n price: row.price ?? 0,\n compareAtPrice: row.compare_at_price,\n currency: row.currency ?? 'BRL',\n status: row.status ?? 'active',\n inventoryCount: row.inventory_count ?? 0,\n sku: row.sku,\n sortOrder: row.sort_order ?? 0,\n metadata: row.metadata ?? {},\n images: Array.isArray(row.images) ? row.images.map(rowToImage) : [],\n categoryId: row.category_id,\n categoryName: row.category_name ?? null,\n isPhysical: row.is_physical ?? true,\n weight: row.weight,\n weightUnit: row.weight_unit ?? 'kg',\n heightCm: numOrNull(row.height_cm),\n widthCm: numOrNull(row.width_cm),\n lengthCm: numOrNull(row.length_cm),\n packageId: row.package_id ?? null,\n handling: Array.isArray(row.handling) ? row.handling : [],\n shippingProfileId: row.shipping_profile_id ?? null,\n createdAt: row.created_at,\n updatedAt: row.updated_at,\n }\n}\n\n/** PostgREST hands `numeric` back as a string. Null survives as null: \"not\n * measured\" is what the packing code degrades on, and 0 would read as a\n * measurement of zero. */\nfunction numOrNull(value: unknown): number | null {\n if (value == null || value === '') return null\n const n = Number(value)\n return Number.isFinite(n) ? n : null\n}\n\nfunction rowToImage(row: any): ProductImage {\n return {\n id: row.id,\n productId: row.product_id,\n url: row.url,\n altText: row.alt_text,\n sortOrder: row.sort_order ?? 0,\n isPrimary: row.is_primary ?? false,\n createdAt: row.created_at,\n }\n}\n\nfunction rowToCategory(row: any): Category {\n return {\n id: row.id,\n tenantId: row.tenant_id,\n name: row.name,\n slug: row.slug ?? slugify(row.name),\n description: row.description,\n parentId: row.parent_id,\n sortOrder: row.sort_order ?? 0,\n createdAt: row.created_at,\n }\n}\n\n/**\n * Order items were being passed through raw, so every snake_case column arrived\n * undefined on the camelCase type: unit_price, image_url and product_id were all\n * lost. `total` survived only because the name matches in both, which is exactly\n * why the bug looked like \"price is zero\" instead of \"nothing is mapped\".\n */\nfunction rowToOrderItem(row: any): OrderItem {\n return {\n id: row.id,\n orderId: row.order_id,\n productId: row.product_id ?? null,\n name: row.name,\n sku: row.sku ?? null,\n quantity: row.quantity ?? 0,\n unitPrice: row.unit_price ?? 0,\n total: row.total ?? 0,\n imageUrl: row.image_url ?? null,\n }\n}\n\nfunction rowToOrder(row: any): Order {\n return {\n id: row.id,\n tenantId: row.tenant_id,\n orderNumber: row.order_number,\n status: row.status ?? 'open',\n financialStatus: row.financial_status ?? 'pending',\n fulfillmentStatus: row.fulfillment_status ?? 'unfulfilled',\n currency: row.currency ?? 'BRL',\n subtotal: row.subtotal ?? 0,\n taxTotal: row.tax_total ?? 0,\n discountTotal: row.discount_total ?? 0,\n shippingTotal: row.shipping_total ?? 0,\n total: row.total ?? 0,\n customerId: row.customer_id,\n customerName: row.customer_name,\n customerEmail: row.customer_email,\n discountCode: row.discount_code,\n notes: row.notes,\n shippingAddress: row.shipping_address ?? null,\n paymentMethodKind: row.payment_method_kind ?? null,\n paidAt: row.paid_at ?? null,\n items: Array.isArray(row.items) ? row.items.map(rowToOrderItem) : [],\n createdAt: row.created_at,\n updatedAt: row.updated_at,\n }\n}\n\nfunction rowToCustomer(row: any): ShopCustomer {\n return {\n id: row.id,\n tenantId: row.tenant_id,\n firstName: row.first_name,\n lastName: row.last_name ?? '',\n email: row.email,\n phone: row.phone,\n document: row.document ?? null,\n notes: row.notes,\n ordersCount: row.orders_count ?? 0,\n totalSpent: row.total_spent ?? 0,\n createdAt: row.created_at,\n updatedAt: row.updated_at,\n }\n}\n\nfunction rowToDiscount(row: any): Discount {\n return {\n id: row.id,\n tenantId: row.tenant_id,\n title: row.title,\n code: row.code,\n type: row.type,\n method: row.method ?? 'code',\n value: row.value ?? 0,\n usageLimit: row.usage_limit,\n oncePerCustomer: row.once_per_customer ?? false,\n minSubtotal: row.min_subtotal ?? null,\n appliesTo: row.applies_to ?? 'all',\n productIds: row.product_ids ?? [],\n categoryIds: row.category_ids ?? [],\n startsAt: row.starts_at,\n endsAt: row.ends_at,\n status: row.status ?? 'active',\n timesUsed: row.times_used ?? 0,\n createdAt: row.created_at,\n updatedAt: row.updated_at,\n }\n}\n\nfunction rowToSalesChannel(row: any): SalesChannel {\n return {\n id: row.id,\n tenantId: row.tenant_id,\n kind: row.kind,\n label: row.label,\n url: row.url,\n enabled: row.enabled ?? true,\n position: row.position ?? 0,\n createdAt: row.created_at,\n updatedAt: row.updated_at,\n }\n}\n\nfunction segmentPayload(input: Partial<CreateCustomerSegmentInput>): Record<string, unknown> {\n const p: Record<string, unknown> = {}\n if (input.name !== undefined) p.name = input.name\n if (input.description !== undefined) p.description = input.description\n if (input.minOrders !== undefined) p.min_orders = nullableNumber(input.minOrders)\n if (input.maxOrders !== undefined) p.max_orders = nullableNumber(input.maxOrders)\n if (input.minSpent !== undefined) p.min_spent = nullableNumber(input.minSpent)\n if (input.maxSpent !== undefined) p.max_spent = nullableNumber(input.maxSpent)\n if (input.joinedAfter !== undefined) p.joined_after = input.joinedAfter || null\n if (input.joinedBefore !== undefined) p.joined_before = input.joinedBefore || null\n return p\n}\n\nconst GIFT_CODE_ALPHABET = 'ABCDEFGHJKLMNPQRTUVWXY2346789'\n\nfunction generateGiftCardCode(): string {\n const bytes = new Uint8Array(12)\n globalThis.crypto.getRandomValues(bytes)\n const chars = Array.from(bytes, (b) => GIFT_CODE_ALPHABET[b % GIFT_CODE_ALPHABET.length])\n return `${chars.slice(0, 4).join('')}-${chars.slice(4, 8).join('')}-${chars.slice(8, 12).join('')}`\n}\n\n// Kept exported from here: it was part of this module's surface before the media\n// helpers moved to ./media.\nexport { mediaKindOf }\n\n/** Where hand-uploaded assets live, as opposed to `products/{id}`. */\nconst LIBRARY_FOLDER = 'library'\n\n// ---------------------------------------------------------------------------\n// Mapeadores das entidades resgatadas da onda de 04-ago. Nenhum toca variante\n// nem o ledger de estoque — esses seguem os desta branch.\n// ---------------------------------------------------------------------------\n\nfunction nullableNumber(value: unknown): number | null {\n if (value === null || value === undefined || value === '') return null\n const n = Number(value)\n return Number.isFinite(n) ? n : null\n}\n\nfunction rowToCollection(row: any): Collection {\n // Members arrive as the embedded join rows; the editorial order lives on the\n // join, so sort by it here rather than trusting PostgREST's arrival order.\n const members = (row.members ?? []) as Array<{ product_id: string; position: number | null }>\n return {\n id: row.id,\n tenantId: row.tenant_id,\n title: row.title,\n handle: row.handle ?? slugify(row.title ?? ''),\n description: row.description ?? null,\n imageUrl: row.image_url ?? null,\n seoTitle: row.seo_title ?? null,\n seoDescription: row.seo_description ?? null,\n published: row.published ?? true,\n sortOrder: row.sort_order ?? 0,\n productIds: [...members]\n .sort((a, b) => (a.position ?? 0) - (b.position ?? 0))\n .map((m) => m.product_id),\n createdAt: row.created_at,\n updatedAt: row.updated_at ?? row.created_at,\n }\n}\n\nfunction rowToCustomerGroup(row: any): CustomerGroup {\n const members = (row.members ?? []) as Array<{ customer_id: string }>\n return {\n id: row.id,\n tenantId: row.tenant_id,\n name: row.name,\n description: row.description ?? null,\n color: row.color ?? null,\n customerIds: members.map((m) => m.customer_id),\n createdAt: row.created_at,\n updatedAt: row.updated_at ?? row.created_at,\n }\n}\n\nfunction rowToCustomerSegment(row: any): CustomerSegment {\n return {\n id: row.id,\n tenantId: row.tenant_id,\n name: row.name,\n description: row.description ?? null,\n minOrders: nullableNumber(row.min_orders),\n maxOrders: nullableNumber(row.max_orders),\n minSpent: nullableNumber(row.min_spent),\n maxSpent: nullableNumber(row.max_spent),\n joinedAfter: row.joined_after ?? null,\n joinedBefore: row.joined_before ?? null,\n createdAt: row.created_at,\n updatedAt: row.updated_at ?? row.created_at,\n }\n}\n\n// A plg_automations_templates row: `event_key` carries the owning module\n// ('shop.order_shipped') and the shop's own vocabulary is what follows the dot.\nconst SHOP_EVENT_PREFIX = 'shop.'\nconst EMAIL_CHANNEL = 'email'\n\nfunction rowToEmailTemplate(row: any): EmailTemplate {\n return {\n id: row.id,\n tenantId: row.tenant_id,\n event: String(row.event_key ?? '').slice(SHOP_EVENT_PREFIX.length) as EmailTemplate['event'],\n // NULL stays NULL: the catalog resolves the default (resolveEmailTemplates),\n // not this mapping. Collapsing to `false` here would silently disable every\n // template whose row exists only because its text was edited.\n enabled: row.enabled ?? null,\n // Empty string and NULL both mean \"no override\" — a subject the merchant\n // cleared should fall back to the default, not send a blank subject line.\n subject: row.subject || null,\n body: row.body || null,\n updatedAt: row.updated_at ?? row.created_at,\n }\n}\n\nfunction rowToGiftCard(row: any): GiftCard {\n return {\n id: row.id,\n tenantId: row.tenant_id,\n code: String(row.code ?? '').toUpperCase(),\n initialBalance: Number(row.initial_balance ?? 0),\n balance: Number(row.balance ?? 0),\n currency: row.currency ?? 'BRL',\n status: (row.status ?? 'active') as GiftCard['status'],\n expiresAt: row.expires_at ?? null,\n customerId: row.customer_id ?? null,\n customerEmail: row.customer_email ?? null,\n note: row.note ?? null,\n createdAt: row.created_at,\n updatedAt: row.updated_at ?? row.created_at,\n }\n}\n\nexport class SupabaseShopProvider implements ShopProvider {\n // ---------------------------------------------------------------------------\n // Products\n // ---------------------------------------------------------------------------\n\n async listProducts(options?: ListProductsOptions): Promise<Product[]> {\n const db = getDb()\n const tenantId = getTenantId()\n let q = db.from(T.products).select(`*, images:${T.productImages}(*)`)\n if (tenantId) q = q.eq('tenant_id', tenantId)\n if (options?.status) q = q.eq('status', options.status)\n if (options?.categoryId) q = q.eq('category_id', options.categoryId)\n if (options?.slug) q = q.eq('slug', options.slug)\n if (options?.search) q = q.ilike('name', `%${options.search}%`)\n q = q.order(options?.orderBy ?? 'sort_order', { ascending: options?.order !== 'desc' })\n if (options?.limit) q = q.limit(options.limit)\n if (options?.offset) q = q.range(options.offset, (options.offset ?? 0) + (options.limit ?? 50) - 1)\n const { data, error } = await q\n if (error) throw error\n return (data ?? []).map(rowToProduct)\n }\n\n async getProduct(id: string): Promise<Product | null> {\n const db = getDb()\n const { data, error } = await db\n .from(T.products)\n .select(`*, images:${T.productImages}(*)`)\n .eq('id', id)\n .maybeSingle()\n if (error) throw error\n return data ? rowToProduct(data) : null\n }\n\n /** Option axes + variants from the 0028 tables (spine M5). The storefront\n * RLS on both tables already restricts anon reads to active variants of\n * publicly readable products; the status filter here keeps the admin path\n * (authenticated tenant member, who CAN see archived rows) consistent. */\n async getProductVariants(\n productId: string,\n opts?: { includeArchived?: boolean },\n ): Promise<ProductVariantSet> {\n const db = getDb()\n let variantQuery = db.from(T.productVariants).select('*').eq('product_id', productId)\n // The storefront must never see an archived variant (0028's public policy\n // says the same in SQL); the admin MUST, because reviving an archived row is\n // the only legal answer to re-adding a removed option value.\n if (!opts?.includeArchived) variantQuery = variantQuery.eq('status', 'active')\n const [optionsRes, variantsRes] = await Promise.all([\n db.from(T.productOptions).select('*').eq('product_id', productId).order('position', { ascending: true }),\n variantQuery.order('position', { ascending: true }),\n ])\n if (optionsRes.error) throw optionsRes.error\n if (variantsRes.error) throw variantsRes.error\n const options: ProductOption[] = (optionsRes.data ?? []).map((row: any) => ({\n id: row.id,\n name: row.name,\n values: Array.isArray(row.values) ? row.values.map(String) : [],\n position: row.position ?? 0,\n }))\n const variants: ProductVariant[] = (variantsRes.data ?? []).map(rowToVariant)\n return { options, variants }\n }\n\n // --- The variant admin ------------------------------------------------------\n\n async saveProductOptions(productId: string, input: ProductOptionInput[]): Promise<ProductOption[]> {\n const db = getDb()\n const tenantId = getTenantId()\n const clean = normalizeVariantAxes(input)\n const refusal = validateVariantAxes(clean)\n if (refusal) throw new Error(refusal)\n\n const { data: existing, error: readError } = await db\n .from(T.productOptions).select('*').eq('product_id', productId)\n if (readError) throw readError\n\n const byName = new Map<string, any>((existing ?? []).map((row: any) => [row.name, row]))\n const wanted = new Set(clean.map((axis) => axis.name))\n\n // Removed first: an axis renamed P→Q would otherwise collide with 0028's\n // UNIQUE (product_id, name) while the old row is still there.\n const stale = (existing ?? []).filter((row: any) => !wanted.has(row.name)).map((row: any) => row.id)\n if (stale.length > 0) {\n const { error } = await db.from(T.productOptions).delete().in('id', stale)\n if (error) throw error\n }\n\n for (const [position, axis] of clean.entries()) {\n const row = byName.get(axis.name)\n if (row) {\n const { error } = await db\n .from(T.productOptions).update({ values: axis.values, position }).eq('id', row.id)\n if (error) throw error\n } else {\n const { error } = await db.from(T.productOptions).insert({\n product_id: productId, tenant_id: tenantId, name: axis.name, values: axis.values, position,\n })\n if (error) throw error\n }\n }\n\n const { data, error } = await db\n .from(T.productOptions).select('*').eq('product_id', productId).order('position', { ascending: true })\n if (error) throw error\n return (data ?? []).map((row: any) => ({\n id: row.id,\n name: row.name,\n values: Array.isArray(row.values) ? row.values.map(String) : [],\n position: row.position ?? 0,\n }))\n }\n\n async createProductVariant(productId: string, input: CreateProductVariantInput): Promise<ProductVariant> {\n const db = getDb()\n const tenantId = getTenantId()\n if (Object.keys(input.options).length === 0) {\n throw new Error('Uma variante sem opções é a variante padrão (0037), criada pelo banco. Declare ao menos um eixo.')\n }\n\n // Revive before insert. 0028 declares UNIQUE (product_id, options) and this\n // screen archives rather than deletes, so \"add GG back\" meets the row it\n // archived an hour ago — and an INSERT would fail with a constraint error\n // the merchant cannot act on.\n const { data: existing, error: readError } = await db\n .from(T.productVariants).select('*').eq('product_id', productId)\n if (readError) throw readError\n const wantedKey = variantOptionsKey(input.options)\n const match = (existing ?? []).find((row: any) => variantOptionsKey(row.options ?? {}) === wantedKey)\n if (match) return this.updateProductVariant(match.id, { ...input, status: input.status ?? 'active' })\n\n const { data, error } = await db\n .from(T.productVariants)\n .insert({\n product_id: productId,\n tenant_id: tenantId,\n options: input.options,\n ...variantPatch(input),\n // NOT copied from the product: 0028 defines a null price as \"inherit the\n // product's\", and 0037's header spells out why a copy is a bug — the\n // storefront would show the new product price and the server charge the\n // frozen variant one.\n status: input.status ?? 'active',\n })\n .select('*')\n .single()\n if (error) throw error\n return rowToVariant(data)\n }\n\n async updateProductVariant(variantId: string, input: UpdateProductVariantInput): Promise<ProductVariant> {\n const db = getDb()\n const { data, error } = await db\n .from(T.productVariants).update(variantPatch(input)).eq('id', variantId).select('*').single()\n if (error) throw error\n return rowToVariant(data)\n }\n\n async archiveProductVariant(variantId: string): Promise<void> {\n const db = getDb()\n const { error } = await db.from(T.productVariants).update({ status: 'archived' }).eq('id', variantId)\n if (error) throw error\n }\n\n async setVariantStock(variantId: string, count: number, note?: string): Promise<number> {\n const target = Math.max(0, Math.trunc(count))\n // '' when no tenant is resolved: resolveStockStore only looks the key up in\n // the ERP-override map, and no override is ever registered under a blank id.\n const store = resolveStockStore(getTenantId() ?? '', () => createSupabaseStockStore())\n const current = await store.getAvailable(variantId)\n const delta = target - current\n if (delta === 0) return current\n\n // A variant that has never had a ledger position is not being CORRECTED, it\n // is being opened — the same taxonomy 0035 and 0037 stamp, so the movement\n // history reads honestly instead of showing every new SKU as an adjustment\n // against a balance that never existed.\n const priorMovements = await store.listMovements({ variantId, limit: 1 })\n const opening = priorMovements.length === 0 && delta > 0\n await store.recordMovement({\n variantId,\n kind: opening ? 'receipt' : 'adjustment',\n reasonCode: opening ? OPENING_BALANCE_REASON : 'correction',\n quantity: delta,\n note: note ?? 'Estoque definido na matriz de variantes.',\n })\n return target\n }\n\n async createProduct(input: CreateProductInput): Promise<Product> {\n const db = getDb()\n const tenantId = getTenantId()\n const { data, error } = await db\n .from(T.products)\n .insert({\n tenant_id: tenantId,\n name: input.name,\n slug: input.slug ?? slugify(input.name),\n description: input.description ?? null,\n price: input.price,\n compare_at_price: input.compareAtPrice ?? null,\n currency: input.currency ?? 'BRL',\n status: input.status ?? 'active',\n inventory_count: input.inventoryCount ?? 0,\n sku: input.sku ?? null,\n sort_order: input.sortOrder ?? 0,\n metadata: input.metadata ?? {},\n category_id: input.categoryId ?? null,\n is_physical: input.isPhysical ?? true,\n weight: input.weight ?? null,\n weight_unit: input.weightUnit ?? 'kg',\n height_cm: input.heightCm ?? null,\n width_cm: input.widthCm ?? null,\n length_cm: input.lengthCm ?? null,\n // Null = a padrão da loja (0047). É o estado normal, não um campo vazio.\n package_id: input.packageId ?? null,\n // NULL and not []: \"nothing declared\" and \"declared as needing nothing\"\n // are the same fact about a box, and one representation of it keeps the\n // `&&` overlap test in the 0048 trigger reading one way.\n handling: input.handling?.length ? input.handling : null,\n shipping_profile_id: input.shippingProfileId ?? null,\n })\n .select(`*, images:${T.productImages}(*)`)\n .single()\n if (error) throw error\n return rowToProduct(data)\n }\n\n async updateProduct(id: string, input: UpdateProductInput): Promise<Product> {\n const db = getDb()\n const updates: Record<string, unknown> = {}\n if (input.name !== undefined) { updates.name = input.name; updates.slug = input.slug ?? slugify(input.name) }\n if (input.slug !== undefined) updates.slug = input.slug\n if (input.description !== undefined) updates.description = input.description\n if (input.price !== undefined) updates.price = input.price\n if (input.compareAtPrice !== undefined) updates.compare_at_price = input.compareAtPrice\n if (input.currency !== undefined) updates.currency = input.currency\n if (input.status !== undefined) updates.status = input.status\n if (input.inventoryCount !== undefined) updates.inventory_count = input.inventoryCount\n if (input.sku !== undefined) updates.sku = input.sku\n if (input.categoryId !== undefined) updates.category_id = input.categoryId\n if (input.isPhysical !== undefined) updates.is_physical = input.isPhysical\n if (input.weight !== undefined) updates.weight = input.weight\n if (input.weightUnit !== undefined) updates.weight_unit = input.weightUnit\n if (input.heightCm !== undefined) updates.height_cm = input.heightCm\n if (input.widthCm !== undefined) updates.width_cm = input.widthCm\n if (input.lengthCm !== undefined) updates.length_cm = input.lengthCm\n if (input.packageId !== undefined) updates.package_id = input.packageId || null\n if (input.handling !== undefined) updates.handling = input.handling.length ? input.handling : null\n if (input.shippingProfileId !== undefined) updates.shipping_profile_id = input.shippingProfileId ?? null\n const { data, error } = await db\n .from(T.products).update(updates).eq('id', id)\n .select(`*, images:${T.productImages}(*)`)\n .single()\n if (error) throw error\n return rowToProduct(data)\n }\n\n async deleteProduct(id: string): Promise<void> {\n const { error } = await getDb().from(T.products).delete().eq('id', id)\n if (error) throw error\n }\n\n async uploadProductImage(productId: string, file: File): Promise<ProductImage> {\n const db = getDb()\n const tenantId = getTenantId()\n const path = `${tenantId}/products/${productId}/${Date.now()}-${file.name}`\n const { error: uploadErr } = await db.storage.from('shop-images').upload(path, file)\n if (uploadErr) throw uploadErr\n const { data: { publicUrl } } = db.storage.from('shop-images').getPublicUrl(path)\n\n // Every upload used to land as sort_order 0 / is_primary false, so a product\n // whose only photo was uploaded here had NO primary at all, and a second one\n // tied with the first for position. New photos now go to the end, and the\n // first photo a product ever gets becomes its primary.\n const { data: existing } = await db\n .from(T.productImages)\n .select('id,sort_order')\n .eq('product_id', productId)\n .order('sort_order', { ascending: false })\n .limit(1)\n const first = !existing || existing.length === 0\n const nextOrder = first ? 0 : (existing[0].sort_order ?? 0) + 1\n\n const { data, error } = await db\n .from(T.productImages)\n .insert({\n product_id: productId, tenant_id: tenantId, url: publicUrl,\n sort_order: nextOrder, is_primary: first,\n })\n .select().single()\n if (error) throw error\n return rowToImage(data)\n }\n\n async updateProductImage(\n imageId: string,\n input: { isPrimary?: boolean; sortOrder?: number; altText?: string | null },\n ): Promise<ProductImage> {\n const db = getDb()\n const updates: Record<string, unknown> = {}\n if (input.sortOrder !== undefined) updates.sort_order = input.sortOrder\n if (input.altText !== undefined) updates.alt_text = input.altText\n if (input.isPrimary !== undefined) updates.is_primary = input.isPrimary\n\n // Demote the incumbent first. Doing it after would leave a window with two\n // primaries, and if the second statement failed the product would keep two\n // for good.\n if (input.isPrimary) {\n const { data: target } = await db\n .from(T.productImages).select('product_id').eq('id', imageId).single()\n if (target?.product_id) {\n await db.from(T.productImages)\n .update({ is_primary: false })\n .eq('product_id', target.product_id)\n .neq('id', imageId)\n }\n }\n\n const { data, error } = await db\n .from(T.productImages).update(updates).eq('id', imageId).select().single()\n if (error) throw error\n return rowToImage(data)\n }\n\n async replaceProductImage(imageId: string, file: File): Promise<ProductImage> {\n const db = getDb()\n const tenantId = getTenantId()\n const { data: row, error: readErr } = await db\n .from(T.productImages).select('id,url,product_id').eq('id', imageId).single()\n if (readErr) throw readErr\n\n // New object, same row. Overwriting the old path would keep the URL — and\n // the CDN would keep serving the old photo from cache, which is exactly the\n // thing the merchant is here to fix.\n const path = `${tenantId}/products/${row.product_id}/${Date.now()}-${file.name}`\n const bucket = db.storage.from(T.mediaBucket)\n const { error: uploadErr } = await bucket.upload(path, file)\n if (uploadErr) throw uploadErr\n const { data: { publicUrl } } = bucket.getPublicUrl(path)\n\n const { data, error } = await db\n .from(T.productImages).update({ url: publicUrl }).eq('id', imageId).select().single()\n if (error) throw error\n\n // Only after the row points somewhere else: a failure above leaves the photo\n // intact, and dropping the old file first would leave it pointing at nothing.\n await this.removeUnreferencedObject(row.url)\n return rowToImage(data)\n }\n\n async deleteProductImage(imageId: string): Promise<void> {\n const db = getDb()\n const { data: row } = await db\n .from(T.productImages).select('url').eq('id', imageId).maybeSingle()\n const { error } = await db.from(T.productImages).delete().eq('id', imageId)\n if (error) throw error\n if (row?.url) await this.removeUnreferencedObject(row.url)\n }\n\n /**\n * Drop a stored file once nothing points at it anymore.\n *\n * The row was the only thing keeping the object reachable, so leaving it\n * behind is a file nobody can see and nobody can delete — and the bill for it\n * arrives all the same. Two rows can share one URL (a duplicated product), and\n * the survivor has to keep working, so the count decides.\n */\n private async removeUnreferencedObject(url: string | null | undefined): Promise<void> {\n const path = url ? storagePathOf(url) : null\n if (!path) return\n const db = getDb()\n const { count } = await db\n .from(T.productImages).select('id', { count: 'exact', head: true }).eq('url', url)\n if (count) return\n await db.storage.from(T.mediaBucket).remove([path])\n }\n\n // ---------------------------------------------------------------------------\n // Categories\n // ---------------------------------------------------------------------------\n\n async listCategories(): Promise<Category[]> {\n const db = getDb()\n const tenantId = getTenantId()\n let q = db.from(T.categories).select('*').order('sort_order', { ascending: true })\n if (tenantId) q = q.eq('tenant_id', tenantId)\n const { data, error } = await q\n if (error) throw error\n return (data ?? []).map(rowToCategory)\n }\n\n async createCategory(input: CreateCategoryInput): Promise<Category> {\n const db = getDb()\n const { data, error } = await db\n .from(T.categories)\n .insert({ tenant_id: getTenantId(), name: input.name, slug: input.slug ?? slugify(input.name), description: input.description ?? null, parent_id: input.parentId ?? null, sort_order: input.sortOrder ?? 0 })\n .select().single()\n if (error) throw error\n return rowToCategory(data)\n }\n\n async updateCategory(id: string, input: UpdateCategoryInput): Promise<Category> {\n const db = getDb()\n const updates: Record<string, unknown> = {}\n if (input.name !== undefined) updates.name = input.name\n if (input.slug !== undefined) updates.slug = input.slug\n if (input.description !== undefined) updates.description = input.description\n if (input.parentId !== undefined) updates.parent_id = input.parentId\n if (input.sortOrder !== undefined) updates.sort_order = input.sortOrder\n const { data, error } = await db.from(T.categories).update(updates).eq('id', id).select().single()\n if (error) throw error\n return rowToCategory(data)\n }\n\n async deleteCategory(id: string): Promise<void> {\n const { error } = await getDb().from(T.categories).delete().eq('id', id)\n if (error) throw error\n }\n\n // ---------------------------------------------------------------------------\n // Orders\n // ---------------------------------------------------------------------------\n\n async listOrders(options?: ListOrdersOptions): Promise<Order[]> {\n const db = getDb()\n const tenantId = getTenantId()\n let q = db.from(T.orders).select(`*, items:${T.orderItems}(*)`)\n if (tenantId) q = q.eq('tenant_id', tenantId)\n if (options?.status) q = q.eq('status', options.status)\n if (options?.financialStatus) q = q.eq('financial_status', options.financialStatus)\n if (options?.fulfillmentStatus) q = q.eq('fulfillment_status', options.fulfillmentStatus)\n if (options?.customerId) q = q.eq('customer_id', options.customerId)\n if (options?.customerEmail) q = q.eq('customer_email', options.customerEmail)\n if (options?.search) q = q.or(`customer_name.ilike.%${options.search}%,customer_email.ilike.%${options.search}%`)\n q = q.order('created_at', { ascending: false })\n if (options?.limit) q = q.limit(options.limit)\n const { data, error } = await q\n if (error) throw error\n return (data ?? []).map(rowToOrder)\n }\n\n async getOrder(id: string): Promise<Order | null> {\n const { data, error } = await getDb()\n .from(T.orders).select(`*, items:${T.orderItems}(*)`)\n .eq('id', id).maybeSingle()\n if (error) throw error\n return data ? rowToOrder(data) : null\n }\n\n async createOrder(input: CreateOrderInput): Promise<Order> {\n const db = getDb()\n const tenantId = getTenantId()\n const subtotal = input.items.reduce((s, i) => s + i.quantity * i.unitPrice, 0)\n const discountTotal = input.discountTotal ?? 0\n const shippingTotal = input.shippingTotal ?? 0\n const total = Math.round((subtotal - discountTotal + shippingTotal) * 100) / 100\n const { data: order, error: orderErr } = await db\n .from(T.orders)\n .insert({ tenant_id: tenantId, customer_id: input.customerId ?? null, customer_name: input.customerName ?? null, customer_email: input.customerEmail ?? null, currency: input.currency ?? 'BRL', notes: input.notes ?? null, subtotal, discount_total: discountTotal, shipping_total: shippingTotal, discount_code: input.discountCode ?? null, total, status: 'open', financial_status: 'pending', fulfillment_status: 'unfulfilled' })\n .select().single()\n if (orderErr) throw orderErr\n const items = input.items.map(i => ({ order_id: order.id, product_id: asUuid(i.productId), name: i.name, sku: i.sku ?? null, quantity: i.quantity, unit_price: i.unitPrice, total: i.quantity * i.unitPrice, image_url: i.imageUrl ?? null }))\n await db.from(T.orderItems).insert(items)\n return this.getOrder(order.id) as Promise<Order>\n }\n\n async updateOrder(id: string, input: UpdateOrderInput): Promise<Order> {\n const updates: Record<string, unknown> = {}\n if (input.status !== undefined) updates.status = input.status\n if (input.financialStatus !== undefined) updates.financial_status = input.financialStatus\n if (input.fulfillmentStatus !== undefined) updates.fulfillment_status = input.fulfillmentStatus\n if (input.notes !== undefined) updates.notes = input.notes\n const { error } = await getDb().from(T.orders).update(updates).eq('id', id)\n if (error) throw error\n return this.getOrder(id) as Promise<Order>\n }\n\n // -------------------------------------------------------------------------\n // Delivery zones\n //\n // Postal codes are stored as 8 bare digits so the range test in\n // shop_quote_shipping is a plain BETWEEN. Accepting '22.041-001' from the\n // form and normalising here means the merchant never has to think about it.\n // -------------------------------------------------------------------------\n async listShippingZones(): Promise<ShippingZone[]> {\n const tenantId = getTenantId()\n const { data, error } = await getDb()\n .from(T.shippingZones)\n .select('*')\n .eq('tenant_id', tenantId)\n .order('sort_order', { ascending: true })\n .order('postal_from', { ascending: true })\n if (error) throw error\n return (data ?? []).map(rowToShippingZone)\n }\n\n async createShippingZone(input: CreateShippingZoneInput): Promise<ShippingZone> {\n const tenantId = getTenantId()\n if (!tenantId) throw new Error('@fayz-ai/shop: createShippingZone requires a tenant id.')\n const { data, error } = await getDb()\n .from(T.shippingZones)\n .insert({ tenant_id: tenantId, ...shippingZonePayload(input) })\n .select()\n .single()\n if (error) throw error\n return rowToShippingZone(data)\n }\n\n async updateShippingZone(id: string, input: UpdateShippingZoneInput): Promise<ShippingZone> {\n const { data, error } = await getDb()\n .from(T.shippingZones)\n .update(shippingZonePayload(input))\n .eq('id', id)\n .select()\n .single()\n if (error) throw error\n return rowToShippingZone(data)\n }\n\n // -------------------------------------------------------------------------\n // Embalagens (0046)\n //\n // `is_default` has a partial unique index behind it, so promoting a box has\n // to demote the previous one in the same round trip — otherwise the second\n // default is refused by the database and the merchant sees a save that\n // failed for a reason the screen cannot explain.\n // -------------------------------------------------------------------------\n async listShippingPackages(): Promise<ShippingPackage[]> {\n const tenantId = getTenantId()\n const { data, error } = await getDb()\n .from(T.shippingPackages)\n .select('*')\n .eq('tenant_id', tenantId)\n .order('is_default', { ascending: false })\n .order('name', { ascending: true })\n if (error) throw error\n return (data ?? []).map(rowToShippingPackage)\n }\n\n async createShippingPackage(input: CreateShippingPackageInput): Promise<ShippingPackage> {\n const tenantId = getTenantId()\n if (!tenantId) throw new Error('@fayz-ai/shop: createShippingPackage requires a tenant id.')\n if (input.isDefault) await this.clearDefaultPackage(tenantId)\n const { data, error } = await getDb()\n .from(T.shippingPackages)\n .insert({ tenant_id: tenantId, ...shippingPackagePayload(input) })\n .select()\n .single()\n if (error) throw error\n return rowToShippingPackage(data)\n }\n\n async updateShippingPackage(id: string, input: UpdateShippingPackageInput): Promise<ShippingPackage> {\n const tenantId = getTenantId()\n if (input.isDefault && tenantId) await this.clearDefaultPackage(tenantId, id)\n const { data, error } = await getDb()\n .from(T.shippingPackages)\n .update(shippingPackagePayload(input))\n .eq('id', id)\n .select()\n .single()\n if (error) throw error\n return rowToShippingPackage(data)\n }\n\n async deleteShippingPackage(id: string): Promise<void> {\n const { error } = await getDb().from(T.shippingPackages).delete().eq('id', id)\n if (error) throw error\n }\n\n private async clearDefaultPackage(tenantId: string, exceptId?: string): Promise<void> {\n let query = getDb()\n .from(T.shippingPackages)\n .update({ is_default: false })\n .eq('tenant_id', tenantId)\n .eq('is_default', true)\n if (exceptId) query = query.neq('id', exceptId)\n const { error } = await query\n if (error) throw error\n }\n\n async deleteShippingZone(id: string): Promise<void> {\n const { error } = await getDb().from(T.shippingZones).delete().eq('id', id)\n if (error) throw error\n }\n\n // -------------------------------------------------------------------------\n // Store policy + delivery fallback (0044b / 0015)\n //\n // Both are ONE ROW PER TENANT, and both are upserted rather than\n // insert-or-update: a store that never opened these screens has no row, and\n // making the first save conditional on discovering that is two round trips to\n // learn something the primary key already knows.\n // -------------------------------------------------------------------------\n async getShippingSettings(): Promise<ShippingSettings | null> {\n const tenantId = getTenantId()\n const { data, error } = await getDb()\n .from(T.shippingSettings)\n .select('flat_rate, free_above, currency')\n .eq('tenant_id', tenantId)\n .maybeSingle()\n if (error) throw error\n if (!data) return null\n return {\n flatRate: Number(data.flat_rate ?? 0),\n freeAbove: data.free_above == null ? null : Number(data.free_above),\n currency: data.currency ?? 'BRL',\n }\n }\n\n async updateShippingSettings(input: UpdateShippingSettingsInput): Promise<ShippingSettings> {\n const tenantId = getTenantId()\n if (!tenantId) throw new Error('@fayz-ai/shop: updateShippingSettings requires a tenant id.')\n const payload: Record<string, unknown> = { tenant_id: tenantId }\n if (input.flatRate !== undefined) payload.flat_rate = input.flatRate\n // Null is a VALUE here — \"no free-delivery threshold\" — so it is written\n // rather than skipped. Only `undefined` means \"leave it alone\".\n if (input.freeAbove !== undefined) payload.free_above = input.freeAbove\n if (input.currency !== undefined) payload.currency = input.currency\n const { data, error } = await getDb()\n .from(T.shippingSettings)\n .upsert(payload, { onConflict: 'tenant_id' })\n .select('flat_rate, free_above, currency')\n .single()\n if (error) throw error\n return {\n flatRate: Number(data.flat_rate ?? 0),\n freeAbove: data.free_above == null ? null : Number(data.free_above),\n currency: data.currency ?? 'BRL',\n }\n }\n\n /**\n * \"Does this store deliver here?\" — asked with the address, before the card.\n *\n * Degrades to \"yes, and not our own zone\" on any failure. A store that cannot\n * reach the check must not stop selling: the order itself is still refused by\n * the 0048 trigger if the region really is excluded, so the worst case is the\n * shopper learning it one screen later instead of never selling at all.\n */\n async listShippingProfiles(): Promise<ShippingProfile[]> {\n const { data, error } = await getDb()\n .from(T.shippingProfiles)\n .select('*')\n .eq('tenant_id', getTenantId())\n .order('is_default', { ascending: false })\n .order('name')\n if (error) throw error\n return (data ?? []).map(rowToShippingProfile)\n }\n\n async createShippingProfile(input: CreateShippingProfileInput): Promise<ShippingProfile> {\n const tenantId = getTenantId()\n if (!tenantId) throw new Error('@fayz-ai/shop: createShippingProfile requires a tenant id.')\n const { data, error } = await getDb()\n .from(T.shippingProfiles)\n .insert({ tenant_id: tenantId, ...shippingProfilePayload(input) })\n .select('*')\n .single()\n if (error) throw error\n return rowToShippingProfile(data)\n }\n\n async updateShippingProfile(id: string, input: UpdateShippingProfileInput): Promise<ShippingProfile> {\n const { data, error } = await getDb()\n .from(T.shippingProfiles)\n .update(shippingProfilePayload(input))\n .eq('id', id)\n .select('*')\n .single()\n if (error) throw error\n return rowToShippingProfile(data)\n }\n\n async deleteShippingProfile(id: string): Promise<void> {\n const { error } = await getDb().from(T.shippingProfiles).delete().eq('id', id)\n if (error) throw error\n }\n\n // Places the store ships from (0058). Default first, then by name — the same\n // order the ledger's listLocations() uses, so the two screens agree.\n async listStockLocations(): Promise<StockLocation[]> {\n const { data, error } = await getDb()\n .from(T.stockLocations)\n .select('*')\n .eq('tenant_id', getTenantId())\n .order('is_default', { ascending: false })\n .order('name')\n if (error) throw error\n return (data ?? []).map(rowToStockLocation)\n }\n\n async createStockLocation(input: CreateStockLocationInput): Promise<StockLocation> {\n const tenantId = getTenantId()\n if (!tenantId) throw new Error('@fayz-ai/shop: createStockLocation requires a tenant id.')\n if (input.isDefault) await this.clearDefaultStockLocation(tenantId)\n const payload = stockLocationPayload(input)\n if (payload.code === undefined) payload.code = toLocationCode(input.name)\n const { data, error } = await getDb()\n .from(T.stockLocations)\n .insert({ tenant_id: tenantId, ...payload })\n .select('*')\n .single()\n if (error) throw locationWriteError(error)\n return rowToStockLocation(data)\n }\n\n async updateStockLocation(id: string, input: UpdateStockLocationInput): Promise<StockLocation> {\n const tenantId = getTenantId()\n // Clear the old default first: 0034's partial unique index allows exactly\n // one, so writing the new one first fails instead of moving the flag.\n if (input.isDefault && tenantId) await this.clearDefaultStockLocation(tenantId, id)\n const { data, error } = await getDb()\n .from(T.stockLocations)\n .update(stockLocationPayload(input))\n .eq('id', id)\n .select('*')\n .single()\n if (error) throw locationWriteError(error)\n return rowToStockLocation(data)\n }\n\n async deleteStockLocation(id: string): Promise<void> {\n const { error } = await getDb().from(T.stockLocations).delete().eq('id', id)\n if (error) throw locationWriteError(error)\n }\n\n private async clearDefaultStockLocation(tenantId: string, exceptId?: string): Promise<void> {\n let query = getDb()\n .from(T.stockLocations)\n .update({ is_default: false })\n .eq('tenant_id', tenantId)\n .eq('is_default', true)\n if (exceptId) query = query.neq('id', exceptId)\n const { error } = await query\n if (error) throw error\n }\n\n async checkDelivery(postalCode: string): Promise<DeliveryCheck> {\n const tenantId = getTenantId()\n // The raw digits, not toPostalDigits: that one left-pads, which turns a\n // half-typed '20' into '00000020' and would answer about a zone in Acre.\n const digits = String(postalCode ?? '').replace(/\\D/g, '')\n if (!tenantId || digits.length !== 8) return { refused: false, ownZone: false }\n const { data, error } = await getDb().rpc('shop_delivery_check', {\n p_tenant_id: tenantId,\n p_postal_code: digits,\n })\n if (error) return { refused: false, ownZone: false }\n const row = Array.isArray(data) ? data[0] : data\n return {\n refused: Boolean(row?.refused),\n refusedZone: row?.refused_zone ?? null,\n ownZone: Boolean(row?.own_zone),\n }\n }\n\n async getStoreSettings(): Promise<StoreSettings | null> {\n const tenantId = getTenantId()\n const { data, error } = await getDb()\n .from(T.settings)\n .select('*')\n .eq('tenant_id', tenantId)\n .maybeSingle()\n if (error) throw error\n return data ? rowToStoreSettings(data) : null\n }\n\n async updateStoreSettings(input: UpdateStoreSettingsInput): Promise<StoreSettings> {\n const tenantId = getTenantId()\n if (!tenantId) throw new Error('@fayz-ai/shop: updateStoreSettings requires a tenant id.')\n const { data, error } = await getDb()\n .from(T.settings)\n .upsert({ tenant_id: tenantId, ...storeSettingsPayload(input) }, { onConflict: 'tenant_id' })\n .select('*')\n .single()\n if (error) throw error\n return rowToStoreSettings(data)\n }\n\n /**\n * The shopper's read. Through the RPC, not the table: the table is closed to\n * anon on purpose (0029) and shop_store_settings() is the narrow window —\n * storefront fields only, and only for a published store.\n */\n async getPublicStoreSettings(): Promise<StoreSettings | null> {\n const tenantId = getTenantId()\n if (!tenantId) return null\n const { data, error } = await getDb().rpc('shop_store_settings', { p_tenant_id: tenantId })\n if (error) throw error\n const row = Array.isArray(data) ? data[0] : data\n return row ? rowToStoreSettings(row) : null\n }\n\n /**\n * Settle a pending order: the merchant confirming that the money arrived.\n *\n * Goes through the RPC rather than an UPDATE so the payment ledger row in\n * public.transactions closes in the same transaction as the order — set\n * financial_status by hand and the order says paid while the ledger still\n * says pending. Since 0019 the RPC also enforces who may call it: a member of\n * the owning tenant, or a PSP webhook with the service role.\n */\n async confirmPayment(id: string, reference?: string): Promise<Order | null> {\n const { error } = await getDb().rpc('shop_confirm_payment', {\n p_order_id: id,\n p_reference: reference ?? null,\n })\n if (error) throw error\n return this.getOrder(id)\n }\n\n // ---------------------------------------------------------------------------\n // Carrier labels. Everything goes through the function: the token never\n // reaches the browser, and `buy` is the one call that spends money.\n // ---------------------------------------------------------------------------\n\n private async labelCall(orderId: string, action: string, extra: Record<string, unknown> = {}) {\n const tenantId = getTenantId()\n if (!tenantId) throw new Error('@fayz-ai/shop: shipping labels require a tenant id.')\n const { ok, payload } = await callShopFunction(getDb(), 'shop-shipping-label', {\n tenantId, orderId, action, ...extra,\n })\n if (!ok) throw new Error(payload?.error ?? 'A transportadora não respondeu agora.')\n return payload\n }\n\n async quoteShippingLabel(orderId: string, carrier?: string) {\n const payload = await this.labelCall(orderId, 'quote', carrier ? { carrier } : {})\n return {\n options: (payload?.options ?? []).map((option: any) => ({\n serviceId: Number(option.service_id ?? option.serviceId),\n name: String(option.name ?? 'Entrega'),\n carrier: String(option.carrier ?? ''),\n price: Number(option.price ?? 0),\n etaMinDays: option.eta_min_days ?? null,\n etaMaxDays: option.eta_max_days ?? null,\n })),\n label: payload?.label\n ? {\n labelId: String(payload.label.external_id),\n labelUrl: payload.label.url ?? null,\n status: payload.label.status ?? null,\n tracking: payload.label.payload?.tracking ?? null,\n }\n : null,\n }\n }\n\n /** Spends the merchant's balance at the carrier. Never call it on a whim. */\n async buyShippingLabel(orderId: string, serviceId: number, carrier?: string) {\n const payload = await this.labelCall(orderId, 'buy', { serviceId, ...(carrier ? { carrier } : {}) })\n return {\n labelId: String(payload?.labelId ?? ''),\n labelUrl: payload?.labelUrl ?? null,\n status: 'bought',\n tracking: payload?.tracking ?? null,\n }\n }\n\n async printShippingLabel(orderId: string, carrier?: string) {\n const payload = await this.labelCall(orderId, 'print', carrier ? { carrier } : {})\n return payload?.labelUrl ?? null\n }\n\n /** Drop-off points near a place. Store configuration — no order involved. */\n async listShippingAgencies(query: { state?: string; city?: string; carrier?: string }) {\n const tenantId = getTenantId()\n if (!tenantId) return []\n const { ok, payload } = await callShopFunction(getDb(), 'shop-shipping-label', {\n tenantId,\n action: 'agencies',\n state: query.state ?? '',\n city: query.city ?? '',\n ...(query.carrier ? { carrier: query.carrier } : {}),\n })\n if (!ok) throw new Error(payload?.error ?? 'A transportadora não respondeu agora.')\n return (payload?.agencies ?? []) as ShippingAgency[]\n }\n\n async trackShippingLabel(orderId: string, carrier?: string) {\n const payload = await this.labelCall(orderId, 'track', carrier ? { carrier } : {})\n return payload?.tracking ?? null\n }\n\n /**\n * The customer's address book, for the console. `shop_place_order` files a\n * new one here on every delivered order, and until now only the storefront\n * read them back — so a repeat customer had their address retyped by hand.\n */\n async listCustomerAddresses(customerId: string): Promise<CustomerAddress[]> {\n if (!asUuid(customerId)) return []\n const { data, error } = await getDb()\n .from('addresses')\n .select('id,label,recipient,phone,postal_code,street,number,complement,district,city,state,country,is_default')\n .eq('owner_type', 'shop_customer')\n .eq('owner_id', customerId)\n .order('is_default', { ascending: false })\n .order('created_at', { ascending: false })\n if (error) return []\n return (data ?? []).map((row: any) => ({\n id: row.id,\n label: row.label ?? undefined,\n recipient: row.recipient ?? undefined,\n phone: row.phone ?? undefined,\n postalCode: row.postal_code ?? '',\n street: row.street ?? '',\n number: row.number ?? undefined,\n complement: row.complement ?? undefined,\n district: row.district ?? undefined,\n city: row.city ?? '',\n state: row.state ?? '',\n country: row.country ?? undefined,\n isDefault: row.is_default ?? false,\n }))\n }\n\n /**\n * What delivery costs to a postcode — the same answer the shopper gets.\n *\n * The console needs it to quote a price out loud while the customer is on the\n * line. Carrier first (when the merchant did not turn gateway quotes off),\n * zones as the fallback, exactly as the storefront resolves it. Advisory\n * either way: shop_place_order requotes and ignores whatever a client sends.\n */\n async quoteShipping(postalCode: string, subtotal: number): Promise<ShippingQuoteOption[]> {\n const digits = toPostalDigits(postalCode)\n if (!digits) return []\n const tenantId = getTenantId()\n if (!tenantId) return []\n\n const settings = await this.getStoreSettings().catch(() => null)\n if (settings?.carrierQuotes !== false) {\n try {\n const { ok, payload } = await callShopFunction(getDb(), 'shop-shipping-quote', {\n tenantId, postalCode: digits, subtotal,\n })\n const rows: any[] = ok ? (payload?.options ?? []) : []\n if (rows.length > 0) {\n return rows.map((row) => ({\n zoneId: String(row.service_id ?? ''),\n name: String(row.name ?? 'Entrega'),\n carrier: row.carrier ?? undefined,\n rate: Number(row.price ?? 0),\n baseRate: Number(row.price ?? 0),\n freeAbove: null,\n etaMinDays: row.eta_min_days ?? undefined,\n etaMaxDays: row.eta_max_days ?? undefined,\n free: Number(row.price ?? 0) === 0,\n }))\n }\n } catch {\n /* no carrier connected, or the bench is down: the zones still answer */\n }\n }\n\n const { data, error } = await getDb().rpc('shop_quote_shipping', {\n p_tenant_id: tenantId,\n p_postal_code: digits,\n p_subtotal: subtotal,\n })\n if (error) return []\n return (data ?? []).map((row: any) => ({\n zoneId: row.zone_id,\n name: row.name,\n carrier: row.carrier ?? undefined,\n rate: Number(row.rate ?? 0),\n baseRate: Number(row.base_rate ?? row.rate ?? 0),\n freeAbove: row.free_above == null ? null : Number(row.free_above),\n etaMinDays: row.eta_min_days ?? undefined,\n etaMaxDays: row.eta_max_days ?? undefined,\n free: Boolean(row.free),\n }))\n }\n\n /**\n * Charge a cart that is not an order yet — the phone sale, from the counter's\n * side. Same door the storefront uses, on purpose: `shop_price_cart` inside\n * the function reprices everything, so the console sends products and\n * quantities and never money. The order is born in `settleCheckoutSession`,\n * once the acquirer says the Pix landed, so an abandoned charge leaves no\n * ghost order holding stock.\n */\n async openCheckoutSession(input: CheckoutSessionInput): Promise<CheckoutSession> {\n const tenantId = getTenantId()\n if (!tenantId) throw new Error('@fayz-ai/shop: openCheckoutSession requires a tenant id.')\n // Which door to knock on. Absent falls back to AbacatePay, which is where\n // every caller was when there was one gateway; an acquirer with no pair is\n // refused here rather than by a function that would answer about somebody\n // else's transaction.\n const provider = String(input.provider ?? '').trim() || 'abacatepay'\n const gateway = checkoutGateway(provider)\n if (!gateway) {\n throw new Error('Esta loja ainda não tem um meio de cobrança conectado.')\n }\n const { ok, status, payload } = await callShopFunction(getDb(), gateway.open, {\n tenantId,\n items: input.items.map((item) => ({\n productId: item.productId,\n optionsLabel: item.optionsLabel ?? null,\n quantity: item.quantity,\n })),\n customer: input.customer,\n shippingAddress: input.shippingAddress ?? null,\n discountCode: input.discountCode ?? null,\n })\n\n if (!ok || !payload?.sessionId) {\n // 404 arrives by two roads — no acquirer connected, or the function was\n // never deployed to this pool — and both mean \"charge some other way\".\n throw new Error(payload?.error ?? (status === 404\n ? 'Esta loja ainda não tem um meio de cobrança conectado.'\n : 'Não conseguimos abrir a cobrança agora.'))\n }\n\n return {\n sessionId: payload.sessionId,\n total: Number(payload.total ?? 0),\n state: 'open',\n provider,\n charge: payload.brCode\n ? {\n emv: payload.brCode,\n // AbacatePay embeds the `data:` prefix; the type promises bare\n // base64. Left in, the view prefixes it again and the QR is a\n // silently broken <img>.\n //\n // Vindi sends no base64 at all — its `qrCodeUrl` is a URL to an SVG,\n // which cannot be squeezed into this field without lying about what\n // it is. The buyer still gets the copy-and-paste code, which is what\n // actually pays; a rendered QR for Vindi waits for the payment view\n // to learn the second shape.\n qrcodeBase64: String(payload.brCodeBase64 ?? '').replace(/^data:image\\/\\w+;base64,/u, '') || null,\n expiresAt: payload.expiresAt ?? '',\n }\n : null,\n }\n }\n\n /**\n * Ask whether the money landed. Runs on a timer, so a network blip must read\n * as \"still waiting\" (`unknown`) and never as a refused payment.\n *\n * `provider` names which gateway opened the session — handed back by\n * `openCheckoutSession` rather than re-read from settings, because a merchant\n * who switches acquirer mid-checkout would otherwise have the new gateway\n * asked about a transaction that lives in the old one.\n */\n async settleCheckoutSession(sessionId: string, provider?: string | null): Promise<CheckoutSettlement> {\n const tenantId = getTenantId()\n if (!tenantId) return { state: 'unknown' }\n const gateway = checkoutGateway(String(provider ?? '').trim() || 'abacatepay')\n if (!gateway) return { state: 'unknown' }\n try {\n const { ok, payload } = await callShopFunction(getDb(), gateway.settle, { tenantId, sessionId })\n if (!ok || !payload?.state) return { state: 'unknown' }\n return { state: payload.state, orderId: payload.orderId ?? null, reason: payload.reason ?? null }\n } catch {\n return { state: 'unknown' }\n }\n }\n\n // Trusted placement — delegates all price/discount/inventory authority to the\n // shop_place_order RPC (SECURITY DEFINER). The browser never sets a price.\n async placeOrder(input: PlaceOrderInput): Promise<Order> {\n const db = getDb()\n const tenantId = input.tenantId ?? getTenantId()\n if (!tenantId) throw new Error('@fayz-ai/shop: placeOrder requires a tenant id (configure the shop tenant resolver).')\n const { data, error } = await db.rpc('shop_place_order', {\n p_tenant_id: tenantId,\n // variant_id rides on each line (0029): the RPC prices and decrements\n // the variant when present, product-level otherwise. Pre-0029 servers\n // ignore unknown jsonb keys, so this stays compatible either way.\n p_items: input.items.map(i => ({\n product_id: i.productId,\n variant_id: asUuid(i.variantId) ?? undefined,\n quantity: i.quantity,\n options_label: i.optionsLabel ?? null,\n })),\n p_customer_id: asUuid(input.customerId),\n p_customer_name: input.customer?.name ?? null,\n p_customer_email: input.customer?.email ?? null,\n p_currency: input.currency ?? 'BRL',\n p_discount_code: input.discountCode ?? null,\n p_shipping_total: input.shippingTotal ?? 0,\n // snake_case keys on purpose: the RPC freezes this jsonb onto the\n // order and public.addresses uses these exact column names.\n p_shipping_address: input.shippingAddress\n ? {\n postal_code: input.shippingAddress.postalCode,\n street: input.shippingAddress.street,\n number: input.shippingAddress.number ?? null,\n complement: input.shippingAddress.complement ?? null,\n district: input.shippingAddress.district ?? null,\n city: input.shippingAddress.city,\n state: input.shippingAddress.state,\n country: input.shippingAddress.country ?? 'BR',\n recipient: input.shippingAddress.recipient ?? null,\n phone: input.shippingAddress.phone ?? null,\n label: input.shippingAddress.label ?? null,\n // Not an address field: it rides here because shop_place_order's\n // signature cannot grow without a DROP, and 0050's trigger lifts it to\n // plg_shop_orders.customer_document. The storefront already sent it;\n // the console did not, so a phone sale was born with no CPF.\n document: input.shippingAddress.document ?? null,\n }\n : null,\n p_payment_method: input.paymentMethod ?? null,\n p_notes: input.notes ?? null,\n // Only when something contributed: p_metadata exists from 0029 on, and\n // a pre-0029 server rejects unknown NAMED arguments (unlike unknown\n // jsonb keys). Absent metadata therefore must not send the key at all.\n ...(input.metadata !== undefined ? { p_metadata: input.metadata } : {}),\n })\n if (error) throw error\n const orderId = typeof data === 'string' ? data : (data?.id ?? data?.order_id ?? data)\n const order = await this.getOrder(orderId)\n if (!order) throw new Error('@fayz-ai/shop: placeOrder did not return a persisted order.')\n return order\n }\n\n // ---------------------------------------------------------------------------\n // Customers\n // ---------------------------------------------------------------------------\n\n async listCustomers(options?: ListCustomersOptions): Promise<ShopCustomer[]> {\n const db = getDb()\n const tenantId = getTenantId()\n let q = db.from(T.customers).select('*').order('first_name', { ascending: true })\n if (tenantId) q = q.eq('tenant_id', tenantId)\n // Word by word, ANDed — see customerSearchFilters.\n for (const filter of customerSearchFilters(options?.search)) q = q.or(filter)\n if (options?.limit) q = q.limit(options.limit)\n const { data, error } = await q\n if (error) throw error\n return (data ?? []).map(rowToCustomer)\n }\n\n async getCustomer(id: string): Promise<ShopCustomer | null> {\n const { data, error } = await getDb().from(T.customers).select('*').eq('id', id).maybeSingle()\n if (error) throw error\n return data ? rowToCustomer(data) : null\n }\n\n async createCustomer(input: CreateCustomerInput): Promise<ShopCustomer> {\n const { data, error } = await getDb()\n .from(T.customers)\n .insert({\n tenant_id: getTenantId(),\n first_name: input.firstName,\n last_name: input.lastName ?? '',\n email: input.email ?? null,\n phone: input.phone ?? null,\n document: input.document ?? null,\n notes: input.notes ?? null,\n })\n .select().single()\n if (error) throw error\n return rowToCustomer(data)\n }\n\n async updateCustomer(id: string, input: UpdateCustomerInput): Promise<ShopCustomer> {\n const updates: Record<string, unknown> = {}\n if (input.firstName !== undefined) updates.first_name = input.firstName\n if (input.lastName !== undefined) updates.last_name = input.lastName\n if (input.email !== undefined) updates.email = input.email\n if (input.phone !== undefined) updates.phone = input.phone\n if (input.document !== undefined) updates.document = input.document\n if (input.notes !== undefined) updates.notes = input.notes\n const { data, error } = await getDb().from(T.customers).update(updates).eq('id', id).select().single()\n if (error) throw error\n return rowToCustomer(data)\n }\n\n async deleteCustomer(id: string): Promise<void> {\n const { error } = await getDb().from(T.customers).delete().eq('id', id)\n if (error) throw error\n }\n\n // Find-or-create + link to auth.uid server-side (SECURITY DEFINER RPC), so the\n // browser never supplies the auth id and \"my orders\" is RLS-scoped to the owner.\n async resolveCustomer(input: ResolveCustomerInput): Promise<ShopCustomer> {\n const db = getDb()\n const tenantId = input.tenantId ?? getTenantId()\n if (!tenantId) throw new Error('@fayz-ai/shop: resolveCustomer requires a tenant id.')\n const { data, error } = await db.rpc('shop_resolve_customer', {\n p_tenant_id: tenantId,\n p_email: input.email,\n p_name: input.name ?? null,\n })\n if (error) throw error\n const row = Array.isArray(data) ? data[0] : data\n if (!row) throw new Error('@fayz-ai/shop: resolveCustomer returned no row.')\n return rowToCustomer(row)\n }\n\n // ---------------------------------------------------------------------------\n // Promotions (spine M6) — evaluation happens INSIDE the database via the\n // SECURITY DEFINER function (migrations/0033), so an anonymous storefront\n // never reads promotion rows or codes directly: it sends the cart snapshot\n // and receives ordered actions. The function mirrors the TS reference\n // evaluator (src/rules/evaluator.ts), which is the tested spec.\n // ---------------------------------------------------------------------------\n\n async evaluatePromotions(input: { cart: RuleCartSnapshot }): Promise<ComputeAction[]> {\n const db = getDb()\n const tenantId = getTenantId()\n if (!tenantId) throw new Error('@fayz-ai/shop: evaluatePromotions requires a tenant id (configure the shop tenant resolver).')\n const cart = input.cart\n const { data, error } = await db.rpc('shop_compute_promotion_actions', {\n p_tenant_id: tenantId,\n // The serializable RuleCartSnapshot, snake_case on the wire — the same\n // contract 0033 documents for p_cart.\n p_cart: {\n items: cart.items.map((item) => ({\n id: item.id ?? item.productId,\n product_id: item.productId,\n quantity: item.quantity,\n unit_price: item.unitPrice,\n category_id: item.categoryId ?? null,\n collection_id: item.collectionId ?? null,\n })),\n shipping_total: cart.shippingTotal ?? null,\n region: cart.region ?? null,\n customer: cart.customer\n ? { email: cart.customer.email ?? null, tags: cart.customer.tags ?? [] }\n : null,\n codes: cart.codes ?? [],\n },\n })\n if (error) throw error\n const rows: Array<Record<string, unknown>> = Array.isArray(data) ? data : []\n return rows.map((row): ComputeAction => {\n const code = (row.code as string | null) ?? null\n if (row.action === 'addShippingDiscount') {\n return { action: 'addShippingDiscount', promotionId: String(row.promotion_id), code, amount: Number(row.amount) }\n }\n if (row.action === 'addFreeItem') {\n return { action: 'addFreeItem', promotionId: String(row.promotion_id), code, productId: String(row.product_id), quantity: Number(row.quantity) }\n }\n return { action: 'addItemDiscount', promotionId: String(row.promotion_id), code, itemId: String(row.item_id), amount: Number(row.amount) }\n })\n }\n\n // ---------------------------------------------------------------------------\n // Discounts\n // ---------------------------------------------------------------------------\n\n async listDiscounts(options?: ListDiscountsOptions): Promise<Discount[]> {\n const db = getDb()\n const tenantId = getTenantId()\n let q = db.from(T.discounts).select('*').order('created_at', { ascending: false })\n if (tenantId) q = q.eq('tenant_id', tenantId)\n if (options?.status) q = q.eq('status', options.status)\n if (options?.type) q = q.eq('type', options.type)\n if (options?.search) q = q.ilike('title', `%${options.search}%`)\n if (options?.limit) q = q.limit(options.limit)\n const { data, error } = await q\n if (error) throw error\n return (data ?? []).map(rowToDiscount)\n }\n\n async getDiscount(id: string): Promise<Discount | null> {\n const { data, error } = await getDb().from(T.discounts).select('*').eq('id', id).maybeSingle()\n if (error) throw error\n return data ? rowToDiscount(data) : null\n }\n\n async createDiscount(input: CreateDiscountInput): Promise<Discount> {\n const { data, error } = await getDb()\n .from(T.discounts)\n .insert({ tenant_id: getTenantId(), title: input.title, code: input.code ?? null, type: input.type, method: input.method ?? 'code', value: input.value, usage_limit: input.usageLimit ?? null, once_per_customer: input.oncePerCustomer ?? false, min_subtotal: input.minSubtotal ?? null, applies_to: input.appliesTo ?? 'all', product_ids: input.productIds ?? [], category_ids: input.categoryIds ?? [], starts_at: input.startsAt ?? new Date().toISOString(), ends_at: input.endsAt ?? null, status: input.status ?? 'active', times_used: 0 })\n .select().single()\n if (error) throw error\n return rowToDiscount(data)\n }\n\n async updateDiscount(id: string, input: UpdateDiscountInput): Promise<Discount> {\n const updates: Record<string, unknown> = {}\n if (input.title !== undefined) updates.title = input.title\n if (input.code !== undefined) updates.code = input.code\n if (input.type !== undefined) updates.type = input.type\n if (input.value !== undefined) updates.value = input.value\n if (input.usageLimit !== undefined) updates.usage_limit = input.usageLimit\n if (input.minSubtotal !== undefined) updates.min_subtotal = input.minSubtotal\n if (input.appliesTo !== undefined) updates.applies_to = input.appliesTo\n if (input.productIds !== undefined) updates.product_ids = input.productIds\n if (input.categoryIds !== undefined) updates.category_ids = input.categoryIds\n if (input.status !== undefined) updates.status = input.status\n if (input.endsAt !== undefined) updates.ends_at = input.endsAt\n const { data, error } = await getDb().from(T.discounts).update(updates).eq('id', id).select().single()\n if (error) throw error\n return rowToDiscount(data)\n }\n\n async deleteDiscount(id: string): Promise<void> {\n const { error } = await getDb().from(T.discounts).delete().eq('id', id)\n if (error) throw error\n }\n\n // ---------------------------------------------------------------------------\n // Sales channels\n // ---------------------------------------------------------------------------\n\n async listSalesChannels(): Promise<SalesChannel[]> {\n const db = getDb()\n const tenantId = getTenantId()\n let q = db.from(T.salesChannels).select('*').order('position', { ascending: true })\n if (tenantId) q = q.eq('tenant_id', tenantId)\n const { data, error } = await q\n if (error) throw error\n return (data ?? []).map(rowToSalesChannel)\n }\n\n async createSalesChannel(input: CreateSalesChannelInput): Promise<SalesChannel> {\n const { data, error } = await getDb()\n .from(T.salesChannels)\n .insert({ tenant_id: getTenantId(), kind: input.kind, label: input.label, url: input.url ?? null, enabled: input.enabled ?? true, position: input.position ?? 0 })\n .select().single()\n if (error) throw error\n return rowToSalesChannel(data)\n }\n\n async updateSalesChannel(id: string, input: UpdateSalesChannelInput): Promise<SalesChannel> {\n const updates: Record<string, unknown> = {}\n if (input.kind !== undefined) updates.kind = input.kind\n if (input.label !== undefined) updates.label = input.label\n if (input.url !== undefined) updates.url = input.url\n if (input.enabled !== undefined) updates.enabled = input.enabled\n if (input.position !== undefined) updates.position = input.position\n const { data, error } = await getDb().from(T.salesChannels).update(updates).eq('id', id).select().single()\n if (error) throw error\n return rowToSalesChannel(data)\n }\n\n async deleteSalesChannel(id: string): Promise<void> {\n const { error } = await getDb().from(T.salesChannels).delete().eq('id', id)\n if (error) throw error\n }\n\n // ---------------------------------------------------------------------------\n // Custom entities (spine M4). Storage resolves through the EntityStore\n // indirection (I5): a promoted entity's registered store wins; everything\n // else reads/writes the generic jsonb table (migration 0030), whose row\n // access is the RLS generated from each declaration (I6).\n // ---------------------------------------------------------------------------\n\n private entityStore(entity: string) {\n return resolveEntityStore(entity, createSupabaseEntityStore)\n }\n\n async listEntityRecords(entity: string, options?: ListEntityRecordsOptions): Promise<EntityRecord[]> {\n return this.entityStore(entity).list(options)\n }\n\n async getEntityRecord(entity: string, id: string): Promise<EntityRecord | null> {\n return this.entityStore(entity).get(id)\n }\n\n async getEntityRecordBySlug(entity: string, slug: string): Promise<EntityRecord | null> {\n return this.entityStore(entity).getBySlug(slug)\n }\n\n async createEntityRecord(entity: string, input: EntityRecordInput): Promise<EntityRecord> {\n return this.entityStore(entity).create(input)\n }\n\n async updateEntityRecord(entity: string, id: string, input: Partial<EntityRecordInput>): Promise<EntityRecord> {\n return this.entityStore(entity).update(id, input)\n }\n\n async deleteEntityRecord(entity: string, id: string): Promise<void> {\n return this.entityStore(entity).delete(id)\n }\n\n // -------------------------------------------------------------------------\n // Coleções, grupos/segmentos, vale-presente, e-mails e mídia.\n // -------------------------------------------------------------------------\n\nasync listCollections(): Promise<Collection[]> {\n const db = getDb()\n const tenantId = getTenantId()\n let q = db\n .from(T.collections)\n .select(`*, members:${T.collectionProducts}(product_id, position)`)\n .order('sort_order', { ascending: true })\n if (tenantId) q = q.eq('tenant_id', tenantId)\n const { data, error } = await q\n if (error) throw error\n return (data ?? []).map(rowToCollection)\n }\n\n async getCollection(id: string): Promise<Collection | null> {\n const { data, error } = await getDb()\n .from(T.collections)\n .select(`*, members:${T.collectionProducts}(product_id, position)`)\n .eq('id', id)\n .maybeSingle()\n if (error) throw error\n return data ? rowToCollection(data) : null\n }\n\n async createCollection(input: CreateCollectionInput): Promise<Collection> {\n const db = getDb()\n const tenantId = getTenantId()\n const { data, error } = await db\n .from(T.collections)\n .insert({\n tenant_id: tenantId,\n title: input.title,\n handle: input.handle?.trim() || slugify(input.title),\n description: input.description ?? null,\n image_url: input.imageUrl ?? null,\n seo_title: input.seoTitle ?? null,\n seo_description: input.seoDescription ?? null,\n published: input.published ?? true,\n sort_order: input.sortOrder ?? 0,\n })\n .select().single()\n if (error) throw error\n await this.syncCollectionProducts(data.id, tenantId, input.productIds)\n return (await this.getCollection(data.id)) ?? rowToCollection(data)\n }\n\n async updateCollection(id: string, input: UpdateCollectionInput): Promise<Collection> {\n const db = getDb()\n const updates: Record<string, unknown> = {}\n if (input.title !== undefined) updates.title = input.title\n if (input.handle !== undefined) updates.handle = input.handle?.trim() || slugify(String(input.title ?? ''))\n if (input.description !== undefined) updates.description = input.description\n if (input.imageUrl !== undefined) updates.image_url = input.imageUrl\n if (input.seoTitle !== undefined) updates.seo_title = input.seoTitle\n if (input.seoDescription !== undefined) updates.seo_description = input.seoDescription\n if (input.published !== undefined) updates.published = input.published\n if (input.sortOrder !== undefined) updates.sort_order = input.sortOrder\n\n if (Object.keys(updates).length > 0) {\n const { error } = await db.from(T.collections).update(updates).eq('id', id)\n if (error) throw error\n }\n // `undefined` means \"leave the membership alone\" — an edit that only renamed\n // the collection must not empty it.\n if (input.productIds !== undefined) {\n await this.syncCollectionProducts(id, getTenantId(), input.productIds)\n }\n const updated = await this.getCollection(id)\n if (!updated) throw new Error('Collection not found')\n return updated\n }\n\n async deleteCollection(id: string): Promise<void> {\n // Members go with it via ON DELETE CASCADE.\n const { error } = await getDb().from(T.collections).delete().eq('id', id)\n if (error) throw error\n }\n\n async listCustomerGroups(): Promise<CustomerGroup[]> {\n const db = getDb()\n const tenantId = getTenantId()\n let q = db\n .from(T.customerGroups)\n .select(`*, members:${T.customerGroupMembers}(customer_id)`)\n .order('name', { ascending: true })\n if (tenantId) q = q.eq('tenant_id', tenantId)\n const { data, error } = await q\n if (error) throw error\n return (data ?? []).map(rowToCustomerGroup)\n }\n\n async createCustomerGroup(input: CreateCustomerGroupInput): Promise<CustomerGroup> {\n const tenantId = getTenantId()\n const { data, error } = await getDb()\n .from(T.customerGroups)\n .insert({\n tenant_id: tenantId,\n name: input.name,\n description: input.description ?? null,\n color: input.color ?? null,\n })\n .select().single()\n if (error) throw error\n await this.syncGroupMembers(data.id, tenantId, input.customerIds)\n return { ...rowToCustomerGroup(data), customerIds: input.customerIds ?? [] }\n }\n\n async updateCustomerGroup(id: string, input: UpdateCustomerGroupInput): Promise<CustomerGroup> {\n const db = getDb()\n const updates: Record<string, unknown> = {}\n if (input.name !== undefined) updates.name = input.name\n if (input.description !== undefined) updates.description = input.description\n if (input.color !== undefined) updates.color = input.color\n if (Object.keys(updates).length > 0) {\n const { error } = await db.from(T.customerGroups).update(updates).eq('id', id)\n if (error) throw error\n }\n // undefined means \"leave the membership alone\" — renaming a group must not\n // empty it.\n if (input.customerIds !== undefined) {\n await this.syncGroupMembers(id, getTenantId(), input.customerIds)\n }\n const { data, error } = await db\n .from(T.customerGroups)\n .select(`*, members:${T.customerGroupMembers}(customer_id)`)\n .eq('id', id).single()\n if (error) throw error\n return rowToCustomerGroup(data)\n }\n\n async deleteCustomerGroup(id: string): Promise<void> {\n // Members go with it via ON DELETE CASCADE. The CUSTOMERS are untouched —\n // deleting a grouping must never delete the people in it.\n const { error } = await getDb().from(T.customerGroups).delete().eq('id', id)\n if (error) throw error\n }\n\n async listCustomerSegments(): Promise<CustomerSegment[]> {\n const db = getDb()\n const tenantId = getTenantId()\n let q = db.from(T.customerSegments).select('*').order('name', { ascending: true })\n if (tenantId) q = q.eq('tenant_id', tenantId)\n const { data, error } = await q\n if (error) throw error\n return (data ?? []).map(rowToCustomerSegment)\n }\n\n async createCustomerSegment(input: CreateCustomerSegmentInput): Promise<CustomerSegment> {\n const { data, error } = await getDb()\n .from(T.customerSegments)\n .insert({ tenant_id: getTenantId(), ...segmentPayload(input), name: input.name })\n .select().single()\n if (error) throw error\n return rowToCustomerSegment(data)\n }\n\n async updateCustomerSegment(id: string, input: UpdateCustomerSegmentInput): Promise<CustomerSegment> {\n const { data, error } = await getDb()\n .from(T.customerSegments).update(segmentPayload(input)).eq('id', id).select().single()\n if (error) throw error\n return rowToCustomerSegment(data)\n }\n\n async deleteCustomerSegment(id: string): Promise<void> {\n const { error } = await getDb().from(T.customerSegments).delete().eq('id', id)\n if (error) throw error\n }\n\n async listGiftCards(): Promise<GiftCard[]> {\n const db = getDb()\n const tenantId = getTenantId()\n let q = db.from(T.giftCards).select('*').order('created_at', { ascending: false })\n if (tenantId) q = q.eq('tenant_id', tenantId)\n const { data, error } = await q\n if (error) throw error\n return (data ?? []).map(rowToGiftCard)\n }\n\n async createGiftCard(input: CreateGiftCardInput): Promise<GiftCard> {\n const amount = Number(input.initialBalance) || 0\n const { data, error } = await getDb()\n .from(T.giftCards)\n .insert({\n tenant_id: getTenantId(),\n code: (input.code?.trim() || generateGiftCardCode()).toUpperCase(),\n initial_balance: amount,\n // A new card is worth its face value. The admin never types the\n // remaining balance at issue — that is what redemption is for.\n balance: amount,\n currency: input.currency ?? 'BRL',\n status: input.status ?? 'active',\n expires_at: input.expiresAt ?? null,\n customer_id: asUuid(input.customerId),\n customer_email: input.customerEmail ?? null,\n note: input.note ?? null,\n })\n .select().single()\n if (error) throw error\n return rowToGiftCard(data)\n }\n\n async updateGiftCard(id: string, input: UpdateGiftCardInput): Promise<GiftCard> {\n const updates: Record<string, unknown> = {}\n if (input.code !== undefined) updates.code = input.code.trim().toUpperCase()\n if (input.balance !== undefined) updates.balance = input.balance\n if (input.status !== undefined) updates.status = input.status\n if (input.expiresAt !== undefined) updates.expires_at = input.expiresAt\n if (input.customerId !== undefined) updates.customer_id = asUuid(input.customerId)\n if (input.customerEmail !== undefined) updates.customer_email = input.customerEmail\n if (input.note !== undefined) updates.note = input.note\n const { data, error } = await getDb().from(T.giftCards).update(updates).eq('id', id).select().single()\n if (error) throw error\n return rowToGiftCard(data)\n }\n\n async deleteGiftCard(id: string): Promise<void> {\n const { error } = await getDb().from(T.giftCards).delete().eq('id', id)\n if (error) throw error\n }\n\n async listEmailTemplates(): Promise<EmailTemplate[]> {\n const db = getDb()\n const tenantId = getTenantId()\n // Only this store's own events: the table is shared with every other module\n // that sends a message, so an unfiltered read would hand the shop screens\n // rows whose event key their catalog cannot resolve.\n let q = db.from(T.messageTemplates).select('*')\n .like('event_key', `${SHOP_EVENT_PREFIX}%`)\n .eq('channel', EMAIL_CHANNEL)\n if (tenantId) q = q.eq('tenant_id', tenantId)\n const { data, error } = await q\n if (error) throw error\n return (data ?? []).map(rowToEmailTemplate)\n }\n\n async upsertEmailTemplate(input: UpsertEmailTemplateInput): Promise<EmailTemplate> {\n const payload: Record<string, unknown> = {\n tenant_id: getTenantId(),\n event_key: `${SHOP_EVENT_PREFIX}${input.event}`,\n channel: EMAIL_CHANNEL,\n }\n if (input.enabled !== undefined) payload.enabled = input.enabled\n if (input.subject !== undefined) payload.subject = input.subject\n if (input.body !== undefined) payload.body = input.body\n // Upsert on (tenant, event, channel): the row is an override that may not\n // exist yet, and toggling a never-customised template is the common case.\n const { data, error } = await getDb()\n .from(T.messageTemplates)\n .upsert(payload, { onConflict: 'tenant_id,event_key,channel' })\n .select().single()\n if (error) throw error\n return rowToEmailTemplate(data)\n }\n\n async listMediaFiles(): Promise<MediaFile[]> {\n const tenantId = getTenantId()\n if (!tenantId) return []\n // Two sources, on purpose. The bucket answers \"what files exist\"; the\n // product_images rows answer \"what is attached to what\", which storage\n // cannot say — and a product photo sits at {tenant}/products/{id}/…, one\n // level below where a bounded walk reaches, so it was invisible here.\n // Reading the rows also keeps a photo that was detached from its product\n // out of the library instead of showing a file of nothing.\n const [attached, library] = await Promise.all([\n this.listAttachedMedia(tenantId),\n this.listLibraryFiles(tenantId),\n ])\n return mergeMediaFiles(attached, library)\n }\n\n /** Every product photo in the store, each one carrying its product. */\n private async listAttachedMedia(tenantId: string): Promise<MediaFile[]> {\n const db = getDb()\n const { data: rows, error } = await db\n .from(T.productImages)\n .select('id,product_id,url,alt_text,sort_order,is_primary,created_at')\n .eq('tenant_id', tenantId)\n .order('created_at', { ascending: false })\n .limit(1000)\n if (error || !rows?.length) return []\n\n // Names in one read: a catalogue of 200 products with four photos each is\n // still one query, where a lookup per photo would be 800.\n const productIds = [...new Set(rows.map((r: any) => r.product_id).filter(Boolean))]\n const { data: products } = await db\n .from(T.products).select('id,name').in('id', productIds)\n const nameById = new Map<string, string>((products ?? []).map((p: any) => [p.id, p.name]))\n\n return rows.map((row: any) =>\n productImageToMediaFile(rowToImage(row), nameById.get(row.product_id)))\n }\n\n /** What the merchant uploaded straight to the library — owned by nothing. */\n private async listLibraryFiles(tenantId: string): Promise<MediaFile[]> {\n const bucket = getDb().storage.from(T.mediaBucket)\n\n // The bucket is laid out {tenant}/library and {tenant}/products/{id}, and\n // storage.list walks one level at a time. Bounded to the tenant root plus\n // one level: products are covered by the rows above, so there is nothing\n // left down there worth an unbounded recursion.\n const listAt = async (prefix: string): Promise<{ prefix: string; entry: any }[]> => {\n const { data, error } = await bucket.list(prefix, {\n limit: 1000,\n sortBy: { column: 'created_at', order: 'desc' },\n })\n if (error) return []\n return (data ?? []).map((entry: any) => ({ prefix, entry }))\n }\n\n const top = await listAt(tenantId)\n // An entry with no `id` is a folder placeholder, not an object. Only the\n // library folder is worth descending into.\n const folders = top\n .filter(({ entry }) => !entry.id && entry.name === LIBRARY_FOLDER)\n .map(({ entry }) => `${tenantId}/${entry.name}`)\n const nested = (await Promise.all(folders.map(listAt))).flat()\n\n return [...top, ...nested]\n .filter(({ entry }) => entry.id)\n .map(({ prefix, entry }) => {\n const path = `${prefix}/${entry.name}`\n const { data: { publicUrl } } = bucket.getPublicUrl(path)\n const name = displayNameOf(entry.name)\n const file: MediaFile = {\n id: path,\n name,\n url: publicUrl,\n kind: mediaKindOf(entry.name, entry.metadata?.mimetype),\n size: Number(entry.metadata?.size ?? 0),\n extension: (entry.name.split('.').pop() ?? '').toUpperCase(),\n createdAt: entry.created_at ?? entry.updated_at ?? '',\n }\n return file\n })\n }\n\n async uploadMediaFile(file: File): Promise<MediaFile> {\n const db = getDb()\n const tenantId = getTenantId()\n if (!tenantId) throw new Error('@fayz-ai/shop: no active tenant for media upload')\n // `library/` keeps hand-uploaded assets out of products/{id}, so deleting a\n // product never takes a banner the merchant uploaded here down with it.\n const path = `${tenantId}/${LIBRARY_FOLDER}/${Date.now()}-${file.name}`\n const bucket = db.storage.from(T.mediaBucket)\n const { error } = await bucket.upload(path, file)\n if (error) throw error\n const { data: { publicUrl } } = bucket.getPublicUrl(path)\n return {\n id: path,\n name: file.name,\n url: publicUrl,\n kind: mediaKindOf(file.name, file.type),\n size: file.size,\n extension: (file.name.split('.').pop() ?? '').toUpperCase(),\n createdAt: new Date().toISOString(),\n }\n }\n\n async deleteMediaFile(id: string): Promise<void> {\n const { error } = await getDb().storage.from(T.mediaBucket).remove([id])\n if (error) throw error\n }\n\nprivate async syncCollectionProducts(\n collectionId: string,\n tenantId: string | undefined,\n productIds: string[] | undefined,\n ): Promise<void> {\n if (productIds === undefined) return\n const db = getDb()\n const { error: delErr } = await db\n .from(T.collectionProducts).delete().eq('collection_id', collectionId)\n if (delErr) throw delErr\n if (productIds.length === 0) return\n const rows = productIds.map((productId, position) => ({\n collection_id: collectionId, product_id: productId, tenant_id: tenantId, position,\n }))\n const { error } = await db.from(T.collectionProducts).insert(rows)\n if (error) throw error\n }\n\n private async syncGroupMembers(\n groupId: string,\n tenantId: string | undefined,\n customerIds: string[] | undefined,\n ): Promise<void> {\n if (customerIds === undefined) return\n const db = getDb()\n const { error: delErr } = await db\n .from(T.customerGroupMembers).delete().eq('group_id', groupId)\n if (delErr) throw delErr\n if (customerIds.length === 0) return\n const rows = customerIds.map((customerId) => ({\n group_id: groupId, customer_id: customerId, tenant_id: tenantId,\n }))\n const { error } = await db.from(T.customerGroupMembers).insert(rows)\n if (error) throw error\n }\n}\n\nexport function createSupabaseShopProvider(): ShopProvider {\n return new SupabaseShopProvider()\n}\n","import type { ShippingLabel, ShippingLabelOption } from '../types'\n\n// ---------------------------------------------------------------------------\n// Labels as a PORT, and the carrier as an implementation of it.\n//\n// Melhor Envio is what this store has connected today; Correios, Kangu, Frenet\n// and a merchant's own courier contract are the same four verbs. Writing the\n// panel against the carrier's name would put \"melhorEnvio\" in a screen that has\n// no business knowing who carries the box — and the second carrier would then\n// be a second button next to the first, forever.\n//\n// Same shape the stock ledger uses (registerStockStore/resolveStockStore): a\n// registry keyed by id, and a resolver that answers WHICH one is in play. The\n// registry is filled at plugin install; the resolver reads what the merchant\n// connected and chose, never a hard-coded name.\n// ---------------------------------------------------------------------------\n\nexport interface ShippingLabelProvider {\n /** Connector slug — the id `plg_connections.connector_id` carries. */\n id: string\n /** How the merchant knows them (\"Melhor Envio\"). Shown in the panel. */\n label: string\n /** Services and prices for one order. Free, repeatable, spends nothing. */\n quote(orderId: string): Promise<{ options: ShippingLabelOption[]; label: ShippingLabel | null }>\n /** SPENDS the merchant's balance. Idempotent per order by contract. */\n buy(orderId: string, serviceId: number): Promise<ShippingLabel>\n /** The label PDF, as many times as the merchant needs it. */\n print(orderId: string): Promise<string | null>\n /** What the carrier says now. */\n track(orderId: string): Promise<ShippingLabel['tracking']>\n}\n\nconst registry = new Map<string, ShippingLabelProvider>()\n\nexport function registerShippingLabelProvider(provider: ShippingLabelProvider): void {\n registry.set(provider.id, provider)\n}\n\nexport function listShippingLabelProviders(): ShippingLabelProvider[] {\n return [...registry.values()]\n}\n\n/** Test seam — the registry is module state, and a test that registers a fake\n * must not leak it into the next one. */\nexport function resetShippingLabelProviders(): void {\n registry.clear()\n}\n\nexport interface ResolveShippingLabelOptions {\n /** Connector ids the store has ACTIVE, in the order the panel lists them. */\n connected: readonly string[]\n /**\n * The merchant's explicit choice, when they made one.\n *\n * `''` (empty, not undefined) is a decision too — \"I print labels myself\" —\n * and it must beat every connected carrier, exactly as the payment provider\n * setting treats \"confirmo à mão\".\n */\n preferred?: string | null\n}\n\n/**\n * Which carrier issues this store's labels — or nobody.\n *\n * Null is a first-class answer and the common one: most stores dispatch by hand,\n * and the panel must show them the manual path without a dead button beside it.\n */\nexport function resolveShippingLabelProvider(\n options: ResolveShippingLabelOptions,\n): ShippingLabelProvider | null {\n const { connected, preferred } = options\n\n // An explicit empty string means the merchant turned it off.\n if (preferred === '') return null\n\n if (preferred) {\n const chosen = registry.get(preferred)\n // Chosen but no longer connected: the panel must not offer to spend money\n // through a grant that was revoked.\n return chosen && connected.includes(preferred) ? chosen : null\n }\n\n for (const id of connected) {\n const found = registry.get(id)\n if (found) return found\n }\n return null\n}\n","// ---------------------------------------------------------------------------\n// CPF / CNPJ — the one field a Brazilian checkout cannot fake.\n//\n// The gateway rejects a malformed document with an opaque error and the buyer is\n// left staring at \"não foi possível concluir o pedido\". Checking the digits here\n// turns that into a message under the field, before the charge is even opened.\n// ---------------------------------------------------------------------------\n\nexport type DocumentKind = 'cpf' | 'cnpj'\n\nexport const documentDigits = (value: string | null | undefined): string =>\n String(value ?? '').replace(/\\D/g, '')\n\n/** Weighted modulo-11 check digit, the shared half of both algorithms. */\nfunction checkDigit(digits: string, weights: readonly number[]): number {\n const sum = weights.reduce((acc, weight, index) => acc + Number(digits[index]) * weight, 0)\n const rest = sum % 11\n return rest < 2 ? 0 : 11 - rest\n}\n\nconst CPF_FIRST = [10, 9, 8, 7, 6, 5, 4, 3, 2] as const\nconst CPF_SECOND = [11, 10, 9, 8, 7, 6, 5, 4, 3, 2] as const\nconst CNPJ_FIRST = [5, 4, 3, 2, 9, 8, 7, 6, 5, 4, 3, 2] as const\nconst CNPJ_SECOND = [6, 5, 4, 3, 2, 9, 8, 7, 6, 5, 4, 3, 2] as const\n\nexport function isValidCpf(value: string | null | undefined): boolean {\n const digits = documentDigits(value)\n // 111.111.111-11 and its siblings satisfy the checksum, which is why every\n // implementation has to reject them by hand.\n if (digits.length !== 11 || /^(\\d)\\1{10}$/.test(digits)) return false\n return (\n checkDigit(digits, CPF_FIRST) === Number(digits[9]) &&\n checkDigit(digits, CPF_SECOND) === Number(digits[10])\n )\n}\n\nexport function isValidCnpj(value: string | null | undefined): boolean {\n const digits = documentDigits(value)\n if (digits.length !== 14 || /^(\\d)\\1{13}$/.test(digits)) return false\n return (\n checkDigit(digits, CNPJ_FIRST) === Number(digits[12]) &&\n checkDigit(digits, CNPJ_SECOND) === Number(digits[13])\n )\n}\n\n/** Which document this is, by length — `null` when it is neither yet. */\nexport function documentKind(value: string | null | undefined): DocumentKind | null {\n const length = documentDigits(value).length\n if (length === 11) return 'cpf'\n if (length === 14) return 'cnpj'\n return null\n}\n\nexport function isValidDocument(value: string | null | undefined): boolean {\n const kind = documentKind(value)\n return kind === 'cpf' ? isValidCpf(value) : kind === 'cnpj' ? isValidCnpj(value) : false\n}\n\n/**\n * Progressive mask: formats what is typed so far and never blocks typing.\n * A mask that only formats complete input leaves the field jumping at the end.\n */\nexport function formatDocument(value: string | null | undefined): string {\n const digits = documentDigits(value).slice(0, 14)\n if (digits.length <= 11) {\n return digits\n .replace(/^(\\d{3})(\\d)/, '$1.$2')\n .replace(/^(\\d{3})\\.(\\d{3})(\\d)/, '$1.$2.$3')\n .replace(/\\.(\\d{3})(\\d{1,2})$/, '.$1-$2')\n }\n return digits\n .replace(/^(\\d{2})(\\d)/, '$1.$2')\n .replace(/^(\\d{2})\\.(\\d{3})(\\d)/, '$1.$2.$3')\n .replace(/\\.(\\d{3})(\\d)/, '.$1/$2')\n .replace(/(\\d{4})(\\d{1,2})$/, '$1-$2')\n}\n","import type { EmailEventKey, EmailTemplate, EmailTemplateKind } from '../types'\n\n// ---------------------------------------------------------------------------\n// The store's email event catalog.\n//\n// It lives in CODE, not the database: fulfilment is what fires \"order shipped\",\n// so an event only exists if code emits it. A catalog table would need a\n// migration per new event and would keep orphan rows when one went away.\n//\n// The database holds only the merchant's OVERRIDE (plg_automations_templates):\n// on or off, and the text where they rewrote it. No row means \"use the default\n// here\" — true for most stores, and it lets improvements to the default text\n// reach everyone who never customised.\n// ---------------------------------------------------------------------------\n\nexport interface EmailEventDef {\n event: EmailEventKey\n kind: EmailTemplateKind\n /** Template name in the list. */\n title: string\n /** What it does, in one line. */\n description: string\n /** When it fires — the \"event\" half of the pair. */\n trigger: string\n defaultSubject: string\n defaultBody: string\n /** lucide icon for the row. */\n icon: string\n /** On by default in a new store. Order confirmation is the only email a buyer\n * EXPECTS; the rest are the merchant's choice. */\n defaultEnabled: boolean\n}\n\n/** Placeholders the send substitutes. Documented here because this is what the\n * merchant may type in the editor without breaking anything. */\nexport const EMAIL_PLACEHOLDERS = [\n '{{store_name}}', '{{customer_name}}', '{{order_number}}', '{{order_total}}',\n '{{order_items}}', '{{tracking_code}}', '{{cart_url}}',\n] as const\n\nexport const SHOP_EMAIL_EVENTS: EmailEventDef[] = [\n {\n event: 'order_confirmation', kind: 'transactional', icon: 'CircleCheck',\n title: 'Confirmação de pedido',\n description: 'Enviado quando o cliente conclui a compra',\n trigger: 'Imediatamente após o checkout',\n defaultSubject: 'Pedido #{{order_number}} confirmado',\n defaultBody:\n 'Olá {{customer_name}},\\n\\nRecebemos seu pedido #{{order_number}}.\\n\\n{{order_items}}\\n\\nTotal: {{order_total}}\\n\\nObrigado por comprar na {{store_name}}!',\n defaultEnabled: true,\n },\n {\n event: 'order_paid', kind: 'transactional', icon: 'CreditCard',\n title: 'Pagamento aprovado',\n description: 'Enviado quando o pagamento é confirmado',\n trigger: 'Quando o pagamento é aprovado',\n defaultSubject: 'Pagamento aprovado — pedido #{{order_number}}',\n defaultBody:\n 'Olá {{customer_name}},\\n\\nSeu pagamento de {{order_total}} foi aprovado. Já estamos preparando o pedido #{{order_number}}.\\n\\n{{store_name}}',\n defaultEnabled: false,\n },\n {\n event: 'order_shipped', kind: 'transactional', icon: 'Truck',\n title: 'Pedido enviado',\n description: 'Enviado quando o pedido sai para entrega, com o rastreio',\n trigger: 'Quando a entrega é marcada como enviada',\n defaultSubject: 'Seu pedido saiu para entrega — #{{order_number}}',\n defaultBody:\n 'Olá {{customer_name}},\\n\\nSeu pedido #{{order_number}} está a caminho.\\n\\nRastreio: {{tracking_code}}\\n\\n{{store_name}}',\n defaultEnabled: false,\n },\n {\n event: 'order_delivered', kind: 'transactional', icon: 'PackageCheck',\n title: 'Pedido entregue',\n description: 'Enviado quando a entrega é concluída',\n trigger: 'Quando a entrega é marcada como concluída',\n defaultSubject: 'Seu pedido chegou — #{{order_number}}',\n defaultBody:\n 'Olá {{customer_name}},\\n\\nSeu pedido #{{order_number}} foi entregue. Esperamos que goste!\\n\\n{{store_name}}',\n defaultEnabled: false,\n },\n {\n event: 'order_cancelled', kind: 'transactional', icon: 'CircleX',\n title: 'Pedido cancelado',\n description: 'Enviado quando um pedido é cancelado',\n trigger: 'Quando o pedido é cancelado',\n defaultSubject: 'Pedido #{{order_number}} cancelado',\n defaultBody:\n 'Olá {{customer_name}},\\n\\nSeu pedido #{{order_number}} foi cancelado. Se você não pediu isso, responda este e-mail.\\n\\n{{store_name}}',\n defaultEnabled: false,\n },\n {\n event: 'refund_confirmation', kind: 'transactional', icon: 'RotateCcw',\n title: 'Reembolso processado',\n description: 'Enviado quando um reembolso é processado',\n trigger: 'Quando o pagamento é estornado',\n defaultSubject: 'Reembolso emitido — pedido #{{order_number}}',\n defaultBody:\n 'Olá {{customer_name}},\\n\\nO reembolso de {{order_total}} do pedido #{{order_number}} foi processado. O prazo de crédito depende do seu banco.\\n\\n{{store_name}}',\n defaultEnabled: false,\n },\n {\n event: 'customer_welcome', kind: 'transactional', icon: 'Mail',\n title: 'Boas-vindas',\n description: 'Enviado quando um cliente cria conta na loja',\n trigger: 'Quando o cliente se cadastra',\n defaultSubject: 'Bem-vindo(a) à {{store_name}}',\n defaultBody:\n 'Olá {{customer_name}},\\n\\nSua conta na {{store_name}} está pronta. Bom proveito!\\n\\n{{store_name}}',\n defaultEnabled: false,\n },\n {\n event: 'abandoned_cart', kind: 'marketing', icon: 'ShoppingCart',\n title: 'Carrinho abandonado',\n description: 'Enviado quando o cliente deixa itens no carrinho sem finalizar',\n trigger: '1 hora após o abandono do carrinho',\n defaultSubject: 'Você esqueceu alguns itens no carrinho',\n defaultBody:\n 'Olá {{customer_name}},\\n\\nSeus itens ainda estão te esperando.\\n\\n{{cart_url}}\\n\\n{{store_name}}',\n defaultEnabled: false,\n },\n]\n\n/**\n * Substitutes the placeholders. Beside the catalog because PREVIEW and SEND must\n * agree: a screen doing its own `replace` has the merchant approve one text and\n * the customer receive another.\n *\n * An unknown placeholder stays visible as `{{foo}}` on purpose — in the preview\n * that exposes the typo; hiding it would hide the gap until the email had gone.\n */\nexport function renderEmailTemplate(text: string, values: Record<string, string>): string {\n return text.replace(/\\{\\{\\s*(\\w+)\\s*\\}\\}/g, (whole, key: string) => values[key] ?? whole)\n}\n\n/** Sample data for the preview. From no real order — the screen says so. */\nexport const EMAIL_PREVIEW_SAMPLE: Record<string, string> = {\n store_name: 'Sua Loja',\n customer_name: 'Maria Silva',\n order_number: '1042',\n order_total: 'R$ 189,90',\n order_items: '1 × Camiseta Clássica — R$ 89,90\\n2 × Caneca Esmaltada — R$ 100,00',\n tracking_code: 'BR123456789BR',\n cart_url: 'https://sualoja.com.br/carrinho',\n}\n\nexport interface ResolvedEmailTemplate extends EmailEventDef {\n /** The merchant's override, when there is one. */\n override: EmailTemplate | null\n enabled: boolean\n /** Text in force: the merchant's if any, else the default. */\n subject: string\n body: string\n /** true when the merchant rewrote the text — the list flags it. */\n customized: boolean\n}\n\n/**\n * Joins the code catalog with the database overrides. A function and not a\n * query: the merge must give the same answer in the list, the editor and the\n * send, and three places doing the same `??` is how they start to disagree.\n */\nexport function resolveEmailTemplates(overrides: EmailTemplate[]): ResolvedEmailTemplate[] {\n const byEvent = new Map(overrides.map((o) => [o.event, o]))\n return SHOP_EMAIL_EVENTS.map((def) => {\n const override = byEvent.get(def.event) ?? null\n return {\n ...def,\n override,\n enabled: override?.enabled ?? def.defaultEnabled,\n subject: override?.subject ?? def.defaultSubject,\n body: override?.body ?? def.defaultBody,\n customized: Boolean(override?.subject || override?.body),\n }\n })\n}\n","import type { PluginEventDefinition, MessageDefaultsDef, EventField } from '@fayz-ai/core'\nimport { SHOP_EMAIL_EVENTS } from './emails'\n\n// ---------------------------------------------------------------------------\n// The FACTS the store emits and, separately, the text we suggest for each.\n//\n// buildShopDomainEvents() the fact's contract: what happened, what data\n// comes with it, whether it is audited. Webhooks\n// and the audit trail read this.\n// buildShopMessageDefaults() a REACTION to the fact: which channel, which\n// text. Only automations read it.\n//\n// Merging the two would mean whoever writes a Google Calendar integration has to\n// import email vocabulary to find out what fields \"order paid\" carries — and an\n// event with no text could not exist.\n// ---------------------------------------------------------------------------\n\n/** The fields every order event carries. */\nconst ORDER_FIELDS: EventField[] = [\n { name: 'order_number', label: 'Número do pedido', type: 'string', example: '1042' },\n { name: 'order_total', label: 'Total', type: 'money', example: 'R$ 189,90' },\n { name: 'order_items', label: 'Itens', type: 'string', example: '1 × Camiseta Clássica — R$ 89,90\\n2 × Caneca Esmaltada — R$ 100,00' },\n { name: 'customer_name', label: 'Cliente', type: 'string', example: 'Maria Silva' },\n { name: 'store_name', label: 'Loja', type: 'string', example: 'Sua Loja' },\n]\n\nconst TRACKING_FIELD: EventField = {\n name: 'tracking_code', label: 'Código de rastreio', type: 'string', example: 'BR123456789BR',\n}\nconst CART_FIELD: EventField = {\n name: 'cart_url', label: 'Link do carrinho', type: 'url', example: 'https://sualoja.com.br/carrinho',\n}\n\n/** Fields per event — what the emitter actually sends in each. */\nconst FIELDS_BY_EVENT: Record<string, EventField[]> = {\n order_shipped: [...ORDER_FIELDS, TRACKING_FIELD],\n order_delivered: [...ORDER_FIELDS, TRACKING_FIELD],\n abandoned_cart: [...ORDER_FIELDS, CART_FIELD],\n}\n\n/**\n * Facts that are NOT audited: nobody performed them. \"Abandoned cart\" is the\n * absence of an act, and a trail full of non-acts is a trail nobody reads.\n */\nconst NOT_AUDITED = new Set(['abandoned_cart'])\n\nexport function buildShopDomainEvents(): PluginEventDefinition[] {\n return SHOP_EMAIL_EVENTS.map((def) => ({\n name: `shop.${def.event}`,\n title: def.title,\n description: def.description,\n trigger: def.trigger,\n icon: def.icon,\n fields: FIELDS_BY_EVENT[def.event] ?? ORDER_FIELDS,\n audit: !NOT_AUDITED.has(def.event),\n }))\n}\n\n/** Events whose WhatsApp notification is routine in a Brazilian store. */\nconst WHATSAPP_EVENTS = new Set(['order_confirmation', 'order_shipped', 'abandoned_cart'])\n\n/** WhatsApp text is short and subject-less — not the email body, truncated. */\nconst WHATSAPP_BODY: Record<string, string> = {\n order_confirmation:\n 'Oi {{customer_name}}! Recebemos seu pedido #{{order_number}} ✅\\n\\nTotal: {{order_total}}\\n\\nQualquer dúvida é só chamar aqui. — {{store_name}}',\n order_shipped:\n 'Oi {{customer_name}}! Seu pedido #{{order_number}} saiu para entrega 🚚\\n\\nRastreio: {{tracking_code}}\\n\\n— {{store_name}}',\n abandoned_cart:\n 'Oi {{customer_name}}! Vi que ficaram itens no seu carrinho 🛒\\n\\nQuer que eu segure para você?\\n{{cart_url}}\\n\\n— {{store_name}}',\n}\n\nexport function buildShopMessageDefaults(): MessageDefaultsDef[] {\n return SHOP_EMAIL_EVENTS.map((def) => {\n const whatsapp = WHATSAPP_EVENTS.has(def.event) ? WHATSAPP_BODY[def.event] : undefined\n return {\n eventKey: `shop.${def.event}`,\n kind: def.kind,\n channels: whatsapp ? (['email', 'whatsapp'] as const).slice() : ['email' as const],\n defaults: {\n email: { subject: def.defaultSubject, body: def.defaultBody },\n ...(whatsapp ? { whatsapp: { body: whatsapp } } : {}),\n },\n // Only email inherits \"on by default\". WhatsApp bills per message and\n // needs an approved number — switching itself on would spend someone's\n // money unasked.\n defaultEnabled: { email: def.defaultEnabled },\n }\n })\n}\n"]}
|