@fayz-ai/plugin-shop 0.24.5 → 0.24.7

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (64) hide show
  1. package/dist/CheckoutSettings-GQRYZF6I.js +128 -0
  2. package/dist/CheckoutSettings-GQRYZF6I.js.map +1 -0
  3. package/dist/ContentPage-2PHOZSFZ.js +510 -0
  4. package/dist/ContentPage-2PHOZSFZ.js.map +1 -0
  5. package/dist/DeliveryStoreSettings-L2RXOVB6.js +172 -0
  6. package/dist/DeliveryStoreSettings-L2RXOVB6.js.map +1 -0
  7. package/dist/FulfillmentSettings-PW233UOK.js +61 -0
  8. package/dist/FulfillmentSettings-PW233UOK.js.map +1 -0
  9. package/dist/MarketsSettings-YUEVDLIR.js +19 -0
  10. package/dist/MarketsSettings-YUEVDLIR.js.map +1 -0
  11. package/dist/PaymentsSettings-5CI74TY2.js +318 -0
  12. package/dist/PaymentsSettings-5CI74TY2.js.map +1 -0
  13. package/dist/ProductContentTab-PSNDS7JZ.js +4 -0
  14. package/dist/ProductContentTab-PSNDS7JZ.js.map +1 -0
  15. package/dist/ProductListingTab-55Y5RXU7.js +4 -0
  16. package/dist/ProductListingTab-55Y5RXU7.js.map +1 -0
  17. package/dist/ProductMarketPricesTab-QD2ZXEWL.js +4 -0
  18. package/dist/ProductMarketPricesTab-QD2ZXEWL.js.map +1 -0
  19. package/dist/ShippingSettings-UBTNRBJ4.js +9 -0
  20. package/dist/ShippingSettings-UBTNRBJ4.js.map +1 -0
  21. package/dist/{ShopPage-NUIIWBCB.js → ShopPage-OUV3FITM.js} +21 -7
  22. package/dist/ShopPage-OUV3FITM.js.map +1 -0
  23. package/dist/StoreGeneralSettings-DEZ2CMVG.js +97 -0
  24. package/dist/StoreGeneralSettings-DEZ2CMVG.js.map +1 -0
  25. package/dist/chunk-2MXOKJQO.js +23 -0
  26. package/dist/chunk-2MXOKJQO.js.map +1 -0
  27. package/dist/chunk-4JM32Z7J.js +51 -0
  28. package/dist/chunk-4JM32Z7J.js.map +1 -0
  29. package/dist/chunk-53Y6VLAW.js +132 -0
  30. package/dist/chunk-53Y6VLAW.js.map +1 -0
  31. package/dist/chunk-6V2VAUWP.js +24 -0
  32. package/dist/chunk-6V2VAUWP.js.map +1 -0
  33. package/dist/chunk-FQQMEM26.js +59 -0
  34. package/dist/chunk-FQQMEM26.js.map +1 -0
  35. package/dist/chunk-JYT6BTRE.js +298 -0
  36. package/dist/chunk-JYT6BTRE.js.map +1 -0
  37. package/dist/chunk-MFEOIJI7.js +127 -0
  38. package/dist/chunk-MFEOIJI7.js.map +1 -0
  39. package/dist/chunk-R5CUDFOI.js +61 -0
  40. package/dist/chunk-R5CUDFOI.js.map +1 -0
  41. package/dist/chunk-STHGZWBQ.js +1455 -0
  42. package/dist/chunk-STHGZWBQ.js.map +1 -0
  43. package/dist/{chunk-XV3KZRQX.js → chunk-STZYH32S.js} +9 -140
  44. package/dist/chunk-STZYH32S.js.map +1 -0
  45. package/dist/chunk-TDV3SFXT.js +75 -0
  46. package/dist/chunk-TDV3SFXT.js.map +1 -0
  47. package/dist/chunk-YUG6XQHJ.js +55 -0
  48. package/dist/chunk-YUG6XQHJ.js.map +1 -0
  49. package/dist/data/registry-routes.d.ts.map +1 -1
  50. package/dist/index.d.ts.map +1 -1
  51. package/dist/index.js +129 -3456
  52. package/dist/index.js.map +1 -1
  53. package/dist/settings/ShippingSettings.d.ts.map +1 -1
  54. package/dist/views/EmailTemplatePage.d.ts.map +1 -1
  55. package/dist/views/EmailsPage.d.ts.map +1 -1
  56. package/dist/views/OrderDeliveryPanel.d.ts +3 -1
  57. package/dist/views/OrderDeliveryPanel.d.ts.map +1 -1
  58. package/dist/views/OrderDetailView.d.ts.map +1 -1
  59. package/dist/views/ProductContentTab.d.ts.map +1 -1
  60. package/dist/views/ProductMarketPricesTab.d.ts.map +1 -1
  61. package/dist/views/media-links.d.ts.map +1 -1
  62. package/package.json +7 -7
  63. package/dist/ShopPage-NUIIWBCB.js.map +0 -1
  64. package/dist/chunk-XV3KZRQX.js.map +0 -1
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/settings/PackagesSettings.tsx","../src/settings/HandlingSettings.tsx","../src/views/delivery-draft.ts","../src/views/delivery-agent.ts","../src/views/DeliveryAgentSurface.tsx","../src/views/DeliveryAreaPicker.tsx","../src/views/DeliveryRulesDraft.tsx","../src/settings/ShippingSettings.tsx"],"names":["React","jsxs","jsx","React2","React3","draft","text","getShopProvider","Button","Fragment","Input","Loader2","Check","parseMoney","outcomeOf","RegistryCrudView","adminNavigateTo","ArrowRight","SettingsGroup","TextRow","MapPin"],"mappings":"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","file":"chunk-STHGZWBQ.js","sourcesContent":["import React from 'react'\nimport { RegistryCrudView } from '@fayz-ai/admin'\nimport { packagesRegistry, PACKAGES_REGISTRY } from '../data/registries'\nimport { shippingRegistryPath } from '../data/registry-routes'\n\n/**\n * Embalagens — em que caixas a loja embala.\n *\n * É a metade que faltava do frete real. O produto declara o que ele É (peso e\n * medidas, na seção Envio do cadastro) e para onde ele VAI (a embalagem que\n * aponta); esta tela é o cadastro de onde essa escolha sai. Enquanto ela não\n * existia, a caixa da cotação era uma constante no código — 4×16×20cm e 300g\n * para toda loja da plataforma, que é o piso que a Correios aceita e não a\n * medida de nada que alguém vende. O frete cotado e o frete pago divergiam, e a\n * diferença saía da margem do lojista.\n *\n * A LISTA NÃO É DESTE ARQUIVO, e essa é a correção: era um CRUD escrito à mão,\n * com o seu próprio jeito de listar, criar, validar e apagar. Agora é\n * `PluginRegistryDef` + `RegistryCrudView`, o mesmo par que desenha feriados,\n * locais e categorias — uma interface a menos para o lojista aprender e umas\n * duzentas linhas a menos para manter sincronizadas com o resto do admin.\n */\nexport function PackagesSettings({ basePath = shippingRegistryPath(PACKAGES_REGISTRY) }: {\n basePath?: string\n}) {\n return (\n <div className=\"space-y-3\">\n <div className=\"px-1 pt-4\">\n <h3 className=\"text-sm font-semibold\">Embalagens</h3>\n <p className=\"mt-0.5 text-xs text-muted-foreground\">{packagesRegistry.description}</p>\n </div>\n {/* Uma seção entre outras nesta aba: as ações ficam aqui, não na barra. */}\n <RegistryCrudView registry={packagesRegistry} basePath={basePath} embedded />\n </div>\n )\n}\n","import React from 'react'\nimport { SettingsGroup, TextRow, adminNavigateTo } from '@fayz-ai/admin'\nimport { getShopProvider } from '@fayz-ai/shop'\nimport type { ShippingProfile } from '@fayz-ai/shop'\nimport { ArrowRight, Layers } from 'lucide-react'\nimport { resolve, type ShopProviderResolver } from '../data/shared'\nimport type { StoreSettingsHandle } from './useStoreSettings'\nimport { SHIPPING_PROFILES_REGISTRY } from '../data/registries'\nimport { shippingRegistryPath } from '../data/registry-routes'\nimport { Button } from '@fayz-ai/ui'\n\nexport interface HandlingSettingsProps {\n /** The Entrega screen's own settings read, shared rather than repeated. */\n settings: StoreSettingsHandle\n provider?: ShopProviderResolver\n}\n\n/**\n * Shipping profiles, and the handling note that travels with the parcel.\n *\n * Replaces a three-way cold-chain radio: a profile answers refrigerated, fragile,\n * oversized and made-to-order with one mechanism. The note is separate because it\n * does not decide who may carry the box.\n */\nexport function HandlingSettings({ settings, provider }: HandlingSettingsProps) {\n const shop = React.useMemo(() => (provider ? resolve(provider) : getShopProvider()), [provider])\n const { value, set, loading, supported } = settings\n const [noteDraft, setNoteDraft] = React.useState<string | null>(null)\n const [profiles, setProfiles] = React.useState<ShippingProfile[] | null>(null)\n\n React.useEffect(() => {\n let cancelled = false\n void shop.listShippingProfiles?.()\n .then((list) => { if (!cancelled) setProfiles(list) })\n // Silent: a provider without profiles reads the same as a store with none.\n .catch(() => { if (!cancelled) setProfiles([]) })\n return () => { cancelled = true }\n }, [shop])\n\n if (!supported) return null\n\n const storedNote = value.handlingNote ?? ''\n // Null draft = not being edited, so a server answer cannot fight the typing.\n const note = noteDraft ?? storedNote\n const custom = (profiles ?? []).filter((p) => !p.isDefault)\n\n return (\n <div className=\"space-y-4\">\n <div className=\"px-1 pb-1 pt-4\">\n <h3 className=\"flex items-center gap-2 text-sm font-semibold\">\n <Layers className=\"h-4 w-4 shrink-0 text-muted-foreground\" />\n Produtos que vão de outro jeito\n </h3>\n <p className=\"mt-0.5 text-[10px] text-muted-foreground\">\n Um perfil é um grupo de produtos com zonas próprias — refrigerados, frágeis, volumosos, sob\n encomenda. Um perfil com só as suas zonas e o gateway desligado é como se diz «isto não vai\n de transportadora». Produto sem perfil usa o geral, que é o de todos hoje.\n </p>\n </div>\n\n <div className=\"rounded-card border bg-card px-5 shadow-sm\">\n <Button variant=\"bare\" size=\"bare\"\n type=\"button\"\n onClick={() => adminNavigateTo(shippingRegistryPath(SHIPPING_PROFILES_REGISTRY))}\n className=\"font-normal justify-start whitespace-normal flex w-full items-center gap-3 py-3.5 text-left\"\n >\n <Layers className=\"h-4 w-4 shrink-0 text-muted-foreground\" />\n <span className=\"min-w-0 flex-1\">\n <span className=\"block text-sm font-medium\">\n {profiles == null\n ? 'Carregando perfis…'\n : custom.length === 0\n ? 'Só o perfil geral'\n : `${custom.length} ${custom.length === 1 ? 'perfil' : 'perfis'} além do geral`}\n </span>\n <span className=\"mt-0.5 block text-xs text-muted-foreground\">\n {custom.length === 0\n ? 'Todo produto entrega pelas mesmas zonas. Crie um perfil quando um grupo precisar de zonas diferentes.'\n : custom.slice(0, 3).map((p) => p.name).join(' · ')}\n {custom.length > 3 && ` e ${custom.length - 3} mais`}\n </span>\n </span>\n <ArrowRight className=\"h-4 w-4 shrink-0 text-muted-foreground\" />\n </Button>\n </div>\n\n <SettingsGroup\n title=\"Recado para quem entrega\"\n description=\"Vai junto com o pedido — para você, para o motoboy, e na observação da etiqueta quando houver gateway. Não aparece para o cliente, e não decide quem pode levar.\"\n >\n <TextRow\n label=\"Instrução de manuseio\"\n description=\"Ex.: caixa térmica com gelo, entregar em até 24h.\"\n value={note}\n onChange={setNoteDraft}\n onBlurCommit={() => {\n const next = note.trim()\n if (next !== storedNote) set({ handlingNote: next })\n setNoteDraft(null)\n }}\n placeholder=\"Sem instrução\"\n disabled={loading}\n />\n </SettingsGroup>\n </div>\n )\n}\n","import * as React from 'react'\nimport type { DeliveryOutcome, ZoneMatchKind } from '@fayz-ai/shop'\n\n// ---------------------------------------------------------------------------\n// O rascunho das regras de entrega.\n//\n// Existe porque o cartão de confirmação do assistente mostra parâmetros, não\n// uma tabela editável — e o que a lojista precisa conferir aqui são catorze\n// linhas com preço e prazo, uma a uma. Então o agente não grava direto: ele\n// MONTA o rascunho, a tela desenha o rascunho, e gravar é um clique dela (ou\n// uma última chamada depois que ela disse que está certo).\n//\n// Módulo e não estado de componente: quem escreve são as ferramentas do agente,\n// que vivem fora da árvore React, e quem lê é o painel. Some quando a lojista\n// salva ou descarta — rascunho não é dado, é uma conversa em andamento.\n// ---------------------------------------------------------------------------\n\nexport interface DeliveryDraftRule {\n /** Local ao rascunho. Nada a ver com o id da regra salva. */\n id: string\n matchKind: ZoneMatchKind\n /** Como a lojista lê a regra: \"Angra dos Reis\", \"Copacabana\", \"20000-000 → 23799-999\". */\n label: string\n cityCode?: string | null\n districtKey?: string | null\n postalFrom?: string | null\n postalTo?: string | null\n outcome: DeliveryOutcome\n /** Vazio de propósito quando a mensagem não disse: campo em branco custa\n * menos que campo errado. */\n rate?: number | null\n freeAbove?: number | null\n etaMinDays?: number | null\n etaMaxDays?: number | null\n /** O trecho da mensagem que originou esta linha, para ela conferir a leitura. */\n source?: string\n}\n\nexport interface DeliveryDraftGap {\n query: string\n /** Por que não virou regra, em português, para o agente repetir sem inventar. */\n reason: string\n}\n\nexport interface DeliveryDraft {\n rules: DeliveryDraftRule[]\n gaps: DeliveryDraftGap[]\n}\n\nconst EMPTY: DeliveryDraft = { rules: [], gaps: [] }\n\nlet draft: DeliveryDraft = EMPTY\nconst listeners = new Set<() => void>()\n\n// Um contador só, e não `rules.length`: o agente substitui o rascunho inteiro e\n// o seletor acrescenta linha a linha. Numerar pelo tamanho da lista faria as\n// duas fontes colidirem no mesmo id assim que alguém removesse uma linha.\nlet seq = 0\nconst nextId = () => `rule-${++seq}`\n\n/** Duas regras que casam o mesmo lugar do mesmo jeito são a mesma regra. */\nconst identity = (rule: Pick<DeliveryDraftRule, 'matchKind' | 'cityCode' | 'districtKey' | 'postalFrom' | 'postalTo'>) =>\n [rule.matchKind, rule.cityCode ?? '', rule.districtKey ?? '', rule.postalFrom ?? '', rule.postalTo ?? ''].join('|')\n\nfunction emit(): void {\n for (const listener of listeners) listener()\n}\n\nexport function getDeliveryDraft(): DeliveryDraft {\n return draft\n}\n\nexport function setDeliveryDraft(next: DeliveryDraft): void {\n draft = { ...next, rules: next.rules.map((rule) => ({ ...rule, id: rule.id || nextId() })) }\n emit()\n}\n\n/**\n * Acrescenta regras ao rascunho, ignorando as que já estão lá.\n *\n * É por aqui que o SELETOR escreve — e é de propósito que ele escreva no mesmo\n * lugar que o agente: uma lojista que clicou em cinco bairros e depois disse\n * \"e não entrego em Angra\" tem que ver as seis linhas na mesma tabela, e salvar\n * uma vez. Duas listas seriam duas verdades.\n *\n * Devolve quantas entraram de fato.\n */\nexport function addDeliveryDraftRules(incoming: Array<Omit<DeliveryDraftRule, 'id'>>): number {\n const seen = new Set(draft.rules.map(identity))\n const added: DeliveryDraftRule[] = []\n for (const rule of incoming) {\n const key = identity(rule)\n if (seen.has(key)) continue\n seen.add(key)\n added.push({ ...rule, id: nextId() })\n }\n if (added.length === 0) return 0\n draft = { ...draft, rules: [...draft.rules, ...added] }\n emit()\n return added.length\n}\n\n/** Já está no rascunho? O seletor usa para marcar o que foi escolhido. */\nexport function isInDeliveryDraft(rule: Pick<DeliveryDraftRule, 'matchKind' | 'cityCode' | 'districtKey'>): boolean {\n const key = identity(rule as DeliveryDraftRule)\n return draft.rules.some((existing) => identity(existing) === key)\n}\n\n/**\n * O mesmo frete em todas as regras que entregam.\n *\n * A economia real da tela: quem escolhe catorze bairros cobra o mesmo nos\n * catorze, e digitar catorze vezes é onde a pessoa desiste.\n */\nexport function setAllDeliveryDraftRates(patch: Pick<DeliveryDraftRule, 'rate' | 'freeAbove'>): number {\n let touched = 0\n const rules = draft.rules.map((rule) => {\n if (rule.outcome === 'refuse') return rule\n touched++\n return { ...rule, ...patch }\n })\n if (touched === 0) return 0\n draft = { ...draft, rules }\n emit()\n return touched\n}\n\nexport function updateDeliveryDraftRule(id: string, patch: Partial<DeliveryDraftRule>): boolean {\n const index = draft.rules.findIndex((rule) => rule.id === id)\n if (index < 0) return false\n const rules = draft.rules.slice()\n rules[index] = { ...rules[index], ...patch, id }\n draft = { ...draft, rules }\n emit()\n return true\n}\n\nexport function removeDeliveryDraftRule(id: string): boolean {\n const rules = draft.rules.filter((rule) => rule.id !== id)\n if (rules.length === draft.rules.length) return false\n draft = { ...draft, rules }\n emit()\n return true\n}\n\nexport function clearDeliveryDraft(): void {\n draft = EMPTY\n emit()\n}\n\nexport function subscribeDeliveryDraft(listener: () => void): () => void {\n listeners.add(listener)\n return () => {\n listeners.delete(listener)\n }\n}\n\nexport function useDeliveryDraft(): DeliveryDraft {\n return React.useSyncExternalStore(subscribeDeliveryDraft, getDeliveryDraft, getDeliveryDraft)\n}\n","import type { PluginAITool } from '@fayz-ai/core'\nimport type { AgentSurfaceTool } from '@fayz-ai/admin'\nimport type {\n AreaCandidate, CreateShippingZoneInput, DeliveryOutcome, ShopProvider, ZoneMatchKind,\n} from '@fayz-ai/shop'\nimport { errorMessage } from '../settings/error-message'\nimport {\n clearDeliveryDraft, getDeliveryDraft, setDeliveryDraft, updateDeliveryDraftRule,\n type DeliveryDraftGap, type DeliveryDraftRule,\n} from './delivery-draft'\n\n// ---------------------------------------------------------------------------\n// Configurar onde a loja entrega, a partir da mensagem da lojista.\n//\n// A mensagem real que originou isto:\n//\n// \"Não entregamos Costa Verde, Angra, Mangaratiba, Itacuruçá, Itaboraí,\n// Região dos Lagos, Região Serrana. Entregamos Zona Norte (evitar Chapadão e\n// Maré), Zona Sul (exceto Rocinha, Vidigal e comunidades), Zona Oeste.\"\n//\n// Traduzir isso à mão dá catorze faixas de CEP, e por isso ninguém traduz — a\n// loja segue entregando onde disse que não entrega. O agente faz a tradução, e\n// o desenho inteiro existe para que ele a faça sem INVENTAR:\n//\n// findDeliveryAreas o único lugar de onde sai um código de município ou uma\n// chave de bairro. Nome que não volta daqui vira PERGUNTA,\n// nunca regra.\n// proposeDeliveryRules monta o rascunho na tela. Não grava nada.\n// setDeliveryRule corrige uma linha do rascunho (preço, prazo, desfecho).\n// commitDeliveryRules grava, depois que ela olhou a tabela.\n// checkDeliveryFor testa um CEP contra o que ficou salvo — o agente usa\n// para conferir antes de dizer que terminou, e a lojista\n// para perguntar \"por que fulano não conseguiu comprar?\".\n//\n// Preço e prazo NASCEM VAZIOS quando a mensagem não os diz. A mensagem acima não\n// diz nenhum dos dois, e um número inventado num campo de frete é pior que um\n// campo em branco: o branco ela vê, o inventado ela cobra.\n// ---------------------------------------------------------------------------\n\nexport const DELIVERY_AREAS_INSTRUCTIONS = `\nEsta é a tela de Entrega da loja. Aqui você configura ONDE a loja entrega, ONDE ela recusa e onde precisa confirmar antes.\n\nUma regra tem duas partes: a ÁREA (um município ou um bairro) e o DESFECHO:\n· entrego (deliver) · confirmo antes (review) · não entrego (refuse)\nEntre as regras que casam com um endereço, vence a mais estrita. Então \"Zona Norte: entrego\" + \"Maré: não entrego\" são DUAS regras, e a segunda ganha na Maré. Nunca tente recortar uma área grande em pedaços para abrir exceção — declare a exceção.\n\nPREFIRA A ÁREA MAIOR MENOS AS EXCEÇÕES. É assim que o lojista fala, e é o que a regra mais estrita permite. Quando ele lista várias zonas de uma mesma cidade — \"zona norte, zona sul, zona oeste, zona sudoeste\" — isso É a cidade inteira: proponha UMA regra de município e as exceções, não oitenta bairros. Uma whitelist de bairros é pior de duas formas: ela envelhece (bairro que faltar na lista vira venda recusada em silêncio) e ninguém confere oitenta linhas.\n\nQuando a lojista colar uma mensagem descrevendo a operação dela:\n1. Separe cada lugar citado e se ele é entrega, recusa ou dúvida. \"Evitar X\", \"exceto X\" e \"não entregamos X\" são recusa.\n2. Chame \\`findDeliveryAreas\\` UMA vez com todos os nomes juntos.\n · \\`resolved\\` está pronto para virar regra.\n · \\`options\\` é ambíguo: pergunte qual, não escolha.\n · \\`notFound\\` é o caso importante. Muita comunidade não tem bairro nem CEP próprio — divide o do bairro vizinho. NÃO invente faixa de CEP para ela. Diga isso em uma linha e ofereça o que existe: marcar o bairro que a contém como \"confirmo antes\".\n · \\`group\\` (Zona Sul, Região dos Lagos) traz \\`members\\`. Use os membros como regras individuais SÓ quando ele citou uma parte da cidade. Se ele citou zonas que somam a cidade toda, jogue os grupos fora e use o município.\n3. Chame \\`proposeDeliveryRules\\` com o que resolveu. Ele NÃO grava — desenha a tabela na tela dela.\n4. Preço e prazo: só preencha o que a mensagem disse. Se ela não disse, deixe vazio e pergunte UMA vez, junto, no fim: \"quanto você cobra em cada região, e tem frete grátis acima de algum valor?\".\n5. Quando ela confirmar, chame \\`commitDeliveryRules\\`. Depois teste com \\`checkDeliveryFor\\` dois ou três CEPs (um que entrega, um que recusa) e relate o resultado em duas linhas.\n\nRegras:\n· Você NUNCA escreve um CEP ou um código de município que não tenha vindo de \\`findDeliveryAreas\\`.\n· NÃO proponha faixa de CEP. Faixa é como transportadora precifica, não como uma pessoa descreve onde entrega, e ninguém no mercado pede isso ao lojista. Ela existe só para quando a lojista estiver COPIANDO uma tabela de transportadora e disser os números ela mesma. Se você não achar a área pelo nome, pergunte — não caia na faixa.\n· Comunidade que não resolve pelo nome (Chapadão é o caso) não vira recusa inventada: ofereça marcar o bairro que a contém como \"confirmo antes\", que aceita o pedido e deixa a decisão com ele.\n· Não imprima a tabela inteira no texto: ela está na tela. Diga quantas regras entraram, quantas são recusa, e o que ficou em aberto.\n· Português do Brasil, curto.\n`.trim()\n\n// ---------------------------------------------------------------------------\n// Ferramentas\n// ---------------------------------------------------------------------------\n\nconst FIND_AREAS: PluginAITool = {\n id: 'shop.delivery.find-areas',\n name: 'findDeliveryAreas',\n description:\n 'Resolves place names the merchant wrote (\"Angra\", \"Zona Sul\", \"Barra da Tijuca\", \"Itacuruçá\") into real '\n + 'municipalities (IBGE code), neighbourhoods, or curated groups that expand into several of them. '\n + 'Send EVERY name of the message in one call. This is the ONLY source of a municipality code or a '\n + 'neighbourhood key — never write one that did not come from here. A name that answers `notFound` is a '\n + 'question for the merchant, not a rule to invent.',\n icon: 'MapPin',\n mode: 'read',\n execution: { plane: 'client' },\n category: 'Shop',\n role: 'operations',\n parameters: {\n type: 'object',\n properties: {\n queries: {\n type: 'array',\n description: 'The place names as the merchant wrote them, without \"não entrego\" / \"exceto\".',\n items: { type: 'string' },\n },\n },\n required: ['queries'],\n },\n}\n\nconst PROPOSE_RULES: PluginAITool = {\n id: 'shop.delivery.propose-rules',\n name: 'proposeDeliveryRules',\n description:\n 'Draws the delivery rules the message describes as an EDITABLE TABLE on the merchant\\'s screen. '\n + 'Writes nothing. Every area must carry the ids findDeliveryAreas answered. A group is expanded into one '\n + 'rule per member here, so the merchant sees and trims what it covers. Leave rate and ETA out when the '\n + 'message did not state them.',\n icon: 'ListChecks',\n mode: 'read',\n execution: { plane: 'client' },\n category: 'Shop',\n role: 'operations',\n parameters: {\n type: 'object',\n properties: {\n rules: {\n type: 'array',\n description: 'One entry per area named in the message.',\n items: {\n type: 'object',\n properties: {\n kind: {\n type: 'string',\n enum: ['city', 'district', 'group', 'postal_range'],\n description:\n 'The `kind` findDeliveryAreas answered. Use postal_range ONLY when the merchant is copying a '\n + 'carrier freight table and dictated the numbers — never to describe where they deliver.',\n },\n label: { type: 'string', description: 'The place name, as it should read on the table.' },\n cityCode: { type: 'string', description: 'IBGE code from findDeliveryAreas.' },\n districtKey: { type: 'string', description: 'Neighbourhood key from findDeliveryAreas.' },\n postalFrom: { type: 'string', description: 'Only for postal_range.' },\n postalTo: { type: 'string', description: 'Only for postal_range.' },\n outcome: {\n type: 'string',\n enum: ['deliver', 'review', 'refuse'],\n description: 'deliver | review (confirm before dispatch) | refuse.',\n },\n rate: { type: 'number', description: 'Only if the message stated a price. Otherwise omit.' },\n freeAbove: { type: 'number', description: 'Only if the message stated a threshold.' },\n etaMinDays: { type: 'number' },\n etaMaxDays: { type: 'number' },\n source: { type: 'string', description: 'The words of the message this rule came from.' },\n },\n required: ['kind', 'label', 'outcome'],\n },\n },\n gaps: {\n type: 'array',\n description: 'What the message named and you could NOT resolve, so the merchant sees it too.',\n items: {\n type: 'object',\n properties: {\n query: { type: 'string' },\n reason: { type: 'string', description: 'Plain Portuguese, one line.' },\n },\n required: ['query', 'reason'],\n },\n },\n },\n required: ['rules'],\n },\n}\n\nconst SET_RULE: PluginAITool = {\n id: 'shop.delivery.set-rule',\n name: 'setDeliveryRule',\n description:\n 'Corrects one line of the draft table already on screen — its outcome, price, free-above or ETA. '\n + 'Use when the merchant answers a question about the rules you proposed, instead of rebuilding the whole draft.',\n icon: 'Pencil',\n mode: 'read',\n execution: { plane: 'client' },\n category: 'Shop',\n role: 'operations',\n parameters: {\n type: 'object',\n properties: {\n id: { type: 'string', description: 'The rule id proposeDeliveryRules answered.' },\n outcome: { type: 'string', enum: ['deliver', 'review', 'refuse'] },\n rate: { type: 'number' },\n freeAbove: { type: 'number' },\n etaMinDays: { type: 'number' },\n etaMaxDays: { type: 'number' },\n },\n required: ['id'],\n },\n}\n\nconst COMMIT_RULES: PluginAITool = {\n id: 'shop.delivery.commit-rules',\n name: 'commitDeliveryRules',\n description:\n 'Saves the draft table as the store\\'s delivery rules. Call ONLY after the merchant said the table is right. '\n + 'It changes who can buy: an address outside every rule cannot check out, and a refused one is blocked '\n + 'server-side. Saves the draft as it stands on screen — the merchant may have edited it, and those edits win.',\n icon: 'Save',\n mode: 'persist',\n execution: { plane: 'client' },\n category: 'Shop',\n role: 'operations',\n permission: { feature: 'shop', action: 'update' },\n parameters: { type: 'object', properties: {} },\n}\n\nconst CHECK_DELIVERY: PluginAITool = {\n id: 'shop.delivery.check',\n name: 'checkDeliveryFor',\n description:\n 'Answers what the store does with a given postcode right now: deliver, confirm first, refuse, or outside '\n + 'every rule. Use it to CHECK YOUR OWN WORK after saving, and to answer \"why could this customer not buy?\".',\n icon: 'Search',\n mode: 'read',\n execution: { plane: 'client' },\n category: 'Shop',\n role: 'operations',\n parameters: {\n type: 'object',\n properties: {\n postalCodes: {\n type: 'array',\n description: 'One or more CEPs, with or without punctuation.',\n items: { type: 'string' },\n },\n },\n required: ['postalCodes'],\n },\n}\n\nexport const DELIVERY_AREA_TOOL_IDS = [\n FIND_AREAS.id, PROPOSE_RULES.id, SET_RULE.id, COMMIT_RULES.id, CHECK_DELIVERY.id,\n]\n\n// ---------------------------------------------------------------------------\n// Execução\n// ---------------------------------------------------------------------------\n\nexport interface DeliveryAreaDeps {\n getProvider: () => ShopProvider\n /** Chamado depois de gravar, para a tela recarregar as regras. */\n onSaved: () => void\n}\n\nconst text = (value: unknown): string => (typeof value === 'string' ? value.trim() : '')\n\nconst number = (value: unknown): number | null =>\n typeof value === 'number' && Number.isFinite(value) ? value : null\n\nconst OUTCOMES: DeliveryOutcome[] = ['deliver', 'review', 'refuse']\n\nconst outcomeOf = (value: unknown): DeliveryOutcome =>\n OUTCOMES.includes(value as DeliveryOutcome) ? (value as DeliveryOutcome) : 'deliver'\n\n/** Um candidato, na forma curta que o modelo lê sem despejar o banco na tela. */\nfunction candidateOut(area: AreaCandidate): Record<string, unknown> {\n return {\n kind: area.kind,\n label: area.label,\n cityCode: area.cityCode ?? undefined,\n cityName: area.cityName ?? undefined,\n state: area.state ?? undefined,\n districtKey: area.districtKey ?? undefined,\n knownPostalCodes: area.knownPostalCodes || undefined,\n members: area.members?.map((m) => ({\n kind: m.kind,\n label: m.label,\n cityCode: m.cityCode ?? undefined,\n districtKey: m.districtKey ?? undefined,\n })),\n }\n}\n\n/**\n * Um candidato é RESOLVIDO quando é o único, ou quando é exato e os outros não.\n * \"Angra\" traz \"Angra dos Reis\" e mais nada; \"Centro\" traz um grupo e trinta\n * bairros, e aí a pergunta é legítima.\n */\nfunction pickCandidate(query: string, areas: AreaCandidate[]): {\n resolved?: AreaCandidate\n options?: AreaCandidate[]\n} {\n if (areas.length === 0) return {}\n if (areas.length === 1) return { resolved: areas[0] }\n const key = query.trim().toLowerCase()\n const exact = areas.filter((a) => a.label.trim().toLowerCase() === key)\n if (exact.length === 1) return { resolved: exact[0] }\n return { options: areas.slice(0, 6) }\n}\n\nfunction ruleFromArgs(raw: Record<string, unknown>, index: number): DeliveryDraftRule | null {\n const kind = text(raw.kind)\n const label = text(raw.label)\n if (!label) return null\n\n const base = {\n id: `draft-${index}`,\n label,\n outcome: outcomeOf(raw.outcome),\n rate: number(raw.rate),\n freeAbove: number(raw.freeAbove),\n etaMinDays: number(raw.etaMinDays),\n etaMaxDays: number(raw.etaMaxDays),\n source: text(raw.source) || undefined,\n }\n\n if (kind === 'city') {\n const cityCode = text(raw.cityCode)\n if (!cityCode) return null\n return { ...base, matchKind: 'city' as ZoneMatchKind, cityCode }\n }\n if (kind === 'district') {\n const districtKey = text(raw.districtKey)\n if (!districtKey) return null\n return {\n ...base,\n matchKind: 'district' as ZoneMatchKind,\n districtKey,\n cityCode: text(raw.cityCode) || null,\n }\n }\n if (kind === 'postal_range') {\n const from = text(raw.postalFrom).replace(/\\D/g, '')\n const to = text(raw.postalTo).replace(/\\D/g, '')\n if (from.length !== 8 || to.length !== 8) return null\n return { ...base, matchKind: 'postal_range' as ZoneMatchKind, postalFrom: from, postalTo: to }\n }\n return null\n}\n\n/** A regra do rascunho, na forma que o provider grava. */\nexport function zoneInputFrom(rule: DeliveryDraftRule): CreateShippingZoneInput {\n return {\n name: rule.label,\n carrier: null,\n matchKind: rule.matchKind,\n cityCode: rule.cityCode ?? null,\n districtKey: rule.districtKey ?? null,\n outcome: rule.outcome,\n postalFrom: rule.postalFrom ?? null,\n postalTo: rule.postalTo ?? null,\n // Uma regra de recusa não cobra nada: o preço dela nunca é lido.\n rate: rule.outcome === 'refuse' ? 0 : (rule.rate ?? 0),\n freeAbove: rule.freeAbove ?? null,\n etaMinDays: rule.etaMinDays ?? null,\n etaMaxDays: rule.etaMaxDays ?? null,\n active: true,\n sortOrder: 0,\n excluded: rule.outcome === 'refuse',\n }\n}\n\nexport function createDeliveryAreaTools({ getProvider, onSaved }: DeliveryAreaDeps): AgentSurfaceTool[] {\n const failed = (error: unknown) => ({ ok: false, error: errorMessage(error) })\n\n return [\n {\n tool: FIND_AREAS,\n execute: async (args) => {\n const queries = (Array.isArray(args.queries) ? args.queries : [])\n .map(text).filter(Boolean).slice(0, 30)\n if (queries.length === 0) return { ok: false, error: 'no_queries' }\n try {\n const shop = getProvider()\n if (typeof shop.findAreas !== 'function') {\n return { ok: false, error: 'area_lookup_unavailable' }\n }\n const results = await Promise.all(\n queries.map(async (query) => {\n const areas = await shop.findAreas!(query, 8).catch(() => [])\n const { resolved, options } = pickCandidate(query, areas)\n if (resolved) return { query, resolved: candidateOut(resolved) }\n if (options) return { query, options: options.map(candidateOut) }\n return {\n query,\n notFound: true,\n // Dito aqui e não deixado para o modelo deduzir: é a frase que\n // separa \"não existe\" de \"existe mas não dá para separar por CEP\".\n hint:\n 'Sem município, bairro ou grupo com esse nome. Comunidade normalmente não tem CEP próprio — '\n + 'divide o do bairro vizinho. Pergunte à lojista qual bairro a contém.',\n }\n }),\n )\n return { ok: true, results }\n } catch (error) {\n return failed(error)\n }\n },\n },\n\n {\n tool: PROPOSE_RULES,\n execute: async (args) => {\n const raw = Array.isArray(args.rules) ? args.rules : []\n const rules: DeliveryDraftRule[] = []\n const gaps: DeliveryDraftGap[] = (Array.isArray(args.gaps) ? args.gaps : [])\n .map((g: any) => ({ query: text(g?.query), reason: text(g?.reason) }))\n .filter((g: DeliveryDraftGap) => g.query)\n\n raw.forEach((entry: any, index: number) => {\n const rule = ruleFromArgs(entry ?? {}, rules.length)\n if (rule) {\n rules.push(rule)\n return\n }\n // Recusada, e dito por quê: uma regra sem código de município é\n // exatamente o palpite que este desenho existe para impedir.\n gaps.push({\n query: text(entry?.label) || `regra ${index + 1}`,\n reason:\n 'Faltou o identificador da área. Chame findDeliveryAreas para este nome e use o que ele responder.',\n })\n })\n\n if (rules.length === 0 && gaps.length === 0) return { ok: false, error: 'empty_draft' }\n\n setDeliveryDraft({ rules, gaps })\n return {\n ok: true,\n drafted: rules.length,\n refusing: rules.filter((r) => r.outcome === 'refuse').length,\n reviewing: rules.filter((r) => r.outcome === 'review').length,\n missingPrice: rules.filter((r) => r.outcome !== 'refuse' && r.rate == null).length,\n gaps,\n rules: rules.map((r) => ({ id: r.id, label: r.label, outcome: r.outcome })),\n nextStep: 'commitDeliveryRules',\n }\n },\n },\n\n {\n tool: SET_RULE,\n execute: async (args) => {\n const id = text(args.id)\n if (!id) return { ok: false, error: 'no_id' }\n const patch: Partial<DeliveryDraftRule> = {}\n if (args.outcome !== undefined) patch.outcome = outcomeOf(args.outcome)\n if (args.rate !== undefined) patch.rate = number(args.rate)\n if (args.freeAbove !== undefined) patch.freeAbove = number(args.freeAbove)\n if (args.etaMinDays !== undefined) patch.etaMinDays = number(args.etaMinDays)\n if (args.etaMaxDays !== undefined) patch.etaMaxDays = number(args.etaMaxDays)\n if (Object.keys(patch).length === 0) return { ok: false, error: 'nothing_to_change' }\n if (!updateDeliveryDraftRule(id, patch)) return { ok: false, error: 'rule_not_in_draft' }\n return { ok: true, id, ...patch }\n },\n },\n\n {\n tool: COMMIT_RULES,\n execute: async () => {\n // O rascunho é lido AGORA, da tela, e não dos argumentos: entre propor e\n // confirmar a lojista pode ter corrigido um preço, e é a correção dela\n // que vale.\n const { rules } = getDeliveryDraft()\n if (rules.length === 0) return { ok: false, error: 'nothing_to_save' }\n try {\n const shop = getProvider()\n if (typeof shop.createShippingZone !== 'function') {\n return { ok: false, error: 'zones_unavailable' }\n }\n const saved: string[] = []\n const rejected: Array<{ label: string; error: string }> = []\n for (const rule of rules) {\n try {\n await shop.createShippingZone(zoneInputFrom(rule))\n saved.push(rule.label)\n } catch (error) {\n rejected.push({ label: rule.label, error: errorMessage(error) })\n }\n }\n if (saved.length > 0) {\n clearDeliveryDraft()\n onSaved()\n }\n return { ok: rejected.length === 0, saved: saved.length, rejected }\n } catch (error) {\n return failed(error)\n }\n },\n },\n\n {\n tool: CHECK_DELIVERY,\n execute: async (args) => {\n const codes = (Array.isArray(args.postalCodes) ? args.postalCodes : [])\n .map((c) => text(c).replace(/\\D/g, ''))\n .filter((c) => c.length === 8)\n .slice(0, 10)\n if (codes.length === 0) return { ok: false, error: 'no_postal_codes' }\n try {\n const shop = getProvider()\n if (typeof shop.checkDelivery !== 'function') {\n return { ok: false, error: 'delivery_check_unavailable' }\n }\n const results = await Promise.all(\n codes.map(async (code) => {\n const check = await shop.checkDelivery!(code)\n return {\n postalCode: code,\n // null = nenhuma regra casou: fora de área, que não é o mesmo\n // que recusado e o texto para a lojista é outro.\n outcome: check.outcome ?? null,\n rule: check.zoneName ?? check.refusedZone ?? null,\n outsideEveryRule: !check.refused && !check.ownZone,\n }\n }),\n )\n return { ok: true, results }\n } catch (error) {\n return failed(error)\n }\n },\n },\n ]\n}\n","import * as React from 'react'\nimport { useAgentSurface, type AgentSurfaceContribution, type AskAIIntro } from '@fayz-ai/admin'\nimport type { ShippingZone, ShopProvider } from '@fayz-ai/shop'\nimport { createDeliveryAreaTools, DELIVERY_AREAS_INSTRUCTIONS } from './delivery-agent'\nimport { getDeliveryDraft } from './delivery-draft'\n\n// ---------------------------------------------------------------------------\n// A tela de Entrega, entregue ao assistente.\n//\n// Não desenha nada. Publica o que já está configurado, o rascunho em curso, e\n// as ferramentas de configurar região enquanto a aba estiver montada.\n//\n// O `describe` inclui o rascunho de propósito: sem isso o agente propõe uma\n// tabela e, na mensagem seguinte, não sabe mais o que propôs — e a lojista\n// corrigindo um preço na tela vira uma correção que ele não enxerga.\n// ---------------------------------------------------------------------------\n\nexport const DELIVERY_AREAS_INTRO: AskAIIntro = {\n role: 'operations',\n persona: 'Entrega',\n pitch: 'Me conte onde você entrega, do seu jeito.',\n description:\n 'Escreva como você falaria com um cliente — \"entrego na Zona Norte menos Chapadão, não vou para Angra\" — '\n + 'que eu resolvo cada região e monto a tabela para você conferir e salvar.',\n suggestions: [\n { label: 'Onde eu entrego hoje?' },\n { label: 'Por que um CEP foi recusado?' },\n ],\n}\n\nexport interface DeliveryAgentSurfaceProps {\n provider: () => ShopProvider\n zones: ShippingZone[]\n onSaved: () => void\n}\n\nexport function DeliveryAgentSurface({ provider, zones, onSaved }: DeliveryAgentSurfaceProps) {\n const live = React.useRef({ provider, zones, onSaved })\n live.current = { provider, zones, onSaved }\n\n const contribution = React.useMemo<AgentSurfaceContribution>(() => ({\n id: 'shop.delivery.settings',\n pluginId: 'shop',\n role: 'operations',\n instructions: DELIVERY_AREAS_INSTRUCTIONS,\n describe: () => {\n const { zones: rows } = live.current\n const draft = getDeliveryDraft()\n const byOutcome = (outcome: string) =>\n rows.filter((z) => z.active && (z.outcome ?? (z.excluded ? 'refuse' : 'deliver')) === outcome)\n return {\n title: 'Configuração — Entrega',\n state: {\n screen: '/settings/shop-shipping',\n savedRules: {\n delivering: byOutcome('deliver').length,\n reviewing: byOutcome('review').length,\n refusing: byOutcome('refuse').length,\n // Os nomes, não as faixas: o agente precisa saber o que JÁ existe\n // para não propor a mesma região duas vezes.\n names: rows.filter((z) => z.active).slice(0, 40).map((z) => z.name),\n },\n draft: draft.rules.length === 0 && draft.gaps.length === 0\n ? null\n : {\n rules: draft.rules.map((r) => ({\n id: r.id,\n label: r.label,\n outcome: r.outcome,\n rate: r.rate ?? null,\n freeAbove: r.freeAbove ?? null,\n })),\n gaps: draft.gaps,\n },\n },\n }\n },\n tools: createDeliveryAreaTools({\n getProvider: () => live.current.provider(),\n onSaved: () => live.current.onSaved(),\n }),\n }), [])\n\n useAgentSurface(contribution)\n return null\n}\n","import React from 'react'\nimport { getShopProvider } from '@fayz-ai/shop'\nimport type { AreaCandidate, DeliveryOutcome } from '@fayz-ai/shop'\nimport { Ban, Building2, Check, Loader2, MapPin, Plus, Search, Sparkles } from 'lucide-react'\nimport { resolve, type ShopProviderResolver } from '../data/shared'\nimport { addDeliveryDraftRules, isInDeliveryDraft, useDeliveryDraft } from './delivery-draft'\nimport type { DeliveryDraftRule } from './delivery-draft'\nimport { Button, Input } from '@fayz-ai/ui'\n\n// ---------------------------------------------------------------------------\n// \"Onde você entrega?\" e, logo abaixo, \"e onde você NÃO entrega?\".\n//\n// A forma das duas caixas é a forma da frase que a lojista escreveu:\n//\n// \"Entregamos zona norte (evitar Chapadão e Maré), zona sul (exceto Rocinha,\n// Vidigal e comunidades), zona sudoeste e zona oeste.\"\n//\n// As quatro zonas que ela lista SÃO a cidade inteira. Ela não está montando uma\n// whitelist de bairros — está dizendo \"o Rio todo, menos estas exceções\". Um\n// seletor que só soma áreas obriga a escolher cento e sessenta e três bairros\n// para depois tirar quatro, e o que faltar da lista vira venda recusada em\n// silêncio.\n//\n// Então o município aparece como CIDADE INTEIRA, em primeiro lugar, e a segunda\n// caixa só existe depois que há algo a excluir. Duas perguntas, na ordem em que\n// ela fala.\n//\n// O que ela escolhe cai no MESMO RASCUNHO que o agente escreve — quem clicou e\n// depois disse \"ah, e não vou em Angra\" vê tudo na mesma tabela e salva uma vez.\n// ---------------------------------------------------------------------------\n\nconst MIN_QUERY = 2\nconst DEBOUNCE_MS = 250\n\nfunction ruleFor(area: AreaCandidate, outcome: DeliveryOutcome): Omit<DeliveryDraftRule, 'id'> | null {\n if (area.kind === 'city' && area.cityCode) {\n return { matchKind: 'city', label: area.label, cityCode: area.cityCode, outcome }\n }\n if (area.kind === 'district' && area.districtKey) {\n return {\n matchKind: 'district',\n label: area.label,\n districtKey: area.districtKey,\n cityCode: area.cityCode ?? null,\n outcome,\n }\n }\n return null\n}\n\n/** Um grupo vira N regras — e é isso que a lojista confere e poda na tabela. */\nfunction rulesFor(area: AreaCandidate, outcome: DeliveryOutcome): Array<Omit<DeliveryDraftRule, 'id'>> {\n if (area.kind !== 'group') {\n const single = ruleFor(area, outcome)\n return single ? [single] : []\n }\n return (area.members ?? []).flatMap((member) => {\n const rule = ruleFor(\n { kind: member.kind, label: member.label, cityCode: member.cityCode, districtKey: member.districtKey },\n outcome,\n )\n return rule ? [rule] : []\n })\n}\n\nfunction areaMeta(area: AreaCandidate): string {\n // O motivo ganha da categoria: \"Itacuruçá é distrito de Mangaratiba\" explica\n // por que a linha diz Mangaratiba quando ela digitou outra coisa.\n if (area.matchedAs) return area.matchedAs\n if (area.kind === 'group') {\n const n = area.members?.length ?? 0\n return `${n} ${n === 1 ? 'região' : 'regiões'}${area.cityName ? ` · ${area.cityName}` : ''}`\n }\n // \"Cidade inteira\" e não \"Município\": é a diferença entre a lojista entender\n // que uma linha cobre tudo e achar que precisa somar bairro por bairro.\n if (area.kind === 'city') return `Cidade inteira${area.state ? ` · ${area.state}` : ''}`\n return `Bairro${area.cityName ? ` · ${area.cityName}` : ''}`\n}\n\nconst areaKeyOf = (area: AreaCandidate) =>\n `${area.kind}:${area.districtKey ?? area.cityCode ?? area.label}`\n\n// ---------------------------------------------------------------------------\n\ninterface AreaSearchProps {\n provider?: ShopProviderResolver\n outcome: DeliveryOutcome\n placeholder: string\n /** Restringe o resultado às cidades que a loja já cobre. */\n onlyCityCodes?: string[]\n emptyHint: React.ReactNode\n}\n\nfunction AreaSearch({ provider, outcome, placeholder, onlyCityCodes, emptyHint }: AreaSearchProps) {\n const [query, setQuery] = React.useState('')\n const [results, setResults] = React.useState<AreaCandidate[] | null>(null)\n const [loading, setLoading] = React.useState(false)\n const [unavailable, setUnavailable] = React.useState(false)\n const [justAdded, setJustAdded] = React.useState<string | null>(null)\n\n React.useEffect(() => {\n const text = query.trim()\n if (text.length < MIN_QUERY) {\n setResults(null)\n return undefined\n }\n let cancelled = false\n setLoading(true)\n const timer = setTimeout(() => {\n const shop = provider ? resolve(provider) : getShopProvider()\n if (typeof shop.findAreas !== 'function') {\n if (!cancelled) { setUnavailable(true); setLoading(false) }\n return\n }\n void shop\n .findAreas(text, 10)\n .then((list) => { if (!cancelled) { setResults(list); setUnavailable(false) } })\n // Uma busca que não responde é a MESMA coisa que uma busca vazia para\n // quem está olhando — o que não pode acontecer é a tela sugerir que a\n // pessoa digite a faixa de CEP no lugar.\n .catch(() => { if (!cancelled) { setResults([]); setUnavailable(true) } })\n .finally(() => { if (!cancelled) setLoading(false) })\n }, DEBOUNCE_MS)\n return () => { cancelled = true; clearTimeout(timer) }\n }, [query, provider])\n\n const add = (area: AreaCandidate) => {\n const rules = rulesFor(area, outcome)\n if (rules.length === 0) return\n const added = addDeliveryDraftRules(rules)\n setJustAdded(areaKeyOf(area))\n setTimeout(() => setJustAdded(null), 1400)\n if (added > 0) setQuery('')\n }\n\n // Na caixa das exceções, oferecer um bairro de outra cidade é ruído: ela está\n // recortando o que já cobre.\n const visible = (results ?? []).filter((area) => {\n if (!onlyCityCodes || onlyCityCodes.length === 0) return true\n if (area.kind === 'city') return true\n return !area.cityCode || onlyCityCodes.includes(area.cityCode)\n })\n\n return (\n <>\n <div className=\"relative\">\n <Search className=\"pointer-events-none absolute left-3 top-1/2 h-4 w-4 -translate-y-1/2 text-muted-foreground\" />\n <Input\n value={query}\n onChange={(e) => setQuery(e.target.value)}\n placeholder={placeholder}\n className=\"h-auto rounded-lg border-border bg-background py-2 pl-9 pr-9\"\n />\n {loading && (\n <Loader2 className=\"absolute right-3 top-1/2 h-4 w-4 -translate-y-1/2 animate-spin text-muted-foreground\" />\n )}\n </div>\n\n {results !== null && (\n <ul className=\"mt-2 max-h-72 divide-y divide-border overflow-y-auto rounded-lg border border-border\">\n {visible.length === 0 && (\n <li className=\"px-3 py-6 text-center text-xs text-muted-foreground\">\n {unavailable ? 'A busca de regiões ainda não está disponível neste banco.' : emptyHint}\n </li>\n )}\n {visible.map((area) => {\n const key = areaKeyOf(area)\n const already = area.kind !== 'group' && isInDeliveryDraft({\n matchKind: area.kind === 'city' ? 'city' : 'district',\n cityCode: area.cityCode ?? null,\n districtKey: area.districtKey ?? null,\n })\n return (\n <li key={key}>\n <Button variant=\"bare\" size=\"bare\"\n type=\"button\"\n onClick={() => add(area)}\n disabled={already}\n className=\"font-normal justify-start rounded-none whitespace-normal flex w-full items-center gap-3 px-3 py-2.5 text-left transition hover:bg-muted/50 disabled:opacity-50\"\n >\n {area.kind === 'city'\n ? <Building2 className=\"h-4 w-4 shrink-0 text-muted-foreground\" />\n : <MapPin className=\"h-4 w-4 shrink-0 text-muted-foreground\" />}\n <span className=\"min-w-0 flex-1\">\n <span className=\"block truncate text-sm font-medium\">{area.label}</span>\n <span className=\"block text-xs text-muted-foreground\">\n {areaMeta(area)}\n {/* Zero CEP visto não é defeito — é o primeiro dia da loja.\n Dizer isso evita que ela ache que o nome está errado. */}\n {area.kind === 'district' && !area.knownPostalCodes && ' · ainda sem CEP visto'}\n </span>\n </span>\n {justAdded === key\n ? <Check className=\"h-4 w-4 shrink-0 text-emerald-600\" />\n : already\n ? <span className=\"shrink-0 text-xs text-muted-foreground\">já escolhido</span>\n : <Plus className=\"h-4 w-4 shrink-0 text-muted-foreground\" />}\n </Button>\n </li>\n )\n })}\n </ul>\n )}\n </>\n )\n}\n\n// ---------------------------------------------------------------------------\n\nexport interface DeliveryAreaPickerProps {\n provider?: ShopProviderResolver\n /** Abre o assistente com a tela de Entrega em foco. */\n onAskAssistant?: () => void\n}\n\nexport function DeliveryAreaPicker({ provider, onAskAssistant }: DeliveryAreaPickerProps) {\n const draft = useDeliveryDraft()\n\n const covered = draft.rules.filter((r) => r.outcome !== 'refuse')\n const coveredCities = covered.filter((r) => r.matchKind === 'city')\n const exceptions = draft.rules.filter((r) => r.outcome === 'refuse')\n const cityCodes = covered.map((r) => r.cityCode).filter(Boolean) as string[]\n\n return (\n <div className=\"rounded-card border bg-card px-5 py-4 shadow-sm\">\n <div className=\"flex flex-wrap items-start justify-between gap-3\">\n <div>\n <h3 className=\"text-sm font-semibold\">Onde você entrega?</h3>\n <p className=\"mt-0.5 text-xs text-muted-foreground\">\n Digite uma cidade, um bairro ou uma região — \"Rio de Janeiro\", \"Ipanema\", \"Zona Sul\".\n Se você atende a cidade toda, uma linha só resolve: escolha a cidade.\n </p>\n </div>\n {onAskAssistant && (\n <Button variant=\"bare\" size=\"bare\"\n type=\"button\"\n onClick={onAskAssistant}\n className=\"inline-flex items-center gap-1.5 rounded-md border border-border px-3 py-1.5 text-xs font-medium hover:bg-muted\"\n >\n <Sparkles className=\"h-3.5 w-3.5 text-primary\" />\n Prefiro contar por escrito\n </Button>\n )}\n </div>\n\n <div className=\"mt-3\">\n <AreaSearch\n provider={provider}\n outcome=\"deliver\"\n placeholder=\"Cidade, bairro ou região…\"\n emptyHint=\"Nada com esse nome. Tente a cidade, ou conte por escrito ao assistente.\"\n />\n </div>\n\n {/*\n A segunda pergunta só existe depois da primeira, porque é literalmente a\n ordem da frase dela: \"entregamos X, evitar Y\". Perguntada antes, ela é\n ruído; perguntada depois, é o passo que a pessoa já ia dar.\n */}\n {covered.length > 0 && (\n <div className=\"mt-5 border-t border-border pt-4\">\n <div className=\"flex items-center gap-2\">\n <Ban className=\"h-4 w-4 text-destructive\" />\n <h4 className=\"text-sm font-semibold\">E onde você não entrega?</h4>\n </div>\n <p className=\"mt-0.5 text-xs text-muted-foreground\">\n {coveredCities.length > 0\n ? `Recortes dentro do que você já cobre — comunidade, bairro de risco, região distante. A exceção vence a área maior, então ${coveredCities[0].label} continua valendo em todo o resto.`\n : 'Regiões que você quer recusar mesmo estando perto do que já cobre. A exceção vence a área maior.'}\n </p>\n <div className=\"mt-3\">\n <AreaSearch\n provider={provider}\n outcome=\"refuse\"\n placeholder=\"Bairro ou região que você recusa…\"\n onlyCityCodes={cityCodes}\n emptyHint={\n <>\n Nada com esse nome. Comunidade normalmente não tem CEP próprio — divide o do\n bairro vizinho. Escolha o bairro que a contém e marque como “confirmo antes”\n na tabela.\n </>\n }\n />\n </div>\n </div>\n )}\n\n {draft.rules.length > 0 && (\n <p className=\"mt-3 text-xs text-muted-foreground\">\n {covered.length} {covered.length === 1 ? 'região' : 'regiões'} onde você entrega\n {exceptions.length > 0 && `, ${exceptions.length} ${exceptions.length === 1 ? 'exceção' : 'exceções'}`}\n {' '}— confira o preço na tabela abaixo e salve.\n </p>\n )}\n </div>\n )\n}\n","import React from 'react'\nimport { getShopProvider } from '@fayz-ai/shop'\nimport type { DeliveryOutcome } from '@fayz-ai/shop'\nimport { Check, Loader2, ListChecks, Trash2, X } from 'lucide-react'\nimport { errorMessage } from '../settings/error-message'\nimport { resolve, type ShopProviderResolver } from '../data/shared'\nimport { zoneInputFrom } from './delivery-agent'\nimport {\n clearDeliveryDraft, removeDeliveryDraftRule, setAllDeliveryDraftRates,\n updateDeliveryDraftRule, useDeliveryDraft, type DeliveryDraftRule,\n} from './delivery-draft'\nimport type { ColumnDef } from '@tanstack/react-table'\nimport { Button, DataTable, Input, Select, SelectContent, SelectItem, SelectTrigger, SelectValue } from '@fayz-ai/ui'\n\n// ---------------------------------------------------------------------------\n// A tabela que o agente monta e a lojista conserta.\n//\n// O cartão de confirmação do assistente mostra parâmetros; catorze regiões com\n// preço e prazo não cabem ali, e \"aprovar\" um JSON não é conferir. Então o\n// rascunho vira TELA: uma linha por regra, o desfecho num select, o preço num\n// campo, e o botão de salvar do lado de fora da conversa — ela pode corrigir\n// tudo e gravar sem dizer mais nada ao agente.\n//\n// Só aparece quando existe rascunho. Sem conversa, a tela de Entrega é a de\n// sempre.\n// ---------------------------------------------------------------------------\n\nconst OUTCOME_LABEL: Record<DeliveryOutcome, string> = {\n deliver: 'Entrego',\n review: 'Confirmo antes',\n refuse: 'Não entrego',\n}\n\nconst OUTCOME_TONE: Record<DeliveryOutcome, string> = {\n deliver: 'text-foreground',\n review: 'text-amber-600 dark:text-amber-500',\n refuse: 'text-destructive',\n}\n\n/** '12,50' e '12.50' são o mesmo número para quem está no balcão. */\nfunction parseMoney(raw: string): number | null {\n const cleaned = raw.replace(/[^\\d,.-]/g, '').replace(',', '.')\n if (!cleaned.trim()) return null\n const n = Number(cleaned)\n return Number.isFinite(n) && n >= 0 ? Math.round(n * 100) / 100 : null\n}\n\nconst money = (v: number | null | undefined): string =>\n v == null ? '' : String(v).replace('.', ',')\n\nconst BULK_INPUT = 'h-auto rounded-md border-border bg-background px-2 py-1 text-xs shadow-none'\nconst FIELD_FRAME = 'inline-flex items-center rounded-md border border-border bg-background focus-within:ring-1 focus-within:ring-ring'\nconst FRAMED_INPUT = 'h-auto rounded-none border-0 bg-transparent py-1.5 text-xs shadow-none focus-visible:ring-0 focus-visible:ring-offset-0'\n\nfunction ruleArea(rule: DeliveryDraftRule): string {\n if (rule.matchKind === 'postal_range') {\n const fmt = (c?: string | null) => (c ? `${c.slice(0, 5)}-${c.slice(5)}` : '?')\n return `${fmt(rule.postalFrom)} → ${fmt(rule.postalTo)}`\n }\n return rule.matchKind === 'city' ? 'Município' : 'Bairro'\n}\n\nexport interface DeliveryRulesDraftProps {\n provider?: ShopProviderResolver\n /** Recarrega a lista de zonas depois de gravar. */\n onSaved: () => void\n}\n\nexport function DeliveryRulesDraft({ provider, onSaved }: DeliveryRulesDraftProps) {\n const draft = useDeliveryDraft()\n const [saving, setSaving] = React.useState(false)\n const [error, setError] = React.useState<string | null>(null)\n const [bulkRate, setBulkRate] = React.useState('')\n const [bulkFree, setBulkFree] = React.useState('')\n\n if (draft.rules.length === 0 && draft.gaps.length === 0) return null\n\n const refusing = draft.rules.filter((r) => r.outcome === 'refuse').length\n const reviewing = draft.rules.filter((r) => r.outcome === 'review').length\n const delivering = draft.rules.length - refusing - reviewing\n\n const columns: ColumnDef<DeliveryDraftRule>[] = [\n {\n id: 'region', header: 'Região', meta: { className: 'px-5 py-2.5' },\n cell: ({ row: { original: rule } }) => (\n <>\n <span className=\"font-medium\">{rule.label}</span>\n <span className=\"ml-2 text-xs text-muted-foreground\">{ruleArea(rule)}</span>\n {rule.source && (\n <p className=\"text-xs italic text-muted-foreground\">“{rule.source}”</p>\n )}\n </>\n ),\n },\n {\n id: 'outcome', header: 'O que faço', meta: { className: 'px-2 py-2.5' },\n cell: ({ row: { original: rule } }) => (\n <Select\n value={rule.outcome}\n onValueChange={(v) => updateDeliveryDraftRule(rule.id, { outcome: v as DeliveryOutcome })}\n >\n <SelectTrigger className={`h-auto w-auto gap-1.5 rounded-md border-border bg-background px-2 py-1.5 text-xs shadow-none ${OUTCOME_TONE[rule.outcome]}`}>\n <SelectValue />\n </SelectTrigger>\n <SelectContent>\n {(Object.keys(OUTCOME_LABEL) as DeliveryOutcome[]).map((value) => (\n <SelectItem key={value} value={value}>{OUTCOME_LABEL[value]}</SelectItem>\n ))}\n </SelectContent>\n </Select>\n ),\n },\n // Recusa não cobra: mostrar campo de preço numa linha que nunca o lê\n // convida a lojista a preencher e a achar que cobrou.\n {\n id: 'rate', header: 'Frete', meta: { className: 'px-2 py-2.5' },\n cell: ({ row: { original: rule } }) => rule.outcome === 'refuse'\n ? <span className=\"text-xs text-muted-foreground\">não se cobra</span>\n : (\n <span className={FIELD_FRAME}>\n <span className=\"pl-2 text-xs text-muted-foreground\">R$</span>\n <div className=\"w-16\">\n <Input\n value={money(rule.rate)}\n placeholder=\"0,00\"\n aria-label={`Frete para ${rule.label}`}\n onChange={(e) => updateDeliveryDraftRule(rule.id, { rate: parseMoney(e.target.value) })}\n className={`${FRAMED_INPUT} px-1.5`}\n />\n </div>\n </span>\n ),\n },\n {\n id: 'freeAbove', header: 'Grátis acima de', meta: { className: 'px-2 py-2.5' },\n cell: ({ row: { original: rule } }) => rule.outcome === 'refuse' ? null : (\n <span className={FIELD_FRAME}>\n <span className=\"pl-2 text-xs text-muted-foreground\">R$</span>\n <div className=\"w-20\">\n <Input\n value={money(rule.freeAbove)}\n placeholder=\"nunca\"\n aria-label={`Frete grátis acima de, em ${rule.label}`}\n onChange={(e) => updateDeliveryDraftRule(rule.id, { freeAbove: parseMoney(e.target.value) })}\n className={`${FRAMED_INPUT} px-1.5`}\n />\n </div>\n </span>\n ),\n },\n {\n id: 'eta', header: 'Prazo (dias)', meta: { className: 'px-2 py-2.5' },\n cell: ({ row: { original: rule } }) => rule.outcome === 'refuse' ? null : (\n <span className={FIELD_FRAME}>\n <div className=\"w-10\">\n <Input\n value={rule.etaMinDays ?? ''}\n placeholder=\"0\"\n inputMode=\"numeric\"\n aria-label={`Prazo mínimo em ${rule.label}`}\n onChange={(e) => updateDeliveryDraftRule(rule.id, {\n etaMinDays: e.target.value ? Number(e.target.value) : null,\n })}\n className={`${FRAMED_INPUT} pl-2 pr-0 text-center`}\n />\n </div>\n <span className=\"text-xs text-muted-foreground\">a</span>\n <div className=\"w-10\">\n <Input\n value={rule.etaMaxDays ?? ''}\n placeholder=\"2\"\n inputMode=\"numeric\"\n aria-label={`Prazo máximo em ${rule.label}`}\n onChange={(e) => updateDeliveryDraftRule(rule.id, {\n etaMaxDays: e.target.value ? Number(e.target.value) : null,\n })}\n className={`${FRAMED_INPUT} pl-0 pr-2 text-center`}\n />\n </div>\n </span>\n ),\n },\n {\n id: 'remove', header: '', meta: { className: 'px-5 py-2.5 text-right' },\n cell: ({ row: { original: rule } }) => (\n <Button variant=\"bare\" size=\"bare\"\n type=\"button\"\n onClick={() => removeDeliveryDraftRule(rule.id)}\n aria-label={`Remover ${rule.label}`}\n className=\"rounded-md p-1 text-muted-foreground hover:bg-muted hover:text-destructive\"\n >\n <Trash2 className=\"h-3.5 w-3.5\" />\n </Button>\n ),\n },\n ]\n\n const save = async () => {\n setSaving(true)\n setError(null)\n try {\n const shop = provider ? resolve(provider) : getShopProvider()\n if (typeof shop.createShippingZone !== 'function') {\n throw new Error('Este banco ainda não tem as regras de entrega.')\n }\n for (const rule of draft.rules) {\n await shop.createShippingZone(zoneInputFrom(rule))\n }\n clearDeliveryDraft()\n onSaved()\n } catch (err) {\n setError(errorMessage(err))\n } finally {\n setSaving(false)\n }\n }\n\n return (\n <div className=\"rounded-card border border-primary/40 bg-primary/5 shadow-sm\">\n <div className=\"flex flex-wrap items-center gap-3 border-b border-primary/20 px-5 py-4\">\n <ListChecks className=\"h-4 w-4 text-primary\" />\n <div className=\"flex-1\">\n {/* Neutro de propósito: a mesma tabela recebe o que ela escolheu na\n busca e o que o assistente leu da mensagem dela. */}\n <p className=\"text-sm font-medium\">Regras a salvar</p>\n <p className=\"text-xs text-muted-foreground\">\n {delivering} entrega{delivering === 1 ? '' : 's'}\n {reviewing > 0 && `, ${reviewing} a confirmar`}\n {refusing > 0 && `, ${refusing} recusa${refusing === 1 ? '' : 's'}`}\n {' '}— confira e corrija antes de salvar. Nada foi gravado ainda.\n </p>\n </div>\n <Button variant=\"bare\" size=\"bare\"\n type=\"button\"\n onClick={clearDeliveryDraft}\n disabled={saving}\n className=\"font-normal rounded-md px-3 py-2 text-xs text-muted-foreground hover:bg-muted\"\n >\n Descartar\n </Button>\n <Button variant=\"bare\" size=\"bare\"\n type=\"button\"\n onClick={save}\n disabled={saving || draft.rules.length === 0}\n className=\"inline-flex items-center gap-1.5 rounded-md bg-primary px-3.5 py-2 text-xs font-medium text-primary-foreground transition hover:opacity-90 disabled:opacity-50\"\n >\n {saving ? <Loader2 className=\"h-3.5 w-3.5 animate-spin\" /> : <Check className=\"h-3.5 w-3.5\" />}\n Salvar {draft.rules.length} regra{draft.rules.length === 1 ? '' : 's'}\n </Button>\n </div>\n\n {error && (\n <p className=\"px-5 pt-3 text-xs text-destructive\">{error}</p>\n )}\n\n {/* O mesmo frete em todas de uma vez. Quem escolheu catorze bairros cobra\n o mesmo nos catorze, e digitar catorze vezes é exatamente onde a\n configuração é abandonada. Linhas de recusa ficam de fora sozinhas. */}\n {delivering + reviewing > 1 && (\n <div className=\"flex flex-wrap items-center gap-2 border-b border-primary/10 px-5 py-3\">\n <span className=\"text-xs text-muted-foreground\">Mesmo preço em todas:</span>\n <span className=\"inline-flex items-center gap-1\">\n <span className=\"text-xs text-muted-foreground\">R$</span>\n <div className=\"w-20\">\n <Input\n value={bulkRate}\n onChange={(e) => setBulkRate(e.target.value)}\n placeholder=\"15,00\"\n aria-label=\"Frete para todas as regiões\"\n className={BULK_INPUT}\n />\n </div>\n </span>\n <span className=\"inline-flex items-center gap-1\">\n <span className=\"text-xs text-muted-foreground\">grátis acima de R$</span>\n <div className=\"w-24\">\n <Input\n value={bulkFree}\n onChange={(e) => setBulkFree(e.target.value)}\n placeholder=\"opcional\"\n aria-label=\"Frete grátis acima de, para todas as regiões\"\n className={BULK_INPUT}\n />\n </div>\n </span>\n <Button variant=\"bare\" size=\"bare\"\n type=\"button\"\n onClick={() => {\n setAllDeliveryDraftRates({\n rate: parseMoney(bulkRate),\n freeAbove: parseMoney(bulkFree),\n })\n setBulkRate('')\n setBulkFree('')\n }}\n disabled={!bulkRate.trim() && !bulkFree.trim()}\n className=\"rounded-md border border-border px-2.5 py-1 text-xs font-medium hover:bg-muted disabled:opacity-40\"\n >\n Aplicar\n </Button>\n </div>\n )}\n\n {draft.rules.length > 0 && <DataTable variant=\"bare\" columns={columns} data={draft.rules} />}\n\n {draft.gaps.length > 0 && (\n <div className=\"border-t border-primary/20 px-5 py-3.5\">\n <p className=\"text-xs font-medium text-muted-foreground\">\n O que ficou de fora — e por quê\n </p>\n <ul className=\"mt-1 space-y-1\">\n {draft.gaps.map((gap) => (\n <li key={gap.query} className=\"flex items-start gap-2 text-xs text-muted-foreground\">\n <X className=\"mt-0.5 h-3 w-3 shrink-0 text-destructive\" />\n <span><span className=\"font-medium text-foreground\">{gap.query}</span> — {gap.reason}</span>\n </li>\n ))}\n </ul>\n </div>\n )}\n </div>\n )\n}\n","import React from 'react'\nimport {\n SettingsGroup, TextRow, RegistryCrudView, adminNavigateTo,\n useConnectors, ConnectorRow, ConnectorDetail,\n openConnectorsPanel, useConnectorsPanelAvailable,\n type UnifiedConnector,\n} from '@fayz-ai/admin'\nimport { getShopProvider } from '@fayz-ai/shop'\nimport type { ShippingSettings as ShippingSettingsRow, ShippingZone, StockLocation } from '@fayz-ai/shop'\nimport { AlertTriangle, ArrowRight, Car, Loader2, MapPin, Truck, Warehouse } from 'lucide-react'\nimport { resolve, type ShopProviderResolver } from '../data/shared'\nimport { errorMessage } from './error-message'\nimport { PackagesSettings } from './PackagesSettings'\nimport {\n buildShopRegistries, locationSummary, LOCATIONS_REGISTRY, SHIPPING_ZONES_REGISTRY,\n} from '../data/registries'\nimport { shippingRecordPath, shippingRegistryIdFromHash, shippingRegistryPath } from '../data/registry-routes'\nimport { HandlingSettings } from './HandlingSettings'\nimport { ChoiceCards } from './ChoiceCards'\nimport { useStoreSettings } from './useStoreSettings'\nimport { DeliveryAgentSurface } from '../views/DeliveryAgentSurface'\nimport { DeliveryAreaPicker } from '../views/DeliveryAreaPicker'\nimport { DeliveryRulesDraft } from '../views/DeliveryRulesDraft'\nimport { Button } from '@fayz-ai/ui'\nimport { navigateApp, onAppPathChange } from '@fayz-ai/core'\n\nexport interface ShippingSettingsProps {\n provider?: ShopProviderResolver\n /**\n * 'delivery' draws only what a delivery store sets for its site: the fee,\n * free delivery and the regions. It is what Configurações › Delivery embeds\n * (`shop.delivery-settings`); origin, packages and freight gateways are an\n * e-commerce's and stay on the full screen.\n */\n variant?: 'full' | 'delivery'\n}\n\n/** Money in, as typed: '12,50' and '12.50' are the same number to a shopkeeper. */\nfunction parseMoney(raw: string): number | null {\n const cleaned = raw.replace(/[^\\d,.-]/g, '').replace(',', '.')\n if (!cleaned.trim()) return null\n const n = Number(cleaned)\n return Number.isFinite(n) && n >= 0 ? Math.round(n * 100) / 100 : null\n}\n\nconst formatMoney = (v: number | null | undefined): string =>\n v == null ? '' : String(v).replace('.', ',')\n\ntype FreightSource = 'own' | 'gateway'\n\n/** Stored rather than inferred from \"no connection\": connecting a gateway must not\n * start quoting carriers for a store that dispatches by hand. */\nconst FREIGHT_SOURCE: ReadonlyArray<{\n value: FreightSource\n label: string\n description: string\n Icon: React.ComponentType<{ className?: string }>\n}> = [\n {\n value: 'own',\n label: 'Eu mesmo calculo e despacho',\n description:\n 'O frete sai do preço base e das suas faixas de CEP, e você despacha como quiser — carro próprio, motoboy, agência. Nenhum gateway é consultado, mesmo que exista um conectado.',\n Icon: Car,\n },\n {\n value: 'gateway',\n label: 'Perguntar a um gateway de frete',\n description:\n 'O preço e o prazo vêm da transportadora, calculados pelo CEP do comprador. Quando o gateway não responde a tempo, o checkout usa suas faixas — a compra nunca fica sem preço.',\n Icon: Truck,\n },\n]\n\n/**\n * Entrega — o preço base, as zonas e quem coleta.\n *\n * A ORDEM DE PRECEDÊNCIA é o assunto desta tela, e está escrita nela em vez de\n * só no SQL: uma ZONA que cobre o CEP ganha do preço base; o preço base é o que\n * a loja cobra para um endereço que nenhuma zona cobre. Sem isso dito, um\n * lojista que criou uma zona não entende por que o número que ele digitou aqui\n * não aparece no checkout.\n *\n * O preço base vive em public.shipping_settings desde a 0015 e, até agora, só\n * podia ser escrito por SQL à mão — a tabela existia, com RLS e leitura anônima,\n * e nenhuma tela. É este arquivo que fecha isso.\n *\n * ZONAS E EMBALAGENS SÃO CADASTROS, e desde a FAY-1407 são cadastros DAQUI. As\n * zonas moravam numa página de CRUD própria em /store/shipping, então clicar em\n * \"Zonas de entrega\" no meio de configurar a entrega jogava o lojista para fora\n * de Configurações e o trazia de volta pela seta do navegador. Agora as duas\n * abrem em `_properties/<id>` dentro desta mesma tela, pelo `RegistryCrudView`\n * genérico — o mesmo que desenha feriados e locais.\n */\n\nexport function ShippingSettings({ provider, variant = 'full' }: ShippingSettingsProps) {\n const embedded = variant === 'delivery'\n // A rota mais funda ganha: /settings/shop-shipping/_properties/zonas é a\n // mesma aba, mostrando o cadastro em vez do resumo. Sem isso a lista de zonas\n // apareceria inteira embaixo do preço base o tempo todo.\n const [registryId, setRegistryId] = React.useState(shippingRegistryIdFromHash)\n React.useEffect(() => {\n const handler = () => setRegistryId(shippingRegistryIdFromHash())\n return onAppPathChange(handler)\n }, [])\n\n const shop = React.useMemo(() => (provider ? resolve(provider) : getShopProvider()), [provider])\n const registries = React.useMemo(\n () => buildShopRegistries(provider ?? getShopProvider),\n [provider],\n )\n // One read of plg_shop_settings for the whole screen: both sections below are\n // slices of the same tenant row.\n const storeSettings = useStoreSettings(provider)\n const supported = typeof shop.getShippingSettings === 'function' && typeof shop.updateShippingSettings === 'function'\n\n const [row, setRow] = React.useState<ShippingSettingsRow | null>(null)\n const [zones, setZones] = React.useState<ShippingZone[] | null>(null)\n const [locations, setLocations] = React.useState<StockLocation[] | null>(null)\n const [loading, setLoading] = React.useState(supported)\n const [saving, setSaving] = React.useState(false)\n const [error, setError] = React.useState<string | null>(null)\n const [loadError, setLoadError] = React.useState<string | null>(null)\n\n // Drafts, because these are TEXT inputs over numbers: committing on every\n // keystroke would turn '1' into a R$ 1,00 flat rate on the way to '15'. They\n // commit on blur, which is also when the parse refusal can be shown without\n // fighting the person still typing.\n const [flatDraft, setFlatDraft] = React.useState('')\n const [freeDraft, setFreeDraft] = React.useState('')\n const [flatBad, setFlatBad] = React.useState(false)\n const [freeBad, setFreeBad] = React.useState(false)\n\n const { connectors } = useConnectors({ hostPluginId: 'shop', includeGrants: false })\n const [selected, setSelected] = React.useState<UnifiedConnector | null>(null)\n const panelAvailable = useConnectorsPanelAvailable()\n const openJourney = React.useCallback(\n (connector: UnifiedConnector) => {\n if (panelAvailable) openConnectorsPanel(connector)\n else setSelected(connector)\n },\n [panelAvailable],\n )\n const carriers = React.useMemo(\n () => (connectors ?? []).filter((c) => c.category === 'logistics' || c.category === 'shipping'),\n [connectors],\n )\n // 'ready' means declared and installed, not connected.\n const carriersConnected = carriers.some((c) => c.state !== 'ready')\n\n // Bumped after the assistant (or the draft panel) writes rules, so the cards\n // below re-read instead of showing the count from before the save.\n const [zonesEpoch, setZonesEpoch] = React.useState(0)\n const reloadZones = React.useCallback(() => setZonesEpoch((n) => n + 1), [])\n\n React.useEffect(() => {\n let cancelled = false\n if (supported) {\n setLoading(true)\n void shop\n .getShippingSettings!()\n .then((settings) => {\n if (cancelled) return\n setRow(settings)\n setFlatDraft(formatMoney(settings?.flatRate ?? 0))\n setFreeDraft(formatMoney(settings?.freeAbove))\n })\n .catch((e) => { if (!cancelled) setLoadError(errorMessage(e)) })\n .finally(() => { if (!cancelled) setLoading(false) })\n }\n void shop.listShippingZones?.()\n .then((list) => { if (!cancelled) setZones(list) })\n .catch(() => { if (!cancelled) setZones([]) })\n void shop.listStockLocations?.()\n .then((list) => { if (!cancelled) setLocations(list) })\n .catch(() => { if (!cancelled) setLocations([]) })\n return () => { cancelled = true }\n }, [shop, supported, zonesEpoch])\n\n const save = React.useCallback(\n (patch: Partial<ShippingSettingsRow>) => {\n if (!supported) return\n setSaving(true)\n setError(null)\n void shop\n .updateShippingSettings!(patch)\n .then((saved) => setRow(saved))\n .catch((e) => setError(errorMessage(e)))\n .finally(() => setSaving(false))\n },\n [shop, supported],\n )\n\n const commitFlat = () => {\n const parsed = parseMoney(flatDraft)\n // Empty means zero here — \"I charge nothing\" is a decision a store makes, and\n // it is also the column's default, so there is nothing ambiguous to refuse.\n const next = flatDraft.trim() === '' ? 0 : parsed\n if (next == null) { setFlatBad(true); return }\n setFlatBad(false)\n setFlatDraft(formatMoney(next))\n if (next !== (row?.flatRate ?? 0)) save({ flatRate: next })\n }\n\n const commitFree = () => {\n // Empty is NULL, not zero: \"no threshold\" and \"free from R$ 0\" are opposite\n // policies, and a zero here would make every order's delivery free.\n if (freeDraft.trim() === '') {\n setFreeBad(false)\n if (row?.freeAbove != null) save({ freeAbove: null })\n return\n }\n const parsed = parseMoney(freeDraft)\n if (parsed == null) { setFreeBad(true); return }\n setFreeBad(false)\n setFreeDraft(formatMoney(parsed))\n if (parsed !== row?.freeAbove) save({ freeAbove: parsed })\n }\n\n // An exclusion is active and is NOT a delivery zone.\n // `outcome` is 0081's word; `excluded` is 0048's and stays as the fallback for\n // a pool that has not reached 0081 yet.\n const outcomeOf = (z: ShippingZone) => z.outcome ?? (z.excluded ? 'refuse' : 'deliver')\n const activeZones = (zones ?? []).filter((z) => z.active && outcomeOf(z) === 'deliver')\n const reviewZones = (zones ?? []).filter((z) => z.active && outcomeOf(z) === 'review')\n const excludedZones = (zones ?? []).filter((z) => z.active && outcomeOf(z) === 'refuse')\n // undefined = undecided, which asks the gateway if one is connected.\n const usesGateway = storeSettings.value.carrierQuotes !== false\n\n // Only active locations that dispatch: an archived warehouse and one that just\n // holds stock are both irrelevant to what the shopper is quoted.\n const dispatching = (locations ?? []).filter((l) => l.status === 'active' && l.shipsOnline !== false)\n const originCep = dispatching.find((l) => l.postalCode)?.postalCode ?? null\n\n // Looked up, never compared to a literal: a `registryId === 'zonas'` here kept\n // rendering Embalagens after the rename, with nothing visibly broken.\n const activeRegistry = registryId\n ? registries.find((candidate) => candidate.id === registryId) ?? null\n : null\n if (activeRegistry) {\n // No back button of its own: the shell draws the whole trail.\n return (\n <RegistryCrudView\n registry={activeRegistry}\n basePath={shippingRegistryPath(activeRegistry.id)}\n />\n )\n }\n\n // A delivery store sets all of this on Configurações › Delivery, which embeds\n // the delivery variant of this very component. Two screens editing the same\n // fee was how a store ended up with a «Em breve» field and a live one.\n if (!embedded && storeSettings.value.deliveryFlow) {\n return (\n <div className=\"rounded-lg border bg-card p-5 text-sm shadow-sm\" data-testid=\"shipping-is-delivery\">\n <p className=\"font-medium\">Esta loja é um delivery</p>\n <p className=\"mt-1 text-muted-foreground\">\n Taxa de entrega, frete grátis, regiões, pedido mínimo e tempo estimado ficam em\n Configurações › Delivery. Esta tela é das lojas que despacham por transportadora.\n </p>\n <Button className=\"mt-3\" size=\"sm\" onClick={() => adminNavigateTo('/settings/orders-delivery')}>\n Abrir Delivery <ArrowRight className=\"ml-1 h-3.5 w-3.5\" />\n </Button>\n </div>\n )\n }\n\n return (\n <div className=\"space-y-4\">\n {loadError && (\n <div className=\"rounded-lg border border-destructive/30 bg-destructive/5 p-3 text-sm\">\n <p className=\"flex items-center gap-2 font-medium text-destructive\">\n <AlertTriangle className=\"h-4 w-4 shrink-0\" />\n Não foi possível carregar o preço base de entrega\n </p>\n <p className=\"mt-1 text-muted-foreground\">\n O valor abaixo é o padrão, não o da sua loja. Recarregue antes de alterá-lo — salvar\n agora sobrescreveria um preço que não conseguimos ler.\n </p>\n <p className=\"mt-1 text-xs text-muted-foreground\">{loadError}</p>\n </div>\n )}\n {!supported ? (\n <div className=\"rounded-lg border border-amber-500/30 bg-amber-500/5 p-4 text-sm\">\n <p className=\"flex items-center gap-2 font-medium text-amber-700 dark:text-amber-500\">\n <AlertTriangle className=\"h-4 w-4 shrink-0\" />\n Este app não guarda o preço base de entrega\n </p>\n <p className=\"mt-1 text-muted-foreground\">\n O provedor de loja montado aqui não implementa <code>getShippingSettings</code>.\n </p>\n </div>\n ) : (\n <SettingsGroup\n title={embedded ? 'Quanto custa a entrega' : 'Preço base'}\n description={embedded\n ? 'O que o site cobra para entregar quando nenhuma região abaixo tem preço próprio.'\n : 'O que a loja cobra quando nenhuma zona cobre o endereço. Uma zona que cobre o CEP sempre ganha deste número.'}\n >\n <TextRow\n label={embedded ? 'Taxa de entrega' : 'Frete padrão'}\n description=\"Em reais. Deixe 0 para entrega grátis.\"\n value={flatDraft}\n onChange={setFlatDraft}\n onBlurCommit={commitFlat}\n placeholder=\"0,00\"\n invalid={flatBad}\n hint={flatBad ? 'Informe um valor em reais (ex.: 19,90).' : undefined}\n disabled={loading}\n />\n <TextRow\n label=\"Frete grátis acima de\"\n description=\"Subtotal, já com desconto, a partir do qual a entrega sai de graça. Vazio = sem regra de frete grátis.\"\n value={freeDraft}\n onChange={setFreeDraft}\n onBlurCommit={commitFree}\n placeholder=\"Sem regra\"\n invalid={freeBad}\n hint={freeBad ? 'Informe um valor em reais, ou deixe vazio.' : undefined}\n disabled={loading}\n />\n </SettingsGroup>\n )}\n\n {!embedded && <div>\n <div className=\"px-1 pb-1 pt-4\">\n <h3 className=\"text-sm font-semibold\">De onde você despacha</h3>\n <p className=\"mt-0.5 text-[10px] text-muted-foreground\">\n Os locais que guardam estoque e despacham pedidos. O CEP do local padrão é a origem que a\n transportadora usa para cotar o frete — é aqui que ele se cadastra, uma vez. Cada local\n pode ter o seu próprio despachante ou seguir a decisão da loja.\n </p>\n </div>\n <div className=\"rounded-card border bg-card px-5 shadow-sm\">\n <Button variant=\"bare\" size=\"bare\"\n type=\"button\"\n // Named ONE place? Open it. The list is only the answer when there\n // is nothing specific to point at.\n onClick={() => {\n navigateApp(dispatching.length === 1 && dispatching[0]\n ? shippingRecordPath(LOCATIONS_REGISTRY, dispatching[0].id)\n : shippingRegistryPath(LOCATIONS_REGISTRY))\n }}\n className=\"font-normal justify-start whitespace-normal flex w-full items-center gap-3 py-3.5 text-left\"\n >\n <Warehouse className=\"h-4 w-4 shrink-0 text-muted-foreground\" />\n <span className=\"min-w-0 flex-1\">\n <span className=\"block text-sm font-medium\">\n {locations == null\n ? 'Carregando locais…'\n : dispatching.length === 0\n ? 'Nenhum local despacha pedidos'\n : dispatching.length === 1\n ? dispatching[0]!.name\n : `${dispatching.length} locais despachando`}\n </span>\n <span className=\"mt-0.5 block text-xs text-muted-foreground\">\n {locations == null\n ? ' '\n : dispatching.length === 0\n ? 'Cadastre o local de onde os pedidos saem.'\n : dispatching.slice(0, 2).map((l) => locationSummary(l)).join(' — ')}\n </span>\n </span>\n <ArrowRight className=\"h-4 w-4 shrink-0 text-muted-foreground\" />\n </Button>\n </div>\n {/* The one failure this screen can predict: a gateway that is asked to\n quote from nowhere answers nothing, and the shopper sees the zone\n price forever without knowing why. */}\n {usesGateway && locations != null && dispatching.length > 0 && !originCep && (\n <div className=\"mt-2 flex items-start gap-2 rounded-lg border border-amber-500/30 bg-amber-500/5 p-3 text-xs\">\n <AlertTriangle className=\"mt-0.5 h-3.5 w-3.5 shrink-0 text-amber-600\" />\n <span className=\"text-muted-foreground\">\n Nenhum local tem CEP de origem. Sem ele a transportadora não cota, e o checkout cai nas\n suas zonas — preencha o CEP do local padrão.\n </span>\n </div>\n )}\n </div>}\n\n {/* space-y porque esta seção tem QUATRO cards empilhados agora (busca,\n rascunho, o que está salvo) — quando era um só, o div nu bastava e os\n cards nasceram grudados no dia em que os outros entraram. */}\n <div className=\"space-y-3\">\n <div className=\"px-1 pb-1 pt-4\">\n <h3 className=\"text-sm font-semibold\">Onde você entrega</h3>\n <p className=\"mt-0.5 text-[10px] text-muted-foreground\">\n As regiões onde a loja entrega, com preço, prazo e frete grátis próprios. Um endereço\n fora de todas elas cai no preço base acima; se a loja não tiver preço base nem região que\n o cubra, o checkout diz que não entrega ali. Uma região também pode ser uma recusa —\n «não entrego aqui» — e ela vence qualquer outra e qualquer gateway.\n </p>\n </div>\n <DeliveryAgentSurface\n provider={() => shop}\n zones={zones ?? []}\n onSaved={reloadZones}\n />\n <DeliveryAreaPicker provider={provider} />\n <DeliveryRulesDraft provider={provider} onSaved={reloadZones} />\n <div className=\"rounded-card border bg-card px-5 shadow-sm\">\n <Button variant=\"bare\" size=\"bare\"\n type=\"button\"\n onClick={() => { navigateApp(shippingRegistryPath(SHIPPING_ZONES_REGISTRY)) }}\n className=\"font-normal justify-start whitespace-normal flex w-full items-center gap-3 py-3.5 text-left\"\n >\n <MapPin className=\"h-4 w-4 shrink-0 text-muted-foreground\" />\n <span className=\"min-w-0 flex-1\">\n <span className=\"block text-sm font-medium\">\n {zones == null\n ? 'Carregando regiões…'\n : activeZones.length === 0\n ? 'Nenhuma região salva ainda'\n : `${activeZones.length} ${activeZones.length === 1 ? 'região onde entrego' : 'regiões onde entrego'}`}\n </span>\n <span className=\"mt-0.5 block text-xs text-muted-foreground\">\n {activeZones.length === 0\n ? 'Sem região salva, toda entrega usa o preço base. Escolha as suas na busca acima.'\n : activeZones.slice(0, 3).map((z) => z.name).join(' · ')}\n {activeZones.length > 3 && ` e ${activeZones.length - 3} mais`}\n {reviewZones.length > 0 && (\n <span className=\"mt-0.5 block text-amber-700 dark:text-amber-500\">\n {reviewZones.length === 1\n ? '1 região a confirmar antes de sair'\n : `${reviewZones.length} regiões a confirmar antes de sair`}\n {' — '}\n {reviewZones.slice(0, 2).map((z) => z.name).join(' · ')}\n </span>\n )}\n {excludedZones.length > 0 && (\n <span className=\"mt-0.5 block text-red-700 dark:text-red-400\">\n {excludedZones.length === 1\n ? '1 região recusada'\n : `${excludedZones.length} regiões recusadas`}\n {' — '}\n {excludedZones.slice(0, 2).map((z) => z.name).join(' · ')}\n </span>\n )}\n </span>\n </span>\n <ArrowRight className=\"h-4 w-4 shrink-0 text-muted-foreground\" />\n </Button>\n </div>\n </div>\n\n {!embedded && <PackagesSettings />}\n\n {!embedded && storeSettings.supported && (\n <div>\n <div className=\"px-1 pb-1 pt-4\">\n <h3 className=\"text-sm font-semibold\">Quem calcula o frete</h3>\n <p className=\"mt-0.5 text-[10px] text-muted-foreground\">\n O Melhor Envio não é uma transportadora: é um gateway, uma conexão só que traz\n Correios, Jadlog, Loggi e outras. Então a escolha aqui não é qual transportadora — é\n se a loja calcula pelas próprias faixas ou se pergunta o preço a um gateway.\n </p>\n </div>\n <ChoiceCards\n label=\"Quem calcula o frete\"\n choices={FREIGHT_SOURCE}\n value={usesGateway ? 'gateway' : 'own'}\n onChange={(choice) => storeSettings.set({ carrierQuotes: choice === 'gateway' })}\n disabled={storeSettings.loading}\n />\n {/* Keeps the screen honest: with a gateway still connected the choice is\n recorded intent, not a guarantee. */}\n {!usesGateway && carriersConnected && (\n <div className=\"mt-2 flex items-start gap-2 rounded-lg border border-amber-500/30 bg-amber-500/5 p-3 text-xs\">\n <AlertTriangle className=\"mt-0.5 h-3.5 w-3.5 shrink-0 text-amber-600\" />\n <span className=\"text-muted-foreground\">\n Há um gateway ainda conectado abaixo. Para garantir que nenhum preço de\n transportadora apareça no checkout, desconecte-o — a escolha acima vale para a\n vitrine, a conexão continua existindo.\n </span>\n </div>\n )}\n </div>\n )}\n\n {!embedded && carriers.length > 0 && (\n <div className={usesGateway ? undefined : 'opacity-60'}>\n <div className=\"px-1 pb-1 pt-4\">\n <h3 className=\"text-sm font-semibold\">Gateway de frete</h3>\n <p className=\"mt-0.5 text-[10px] text-muted-foreground\">\n Conectado, ele cota o frete para o CEP do comprador em vez de a loja adivinhar. O preço\n cotado é gravado no servidor e é ele que o pedido cobra — o navegador escolhe entre\n opções, nunca informa um valor. Quais transportadoras aparecem vem da conta do\n gateway, não desta lista.\n </p>\n {!carriersConnected && (\n <p className=\"mt-1 text-[10px] text-muted-foreground\">\n Nenhum conectado — a loja entrega por conta própria, pelo preço base e pelas zonas\n acima. Conectar é opcional e pode ficar para depois.\n </p>\n )}\n </div>\n <div className=\"rounded-card border bg-card shadow-sm\">\n <ul className=\"divide-y\">\n {carriers.map((connector) => (\n <ConnectorRow key={connector.id} connector={connector} onOpen={openJourney} />\n ))}\n </ul>\n </div>\n </div>\n )}\n\n {!embedded && <HandlingSettings settings={storeSettings} provider={provider} />}\n\n <div className=\"flex min-h-5 items-center gap-1.5 px-1 text-xs text-muted-foreground\">\n {error ? (\n <span className=\"flex items-center gap-1.5 text-destructive\">\n <AlertTriangle className=\"h-3.5 w-3.5 shrink-0\" />\n Não foi possível salvar: {error}\n </span>\n ) : saving ? (\n <>\n <Loader2 className=\"h-3.5 w-3.5 shrink-0 animate-spin\" />\n Salvando…\n </>\n ) : (\n 'As alterações são salvas ao sair do campo.'\n )}\n </div>\n\n <ConnectorDetail\n connector={selected}\n open={!!selected}\n onOpenChange={(open) => { if (!open) setSelected(null) }}\n />\n </div>\n )\n}\n"]}
@@ -1,52 +1,13 @@
1
- import { stableKey, globalCache, toDataError, getPersistentCache, errorMessage as errorMessage$1, getActiveTenantId, formatCurrency } from '@fayz-ai/core';
1
+ import { applyQuery, resolve } from './chunk-YUG6XQHJ.js';
2
+ import { errorMessage } from './chunk-2MXOKJQO.js';
2
3
  import React3, { useState, useEffect } from 'react';
