@fayz-ai/plugin-shop 0.18.2 → 0.19.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/{ShopPage-J34V43NW.js → ShopPage-2CTRGQTX.js} +176 -247
- package/dist/ShopPage-2CTRGQTX.js.map +1 -0
- package/dist/{chunk-6DRDPROL.js → chunk-XV3KZRQX.js} +136 -31
- package/dist/chunk-XV3KZRQX.js.map +1 -0
- package/dist/data/registries.d.ts +2 -0
- package/dist/data/registries.d.ts.map +1 -1
- package/dist/index.d.ts +23 -2
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +757 -511
- package/dist/index.js.map +1 -1
- package/dist/integrations/abacatepay/connectorDef.d.ts.map +1 -1
- package/dist/settings/ChoiceCards.d.ts.map +1 -1
- package/dist/settings/HandlingSettings.d.ts.map +1 -1
- package/dist/settings/MarketsSettings.d.ts +12 -0
- package/dist/settings/MarketsSettings.d.ts.map +1 -0
- package/dist/settings/PaymentProviderRow.d.ts.map +1 -1
- package/dist/settings/ShippingSettings.d.ts.map +1 -1
- package/dist/views/DeliveryAreaPicker.d.ts.map +1 -1
- package/dist/views/DeliveryRulesDraft.d.ts.map +1 -1
- package/dist/views/EmailTemplatePage.d.ts.map +1 -1
- package/dist/views/EmailsPage.d.ts.map +1 -1
- package/dist/views/FulfillmentProviderSelect.d.ts.map +1 -1
- package/dist/views/NewOrderCharge.d.ts.map +1 -1
- package/dist/views/NewOrderPage.d.ts.map +1 -1
- package/dist/views/OrderDetailView.d.ts.map +1 -1
- package/dist/views/OrderPaymentDetail.d.ts.map +1 -1
- package/dist/views/ProductMarketPricesTab.d.ts +19 -0
- package/dist/views/ProductMarketPricesTab.d.ts.map +1 -0
- package/dist/views/ProductPositionsTab.d.ts.map +1 -1
- package/dist/views/ProductStockTab.d.ts.map +1 -1
- package/dist/views/ProductVariantsTab.d.ts.map +1 -1
- package/dist/views/ShipOrderForm.d.ts.map +1 -1
- package/dist/views/ShipmentActions.d.ts.map +1 -1
- package/dist/views/ShippingProfileSelect.d.ts.map +1 -1
- package/dist/views/ShopPage.d.ts.map +1 -1
- package/dist/views/StockEntryModal.d.ts.map +1 -1
- package/dist/views/customerEntity.d.ts.map +1 -1
- package/dist/views/customerSegmentEntity.d.ts.map +1 -1
- package/dist/views/discountEntity.d.ts.map +1 -1
- package/dist/views/giftCardEntity.d.ts.map +1 -1
- package/dist/views/product-matching.d.ts.map +1 -1
- package/dist/views/productEntity.d.ts.map +1 -1
- package/dist/views/shippingZoneEntity.d.ts.map +1 -1
- package/package.json +7 -7
- package/dist/ShopPage-J34V43NW.js.map +0 -1
- package/dist/chunk-6DRDPROL.js.map +0 -1
- package/dist/integrations/bling/index.d.ts +0 -9
- package/dist/integrations/bling/index.d.ts.map +0 -1
- package/dist/integrations/neochef/index.d.ts +0 -8
- package/dist/integrations/neochef/index.d.ts.map +0 -1
- package/dist/settings/index.d.ts +0 -12
- package/dist/settings/index.d.ts.map +0 -1
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/views/customerLookup.ts","../src/settings/error-message.ts","../src/views/AgencySelect.tsx","../src/views/eta-label.ts","../src/views/shippingZoneEntity.tsx","../src/data/shared.ts","../src/data/shippingZoneDataProvider.ts","../src/data/shippingProfileDataProvider.ts","../src/data/stockLocationDataProvider.ts","../src/views/FulfillmentProviderSelect.tsx","../src/data/registries.ts","../src/views/product-matching.ts"],"names":["coreMessage","resolve","React","money","jsxs","jsx","toInput","useConnectors","cep","OWN_FULFILLMENT"],"mappings":"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","file":"chunk-6DRDPROL.js","sourcesContent":["import type { ShopProvider } from '@fayz-ai/shop'\n\n/**\n * Feeds the shared PersonLink popover from the shop's own customer table.\n * The default lookup reads the `person` archetype (`people`), where a shop\n * customer does not exist — so without this the card would come up empty.\n */\nexport function shopCustomerLookup(provider: () => ShopProvider) {\n return {\n async getById(id: string) {\n const c = await provider().getCustomer(id)\n if (!c) return null\n const name = [c.firstName, c.lastName].filter(Boolean).join(' ')\n return {\n id: c.id,\n label: name || c.email || 'Cliente',\n subtitle: c.email ?? undefined,\n group: 'shop_customer',\n // PersonLink reads contact fields off `data`, so the keys must match the\n // shape it expects (email/phone), not our camelCase type.\n data: {\n email: c.email ?? undefined,\n phone: c.phone ?? undefined,\n kind: 'shop_customer',\n orders_count: c.ordersCount,\n total_spent: c.totalSpent,\n },\n }\n },\n }\n}\n","/**\n * The refusals the dispatch RPCs raise, in the language the merchant reads.\n *\n * These are `RAISE EXCEPTION` strings, so they arrive as English prose prefixed\n * with the function name — \"shop_create_fulfillment: nothing left to fulfill\"\n * is accurate and useless to a shop owner. Matched on the tail so the prefix\n * never has to be repeated here.\n */\n\n// The generic half of this now lives in @fayz-ai/core (it was met here first,\n// on the settings screens' first real load against the pool, and every other\n// package had the broken ternary). What stays here is the domain half above:\n// turning an RPC refusal into a sentence a merchant can act on.\nimport { errorMessage as coreMessage } from '@fayz-ai/core'\n\n/** The merchant reads this one, so the last resort is in their language. */\nconst rawMessage = (error: unknown) => coreMessage(error, 'erro desconhecido')\n\nconst RPC_REFUSAL: Array<[RegExp, string]> = [\n [/nothing left to fulfill/i, 'Não há itens pendentes neste pedido — tudo já foi enviado.'],\n [/not a member of this store/i, 'Sua conta não tem permissão para despachar pedidos desta loja.'],\n [/order not found/i, 'Pedido não encontrado.'],\n [/fulfillment not found/i, 'Envio não encontrado — recarregue a página.'],\n [/fulfillment was cancelled/i, 'Este envio foi cancelado. Registre um novo envio.'],\n [/location does not belong to this store/i, 'O local de estoque escolhido não é desta loja.'],\n [/not pending/i, 'Não há cobrança em aberto para registrar neste pedido.'],\n [/not authorized to confirm payment/i, 'Sua conta não tem permissão para registrar o pagamento deste pedido.'],\n]\nexport function errorMessage(error: unknown): string {\n const raw = rawMessage(error)\n for (const [pattern, friendly] of RPC_REFUSAL) if (pattern.test(raw)) return friendly\n return raw\n}\n","import React, { useEffect, useState } from 'react'\nimport { Skeleton } from '@fayz-ai/ui'\nimport { MapPin, RefreshCw } from 'lucide-react'\nimport { getShopProvider, resolveShippingLabelProvider } from '@fayz-ai/shop'\nimport { useConnectors } from '@fayz-ai/admin'\nimport { errorMessage } from '../settings/error-message'\nimport type { ShippingAgency, ShopProvider } from '@fayz-ai/shop'\n\n// ---------------------------------------------------------------------------\n// Where THIS place drops its parcels.\n//\n// An id in a text box was the stopgap, and it was the wrong shape twice over: a\n// merchant does not know \"49276\", and the right agency is a question of which\n// one is near the warehouse they are editing. So the list is pulled for the\n// address on the form — the same city and state the fields above hold — and\n// what it shows is what the carrier will accept.\n//\n// Empty is a valid answer and the common one: dispatch then resolves the\n// nearest agency that accepts the service being bought.\n// ---------------------------------------------------------------------------\n\ntype Chosen = Record<string, { id: string; name?: string }>\n\nexport interface AgencySelectProps {\n /** The `carrierAgencies` map of the location being edited. */\n value: Chosen | null | undefined\n onChange: (value: Chosen) => void\n /** The rest of the form — the address this place has. */\n values?: Record<string, unknown>\n provider?: () => ShopProvider\n}\n\nexport function AgencySelect({ value, onChange, values, provider }: AgencySelectProps) {\n const resolve = provider ?? (() => getShopProvider())\n const { connectors } = useConnectors({ hostPluginId: 'shop', includeGrants: false })\n const carrier = React.useMemo(() => resolveShippingLabelProvider({\n connected: (connectors ?? []).filter((c) => c.state === 'connected').map((c) => c.slug),\n }), [connectors])\n\n const state = String(values?.state ?? '').trim().toUpperCase().slice(0, 2)\n const city = String(values?.city ?? '').trim()\n\n const [agencies, setAgencies] = useState<ShippingAgency[] | null>(null)\n const [loading, setLoading] = useState(false)\n const [error, setError] = useState<string | null>(null)\n\n const chosen = value?.[carrier?.id ?? ''] ?? null\n\n async function load() {\n if (!carrier) return\n setLoading(true)\n setError(null)\n try {\n const found = await resolve().listShippingAgencies?.({ state, city, carrier: carrier.id })\n setAgencies(found ?? [])\n } catch (err: unknown) {\n setError(errorMessage(err))\n } finally {\n setLoading(false)\n }\n }\n\n // Only once the place has a state: the unfiltered list is thousands of rows\n // in another part of the country.\n useEffect(() => {\n if (!carrier || !state || agencies !== null) return\n void load()\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [carrier, state])\n\n if (!carrier) return null\n\n function pick(agency: ShippingAgency | null) {\n const next = { ...(value ?? {}) }\n if (agency) next[carrier!.id] = { id: agency.id, name: agency.name }\n else delete next[carrier!.id]\n onChange(next)\n }\n\n return (\n <div className=\"space-y-2\">\n <div className=\"flex items-center justify-between gap-2\">\n <p className=\"text-xs text-muted-foreground\">\n Onde você entrega os pacotes da {carrier.label}. Em branco, usamos a mais perto que aceite o serviço.\n </p>\n {state && (\n <button type=\"button\" onClick={() => { setAgencies(null); void load() }} disabled={loading}\n data-testid=\"agency-reload\"\n className=\"inline-flex items-center gap-1 text-xs text-muted-foreground transition hover:text-foreground\">\n <RefreshCw className={`h-3 w-3 ${loading ? 'animate-spin' : ''}`} />\n Atualizar\n </button>\n )}\n </div>\n\n {!state && (\n <p className=\"text-sm text-muted-foreground\">Preencha a UF acima para listar as agências perto daqui.</p>\n )}\n\n {chosen && (\n <div className=\"flex items-start gap-2 rounded-md border bg-muted/30 p-2.5 text-sm\" data-testid=\"agency-chosen\">\n <MapPin className=\"mt-0.5 h-4 w-4 shrink-0 text-muted-foreground\" />\n <span className=\"min-w-0 flex-1\">\n <span className=\"block truncate font-medium\">{chosen.name ?? chosen.id}</span>\n <span className=\"block text-xs text-muted-foreground\">Agência #{chosen.id}</span>\n </span>\n <button type=\"button\" onClick={() => pick(null)} data-testid=\"agency-clear\"\n className=\"text-xs text-muted-foreground underline-offset-2 hover:underline\">\n Usar a mais próxima\n </button>\n </div>\n )}\n\n {loading && agencies === null && (\n <div className=\"space-y-1.5\">\n {[0, 1, 2].map((row) => (\n <div key={row} className=\"rounded-md border p-2.5\">\n <Skeleton className=\"h-3.5 w-48\" />\n <Skeleton className=\"mt-1.5 h-3 w-64\" />\n </div>\n ))}\n </div>\n )}\n\n {error && (\n <p className=\"rounded-md border border-red-200 bg-red-50 px-2.5 py-1.5 text-xs text-red-800\">{error}</p>\n )}\n\n {!chosen && agencies && agencies.length === 0 && !loading && (\n <p className=\"text-sm text-muted-foreground\">\n A {carrier.label} não listou agências para esta UF. O despacho segue sem escolher uma.\n </p>\n )}\n\n {!chosen && agencies && agencies.length > 0 && (\n <ul className=\"max-h-56 space-y-1.5 overflow-auto\" data-testid=\"agency-options\">\n {agencies.map((agency) => (\n <li key={agency.id}>\n <button type=\"button\" onClick={() => pick(agency)}\n className=\"block w-full rounded-md border p-2.5 text-left text-sm transition hover:bg-muted/50\">\n <span className=\"block truncate font-medium\">{agency.name}</span>\n <span className=\"block truncate text-xs text-muted-foreground\">\n {[agency.address, agency.city && `${agency.city}/${agency.state}`].filter(Boolean).join(' · ')}\n </span>\n </button>\n </li>\n ))}\n </ul>\n )}\n </div>\n )\n}\n","/**\n * The delivery estimate as a merchant says it: zero days is not a number of days,\n * it is today, and \"0–1 dias\" hid the same-day offer from the person selling it.\n */\nexport function etaLabel(min: number | null | undefined, max: number | null | undefined): string {\n if (min == null && max == null) return ''\n const from = Math.max(0, min ?? 0)\n const to = Math.max(from, max ?? from)\n if (to <= 0) return 'no mesmo dia'\n // No minimum is a ceiling, not a range starting at zero.\n if (from <= 0) return to === 1 ? 'em até 24h' : `em até ${to} dias`\n if (from === to) return `em ${to} ${to === 1 ? 'dia' : 'dias'}`\n return `${from}–${to} dias`\n}\n","import React from 'react'\nimport type { EntityDef, FieldDef } from '@fayz-ai/core'\nimport type { ShippingZone } from '@fayz-ai/shop'\nimport { etaLabel } from './eta-label'\n\n// ---------------------------------------------------------------------------\n// Delivery rule — declarative CRUD, same contract as products and discounts.\n//\n// A rule is an AREA plus an OUTCOME (0081). The area is a municipality, a\n// neighbourhood, or a range of postal codes; the outcome is deliver, review or\n// refuse. Rules may overlap on purpose — that is the whole design: among the\n// ones that match, the STRICTEST outcome wins, and among those that deliver the\n// cheapest price wins.\n//\n// The three things worth being loud about in the UI:\n// · a store with NO rules keeps charging its flat rate — rules are opt-in;\n// · once the first rule exists, an address outside every rule can no longer\n// order (shop_place_order refuses it), so the first save changes who can buy;\n// · \"não entrego\" is not the same as leaving the region uncadastrada. A broad\n// rule covering a whole region already accepts the street the merchant wants\n// to avoid, and refusing beats every rule covering the same address and any\n// carrier's quote.\n//\n// NO POSTCODE RANGE REACHES THIS FORM, and that is the point. A range is how a\n// CARRIER prices, not how a person describes where they deliver — Shopify's\n// native zones stop at the state and Nuvemshop's custom shipping is a flat\n// price, so asking for one put us below the floor of the market. The area is\n// chosen by SEARCH on the Entrega tab (or by the assistant), which resolves a\n// name against real data; the identifiers it writes — IBGE code, district key,\n// range — are machine values and are shown here read-only.\n//\n// So this form is the CORRECTION surface: outcome, price, ETA, active. The\n// authoring surface is the search and the conversation.\n// ---------------------------------------------------------------------------\n\nconst cep = (value: string | undefined): string => {\n const digits = String(value ?? '').replace(/\\D/g, '').padStart(8, '0')\n return `${digits.slice(0, 5)}-${digits.slice(5)}`\n}\n\n\nexport function buildShopShippingZoneEntity(currency = 'BRL'): EntityDef<ShippingZone> {\n const money = (value: number | null | undefined) =>\n value == null\n ? '—'\n : new Intl.NumberFormat('pt-BR', { style: 'currency', currency }).format(Number(value))\n\n const delivers = (values: Record<string, unknown>) =>\n (values.outcome ?? 'deliver') !== 'refuse'\n\n const fields: FieldDef[] = [\n {\n key: 'outcome', label: 'O que a loja faz aqui', type: 'segmented',\n group: 'zone', span: 2, defaultValue: 'deliver',\n options: [\n { label: 'Entrego', value: 'deliver', description: 'Cobra o frete abaixo e segue normal.' },\n {\n label: 'Confirmo antes', value: 'review',\n description: 'Aceita o pedido e marca para você confirmar a entrega antes de sair.',\n },\n {\n label: 'Não entrego', value: 'refuse',\n description: 'Recusa no servidor. Vence qualquer outra regra que cubra o mesmo endereço, inclusive a cotação de transportadora.',\n },\n ],\n showInTable: false,\n },\n {\n key: 'name', label: 'Nome da regra', type: 'text', required: true, group: 'zone',\n placeholder: 'Rio de Janeiro — capital',\n hint: 'Aparece para o cliente na hora de escolher a entrega.',\n searchable: true, showInTable: true, sortable: true,\n renderCell: (value: any, row: any) => {\n const outcome = row.outcome ?? (row.excluded ? 'refuse' : 'deliver')\n if (outcome === 'refuse') {\n return (\n <span className=\"flex items-center gap-2\">\n <span className=\"rounded-full bg-red-100 px-2 py-0.5 text-xs font-medium text-red-800\">\n não entrego\n </span>\n <span className=\"text-muted-foreground line-through\">{String(value ?? '')}</span>\n </span>\n )\n }\n if (outcome === 'review') {\n return (\n <span className=\"flex items-center gap-2\">\n <span className=\"rounded-full bg-amber-100 px-2 py-0.5 text-xs font-medium text-amber-800\">\n confirmo antes\n </span>\n <span>{String(value ?? '')}</span>\n </span>\n )\n }\n return <span>{String(value ?? '')}</span>\n },\n },\n {\n // Leitura, nunca digitação. Código do IBGE, chave de bairro e faixa de CEP\n // são identificadores de máquina: quem escolhe a região é a busca da aba\n // Entrega (ou o assistente), que resolve o nome contra dado real. Pedir\n // qualquer um deles a uma pessoa é o que fazia esta tela ser abandonada.\n key: 'area', label: 'Região', type: 'computed', group: 'zone', span: 2,\n hint: 'Definida quando a regra foi criada. Para trocar de região, apague esta regra e escolha a certa na busca da aba Entrega.',\n showInForm: true, showInTable: false,\n compute: (values: Record<string, unknown>) => {\n const kind = values.matchKind ?? 'postal_range'\n if (kind === 'city') return { display: `Município · ${values.name ?? values.cityCode ?? '—'}` }\n if (kind === 'district') return { display: `Bairro · ${values.name ?? values.districtKey ?? '—'}` }\n const from = values.postalFrom ? cep(String(values.postalFrom)) : '?'\n const to = values.postalTo ? cep(String(values.postalTo)) : '?'\n return { display: `Faixa de CEP · ${from} → ${to}`, tone: 'neutral' }\n },\n },\n {\n key: 'carrier', label: 'Transportadora', type: 'text', group: 'zone',\n placeholder: 'Correios, motoboy próprio…',\n hint: 'Opcional. Mostrado antes do nome da zona quando preenchido.',\n showInTable: true,\n },\n {\n key: 'postalFrom', label: 'Região', type: 'text', group: 'zone',\n showInForm: false,\n showInTable: true,\n renderCell: (_v, row: any) => {\n if (row.matchKind === 'city') {\n return <span className=\"whitespace-nowrap text-xs text-muted-foreground\">Município {row.cityCode ?? '—'}</span>\n }\n if (row.matchKind === 'district') {\n return <span className=\"whitespace-nowrap text-xs text-muted-foreground\">Bairro {row.districtKey ?? '—'}</span>\n }\n return (\n <span className=\"whitespace-nowrap font-mono text-xs\">\n {cep(row.postalFrom)} → {cep(row.postalTo)}\n </span>\n )\n },\n },\n {\n key: 'postalTo', label: 'CEP final', type: 'text', group: 'zone',\n showInForm: false, showInTable: false,\n },\n {\n key: 'rate', label: 'Valor do frete', type: 'number', group: 'pricing',\n hint: 'Cobrado nos pedidos entregues nessa região.',\n visibleWhen: delivers,\n showInTable: true, sortable: true,\n renderCell: (value: any) => <span className=\"tabular-nums\">{money(value)}</span>,\n },\n {\n key: 'freeAbove', label: 'Frete grátis acima de', type: 'number', group: 'pricing',\n hint: 'Deixe vazio para nunca dar frete grátis nessa região. Vale mais que a regra geral da loja.',\n visibleWhen: delivers,\n showInTable: true,\n renderCell: (value: any) => <span className=\"tabular-nums\">{money(value)}</span>,\n },\n {\n key: 'etaMinDays', label: 'Prazo mínimo (dias)', type: 'number', group: 'delivery',\n hint: '0 = no mesmo dia. Com máximo 1, o cliente lê \"em até 24h\".',\n showInTable: false,\n },\n {\n key: 'etaMaxDays', label: 'Prazo máximo (dias)', type: 'number', group: 'delivery',\n hint: 'É o que o cliente vê na página do produto.',\n showInTable: true,\n renderCell: (_v, row: any) => {\n const outcome = row.outcome ?? (row.excluded ? 'refuse' : 'deliver')\n if (outcome === 'refuse') return <span className=\"text-muted-foreground\">—</span>\n const label = etaLabel(row.etaMinDays, row.etaMaxDays)\n return label\n ? <span>{label}</span>\n : <span className=\"text-muted-foreground\">—</span>\n },\n },\n {\n key: 'active', label: 'Ativa', type: 'boolean', group: 'delivery',\n hint: 'Desativar para de cotar essa faixa sem apagar a configuração.',\n showInTable: true,\n renderCell: (value: any) => (\n <span className={`rounded-full px-2 py-0.5 text-xs font-medium ${\n value ? 'bg-emerald-100 text-emerald-800' : 'bg-gray-100 text-gray-700'}`}>\n {value ? 'Ativa' : 'Inativa'}\n </span>\n ),\n },\n {\n key: 'sortOrder', label: 'Ordem', type: 'number', group: 'delivery',\n hint: 'Desempate quando duas zonas custam o mesmo. Menor aparece primeiro.',\n showInTable: false,\n },\n ]\n\n return {\n name: 'Zona de entrega',\n // 'Zonas', não 'Entrega': o plural nomeia o CADASTRO, e ele aparece na\n // migalha, no vazio da lista e na busca. Dizendo \"Entrega\" a tela lia\n // \"← Entrega / Entrega\", \"Nenhum(a) entrega ainda\" e \"Buscar entrega...\".\n namePlural: 'Zonas',\n icon: 'Truck',\n displayField: 'name',\n fields,\n fieldGroups: [\n {\n id: 'zone', label: 'Região', columns: 2,\n description:\n 'Para adicionar uma região, use a busca na aba Entrega — ou conte ao assistente com as suas palavras. Aqui você corrige uma regra que já existe. '\n + 'Regras podem se sobrepor de propósito: entre as que cobrem o mesmo endereço vence a mais estrita — «não entrego» ganha de «confirmo antes», que ganha de «entrego» — e, entre as que entregam, o cliente paga a mais barata. É assim que se diz «Zona Norte sim, Chapadão não» com duas regras em vez de quarenta.',\n },\n {\n id: 'pricing', label: 'Preço', columns: 2,\n description: 'O frete cobrado é recalculado no servidor a cada pedido, a partir daqui.',\n },\n { id: 'delivery', label: 'Prazo e status', columns: 2 },\n ],\n facets: [\n { field: 'active', allLabel: 'Todas' },\n { field: 'outcome', allLabel: 'Todas' },\n ],\n } as EntityDef<ShippingZone>\n}\n","import { getActiveTenantId, getPersistentCache, globalCache, stableKey, toDataError, type CrudQuery, type CrudResult } from '@fayz-ai/core'\nimport type { Product, ShopProvider } from '@fayz-ai/shop'\n\nexport type ShopProviderResolver = ShopProvider | (() => ShopProvider)\n\nexport const resolve = (p: ShopProviderResolver): ShopProvider => (typeof p === 'function' ? p() : p)\n\n// ---------------------------------------------------------------------------\n// Product list cache — one funnel for every surface that lists the catalogue\n// (the products CRUD page, the new-order picker). Keyed under the same\n// `${tenant}:${table}` prefix the core cache uses, so the platform-wide\n// invalidation (and the persistent L2, once attached to globalCache) covers\n// these entries with no extra wiring here.\n// ---------------------------------------------------------------------------\n\nconst PRODUCT_CACHE_TABLE = 'plg_shop_products'\n\n// Catalogue reads tolerate minutes of staleness; writes below clear it anyway.\nconst PRODUCT_CACHE_TTL = 300_000\n\nconst productPrefix = () => `${getActiveTenantId() ?? '_'}:${PRODUCT_CACHE_TABLE}`\n\nexport interface ProductListAnswer {\n rows: Product[]\n /** Answered from the read cache without a round-trip. */\n cached?: boolean\n /** Answered from the offline snapshot because the network failed. */\n stale?: boolean\n}\n\nexport async function listProductsDetailed(\n p: ShopProviderResolver,\n params?: Parameters<ShopProvider['listProducts']>[0],\n): Promise<ProductListAnswer> {\n const key = `${productPrefix()}:${stableKey('list', params ?? {})}`\n const hit = globalCache.get<Product[]>(key)\n if (hit) return { rows: hit, cached: true }\n try {\n const rows = await resolve(p).listProducts(params)\n globalCache.set(key, rows, PRODUCT_CACHE_TTL)\n return { rows }\n } catch (err) {\n // Network down: a catalogue the merchant saw earlier beats an empty list.\n // Only the offline kind falls back — a permission failure must surface.\n if (toDataError(err).kind === 'offline') {\n const stale = await getPersistentCache()?.getStale<Product[]>(key)\n if (stale) return { rows: stale.data, stale: true }\n }\n throw err\n }\n}\n\nexport async function listProductsCached(\n p: ShopProviderResolver,\n params?: Parameters<ShopProvider['listProducts']>[0],\n): Promise<Product[]> {\n return (await listProductsDetailed(p, params)).rows\n}\n\nexport function invalidateProductLists(): void {\n globalCache.invalidate(productPrefix())\n}\n\n/**\n * Paging, sorting and facet filtering applied client-side: the shop provider's\n * list methods take a search term but no offset, sort or filter parameters.\n * Fine at storefront catalogue sizes; revisit if a tenant grows past a few\n * thousand rows, where it should move into the query.\n */\nexport function applyQuery<T>(\n rows: T[],\n query: CrudQuery,\n facetKey?: keyof T & string,\n): CrudResult<T> {\n const prop = (row: T, key: string): unknown => (row as Record<string, unknown>)[key]\n let data = rows\n\n if (facetKey) {\n const wanted = query.filters?.[facetKey]\n if (wanted && wanted !== 'all') data = data.filter((row) => prop(row, facetKey) === wanted)\n }\n\n if (query.sortBy) {\n const dir = query.sortDir === 'desc' ? -1 : 1\n const key = query.sortBy\n data = [...data].sort((a, b) => {\n const av = prop(a, key)\n const bv = prop(b, key)\n if (typeof av === 'number' && typeof bv === 'number') return (av - bv) * dir\n return String(av ?? '').localeCompare(String(bv ?? ''), 'pt-BR') * dir\n })\n }\n\n const total = data.length\n const page = query.page ?? 1\n const size = query.pageSize ?? total\n return { data: data.slice((page - 1) * size, page * size), total }\n}\n","import type { CrudQuery, CrudResult, DataProvider } from '@fayz-ai/core'\nimport type { CreateShippingZoneInput, ShippingZone, UpdateShippingZoneInput } from '@fayz-ai/shop'\nimport { applyQuery, resolve, type ShopProviderResolver } from './shared'\n\n/**\n * Delivery zones CRUD.\n *\n * The form takes CEPs however the merchant types them ('22.041-001', '22041001')\n * and the provider normalises to the 8 bare digits shipping_zones compares on —\n * asking a shop owner to strip punctuation is how a range silently stops\n * matching and a whole city stops being served.\n */\nexport function createShopShippingZoneDataProvider(\n provider: ShopProviderResolver,\n): DataProvider<ShippingZone> {\n const shop = () => {\n const p = resolve(provider)\n if (!p.listShippingZones) {\n throw new Error('Este provider de loja não suporta zonas de entrega.')\n }\n return p\n }\n\n return {\n async list(query: CrudQuery): Promise<CrudResult<ShippingZone>> {\n const rows = await shop().listShippingZones!()\n const term = query.search?.trim().toLowerCase()\n const filtered = term\n ? rows.filter((z) =>\n z.name.toLowerCase().includes(term) || (z.carrier ?? '').toLowerCase().includes(term))\n : rows\n return applyQuery(filtered, query)\n },\n\n async create(data): Promise<ShippingZone> {\n return shop().createShippingZone!(data as unknown as CreateShippingZoneInput)\n },\n\n async update(id: string, data: Partial<ShippingZone>): Promise<ShippingZone> {\n // tenantId is set from the session on the server side; never from the form.\n const { id: _id, tenantId: _tenant, ...patch } = data\n return shop().updateShippingZone!(id, patch as UpdateShippingZoneInput)\n },\n\n async remove(id: string): Promise<void> {\n await shop().deleteShippingZone!(id)\n },\n }\n}\n","import type { CrudQuery, CrudResult, DataProvider } from '@fayz-ai/core'\nimport type {\n CreateShippingProfileInput, ShippingProfile, UpdateShippingProfileInput,\n} from '@fayz-ai/shop'\nimport { applyQuery, resolve, type ShopProviderResolver } from './shared'\n\n/**\n * The gateway permission is three-state and a checkbox is two: `undefined` means\n * \"inherit the store\", not \"refuse a carrier\". Collapsing them would make every\n * new profile start refusing freight.\n */\nexport type GatewayChoice = 'inherit' | 'allow' | 'deny'\n\nexport function gatewayChoiceOf(profile: { carrierQuotes?: boolean }): GatewayChoice {\n if (profile.carrierQuotes === undefined) return 'inherit'\n return profile.carrierQuotes ? 'allow' : 'deny'\n}\n\nfunction carrierQuotesOf(choice: unknown): boolean | undefined {\n if (choice === 'allow') return true\n if (choice === 'deny') return false\n return undefined\n}\n\n/** The row plus the select's own key. */\ntype ProfileRow = ShippingProfile & { gateway?: GatewayChoice }\n\nconst withGateway = (profile: ShippingProfile): ProfileRow =>\n ({ ...profile, gateway: gatewayChoiceOf(profile) })\n\nexport function createShopShippingProfileDataProvider(\n provider: ShopProviderResolver,\n): DataProvider<ProfileRow> {\n const shop = () => {\n const p = resolve(provider)\n if (!p.listShippingProfiles) {\n throw new Error('Este provider de loja não suporta perfis de entrega.')\n }\n return p\n }\n\n const toInput = (data: Partial<ProfileRow>): UpdateShippingProfileInput => {\n const { id: _id, tenantId: _tenant, gateway, ...rest } = data\n return {\n ...rest,\n // Only when the form rendered the select, so a partial patch cannot reset it.\n ...(gateway !== undefined ? { carrierQuotes: carrierQuotesOf(gateway) } : {}),\n }\n }\n\n return {\n async list(query: CrudQuery): Promise<CrudResult<ProfileRow>> {\n const rows = (await shop().listShippingProfiles!()).map(withGateway)\n const term = query.search?.trim().toLowerCase()\n const filtered = term ? rows.filter((p) => p.name.toLowerCase().includes(term)) : rows\n return applyQuery(filtered, query)\n },\n\n async create(data): Promise<ProfileRow> {\n const input = toInput(data as Partial<ProfileRow>) as CreateShippingProfileInput\n return withGateway(await shop().createShippingProfile!(input))\n },\n\n async update(id: string, data: Partial<ProfileRow>): Promise<ProfileRow> {\n return withGateway(await shop().updateShippingProfile!(id, toInput(data)))\n },\n\n async remove(id: string): Promise<void> {\n await shop().deleteShippingProfile!(id)\n },\n }\n}\n","import type { CrudQuery, CrudResult, DataProvider } from '@fayz-ai/core'\nimport type {\n CreateStockLocationInput, StockLocation, UpdateStockLocationInput,\n} from '@fayz-ai/shop'\nimport { applyQuery, resolve, type ShopProviderResolver } from './shared'\n\n/**\n * The places the store ships from, as a registry.\n *\n * `dataProvider` rather than `data.table`: the same rows carry the stock ledger,\n * so the postcode has to reach the column as 8 bare digits (0058's CHECK), and\n * \"is the default\" is a partial unique index the write has to clear first. A\n * generic table write would hit both as raw Postgres errors.\n */\nexport function createShopStockLocationDataProvider(\n provider: ShopProviderResolver,\n): DataProvider<StockLocation> {\n const shop = () => {\n const p = resolve(provider)\n if (!p.listStockLocations) {\n throw new Error('Este provider de loja não suporta locais de estoque.')\n }\n return p\n }\n\n return {\n async list(query: CrudQuery): Promise<CrudResult<StockLocation>> {\n const rows = await shop().listStockLocations!()\n const term = query.search?.trim().toLowerCase()\n const filtered = term\n ? rows.filter((l) =>\n l.name.toLowerCase().includes(term) || (l.city ?? '').toLowerCase().includes(term))\n : rows\n return applyQuery(filtered, query)\n },\n\n async create(data): Promise<StockLocation> {\n return shop().createStockLocation!(toInput(data) as CreateStockLocationInput)\n },\n\n async update(id: string, data: Partial<StockLocation>): Promise<StockLocation> {\n return shop().updateStockLocation!(id, toInput(data))\n },\n\n async remove(id: string): Promise<void> {\n await shop().deleteStockLocation!(id)\n },\n }\n}\n\n/** Server-owned columns never travel from a form. */\nfunction toInput(data: Partial<StockLocation>): UpdateStockLocationInput {\n const {\n id: _id, tenantId: _tenant, createdAt: _created, updatedAt: _updated, ...rest\n } = data\n return rest\n}\n","import React from 'react'\nimport { useConnectors } from '@fayz-ai/admin'\nimport { OWN_FULFILLMENT } from '@fayz-ai/shop'\n\n/**\n * Who ships from this location. Three-state, and the empty option is named:\n * \"segue a loja\" is a real answer, different from \"eu mesmo despacho\" — the\n * first follows whatever Entrega decides later, the second never asks a gateway.\n *\n * A gateway that is declared but not yet connected is still offered: deciding\n * in advance is the point of the field, and the row says it is not connected.\n */\nexport function FulfillmentProviderSelect({ value, onChange }: {\n value: string | null\n onChange: (next: string | null) => void\n}) {\n const { connectors } = useConnectors({ hostPluginId: 'shop', includeGrants: false })\n const carriers = React.useMemo(\n () => (connectors ?? []).filter((c) => c.category === 'logistics' || c.category === 'shipping'),\n [connectors],\n )\n const chosen = carriers.find((c) => c.slug === value) ?? null\n\n return (\n <div className=\"space-y-1.5\">\n <select\n value={value ?? ''}\n onChange={(event) => onChange(event.target.value || null)}\n className=\"flex h-9 w-full rounded-input border border-input bg-background px-3 py-1.5 text-sm shadow-sm focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring\"\n >\n <option value=\"\">Segue a decisão da loja</option>\n <option value={OWN_FULFILLMENT}>Eu mesmo despacho — carro, motoboy, agência</option>\n {carriers.map((connector) => (\n <option key={connector.slug} value={connector.slug}>\n {connector.name}\n {connector.state === 'ready' ? ' — ainda não conectado' : ''}\n </option>\n ))}\n </select>\n\n <p className=\"text-xs text-muted-foreground\">\n {value === OWN_FULFILLMENT\n ? 'Nenhum gateway é consultado para o que sai daqui.'\n : chosen\n ? chosen.state === 'ready'\n ? `Fica registrado. ${chosen.name} só cota depois de conectado em Entrega.`\n : `${chosen.name} cota o frete do que sai daqui.`\n : 'Usa o que estiver escolhido em Entrega → Quem calcula o frete.'}\n </p>\n </div>\n )\n}\n","import React from 'react'\nimport { AgencySelect } from '../views/AgencySelect'\nimport type { EntityDef, PluginRegistryDef } from '@fayz-ai/core'\nimport { buildShopShippingZoneEntity } from '../views/shippingZoneEntity'\nimport { createShopShippingZoneDataProvider } from './shippingZoneDataProvider'\nimport { createShopShippingProfileDataProvider } from './shippingProfileDataProvider'\nimport { createShopStockLocationDataProvider } from './stockLocationDataProvider'\nimport { FulfillmentProviderSelect } from '../views/FulfillmentProviderSelect'\nimport { OWN_FULFILLMENT } from '@fayz-ai/shop'\nimport type { ShopProviderResolver } from './shared'\n\n// ---------------------------------------------------------------------------\n// Os cadastros da loja, declarados em vez de escritos.\n//\n// A tela de embalagens nasceu como ~230 linhas de CRUD à mão — lista, form,\n// estados de carregando/erro, botões — que é exatamente o que\n// `PluginRegistryDef` existe para não precisar. O shell já sabe listar, criar,\n// editar, excluir e buscar a partir de um EntityDef, e o lojista já aprendeu\n// essa tela em feriados, locais e categorias. Um CRUD próprio é uma segunda\n// interface para o mesmo verbo.\n// ---------------------------------------------------------------------------\n\n// URL segments, so named rather than inlined: renaming one left a `=== 'zonas'`\n// on the other side of the screen pointing at the wrong registry, silently.\nexport const SHIPPING_PROFILES_REGISTRY = 'shipping-profiles'\nexport const SHIPPING_ZONES_REGISTRY = 'shipping-zones'\nexport const PACKAGES_REGISTRY = 'packages'\nexport const LOCATIONS_REGISTRY = 'locations'\n\n/** `22 × 13.7 × 4.2 cm, 0 kg` — o formato do print, e do rótulo do seletor. */\nexport function packageMeasureLabel(row: {\n heightCm?: unknown\n widthCm?: unknown\n lengthCm?: unknown\n emptyWeightGrams?: unknown\n}): string {\n const dim = [row.heightCm, row.widthCm, row.lengthCm].map((v) => trim(Number(v) || 0))\n // Gramas viram kg aqui e só aqui: a coluna é `empty_weight_grams` porque\n // ninguém digita 0,34 para uma caixa, mas o frete se lê em kg.\n const kg = trim((Number(row.emptyWeightGrams) || 0) / 1000)\n return `${dim.join(' × ')} cm, ${kg} kg`\n}\n\nfunction trim(value: number): string {\n return String(Number(value.toFixed(2)))\n}\n\nconst packageEntity: EntityDef = {\n name: 'Embalagem',\n namePlural: 'Embalagens',\n icon: 'Box',\n displayField: 'name',\n defaultSort: 'name',\n defaultSortDir: 'asc',\n fields: [\n {\n key: 'name', label: 'Nome', type: 'text', required: true, searchable: true, showInTable: true,\n placeholder: 'Caixa P',\n // Nome, medidas e o selo do padrão numa célula só: é o cartão do print\n // desenhado com o que a tabela genérica já sabe renderizar, em vez de uma\n // lista especial ao lado da lista que todo o resto do admin usa.\n renderCell: (_v, row: any) => React.createElement(\n 'div',\n { className: 'flex items-center gap-3' },\n React.createElement('span', {\n className: 'flex h-8 w-8 shrink-0 items-center justify-center rounded-md bg-muted text-muted-foreground',\n }, '▢'),\n React.createElement(\n 'div',\n { className: 'min-w-0' },\n React.createElement(\n 'p',\n { className: 'flex items-center gap-2 truncate font-medium' },\n row.name,\n row.isDefault\n ? React.createElement('span', {\n className: 'rounded-full bg-primary/10 px-2 py-0.5 text-[10px] font-medium text-primary',\n }, 'Padrão da loja')\n : null,\n ),\n React.createElement('p', { className: 'text-xs text-muted-foreground' }, packageMeasureLabel(row)),\n ),\n ),\n },\n {\n key: 'kind', label: 'Tipo', type: 'select', group: 'shape', defaultValue: 'box', showInTable: false,\n // Muda o preço na transportadora, não só o rótulo na tela: envelope e\n // pacote mole têm tabela própria em vários serviços.\n hint: 'Envelope e pacote mole têm tabela de preço própria em várias transportadoras.',\n options: [\n { label: 'Caixa', value: 'box' },\n { label: 'Envelope', value: 'envelope' },\n { label: 'Pacote mole', value: 'soft' },\n ],\n },\n { key: 'heightCm', label: 'Altura (cm)', type: 'number', group: 'shape', required: true, min: 0, placeholder: '4,2' },\n { key: 'widthCm', label: 'Largura (cm)', type: 'number', group: 'shape', required: true, min: 0, placeholder: '13,7' },\n { key: 'lengthCm', label: 'Comprimento (cm)', type: 'number', group: 'shape', required: true, min: 0, placeholder: '22' },\n {\n key: 'emptyWeightGrams', label: 'Peso vazia (g)', type: 'number', group: 'shape', min: 0, defaultValue: 0,\n // Zero é um valor legítimo e não «não preenchido»: um envelope pesa nada\n // que mude a faixa, e a tela precisa saber dizer isso.\n hint: 'Quanto a embalagem pesa vazia. Zero é uma resposta — entra na conta do frete.',\n },\n {\n key: 'isDefault', label: 'Padrão da loja', type: 'boolean', group: 'policy', inlineToggle: true,\n hint: 'A caixa em que o pedido cai quando algum item não tem medida. Só uma por loja.',\n },\n { key: 'active', label: 'Ativa', type: 'boolean', group: 'policy', defaultValue: true, inlineToggle: true },\n ],\n fieldGroups: [\n { id: 'shape', label: 'Medidas', description: 'Medidas internas, em centímetros.', columns: 3 },\n { id: 'policy', label: 'Uso', columns: 2 },\n ],\n data: {\n table: 'plg_shop_packages',\n tenantScoped: true,\n },\n}\n\nexport const packagesRegistry: PluginRegistryDef = {\n id: PACKAGES_REGISTRY,\n entity: packageEntity,\n icon: 'Box',\n description:\n 'Em que caixas a loja embala. A cotação escolhe a menor em que o pedido cabe e soma o peso dela vazia; ' +\n 'quando o produto aponta uma embalagem, é ela que manda. Sem nenhuma cadastrada, o frete sai no piso da transportadora.',\n}\n\n/**\n * As zonas, como registry — mesmo cadastro, dentro de Configurações.\n *\n * Antes era uma página de CRUD própria em /store/shipping, e clicar em \"Zonas de\n * entrega\" tirava o lojista de Configurações no meio de configurar a entrega.\n *\n * `dataProvider` NÃO é preguiça de declarar `data.table`: `shipping_zones` é\n * lida em caminho quente por `shop_quote_shipping` (0044b) comparando CEP como 8\n * dígitos puros, e é o provider da loja que normaliza '22.041-001' antes de\n * gravar. Um write genérico guardaria a pontuação e uma cidade inteira pararia\n * de casar com a faixa, sem erro em lugar nenhum.\n */\nexport function buildShippingZonesRegistry(\n provider: ShopProviderResolver,\n currency = 'BRL',\n): PluginRegistryDef {\n return {\n id: SHIPPING_ZONES_REGISTRY,\n entity: buildShopShippingZoneEntity(currency) as unknown as EntityDef,\n icon: 'MapPin',\n description:\n 'Faixas de CEP com preço, prazo e frete grátis próprios. Um CEP fora de todas as zonas cai no preço base; ' +\n 'sem preço base e sem zona que o cubra, o checkout diz que não entrega ali.',\n dataProvider: createShopShippingZoneDataProvider(provider) as never,\n }\n}\n\n\n/**\n * Shipping profiles (0049) — groups of products with their own zones.\n *\n * `dataProvider` for the same reason the zones have one: the gateway permission is\n * three-state and a checkbox is two.\n */\nexport function buildShippingProfilesRegistry(\n provider: ShopProviderResolver,\n): PluginRegistryDef {\n const entity: EntityDef = {\n name: 'Perfil de entrega',\n namePlural: 'Perfis de entrega',\n icon: 'Layers',\n displayField: 'name',\n defaultSort: 'name',\n defaultSortDir: 'asc',\n fields: [\n {\n key: 'name', label: 'Nome', type: 'text', required: true, searchable: true, showInTable: true,\n placeholder: 'Refrigerados',\n hint: 'Como você chama esse grupo de produtos. Aparece na ficha do produto.',\n renderCell: (_v, row: any) => React.createElement(\n 'div',\n { className: 'min-w-0' },\n React.createElement(\n 'p',\n { className: 'flex items-center gap-2 truncate font-medium' },\n row.name,\n row.isDefault\n ? React.createElement('span', {\n className: 'rounded-full bg-primary/10 px-2 py-0.5 text-[10px] font-medium text-primary',\n }, 'Geral')\n : null,\n ),\n React.createElement(\n 'p',\n { className: 'text-xs text-muted-foreground' },\n row.gateway === 'deny'\n ? 'Só pelas suas zonas — transportadora não cota'\n : row.gateway === 'allow'\n ? 'Transportadora pode cotar'\n : 'Segue a decisão da loja',\n ),\n ),\n },\n {\n key: 'gateway', label: 'Transportadora', type: 'select', defaultValue: 'inherit', showInTable: false,\n hint: 'Escolha «não cota» para produtos que só saem pela sua própria entrega — refrigerados, frágeis, sob encomenda.',\n options: [\n { label: 'Segue a decisão da loja', value: 'inherit' },\n { label: 'Pode cotar', value: 'allow' },\n { label: 'Não cota — só minhas zonas', value: 'deny' },\n ],\n },\n {\n key: 'isDefault', label: 'É o perfil geral', type: 'boolean', inlineToggle: true, showInTable: false,\n hint: 'O perfil de todo produto que ninguém moveu. Só um por loja.',\n },\n ],\n data: {\n table: 'plg_shop_shipping_profiles',\n tenantScoped: true,\n },\n }\n\n return {\n id: SHIPPING_PROFILES_REGISTRY,\n entity,\n icon: 'Layers',\n description:\n 'Grupos de produtos com zonas próprias. Um produto sem perfil usa o geral. ' +\n 'Um perfil com a transportadora desligada é como se diz «isto só sai na minha entrega».',\n dataProvider: createShopShippingProfileDataProvider(provider) as never,\n }\n}\n\n/**\n * Where the store ships FROM (0058) — the warehouses, as a registry.\n *\n * These are the plg_shop_stock_locations rows the ledger already used, which is\n * why this replaces the core \"Localizações\" tab for a store rather than adding a\n * second list: the row that holds the stock is the row that dispatches. The\n * address lives here so a merchant types the origin CEP once, in the place that\n * has it, instead of a second time inside the Melhor Envio form.\n */\nexport function buildStockLocationsRegistry(\n provider: ShopProviderResolver,\n): PluginRegistryDef {\n const entity: EntityDef = {\n name: 'Local',\n namePlural: 'Locais',\n icon: 'Warehouse',\n displayField: 'name',\n defaultSort: 'name',\n defaultSortDir: 'asc',\n fields: [\n {\n key: 'name', label: 'Nome', type: 'text', required: true, searchable: true, showInTable: true,\n placeholder: 'Estoque principal',\n renderCell: (_v, row: any) => React.createElement(\n 'div',\n { className: 'min-w-0' },\n React.createElement(\n 'p',\n { className: 'flex items-center gap-2 truncate font-medium' },\n row.name,\n row.isDefault\n ? React.createElement('span', {\n className: 'rounded-full bg-primary/10 px-2 py-0.5 text-[10px] font-medium text-primary',\n }, 'Padrão')\n : null,\n row.shipsOnline === false\n ? React.createElement('span', {\n className: 'rounded-full bg-muted px-2 py-0.5 text-[10px] text-muted-foreground',\n }, 'Não despacha')\n : null,\n ),\n React.createElement(\n 'p',\n { className: 'text-xs text-muted-foreground' },\n locationSummary(row),\n ),\n ),\n },\n {\n key: 'kind', label: 'Tipo', type: 'select', group: 'place', defaultValue: 'store',\n hint: 'Em trânsito é estoque em movimento: existe, mas não pode ser prometido a um comprador.',\n options: [\n { label: 'Loja', value: 'store' },\n { label: 'Depósito', value: 'warehouse' },\n { label: 'Em trânsito', value: 'transit' },\n { label: 'Virtual', value: 'virtual' },\n ],\n },\n {\n key: 'postalCode', label: 'CEP de origem', type: 'text', group: 'place', required: false,\n placeholder: '20000-000',\n hint: 'De onde o pacote sai. É este CEP que a transportadora usa para calcular o frete.',\n },\n { key: 'city', label: 'Cidade', type: 'text', group: 'place' },\n { key: 'state', label: 'UF', type: 'text', group: 'place' },\n { key: 'street', label: 'Rua', type: 'text', group: 'place', span: 2, placeholder: 'Rua Tal' },\n // A carrier refuses a label whose sender is a postcode. These are what it\n // asks for on top of one — filled once, printed on every etiqueta.\n { key: 'number', label: 'Número', type: 'text', group: 'place', placeholder: '123' },\n { key: 'district', label: 'Bairro', type: 'text', group: 'place' },\n { key: 'complement', label: 'Complemento', type: 'text', group: 'place', placeholder: 'sala 4' },\n // Goes printed on the label, and is what the carrier checks.\n { key: 'document', label: 'CNPJ ou CPF do remetente', type: 'text', group: 'place' },\n { key: 'phone', label: 'Telefone', type: 'text', group: 'place' },\n { key: 'email', label: 'E-mail', type: 'text', group: 'place' },\n {\n key: 'fulfillmentProvider', label: 'Quem despacha daqui', type: 'custom', group: 'dispatch', span: 2,\n showInTable: false,\n renderInput: ({ value, onChange }) => React.createElement(FulfillmentProviderSelect, {\n value: (value as string | null) ?? null,\n onChange,\n }),\n },\n {\n key: 'carrierAgencies', label: 'Agência de postagem', type: 'custom', group: 'dispatch', span: 2,\n showInTable: false,\n renderInput: ({ value, onChange, values }) => React.createElement(AgencySelect, {\n value: value as never,\n onChange,\n values: values as Record<string, unknown>,\n provider: () => (typeof provider === 'function' ? provider() : provider),\n }),\n },\n {\n key: 'shipsOnline', label: 'Despacha pedidos da loja', type: 'boolean', group: 'dispatch',\n defaultValue: true, inlineToggle: true,\n hint: 'Desligue para um local que só guarda estoque.',\n },\n {\n key: 'isSellable', label: 'Estoque vendável', type: 'boolean', group: 'dispatch',\n defaultValue: true, inlineToggle: true,\n hint: 'O que está aqui pode ser prometido a um comprador.',\n },\n {\n key: 'isDefault', label: 'Local padrão', type: 'boolean', group: 'dispatch', inlineToggle: true,\n hint: 'Onde o estoque cai quando ninguém escolhe. Só um por loja.',\n },\n {\n key: 'status', label: 'Situação', type: 'select', group: 'dispatch', defaultValue: 'active',\n options: [\n { label: 'Ativo', value: 'active' },\n { label: 'Arquivado', value: 'archived' },\n ],\n },\n ],\n fieldGroups: [\n { id: 'place', label: 'Onde é', columns: 2 },\n { id: 'dispatch', label: 'O que sai daqui', columns: 2 },\n ],\n data: {\n table: 'plg_shop_stock_locations',\n tenantScoped: true,\n },\n }\n\n return {\n id: LOCATIONS_REGISTRY,\n entity,\n icon: 'Warehouse',\n description:\n 'De onde os pedidos saem. O CEP daqui é a origem que a transportadora usa para cotar o frete, ' +\n 'e cada local pode ter seu próprio despachante — ou seguir a decisão da loja.',\n dataProvider: createShopStockLocationDataProvider(provider) as never,\n }\n}\n\n/** `Rio de Janeiro · 20000-000 · Melhor Envio` — whatever the merchant filled. */\nexport function locationSummary(row: {\n city?: unknown\n state?: unknown\n postalCode?: unknown\n fulfillmentProvider?: unknown\n}): string {\n const where = [row.city, row.state].filter(Boolean).join('/')\n const cep = typeof row.postalCode === 'string' && row.postalCode.length === 8\n ? `${row.postalCode.slice(0, 5)}-${row.postalCode.slice(5)}`\n : null\n const who = row.fulfillmentProvider === OWN_FULFILLMENT\n ? 'você mesmo despacha'\n : typeof row.fulfillmentProvider === 'string' && row.fulfillmentProvider\n ? row.fulfillmentProvider\n : null\n const parts = [where || null, cep, who].filter(Boolean)\n return parts.length ? parts.join(' · ') : 'Sem endereço — a transportadora não consegue cotar'\n}\n\nexport function buildShopRegistries(\n provider: ShopProviderResolver,\n currency = 'BRL',\n): PluginRegistryDef[] {\n // Screen order: where it leaves from, the group, its ranges, then the box.\n return [\n buildStockLocationsRegistry(provider),\n buildShippingProfilesRegistry(provider),\n buildShippingZonesRegistry(provider, currency),\n packagesRegistry,\n ]\n}\n","import type { Product } from '@fayz-ai/shop'\n\n// ---------------------------------------------------------------------------\n// Do que a pessoa escreveu para o que a loja tem cadastrado.\n//\n// Duas telas fazem a mesma pergunta por motivos diferentes: o balcão está\n// montando um pedido a partir de uma mensagem de WhatsApp, e o estoque está\n// lançando uma nota de entrada — e as duas recebem PALAVRAS (\"costela suína\",\n// \"3 pork ribs\") onde o banco quer um id. A régua de confiança tem de ser a\n// mesma nas duas, ou o mesmo termo resolve num lugar e pergunta no outro.\n// ---------------------------------------------------------------------------\n\n/** \"Costela Suína\" e \"costela suina\" são a mesma coisa para quem digita correndo. */\nfunction normalize(value: string): string {\n return value\n .normalize('NFD')\n .replace(/[\\u0300-\\u036f]/gu, '')\n .toLowerCase()\n .replace(/[^a-z0-9\\s]/gu, ' ')\n .replace(/\\s+/gu, ' ')\n .trim()\n}\n\nconst tokensOf = (value: string): string[] => normalize(value).split(' ').filter(Boolean)\n\n/**\n * Quão bem este produto responde a este termo, de 0 (não responde) a 100.\n *\n * Ordem de confiança: o SKU escrito por extenso, o nome exato, o nome que\n * contém o termo inteiro, e por último a fração de palavras em comum — que é o\n * que salva \"costela com queijo\" quando o catálogo diz \"Costela Suína com\n * Queijo\". Abaixo de metade das palavras não é candidato, é ruído.\n */\nexport function scoreProduct(term: string, product: Product): number {\n const wanted = normalize(term)\n if (!wanted) return 0\n const name = normalize(product.name)\n const sku = normalize(product.sku ?? '')\n if (sku && sku === wanted) return 100\n if (name === wanted) return 98\n if (name.includes(wanted)) return 85\n if (wanted.includes(name) && name.length >= 4) return 75\n\n const wantedTokens = tokensOf(term)\n const nameTokens = new Set(tokensOf(product.name))\n if (wantedTokens.length === 0) return 0\n const hit = wantedTokens.filter((t) => nameTokens.has(t)).length\n const ratio = hit / wantedTokens.length\n if (ratio < 0.5) return 0\n return Math.round(40 + ratio * 30)\n}\n\nexport interface ProductCandidate {\n productId: string\n name: string\n sku: string | null\n price: number\n stock: number\n score: number\n variants?: Array<{ variantId: string; options: Record<string, string>; price: number; stock: number }>\n}\n\n/** Os candidatos de um termo, do melhor para o pior. */\nexport function rankProducts(term: string, catalog: Product[], limit = 5): ProductCandidate[] {\n return catalog\n .map((product) => ({ product, score: scoreProduct(term, product) }))\n .filter((row) => row.score > 0)\n // Empate de nota é empate de verdade — \"costela suína\" serve o defumado e o\n // com queijo. O nome mais curto vem primeiro só para a ordem ser estável; o\n // que resolve é o agente ver as duas notas iguais e perguntar.\n .sort((a, b) =>\n b.score - a.score\n || a.product.name.length - b.product.name.length\n || a.product.name.localeCompare(b.product.name))\n .slice(0, limit)\n .map(({ product, score }) => ({\n productId: product.id,\n name: product.name,\n sku: product.sku,\n price: product.price,\n stock: product.inventoryCount ?? 0,\n score,\n }))\n}\n\n/**\n * Quando o topo está folgado o bastante para dispensar a pergunta.\n *\n * \"Pork Ribs\" trouxe três linhas — a costela inteira em 85, e a meia costela e\n * a copa lombo em 55, que só compartilham UMA das duas palavras. Devolver as\n * três com as suas notas e pedir ao modelo que comparasse fez ele perguntar,\n * porque três linhas na tela parecem uma dúvida. Quem decide isto é código: a\n * mesma entrada dá sempre a mesma resposta, e a régua fica escrita num lugar só.\n *\n * Empate de verdade continua sendo pergunta — \"costela suína\" serve o defumado\n * e o com queijo com a MESMA nota, e escolher por conta ali seria vender o\n * produto errado calado.\n */\nconst CONFIDENT_SCORE = 70\nconst CONFIDENT_GAP = 15\n\nexport interface TermResolution {\n term: string\n /** O produto, quando não há dúvida honesta. */\n resolved?: ProductCandidate\n /** Os candidatos, quando há. Vira a pergunta na tela. */\n options?: ProductCandidate[]\n}\n\nexport function resolveTerm(term: string, catalog: Product[]): TermResolution {\n const ranked = rankProducts(term, catalog)\n const [top, second] = ranked\n if (!top) return { term }\n if (top.score >= CONFIDENT_SCORE && (!second || top.score - second.score >= CONFIDENT_GAP)) {\n return { term, resolved: top }\n }\n // Só quem DISPUTA entra na pergunta. \"costela suína\" trazia junto o arroz de\n // costela, 30 pontos atrás, e uma opção que ninguém escolheria só faz o\n // lojista ler mais para decidir a mesma coisa.\n return { term, options: ranked.filter((c) => top.score - c.score < CONFIDENT_GAP) }\n}\n\nexport const money = (value: number) =>\n new Intl.NumberFormat('pt-BR', { style: 'currency', currency: 'BRL' }).format(Number(value) || 0)\n\n/** A linha sob o nome: o que distingue uma costela da outra na hora de escolher. */\nexport const candidateMeta = (candidate: ProductCandidate): string =>\n [money(candidate.price), candidate.stock > 0 ? `${candidate.stock} em estoque` : 'sem estoque']\n .join(' · ')\n"]}
|
|
@@ -1,9 +0,0 @@
|
|
|
1
|
-
export { blingConnectorDef, blingConnectionStore } from './connectorDef';
|
|
2
|
-
export { BLING_CONNECTOR_ID, BLING_RATE_LIMIT, BLING_MAX_WINDOW_MS, BLING_WINDOW_OVERLAP_MS, BLING_TOKEN_LEAD_MS, BLING_PAGE_SIZE, BLING_SAMPLE_SIZE, BLING_SIGNATURE_HEADER, BLING_WEBHOOK_DEADLINE_MS, } from './limits';
|
|
3
|
-
export { toMirroredProduct } from './mapping';
|
|
4
|
-
export { pullProducts, sampleProducts, firstWindow, windowFor } from './sync';
|
|
5
|
-
export type { PullProductsOptions, PullProductsResult, BlingPageRequest, BlingProductPage } from './sync';
|
|
6
|
-
export { routeCallback, orphanConnection, acceptWebhook, BLING_MARKETPLACE_SOURCE, } from './inbound';
|
|
7
|
-
export type { BlingCallback, CallbackRoute, WebhookRequest, WebhookVerdict, AcceptWebhookOptions } from './inbound';
|
|
8
|
-
export type { BlingProduto, BlingSettings, MirroredProduct } from './types';
|
|
9
|
-
//# sourceMappingURL=index.d.ts.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/integrations/bling/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,iBAAiB,EAAE,oBAAoB,EAAE,MAAM,gBAAgB,CAAA;AACxE,OAAO,EACL,kBAAkB,EAClB,gBAAgB,EAChB,mBAAmB,EACnB,uBAAuB,EACvB,mBAAmB,EACnB,eAAe,EACf,iBAAiB,EACjB,sBAAsB,EACtB,yBAAyB,GAC1B,MAAM,UAAU,CAAA;AACjB,OAAO,EAAE,iBAAiB,EAAE,MAAM,WAAW,CAAA;AAC7C,OAAO,EAAE,YAAY,EAAE,cAAc,EAAE,WAAW,EAAE,SAAS,EAAE,MAAM,QAAQ,CAAA;AAC7E,YAAY,EAAE,mBAAmB,EAAE,kBAAkB,EAAE,gBAAgB,EAAE,gBAAgB,EAAE,MAAM,QAAQ,CAAA;AACzG,OAAO,EACL,aAAa,EACb,gBAAgB,EAChB,aAAa,EACb,wBAAwB,GACzB,MAAM,WAAW,CAAA;AAClB,YAAY,EAAE,aAAa,EAAE,aAAa,EAAE,cAAc,EAAE,cAAc,EAAE,oBAAoB,EAAE,MAAM,WAAW,CAAA;AACnH,YAAY,EAAE,YAAY,EAAE,aAAa,EAAE,eAAe,EAAE,MAAM,SAAS,CAAA"}
|
|
@@ -1,8 +0,0 @@
|
|
|
1
|
-
export { neoChefConnectorDef, neoChefConnectionStore } from './connectorDef';
|
|
2
|
-
export { NEOCHEF_CONNECTOR_ID, NEOCHEF_RATE_LIMIT, NEOCHEF_PAGE_SIZE, NEOCHEF_SAMPLE_SIZE, NEOCHEF_CURSOR_OVERLAP_MS, NEOCHEF_TOKEN_LEAD_MS, } from './limits';
|
|
3
|
-
export { toMirroredNeoChefProduct, toNeoChefOrder, advanceNeoChefCursor } from './mapping';
|
|
4
|
-
export { NEOCHEF_MARK } from './mark';
|
|
5
|
-
export { NEOCHEF_FUNCTION, pullCatalogue, pushOrders, reconcile, testNeoChef, pendingOrders, listOrderDeliveries, } from './data';
|
|
6
|
-
export type { NeoChefPullResult, NeoChefPushResult } from './data';
|
|
7
|
-
export type { NeoChefProductRow, NeoChefOrderRow, NeoChefSettings, MirroredNeoChefProduct, ShopOrderForNeoChef, } from './types';
|
|
8
|
-
//# sourceMappingURL=index.d.ts.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/integrations/neochef/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,mBAAmB,EAAE,sBAAsB,EAAE,MAAM,gBAAgB,CAAA;AAC5E,OAAO,EACL,oBAAoB,EACpB,kBAAkB,EAClB,iBAAiB,EACjB,mBAAmB,EACnB,yBAAyB,EACzB,qBAAqB,GACtB,MAAM,UAAU,CAAA;AACjB,OAAO,EAAE,wBAAwB,EAAE,cAAc,EAAE,oBAAoB,EAAE,MAAM,WAAW,CAAA;AAC1F,OAAO,EAAE,YAAY,EAAE,MAAM,QAAQ,CAAA;AACrC,OAAO,EACL,gBAAgB,EAChB,aAAa,EACb,UAAU,EACV,SAAS,EACT,WAAW,EACX,aAAa,EACb,mBAAmB,GACpB,MAAM,QAAQ,CAAA;AACf,YAAY,EAAE,iBAAiB,EAAE,iBAAiB,EAAE,MAAM,QAAQ,CAAA;AAClE,YAAY,EACV,iBAAiB,EACjB,eAAe,EACf,eAAe,EACf,sBAAsB,EACtB,mBAAmB,GACpB,MAAM,SAAS,CAAA"}
|
package/dist/settings/index.d.ts
DELETED
|
@@ -1,12 +0,0 @@
|
|
|
1
|
-
export { useStoreSettings } from './useStoreSettings';
|
|
2
|
-
export type { StoreSettingsHandle } from './useStoreSettings';
|
|
3
|
-
export { SettingsState } from './SettingsState';
|
|
4
|
-
export { errorMessage } from './error-message';
|
|
5
|
-
export { StoreGeneralSettings } from './StoreGeneralSettings';
|
|
6
|
-
export { PaymentsSettings } from './PaymentsSettings';
|
|
7
|
-
export { CheckoutSettings } from './CheckoutSettings';
|
|
8
|
-
export { ShippingSettings } from './ShippingSettings';
|
|
9
|
-
export { PackagesSettings } from './PackagesSettings';
|
|
10
|
-
export { HandlingSettings } from './HandlingSettings';
|
|
11
|
-
export { FulfillmentSettings } from './FulfillmentSettings';
|
|
12
|
-
//# sourceMappingURL=index.d.ts.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/settings/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,gBAAgB,EAAE,MAAM,oBAAoB,CAAA;AACrD,YAAY,EAAE,mBAAmB,EAAE,MAAM,oBAAoB,CAAA;AAC7D,OAAO,EAAE,aAAa,EAAE,MAAM,iBAAiB,CAAA;AAC/C,OAAO,EAAE,YAAY,EAAE,MAAM,iBAAiB,CAAA;AAC9C,OAAO,EAAE,oBAAoB,EAAE,MAAM,wBAAwB,CAAA;AAC7D,OAAO,EAAE,gBAAgB,EAAE,MAAM,oBAAoB,CAAA;AACrD,OAAO,EAAE,gBAAgB,EAAE,MAAM,oBAAoB,CAAA;AACrD,OAAO,EAAE,gBAAgB,EAAE,MAAM,oBAAoB,CAAA;AACrD,OAAO,EAAE,gBAAgB,EAAE,MAAM,oBAAoB,CAAA;AACrD,OAAO,EAAE,gBAAgB,EAAE,MAAM,oBAAoB,CAAA;AACrD,OAAO,EAAE,mBAAmB,EAAE,MAAM,uBAAuB,CAAA"}
|