3
4
  import { Select, SelectTrigger, SelectValue, SelectContent, SelectItem, Button, Skeleton } from '@fayz-ai/ui';
4
5
  import { RefreshCw, MapPin } from 'lucide-react';
5
6
  import { OWN_FULFILLMENT, resolveShippingLabelProvider, getShopProvider } from '@fayz-ai/shop';
6
7
  import { useConnectors } from '@fayz-ai/admin';
7
8
  import { jsxs, jsx } from 'react/jsx-runtime';
9
+ import { formatCurrency } from '@fayz-ai/core';
8
10
 
9
- // src/views/customerLookup.ts
10
- function shopCustomerLookup(provider) {
11
- return {
12
- async getById(id) {
13
- const c = await provider().getCustomer(id);
14
- if (!c) return null;
15
- const name = [c.firstName, c.lastName].filter(Boolean).join(" ");
16
- return {
17
- id: c.id,
18
- label: name || c.email || "Cliente",
19
- subtitle: c.email ?? void 0,
20
- group: "shop_customer",
21
- // PersonLink reads contact fields off `data`, so the keys must match the
22
- // shape it expects (email/phone), not our camelCase type.
23
- data: {
24
- email: c.email ?? void 0,
25
- phone: c.phone ?? void 0,
26
- kind: "shop_customer",
27
- orders_count: c.ordersCount,
28
- total_spent: c.totalSpent
29
- }
30
- };
31
- }
32
- };
33
- }
34
- var rawMessage = (error) => errorMessage$1(error, "erro desconhecido");
35
- var RPC_REFUSAL = [
36
- [/nothing left to fulfill/i, "N\xE3o h\xE1 itens pendentes neste pedido \u2014 tudo j\xE1 foi enviado."],
37
- [/not a member of this store/i, "Sua conta n\xE3o tem permiss\xE3o para despachar pedidos desta loja."],
38
- [/order not found/i, "Pedido n\xE3o encontrado."],
39
- [/fulfillment not found/i, "Envio n\xE3o encontrado \u2014 recarregue a p\xE1gina."],
40
- [/fulfillment was cancelled/i, "Este envio foi cancelado. Registre um novo envio."],
41
- [/location does not belong to this store/i, "O local de estoque escolhido n\xE3o \xE9 desta loja."],
42
- [/not pending/i, "N\xE3o h\xE1 cobran\xE7a em aberto para registrar neste pedido."],
43
- [/not authorized to confirm payment/i, "Sua conta n\xE3o tem permiss\xE3o para registrar o pagamento deste pedido."]
44
- ];
45
- function errorMessage(error) {
46
- const raw = rawMessage(error);
47
- for (const [pattern, friendly] of RPC_REFUSAL) if (pattern.test(raw)) return friendly;
48
- return raw;
49
- }
50
11
  function AgencySelect({ value, onChange, values, provider }) {
51
12
  const resolve2 = provider ?? (() => getShopProvider());
52
13
  const { connectors } = useConnectors({ hostPluginId: "shop", includeGrants: false });
@@ -175,7 +136,7 @@ var cep = (value) => {
175
136
  return `${digits.slice(0, 5)}-${digits.slice(5)}`;
176
137
  };
177
138
  function buildShopShippingZoneEntity(currency = "BRL") {
178
- const money2 = (value) => value == null ? "\u2014" : formatCurrency(Number(value), currency);
139
+ const money = (value) => value == null ? "\u2014" : formatCurrency(Number(value), currency);
179
140
  const delivers = (values) => (values.outcome ?? "deliver") !== "refuse";
180
141
  const fields = [
181
142
  {
@@ -303,7 +264,7 @@ function buildShopShippingZoneEntity(currency = "BRL") {
303
264
  visibleWhen: delivers,
304
265
  showInTable: true,
305
266
  sortable: true,
306
- renderCell: (value) => /* @__PURE__ */ jsx("span", { className: "tabular-nums", children: money2(value) })
267
+ renderCell: (value) => /* @__PURE__ */ jsx("span", { className: "tabular-nums", children: money(value) })
307
268
  },
308
269
  {
309
270
  key: "freeAbove",
@@ -313,7 +274,7 @@ function buildShopShippingZoneEntity(currency = "BRL") {
313
274
  hint: "Deixe vazio para nunca dar frete gr\xE1tis nessa regi\xE3o. Vale mais que a regra geral da loja.",
314
275
  visibleWhen: delivers,
315
276
  showInTable: true,
316
- renderCell: (value) => /* @__PURE__ */ jsx("span", { className: "tabular-nums", children: money2(value) })
277
+ renderCell: (value) => /* @__PURE__ */ jsx("span", { className: "tabular-nums", children: money(value) })
317
278
  },
318
279
  {
319
280
  key: "etaMinDays",
@@ -385,54 +346,6 @@ function buildShopShippingZoneEntity(currency = "BRL") {
385
346
  ]
386
347
  };
387
348
  }
388
- var resolve = (p) => typeof p === "function" ? p() : p;
389
- var PRODUCT_CACHE_TABLE = "plg_shop_products";
390
- var PRODUCT_CACHE_TTL = 3e5;
391
- var productPrefix = () => `${getActiveTenantId() ?? "_"}:${PRODUCT_CACHE_TABLE}`;
392
- async function listProductsDetailed(p, params) {
393
- const key = `${productPrefix()}:${stableKey("list", params ?? {})}`;
394
- const hit = globalCache.get(key);
395
- if (hit) return { rows: hit, cached: true };
396
- try {
397
- const rows = await resolve(p).listProducts(params);
398
- globalCache.set(key, rows, PRODUCT_CACHE_TTL);
399
- return { rows };
400
- } catch (err) {
401
- if (toDataError(err).kind === "offline") {
402
- const stale = await getPersistentCache()?.getStale(key);
403
- if (stale) return { rows: stale.data, stale: true };
404
- }
405
- throw err;
406
- }
407
- }
408
- async function listProductsCached(p, params) {
409
- return (await listProductsDetailed(p, params)).rows;
410
- }
411
- function invalidateProductLists() {
412
- globalCache.invalidate(productPrefix());
413
- }
414
- function applyQuery(rows, query, facetKey) {
415
- const prop = (row, key) => row[key];
416
- let data = rows;
417
- if (facetKey) {
418
- const wanted = query.filters?.[facetKey];
419
- if (wanted && wanted !== "all") data = data.filter((row) => prop(row, facetKey) === wanted);
420
- }
421
- if (query.sortBy) {
422
- const dir = query.sortDir === "desc" ? -1 : 1;
423
- const key = query.sortBy;
424
- data = [...data].sort((a, b) => {
425
- const av = prop(a, key);
426
- const bv = prop(b, key);
427
- if (typeof av === "number" && typeof bv === "number") return (av - bv) * dir;
428
- return String(av ?? "").localeCompare(String(bv ?? ""), "pt-BR") * dir;
429
- });
430
- }
431
- const total = data.length;
432
- const page = query.page ?? 1;
433
- const size = query.pageSize ?? total;
434
- return { data: data.slice((page - 1) * size, page * size), total };
435
- }
436
349
 
437
350
  // src/data/shippingZoneDataProvider.ts
438
351
  function createShopShippingZoneDataProvider(provider) {
@@ -1031,51 +944,7 @@ var marketsRegistry = {
1031
944
  icon: "Globe",
1032
945
  description: 'Onde a loja vende: cada mercado tem moeda, pa\xEDses, filial e frete pr\xF3prios, e uma tabela de pre\xE7o na sua moeda. O pre\xE7o de cada produto por mercado fica na aba "Pre\xE7os por mercado" do produto. Sem mercados, a loja vende numa moeda s\xF3.'
1033
946
  };
1034
- function normalize(value) {
1035
- return value.normalize("NFD").replace(/[\u0300-\u036f]/gu, "").toLowerCase().replace(/[^a-z0-9\s]/gu, " ").replace(/\s+/gu, " ").trim();
1036
- }
1037
- var tokensOf = (value) => normalize(value).split(" ").filter(Boolean);
1038
- function scoreProduct(term, product) {
1039
- const wanted = normalize(term);
1040
- if (!wanted) return 0;
1041
- const name = normalize(product.name);
1042
- const sku = normalize(product.sku ?? "");
1043
- if (sku && sku === wanted) return 100;
1044
- if (name === wanted) return 98;
1045
- if (name.includes(wanted)) return 85;
1046
- if (wanted.includes(name) && name.length >= 4) return 75;
1047
- const wantedTokens = tokensOf(term);
1048
- const nameTokens = new Set(tokensOf(product.name));
1049
- if (wantedTokens.length === 0) return 0;
1050
- const hit = wantedTokens.filter((t) => nameTokens.has(t)).length;
1051
- const ratio = hit / wantedTokens.length;
1052
- if (ratio < 0.5) return 0;
1053
- return Math.round(40 + ratio * 30);
1054
- }
1055
- function rankProducts(term, catalog, limit = 5) {
1056
- return catalog.map((product) => ({ product, score: scoreProduct(term, product) })).filter((row) => row.score > 0).sort((a, b) => b.score - a.score || a.product.name.length - b.product.name.length || a.product.name.localeCompare(b.product.name)).slice(0, limit).map(({ product, score }) => ({
1057
- productId: product.id,
1058
- name: product.name,
1059
- sku: product.sku,
1060
- price: product.price,
1061
- stock: product.inventoryCount ?? 0,
1062
- score
1063
- }));
1064
- }
1065
- var CONFIDENT_SCORE = 70;
1066
- var CONFIDENT_GAP = 15;
1067
- function resolveTerm(term, catalog) {
1068
- const ranked = rankProducts(term, catalog);
1069
- const [top, second] = ranked;
1070
- if (!top) return { term };
1071
- if (top.score >= CONFIDENT_SCORE && (!second || top.score - second.score >= CONFIDENT_GAP)) {
1072
- return { term, resolved: top };
1073
- }
1074
- return { term, options: ranked.filter((c) => top.score - c.score < CONFIDENT_GAP) };
1075
- }
1076
- var money = (value) => formatCurrency(Number(value) || 0, "BRL");
1077
- var candidateMeta = (candidate) => [money(candidate.price), candidate.stock > 0 ? `${candidate.stock} em estoque` : "sem estoque"].join(" \xB7 ");
1078
947
 
1079
- export { LOCATIONS_REGISTRY, PACKAGES_REGISTRY, SHIPPING_PROFILES_REGISTRY, SHIPPING_ZONES_REGISTRY, applyQuery, buildShopRegistries, buildStockLocationsRegistry, candidateMeta, errorMessage, invalidateProductLists, listProductsCached, listProductsDetailed, locationSummary, marketsRegistry, packageMeasureLabel, packagesRegistry, resolve, resolveTerm, shopCustomerLookup };
1080
- //# sourceMappingURL=chunk-XV3KZRQX.js.map
1081
- //# sourceMappingURL=chunk-XV3KZRQX.js.map
948
+ export { LOCATIONS_REGISTRY, PACKAGES_REGISTRY, SHIPPING_PROFILES_REGISTRY, SHIPPING_ZONES_REGISTRY, buildShopRegistries, buildStockLocationsRegistry, locationSummary, marketsRegistry, packageMeasureLabel, packagesRegistry };
949
+ //# sourceMappingURL=chunk-STZYH32S.js.map
950
+ //# sourceMappingURL=chunk-STZYH32S.js.map