@fayz-ai/plugin-shop 0.16.2 → 0.16.4

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.
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/views/ShipOrderForm.tsx","../src/views/SenderLocationModal.tsx","../src/views/new-order-rules.ts","../src/views/ShipWithCarrier.tsx","../src/views/ShipmentActions.tsx","../src/views/OrderProviderLinks.tsx","../src/views/OrderPaymentDetail.tsx","../src/views/order-actions.ts","../src/views/NewOrderCharge.tsx","../src/views/customerEntity.tsx","../src/views/CustomerModal.tsx","../src/views/OrderDetailView.tsx","../src/views/StockEntryModal.tsx","../src/views/NewOrderPage.tsx","../src/views/orders-agent.ts","../src/views/OrdersAgentSurface.tsx","../src/views/ShopPage.tsx"],"names":["React","jsx","text","useState","service","jsxs","Truck","getSupabaseClientOptional","useEffect","STATUS_LABEL","ExternalLink","currency","money","useCallback","Button","Check","Copy","useMemo","toast","documentDigits","CrudRecordModal","dateTime","useRef","data","Modal","ModalContent","Fragment","ModalHeader","ModalTitle","ModalFooter","QrCode","adminNavigateTo","formatDocument","OrderDetailBlock","SharedOrderDetailView","ModalPortal","ModalOverlay","ModalDescription","ModalBody","onlyDigits","digits","isValidDocument","resolveCustomerId","formatPhone","Pencil","React12","getShopProvider","PersonLink","PageActions"],"mappings":"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","file":"ShopPage-V65TI34Q.js","sourcesContent":["import React, { useState } from 'react'\nimport { errorMessage } from '../settings/error-message'\nimport { Truck } from 'lucide-react'\nimport { getSupabaseClientOptional } from '@fayz-ai/core'\nimport type { ShopProvider } from '@fayz-ai/shop'\n\n// ---------------------------------------------------------------------------\n// \"Marquei como enviado\" — the merchant packs the box and types what the\n// courier gave them.\n//\n// Deliberately NOT a modal: this block already lives inside the order page, and\n// a dialog over it would be the second layer the founder ruled out. It is a\n// two-step inline form instead — the button opens it, and confirming is the\n// second click, because creating a shipment moves stock off the shelf.\n//\n// Carrier is free text on purpose. The store that delivers by car is as real as\n// the one that ships by Correios, and a dropdown of carriers would be the SDK\n// telling a merchant how to run their own delivery.\n// ---------------------------------------------------------------------------\n\nexport interface ShipOrderFormProps {\n orderId: string\n provider: () => ShopProvider\n /** Called after the shipment exists, so the page can re-read it. */\n onShipped: () => void\n}\n\nexport function ShipOrderForm({ orderId, provider, onShipped }: ShipOrderFormProps) {\n const [open, setOpen] = useState(false)\n const [carrier, setCarrier] = useState('')\n const [tracking, setTracking] = useState('')\n const [saving, setSaving] = useState(false)\n const [error, setError] = useState<string | null>(null)\n\n // The merchant console reads the store through SupabaseShopProvider, which\n // has no createFulfillment — only the storefront's REST provider does. Falling\n // back to the RPC directly is what keeps the button on the page: without it\n // the whole dispatch step disappeared from the only screen that needs it.\n const db = getSupabaseClientOptional() as {\n rpc?: (fn: string, args: unknown) => Promise<{ error: { message: string } | null }>\n from?: (t: string) => any\n } | null\n const supported = typeof provider().createFulfillment === 'function' || typeof db?.rpc === 'function'\n if (!supported) return null\n\n async function ship() {\n setSaving(true)\n setError(null)\n try {\n if (typeof provider().createFulfillment === 'function') {\n await provider().createFulfillment?.({\n orderId,\n carrier: carrier.trim() || undefined,\n trackingCode: tracking.trim() || undefined,\n })\n } else {\n // `shop_create_fulfillment` era da loja e foi aposentada; a canônica é\n // `fulfillment_record`, do arquétipo — mesma coisa para qualquer produto\n // que entrega algo. O erro que aparecia (\"Could not find the function\n // ... in the schema cache\") é o banco tendo andado sem o cliente junto.\n //\n // Ela EXIGE as linhas: a antiga aceitava `p_items: null` como \"tudo o\n // que falta\", e a nova não adivinha — porque uma entrega parcial é o\n // caso normal numa loja, e \"tudo\" é uma escolha, não um padrão. Aqui a\n // escolha é tudo, que é o que este botão sempre significou.\n // O que FALTA, não o que foi vendido. `v_order_fulfillment.pending` já é\n // pedido menos entregue por linha — usar as linhas cruas mandaria a\n // quantidade inteira de novo a cada despacho, e uma segunda remessa\n // duplicaria a primeira em silêncio. É também o que preserva a recusa\n // que a função antiga dava (\"nothing left to fulfill\").\n const { data: pending } = await db!.from!('v_order_fulfillment')\n .select('item_id, pending')\n .eq('order_id', orderId)\n .gt('pending', 0)\n const lines = (pending ?? []).map((i: { item_id: string; pending: number }) => ({\n item_id: i.item_id,\n quantity: i.pending,\n }))\n if (lines.length === 0) throw new Error('Não há itens pendentes de envio neste pedido.')\n\n const { error: rpcError } = await db!.rpc!('fulfillment_record', {\n p_order_id: orderId,\n p_lines: lines,\n p_kind: 'shipment',\n // Enviado, não entregue: quem despacha não sabe se chegou, e\n // `delivered` é o padrão da função porque a maioria dos produtos que\n // a usam entregam na hora. Uma loja não.\n p_status: 'in_transit',\n p_metadata: {\n carrier: carrier.trim() || null,\n tracking_code: tracking.trim() || null,\n },\n })\n if (rpcError) throw new Error(rpcError.message)\n }\n setOpen(false)\n setCarrier('')\n setTracking('')\n onShipped()\n } catch (err: unknown) {\n // The RPC's own refusals are the useful ones: \"nothing left to fulfill\"\n // and \"not a member of this store\" both tell the merchant what happened.\n setError(errorMessage(err))\n } finally {\n setSaving(false)\n }\n }\n\n if (!open) {\n return (\n <button\n type=\"button\"\n onClick={() => setOpen(true)}\n data-testid=\"order-ship\"\n className=\"mt-2 inline-flex items-center gap-1.5 rounded-md border px-3 py-1.5 text-sm font-medium transition hover:bg-muted\"\n >\n <Truck className=\"h-3.5 w-3.5\" />\n Marcar como enviado\n </button>\n )\n }\n\n return (\n <div className=\"mt-2 space-y-2 rounded-md border bg-muted/30 p-3\">\n <div className=\"fz-fields fz-fields-2 gap-2\">\n <label className=\"block\">\n <span className=\"text-xs font-medium text-muted-foreground\">Transportadora</span>\n <input\n value={carrier}\n onChange={(event) => setCarrier(event.target.value)}\n placeholder=\"Correios, motoboy, entrega própria…\"\n data-testid=\"order-ship-carrier\"\n className=\"mt-1 w-full rounded-md border bg-background px-2.5 py-1.5 text-sm outline-none focus:border-primary\"\n />\n </label>\n <label className=\"block\">\n <span className=\"text-xs font-medium text-muted-foreground\">Código de rastreio</span>\n <input\n value={tracking}\n onChange={(event) => setTracking(event.target.value)}\n placeholder=\"Opcional\"\n data-testid=\"order-ship-tracking\"\n className=\"mt-1 w-full rounded-md border bg-background px-2.5 py-1.5 text-sm outline-none focus:border-primary\"\n />\n </label>\n </div>\n <p className=\"text-xs text-muted-foreground\">\n {tracking.trim()\n ? 'Com rastreio o pedido já sai como «em trânsito» e o comprador vê o código.'\n : 'Sem rastreio o envio fica como «aguardando coleta» — dá para completar depois.'}\n </p>\n <p className=\"text-xs text-muted-foreground\">\n Confirmar dá baixa no estoque destes itens.\n </p>\n {error && (\n <p className=\"rounded-md border border-red-200 bg-red-50 px-2.5 py-1.5 text-xs text-red-800\">{error}</p>\n )}\n <div className=\"flex gap-2\">\n <button\n type=\"button\"\n onClick={ship}\n disabled={saving}\n data-testid=\"order-ship-confirm\"\n className=\"rounded-md bg-primary px-3 py-1.5 text-sm font-medium text-primary-foreground transition hover:opacity-90 disabled:opacity-60\"\n >\n {saving ? 'Registrando…' : 'Confirmar envio'}\n </button>\n <button\n type=\"button\"\n onClick={() => { setOpen(false); setError(null) }}\n className=\"rounded-md border px-3 py-1.5 text-sm font-medium transition hover:bg-muted\"\n >\n Cancelar\n </button>\n </div>\n </div>\n )\n}\n","import React from 'react'\nimport { CrudRecordModal } from '@fayz-ai/admin'\nimport { getShopProvider } from '@fayz-ai/shop'\nimport { buildStockLocationsRegistry } from '../data/registries'\nimport type { ShopProvider, StockLocation } from '@fayz-ai/shop'\n\n// ---------------------------------------------------------------------------\n// The dispatch location, opened from wherever the carrier refused it.\n//\n// No form of its own: the Locais registry already declares every field, label,\n// group and rule, and a second copy here would drift the first time either\n// changes. This is the glue — which record, and how to read and write it —\n// over the shared CrudRecordModal.\n// ---------------------------------------------------------------------------\n\n/**\n * The same row `shop-shipping-label` reads: active, dispatching online, default\n * first. Resolved here too rather than passed in, so the screen showing the\n * refusal and the function that produced it cannot disagree about which\n * warehouse is wrong.\n */\nexport function pickDispatchLocation(\n locations: StockLocation[],\n locationId?: string | null,\n): StockLocation | null {\n if (locationId) return locations.find((place) => place.id === locationId) ?? null\n const alive = locations.filter((place) => place.status !== 'archived')\n const dispatching = alive.filter((place) => place.shipsOnline !== false)\n // A store whose only place has \"despacha pedidos\" off still has a place to\n // edit — and the form carries that switch. Offering it beats telling a\n // merchant with one warehouse that they have none.\n const pool = dispatching.length > 0 ? dispatching : alive\n return pool.find((place) => place.isDefault) ?? pool[0] ?? null\n}\n\nexport interface SenderLocationModalProps {\n open: boolean\n onClose: () => void\n /** Called after a save, so the caller can retry what the carrier refused. */\n onSaved: () => void\n provider?: () => ShopProvider\n /** Which place. Defaults to the one the label function reads. */\n locationId?: string | null\n}\n\nexport function SenderLocationModal({\n open, onClose, onSaved, provider, locationId,\n}: SenderLocationModalProps) {\n const resolve = provider ?? (() => getShopProvider())\n const registry = React.useMemo(() => buildStockLocationsRegistry(resolve), [provider])\n const chosen = React.useRef<string | null>(null)\n\n return (\n <CrudRecordModal\n open={open}\n onClose={onClose}\n onSaved={onSaved}\n entityDef={registry.entity}\n title=\"Remetente das etiquetas\"\n description=\"É o que vai impresso na etiqueta, e é o que a transportadora confere.\"\n emptyLabel=\"Esta loja não tem nenhum local que despacha pedidos. Cadastre um em Entrega ▸ Locais.\"\n load={async () => {\n const rows = (await resolve().listStockLocations?.()) ?? []\n const place = pickDispatchLocation(rows, locationId)\n chosen.current = place?.id ?? null\n return place as unknown as Record<string, any> | null\n }}\n save={async (data) => {\n if (!chosen.current) throw new Error('Nenhum local de despacho para salvar.')\n return (await resolve().updateStockLocation?.(chosen.current, data)) as unknown as Record<string, any>\n }}\n />\n )\n}\n","import type { CheckoutSettlement } from '@fayz-ai/shop'\n\n// ---------------------------------------------------------------------------\n// The two decisions the new-order screen makes that are worth locking down:\n// what an acquirer's answer means, and what a draft is still missing.\n// ---------------------------------------------------------------------------\n\nexport type ChargeOutcome = 'waiting' | 'paid' | 'expired' | 'failed'\n\n/**\n * What the merchant is told while a Pix is open.\n *\n * `pending` is the ordinary answer for as long as the buyer has the QR code in\n * front of them, and reading it as a refusal put \"o pagamento não foi\n * concluído\" on screen one second after the charge was opened. Only the three\n * dead states end the wait; anything else — including a state this build has\n * never heard of — keeps waiting.\n */\nexport function chargeOutcome(state: CheckoutSettlement['state'] | undefined): ChargeOutcome {\n if (state === 'paid') return 'paid'\n if (state === 'expired') return 'expired'\n if (state === 'failed' || state === 'cancelled') return 'failed'\n return 'waiting'\n}\n\n/**\n * How the merchant ends the sale they just typed.\n *\n * `link` is the one where nobody is present: the cart is frozen and the\n * acquirer hands back an address to send. It is a separate ending rather than a\n * flavour of `charge` because it asks for different things — a phone to send it\n * to, and no document, since the customer fills that in on the acquirer's own\n * page.\n */\nexport type NewOrderEnding = 'charge' | 'link' | 'received' | 'later'\n// `later` é o que a tela chama de \"Salvar pedido\": o pedido é criado em aberto,\n// sem pagamento nenhum. É o único desfecho que não decide nada sobre dinheiro —\n// e por isso o principal, já que perder o que foi digitado é o único erro sem\n// conserto desta tela.\n\nexport interface NewOrderDraft {\n lineCount: number\n /** Lines whose product has options but no variant chosen yet. */\n unresolvedVariants: number\n customerName: string\n customerEmail: string\n customerPhone: string\n /** Digits only. Empty when the merchant did not ask for it. */\n customerDocument: string\n documentValid: boolean\n /** True once the address carries a postcode the store can quote. */\n delivers: boolean\n addressComplete: boolean\n}\n\n/**\n * The one sentence that stands between a draft and the act — or null.\n *\n * The acquirer's requirements only apply to the charge ending: a counter sale\n * settled in cash needs no CPF, and demanding one there would be this screen\n * inventing a rule nobody has.\n */\nexport function validateNewOrder(draft: NewOrderDraft, ending: NewOrderEnding): string | null {\n if (draft.lineCount === 0) return 'Adicione pelo menos um produto ao pedido.'\n if (draft.unresolvedVariants > 0) {\n return 'Escolha a variação de cada produto que tem mais de uma opção.'\n }\n if (!draft.customerName.trim()) return 'Informe o cliente.'\n if (draft.delivers && !draft.addressComplete) return 'Complete o endereço de entrega.'\n if (draft.customerDocument && !draft.documentValid) return 'Esse CPF/CNPJ não confere.'\n if (ending === 'charge') {\n const missing = [\n !draft.customerEmail.trim() && 'e-mail',\n !draft.customerDocument.trim() && 'CPF',\n !draft.customerPhone.trim() && 'telefone',\n ].filter(Boolean)\n if (missing.length) {\n // Names WHERE the fix is: these three live on the customer's record, and\n // the screen turns this sentence into a button that opens it.\n return `Para gerar a cobrança o adquirente exige ${missing.join(', ')} no cadastro do cliente.`\n }\n }\n if (ending === 'link') {\n // Deliberately SHORTER than the charge's list, and the difference is where\n // the data is typed. The customer fills their own document in on the\n // acquirer's page — demanding it here would block a link over a field the\n // merchant does not have and the payment does not need.\n //\n // The phone stays required: a link nobody can be sent is not a sale, it is\n // a URL in a panel.\n const missing = [\n !draft.customerEmail.trim() && 'e-mail',\n !draft.customerPhone.trim() && 'telefone',\n ].filter(Boolean)\n if (missing.length) {\n return `Para mandar o link o cadastro do cliente precisa de ${missing.join(' e ')}.`\n }\n }\n return null\n}\n\n/**\n * Is this the \"one e-mail, one customer\" index refusing a second row?\n *\n * Postgres says it as `duplicate key value violates unique constraint\n * \"shop_customers_tenant_email_idx\"`, which is true and useless to a merchant\n * mid-call: the person is already their customer, and what they want is that\n * record. Matched by SQLSTATE first, by the sentence only as a fallback for the\n * transports that drop the code.\n */\nexport function isDuplicateEmail(error: unknown): boolean {\n const code = String((error as { code?: string } | null)?.code ?? '')\n if (code === '23505') return true\n const message = String((error as { message?: string } | null)?.message ?? error ?? '')\n return /duplicate key value/iu.test(message) && /email/iu.test(message)\n}\n\n/**\n * The product `shop_place_order` refused to sell — or null when the refusal was\n * about something else.\n *\n * The RPC raises `shop_place_order: insufficient stock for <nome>` (23514) and\n * that sentence, on its own, ends the sale: the merchant has the customer on\n * the phone, the stock is on the shelf, and the only path forward is another\n * screen. Naming the product is what lets this one offer the entry instead.\n *\n * The name is whatever `products.name` holds, spaces and all, so it runs to the\n * end of the message rather than to the first separator.\n */\nexport function insufficientStockProduct(message: string | null | undefined): string | null {\n const found = /insufficient stock for\\s+(.+?)\\s*$/iu.exec(String(message ?? ''))\n return found ? found[1].trim() : null\n}\n\n/**\n * Is the carrier complaining about the SENDER rather than this order?\n *\n * Its refusals name the field — \"O campo from.phone é obrigatório quando service\n * for 4\" — and every `from.*` one is about the store's dispatch location, which\n * the merchant can fix without leaving the screen. `to.*` is about the order,\n * and a button offering to edit the warehouse would be a wrong turn.\n */\nexport function isSenderRefusal(message: string | null | undefined): boolean {\n const text = String(message ?? '')\n return /\\bfrom\\./iu.test(text) || /remetente/iu.test(text)\n}\n","import React, { useCallback, useEffect, useMemo, useState } from 'react'\nimport { Button, Skeleton } from '@fayz-ai/ui'\nimport { useConnectors } from '@fayz-ai/admin'\nimport { AlertTriangle, CheckCircle2, ExternalLink, Loader2, Printer, RefreshCw, Truck } from 'lucide-react'\nimport { resolveShippingLabelProvider } from '@fayz-ai/shop'\nimport { errorMessage } from '../settings/error-message'\nimport { SenderLocationModal } from './SenderLocationModal'\nimport { isSenderRefusal } from './new-order-rules'\nimport type { ShippingLabel, ShippingLabelOption, ShopProvider } from '@fayz-ai/shop'\n\n// ---------------------------------------------------------------------------\n// Despatching through the carrier the store connected.\n//\n// \"Marcar como enviado\" was the whole dispatch story: the merchant went to the\n// carrier's own site, bought a label there, came back and typed the tracking\n// code by hand. With Melhor Envio connected, all of that is one screen — quote\n// this order, buy the label, print it, and let the code arrive on its own.\n//\n// The purchase is the only step that spends money, so it is the only one behind\n// a second click: choosing a service opens a confirmation that restates WHAT is\n// being bought and FOR HOW MUCH, and only the button in there spends.\n// Everything else (quoting, printing, tracking) is free and repeatable.\n// ---------------------------------------------------------------------------\n\nconst money = (value: number) =>\n new Intl.NumberFormat('pt-BR', { style: 'currency', currency: 'BRL' }).format(Number(value) || 0)\n\nconst eta = (option: ShippingLabelOption) => {\n const min = option.etaMinDays ?? null\n const max = option.etaMaxDays ?? null\n if (!min && !max) return null\n if (min && max && min !== max) return `${min}–${max} dias`\n return `${max ?? min} dia(s)`\n}\n\nexport interface ShipWithCarrierProps {\n orderId: string\n /**\n * The app's shop provider. WHO carries the parcel is resolved from the\n * registry, but reading the store's own dispatch location is ordinary data\n * access — and the global runtime provider is not the app's, so without this\n * the sender form found no locations in a store that has them.\n */\n provider?: () => ShopProvider\n /** The carrier the merchant chose, when they chose one. */\n preferredCarrier?: string | null\n /** Called after the label exists, so the order can re-read its shipments. */\n onShipped: () => void\n}\n\nexport function ShipWithCarrier({ orderId, provider, preferredCarrier, onShipped }: ShipWithCarrierProps) {\n // WHO issues the label is resolved, never assumed: this screen names no\n // carrier, and the second one to be implemented needs nothing here.\n const { connectors } = useConnectors({ hostPluginId: 'shop', includeGrants: false })\n const carrier = useMemo(() => resolveShippingLabelProvider({\n connected: (connectors ?? []).filter((c) => c.state === 'connected').map((c) => c.slug),\n preferred: preferredCarrier,\n }), [connectors, preferredCarrier])\n const [options, setOptions] = useState<ShippingLabelOption[] | null>(null)\n const [label, setLabel] = useState<ShippingLabel | null>(null)\n const [chosen, setChosen] = useState<number | null>(null)\n const [open, setOpen] = useState(false)\n const [confirming, setConfirming] = useState(false)\n const [busy, setBusy] = useState(false)\n const [error, setError] = useState<string | null>(null)\n const [unavailable, setUnavailable] = useState(false)\n // A refusal about `from.*` is about the store's own record, not this order.\n const [fixingSender, setFixingSender] = useState(false)\n // The purchase just landed on THIS screen: worth saying out loud once, then\n // getting out of the way — the block below is the permanent record.\n const [celebrating, setCelebrating] = useState(false)\n\n const load = useCallback(async () => {\n setBusy(true)\n setError(null)\n try {\n const result = await carrier?.quote(orderId)\n if (!result) { setUnavailable(true); return }\n setOptions(result.options)\n setLabel(result.label)\n setChosen(result.options[0]?.serviceId ?? null)\n } catch (err: unknown) {\n // A store with no carrier connected is the ordinary case, not a failure:\n // the block simply does not appear, and \"marcar como enviado\" still does.\n const message = errorMessage(err)\n if (/conectada|not_connected|404/iu.test(message)) setUnavailable(true)\n else setError(message)\n } finally {\n setBusy(false)\n }\n }, [orderId, carrier])\n\n // Only when asked: quoting on every order page would spend the store's rate\n // limit at the carrier to draw a block nobody opened.\n useEffect(() => { if (open && options === null) void load() }, [open, options, load])\n\n // A label already bought is worth showing without a click.\n useEffect(() => {\n let cancelled = false\n carrier?.quote(orderId)\n .then((result) => {\n if (cancelled || !result?.label) return\n setLabel(result.label)\n setOptions(result.options)\n setOpen(true)\n })\n .catch(() => { /* silence: the block stays closed */ })\n return () => { cancelled = true }\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [orderId])\n\n // The success banner is a moment, not a state of the order.\n useEffect(() => {\n if (!celebrating) return\n const timer = setTimeout(() => setCelebrating(false), 8000)\n return () => clearTimeout(timer)\n }, [celebrating])\n\n // No carrier connected (or none implemented): the block disappears and the\n // manual \"marcar como enviado\" is the whole story, as it was.\n if (!carrier || unavailable) return null\n\n async function buy() {\n // The quote can go stale while the confirmation sits open (a reload, a\n // second tab). Spending money on a service that is no longer on the list\n // is worse than sending the merchant back to pick again.\n const service = options?.find((option) => option.serviceId === chosen)\n if (!chosen || !service) {\n setConfirming(false)\n setError('A cotação mudou. Escolha o serviço de novo antes de comprar.')\n return\n }\n setBusy(true)\n setError(null)\n try {\n const bought = await carrier?.buy(orderId, chosen)\n // No label id is not a purchase: showing \"etiqueta comprada\" over it\n // would hide a dispatch that never happened.\n if (!bought?.labelId) {\n throw new Error('A transportadora aceitou o pedido mas não devolveu a etiqueta. Tente de novo em instantes.')\n }\n setLabel(bought)\n setConfirming(false)\n setCelebrating(true)\n onShipped()\n } catch (err: unknown) {\n // Stay on the confirmation: the refusal belongs next to the button that\n // caused it, and retrying is one click, not four.\n setError(errorMessage(err))\n } finally {\n setBusy(false)\n }\n }\n\n async function refreshTracking() {\n setBusy(true)\n setError(null)\n try {\n const tracking = await carrier?.track(orderId)\n setLabel((current) => (current ? { ...current, tracking: tracking ?? current.tracking } : current))\n onShipped()\n } catch (err: unknown) {\n setError(errorMessage(err))\n } finally {\n setBusy(false)\n }\n }\n\n async function print() {\n setBusy(true)\n setError(null)\n try {\n const url = (await carrier?.print(orderId)) ?? label?.labelUrl\n if (url) window.open(url, '_blank', 'noopener')\n else setError('A transportadora ainda não liberou o PDF da etiqueta.')\n } catch (err: unknown) {\n setError(errorMessage(err))\n } finally {\n setBusy(false)\n }\n }\n\n // ── Bought: the label, its code, and the two things left to do with it ─────\n if (label?.labelId) {\n return (\n <div\n className={`mt-2 space-y-2 rounded-md border p-3 transition-colors ${\n celebrating ? 'border-emerald-300 bg-emerald-50/60' : 'bg-muted/30'\n }`}\n data-testid=\"carrier-label\"\n >\n <div className=\"flex items-center justify-between gap-2\">\n <span className=\"flex items-center gap-1.5 text-sm font-medium\">\n {celebrating && <CheckCircle2 className=\"h-4 w-4 shrink-0 text-emerald-600\" />}\n Etiqueta comprada\n </span>\n {label.tracking?.code && (\n <span className=\"font-mono text-xs\">{label.tracking.code}</span>\n )}\n </div>\n {celebrating && (\n <p className=\"text-xs text-emerald-800\" role=\"status\" data-testid=\"carrier-bought\">\n Compra concluída. Imprima a etiqueta e cole no pacote — o rastreio passa a chegar sozinho.\n </p>\n )}\n {label.tracking?.status && (\n <p className=\"text-xs text-muted-foreground\">Situação na transportadora: {label.tracking.status}</p>\n )}\n <CarrierError error={error} onFix={() => setFixingSender(true)} />\n <div className=\"flex flex-wrap gap-2\">\n <Button size=\"sm\" onClick={print} disabled={busy} data-testid=\"carrier-print\">\n <Printer className=\"mr-1.5 h-3.5 w-3.5\" />\n Imprimir etiqueta\n </Button>\n <Button size=\"sm\" variant=\"outline\" onClick={refreshTracking} disabled={busy} data-testid=\"carrier-track\">\n <RefreshCw className=\"mr-1.5 h-3.5 w-3.5\" />\n Atualizar rastreio\n </Button>\n {label.tracking?.url && (\n <a href={label.tracking.url} target=\"_blank\" rel=\"noreferrer\"\n className=\"inline-flex items-center rounded-md border px-3 py-1.5 text-sm font-medium transition hover:bg-muted\">\n <ExternalLink className=\"mr-1.5 h-3.5 w-3.5\" />\n Acompanhar\n </a>\n )}\n </div>\n </div>\n )\n }\n\n if (!open) {\n return (\n <button type=\"button\" onClick={() => setOpen(true)} data-testid=\"carrier-open\"\n className=\"mt-2 inline-flex items-center gap-1.5 rounded-md border px-3 py-1.5 text-sm font-medium transition hover:bg-muted\">\n <Truck className=\"h-3.5 w-3.5\" />\n Comprar etiqueta na {carrier.label}\n </button>\n )\n }\n\n const service = options?.find((option) => option.serviceId === chosen)\n // Confirming a row that is no longer in the quote is not confirming anything:\n // the screen falls back to the picker instead of locking on a ghost.\n const pending = confirming ? service : undefined\n\n return (\n <div className=\"mt-2 space-y-2 rounded-md border bg-muted/30 p-3\" data-testid=\"carrier-buy\">\n {/* The skeleton wears the shape of what is coming — a radio, two lines of\n service and a price — so the block does not jump when the carrier\n answers. */}\n {busy && options === null && (\n <div className=\"space-y-1.5\" data-testid=\"carrier-quoting\" aria-busy=\"true\" aria-label=\"Cotando com a transportadora\">\n {[0, 1].map((row) => (\n <div key={row} className=\"flex items-center gap-2 rounded-md border p-2\">\n <Skeleton className=\"h-4 w-4 shrink-0 rounded-full\" />\n <div className=\"min-w-0 flex-1 space-y-1.5\">\n <Skeleton className=\"h-3.5 w-40\" />\n <Skeleton className=\"h-3 w-16\" />\n </div>\n <Skeleton className=\"h-3.5 w-14\" />\n </div>\n ))}\n </div>\n )}\n\n {options?.length === 0 && (\n <p className=\"text-sm text-muted-foreground\">\n A transportadora não atende este endereço com os dados deste pedido.\n </p>\n )}\n\n {options && options.length > 0 && (\n // Locked while the confirmation is open: the panel below quotes a price,\n // and a radio that still moves makes it a promise about the wrong row.\n <div className={`space-y-1.5 ${pending ? 'pointer-events-none opacity-50' : ''}`}>\n {options.map((option) => (\n <label key={option.serviceId}\n className={`flex cursor-pointer items-center gap-2 rounded-md border p-2 text-sm transition ${\n chosen === option.serviceId ? 'border-primary bg-primary/5' : 'hover:bg-muted/50'\n }`}>\n <input type=\"radio\" name=\"carrier-service\" checked={chosen === option.serviceId}\n disabled={Boolean(pending)}\n onChange={() => setChosen(option.serviceId)} data-testid=\"carrier-service\" />\n <span className=\"min-w-0 flex-1\">\n <span className=\"block truncate\">{option.carrier} · {option.name}</span>\n {eta(option) && <span className=\"block text-xs text-muted-foreground\">{eta(option)}</span>}\n </span>\n <span className=\"tabular-nums\">{money(option.price)}</span>\n </label>\n ))}\n </div>\n )}\n\n {/* While confirming, the refusal belongs inside the panel, next to the\n button that produced it. */}\n {!pending && <CarrierError error={error} onFix={() => setFixingSender(true)} />}\n\n <SenderLocationModal\n provider={provider}\n open={fixingSender}\n onClose={() => setFixingSender(false)}\n // Back to the picker: the sender changed, so the quote is re-read and\n // the merchant confirms against the new prices, not the old panel.\n onSaved={() => { setFixingSender(false); setConfirming(false); setError(null); void load() }}\n />\n\n {pending ? (\n <div className=\"space-y-2 rounded-md border border-amber-300 bg-amber-50 px-2.5 py-2\"\n role=\"alertdialog\" aria-label=\"Confirmar compra da etiqueta\" data-testid=\"carrier-confirm-panel\">\n <div className=\"flex items-start gap-2\">\n <AlertTriangle className=\"mt-0.5 h-4 w-4 shrink-0 text-amber-600\" />\n <div className=\"min-w-0 flex-1 space-y-1.5\">\n <p className=\"text-xs font-medium text-amber-900\">Confirmar compra da etiqueta</p>\n {/* What is being bought, restated: the merchant agrees to this row\n and this price, not to whatever the list happens to show. */}\n <div className=\"flex items-baseline justify-between gap-2 rounded border border-amber-200 bg-white/70 px-2 py-1.5\">\n <span className=\"min-w-0\">\n <span className=\"block truncate text-xs\">{pending.carrier} · {pending.name}</span>\n {eta(pending) && <span className=\"block text-[11px] text-muted-foreground\">{eta(pending)}</span>}\n </span>\n <span className=\"shrink-0 text-sm font-semibold tabular-nums\">{money(pending.price)}</span>\n </div>\n <p className=\"text-[11px] text-amber-900\">\n O valor é debitado do saldo da sua conta na {carrier.label}. A etiqueta sai na hora e o\n rastreio passa a chegar sozinho.\n </p>\n </div>\n </div>\n\n <CarrierError error={error} onFix={() => setFixingSender(true)} />\n\n <div className=\"flex justify-end gap-2\">\n <Button size=\"sm\" variant=\"outline\" onClick={() => { setConfirming(false); setError(null) }}\n disabled={busy} data-testid=\"carrier-confirm-back\">\n Voltar\n </Button>\n <Button size=\"sm\" onClick={buy} disabled={busy} data-testid=\"carrier-confirm\">\n {busy && <Loader2 className=\"mr-1.5 h-3.5 w-3.5 animate-spin\" />}\n {busy ? 'Comprando…' : error ? 'Tentar de novo' : `Comprar ${money(pending.price)}`}\n </Button>\n </div>\n </div>\n ) : (\n <div className=\"flex justify-end gap-2\">\n <Button size=\"sm\" variant=\"ghost\" onClick={() => setOpen(false)} data-testid=\"carrier-close\">\n Fechar\n </Button>\n <Button size=\"sm\" onClick={() => { setError(null); setConfirming(true) }}\n disabled={busy || !chosen} data-testid=\"carrier-buy-start\">\n Selecionar etiqueta\n </Button>\n </div>\n )}\n </div>\n )\n}\n\n/**\n * The carrier's refusal, with the way out when there is one.\n *\n * \"O campo from.phone é obrigatório\" is about the STORE's record, not this\n * order — and the merchant reading it here should not have to go looking for\n * Entrega ▸ Locais to fix it.\n */\nfunction CarrierError({ error, onFix }: { error: string | null; onFix: () => void }) {\n if (!error) return null\n return (\n <div role=\"alert\" data-testid=\"carrier-error\"\n className=\"rounded-md border border-red-200 bg-red-50 px-2.5 py-1.5 text-xs text-red-800\">\n <p>{error}</p>\n {isSenderRefusal(error) && (\n <button type=\"button\" onClick={onFix} data-testid=\"carrier-fix-sender\"\n className=\"mt-1 font-medium underline underline-offset-2\">\n Completar o cadastro do remetente\n </button>\n )}\n </div>\n )\n}\n","import React, { useState } from 'react'\nimport { errorMessage } from '../settings/error-message'\nimport { getSupabaseClientOptional } from '@fayz-ai/core'\nimport type { ShopProvider } from '@fayz-ai/shop'\n\n// ---------------------------------------------------------------------------\n// What happens to a shipment AFTER it exists: the tracking code the courier\n// only hands over later, the delivery, and the run that came back.\n//\n// Without these a shipment created without tracking was a dead end on screen —\n// stuck at \"aguardando coleta\" forever, with the merchant's only recourse being\n// the database. Same seam as ShipOrderForm: the provider when it has the\n// method, the RPC when it does not (the merchant console's provider does not).\n// ---------------------------------------------------------------------------\n\ntype Db = {\n rpc?: (fn: string, args: unknown) => Promise<{ error: { message: string } | null }>\n from?: (t: string) => any\n}\n\nexport interface ShipmentActionsProps {\n fulfillmentId: string\n status: string\n hasTracking: boolean\n provider: () => ShopProvider\n onChanged: () => void\n}\n\nexport function ShipmentActions({ fulfillmentId, status, hasTracking, provider, onChanged }: ShipmentActionsProps) {\n const [mode, setMode] = useState<'idle' | 'tracking' | 'cancel'>('idle')\n const [tracking, setTracking] = useState('')\n // A transportadora e o link vêm junto do código, não numa segunda visita: é\n // o mesmo instante em que o lojista tem o papel da coleta na mão. Sem o link,\n // o comprador recebe um código e nenhum lugar onde colar.\n const [trackingUrl, setTrackingUrl] = useState('')\n const [carrier, setCarrier] = useState('')\n const [busy, setBusy] = useState(false)\n const [error, setError] = useState<string | null>(null)\n\n const db = getSupabaseClientOptional() as Db | null\n if (status === 'cancelled' || status === 'returned') return null\n if (!db && typeof provider().shipFulfillment !== 'function') return null\n\n async function run(action: () => Promise<void>) {\n setBusy(true); setError(null)\n try {\n await action()\n setMode('idle'); setTracking(''); setTrackingUrl(''); setCarrier('')\n onChanged()\n } catch (err: unknown) {\n setError(errorMessage(err))\n } finally { setBusy(false) }\n }\n\n const saveTracking = () => run(async () => {\n const code = tracking.trim()\n if (!code) throw new Error('Informe o código que a transportadora deu.')\n const url = trackingUrl.trim() || null\n const who = carrier.trim() || null\n if (typeof provider().shipFulfillment === 'function') {\n await provider().shipFulfillment?.(fulfillmentId, {\n trackingCode: code,\n trackingUrl: url ?? undefined,\n carrier: who ?? undefined,\n })\n return\n }\n const { error: rpcError } = await db!.rpc!('shop_ship_fulfillment', {\n p_fulfillment_id: fulfillmentId, p_tracking: code, p_tracking_url: url, p_carrier: who,\n })\n if (rpcError) throw new Error(rpcError.message)\n })\n\n // Passa pela FUNÇÃO, como as irmãs (0060). Antes era um UPDATE direto na\n // tabela: dependia de a RLS deixar o navegador escrever `fulfillments`, não\n // conferia se quem clicou é da loja, e reescrevia a hora da entrega a cada\n // clique. Também dava \"entregue\" sem `shipped_at` — e a linha do tempo do\n // comprador pulava do pedido direto para a porta.\n const markDelivered = () => run(async () => {\n if (typeof provider().deliverFulfillment === 'function') {\n await provider().deliverFulfillment?.(fulfillmentId)\n return\n }\n const { error: rpcError } = await db!.rpc!('shop_deliver_fulfillment', {\n p_fulfillment_id: fulfillmentId, p_delivered_at: null,\n })\n if (rpcError) throw new Error(rpcError.message)\n })\n\n const cancelShipment = () => run(async () => {\n if (typeof provider().cancelFulfillment === 'function') {\n await provider().cancelFulfillment?.(fulfillmentId)\n return\n }\n const { error: rpcError } = await db!.rpc!('shop_cancel_fulfillment', {\n p_fulfillment_id: fulfillmentId, p_note: null,\n })\n if (rpcError) throw new Error(rpcError.message)\n })\n\n const link = 'rounded px-1.5 py-0.5 text-[11px] font-medium transition hover:bg-muted'\n\n if (mode === 'tracking') {\n return (\n <div className=\"mt-1.5 space-y-1.5\">\n <input\n value={carrier}\n onChange={(event) => setCarrier(event.target.value)}\n placeholder=\"Transportadora (Correios, motoboy…)\"\n data-testid=\"shipment-carrier-input\"\n className=\"w-full rounded-md border bg-background px-2 py-1 text-xs outline-none focus:border-primary\"\n />\n <input\n value={tracking}\n onChange={(event) => setTracking(event.target.value)}\n placeholder=\"Código de rastreio\"\n data-testid=\"shipment-tracking-input\"\n className=\"w-full rounded-md border bg-background px-2 py-1 text-xs outline-none focus:border-primary\"\n />\n <input\n value={trackingUrl}\n onChange={(event) => setTrackingUrl(event.target.value)}\n placeholder=\"Link de rastreio (opcional)\"\n data-testid=\"shipment-tracking-url-input\"\n className=\"w-full rounded-md border bg-background px-2 py-1 text-xs outline-none focus:border-primary\"\n />\n {error && <p className=\"text-[11px] text-red-700\">{error}</p>}\n <div className=\"flex gap-1.5\">\n <button type=\"button\" onClick={saveTracking} disabled={busy} data-testid=\"shipment-tracking-save\"\n className=\"rounded bg-primary px-2 py-0.5 text-[11px] font-medium text-primary-foreground disabled:opacity-60\">\n {busy ? 'Salvando…' : 'Salvar'}\n </button>\n <button type=\"button\" onClick={() => { setMode('idle'); setError(null) }} className={`border ${link}`}>Voltar</button>\n </div>\n </div>\n )\n }\n\n if (mode === 'cancel') {\n return (\n <div className=\"mt-1.5 space-y-1.5 rounded border border-red-200 bg-red-50 p-1.5\">\n <p className=\"text-[11px] text-red-900\">Cancelar devolve os itens ao estoque.</p>\n {error && <p className=\"text-[11px] text-red-700\">{error}</p>}\n <div className=\"flex gap-1.5\">\n <button type=\"button\" onClick={cancelShipment} disabled={busy} data-testid=\"shipment-cancel-confirm\"\n className=\"rounded bg-red-600 px-2 py-0.5 text-[11px] font-medium text-white disabled:opacity-60\">\n {busy ? 'Cancelando…' : 'Cancelar envio'}\n </button>\n <button type=\"button\" onClick={() => { setMode('idle'); setError(null) }} className={`border bg-background ${link}`}>Voltar</button>\n </div>\n </div>\n )\n }\n\n return (\n <div className=\"mt-1.5 flex flex-wrap items-center gap-1.5\">\n {!hasTracking && (\n <button type=\"button\" onClick={() => setMode('tracking')} data-testid=\"shipment-add-tracking\" className={`border ${link}`}>\n Informar rastreio\n </button>\n )}\n {status !== 'delivered' && (\n <button type=\"button\" onClick={markDelivered} disabled={busy} data-testid=\"shipment-deliver\" className={`border ${link}`}>\n {busy ? 'Salvando…' : 'Marcar como entregue'}\n </button>\n )}\n {status !== 'delivered' && (\n <button type=\"button\" onClick={() => setMode('cancel')} data-testid=\"shipment-cancel\" className={`border border-red-200 text-red-700 hover:bg-red-50 ${link}`}>\n Cancelar envio\n </button>\n )}\n {error && <p className=\"w-full text-[11px] text-red-700\">{error}</p>}\n </div>\n )\n}\n","import React, { useEffect, useState } from 'react'\nimport { OrderDetailBlock } from '@fayz-ai/admin'\nimport { getSupabaseClientOptional } from '@fayz-ai/core'\n\n// ---------------------------------------------------------------------------\n// \"Onde este pedido já chegou\" — the row of plg_shop_order_links, read as prose.\n//\n// Deliberately generic: it renders whatever links the order HAS rather than\n// asking about a provider by name. That is what makes the invoice appear the day\n// something starts writing it, and the next acquirer appear without this file\n// being edited — the same reason the table has no CHECK on `source`.\n//\n// Read-only on purpose. Re-sending is the connector's own act and belongs to the\n// connector's panel and to the clock; a second trigger buried in the order page\n// would be a second place to keep in step.\n// ---------------------------------------------------------------------------\n\ninterface OrderLink {\n id: string\n source: string\n kind: string\n external_id: string\n external_number: string | null\n url: string | null\n status: string | null\n synced_at: string | null\n}\n\nconst SOURCE_LABEL: Record<string, string> = {\n bling: 'Bling',\n appmax: 'AppMax',\n abacatepay: 'AbacatePay',\n}\n\nconst KIND_LABEL: Record<string, string> = {\n sales_order: 'Pedido de venda',\n payment: 'Cobrança',\n nfe: 'Nota fiscal',\n}\n\nconst STATUS_LABEL: Record<string, string> = {\n filed: 'Registrado',\n pending: 'Aguardando',\n paid: 'Pago',\n failed: 'Falhou',\n refunded: 'Estornado',\n draft: 'Rascunho',\n}\n\nconst dateTime = (iso: string) =>\n new Intl.DateTimeFormat('pt-BR', {\n day: '2-digit', month: '2-digit', year: 'numeric', hour: '2-digit', minute: '2-digit',\n }).format(new Date(iso))\n\nexport function OrderProviderLinks({ orderId }: { orderId: string }) {\n const [links, setLinks] = useState<OrderLink[] | null>(null)\n\n useEffect(() => {\n let cancelled = false\n const db = getSupabaseClientOptional() as unknown as { from: (t: string) => any } | null\n if (!db) return\n db.from('plg_shop_order_links')\n .select('id,source,kind,external_id,external_number,url,status,synced_at')\n .eq('order_id', orderId)\n // A COBRANÇA não entra aqui: ela vive no bloco de pagamento, junto do\n // valor e da forma. Listar de novo era o mesmo código de Pix duas vezes\n // na mesma tela, e a segunda não acrescentava nada.\n .neq('kind', 'payment')\n .order('created_at', { ascending: true })\n .then(({ data }: { data: OrderLink[] | null }) => {\n if (!cancelled) setLinks(data ?? [])\n })\n return () => { cancelled = true }\n }, [orderId])\n\n // Nothing yet is not worth a block: a store with no ERP and no acquirer would\n // otherwise carry an empty panel on every order forever.\n if (!links || links.length === 0) return null\n\n return (\n <OrderDetailBlock title=\"Nos sistemas conectados\" hint=\"Onde este pedido já chegou\">\n <div className=\"space-y-2 text-sm\" data-testid=\"order-provider-links\">\n {links.map((link) => (\n <div key={link.id} className=\"flex flex-wrap items-baseline justify-between gap-x-3 gap-y-0.5\">\n <span className=\"font-medium\">\n {SOURCE_LABEL[link.source] ?? link.source} · {KIND_LABEL[link.kind] ?? link.kind}\n </span>\n <span className=\"text-muted-foreground\">\n {link.url ? (\n <a href={link.url} target=\"_blank\" rel=\"noreferrer\" className=\"font-mono text-xs text-primary hover:underline\">\n {link.external_number ?? link.external_id}\n </a>\n ) : (\n <span className=\"font-mono text-xs\">{link.external_number ?? link.external_id}</span>\n )}\n {link.status && <span className=\"ml-2 text-xs\">{STATUS_LABEL[link.status] ?? link.status}</span>}\n </span>\n {link.synced_at && (\n <span className=\"w-full text-[11px] text-muted-foreground\">\n atualizado em {dateTime(link.synced_at)}\n </span>\n )}\n </div>\n ))}\n </div>\n </OrderDetailBlock>\n )\n}\n","import React, { useEffect, useState } from 'react'\nimport { Check, Copy, ExternalLink } from 'lucide-react'\nimport { getSupabaseClientOptional } from '@fayz-ai/core'\n\n// ---------------------------------------------------------------------------\n// Quem cobrou, e com que referência.\n//\n// O bloco de pagamento dizia \"Pix\" e a hora — o suficiente para saber QUE foi\n// pago, e nada para responder à ligação do cliente dizendo que pagou e não\n// recebeu. Falta sempre a mesma coisa: qual provedor, qual cobrança, e o código\n// que dá para colar no suporte deles.\n//\n// Vive dentro do bloco de pagamento de propósito. A mesma informação existia\n// solta em \"Nos sistemas conectados\", três blocos abaixo, onde ninguém procura\n// dinheiro.\n// ---------------------------------------------------------------------------\n\nconst PROVIDER_LABEL: Record<string, string> = {\n abacatepay: 'AbacatePay',\n appmax: 'AppMax',\n mercadopago: 'Mercado Pago',\n stripe: 'Stripe',\n}\n\nconst STATUS_LABEL: Record<string, string> = {\n paid: 'Confirmado',\n pending: 'Aguardando',\n failed: 'Recusado',\n refunded: 'Estornado',\n}\n\ninterface PaymentLink {\n source: string\n external_id: string\n url: string | null\n status: string | null\n}\n\nexport function OrderPaymentDetail({ orderId }: { orderId: string }) {\n const [link, setLink] = useState<PaymentLink | null>(null)\n const [copied, setCopied] = useState(false)\n\n useEffect(() => {\n let cancelled = false\n const db = getSupabaseClientOptional() as unknown as { from: (t: string) => any } | null\n if (!db) return\n db.from('plg_shop_order_links')\n .select('source,external_id,url,status')\n .eq('order_id', orderId)\n .eq('kind', 'payment')\n .order('created_at', { ascending: false })\n .limit(1)\n .then(({ data }: { data: PaymentLink[] | null }) => {\n if (!cancelled) setLink(data?.[0] ?? null)\n })\n return () => { cancelled = true }\n }, [orderId])\n\n // Um pedido pago à mão não tem cobrança de ninguém, e uma linha vazia dizendo\n // isso seria pior que o silêncio.\n if (!link) return null\n\n async function copy() {\n if (!link) return\n try {\n await navigator.clipboard.writeText(link.external_id)\n setCopied(true)\n setTimeout(() => setCopied(false), 2400)\n } catch {\n /* sem área de transferência: o código está na tela para copiar à mão */\n }\n }\n\n return (\n <div data-testid=\"order-payment-detail\" className=\"mt-1 space-y-1.5\">\n <div className=\"flex items-baseline justify-between gap-3 text-sm\">\n <span className=\"text-muted-foreground\">Cobrado por</span>\n <span className=\"font-medium\">\n {PROVIDER_LABEL[link.source] ?? link.source}\n {link.status && (\n <span className=\"ml-2 text-xs text-muted-foreground\">\n {STATUS_LABEL[link.status] ?? link.status}\n </span>\n )}\n </span>\n </div>\n <div className=\"flex items-baseline justify-between gap-3 text-sm\">\n <span className=\"text-muted-foreground\">Comprovante</span>\n <span className=\"flex items-center gap-1.5\">\n <code className=\"max-w-[16rem] truncate font-mono text-xs\" title={link.external_id}>\n {link.external_id}\n </code>\n <button\n type=\"button\"\n onClick={copy}\n aria-label=\"Copiar o código da cobrança\"\n data-testid=\"order-payment-copy\"\n className=\"rounded p-1 text-muted-foreground transition hover:bg-muted hover:text-foreground\"\n >\n {copied ? <Check className=\"h-3.5 w-3.5\" /> : <Copy className=\"h-3.5 w-3.5\" />}\n </button>\n {link.url && (\n <a\n href={link.url}\n target=\"_blank\"\n rel=\"noreferrer\"\n aria-label=\"Abrir no provedor\"\n className=\"rounded p-1 text-muted-foreground transition hover:bg-muted hover:text-foreground\"\n >\n <ExternalLink className=\"h-3.5 w-3.5\" />\n </a>\n )}\n </span>\n </div>\n </div>\n )\n}\n","import { getSupabaseClientOptional } from '@fayz-ai/core'\nimport type { ShopProvider } from '@fayz-ai/shop'\n\n// ---------------------------------------------------------------------------\n// Order actions that more than one screen performs — the order page one at a\n// time, the order list a selection at a time.\n//\n// Cancelling in particular is NEVER a plain status update: it has to give the\n// reserved stock back and close the receivable, and only the RPC does all\n// three. That rule lived inside the detail page; the list would have grown a\n// second, thinner copy of it, and the copies would have drifted the first time\n// the RPC changed.\n// ---------------------------------------------------------------------------\n\n/** Cancels one order through whichever door this store's provider offers. */\nexport async function cancelShopOrder(\n provider: ShopProvider,\n orderId: string,\n reason?: string,\n): Promise<void> {\n if (typeof provider.cancelOrder === 'function') {\n await provider.cancelOrder(orderId, reason)\n return\n }\n // The admin console's provider has no cancelOrder — call the RPC directly.\n const db = getSupabaseClientOptional() as\n | { rpc?: (fn: string, args: unknown) => Promise<{ error: { message: string } | null }> }\n | null\n if (!db?.rpc) throw new Error('Cancelamento indisponível nesta loja.')\n const { error } = await db.rpc('shop_cancel_order', { p_order_id: orderId, p_reason: reason ?? null })\n if (error) throw new Error(error.message)\n}\n","import React, { useCallback, useEffect, useRef, useState } from 'react'\nimport {\n Button, Modal, ModalPortal, ModalOverlay, ModalContent,\n ModalHeader, ModalBody, ModalFooter, ModalTitle,\n} from '@fayz-ai/ui'\nimport { Check, Copy, HandCoins, Link2, MessageCircle, QrCode, Share2 } from 'lucide-react'\nimport { chargeOutcome } from './new-order-rules'\nimport { toast } from '@fayz-ai/ui'\nimport type { ShopProvider } from '@fayz-ai/shop'\n\n// ---------------------------------------------------------------------------\n// The half-minute after the charge is opened, with the customer still on the\n// line: read the code out, send it on WhatsApp, watch it land.\n//\n// A MODAL over the order, not a page instead of it. The order does not exist\n// yet — it is born when the money lands — so replacing the screen with a QR\n// code threw away the cart the merchant had just built with the customer. Here\n// the cart stays behind the dialog: the Pix expires, they close it, and the\n// same order is settled another way.\n//\n// Polling is the point: nobody should refresh anything to learn the money\n// arrived. Closing does not cancel the charge — the code stays valid, and\n// reopening shows the same one instead of a second Pix.\n// ---------------------------------------------------------------------------\n\nconst POLL_MS = 4000\n\nexport interface NewOrderChargeProps {\n open: boolean\n provider: () => ShopProvider\n /** Null enquanto a cobrança está sendo aberta — o modal já está na tela. */\n sessionId: string | null\n /** Pix copy-and-paste. Null when the sale was closed with a link instead. */\n emv: string | null\n qrcodeBase64: string | null\n /**\n * O QR hospedado pelo adquirente, quando ele não devolve os bytes.\n *\n * A AbacatePay manda base64 e a Vindi manda a URL de um SVG. Desenhar um como\n * o outro é um <img> quebrado no instante exato em que alguém ia pagar, então\n * a tela desenha o que veio, e não o que ela esperava.\n */\n qrcodeUrl?: string | null\n /**\n * A escolha, quando ela ainda não foi feita.\n *\n * Sem isto o modal é o que sempre foi: uma cobrança pronta. Com isto ele abre\n * ANTES — mostrando as formas de cobrar e, depois do clique, o esqueleto do\n * que está vindo. É o padrão de qualquer coisa que demora: a janela aparece\n * na hora do clique, não quando o servidor termina.\n */\n onChoose?: (asLink: boolean) => void\n /** True entre a escolha e a resposta do adquirente. */\n opening?: boolean\n /** A recusa da ABERTURA, dentro da janela onde ela aconteceu. */\n error?: string | null\n /** \"Já recebi\" — a terceira forma de um pedido ficar pago, na mesma porta. */\n onRegisterReceipt?: () => void\n /** The acquirer's own page — one address, sent to whoever is buying. */\n paymentUrl?: string | null\n /**\n * WHICH acquirer opened this session.\n *\n * Not cosmetic: without it the settle call defaults to AbacatePay, and a store\n * on any other gateway had its charge polled against a provider that has never\n * heard of the transaction — a Pix that stayed \"aguardando\" forever while the\n * money was already in.\n */\n acquirer?: string | null\n total: number\n currency: string\n customerName: string\n customerPhone: string\n onPaid: (orderId?: string) => void\n onClose: () => void\n}\n\n/** Uma escolha: ícone, o que faz, e o que o lojista ganha com ela. */\nfunction ChargeChoice({ icon: Icon, title, hint, onClick, testId }: {\n icon: React.ComponentType<{ className?: string }>\n title: string\n hint: string\n onClick: () => void\n testId: string\n}) {\n return (\n <button\n type=\"button\"\n onClick={onClick}\n data-testid={testId}\n className=\"flex w-full items-start gap-3 rounded-md border px-3 py-2.5 text-left transition hover:border-primary hover:bg-muted/40\"\n >\n <Icon className=\"mt-0.5 h-4 w-4 shrink-0 text-muted-foreground\" />\n <span className=\"min-w-0\">\n <span className=\"block text-sm font-medium\">{title}</span>\n <span className=\"block text-xs text-muted-foreground\">{hint}</span>\n </span>\n </button>\n )\n}\n\nexport function NewOrderCharge({\n open, provider, sessionId, emv, qrcodeBase64, qrcodeUrl, paymentUrl, acquirer, total, currency,\n customerName, customerPhone, onPaid, onClose, onChoose, opening, onRegisterReceipt, error,\n}: NewOrderChargeProps) {\n const [state, setState] = useState<'waiting' | 'paid' | 'expired' | 'failed'>('waiting')\n const [copied, setCopied] = useState(false)\n const [checking, setChecking] = useState(false)\n const settled = useRef(false)\n // Uma pergunta por vez. O intervalo é de 4s e a resposta do adquirente pode\n // levar mais que isso — sem esta trava as chamadas empilham, e o que o\n // lojista vê é a tela parando.\n const inFlight = useRef(false)\n\n const money = new Intl.NumberFormat('pt-BR', { style: 'currency', currency }).format(total)\n\n const check = useCallback(async () => {\n if (settled.current || !sessionId || inFlight.current) return\n inFlight.current = true\n setChecking(true)\n try {\n const result = await provider().settleCheckoutSession?.(sessionId, acquirer)\n if (!result) return\n if (result.state === 'paid') {\n settled.current = true\n setState('paid')\n // A beat on the confirmation, then the order it just created.\n setTimeout(() => onPaid(result.orderId ?? undefined), 1200)\n return\n }\n const outcome = chargeOutcome(result.state)\n if (outcome !== 'waiting') {\n settled.current = true\n setState(outcome)\n }\n } catch {\n // Uma consulta que falhou não é uma cobrança que falhou: o código segue\n // válido e a próxima rodada pergunta de novo.\n } finally {\n inFlight.current = false\n setChecking(false)\n }\n }, [provider, sessionId, acquirer, onPaid])\n\n useEffect(() => {\n if (!open || !sessionId) return\n const timer = setInterval(() => { void check() }, POLL_MS)\n return () => clearInterval(timer)\n }, [open, sessionId, check])\n\n /**\n * A LINK sale and a Pix sale are the same dialog with one thing swapped: what\n * gets copied. Everything else — the polling, the wait, the order that is\n * born when the money lands — is identical, which is why this is one component\n * and not two.\n */\n const isLink = Boolean(paymentUrl && !emv)\n const payable = paymentUrl ?? emv ?? ''\n // Três telas numa: escolher, esperar, cobrar. `onChoose` é o que diz que a\n // primeira existe — sem ele o modal continua sendo o que sempre foi.\n // Os bytes quando há bytes, a URL quando o adquirente hospeda.\n const qrSrc = qrcodeBase64 ? `data:image/png;base64,${qrcodeBase64}` : (qrcodeUrl || null)\n const ready = Boolean(sessionId && payable)\n const choosing = Boolean(onChoose) && !ready && !opening\n\n async function copy() {\n if (!payable) return\n try {\n await navigator.clipboard.writeText(payable)\n setCopied(true)\n setTimeout(() => setCopied(false), 2400)\n } catch {\n /* no clipboard: the code is on screen to read out loud */\n }\n }\n\n /**\n * Mandar o QR como IMAGEM.\n *\n * O wa.me só carrega texto — não existe URL que entregue uma figura ao\n * WhatsApp, e prometer isso seria um botão que abre a conversa vazia. O que\n * existe são dois caminhos reais, nesta ordem: a folha de compartilhamento do\n * sistema (que no celular lista o WhatsApp e manda o arquivo), e a área de\n * transferência (que no desktop cola direto na conversa do WhatsApp Web).\n */\n async function shareQr() {\n if (!qrSrc) return\n // Bytes locais, ou os bytes que a URL do adquirente devolver. O `fetch` pode\n // esbarrar em CORS — e aí o caminho é o mesmo de um navegador sem\n // compartilhamento: o código copia e cola, que serve melhor ao cliente.\n let blob: Blob\n try {\n blob = qrcodeBase64\n ? new Blob([Uint8Array.from(atob(qrcodeBase64), (c) => c.charCodeAt(0))], { type: 'image/png' })\n : await (await fetch(qrSrc)).blob()\n } catch {\n toast.error('Não consegui pegar a imagem do QR', {\n description: 'Use \"Copiar código\" — o cliente cola no app do banco.',\n })\n return\n }\n const file = new File([blob], `pix-${money.replace(/\\D/gu, '')}.${blob.type.includes('svg') ? 'svg' : 'png'}`, { type: blob.type || 'image/png' })\n const share = navigator as Navigator & { canShare?: (d: unknown) => boolean }\n try {\n if (share.canShare?.({ files: [file] })) {\n await navigator.share({ files: [file], text: message })\n return\n }\n const Item = (window as unknown as { ClipboardItem?: typeof ClipboardItem }).ClipboardItem\n // A área de transferência só aceita PNG: um SVG hospedado sai por\n // compartilhamento ou não sai.\n if (!Item || !blob.type.includes('png')) throw new Error('sem área de transferência de imagem')\n await navigator.clipboard.write([new Item({ 'image/png': blob })])\n toast.success('QR copiado — é só colar na conversa do WhatsApp.')\n } catch {\n // Nada disso existe neste navegador: o código copia e cola resolve, e ele\n // é melhor para o cliente de qualquer forma — cola direto no banco dele.\n toast.error('Este navegador não compartilha imagem', {\n description: 'Use \"Copiar código\" — o cliente cola no app do banco.',\n })\n }\n }\n\n const greeting = customerName ? ` ${customerName.split(' ')[0]}` : ''\n const message = isLink\n ? `Olá${greeting}! Aqui está o link para pagar seu pedido de ${money}:\\n\\n${payable}\\n\\nVocê escolhe a forma de pagamento na página.`\n : `Olá${greeting}! Segue o Pix de ${money} para o seu pedido:\\n\\n${payable}`\n\n const whatsapp = customerPhone && payable\n ? `https://wa.me/${customerPhone.length > 11 ? customerPhone : `55${customerPhone}`}?text=${encodeURIComponent(message)}`\n : null\n\n return (\n <Modal open={open} onOpenChange={(next) => { if (!next) onClose() }}>\n <ModalPortal>\n <ModalOverlay>\n <ModalContent size=\"lg\" data-testid=\"new-order-charge-modal\">\n <ModalHeader className=\"mb-4\">\n <ModalTitle>\n {choosing || opening ? `Cobrar ${money}` : isLink ? `Link de ${money}` : `Pix de ${money}`}\n </ModalTitle>\n {choosing && (\n <p className=\"text-sm text-muted-foreground\">Como o cliente vai pagar?</p>\n )}\n {opening && (\n <p className=\"text-sm text-muted-foreground\">Abrindo a cobrança no adquirente…</p>\n )}\n {ready && state === 'waiting' && (\n <p className=\"text-sm text-muted-foreground\">\n {isLink\n // No 15-minute line here: a link is opened when the customer\n // gets round to it, and promising a window we do not control\n // would be a merchant telling a customer something false.\n ? 'Mande para o cliente. O pedido é criado quando o pagamento cair — pode fechar esta janela.'\n : 'Vale por 15 minutos. O pedido é criado quando o pagamento cair.'}\n </p>\n )}\n </ModalHeader>\n\n <ModalBody>\n {error && (\n <p role=\"alert\" data-testid=\"charge-error\"\n className=\"mb-3 rounded-md border border-red-200 bg-red-50 px-3 py-2 text-sm text-red-800\">\n {error}\n </p>\n )}\n\n {/* Ainda sem cobrança: a escolha. Três formas de o pedido ficar\n pago, atrás de uma porta só — antes eram três entradas de menu\n dizendo quase a mesma coisa. */}\n {choosing && (\n <div className=\"space-y-2\" data-testid=\"charge-choices\">\n <ChargeChoice\n icon={QrCode}\n title=\"Cobrar por Pix\"\n hint=\"QR e código na hora, para ler ou mandar agora\"\n onClick={() => onChoose?.(false)}\n testId=\"charge-choose-pix\"\n />\n <ChargeChoice\n icon={Link2}\n title=\"Gerar link de pagamento\"\n hint=\"Uma página do adquirente — o cliente escolhe como pagar\"\n onClick={() => onChoose?.(true)}\n testId=\"charge-choose-link\"\n />\n {onRegisterReceipt && (\n <ChargeChoice\n icon={HandCoins}\n title=\"Já recebi\"\n hint=\"Dinheiro, maquininha, Pix na sua conta — só registrar\"\n onClick={onRegisterReceipt}\n testId=\"charge-choose-received\"\n />\n )}\n </div>\n )}\n\n {/* Escolhida, e a caminho. O esqueleto tem a FORMA do que vem —\n quadrado do QR, linha do código, botões — para a chegada ser\n troca de cinza por conteúdo e não a janela mudando de tamanho. */}\n {opening && (\n <div className=\"flex flex-col items-center gap-4 sm:flex-row sm:items-start\"\n aria-busy data-testid=\"charge-skeleton\">\n <div className=\"h-40 w-40 shrink-0 animate-pulse rounded-md border bg-muted\" />\n <div className=\"min-w-0 flex-1 space-y-3\">\n <div className=\"h-3 w-28 animate-pulse rounded bg-muted\" />\n <div className=\"h-16 w-full animate-pulse rounded-md bg-muted\" />\n <div className=\"flex gap-2\">\n <div className=\"h-8 w-32 animate-pulse rounded-md bg-muted\" />\n <div className=\"h-8 w-40 animate-pulse rounded-md bg-muted\" />\n </div>\n </div>\n </div>\n )}\n\n {ready && (\n <div className=\"flex flex-col items-center gap-4 sm:flex-row sm:items-start\">\n {qrSrc && (\n <img\n src={qrSrc}\n alt=\"QR code do Pix\"\n data-testid=\"new-order-qr\"\n className=\"h-40 w-40 shrink-0 rounded-md border bg-white p-2\"\n />\n )}\n <div className=\"min-w-0 flex-1 space-y-3\">\n <div>\n <p className=\"text-xs font-medium text-muted-foreground\">\n {isLink ? 'Link de pagamento' : 'Pix copia e cola'}\n </p>\n <p data-testid={isLink ? 'new-order-payment-link' : 'new-order-emv'}\n className=\"mt-1 max-h-20 overflow-auto break-all rounded-md border bg-muted/30 p-2 font-mono text-[11px]\">\n {payable}\n </p>\n {isLink && (\n <p className=\"mt-1 text-[11px] text-muted-foreground\">\n O cliente escolhe Pix, boleto ou cartão na página do adquirente.\n </p>\n )}\n </div>\n <div className=\"flex flex-wrap gap-2\">\n <Button size=\"sm\" onClick={copy} data-testid=\"new-order-copy\">\n {copied ? <Check className=\"mr-1.5 h-3.5 w-3.5\" /> : <Copy className=\"mr-1.5 h-3.5 w-3.5\" />}\n {copied ? 'Copiado' : isLink ? 'Copiar link' : 'Copiar código'}\n </Button>\n {qrSrc && (\n <Button size=\"sm\" variant=\"outline\" onClick={() => void shareQr()}\n data-testid=\"new-order-share-qr\">\n <Share2 className=\"mr-1.5 h-3.5 w-3.5\" />\n Compartilhar QR\n </Button>\n )}\n {whatsapp && (\n <a href={whatsapp} target=\"_blank\" rel=\"noreferrer\" data-testid=\"new-order-whatsapp\"\n className=\"inline-flex items-center rounded-md border px-3 py-1.5 text-sm font-medium transition hover:bg-muted\">\n <MessageCircle className=\"mr-1.5 h-3.5 w-3.5\" />\n Mandar no WhatsApp\n </a>\n )}\n </div>\n </div>\n </div>\n\n )}\n\n {ready && (\n <div className=\"mt-4 rounded-md border bg-muted/30 px-3 py-2 text-sm\">\n {state === 'waiting' && (\n <p className=\"flex items-center gap-2 text-muted-foreground\" data-testid=\"new-order-waiting\">\n <span className=\"h-2 w-2 animate-pulse rounded-full bg-amber-500\" />\n Aguardando o pagamento… a tela confirma sozinha.\n </p>\n )}\n {state === 'paid' && (\n <p className=\"flex items-center gap-2 font-medium text-emerald-700\" data-testid=\"new-order-paid\">\n <Check className=\"h-4 w-4\" /> Pagamento confirmado — abrindo o pedido…\n </p>\n )}\n {(state === 'expired' || state === 'failed') && (\n <p className=\"text-red-700\" data-testid=\"new-order-dead\">\n {state === 'expired'\n ? `${isLink ? 'O link expirou' : 'O código expirou'} sem pagamento. O pedido continua aqui — dá para cobrar de outro jeito.`\n : 'O pagamento não foi concluído. O pedido continua aqui — dá para cobrar de outro jeito.'}\n </p>\n )}\n </div>\n )}\n </ModalBody>\n\n <ModalFooter className=\"mt-4 gap-2\">\n {ready && state === 'waiting' && (\n <Button variant=\"outline\" onClick={() => void check()} disabled={checking} data-testid=\"new-order-check\">\n {checking ? 'Conferindo…' : 'Já pagou? Conferir'}\n </Button>\n )}\n <Button variant={state === 'waiting' ? 'ghost' : 'default'} onClick={onClose}\n data-testid=\"new-order-charge-close\">\n {state === 'waiting' ? 'Fechar' : 'Voltar ao pedido'}\n </Button>\n </ModalFooter>\n </ModalContent>\n </ModalOverlay>\n </ModalPortal>\n </Modal>\n )\n}\n","import React from 'react'\nimport type { EntityDef, FieldDef } from '@fayz-ai/core'\nimport { documentDigits, formatDocument } from '@fayz-ai/shop'\nimport type { ShopCustomer } from '@fayz-ai/shop'\nimport { ClientOrdersTab, createClientOrdersProvider, adminNavigateTo } from '@fayz-ai/admin'\nimport type { ClientDocument } from '@fayz-ai/admin'\n\n// ---------------------------------------------------------------------------\n// Shop customer — same declarative contract as the product entity, so the list\n// and the form both come from createCrudPage instead of a hand-rolled table.\n//\n// ordersCount / totalSpent are read-only: they are maintained server-side by the\n// shop_refresh_customer_stats trigger on every order insert/update/delete, so\n// putting them in the form would offer an edit the database would overwrite.\n// ---------------------------------------------------------------------------\n\nfunction money(value: unknown) {\n const n = Number(value)\n if (!Number.isFinite(n)) return 'R$ 0,00'\n return new Intl.NumberFormat('pt-BR', { style: 'currency', currency: 'BRL' }).format(n)\n}\n\nexport function buildShopCustomerEntity(): EntityDef<ShopCustomer> {\n const fields: FieldDef[] = [\n // — Contato —\n {\n key: 'firstName', label: 'Nome', type: 'text', required: true,\n group: 'contact', placeholder: 'Maria', searchable: true,\n showInTable: true, sortable: true,\n renderCell: (_v, row: any) => (\n <div className=\"min-w-0\">\n <p className=\"truncate font-medium\">{[row.firstName, row.lastName].filter(Boolean).join(' ')}</p>\n {row.email && <p className=\"truncate text-xs text-muted-foreground\">{row.email}</p>}\n </div>\n ),\n },\n { key: 'lastName', label: 'Sobrenome', type: 'text', group: 'contact', placeholder: 'Silva', searchable: true, showInTable: false },\n {\n key: 'email', label: 'E-mail', type: 'email', group: 'contact',\n placeholder: 'maria@exemplo.com', searchable: true,\n hint: 'É por ele que o pedido é vinculado ao cliente no checkout.',\n showInTable: false,\n },\n {\n key: 'phone', label: 'Telefone', type: 'phone', group: 'contact',\n placeholder: '(21) 99999-0000', searchable: true,\n showInTable: true, sortable: false,\n renderCell: (v) => <span className=\"text-muted-foreground\">{(v as string) || '—'}</span>,\n },\n // The column, the type and the provider all carried `document` already; the\n // form was the only place it could not be typed. Which meant a store could\n // see \"cliente sem CPF/CNPJ\" on every Bling run and have nowhere to fix it.\n {\n // Masked while typing, digits stored — the same rule the phone field\n // follows. A formatted CPF in the column means no search for the bare\n // number ever finds it.\n key: 'document', label: 'CPF / CNPJ', type: 'custom', group: 'contact',\n placeholder: '000.000.000-00', searchable: true,\n hint: 'Necessário para emitir nota — sem ele o cliente não sobe para o ERP.',\n showInTable: false,\n renderInput: ({ value, onChange }) => (\n <input\n value={formatDocument(String(value ?? ''))}\n onChange={(e) => onChange(documentDigits(e.target.value))}\n placeholder=\"000.000.000-00\"\n inputMode=\"numeric\"\n className=\"flex h-9 w-full rounded-input border border-input bg-background px-3 py-1.5 text-sm shadow-sm ring-offset-background placeholder:text-muted-foreground focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring\"\n />\n ),\n },\n\n // — Histórico (somente leitura) —\n {\n key: 'ordersCount', label: 'Pedidos', type: 'number',\n showInForm: false, showInTable: true, sortable: true,\n renderCell: (v) => <span className=\"block text-right\">{Number(v) || 0}</span>,\n },\n {\n key: 'totalSpent', label: 'Total gasto', type: 'number',\n showInForm: false, showInTable: true, sortable: true,\n renderCell: (v) => <span className=\"block text-right font-medium\">{money(v)}</span>,\n },\n\n // — Interno —\n {\n key: 'notes', label: 'Observações', type: 'textarea', group: 'internal', span: 2,\n placeholder: 'Preferências, restrições, combinados de entrega…',\n hint: 'Visível só no admin. O cliente nunca vê.',\n showInTable: false,\n },\n ]\n\n return {\n name: 'Cliente',\n namePlural: 'Clientes',\n icon: 'Users',\n displayField: 'firstName',\n // `person` layout brings the shared archetype tabs — including Endereços,\n // which reads the core addresses table and therefore works in every app.\n layout: 'person',\n // Without archetypeKind the shell shows every person tab, including the\n // staff-only Agenda (its visibleFor filter only runs when a kind is set).\n data: { table: 'plg_shop_customers', archetypeKind: 'customer' },\n fields,\n // The SAME tab and the SAME provider beauty-saas uses. Since the shop's\n // orders now live in public.orders with party_id set, the canonical provider\n // already returns them — a shop-specific adapter would be a second\n // implementation of \"list this person's orders\", which is how two apps end\n // up with two different answers to the same question.\n detailTabs: [{\n id: 'orders',\n label: 'Pedidos',\n icon: 'ShoppingBag',\n aliases: ['appointments', 'quotes'],\n component: ClientOrdersTab as never,\n props: {\n provider: createClientOrdersProvider(),\n currency: { code: 'BRL', locale: 'pt-BR' },\n // The one part that legitimately differs per app: where a document\n // leads. Beauty sends a booking to the agenda and an invoice to\n // receivables; a shop order goes to the order screen.\n navigator: {\n onNavigate: (doc: ClientDocument) => adminNavigateTo(`/shop/orders/${doc.id}`),\n },\n },\n }],\n fieldGroups: [\n { id: 'contact', label: 'Contato', columns: 2 },\n { id: 'internal', label: 'Notas internas', columns: 1 },\n ],\n } as EntityDef<ShopCustomer>\n}\n","import React, { useEffect, useMemo, useState } from 'react'\nimport { toast } from '@fayz-ai/ui'\nimport { CrudRecordModal, duplicateWrite } from '@fayz-ai/admin'\nimport type { EntityDef } from '@fayz-ai/core'\nimport { documentDigits, isValidDocument } from '@fayz-ai/shop'\nimport type { ShopCustomer, ShopProvider } from '@fayz-ai/shop'\nimport { errorMessage } from '../settings/error-message'\nimport { buildShopCustomerEntity } from './customerEntity'\n\n/** Só os dígitos — o que todo índice de telefone compara. */\nconst onlyDigits = (value: string) => value.replace(/\\D/gu, '')\n\n// ---------------------------------------------------------------------------\n// A ficha do cliente, aberta de onde ela faz falta.\n//\n// Vive num arquivo só porque são duas telas com o mesmo problema: a venda que\n// precisa cadastrar quem está comprando, e o pedido salvo a que falta o CPF que\n// o adquirente exige. Uma segunda cópia divergiria no primeiro campo que uma\n// das duas aprendesse.\n// ---------------------------------------------------------------------------\n\n/**\n * The customer's record, created or edited — the one form for both.\n *\n * The form itself is the ENTITY's, rendered by the same CrudRecordModal every\n * other \"register this mid-task\" dialog uses: the fields, labels, groups and\n * masks come from buildShopCustomerEntity, so a column added to the registry\n * shows up here without anyone remembering this file exists. What stays local\n * is what only a sale knows — the name typed into the search box, and what to\n * do when the e-mail is already someone's.\n *\n * Both ends of it write to `plg_shop_customers`: a CPF typed here is the\n * person's, not this order's, so the next sale to them already has it. The\n * order still freezes its own copy, which is what an invoice issued months\n * later has to quote.\n */\nexport function CustomerModal({ open, initialName, customerId, initial, provider, onClose, onSaved }: {\n open: boolean\n initialName?: string\n /** Set when editing an existing record. */\n customerId?: string\n initial?: { name: string; email: string; phone: string; document: string }\n provider: () => ShopProvider\n onClose: () => void\n onSaved: (customer: ShopCustomer) => void\n}) {\n const entityDef = useMemo(() => buildShopCustomerEntity() as unknown as EntityDef, [])\n /** O índice que recusou: qual campo, e quem já o tem (quando dá para achar). */\n const [conflict, setConflict] = useState<\n { field: string; label: string; hit: ShopCustomer | null } | null\n >(null)\n // O que o índice recusou, guardado para a saída \"salvar mesmo assim\".\n const [refused, setRefused] = useState<{\n firstName: string; lastName: string; email?: string\n phone?: string; document?: string; notes?: string\n } | null>(null)\n const [forcing, setForcing] = useState(false)\n\n // Editing starts from the record; creating starts from whatever was typed\n // into the search box, which was the customer's name.\n const initialData = useMemo(() => {\n const [head, ...rest] = String(initial?.name ?? initialName ?? '').trim().split(/\\s+/u)\n return {\n firstName: head ?? '',\n lastName: rest.join(' '),\n email: initial?.email ?? '',\n phone: initial?.phone ?? '',\n document: initial?.document ?? '',\n }\n }, [initial, initialName])\n\n useEffect(() => { if (open) { setConflict(null); setRefused(null) } }, [open])\n\n /**\n * \"Salvar mesmo assim\" — o cadastro vai, o campo em conflito fica de fora.\n *\n * Não é teimosia contornada: o índice é real e o banco recusa de novo se\n * insistirmos. O que o lojista quer dizer com \"mesmo assim\" é que este\n * cadastro EXISTE e não é o outro, e ele não vai perder tudo por causa de um\n * campo. Some só o campo recusado, e o restante é gravado.\n */\n async function saveAnyway() {\n if (!refused || !conflict) return\n setForcing(true)\n try {\n const fields = { ...refused, [conflict.field]: undefined }\n const saved = customerId\n ? await provider().updateCustomer(customerId, fields)\n : await provider().createCustomer(fields)\n toast.success(`Cadastro salvo sem o ${conflict.label} — ele já pertence a outro cadastro.`)\n onSaved(saved)\n } catch (err: unknown) {\n toast.error('Não consegui salvar', { description: errorMessage(err) })\n } finally {\n setForcing(false)\n }\n }\n\n async function save(data: Record<string, any>) {\n const document = documentDigits(String(data.document ?? ''))\n if (document && !isValidDocument(document)) throw new Error('Esse CPF/CNPJ não confere.')\n const email = String(data.email ?? '').trim().toLowerCase()\n const fields = {\n firstName: String(data.firstName ?? '').trim(),\n lastName: String(data.lastName ?? '').trim(),\n email: email || undefined,\n phone: onlyDigits(String(data.phone ?? '')) || undefined,\n document: document || undefined,\n notes: (data.notes as string | null) ?? undefined,\n }\n try {\n const saved = customerId\n ? await provider().updateCustomer(customerId, fields)\n : await provider().createCustomer(fields)\n onSaved(saved)\n return saved as unknown as Record<string, any>\n } catch (err: unknown) {\n // Um índice único recusou. Para o lojista isso não é um erro do que ele\n // digitou: ou a pessoa já é cliente (e o que ele quer é AQUELE cadastro),\n // ou é outra pessoa e o campo é que não pode ser esse. Resolve em vez de\n // lançar, porque lançar dizia a mesma frase duas vezes — no formulário e\n // num toast vermelho — e nenhuma das duas oferecia saída.\n //\n // Também não é sempre o e-mail: o telefone tem índice próprio no espelho\n // de pessoas, e chamar tudo de \"e-mail repetido\" mandava o lojista\n // procurar no lugar errado.\n const clash = duplicateWrite(err)\n if (!clash?.field) throw err\n setRefused(fields)\n // Só o e-mail dá para procurar de volta: é o que a busca de clientes\n // indexa. Sem achar, o cadastro fica com o restante e segue.\n const hit = clash.field === 'email' && email\n ? (await provider().listCustomers({ search: email, limit: 5 }).catch(() => []))\n .find((c) => (c.email ?? '').toLowerCase() === email) ?? null\n : null\n setConflict({ field: clash.field, label: clash.label, hit })\n return\n }\n }\n\n return (\n <CrudRecordModal\n open={open}\n mode={customerId ? 'edit' : 'create'}\n entityDef={entityDef}\n initialData={initialData}\n title={customerId ? 'Cadastro do cliente' : 'Novo cliente'}\n onClose={onClose}\n save={save}\n notice={conflict && (\n <div role=\"alert\" data-testid=\"new-customer-duplicate\"\n className=\"rounded-md border border-amber-200 bg-amber-50 px-3 py-2 text-sm text-amber-900\">\n <p>\n {conflict.hit\n ? <><strong>{conflict.hit.firstName} {conflict.hit.lastName}</strong> já é cliente com esse {conflict.label}.</>\n : <>Esse {conflict.label} já está em outro cadastro desta loja.</>}\n </p>\n {/* Duas saídas, porque são dois casos diferentes: é a mesma pessoa\n (usa o cadastro dela) ou é outra que repetiu o campo — aí o\n cadastro vale, só aquele campo não pode ser este. */}\n <div className=\"mt-1 flex flex-wrap items-center gap-3\">\n {conflict.hit && (\n <button type=\"button\" onClick={() => onSaved(conflict.hit!)}\n data-testid=\"new-customer-use-existing\"\n className=\"font-medium underline underline-offset-2\">\n Usar este cliente\n </button>\n )}\n <button type=\"button\" onClick={() => void saveAnyway()} disabled={forcing}\n data-testid=\"new-customer-save-anyway\"\n className=\"font-medium underline underline-offset-2 disabled:opacity-60\">\n {forcing ? 'Salvando…' : `Salvar sem o ${conflict.label}`}\n </button>\n </div>\n </div>\n )}\n />\n )\n}\n","import { Archive, Ban, Pencil, QrCode, RotateCcw } from 'lucide-react'\nimport React, { useCallback, useEffect, useRef, useState } from 'react'\nimport { errorMessage } from '../settings/error-message'\nimport {\n adminNavigateTo, PersonLink,\n OrderDetailView as SharedOrderDetailView, OrderDetailSkeleton, OrderDetailBlock, OrderDetailRow,\n type OrderDetailData, type OrderDetailInstallment, type OrderDetailTone, PageActions,\n // \"Contas a receber\" is the financial plugin's, not the shop's: same views,\n // same shape, now loaded once for every product that has orders.\n useOrderReceivable, toOrderDetailReceivable } from '@fayz-ai/admin'\n// A dependência é real e assumida: registrar recebimento é um ato do\n// Financeiro, e o modal dele é quem sabe perguntar método, conta e data. O\n// invólucro traz o próprio contexto, então ele funciona fora das rotas de lá.\nimport { ReceivePaymentModal } from '@fayz-ai/plugin-financial'\nimport { Button, Modal, ModalContent, ModalDescription, ModalFooter, ModalHeader, ModalTitle, formatPhone, toast } from '@fayz-ai/ui'\nimport { shopCustomerLookup } from './customerLookup'\nimport { ShipOrderForm } from './ShipOrderForm'\nimport { ShipWithCarrier } from './ShipWithCarrier'\nimport { ShipmentActions } from './ShipmentActions'\nimport { OrderProviderLinks } from './OrderProviderLinks'\nimport { OrderPaymentDetail } from './OrderPaymentDetail'\nimport { cancelShopOrder } from './order-actions'\nimport { NewOrderCharge } from './NewOrderCharge'\nimport { CustomerModal } from './CustomerModal'\nimport { formatDocument } from '@fayz-ai/shop'\nimport type { CheckoutSession, Order, ShopCustomer, ShopProvider } from '@fayz-ai/shop'\nimport { getSupabaseClientOptional, usePluginRuntimeOptional } from '@fayz-ai/core'\n\n/** A shipment as stored in public.fulfillments (0018). */\ntype Fulfillment = {\n id: string\n status: string\n carrier: string | null\n service: string | null\n tracking_code: string | null\n tracking_url: string | null\n shipped_at: string | null\n estimated_delivery_at: string | null\n delivered_at: string | null\n}\n\ntype Bill = {\n id: string\n amount: number\n paid_amount: number | null\n status: string\n due_date: string\n installment_number: number | null\n}\ntype Receivable = {\n balance: { amount: number; paid: number; balance: number; status: string; reference_number: string | null }\n bills: Bill[]\n}\n\nconst money = (v: number, currency = 'BRL') =>\n new Intl.NumberFormat('pt-BR', { style: 'currency', currency }).format(Number(v) || 0)\nconst dateTime = (iso: string) =>\n new Intl.DateTimeFormat('pt-BR', { day: '2-digit', month: '2-digit', year: 'numeric', hour: '2-digit', minute: '2-digit' }).format(new Date(iso))\nconst dateOnly = (iso: string) => new Date(iso).toLocaleDateString('pt-BR')\n\n/**\n * \"Pago em\" — e por que ele às vezes não tem hora.\n *\n * `paid_at` é DERIVADO da data do recibo (`payment_date`, uma DATE), então o\n * que chega é meia-noite UTC. Renderizar isso como data e hora produzia\n * \"12/08/2026, 21:00\" para um Pix pago às 12:54 de 13/08 — hora inventada e\n * ainda um dia atrás, por causa do fuso. Meia-noite exata em UTC é lida como\n * \"só a data\"; qualquer outro instante é um horário de verdade e aparece.\n */\nconst paidAtLabel = (iso: string) => {\n const at = new Date(iso)\n const midnightUtc = at.getUTCHours() === 0 && at.getUTCMinutes() === 0 && at.getUTCSeconds() === 0\n return midnightUtc\n ? new Intl.DateTimeFormat('pt-BR', {\n day: '2-digit', month: '2-digit', year: 'numeric', timeZone: 'UTC',\n }).format(at)\n : dateTime(iso)\n}\n\nconst PAYMENT_LABEL: Record<string, string> = {\n pix: 'Pix', credit_card: 'Cartão de crédito', debit_card: 'Cartão de débito',\n boleto: 'Boleto', cash: 'Dinheiro', other: 'Outro',\n}\n/** Shared with the orders table: one order vocabulary, not two. */\nexport const ORDER_STATUS_LABEL: Record<string, string> = {\n paid: 'Pago', pending: 'Aguardando pagamento', refunded: 'Estornado',\n partially_refunded: 'Estorno parcial', voided: 'Cancelado',\n fulfilled: 'Enviado', unfulfilled: 'Não enviado', partially_fulfilled: 'Envio parcial',\n open: 'Aberto', cancelled: 'Cancelado', archived: 'Arquivado',\n}\n// `pending` is what a bill row carries; `open` is what the balance view derives\n// from it. Both mean the same thing to the merchant, so both get a label —\n// without this the instalment line printed the raw English status.\nconst RECEIVABLE_LABEL: Record<string, string> = {\n open: 'Em aberto', pending: 'Em aberto', partial: 'Parcialmente recebido',\n paid: 'Recebido', overdue: 'Vencido', cancelled: 'Cancelado',\n}\nconst SHIPMENT_LABEL: Record<string, string> = {\n pending: 'Aguardando coleta', in_transit: 'Em trânsito', delivered: 'Entregue',\n failed: 'Falhou', returned: 'Devolvido', cancelled: 'Cancelado',\n}\n\n/**\n * A parcela como o modal do Financeiro a lê.\n *\n * `v_financial_bills` devolve snake_case e o modal lê camelCase — passar a linha\n * crua dava \"R$ NaN restante\", que é o pior tipo de defeito: a tela abre, parece\n * certa, e o número não existe. O `id` NÃO é traduzido de propósito: ele já é o\n * id da parcela, que é o que a RPC recebe.\n */\nfunction toModalInstallment(bill: any) {\n return {\n id: bill.id,\n amount: Number(bill.amount ?? 0),\n paidAmount: Number(bill.paid_amount ?? 0),\n installmentNumber: bill.installment_number ?? bill.number ?? 1,\n direction: bill.direction,\n dueDate: bill.due_date,\n invoiceId: bill.financial_invoice_id ?? bill.invoice_id,\n } as any\n}\n\n/** Map a shop/receivable status string to the shared component's tone. */\nfunction toneOf(value: string): OrderDetailTone {\n switch (value) {\n case 'paid': case 'fulfilled': case 'delivered': return 'success'\n case 'pending': case 'partial': case 'partially_fulfilled': case 'open': case 'in_transit': return 'warning'\n case 'refunded': case 'partially_refunded': case 'voided': case 'cancelled': case 'overdue': case 'failed': case 'returned': return 'destructive'\n default: return 'muted'\n }\n}\n\n/** Small inline badge for the shop-specific blocks (Entrega/Histórico). */\nfunction InlineBadge({ value }: { value: string }) {\n const tone = toneOf(value)\n const cls: Record<OrderDetailTone, string> = {\n success: 'bg-emerald-100 text-emerald-800', warning: 'bg-amber-100 text-amber-800',\n destructive: 'bg-red-100 text-red-700', info: 'bg-sky-100 text-sky-800', muted: 'bg-muted text-muted-foreground',\n }\n return <span className={`inline-flex items-center rounded-full px-2 py-0.5 text-xs font-medium ${cls[tone]}`}>{ORDER_STATUS_LABEL[value] ?? value}</span>\n}\n\n/** The three values `plg_shop_orders.status` accepts. */\ntype OrderLifecycle = 'open' | 'cancelled' | 'archived'\n\n/** What the merchant is told before a status change that is not just a click. */\nconst LIFECYCLE_CONFIRM: Record<OrderLifecycle, { cta: string; warning: string }> = {\n cancelled: {\n cta: 'Cancelar pedido',\n warning: 'Cancelar encerra os envios em aberto, devolve o estoque que estava reservado para este pedido e cancela a cobrança que ainda não foi paga.',\n },\n archived: {\n cta: 'Arquivar',\n warning: 'Arquivar tira o pedido do dia a dia sem mudar nada do que já aconteceu. Dá para reabrir depois.',\n },\n // Reopening is only a status change: it does not re-reserve the stock a cancel\n // gave back, nor re-open the charge it closed. Saying so beats a merchant\n // assuming the order came back exactly as it was.\n open: {\n cta: 'Reabrir',\n warning: 'O pedido volta para a lista de abertos. O estoque e a cobrança NÃO voltam sozinhos — se foi cancelado, confira os dois antes de despachar.',\n },\n}\n\nfunction deliveryFromNotes(notes: string | null): string | null {\n if (!notes) return null\n const match = notes.match(/entrega:\\s*(.+)/i)\n return (match?.[1] ?? '').trim() || null\n}\n\n// Cache por id (fora do componente) — trocar de aba remonta a view; sem cache\n// isso refaz o getOrder (skeleton + request) toda vez. Cache-first evita o refetch;\n// \"Registrar recebimento\" atualiza o cache.\nconst shopOrderCache = new Map<string, Order>()\n\n/** A sessão do adquirente, no formato que o modal desenha. */\nfunction fromSession(session: CheckoutSession) {\n return {\n sessionId: session.sessionId,\n emv: session.charge?.emv ?? null,\n qrcode: session.charge?.qrcodeBase64 ?? null,\n qrcodeUrl: session.charge?.qrcodeUrl ?? null,\n paymentUrl: session.paymentUrl ?? null,\n total: session.total,\n provider: session.provider ?? null,\n }\n}\nconst shopShipmentsCache = new Map<string, Fulfillment[]>()\n\nexport function OrderDetailView({ orderId, provider, onBack }: {\n orderId: string\n provider: () => ShopProvider\n onBack: () => void\n}) {\n // A conta a receber SEMPRE existe (o pedido a cria); a TELA do Financeiro só\n // existe se o app montou o módulo. São duas perguntas diferentes — e a\n // pergunta certa é pela ROTA, não pelo id do plugin.\n //\n // Um app pode montar o Financeiro reduzido às configurações\n // (`createFinancialSettingsPlugin`), que declara o mesmo id e NÃO tem\n // `/financial`. Perguntando pelo id, \"Abrir no Financeiro\" aparecia e levava a\n // uma rota que ninguém montou — um botão que existe para dizer onde continuar\n // e não continua em lugar nenhum.\n const runtime = usePluginRuntimeOptional()\n const hasFinancial = (runtime?.activePlugins ?? []).some(\n (p) => (p as { routes?: { path?: string }[] }).routes?.some((r) => r.path === '/financial'),\n )\n\n const [order, setOrder] = useState<Order | null>(() => shopOrderCache.get(orderId) ?? null)\n const [shipments, setShipments] = useState<Fulfillment[]>(() => shopShipmentsCache.get(orderId) ?? [])\n const [loading, setLoading] = useState(() => !shopOrderCache.has(orderId))\n const [error, setError] = useState<string | null>(null)\n /** A parcela que o modal do Financeiro está recebendo, ou null. */\n const [payingInstallment, setPayingInstallment] = useState<any | null>(null)\n const [pendingStatus, setPendingStatus] = useState<OrderLifecycle | null>(null)\n const [statusSaving, setStatusSaving] = useState(false)\n const [statusError, setStatusError] = useState<string | null>(null)\n const [cancelReason, setCancelReason] = useState('')\n const { receivable, reload: loadReceivable } = useOrderReceivable(orderId)\n /** A cobrança aberta CONTRA este pedido (0073), e o modal que a mostra. */\n const [charge, setCharge] = useState<{\n sessionId: string; emv: string | null; qrcode: string | null; qrcodeUrl: string | null\n paymentUrl: string | null; total: number\n /** QUEM abriu — a consulta seguinte tem de bater na mesma porta. */\n provider: string | null\n } | null>(null)\n const [chargeOpen, setChargeOpen] = useState(false)\n const [charging, setCharging] = useState<'pix' | 'link' | null>(null)\n /**\n * A ficha do cliente, que o PEDIDO não carrega.\n *\n * O pedido congela nome e e-mail no momento da compra; telefone e CPF vivem\n * no cadastro — e são justamente o que o adquirente exige para cobrar. Sem\n * ler a ficha, a tela não tem como dizer o que falta, só repetir a recusa.\n */\n const [customer, setCustomer] = useState<ShopCustomer | null>(null)\n const [editingCustomer, setEditingCustomer] = useState(false)\n // Erro PRÓPRIO, e não `statusError`: aquele só é desenhado dentro da faixa de\n // confirmação de arquivar/cancelar, então uma cobrança que falhava escrevia\n // numa caixa que ninguém estava mostrando — o menu fechava e nada acontecia.\n const [chargeError, setChargeError] = useState<string | null>(null)\n\n useEffect(() => {\n let cancelled = false\n const cached = shopOrderCache.get(orderId)\n if (cached) { setOrder(cached); setLoading(false); return () => { cancelled = true } } // cache hit → sem request\n setLoading(true); setError(null)\n provider().getOrder(orderId)\n .then((o) => { if (!cancelled) { if (o) shopOrderCache.set(orderId, o); setOrder(o) } })\n .catch((err: unknown) => {\n if (cancelled) return\n // A typo in the URL is not a database failure anyone can act on: 22P02 is\n // \"that is not a uuid\", which for a link means the order does not exist.\n if ((err as { code?: string } | null)?.code === '22P02') { setOrder(null); return }\n setError(errorMessage(err))\n })\n .finally(() => { if (!cancelled) setLoading(false) })\n return () => { cancelled = true }\n }, [orderId, provider])\n\n /**\n * `provider` chega como arrow inline do ShopPage — função NOVA a cada render.\n * Uma dependência assim faz o efeito rodar sempre, e um efeito que grava\n * estado a cada volta é um laço: buscar cliente → setCustomer → render →\n * provider novo → buscar cliente. Era isto que travava a tela.\n *\n * A ref segura o provider atual sem entrar na lista de dependências.\n */\n const providerRef = useRef(provider)\n providerRef.current = provider\n\n const loadCustomer = useCallback(async () => {\n const id = shopOrderCache.get(orderId)?.customerId\n if (!id) { setCustomer(null); return }\n setCustomer(await providerRef.current().getCustomer(id).catch(() => null))\n }, [orderId])\n\n useEffect(() => { void loadCustomer() }, [loadCustomer, order?.customerId])\n\n useEffect(() => {\n let cancelled = false\n const db = getSupabaseClientOptional() as unknown as { from: (t: string) => any } | null\n if (!db) return\n if (shopShipmentsCache.has(orderId)) return () => { cancelled = true } // cache hit → sem request\n db.from('fulfillments').select('*').eq('order_id', orderId).order('created_at', { ascending: false })\n .then(({ data }: { data: Fulfillment[] | null }) => { if (!cancelled) { shopShipmentsCache.set(orderId, data ?? []); setShipments(data ?? []) } })\n return () => { cancelled = true }\n }, [orderId])\n\n\n /**\n * A cobrança que já existe, lida do banco ao abrir o pedido.\n *\n * Sem isto ela vivia só na memória desta tela: recarregar a página perdia o\n * QR, o botão voltava a dizer \"Cobrar\", e o clique seguinte abriria uma\n * SEGUNDA cobrança para o mesmo pedido — dois códigos na mão do cliente e o\n * lojista sem saber qual vai cair.\n */\n useEffect(() => {\n let cancelled = false\n const shop = providerRef.current()\n const find = shop.findOpenOrderCharge\n if (!find || !order || order.financialStatus !== 'pending') return\n void find.call(shop, orderId)\n .then((standing) => { if (!cancelled && standing) setCharge(fromSession(standing)) })\n .catch(() => { /* sem cobrança em aberto é o caso comum, não um erro */ })\n return () => { cancelled = true }\n }, [orderId, order?.financialStatus])\n\n\n if (loading) return <OrderDetailSkeleton parentLabel=\"Pedidos\" onBack={onBack} />\n if (error) {\n return (\n <div className=\"rounded-lg border border-red-200 bg-red-50 px-4 py-3 text-sm text-red-800\">\n <p className=\"font-medium\">Não foi possível carregar o pedido.</p>\n <p className=\"mt-1 text-red-700\">{error}</p>\n </div>\n )\n }\n if (!order) return <div className=\"py-12 text-center text-sm text-muted-foreground\">Pedido não encontrado.</div>\n\n const cur = order.currency\n const delivery = deliveryFromNotes(order.notes)\n const addr = order.shippingAddress\n\n // A new shipment changes the order's fulfillment status and its stock, so\n // both caches have to go — reading either stale would show a merchant an\n // order that is still \"a enviar\" seconds after they shipped it.\n async function reloadShipments() {\n shopShipmentsCache.delete(orderId)\n shopOrderCache.delete(orderId)\n const db = getSupabaseClientOptional() as unknown as { from: (t: string) => any } | null\n if (db) {\n const { data } = await db.from('fulfillments').select('*').eq('order_id', orderId)\n .order('created_at', { ascending: false })\n shopShipmentsCache.set(orderId, data ?? [])\n setShipments(data ?? [])\n }\n const fresh = await provider().getOrder(orderId)\n if (fresh) { shopOrderCache.set(orderId, fresh); setOrder(fresh) }\n }\n\n /**\n * O recebimento acontece no modal do Financeiro, não aqui.\n *\n * Antes isto chamava `shop_confirm_payment`, que ADIVINHA: o método vem do\n * pedido, e a conta vem de `shop_receiving_account`, que exige exatamente uma\n * conta ativa e recusa o resto. Numa loja sem conta cadastrada — ou com duas —\n * o lojista via um parágrafo vermelho onde devia ver um campo.\n *\n * A escrita é a mesma dos dois lados desde a reconciliação do `payMovement`:\n * `financial_receive_payment`, com sessão de caixa validada, conta exigida por\n * método e idempotência.\n */\n async function afterReceipt() {\n setPayingInstallment(null)\n if (!order) return\n const fresh = await provider().getOrder(order.id)\n if (fresh) { shopOrderCache.set(order.id, fresh); setOrder(fresh) }\n // DEPOIS que o recebimento cai, nunca antes: reler com a escrita em voo\n // cacheava o saldo anterior, e o painel jurava que o pedido estava em aberto\n // segundos depois de ter sido pago.\n await loadReceivable(true)\n }\n\n async function applyStatus(next: OrderLifecycle) {\n if (!order) return\n setStatusSaving(true); setStatusError(null)\n try {\n if (next === 'cancelled') {\n // Never a raw UPDATE: cancelling has to give the reserved stock back and\n // close the receivable, and only the RPC does all three. Shared with the\n // order list's bulk cancel — see cancelShopOrder.\n await cancelShopOrder(provider(), order.id, cancelReason.trim() || undefined)\n // Cancelling closes shipments and the receivable too — every cache the\n // page holds is stale at once.\n shopOrderCache.delete(order.id)\n shopShipmentsCache.delete(order.id)\n const fresh = await provider().getOrder(order.id)\n if (fresh) { shopOrderCache.set(order.id, fresh); setOrder(fresh) }\n await reloadShipments()\n await loadReceivable(true)\n } else {\n const updated = await provider().updateOrder(order.id, { status: next })\n if (updated) { shopOrderCache.set(order.id, updated); setOrder(updated) }\n }\n setPendingStatus(null); setCancelReason('')\n } catch (err: unknown) {\n setStatusError(errorMessage(err))\n } finally { setStatusSaving(false) }\n }\n\n /**\n * Abre a cobrança e a amarra a ESTE pedido. Já aberta, só reabre o modal: uma\n * segunda cobrança para o mesmo pedido é o cliente com dois códigos na mão.\n */\n async function openCharge(asLink: boolean) {\n if (charge) return\n setCharging(asLink ? 'link' : 'pix')\n setChargeError(null)\n try {\n const session = await provider().chargeExistingOrder!(orderId, { asLink })\n setCharge(fromSession(session))\n } catch (err: unknown) {\n // A janela FICA. Fechá-la levava embora o que o lojista estava fazendo e\n // deixava a impressão de que a tela travou e sumiu sozinha — a recusa\n // pertence ao lugar onde ela aconteceu.\n const message = errorMessage(err)\n setChargeError(message)\n toast.error('Não consegui abrir a cobrança', { description: message })\n } finally {\n setCharging(null)\n }\n }\n\n /**\n * O que a ficha ainda não tem — na ordem em que a cobrança cobra.\n *\n * Só depois de a ficha ter sido lida: enquanto ela não chegou, ausência de\n * dado e dado ausente são a mesma coisa na tela, e piscar três convites que\n * somem em seguida é pior do que esperar meio segundo.\n */\n const missingOnCustomer = customer\n ? ([\n !customer.document && { key: 'cpf', label: '+ Adicionar CPF' },\n !customer.email && { key: 'email', label: '+ Adicionar e-mail' },\n !customer.phone && { key: 'phone', label: '+ Adicionar celular' },\n ].filter(Boolean) as { key: string; label: string }[])\n : []\n\n const destructive = pendingStatus === 'cancelled'\n function closeStatus() { setPendingStatus(null); setStatusError(null); setCancelReason('') }\n // A confirmação é a MESMA janela que apaga um cadastro de cliente: centrada,\n // sobre o resto da tela. Inline, ela nascia no topo da coluna de ações e\n // aparecia fora da vista, empurrando o pedido para baixo.\n const statusModal = (\n <Modal open={pendingStatus !== null} onOpenChange={(isOpen) => { if (!isOpen && !statusSaving) closeStatus() }}>\n <ModalContent size=\"sm\">\n {pendingStatus && (\n <>\n <ModalHeader>\n <ModalTitle>{LIFECYCLE_CONFIRM[pendingStatus].cta}</ModalTitle>\n <ModalDescription>{LIFECYCLE_CONFIRM[pendingStatus].warning}</ModalDescription>\n </ModalHeader>\n <div className=\"space-y-2\">\n {destructive && order.financialStatus === 'paid' && (\n <p className=\"rounded-md border border-red-200 bg-red-50 px-2.5 py-1.5 text-xs font-medium text-red-900\">\n Este pedido está pago. Cancelar NÃO devolve o dinheiro — o estorno é feito na mão, no Financeiro ou no seu meio de pagamento.\n </p>\n )}\n {destructive && (\n <input\n value={cancelReason}\n onChange={(event) => setCancelReason(event.target.value)}\n placeholder=\"Motivo (opcional) — fica no histórico do pedido\"\n data-testid=\"order-cancel-reason\"\n className=\"w-full rounded-md border bg-background px-2.5 py-1.5 text-sm outline-none focus:border-primary\"\n />\n )}\n {statusError && (\n <p role=\"alert\" className=\"rounded-md border border-red-200 bg-red-50 px-2.5 py-1.5 text-xs text-red-800\">{statusError}</p>\n )}\n </div>\n <ModalFooter>\n <Button variant=\"outline\" onClick={closeStatus} disabled={statusSaving}>Voltar</Button>\n <Button\n variant={destructive ? 'destructive' : 'default'}\n onClick={() => applyStatus(pendingStatus)}\n disabled={statusSaving}\n data-testid=\"order-status-confirm\"\n >\n {statusSaving ? 'Salvando…' : LIFECYCLE_CONFIRM[pendingStatus].cta}\n </Button>\n </ModalFooter>\n </>\n )}\n </ModalContent>\n </Modal>\n )\n\n const statusActions = (\n // Three hand-written <button>s of equal weight, with the destructive one\n // last and loudest, was the shape this page had. Declared instead: editing\n // is what you came for, archiving and cancelling live behind the caret, and\n // the destructive tone comes from the token rather than `border-red-200`.\n <PageActions\n actions={[\n ...(order.status !== 'open'\n ? [{ id: 'reopen', testId: 'order-reopen', label: 'Reabrir pedido', icon: RotateCcw, intent: 'primary' as const, onSelect: () => setPendingStatus('open') }]\n : []),\n // UMA porta. Pix, link e \"já recebi\" eram três entradas de menu dizendo\n // quase a mesma coisa — pôr o pedido em dia —, e a escolha entre elas é\n // do momento, não do menu. Ela mora dentro do modal, que abre no clique\n // e mostra o esqueleto enquanto o adquirente responde.\n ...(order.status === 'open'\n && order.financialStatus === 'pending'\n && typeof provider().chargeExistingOrder === 'function'\n ? [{\n id: 'charge',\n testId: 'order-charge',\n label: charge ? 'Ver cobrança' : 'Cobrar',\n icon: QrCode,\n intent: 'primary' as const,\n onSelect: () => { setChargeError(null); setChargeOpen(true) },\n }]\n : []),\n // Nothing paid, nothing shipped, and the STORE typed it — still a draft,\n // so items, customer and address can change without cancelling the sale.\n // An order from the storefront is out: that cart belongs to the buyer.\n ...(order.status === 'open'\n && order.financialStatus === 'pending'\n && order.fulfillmentStatus === 'unfulfilled'\n && order.origin !== 'storefront'\n && typeof provider().reviseOrder === 'function'\n ? [{\n id: 'edit',\n testId: 'order-edit',\n label: 'Editar pedido',\n icon: Pencil,\n // Secundária enquanto há o que cobrar: a casca pinta UMA primária,\n // e num pedido em aberto ela é a que põe dinheiro na loja.\n intent: typeof provider().chargeExistingOrder === 'function'\n ? ('secondary' as const)\n : ('primary' as const),\n onSelect: () => adminNavigateTo(`/orders/${order.id}/edit`),\n }]\n : []),\n // Cobrar um pedido que já existe (0073). Salvar virou a ação principal\n // da venda, e até aqui a única saída depois era \"registrar recebimento\"\n // — que é dizer que o dinheiro entrou, não pedi-lo. Pix e link são a\n // MESMA cobrança: muda por onde ela chega ao cliente.\n ...(order.status === 'open'\n ? [{ id: 'archive', testId: 'order-archive', label: 'Arquivar', icon: Archive, intent: 'secondary' as const, onSelect: () => setPendingStatus('archived') }]\n : []),\n ...(order.status !== 'cancelled'\n ? [{ id: 'cancel', testId: 'order-cancel', label: 'Cancelar pedido', icon: Ban, intent: 'danger' as const, onSelect: () => setPendingStatus('cancelled') }]\n : []),\n ]}\n />\n )\n\n\n // Every bill becomes a line, including a lone one. The shared block treats an\n // empty schedule as \"no receivable at all\" and prints the empty label — so\n // hiding the single instalment also hid the balance AND the button that\n // registers the payment, on every one-shot order (which is most of them).\n const data: OrderDetailData = {\n // No topo, onde o layout compartilhado já reserva lugar para uma recusa.\n errorBanner: chargeError && !chargeOpen ? (\n <div role=\"alert\" data-testid=\"order-charge-error\"\n className=\"rounded-md border border-red-200 bg-red-50 px-3 py-2 text-sm text-red-800\">\n {chargeError}\n </div>\n ) : undefined,\n title: `Pedido #${order.orderNumber}`,\n // A data saiu do topo para o rodapé de procedência, que é onde toda ficha\n // do app guarda \"criado em / atualizado em\".\n meta: order,\n badges: [\n { label: ORDER_STATUS_LABEL[order.financialStatus] ?? order.financialStatus, tone: toneOf(order.financialStatus) },\n { label: ORDER_STATUS_LABEL[order.fulfillmentStatus] ?? order.fulfillmentStatus, tone: toneOf(order.fulfillmentStatus) },\n ],\n actions: statusActions,\n customer: { name: order.customerName, email: order.customerEmail },\n customerNode: (\n <div className=\"space-y-1 text-sm\">\n {order.customerId ? (\n <PersonLink\n personId={order.customerId}\n name={order.customerName ?? order.customerEmail ?? 'Cliente'}\n lookup={shopCustomerLookup(provider)}\n kind=\"shop_customer\"\n className=\"font-medium\"\n />\n ) : (\n <p className=\"font-medium\">{order.customerName ?? '—'}</p>\n )}\n {(customer?.email ?? order.customerEmail) && (\n <p className=\"text-muted-foreground\">{customer?.email ?? order.customerEmail}</p>\n )}\n {customer?.phone && <p className=\"text-muted-foreground\">{formatPhone(customer.phone)}</p>}\n {customer?.document && (\n <p className=\"text-muted-foreground\">{formatDocument(customer.document)}</p>\n )}\n\n {/* O QUE FALTA, como ação e não como recusa.\n \"Informe o CPF do comprador\" chegava depois do clique em cobrar, na\n outra ponta da tela, e mandava o lojista procurar onde se digita\n isso. Aqui a lacuna está onde o dado mora, e clicar nela já abre a\n ficha — o tracejado é o convite de preencher. */}\n {order.customerId && missingOnCustomer.length > 0 && (\n <p className=\"flex flex-wrap items-center gap-x-3 gap-y-1 pt-1\">\n {missingOnCustomer.map((field) => (\n <button\n key={field.key}\n type=\"button\"\n onClick={() => setEditingCustomer(true)}\n data-testid={`order-customer-add-${field.key}`}\n className=\"text-xs font-medium text-muted-foreground underline decoration-dashed decoration-from-font underline-offset-4 transition hover:text-foreground\"\n >\n {field.label}\n </button>\n ))}\n </p>\n )}\n {!order.customerId && <p className=\"text-xs text-muted-foreground\">Compra sem cadastro — não há ficha de cliente para abrir.</p>}\n </div>\n ),\n items: order.items.map((it) => ({\n id: it.id, name: it.name, description: it.sku, imageUrl: it.imageUrl,\n quantity: it.quantity, unitPrice: money(it.unitPrice, cur), total: money(it.total, cur),\n })),\n totals: [\n { label: 'Subtotal', value: money(order.subtotal, cur) },\n ...(order.discountTotal > 0 ? [{ label: `Desconto${order.discountCode ? ` (${order.discountCode})` : ''}`, value: `− ${money(order.discountTotal, cur)}`, muted: true }] : []),\n { label: 'Entrega', value: money(order.shippingTotal, cur) },\n { label: 'Impostos', value: money(order.taxTotal, cur) },\n { label: 'Total', value: money(order.total, cur), strong: true },\n ],\n paymentMethod: order.paymentMethodKind ? (PAYMENT_LABEL[order.paymentMethodKind] ?? order.paymentMethodKind) : undefined,\n paidAt: order.paidAt ? paidAtLabel(order.paidAt) : undefined,\n paymentExtra: <OrderPaymentDetail orderId={order.id} />,\n // Mapped by the shared helper, so the balance rows, the labels and the\n // instalment shape are the same three lines every product reads. What stays\n // here is the only part that is the shop's: the verbs, which need a writer.\n receivable: toOrderDetailReceivable(\n receivable,\n (value) => money(value, cur),\n {\n dateOnly: (value) => (value ? dateOnly(value) : ''),\n actions: (\n <>\n {receivable && receivable.balance.balance > 0 && receivable.balance.status !== 'cancelled' && (\n <Button\n onClick={() => {\n // A primeira parcela em aberto. `v_financial_bills` expõe\n // `installment_id AS id`, que é exatamente o que a RPC pede.\n const open = receivable?.bills.find((b) => Number(b.paid_amount ?? 0) < Number(b.amount))\n if (open) setPayingInstallment(toModalInstallment(open))\n }}\n data-testid=\"order-register-receipt\"\n >\n Registrar recebimento\n </Button>\n )}\n {/* Só existe se o Financeiro existir. O botão era incondicional e, num\n app sem o módulo instalado, levava a uma rota que ninguém montou —\n uma porta pintada na parede bem embaixo do registro do dinheiro. */}\n {hasFinancial && (\n <button type=\"button\" onClick={() => adminNavigateTo('/financial')}\n className=\"rounded-md border px-3 py-1.5 text-sm font-medium transition hover:bg-muted\">\n Abrir no Financeiro\n </button>\n )}\n </>\n ),\n },\n ) ?? { rows: [], installments: [], emptyLabel: 'Sem conta a receber para este pedido.' },\n extraSections: (\n <>\n <OrderDetailBlock title=\"Entrega\" hint=\"O que a logística precisa\">\n <div className=\"space-y-2 text-sm\">\n {addr ? (\n <div className=\"space-y-0.5\">\n <p>{[addr.street, addr.number].filter(Boolean).join(', ')}{addr.complement ? ` — ${addr.complement}` : ''}</p>\n {addr.district && <p className=\"text-muted-foreground\">{addr.district}</p>}\n <p className=\"text-muted-foreground\">\n {[addr.city, addr.state].filter((v) => v && v !== '—').join('/')}{addr.postal_code ? ` · ${addr.postal_code}` : ''}\n </p>\n {(addr.recipient || addr.phone) && <p className=\"text-xs text-muted-foreground\">{[addr.recipient, addr.phone].filter(Boolean).join(' · ')}</p>}\n </div>\n ) : (\n <p className={delivery ? '' : 'text-muted-foreground'}>{delivery ?? 'Nenhum endereço registrado neste pedido.'}</p>\n )}\n <div className=\"border-t pt-2\">\n <OrderDetailRow label=\"Status\" value={<InlineBadge value={order.fulfillmentStatus} />} />\n {shipments.length === 0 ? (\n <p className=\"mt-1 text-xs text-muted-foreground\">Nenhum envio registrado.</p>\n ) : (\n <div className=\"mt-2 space-y-2\">\n {shipments.map((s) => (\n <div key={s.id} className=\"rounded-md border px-2 py-1.5\">\n <div className=\"flex items-center justify-between gap-2\">\n <span className=\"text-sm font-medium\">{[s.carrier, s.service].filter(Boolean).join(' · ') || 'Envio'}</span>\n <span className=\"text-[10px] text-muted-foreground\">{SHIPMENT_LABEL[s.status] ?? s.status}</span>\n </div>\n {s.tracking_code && (\n <p className=\"mt-0.5 font-mono text-xs\">\n {s.tracking_url ? <a href={s.tracking_url} target=\"_blank\" rel=\"noreferrer\" className=\"text-primary hover:underline\">{s.tracking_code}</a> : s.tracking_code}\n </p>\n )}\n <div className=\"mt-1 space-y-0.5 text-[11px] text-muted-foreground\">\n {s.shipped_at && <p>Despachado em {dateTime(s.shipped_at)}</p>}\n {s.estimated_delivery_at && <p>Previsão: {dateTime(s.estimated_delivery_at)}</p>}\n {s.delivered_at && <p>Entregue em {dateTime(s.delivered_at)}</p>}\n </div>\n <ShipmentActions\n fulfillmentId={s.id}\n status={s.status}\n hasTracking={Boolean(s.tracking_code)}\n provider={provider}\n onChanged={reloadShipments}\n />\n </div>\n ))}\n </div>\n )}\n {order.fulfillmentStatus !== 'fulfilled' && (\n <>\n {/* The carrier's own flow when one is connected — buy the\n label, print it, let the tracking arrive by itself. Draws\n nothing when the store dispatches by hand. */}\n <ShipWithCarrier orderId={order.id} provider={provider} onShipped={reloadShipments} />\n <ShipOrderForm orderId={order.id} provider={provider} onShipped={reloadShipments} />\n </>\n )}\n </div>\n </div>\n </OrderDetailBlock>\n\n {/* Draws its own block, or nothing at all: a store with no ERP and no\n acquirer must not carry an empty panel on every order forever. */}\n <OrderProviderLinks orderId={order.id} />\n\n {/* Só a situação: as duas datas que moravam aqui viraram o rodapé de\n procedência, e a mesma data em dois lugares sugere duas coisas onde\n há uma. */}\n <OrderDetailBlock title=\"Situação\">\n <InlineBadge value={order.status} />\n </OrderDetailBlock>\n\n {order.notes && (\n <OrderDetailBlock title=\"Observações\">\n <p className=\"whitespace-pre-wrap text-sm text-muted-foreground\">{order.notes}</p>\n </OrderDetailBlock>\n )}\n </>\n ),\n onBack,\n backLabel: 'Pedidos',\n }\n\n return (\n <>\n <SharedOrderDetailView {...data} />\n {statusModal}\n {/* A mesma janela da tela de venda: código Pix para ler em voz alta, link\n para mandar, e a espera que vira \"pago\" sozinha. */}\n {order.customerId && (\n <CustomerModal\n open={editingCustomer}\n customerId={order.customerId}\n initial={{\n name: [customer?.firstName, customer?.lastName].filter(Boolean).join(' ')\n || (order.customerName ?? ''),\n email: customer?.email ?? order.customerEmail ?? '',\n phone: customer?.phone ?? '',\n document: customer?.document ?? '',\n }}\n provider={provider}\n onClose={() => setEditingCustomer(false)}\n onSaved={(saved) => {\n setCustomer(saved)\n setEditingCustomer(false)\n toast.success('Cadastro atualizado.')\n }}\n />\n )}\n\n {chargeOpen && (\n <NewOrderCharge\n open={chargeOpen}\n provider={provider}\n sessionId={charge?.sessionId ?? null}\n emv={charge?.emv ?? null}\n qrcodeBase64={charge?.qrcode ?? null}\n qrcodeUrl={charge?.qrcodeUrl ?? null}\n paymentUrl={charge?.paymentUrl ?? null}\n acquirer={charge?.provider ?? null}\n opening={charging !== null}\n error={chargeError}\n onChoose={(asLink) => { void openCharge(asLink) }}\n onRegisterReceipt={() => {\n setChargeOpen(false)\n const open = receivable?.bills.find((b) => Number(b.paid_amount ?? 0) < Number(b.amount))\n if (open) setPayingInstallment(toModalInstallment(open))\n }}\n total={charge?.total ?? order.total}\n currency={cur}\n customerName={order.customerName ?? ''}\n customerPhone={(order.shippingAddress?.phone ?? '').replace(/\\D/gu, '')}\n onPaid={() => {\n // Pago é uma mudança no pedido, não na janela: derruba o cache e\n // relê, para o cabeçalho e o recebível dizerem a mesma coisa.\n setChargeOpen(false)\n shopOrderCache.delete(orderId)\n void provider().getOrder(orderId).then((o) => { if (o) { shopOrderCache.set(orderId, o); setOrder(o) } })\n void loadReceivable(true)\n }}\n onClose={() => setChargeOpen(false)}\n />\n )}\n\n {/* SEM gate de `hasFinancial`, e a distinção importa: o modal traz o\n próprio provider e store, então o que ele precisa são as TABELAS do\n financeiro, não o plugin montado. O marketplace não monta o plugin —\n gatear aqui transformava o botão num clique morto, que é pior do que o\n erro vermelho que ele substituiu. `hasFinancial` continua certo para o\n link \"Abrir no Financeiro\", que precisa de uma ROTA existir. */}\n {payingInstallment && (\n <ReceivePaymentModal\n installment={payingInstallment}\n onClose={() => setPayingInstallment(null)}\n onPaid={() => { void afterReceipt() }}\n />\n )}\n </>\n )\n}\n\nexport const orderDetailPath = (id: string) => `/shop/orders/${id}`\nexport const goToOrder = (id: string) => adminNavigateTo(orderDetailPath(id))\n","import React, { useEffect, useMemo, useState } from 'react'\nimport {\n Button, Modal, ModalPortal, ModalOverlay, ModalContent,\n ModalHeader, ModalBody, ModalFooter, ModalTitle, ModalDescription,\n} from '@fayz-ai/ui'\n// Do subpath `/inventory`, que é onde a superfície completa do estoque mora —\n// o re-export da raiz não carrega os tipos até aqui.\nimport { listStockReasonCodes } from '@fayz-ai/shop/inventory'\nimport type { ShopProvider } from '@fayz-ai/shop'\nimport { errorMessage } from '../settings/error-message'\n\n// ---------------------------------------------------------------------------\n// \"Faltou estoque\" — a entrada, sem sair do pedido.\n//\n// A recusa do banco (`insufficient stock for X`) encerrava a venda: o lojista\n// tinha o cliente na linha, a mercadoria na prateleira, e a única saída era\n// outra tela — de onde ninguém volta para o pedido que estava digitando.\n//\n// Isto é uma ENTRADA, não um acerto: quem acabou de receber sabe quantas\n// unidades chegaram, nunca o total que deveria ficar na estante. Por isso a\n// quantidade é o que entra (e já vem com o que falta), o saldo novo é mostrado\n// como consequência, e o motivo sai do vocabulário do estoque — o mesmo que a\n// tela de movimentações usa, para o histórico ler igual de onde quer que a\n// entrada tenha sido lançada.\n// ---------------------------------------------------------------------------\n\n// Exportados: a aba de Estoque lança pelo mesmo par de datas, e duas cópias\n// desta regra de fuso é como uma delas envelhece sozinha.\n\n/** Hoje, no fuso de quem digita — que é o que um <input type=\"date\"> mostra. */\nexport function today(): string {\n const d = new Date()\n return `${d.getFullYear()}-${String(d.getMonth() + 1).padStart(2, '0')}-${String(d.getDate()).padStart(2, '0')}`\n}\n\n/**\n * A data escolhida, virando instante.\n *\n * Hoje devolve `undefined` — o banco carimba `now()` e a hora real do\n * lançamento é preservada, em vez de virar meia-noite. Outro dia vira MEIO-DIA\n * local: montado da meia-noite, um fuso a oeste lê o dia anterior, e há zonas\n * onde 00:00 não existe (horário de verão).\n */\nexport function occurredAtFor(date: string): string | undefined {\n if (!date || date === today()) return undefined\n const [y, m, d] = date.split('-').map(Number)\n if (!y || !m || !d) return undefined\n return new Date(y, m - 1, d, 12, 0, 0).toISOString()\n}\n\nexport interface StockEntryModalProps {\n open: boolean\n onClose: () => void\n provider: () => ShopProvider\n /** The variant the ledger tracks. When the line does not know it — a product\n * whose variants were never loaded — the modal looks it up on open. */\n variantId?: string | null\n productId: string\n productName: string\n sku?: string | null\n /** What the picker last saw on the shelf. Null when unknown. */\n available?: number | null\n /** How many this order needs — what makes the default quantity a real one. */\n needed?: number\n /** The new available count, for the caller to retry what the refusal stopped. */\n onReceived: (available: number) => void\n}\n\nexport function StockEntryModal({\n open, onClose, provider, variantId, productId, productName, sku, available, needed, onReceived,\n}: StockEntryModalProps) {\n // O mesmo vocabulário da tela de movimentações — motivo de entrada não é uma\n // lista escrita aqui, é linha de tabela (0034/0038).\n const reasons = useMemo(() => listStockReasonCodes('receipt'), [])\n\n // O que falta, e não 1: quem abre isto abriu porque faltou exatamente isso.\n const shortfall = Math.max(1, (needed ?? 1) - Math.max(0, available ?? 0))\n const [quantity, setQuantity] = useState(shortfall)\n const [reasonCode, setReasonCode] = useState('purchase')\n const [note, setNote] = useState('')\n // QUANDO chegou. A nota de sexta é digitada na segunda, e o razão guarda as\n // duas datas desde 0034 — `occurred_at` é esta, `created_at` é o lançamento.\n const [arrivedOn, setArrivedOn] = useState(today())\n const [saving, setSaving] = useState(false)\n const [error, setError] = useState<string | null>(null)\n\n useEffect(() => {\n if (!open) return\n setQuantity(shortfall)\n setReasonCode('purchase')\n setNote('')\n setArrivedOn(today())\n setError(null)\n }, [open, shortfall])\n\n // Endereçado pelo PRODUTO: qual variante recebe o lançamento — e o que fazer\n // num catálogo que não tem variante nenhuma — é decisão do provider, não de\n // uma tela de pedido.\n const receive = provider().receiveProductStock\n const newBalance = available == null ? null : Math.max(0, available) + quantity\n\n async function submit() {\n if (quantity <= 0) { setError('Informe quantas unidades entraram.'); return }\n setSaving(true)\n setError(null)\n try {\n const now = await provider().receiveProductStock!(productId, quantity, {\n variantId,\n reasonCode,\n note: note.trim() || undefined,\n occurredAt: occurredAtFor(arrivedOn),\n })\n onReceived(now)\n } catch (err: unknown) {\n setError(errorMessage(err))\n } finally {\n setSaving(false)\n }\n }\n\n const inputClass =\n 'mt-1 w-full rounded-md border bg-background px-2.5 py-1.5 text-sm outline-none focus:border-primary'\n\n return (\n <Modal open={open} onOpenChange={(next) => { if (!next) onClose() }}>\n <ModalPortal>\n <ModalOverlay>\n <ModalContent size=\"lg\" data-testid=\"stock-entry-modal\">\n <ModalHeader className=\"mb-4\">\n <ModalTitle>Dar entrada no estoque</ModalTitle>\n <ModalDescription>\n Entra no histórico como recebimento — o pedido segue logo depois.\n </ModalDescription>\n </ModalHeader>\n\n <ModalBody className=\"space-y-3\">\n <div className=\"rounded-md border bg-muted/30 px-3 py-2 text-sm\">\n <p className=\"font-medium\">{productName}</p>\n <p className=\"text-xs text-muted-foreground\">\n {sku ? `${sku} · ` : ''}\n {available == null ? 'Estoque desconhecido' : `${available} em estoque`}\n {needed != null ? ` · o pedido precisa de ${needed}` : ''}\n </p>\n </div>\n\n {!receive && (\n <p role=\"alert\" className=\"rounded-md border border-amber-200 bg-amber-50 px-3 py-2 text-sm text-amber-900\">\n Esta loja não registra entradas por aqui. Lance a entrada pela tela de estoque.\n </p>\n )}\n\n <label className=\"block\">\n <span className=\"text-xs font-medium text-muted-foreground\">Quantidade recebida</span>\n <input\n type=\"number\"\n min={1}\n step={1}\n autoFocus\n value={quantity}\n onChange={(event) => setQuantity(Math.max(0, Math.trunc(Number(event.target.value) || 0)))}\n data-testid=\"stock-entry-quantity\"\n className={inputClass}\n />\n {newBalance != null && (\n <span className=\"mt-0.5 block text-[11px] text-muted-foreground\">\n Saldo depois da entrada: {newBalance}\n </span>\n )}\n </label>\n\n <label className=\"block\">\n <span className=\"text-xs font-medium text-muted-foreground\">Data de entrada</span>\n <input\n type=\"date\"\n value={arrivedOn}\n max={today()}\n onChange={(event) => setArrivedOn(event.target.value || today())}\n data-testid=\"stock-entry-date\"\n className={inputClass}\n />\n <span className=\"mt-0.5 block text-[11px] text-muted-foreground\">\n Quando a mercadoria chegou. O lançamento fica com a data de hoje.\n </span>\n </label>\n\n <label className=\"block\">\n <span className=\"text-xs font-medium text-muted-foreground\">Motivo</span>\n <select\n value={reasonCode}\n onChange={(event) => setReasonCode(event.target.value)}\n data-testid=\"stock-entry-reason\"\n className={inputClass}\n >\n {reasons.map((reason) => (\n <option key={reason.key} value={reason.key}>{reason.label}</option>\n ))}\n </select>\n </label>\n\n <label className=\"block\">\n <span className=\"text-xs font-medium text-muted-foreground\">Observação</span>\n <input\n value={note}\n onChange={(event) => setNote(event.target.value)}\n placeholder=\"Nota fiscal, fornecedor — fica no histórico\"\n data-testid=\"stock-entry-note\"\n className={inputClass}\n />\n </label>\n\n {error && (\n <p role=\"alert\" className=\"rounded-md border border-red-200 bg-red-50 px-3 py-2 text-sm text-red-800\">\n {error}\n </p>\n )}\n </ModalBody>\n\n <ModalFooter className=\"mt-4 gap-2\">\n <Button variant=\"outline\" onClick={onClose} disabled={saving}>Cancelar</Button>\n <Button onClick={() => void submit()} disabled={saving || !receive} data-testid=\"stock-entry-save\">\n {saving ? 'Registrando…' : 'Registrar entrada'}\n </Button>\n </ModalFooter>\n </ModalContent>\n </ModalOverlay>\n </ModalPortal>\n </Modal>\n )\n}\n","import React, { useCallback, useEffect, useMemo, useState } from 'react'\nimport { Button, SearchSelect, formatPhone, toast } from '@fayz-ai/ui'\nimport {\n CrudRecordModal, OrderCreateScreen, OrderFormBlock, RecordPickerModal, duplicateWrite,\n type OrderCreateLine,\n} from '@fayz-ai/admin'\nimport type { EntityDef } from '@fayz-ai/core'\nimport { MapPin, Pencil, Search, X } from 'lucide-react'\nimport {\n CHARGEABLE_PROVIDERS,\n documentDigits,\n formatDocument,\n isValidDocument,\n supportsPaymentLink,\n} from '@fayz-ai/shop'\nimport { errorMessage } from '../settings/error-message'\nimport { invalidateProductLists, listProductsDetailed } from '../data/shared'\nimport { CustomerModal } from './CustomerModal'\nimport { insufficientStockProduct, validateNewOrder, type NewOrderEnding } from './new-order-rules'\nimport { StockEntryModal } from './StockEntryModal'\nimport { NewOrderCharge } from './NewOrderCharge'\nimport type {\n CustomerAddress, Product, ProductVariant, ShopCustomer, ShopProvider, StoreSettings,\n} from '@fayz-ai/shop'\n\n// ---------------------------------------------------------------------------\n// Selling over the phone.\n//\n// The console could read orders and never write one, so a sale taken by phone\n// or over the counter had nowhere to go: the merchant typed it into the\n// storefront as if they were the customer, or it stayed on paper.\n//\n// Same anatomy as the invoice form (OrderFormView): items and money on the wide\n// column, who/where/notes on the narrow one. It opens with two near-empty cards\n// and grows as the call goes — the coupon, the address and the payment details\n// are each one click away, never fields waiting to be filled.\n//\n// Three endings, because that is how the call ends:\n// · charge — a Pix to read out or send on WhatsApp. Goes through the\n// checkout SESSION, so the order is only born when the money\n// lands and an abandoned call leaves nothing behind.\n// · received — the money already arrived (cash, a Pix to the merchant's own\n// key). Placed and settled in one go.\n// · later — pending on the list, for someone to chase.\n//\n// Prices, freight and discount are never sent: the server reprices every line.\n// ---------------------------------------------------------------------------\n\n/**\n * The order's lines are the shared screen's now — same shape, one name for it\n * across the products. `stock` is still carried: it is only what the search\n * showed, so a refusal can open the stock entry already knowing the gap.\n */\ntype Line = OrderCreateLine\n\ntype CustomerDraft = {\n id: string | null\n name: string\n email: string\n phone: string\n document: string\n}\n\ntype AddressDraft = {\n postalCode: string\n street: string\n number: string\n complement: string\n district: string\n city: string\n state: string\n}\n\nconst EMPTY_CUSTOMER: CustomerDraft = { id: null, name: '', email: '', phone: '', document: '' }\nconst EMPTY_ADDRESS: AddressDraft = {\n postalCode: '', street: '', number: '', complement: '', district: '', city: '', state: '',\n}\n\nconst PAYMENT_METHODS = [\n { id: 'pix', label: 'Pix' },\n { id: 'cash', label: 'Dinheiro' },\n { id: 'credit_card', label: 'Cartão de crédito' },\n { id: 'debit_card', label: 'Cartão de débito' },\n { id: 'boleto', label: 'Boleto' },\n { id: 'other', label: 'Outro' },\n] as const\n\ntype PaymentMethodId = typeof PAYMENT_METHODS[number]['id']\n\n// The list that used to live here — `['abacatepay']` — was a second copy of the\n// gateway table, and it had already gone stale: a store that connected Vindi got\n// no charge button at the counter, because this line had never heard of it. It\n// now comes from @fayz-ai/shop, next to the functions it describes.\n\nconst money = (value: number, currency = 'BRL') =>\n new Intl.NumberFormat('pt-BR', { style: 'currency', currency }).format(Number(value) || 0)\n\nconst onlyDigits = (value: string) => value.replace(/\\D/gu, '')\n\nconst maskPostal = (value: string) => {\n const digits = onlyDigits(value).slice(0, 8)\n return digits.length > 5 ? `${digits.slice(0, 5)}-${digits.slice(5)}` : digits\n}\n\nconst fieldClass =\n 'mt-1 w-full rounded-md border bg-background px-2.5 py-1.5 text-sm outline-none focus:border-primary'\n\nfunction Field({ label, hint, children }: { label: string; hint?: string; children: React.ReactNode }) {\n return (\n <label className=\"block\">\n <span className=\"text-xs font-medium text-muted-foreground\">{label}</span>\n {children}\n {hint && <span className=\"mt-0.5 block text-[11px] text-muted-foreground\">{hint}</span>}\n </label>\n )\n}\n\nexport interface NewOrderPageProps {\n provider: () => ShopProvider\n onDone: (orderId?: string) => void\n onCancel: () => void\n /**\n * Corrigir um pedido que já existe, em vez de abrir um novo.\n *\n * É a MESMA tela porque é o mesmo ato: escolher cliente, itens e entrega. O\n * que muda é para onde a gravação vai — `reviseOrder`, que reescreve aquele\n * pedido pelo mesmo caminho de confiança que o criou (0072) — e que as formas\n * de cobrar somem: um pedido que já existe se cobra pela tela dele.\n */\n orderId?: string\n}\n\nexport function NewOrderPage({ provider, onDone, onCancel, orderId }: NewOrderPageProps) {\n const editing = Boolean(orderId)\n const [loading, setLoading] = useState(Boolean(orderId))\n const [orderNumber, setOrderNumber] = useState<number | null>(null)\n const [lines, setLines] = useState<Line[]>([])\n const [customer, setCustomer] = useState<CustomerDraft>(EMPTY_CUSTOMER)\n const [address, setAddress] = useState<AddressDraft>(EMPTY_ADDRESS)\n const [notes, setNotes] = useState('')\n const [discountCode, setDiscountCode] = useState('')\n const [couponOpen, setCouponOpen] = useState(false)\n const [settling, setSettling] = useState(false)\n const [method, setMethod] = useState<PaymentMethodId>('pix')\n const [reference, setReference] = useState('')\n const [settings, setSettings] = useState<StoreSettings | null>(null)\n const [freight, setFreight] = useState<{ price: number; label: string } | null>(null)\n const [saving, setSaving] = useState(false)\n const [error, setError] = useState<string | null>(null)\n const [session, setSession] = useState<{\n sessionId: string\n /** Pix copy-and-paste. Null when the sale was closed with a link instead. */\n emv: string | null\n qrcode: string | null\n /** O QR hospedado, para os adquirentes que não mandam bytes (Vindi). */\n qrcodeUrl: string | null\n /** The acquirer's own page — what the merchant copies into WhatsApp. */\n paymentUrl: string | null\n total: number\n } | null>(null)\n const [chargeOpen, setChargeOpen] = useState(false)\n /** Mostrando a escolha entre Pix e link — só existe quando a loja tem as duas. */\n const [charging, setCharging] = useState(false)\n /** O desfecho que o banco recusou, para refazê-lo assim que a causa sumir. */\n const [lastEnding, setLastEnding] = useState<NewOrderEnding | null>(null)\n const [entryOpen, setEntryOpen] = useState(false)\n const [editingCustomer, setEditingCustomer] = useState(false)\n\n useEffect(() => {\n if (!orderId) return\n let cancelled = false\n setLoading(true)\n void (async () => {\n try {\n const order = await provider().getOrder(orderId)\n if (cancelled || !order) return\n setOrderNumber(order.orderNumber)\n setLines(order.items.map((item, index) => ({\n key: `${item.productId ?? item.id}:${index}`,\n itemId: item.productId ?? '',\n name: item.name,\n sku: item.sku,\n imageUrl: item.imageUrl,\n unitPrice: item.unitPrice,\n quantity: item.quantity,\n // A lista de variações não é recarregada: a linha já sabe qual foi\n // vendida, e quem quiser trocar de variação tira a linha e escolhe o\n // produto de novo — que é o mesmo caminho de sempre.\n variants: [],\n variantId: item.variantId ?? null,\n optionsLabel: null,\n stock: null,\n })))\n setNotes(order.notes ?? '')\n setDiscountCode(order.discountCode ?? '')\n // O pedido guarda nome e e-mail; telefone e CPF vivem na ficha, e são\n // o que a cobrança exige — sem buscá-los a tela acusaria falta do que\n // o cliente já tem.\n const customerRow = order.customerId\n ? await provider().getCustomer(order.customerId).catch(() => null)\n : null\n if (cancelled) return\n setCustomer({\n id: order.customerId,\n name: customerRow\n ? `${customerRow.firstName} ${customerRow.lastName}`.trim()\n : (order.customerName ?? ''),\n email: customerRow?.email ?? order.customerEmail ?? '',\n phone: customerRow?.phone ?? '',\n document: customerRow?.document ?? '',\n })\n const addr = order.shippingAddress\n if (addr) {\n // O snapshot é o jsonb congelado no pedido, com os nomes de coluna do\n // banco — não os do formulário.\n setAddress({\n postalCode: addr.postal_code ?? '',\n street: addr.street ?? '',\n number: addr.number ?? '',\n complement: addr.complement ?? '',\n district: addr.district ?? '',\n city: addr.city ?? '',\n state: addr.state ?? '',\n })\n }\n } catch (err: unknown) {\n if (!cancelled) setError(errorMessage(err))\n } finally {\n if (!cancelled) setLoading(false)\n }\n })()\n return () => { cancelled = true }\n }, [orderId, provider])\n\n useEffect(() => {\n let cancelled = false\n provider().getStoreSettings?.()\n .then((value) => { if (!cancelled) setSettings(value ?? null) })\n .catch(() => { /* no policy row: the endings that need no acquirer still work */ })\n return () => { cancelled = true }\n }, [provider])\n\n const acquirer = settings?.paymentProvider ?? null\n const canCharge = Boolean(acquirer && CHARGEABLE_PROVIDERS.includes(acquirer))\n // Asked of the gateway table, never of the provider's name: this screen should\n // not learn which acquirers mint links. One that cannot simply does not show\n // the button, instead of showing one that fails.\n const canLink = canCharge && supportsPaymentLink(acquirer)\n const currency = settings?.currency ?? 'BRL'\n\n const subtotal = useMemo(\n () => lines.reduce((sum, line) => sum + line.unitPrice * line.quantity, 0),\n [lines],\n )\n const postalDigits = onlyDigits(address.postalCode)\n const delivers = postalDigits.length === 8\n const shipping = delivers ? (freight?.price ?? 0) : 0\n\n // Freight comes from the store's own delivery rules, never from this screen:\n // shop_place_order ignores whatever total a client sends.\n const quoteFreight = useCallback(async (postal: string) => {\n if (postal.length !== 8 || subtotal <= 0) { setFreight(null); return }\n try {\n const options = await provider().quoteShipping?.(postal, subtotal)\n const cheapest = (options ?? []).slice().sort((a, b) => a.rate - b.rate)[0]\n setFreight(cheapest ? { price: cheapest.rate, label: cheapest.name || cheapest.carrier || 'Entrega' } : null)\n } catch {\n setFreight(null)\n }\n }, [provider, subtotal])\n\n useEffect(() => { void quoteFreight(postalDigits) }, [postalDigits, quoteFreight])\n\n /**\n * A picked product becomes a line. Two things stay this screen's business:\n * a product with exactly one sellable variation is resolved right here (the\n * merchant should not be asked to choose between one option), and adding a\n * product that is already on the order bumps its quantity instead of laying a\n * second identical line next to the first.\n */\n const toLines = useCallback(async (products: Product[]): Promise<Line[]> => {\n const built: Line[] = []\n for (const product of products) {\n let variants: ProductVariant[] = []\n try {\n variants = (await provider().getProductVariants?.(product.id))?.variants ?? []\n } catch {\n /* a product with no variant table is the ordinary case */\n }\n const sellable = variants.filter((v) => v.status !== 'archived')\n const only = sellable.length === 1 ? sellable[0] : null\n built.push({\n key: `${product.id}:${Date.now()}:${built.length}`,\n itemId: product.id,\n name: product.name,\n sku: only?.sku ?? product.sku ?? null,\n imageUrl: product.images?.[0]?.url ?? null,\n unitPrice: only?.price ?? product.price,\n quantity: 1,\n variants: sellable.length > 1 ? sellable : [],\n variantId: only?.id ?? null,\n optionsLabel: null,\n stock: only?.inventoryCount ?? product.inventoryCount ?? null,\n })\n }\n return built\n }, [provider])\n\n const shippingAddress = delivers\n ? {\n postalCode: postalDigits,\n street: address.street.trim(),\n number: address.number.trim() || undefined,\n complement: address.complement.trim() || undefined,\n district: address.district.trim() || undefined,\n city: address.city.trim(),\n state: address.state.trim().toUpperCase(),\n country: 'BR',\n recipient: customer.name.trim() || undefined,\n phone: onlyDigits(customer.phone) || undefined,\n document: onlyDigits(customer.document) || undefined,\n }\n : undefined\n\n function validate(ending: NewOrderEnding): string | null {\n return validateNewOrder({\n lineCount: lines.length,\n unresolvedVariants: lines.filter((line) => line.variants.length > 0 && !line.variantId).length,\n customerName: customer.name,\n customerEmail: customer.email,\n customerPhone: onlyDigits(customer.phone),\n customerDocument: customer.document.trim(),\n documentValid: isValidDocument(customer.document),\n delivers,\n addressComplete: Boolean(address.street.trim() && address.city.trim() && address.state.trim()),\n }, ending)\n }\n\n /**\n * Resolve the customer to a ROW before placing, and never by e-mail alone.\n *\n * shop_place_order stamps `auth_user_id` on a customer it finds or creates by\n * e-mail — which here is the MERCHANT's user. The buyer would then be locked\n * out of their own record (\"customer belongs to another account\") the first\n * time they bought on the storefront. Passing an existing id skips that\n * branch entirely.\n */\n async function resolveCustomerId(): Promise<string | undefined> {\n if (customer.id) return customer.id\n const email = customer.email.trim().toLowerCase()\n const [first, ...rest] = customer.name.trim().split(/\\s+/u)\n if (email) {\n const found = await provider().listCustomers({ search: email, limit: 5 })\n const hit = found.find((c) => (c.email ?? '').toLowerCase() === email)\n if (hit) return hit.id\n }\n const created = await provider().createCustomer({\n firstName: first ?? customer.name.trim(),\n lastName: rest.join(' '),\n email: email || undefined,\n phone: onlyDigits(customer.phone) || undefined,\n })\n return created.id\n }\n\n async function finish(ending: NewOrderEnding) {\n const invalid = validate(ending)\n if (invalid) { setError(invalid); return }\n setLastEnding(ending)\n setSaving(true)\n setError(null)\n try {\n if (ending === 'charge' || ending === 'link') {\n const opened = await provider().openCheckoutSession?.({\n items: lines.map((line) => ({\n productId: line.itemId,\n variantId: line.variantId,\n quantity: line.quantity,\n optionsLabel: line.optionsLabel,\n })),\n customer: { name: customer.name.trim(), email: customer.email.trim().toLowerCase() },\n shippingAddress,\n discountCode: discountCode.trim() || null,\n // The one difference between the two endings, all the way down: same\n // repricing, same frozen session, same settlement by webhook. What\n // changes is whether the acquirer answers with a code to read out or\n // an address to send.\n asLink: ending === 'link',\n })\n if (ending === 'link' && !opened?.paymentUrl) {\n throw new Error('O adquirente não devolveu o link de pagamento. Tente de novo.')\n }\n if (ending === 'charge' && !opened?.charge?.emv) {\n throw new Error('A cobrança foi aberta sem código Pix. Tente de novo.')\n }\n setSession({\n sessionId: opened!.sessionId,\n emv: opened!.charge?.emv ?? null,\n qrcode: opened!.charge?.qrcodeBase64 ?? null,\n qrcodeUrl: opened!.charge?.qrcodeUrl ?? null,\n paymentUrl: opened!.paymentUrl ?? null,\n total: opened!.total,\n })\n setChargeOpen(true)\n return\n }\n\n const customerId = await resolveCustomerId()\n const payload = {\n customerId,\n customer: { name: customer.name.trim(), email: customer.email.trim().toLowerCase() || undefined },\n items: lines.map((line) => ({\n productId: line.itemId,\n variantId: line.variantId ?? undefined,\n quantity: line.quantity,\n optionsLabel: line.optionsLabel ?? undefined,\n })),\n shippingAddress,\n discountCode: discountCode.trim() || undefined,\n paymentMethod: ending === 'received' ? method : undefined,\n notes: notes.trim() || undefined,\n }\n // Mesma carga, outra porta: `reviseOrder` reescreve o pedido que já\n // existe pelo mesmo caminho de confiança que o criou.\n const order = orderId\n ? await provider().reviseOrder!(orderId, payload)\n : await provider().placeOrder(payload)\n\n if (ending === 'received') {\n await provider().confirmPayment?.(order.id, reference.trim() || `manual:${method}`)\n }\n // A tela seguinte é o pedido, e um pedido aberto na tela não diz por si se\n // acabou de ser criado ou se já estava lá — ainda mais depois de uma\n // recusa de estoque, em que o lojista tentou salvar duas vezes.\n toast.success(\n orderId\n ? `Pedido #${order.orderNumber} atualizado.`\n : ending === 'received'\n ? `Pedido #${order.orderNumber} salvo e marcado como pago.`\n : `Pedido #${order.orderNumber} salvo.`,\n )\n onDone(order.id)\n } catch (err: unknown) {\n setError(errorMessage(err))\n } finally {\n setSaving(false)\n }\n }\n\n // The save bar's contract — an unsaved order is an unsaved change like any\n // other, so it speaks through the app's floating island rather than a button\n // inside the payment card. It is handed to OrderCreateScreen below; the\n // condition is still this screen's, because only it knows that an open charge\n // means the order will be born from the payment and saving now would make a\n // second one.\n\n // A linha que o banco recusou. O RPC nomeia o PRODUTO, que é o que o lojista\n // vê — casar pelo nome é o que existe, e uma recusa sem par cai no erro seco\n // de sempre em vez de abrir uma entrada para o produto errado.\n const blockedLine = useMemo(() => {\n const name = insufficientStockProduct(error)\n if (!name) return null\n const wanted = name.trim().toLowerCase()\n return lines.find((line) => line.name.trim().toLowerCase() === wanted) ?? null\n }, [error, lines])\n\n const sideSections = (\n <>\n <OrderFormBlock title=\"Cliente\">\n <CustomerPicker\n provider={provider}\n value={customer}\n onChange={setCustomer}\n editing={editingCustomer}\n onEditing={setEditingCustomer}\n />\n </OrderFormBlock>\n\n <OrderFormBlock title=\"Entrega\">\n <DeliveryAddress\n provider={provider}\n customerId={customer.id}\n address={address}\n onChange={setAddress}\n />\n </OrderFormBlock>\n\n <OrderFormBlock title=\"Observações\">\n <textarea\n value={notes}\n onChange={(event) => setNotes(event.target.value)}\n rows={2}\n placeholder=\"Combinado por telefone: entregar depois das 18h…\"\n data-testid=\"new-order-notes\"\n className=\"w-full resize-y rounded-md border bg-background px-2.5 py-1.5 text-sm outline-none focus:border-primary\"\n />\n </OrderFormBlock>\n </>\n )\n\n // ── the picker's search, kept here: the cache funnel is the shop's ────────\n const [fromCache, setFromCache] = useState(false)\n const searchProducts = useCallback(async (term: string) => {\n const answer = await listProductsDetailed(provider, { search: term || undefined, status: 'active', limit: 20 })\n setFromCache(Boolean(answer.cached || answer.stale))\n return answer.rows\n }, [provider])\n\n // ── the rows between subtotal and total ──────────────────────────────────\n const totalRows = useMemo(() => [\n {\n key: 'coupon',\n label: couponOpen || discountCode\n ? <span className=\"text-muted-foreground\">Cupom</span>\n : (\n // Muted \"+ add\" rows keep the card empty until it is asked for.\n <button type=\"button\" onClick={() => setCouponOpen(true)} data-testid=\"new-order-add-coupon\"\n className=\"text-sm text-muted-foreground underline-offset-2 transition hover:text-foreground hover:underline\">\n Adicionar cupom\n </button>\n ),\n value: couponOpen || discountCode ? (\n <input\n value={discountCode}\n onChange={(event) => setDiscountCode(event.target.value.toUpperCase())}\n placeholder=\"CÓDIGO\"\n autoFocus\n data-testid=\"new-order-discount\"\n className=\"w-40 rounded-md border bg-background px-2 py-1 text-right text-sm uppercase outline-none focus:border-primary\"\n />\n ) : <span className=\"text-muted-foreground\">—</span>,\n },\n {\n key: 'shipping',\n label: delivers ? `Entrega${freight ? ` · ${freight.label}` : ''}` : 'Entrega',\n muted: !delivers,\n value: delivers ? money(shipping, currency) : <span className=\"text-muted-foreground\">sem entrega</span>,\n },\n ], [couponOpen, discountCode, delivers, freight, shipping, currency])\n\n // ── where the refusal says the fix is ────────────────────────────────────\n const errorActions = (\n <>\n {customer.id && error && /cliente/iu.test(error) && (\n <button type=\"button\" onClick={() => setEditingCustomer(true)}\n data-testid=\"new-order-fix-customer\"\n className=\"mt-1 font-medium underline underline-offset-2\">\n Editar cadastro de {customer.name}\n </button>\n )}\n {/* Mesma ideia do botão acima: a recusa diz ONDE está o conserto, e o\n conserto acontece aqui — sem estoque a venda não sai, e a mercadoria\n costuma estar na prateleira, só não no sistema. */}\n {blockedLine && (\n <button type=\"button\" onClick={() => setEntryOpen(true)}\n data-testid=\"new-order-stock-entry\"\n className=\"mt-1 font-medium underline underline-offset-2\">\n Dar entrada no estoque de {blockedLine.name}\n </button>\n )}\n </>\n )\n\n const discard = () => {\n // Editando, descartar é sair sem gravar — zerar os campos apagaria da tela\n // um pedido que continua inteiro no banco.\n if (orderId) { onCancel(); return }\n setLines([])\n setCustomer(EMPTY_CUSTOMER)\n setAddress(EMPTY_ADDRESS)\n setNotes('')\n setDiscountCode('')\n setCouponOpen(false)\n setError(null)\n }\n\n // ── how the call ends ────────────────────────────────────────────────────\n const endingsNode = (\n <>\n {settling && (\n <div className=\"fz-fields fz-fields-2 mt-3 gap-2 rounded-md border bg-muted/30 p-3\">\n <Field label=\"Como recebeu\">\n <select value={method} onChange={(event) => setMethod(event.target.value as PaymentMethodId)}\n data-testid=\"new-order-method\" className={fieldClass}>\n {PAYMENT_METHODS.map((option) => (\n <option key={option.id} value={option.id}>{option.label}</option>\n ))}\n </select>\n </Field>\n <Field label=\"Comprovante\" hint=\"Id da transação, número do recibo — fica no pedido\">\n <input value={reference} onChange={(event) => setReference(event.target.value)}\n placeholder=\"Opcional\" data-testid=\"new-order-reference\" className={fieldClass} />\n </Field>\n </div>\n )}\n\n {/* Under the totals, and only once there is something to sell.\n\n Eram quatro botões do mesmo peso, e o único que apenas GUARDAVA o\n pedido (\"cobrar depois\") era o mais apagado dos quatro. Salvar saiu\n daqui: virou a barra de \"não salvo\" que o resto do app usa, onde\n está sempre visível e não depende de escolher forma de pagamento.\n O que sobra neste cartão é só o que fala de dinheiro.\n */}\n {lines.length > 0 && !editing && (\n <div className=\"mt-4 flex flex-wrap items-center gap-2\">\n {settling ? (\n <>\n <Button onClick={() => void finish('received')} disabled={saving} data-testid=\"new-order-confirm-received\">\n {saving ? 'Criando…' : 'Confirmar pagamento'}\n </Button>\n <Button variant=\"outline\" onClick={() => setSettling(false)}>Voltar</Button>\n </>\n ) : charging ? (\n /* Pix e link são a MESMA cobrança — muda só por onde ela chega ao\n cliente. A escolha só aparece para quem tem as duas. */\n <>\n <Button onClick={() => void finish('charge')} disabled={saving} data-testid=\"new-order-charge-pix\">\n {saving ? 'Abrindo…' : 'Cobrança Pix'}\n </Button>\n <Button variant=\"outline\" onClick={() => void finish('link')} disabled={saving} data-testid=\"new-order-link\">\n {saving ? 'Gerando…' : 'Link de pagamento'}\n </Button>\n <Button variant=\"ghost\" onClick={() => setCharging(false)}>Voltar</Button>\n </>\n ) : session ? (\n /* Com cobrança aberta o pedido nasce do pagamento, não daqui:\n salvar agora criaria um segundo pedido quando o cliente pagar. */\n <>\n <Button onClick={() => setChargeOpen(true)} data-testid=\"new-order-charge\">Ver cobrança</Button>\n <span className=\"text-xs text-muted-foreground\">\n A cobrança está aberta — o pedido entra sozinho quando ela for paga.\n </span>\n </>\n ) : (\n <>\n {canCharge && (\n <Button\n onClick={() => (canLink ? setCharging(true) : void finish('charge'))}\n disabled={saving}\n data-testid=\"new-order-charge\"\n >\n {saving ? 'Abrindo…' : canLink ? 'Cobrar' : 'Cobrar por Pix'}\n </Button>\n )}\n <Button variant={canCharge ? 'ghost' : 'default'} onClick={() => setSettling(true)}\n data-testid=\"new-order-received\">\n Já recebi\n </Button>\n </>\n )}\n </div>\n )}\n </>\n )\n\n const overlays = (\n <>\n\n {/* Over the order, never instead of it: the cart has to survive a Pix that\n nobody paid. */}\n {blockedLine && (\n <StockEntryModal\n open={entryOpen}\n provider={provider}\n variantId={blockedLine.variantId}\n productId={blockedLine.itemId}\n productName={blockedLine.name}\n sku={blockedLine.sku}\n available={blockedLine.stock}\n needed={blockedLine.quantity}\n onClose={() => setEntryOpen(false)}\n onReceived={(now) => {\n setLines((current) => current.map((line) =>\n line.key === blockedLine.key ? { ...line, stock: now } : line))\n setEntryOpen(false)\n setError(null)\n // Refaz o que a falta de estoque interrompeu: a intenção não mudou, e\n // pedir o mesmo clique de novo seria só cerimônia.\n if (lastEnding) void finish(lastEnding)\n }}\n />\n )}\n\n {session && (\n <NewOrderCharge\n open={chargeOpen}\n provider={provider}\n sessionId={session.sessionId}\n emv={session.emv}\n qrcodeBase64={session.qrcode}\n qrcodeUrl={session.qrcodeUrl}\n paymentUrl={session.paymentUrl}\n acquirer={acquirer}\n total={session.total}\n currency={currency}\n customerPhone={onlyDigits(customer.phone)}\n customerName={customer.name}\n onPaid={onDone}\n onClose={() => setChargeOpen(false)}\n />\n )}\n </>\n )\n\n return (\n <OrderCreateScreen<Product>\n title={orderId ? `Editar pedido${orderNumber ? ` #${orderNumber}` : ''}` : 'Novo pedido'}\n parentLabel=\"Pedidos\"\n onBack={onCancel}\n subtitle={orderId\n ? 'Enquanto ninguém pagou, o pedido ainda é rascunho'\n : 'Venda por telefone, WhatsApp ou balcão'}\n itemsTitle=\"Produtos\"\n itemSearch={{\n placeholder: 'Buscar produto por nome ou SKU',\n title: 'Selecionar produtos',\n emptyLabel: 'Nenhum produto encontrado.',\n columns: { product: 'Produto', meta: 'Estoque', value: 'Preço' },\n // Same cache funnel as the products page: a catalogue the merchant just\n // browsed answers the picker without a round-trip.\n search: searchProducts,\n rowKey: (product) => product.id,\n renderRow: (product) => ({\n imageUrl: product.images?.[0]?.url ?? null,\n title: product.name,\n subtitle: product.sku ?? undefined,\n meta: product.inventoryCount ?? 0,\n value: money(product.price, currency),\n }),\n toLines,\n onRefresh: invalidateProductLists,\n fromCache,\n }}\n lines={lines}\n onLinesChange={setLines}\n formatMoney={(value) => money(value, currency)}\n totalsTitle=\"Pagamento\"\n totalRows={totalRows}\n extraTotal={shipping}\n sideSections={sideSections}\n error={error}\n errorActions={errorActions}\n endings={endingsNode}\n overlays={overlays}\n saveBar={{\n dirty: lines.length > 0 && !loading && !session && !settling && !charging,\n saving,\n onSave: () => { void finish('later') },\n onDiscard: discard,\n message: orderId ? 'Alterações não salvas' : 'Pedido não salvo',\n saveLabel: orderId ? 'Salvar alterações' : 'Salvar pedido',\n discardLabel: orderId ? 'Sair sem salvar' : 'Descartar',\n }}\n />\n )\n}\n\n// ---------------------------------------------------------------------------\n// Customer — one search field, and a modal when the person is new.\n// ---------------------------------------------------------------------------\n\nfunction CustomerPicker({ provider, value, onChange, editing, onEditing }: {\n provider: () => ShopProvider\n value: CustomerDraft\n onChange: (value: CustomerDraft) => void\n editing: boolean\n onEditing: (editing: boolean) => void\n}) {\n const [creating, setCreating] = useState<string | null>(null)\n const setEditing = onEditing\n\n if (value.id) {\n // Everything shown here lives on the CUSTOMER, so editing it edits the\n // record — a CPF typed for one order used to vanish with the order, and the\n // next sale to the same person asked for it again.\n const missing = [\n !value.phone && 'telefone',\n !value.email && 'e-mail',\n !value.document && 'CPF',\n ].filter(Boolean) as string[]\n\n return (\n <div className=\"space-y-2\">\n <div className=\"flex items-start gap-2 rounded-md border bg-muted/30 p-2.5\">\n <div className=\"min-w-0 flex-1 text-sm\">\n <p className=\"truncate font-medium\">{value.name}</p>\n {value.email && <p className=\"truncate text-xs text-muted-foreground\">{value.email}</p>}\n {value.phone && <p className=\"truncate text-xs text-muted-foreground\">{formatPhone(value.phone)}</p>}\n {value.document && (\n <p className=\"truncate text-xs text-muted-foreground\">{formatDocument(value.document)}</p>\n )}\n </div>\n <button type=\"button\" aria-label=\"Trocar cliente\" data-testid=\"new-order-customer-clear\"\n onClick={() => onChange(EMPTY_CUSTOMER)}\n className=\"fz-tap flex items-center justify-center rounded p-1 text-muted-foreground transition hover:bg-muted hover:text-foreground\">\n <X className=\"h-3.5 w-3.5\" />\n </button>\n </div>\n\n <div className=\"flex flex-wrap items-center gap-3\">\n <button type=\"button\" onClick={() => setEditing(true)} data-testid=\"new-order-customer-edit\"\n className=\"inline-flex items-center gap-1.5 text-sm text-muted-foreground underline-offset-2 transition hover:text-foreground hover:underline\">\n <Pencil className=\"h-3.5 w-3.5\" />\n Editar cadastro\n </button>\n {missing.length > 0 && (\n <span className=\"text-xs text-muted-foreground\">\n Falta {missing.join(', ')}\n </span>\n )}\n </div>\n\n <CustomerModal\n open={editing}\n customerId={value.id}\n initial={value}\n provider={provider}\n onClose={() => setEditing(false)}\n onSaved={(saved) => {\n onChange({\n id: saved.id,\n name: `${saved.firstName} ${saved.lastName}`.trim(),\n email: saved.email ?? '',\n phone: saved.phone ?? '',\n document: saved.document ?? '',\n })\n setEditing(false)\n }}\n />\n </div>\n )\n }\n\n return (\n <>\n <SearchSelect\n value=\"\"\n placeholder=\"Buscar ou criar cliente\"\n noResultsLabel=\"Nenhum cliente com esse nome.\"\n searchingLabel=\"Buscando…\"\n allowCreate\n createLabel=\"Criar cliente\"\n onCreate={(query) => setCreating(query)}\n onSearch={async (query) => {\n const found = await provider().listCustomers({ search: query || undefined, limit: 6 })\n return found.map((c) => ({\n id: c.id,\n label: `${c.firstName} ${c.lastName}`.trim(),\n subtitle: c.email ?? c.phone ?? undefined,\n data: c,\n }))\n }}\n onChange={(id, option) => {\n const found = option?.data as ShopCustomer | undefined\n if (!found) return\n onChange({\n id,\n name: `${found.firstName} ${found.lastName}`.trim(),\n email: found.email ?? '',\n phone: found.phone ?? '',\n document: found.document ?? '',\n })\n }}\n />\n\n <CustomerModal\n open={creating !== null}\n initialName={creating ?? ''}\n provider={provider}\n onClose={() => setCreating(null)}\n onSaved={(saved) => {\n onChange({\n id: saved.id,\n name: `${saved.firstName} ${saved.lastName}`.trim(),\n email: saved.email ?? '',\n phone: saved.phone ?? '',\n document: saved.document ?? '',\n })\n setCreating(null)\n }}\n />\n </>\n )\n}\n\n// ---------------------------------------------------------------------------\n// Delivery address — the book first, the form only if asked for.\n//\n// Eight blank fields were the default state of this block, and for a repeat\n// customer every one of them was already known. Saved addresses come first;\n// typing one is a deliberate act behind a button. No address at all is a valid\n// order — that is a counter sale.\n// ---------------------------------------------------------------------------\n\nfunction DeliveryAddress({ provider, customerId, address, onChange }: {\n provider: () => ShopProvider\n customerId: string | null\n address: AddressDraft\n onChange: (address: AddressDraft) => void\n}) {\n const [saved, setSaved] = useState<CustomerAddress[]>([])\n const [chosen, setChosen] = useState<string | null>(null)\n const [editing, setEditing] = useState(false)\n\n const use = useCallback((row: CustomerAddress) => {\n setChosen(row.id)\n setEditing(false)\n onChange({\n postalCode: row.postalCode ?? '',\n street: row.street ?? '',\n number: row.number ?? '',\n complement: row.complement ?? '',\n district: row.district ?? '',\n city: row.city ?? '',\n state: row.state ?? '',\n })\n }, [onChange])\n\n useEffect(() => {\n if (!customerId) { setSaved([]); return }\n let cancelled = false\n provider().listCustomerAddresses?.(customerId)\n .then((rows) => {\n if (cancelled || !rows?.length) return\n setSaved(rows)\n // The default address is what the merchant would have typed anyway.\n use(rows[0])\n })\n .catch(() => { /* no address book: the form is one click away */ })\n return () => { cancelled = true }\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [customerId, provider])\n\n const filled = Boolean(address.postalCode && address.street)\n\n if (!editing) {\n return (\n <div className=\"space-y-2\">\n {saved.map((row) => (\n <button\n key={row.id}\n type=\"button\"\n onClick={() => use(row)}\n data-testid=\"new-order-saved-address\"\n className={`block w-full rounded-md border p-2.5 text-left text-sm transition ${\n chosen === row.id ? 'border-primary bg-primary/5' : 'hover:bg-muted/50'\n }`}\n >\n <span className=\"block\">{[row.street, row.number].filter(Boolean).join(', ')}</span>\n <span className=\"block text-xs text-muted-foreground\">\n {[row.district, row.city, row.state].filter(Boolean).join(' · ')}\n {row.postalCode ? ` · ${maskPostal(row.postalCode)}` : ''}\n </span>\n </button>\n ))}\n\n {saved.length === 0 && filled && (\n <div className=\"rounded-md border p-2.5 text-sm\" data-testid=\"new-order-address-summary\">\n <p>{[address.street, address.number].filter(Boolean).join(', ')}</p>\n <p className=\"text-xs text-muted-foreground\">\n {[address.district, address.city, address.state].filter(Boolean).join(' · ')} · {maskPostal(address.postalCode)}\n </p>\n </div>\n )}\n\n {saved.length === 0 && !filled && (\n <p className=\"text-sm text-muted-foreground\">Sem endereço = retirada.</p>\n )}\n\n <button\n type=\"button\"\n onClick={() => setEditing(true)}\n data-testid=\"new-order-add-address\"\n className=\"inline-flex items-center gap-1.5 text-sm text-muted-foreground underline-offset-2 transition hover:text-foreground hover:underline\"\n >\n <MapPin className=\"h-3.5 w-3.5\" />\n {filled ? 'Usar outro endereço' : 'Adicionar endereço'}\n </button>\n </div>\n )\n }\n\n return (\n <div className=\"fz-fields fz-fields-2 gap-2\">\n <div>\n <PostalField\n value={address.postalCode}\n onChange={(postalCode) => onChange({ ...address, postalCode })}\n onResolved={(found) => onChange({ ...address, ...found })}\n />\n </div>\n <div>\n <Field label=\"Número\">\n <input value={address.number} onChange={(e) => onChange({ ...address, number: e.target.value })}\n data-testid=\"new-order-number\" className={fieldClass} />\n </Field>\n </div>\n <div className=\"fz-field-wide\">\n <Field label=\"Rua\">\n <input value={address.street} onChange={(e) => onChange({ ...address, street: e.target.value })}\n data-testid=\"new-order-street\" className={fieldClass} />\n </Field>\n </div>\n <div className=\"fz-field-wide\">\n <Field label=\"Complemento\">\n <input value={address.complement} onChange={(e) => onChange({ ...address, complement: e.target.value })}\n placeholder=\"Apto, bloco, ponto de referência\" className={fieldClass} />\n </Field>\n </div>\n <div className=\"fz-field-wide\">\n <Field label=\"Bairro\">\n <input value={address.district} onChange={(e) => onChange({ ...address, district: e.target.value })}\n className={fieldClass} />\n </Field>\n </div>\n <div>\n <Field label=\"Cidade\">\n <input value={address.city} onChange={(e) => onChange({ ...address, city: e.target.value })}\n className={fieldClass} />\n </Field>\n </div>\n <div>\n <Field label=\"UF\">\n <input value={address.state} maxLength={2}\n onChange={(e) => onChange({ ...address, state: e.target.value.toUpperCase() })}\n className={fieldClass} />\n </Field>\n </div>\n <div className=\"fz-field-wide flex gap-3\">\n <button type=\"button\" onClick={() => setEditing(false)} data-testid=\"new-order-address-done\"\n className=\"text-sm font-medium text-primary underline-offset-2 hover:underline\">\n Pronto\n </button>\n {filled && (\n <button type=\"button\" data-testid=\"new-order-address-clear\"\n onClick={() => { onChange(EMPTY_ADDRESS); setChosen(null); setEditing(false) }}\n className=\"text-sm text-muted-foreground underline-offset-2 hover:underline\">\n Remover entrega\n </button>\n )}\n </div>\n </div>\n )\n}\n\n// ---------------------------------------------------------------------------\n// Postal code — typing eight digits fills the rest of the address.\n// ---------------------------------------------------------------------------\n\nfunction PostalField({ value, onChange, onResolved }: {\n value: string\n onChange: (value: string) => void\n onResolved: (address: Partial<AddressDraft>) => void\n}) {\n const [looking, setLooking] = useState(false)\n const [missing, setMissing] = useState(false)\n\n useEffect(() => {\n const digits = onlyDigits(value)\n if (digits.length !== 8) { setMissing(false); return }\n let cancelled = false\n setLooking(true)\n fetch(`https://viacep.com.br/ws/${digits}/json/`)\n .then((response) => response.json())\n .then((found: Record<string, string> & { erro?: boolean }) => {\n if (cancelled) return\n if (found?.erro) { setMissing(true); return }\n setMissing(false)\n onResolved({\n street: found.logradouro || '',\n district: found.bairro || '',\n city: found.localidade || '',\n state: (found.uf || '').toUpperCase(),\n })\n })\n .catch(() => { /* offline: the fields stay typed by hand */ })\n .finally(() => { if (!cancelled) setLooking(false) })\n return () => { cancelled = true }\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [value])\n\n return (\n <Field label=\"CEP\" hint={looking ? 'Buscando…' : missing ? 'CEP não encontrado — preencha à mão' : undefined}>\n <input\n value={maskPostal(value)}\n onChange={(event) => onChange(event.target.value)}\n placeholder=\"00000-000\"\n inputMode=\"numeric\"\n data-testid=\"new-order-postal\"\n className={fieldClass}\n />\n </Field>\n )\n}\n","import type { PluginAITool } from '@fayz-ai/core'\nimport type { AgentSurfaceTool } from '@fayz-ai/admin'\nimport type {\n Order, PlaceOrderInput, Product, ProductVariant, ShippingAddressInput, ShopProvider,\n} from '@fayz-ai/shop'\nimport { errorMessage } from '../settings/error-message'\nimport { listProductsCached } from '../data/shared'\nimport {\n candidateMeta, rankProducts, resolveTerm, type ProductCandidate,\n} from './product-matching'\n\n// ---------------------------------------------------------------------------\n// Tirar pedido pela conversa — a lista de Pedidos emprestando o balcão ao agente.\n//\n// O pedido chega escrito, não digitado. \"3 costela suína + 1 barbecue / Bruna\n// recantinho / entregar sexta\" é uma mensagem de WhatsApp, e transformá-la num\n// pedido é hoje um trabalho de tradutor: abrir a tela, procurar cada produto,\n// contar, achar a cliente, copiar o recado. O que falta não é uma tela nova —\n// é o agente saber fazer as MESMAS quatro coisas que a tela faz.\n//\n// Então a lista publica quatro ferramentas e um roteiro:\n// · findShopProducts — do texto para o catálogo, vários termos de uma vez\n// · findShopCustomers — do nome para o cadastro\n// · createShopOrder — o mesmo `placeOrder` do balcão, com o cartão de\n// confirmação como o clique que grava\n// · chargeShopOrder /\n// setShopOrderAddress — o que se faz DEPOIS, que é onde a conversa\n// continua em vez de acabar\n//\n// Preço, frete e estoque nunca passam por aqui: `placeOrder` reprecifica no\n// servidor. O agente escolhe QUAL produto, nunca QUANTO custa.\n// ---------------------------------------------------------------------------\n\nexport const ORDER_TAKING_INSTRUCTIONS = `\nEsta tela é a lista de Pedidos da loja. O lojista recebe pedido por WhatsApp e cola a mensagem aqui.\n\nComo tirar um pedido:\n1. Leia a mensagem e separe três coisas: os itens com quantidade, quem é o cliente, e os recados de entrega. Item sem número é quantidade 1.\n2. Chame \\`findShopProducts\\` UMA vez com todos os termos de item juntos. Nunca invente produto, preço ou SKU.\n · Ela DECIDE por você. Termo que volta com \\`product\\` está resolvido: use e siga, sem confirmar, sem listar alternativa. Um vencedor folgado não é uma dúvida.\n · Termo que volta com \\`needsChoice\\` já virou uma pergunta com botões na tela do lojista. NÃO repita as opções no texto, não escreva SKU, preço nem estoque em lista: no máximo uma linha curta, e espere ele tocar. A resposta dele volta como \"Nome (id)\" — o id entre parênteses é o produto escolhido.\n · Termo que volta com \\`notFound\\` é o único que se pergunta por texto: diga que a loja não tem esse item e pergunte o que usar no lugar.\n · \\`outOfStock\\` é aviso, não bloqueio: diga numa frase antes de montar o pedido.\n · Produto com variações: use a que a mensagem indicar; se ela não indicar, pergunte.\n3. Cliente: \\`findShopCustomers\\` com o nome (ou o telefone). Um candidato claro, use o \\`customerId\\`. Vários, pergunte. Nenhum, deixe o pedido criar o cadastro com o nome que veio — não peça e-mail nem CPF.\n4. Endereço é OPCIONAL e nunca é adivinhado. Só preencha \\`shippingAddress\\` se a mensagem trouxer CEP ou rua/número/cidade. Ponto de referência (\"Bruna recantinho\"), dia ou hora (\"entregar sexta\") vão em \\`notes\\`, do jeito que o cliente escreveu.\n5. Chame \\`createShopOrder\\`. O lojista confirma e corrige no cartão antes de gravar — não peça confirmação por texto antes, monte e chame.\n6. Criado o pedido, mostre o link dele e ofereça em uma linha o que vem depois: gerar cobrança (Pix ou link), adicionar endereço, ou tirar o próximo.\n\nRegras:\n· Você não é um catálogo. Nunca imprima lista numerada de produto com SKU, preço e estoque — isso é despejo de banco de dados, e quem lê está no balcão com o cliente esperando.\n· Preço, frete e total são do servidor. Não cite total antes de o pedido existir.\n· Várias mensagens coladas de uma vez são vários pedidos: faça um de cada vez.\n· Português do Brasil, curto, como quem está no balcão.\n`.trim()\n\n// ---------------------------------------------------------------------------\n// Ferramentas\n// ---------------------------------------------------------------------------\n\nconst FIND_PRODUCTS: PluginAITool = {\n id: 'shop.orders.find-products',\n name: 'findShopProducts',\n description:\n 'Resolves the words a customer wrote (\"3 costela suína\", \"arroz de costela\") into catalog products. '\n + 'Send EVERY item term of the message in one call — one call resolves the whole order. '\n + 'Answers candidates per term with id, price and stock; it never picks for you and never invents a product. '\n + 'When a term has no candidate, or two candidates are equally close, ask the merchant which one it is.',\n icon: 'Search',\n mode: 'read',\n execution: { plane: 'client' },\n category: 'Shop',\n role: 'operations',\n parameters: {\n type: 'object',\n properties: {\n terms: {\n type: 'array',\n description: 'The item words as the customer wrote them, without the quantity.',\n items: { type: 'string' },\n },\n },\n required: ['terms'],\n },\n}\n\nconst FIND_CUSTOMERS: PluginAITool = {\n id: 'shop.orders.find-customers',\n name: 'findShopCustomers',\n description:\n 'Looks a customer up by name, phone or e-mail. Use the id it answers when one candidate is clearly the person; '\n + 'ask the merchant when there are several; place the order without an id when there is none — it creates the record.',\n icon: 'Users',\n mode: 'read',\n execution: { plane: 'client' },\n category: 'Shop',\n role: 'operations',\n parameters: {\n type: 'object',\n properties: { query: { type: 'string', description: 'Name, phone or e-mail.' } },\n required: ['query'],\n },\n}\n\nconst CREATE_ORDER: PluginAITool = {\n id: 'shop.orders.create',\n name: 'createShopOrder',\n description:\n 'Places the order the message describes. The merchant reviews and corrects it on the confirmation card before anything is written — '\n + 'build it and call, do not ask for confirmation in text first. '\n + 'Items carry ids and quantities only: the server re-reads every price, so never send money. '\n + 'Leave `shippingAddress` out unless the message gave a real address; delivery notes (\"entregar sexta\") belong in `notes`.',\n icon: 'ShoppingCart',\n mode: 'persist',\n execution: { plane: 'client' },\n category: 'Shop',\n role: 'operations',\n permission: { feature: 'shop', action: 'create' },\n parameters: {\n type: 'object',\n properties: {\n customerName: { type: 'string', description: 'Who is buying, as the message names them.' },\n customerId: { type: 'string', description: 'Id from findShopCustomers, when the person already exists.' },\n customerPhone: { type: 'string', description: 'Only if the message carries it.' },\n customerEmail: { type: 'string', description: 'Only if the message carries it.' },\n items: {\n type: 'array',\n description: 'One entry per line of the order.',\n items: {\n type: 'object',\n properties: {\n productId: { type: 'string', description: 'From findShopProducts.' },\n variantId: { type: 'string', description: 'Required when the product has variants.' },\n name: { type: 'string', description: 'Product name, so the merchant reads the card without ids.' },\n quantity: { type: 'number', description: 'How many. Absent in the message means 1.' },\n },\n required: ['productId', 'name', 'quantity'],\n },\n },\n notes: {\n type: 'string',\n description: 'Delivery day, reference point, anything the customer said that is not an item or an address.',\n },\n shippingAddress: {\n type: 'object',\n description: 'Only when the message gave one. Keys: postalCode, street, number, complement, district, city, state.',\n properties: {\n postalCode: { type: 'string' },\n street: { type: 'string' },\n number: { type: 'string' },\n complement: { type: 'string' },\n district: { type: 'string' },\n city: { type: 'string' },\n state: { type: 'string', description: 'Two letters (SP, RJ).' },\n },\n },\n },\n required: ['customerName', 'items'],\n },\n}\n\nconst CHARGE_ORDER: PluginAITool = {\n id: 'shop.orders.charge',\n name: 'chargeShopOrder',\n description:\n 'Opens the charge for an order that already exists — a Pix code to read out, or a payment link to send on WhatsApp. '\n + 'Safe to repeat: an order that already has an open charge answers with the same one instead of a second.',\n icon: 'CreditCard',\n mode: 'persist',\n execution: { plane: 'client' },\n category: 'Shop',\n role: 'operations',\n parameters: {\n type: 'object',\n properties: {\n orderId: { type: 'string', description: 'The order to charge.' },\n asLink: { type: 'boolean', description: 'True for a link to send, false for a Pix code to read out.' },\n },\n required: ['orderId'],\n },\n}\n\nconst SET_ADDRESS: PluginAITool = {\n id: 'shop.orders.set-address',\n name: 'setShopOrderAddress',\n description:\n 'Writes the delivery address onto an order that has none. Rewrites the order through the same trusted path that created it, '\n + 'so it only works while nobody has paid it.',\n icon: 'MapPin',\n mode: 'persist',\n execution: { plane: 'client' },\n category: 'Shop',\n role: 'operations',\n parameters: {\n type: 'object',\n properties: {\n orderId: { type: 'string' },\n postalCode: { type: 'string', description: 'CEP.' },\n street: { type: 'string' },\n number: { type: 'string' },\n complement: { type: 'string' },\n district: { type: 'string' },\n city: { type: 'string' },\n state: { type: 'string', description: 'Two letters (SP, RJ).' },\n recipient: { type: 'string', description: 'Who receives, when it is not the buyer.' },\n },\n required: ['orderId', 'street', 'city', 'state'],\n },\n}\n\n/**\n * O que a loja PODE saber fazer, além do provider base.\n *\n * Cobrar um pedido que já existe e reescrever um pedido não pago são poderes que\n * chegaram com as suas migrations, e um pool que ainda não as aplicou não os tem\n * — o provider responde `undefined`. Por isso são perguntados em tempo de\n * execução e vistos por aqui como uma FATIA do provider, e não como um campo que\n * o tipo promete: prometer é o que faz a tela oferecer um botão morto.\n */\ninterface OptionalShopPowers {\n findOpenOrderCharge?: (orderId: string) => Promise<ChargeAnswer | null>\n chargeExistingOrder?: (orderId: string, options?: { asLink?: boolean }) => Promise<ChargeAnswer>\n reviseOrder?: (orderId: string, input: PlaceOrderInput) => Promise<Order>\n}\n\ninterface ChargeAnswer {\n total: number\n paymentUrl?: string | null\n charge?: { emv?: string | null; expiresAt?: string | null } | null\n}\n\nconst powersOf = (shop: ShopProvider): OptionalShopPowers => shop as unknown as OptionalShopPowers\n\nexport interface OrderTakingDeps {\n getProvider: () => ShopProvider\n /** Refresh the list behind the conversation — a pedido created by chat has to\n * show up on the screen the merchant is looking at. */\n onChanged?: () => void\n}\n\nconst digits = (value: unknown): string => String(value ?? '').replace(/\\D/gu, '')\nconst text = (value: unknown): string => (typeof value === 'string' ? value.trim() : '')\n\nconst orderRef = (order: Order) => ({\n id: order.id,\n label: `Pedido #${order.orderNumber}`,\n entityKey: 'shop_order',\n path: `/orders/${order.id}`,\n})\n\n/**\n * Resolve o cliente a uma LINHA antes de gravar, e nunca só pelo e-mail.\n *\n * Mesma regra da tela de venda: `shop_place_order` carimba `auth_user_id` no\n * cliente que ele acha ou cria por e-mail — que aqui seria o do LOJISTA, e\n * trancaria o comprador para fora do próprio cadastro. Passar um id existente\n * desvia desse ramo inteiro.\n */\nasync function resolveCustomerId(\n shop: ShopProvider,\n args: { customerId?: string; customerName: string; customerPhone?: string; customerEmail?: string },\n): Promise<string | undefined> {\n if (args.customerId) return args.customerId\n const email = (args.customerEmail ?? '').trim().toLowerCase()\n const phone = digits(args.customerPhone)\n if (email) {\n const found = await shop.listCustomers({ search: email, limit: 5 })\n const hit = found.find((c) => (c.email ?? '').toLowerCase() === email)\n if (hit) return hit.id\n }\n if (phone.length >= 10) {\n const found = await shop.listCustomers({ search: phone, limit: 5 })\n const hit = found.find((c) => digits(c.phone).endsWith(phone.slice(-10)))\n if (hit) return hit.id\n }\n const [first, ...rest] = args.customerName.trim().split(/\\s+/u)\n const created = await shop.createCustomer({\n firstName: first ?? args.customerName.trim(),\n lastName: rest.join(' '),\n email: email || undefined,\n phone: phone || undefined,\n })\n return created.id\n}\n\nfunction readAddress(raw: unknown): ShippingAddressInput | undefined {\n if (!raw || typeof raw !== 'object') return undefined\n const a = raw as Record<string, unknown>\n const street = text(a.street)\n const city = text(a.city)\n const state = text(a.state)\n // Sem rua, cidade e estado não é endereço — é um palpite, e logística não lê\n // palpite. Melhor devolver nada e deixar o recado em `notes`.\n if (!street || !city || !state) return undefined\n return {\n postalCode: digits(a.postalCode),\n street,\n city,\n state: state.toUpperCase().slice(0, 2),\n ...(text(a.number) ? { number: text(a.number) } : {}),\n ...(text(a.complement) ? { complement: text(a.complement) } : {}),\n ...(text(a.district) ? { district: text(a.district) } : {}),\n ...(text(a.recipient) ? { recipient: text(a.recipient) } : {}),\n }\n}\n\nexport function createOrderTakingTools({ getProvider, onChanged }: OrderTakingDeps): AgentSurfaceTool[] {\n const failed = (error: unknown) => ({ ok: false, error: errorMessage(error) })\n\n return [\n {\n tool: FIND_PRODUCTS,\n execute: async (args) => {\n const terms = (Array.isArray(args.terms) ? args.terms : []).map(text).filter(Boolean).slice(0, 20)\n if (terms.length === 0) return { ok: false, error: 'no_terms' }\n try {\n // O catálogo inteiro, uma vez: casar dez termos com dez buscas seria\n // dez idas ao servidor para responder uma mensagem só, e ainda erraria\n // \"costela com queijo\" quando o cadastro diz \"Costela Suína com Queijo\".\n const catalog = await listProductsCached(getProvider, { status: 'active', limit: 500 })\n const variantsOf = new Map<string, ProductVariant[]>()\n const matches: Array<Record<string, unknown>> = []\n const choices: Array<Record<string, unknown>> = []\n\n for (const [index, term] of terms.entries()) {\n const answer = resolveTerm(term, catalog)\n\n if (!answer.resolved) {\n if (answer.options?.length) {\n // A dúvida vira PERGUNTA na tela, não uma tabela no texto.\n choices.push({\n id: `product-${index}`,\n question: `Qual \"${term}\"?`,\n options: answer.options.map((candidate) => ({\n id: candidate.productId,\n label: candidate.name,\n meta: candidateMeta(candidate),\n })),\n })\n matches.push({ term, needsChoice: true })\n } else {\n matches.push({ term, notFound: true })\n }\n continue\n }\n\n const product = answer.resolved\n if (!variantsOf.has(product.productId)) {\n let list: ProductVariant[] = []\n try {\n list = (await getProvider().getProductVariants?.(product.productId))?.variants ?? []\n } catch {\n /* um produto sem tabela de variação é o caso comum */\n }\n variantsOf.set(product.productId, list)\n }\n const variants = variantsOf.get(product.productId) ?? []\n if (variants.length > 0) {\n product.variants = variants.map((v) => ({\n variantId: v.id,\n options: v.options,\n price: v.price ?? product.price,\n stock: v.inventoryCount ?? 0,\n }))\n }\n matches.push({\n term,\n product,\n // O servidor recusa o pedido por falta de estoque; dizer antes é a\n // diferença entre avisar e ser recusado na frente do cliente.\n ...(product.stock <= 0 ? { outOfStock: true } : {}),\n })\n }\n\n return {\n ok: true,\n // O marcador que o painel usa para desenhar as perguntas — só\n // aparece quando existe dúvida de verdade.\n ...(choices.length > 0 ? { kind: 'record_choice', choices } : {}),\n matches,\n catalogSize: catalog.length,\n }\n } catch (error) {\n return failed(error)\n }\n },\n },\n {\n tool: FIND_CUSTOMERS,\n execute: async (args) => {\n const query = text(args.query)\n if (!query) return { ok: false, error: 'no_query' }\n try {\n const rows = await getProvider().listCustomers({ search: query, limit: 5 })\n return {\n ok: true,\n customers: rows.map((c) => {\n const name = [c.firstName, c.lastName].filter(Boolean).join(' ').trim()\n return {\n customerId: c.id,\n name,\n phone: c.phone,\n email: c.email,\n ordersCount: c.ordersCount,\n ref: { id: c.id, label: name || c.email || 'Cliente', entityKey: 'shop_customer' },\n }\n }),\n }\n } catch (error) {\n return failed(error)\n }\n },\n },\n {\n tool: CREATE_ORDER,\n execute: async (args) => {\n const customerName = text(args.customerName)\n const rawItems = Array.isArray(args.items) ? args.items : []\n const items = rawItems\n .map((raw) => {\n const item = (raw ?? {}) as Record<string, unknown>\n const quantity = Math.max(1, Math.round(Number(item.quantity) || 1))\n return {\n productId: text(item.productId),\n variantId: text(item.variantId) || undefined,\n quantity,\n }\n })\n .filter((item) => item.productId)\n if (items.length === 0) return { ok: false, error: 'no_items', message: 'Nenhum item com produto do catálogo.' }\n if (!customerName) return { ok: false, error: 'no_customer', message: 'Falta o nome de quem está comprando.' }\n\n const shop = getProvider()\n try {\n const customerId = await resolveCustomerId(shop, {\n customerId: text(args.customerId) || undefined,\n customerName,\n customerPhone: text(args.customerPhone),\n customerEmail: text(args.customerEmail),\n })\n const payload: PlaceOrderInput = {\n customerId,\n customer: { name: customerName, email: text(args.customerEmail).toLowerCase() || undefined },\n items,\n ...(readAddress(args.shippingAddress) ? { shippingAddress: readAddress(args.shippingAddress) } : {}),\n ...(text(args.notes) ? { notes: text(args.notes) } : {}),\n }\n const order = await shop.placeOrder(payload)\n onChanged?.()\n return {\n ok: true,\n orderId: order.id,\n orderNumber: order.orderNumber,\n total: order.total,\n currency: order.currency,\n hasAddress: Boolean(order.shippingAddress),\n ref: orderRef(order),\n nextSteps: [\n 'chargeShopOrder — Pix ou link para mandar no WhatsApp',\n ...(order.shippingAddress ? [] : ['setShopOrderAddress — endereço de entrega']),\n ],\n }\n } catch (error) {\n return failed(error)\n }\n },\n },\n {\n tool: CHARGE_ORDER,\n execute: async (args) => {\n const orderId = text(args.orderId)\n if (!orderId) return { ok: false, error: 'no_order' }\n const shop = powersOf(getProvider())\n if (typeof shop.chargeExistingOrder !== 'function') {\n return { ok: false, error: 'charge_unavailable', message: 'Esta loja ainda não tem um meio de cobrança conectado.' }\n }\n try {\n // Uma segunda cobrança para o mesmo pedido é o cliente com dois\n // códigos na mão. Perguntar antes transforma \"gerar\" em \"mostrar\".\n const open = await shop.findOpenOrderCharge?.(orderId)\n const session = open ?? (await shop.chargeExistingOrder(orderId, { asLink: args.asLink === true }))\n onChanged?.()\n return {\n ok: true,\n reused: Boolean(open),\n total: session.total,\n paymentUrl: session.paymentUrl ?? null,\n pixCode: session.charge?.emv ?? null,\n expiresAt: session.charge?.expiresAt ?? null,\n }\n } catch (error) {\n return failed(error)\n }\n },\n },\n {\n tool: SET_ADDRESS,\n execute: async (args) => {\n const orderId = text(args.orderId)\n const address = readAddress(args)\n if (!orderId) return { ok: false, error: 'no_order' }\n if (!address) return { ok: false, error: 'incomplete_address', message: 'Endereço precisa de rua, cidade e estado.' }\n const shop = getProvider()\n const revise = powersOf(shop).reviseOrder\n if (typeof revise !== 'function') {\n return { ok: false, error: 'revise_unavailable', message: 'Esta loja não edita pedido por aqui.' }\n }\n try {\n const order = await shop.getOrder(orderId)\n if (!order) return { ok: false, error: 'not_found', message: 'Pedido não encontrado.' }\n if (order.financialStatus === 'paid' || order.status === 'cancelled') {\n return {\n ok: false,\n error: 'not_editable',\n message: 'Pedido pago ou cancelado não é reescrito — o endereço muda no envio.',\n }\n }\n // Mesma carga que a tela de edição manda: `reviseOrder` reescreve o\n // pedido inteiro, então os itens vão junto ou desaparecem.\n const revised = await revise(orderId, {\n ...(order.customerId ? { customerId: order.customerId } : {}),\n ...(order.customerName ? { customer: { name: order.customerName, email: order.customerEmail ?? undefined } } : {}),\n items: order.items\n .filter((line) => line.productId)\n .map((line) => ({\n productId: line.productId as string,\n // A variação só existe no pedido depois de 0029; um pedido mais\n // velho não tem o campo, e reescrever sem ele é o servidor\n // adivinhando qual tamanho foi vendido.\n variantId: (line as { variantId?: string | null }).variantId ?? undefined,\n quantity: line.quantity,\n })),\n shippingAddress: address,\n ...(order.notes ? { notes: order.notes } : {}),\n ...(order.discountCode ? { discountCode: order.discountCode } : {}),\n })\n onChanged?.()\n return { ok: true, orderId: revised.id, orderNumber: revised.orderNumber, ref: orderRef(revised) }\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 { Order, ShopProvider } from '@fayz-ai/shop'\nimport { createOrderTakingTools, ORDER_TAKING_INSTRUCTIONS } from './orders-agent'\n\n// ---------------------------------------------------------------------------\n// A lista de Pedidos, entregue ao assistente.\n//\n// Não desenha nada: publica o que está na tela (o que a loja sabe cobrar, os\n// últimos pedidos) e as ferramentas de tirar pedido enquanto a lista estiver\n// montada. Some junto com ela, que é o contrato do Agent Surface.\n// ---------------------------------------------------------------------------\n\n/** O convite da porta \"Criar com IA\" — mesma tela, dito para o lojista. */\nexport const ORDER_TAKING_INTRO: AskAIIntro = {\n role: 'operations',\n persona: 'Balconista',\n pitch: 'Cole a mensagem do cliente que eu monto o pedido.',\n description:\n 'Leio os itens e as quantidades da mensagem, acho cada um no catálogo, resolvo o cliente e monto o pedido '\n + 'para você conferir e confirmar. Depois gero a cobrança ou anoto o endereço.',\n suggestions: [\n { label: 'O que você precisa para montar um pedido?' },\n { label: 'Quais pedidos estão esperando pagamento?' },\n ],\n}\n\nexport function OrdersAgentSurface({\n provider, orders, onChanged,\n}: {\n provider: () => ShopProvider\n orders: Order[]\n onChanged: () => void\n}) {\n const live = React.useRef({ provider, orders, onChanged })\n live.current = { provider, orders, onChanged }\n\n const contribution = React.useMemo<AgentSurfaceContribution>(() => ({\n id: 'shop.orders.list',\n pluginId: 'shop',\n role: 'operations',\n instructions: ORDER_TAKING_INSTRUCTIONS,\n describe: () => {\n const { orders: rows, provider: get } = live.current\n let canCharge = false\n let canRevise = false\n try {\n // Mesma leitura que as ferramentas fazem: o poder é perguntado, não\n // presumido — um pool sem a migration responde `undefined`.\n const shop = get() as unknown as Record<string, unknown>\n canCharge = typeof shop.chargeExistingOrder === 'function'\n canRevise = typeof shop.reviseOrder === 'function'\n } catch {\n // Uma lista em transição nunca pode derrubar o turno.\n }\n return {\n title: 'Lista — Pedidos',\n state: {\n screen: '/orders',\n canCharge,\n canRevise,\n ordersOnScreen: rows.length,\n // Os últimos, para \"cobra o pedido da Fran\" achar de qual pedido se\n // fala sem uma busca a mais.\n recentOrders: rows.slice(0, 8).map((o) => ({\n orderNumber: o.orderNumber,\n customer: o.customerName ?? o.customerEmail ?? null,\n total: o.total,\n currency: o.currency,\n financialStatus: o.financialStatus,\n fulfillmentStatus: o.fulfillmentStatus,\n hasAddress: Boolean(o.shippingAddress),\n createdAt: o.createdAt,\n ref: { id: o.id, label: `Pedido #${o.orderNumber}`, path: `/orders/${o.id}` },\n })),\n },\n }\n },\n tools: createOrderTakingTools({\n getProvider: () => live.current.provider(),\n onChanged: () => live.current.onChanged(),\n }),\n }), [])\n\n useAgentSurface(contribution)\n return null\n}\n","import React, { useEffect, useState, useCallback, useMemo } from 'react'\nimport { errorMessage } from '../settings/error-message'\nimport type { ColumnDef } from '@tanstack/react-table'\nimport { ConfirmDialog, DataTable, toast } from '@fayz-ai/ui'\nimport { CreditCard, Package, Plus, ShoppingBag, WandSparkles, Wallet, XCircle } from 'lucide-react'\nimport { getShopProvider } from '@fayz-ai/shop'\nimport { useAdminPath, adminNavigateTo, askAI, OrderListView, PageActions, type OrderBoardConfig, type OrderBulkAction, type OrderListColumn } from '@fayz-ai/admin'\nimport { PersonLink } from '@fayz-ai/admin'\nimport { shopCustomerLookup } from './customerLookup'\nimport { OrderDetailView, ORDER_STATUS_LABEL } from './OrderDetailView'\nimport { NewOrderPage } from './NewOrderPage'\nimport { cancelShopOrder } from './order-actions'\nimport { OrdersAgentSurface, ORDER_TAKING_INTRO } from './OrdersAgentSurface'\nimport type { Product, Order, ShopCustomer, Discount, ListProductsOptions, ShopProvider } from '@fayz-ai/shop'\n\nexport type ShopProviderResolver = ShopProvider | (() => ShopProvider)\n\nexport interface ShopPageProps {\n provider?: ShopProviderResolver\n}\n\n// ---------------------------------------------------------------------------\n// Shared helpers\n// ---------------------------------------------------------------------------\n\nfunction currency(value: number, code = 'BRL', locale = 'pt-BR') {\n return new Intl.NumberFormat(locale, { style: 'currency', currency: code }).format(value)\n}\n\nfunction badge(label: string, color: string) {\n return (\n <span className={`inline-flex items-center px-2 py-0.5 rounded-full text-xs font-medium ${color}`}>\n {label}\n </span>\n )\n}\n\nconst statusColors: Record<string, string> = {\n active: 'bg-emerald-100 text-emerald-800',\n draft: 'bg-gray-100 text-gray-700',\n archived: 'bg-orange-100 text-orange-700',\n open: 'bg-blue-100 text-blue-800',\n cancelled: 'bg-red-100 text-red-700',\n paid: 'bg-emerald-100 text-emerald-800',\n pending: 'bg-yellow-100 text-yellow-800',\n fulfilled: 'bg-emerald-100 text-emerald-800',\n unfulfilled: 'bg-gray-100 text-gray-700',\n 'partially_fulfilled': 'bg-blue-100 text-blue-800',\n}\n\nfunction resolveShopProvider(provider?: ShopProviderResolver): ShopProvider {\n return typeof provider === 'function' ? provider() : provider ?? getShopProvider()\n}\n\n/**\n * Every tab used to load with `.then(setState).finally(stopLoading)` and no\n * catch. Against a pool where the shop provider reads as `anon`, listOrders and\n * listCustomers reject with \"permission denied\" — the rejection escaped React\n * and blanked the whole admin, so a permissions problem looked like a crash.\n * The tab now reports what actually failed and the rest of the shell survives.\n */\nfunction useShopList<T>(load: () => Promise<T[]>, deps: React.DependencyList) {\n const [items, setItems] = useState<T[]>([])\n const [loading, setLoading] = useState(true)\n const [error, setError] = useState<string | null>(null)\n // Bumped by `reload` — an action that writes to these rows has to be able to\n // ask for them again, or the list keeps showing what was true before it ran.\n const [nonce, setNonce] = useState(0)\n\n useEffect(() => {\n let cancelled = false\n setLoading(true)\n setError(null)\n load()\n .then((data) => { if (!cancelled) setItems(data) })\n .catch((err: unknown) => {\n if (!cancelled) setError(errorMessage(err))\n })\n .finally(() => { if (!cancelled) setLoading(false) })\n return () => { cancelled = true }\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [...deps, nonce])\n\n return { items, loading, error, reload: useCallback(() => setNonce((n) => n + 1), []) }\n}\n\nfunction ErrorState({ message }: { message: string }) {\n return (\n <div className=\"rounded-lg border border-red-200 bg-red-50 px-4 py-3 text-sm text-red-800\">\n <p className=\"font-medium\">Não foi possível carregar estes dados.</p>\n <p className=\"mt-1 text-red-700\">{message}</p>\n </div>\n )\n}\n\n// ---------------------------------------------------------------------------\n// Products tab\n// ---------------------------------------------------------------------------\n\nfunction ProductsTab({ provider }: ShopPageProps) {\n const [products, setProducts] = useState<Product[]>([])\n const [loading, setLoading] = useState(true)\n const [search, setSearch] = useState('')\n\n const [error, setError] = useState<string | null>(null)\n\n const load = useCallback(async (opts?: ListProductsOptions) => {\n setLoading(true)\n setError(null)\n try {\n const data = await resolveShopProvider(provider).listProducts(opts)\n setProducts(data)\n } catch (err: unknown) {\n setError(errorMessage(err))\n } finally {\n setLoading(false)\n }\n }, [provider])\n\n useEffect(() => { load() }, [load])\n\n const handleSearch = (e: React.ChangeEvent<HTMLInputElement>) => {\n const q = e.target.value\n setSearch(q)\n load(q ? { search: q } : undefined)\n }\n\n const columns = useMemo<ColumnDef<Product, any>[]>(() => [\n { accessorKey: 'name', header: 'Produto', cell: ({ getValue }) => <span className=\"font-medium\">{getValue() as string}</span> },\n { accessorKey: 'sku', header: 'SKU', cell: ({ getValue }) => <span className=\"text-muted-foreground\">{(getValue() as string | undefined) ?? '—'}</span> },\n {\n accessorKey: 'price', header: () => <span className=\"block text-right\">Preço</span>,\n cell: ({ getValue, row }) => <div className=\"text-right\">{currency(getValue() as number, row.original.currency)}</div>,\n },\n {\n accessorKey: 'inventoryCount', header: () => <span className=\"block text-right\">Estoque</span>,\n cell: ({ getValue }) => {\n const count = getValue() as number\n return <div className=\"text-right\"><span className={count === 0 ? 'text-red-600 font-medium' : ''}>{count}</span></div>\n },\n },\n {\n accessorKey: 'status', header: 'Status',\n cell: ({ getValue }) => {\n const status = getValue() as string\n return badge(status, statusColors[status] ?? 'bg-gray-100 text-gray-700')\n },\n },\n ], [])\n\n return (\n <div>\n <div className=\"flex items-center justify-between mb-4\">\n <input\n type=\"search\" value={search} onChange={handleSearch}\n placeholder=\"Buscar produtos...\"\n className=\"border rounded-lg px-3 py-2 text-sm w-64 focus:outline-none focus:ring-2 focus:ring-primary/50\"\n />\n <span className=\"text-sm text-muted-foreground\">{products.length} produtos</span>\n </div>\n\n {error ? (\n <ErrorState message={error} />\n ) : (\n <DataTable\n loading={loading}\n columns={columns}\n data={products}\n variant=\"card\"\n emptyMessage=\"Nenhum produto encontrado.\"\n />\n )}\n </div>\n )\n}\n\n// ---------------------------------------------------------------------------\n// Orders tab\n// ---------------------------------------------------------------------------\n\nfunction OrdersTab({ provider }: ShopPageProps) {\n const { items: orders, loading, error, reload } = useShopList<Order>(\n () => resolveShopProvider(provider).listOrders({ limit: 200 }),\n [provider],\n )\n // Orders the bulk bar asked to cancel, held until the confirm is answered.\n // Cancelling returns stock and closes the receivable — it does not get to\n // happen on a single click the way \"marcar como pago\" does.\n const [cancelTarget, setCancelTarget] = useState<Order[] | null>(null)\n const [bulkBusy, setBulkBusy] = useState(false)\n\n // Já pago não se paga de novo, e pedido cancelado não se recebe: um lote de\n // 10 em que 8 já estão pagos deve dizer \"2 pedidos marcados como pagos\", não\n // disparar 10 chamadas e relatar 8 erros.\n const markPaid = useCallback(async (rows: Order[]) => {\n const targets = rows.filter((o) => o.financialStatus !== 'paid' && o.status !== 'cancelled')\n if (targets.length === 0) {\n toast.error('Nenhum dos pedidos selecionados está aguardando pagamento.')\n return\n }\n const shop = resolveShopProvider(provider)\n if (typeof shop.confirmPayment !== 'function') {\n toast.error('Esta loja não registra recebimento por aqui.')\n return\n }\n setBulkBusy(true)\n let done = 0\n let failed = 0\n for (const order of targets) {\n try {\n await shop.confirmPayment(order.id)\n done++\n } catch (err: unknown) {\n failed++\n console.warn('[shop] confirmPayment failed', order.id, err)\n }\n }\n setBulkBusy(false)\n if (done > 0) toast.success(`${done} pedido(s) marcados como pagos`)\n if (failed > 0) toast.error(`${failed} pedido(s) não puderam ser atualizados`)\n reload()\n }, [provider, reload])\n\n const confirmCancel = useCallback(async () => {\n const targets = (cancelTarget ?? []).filter((o) => o.status !== 'cancelled')\n setBulkBusy(true)\n let done = 0\n let failed = 0\n const shop = resolveShopProvider(provider)\n for (const order of targets) {\n try {\n await cancelShopOrder(shop, order.id)\n done++\n } catch (err: unknown) {\n failed++\n console.warn('[shop] cancelOrder failed', order.id, err)\n }\n }\n setBulkBusy(false)\n setCancelTarget(null)\n if (done > 0) toast.success(`${done} pedido(s) cancelados`)\n if (failed > 0) toast.error(`${failed} pedido(s) não puderam ser cancelados`)\n reload()\n }, [cancelTarget, provider, reload])\n\n const bulkActions = useMemo<OrderBulkAction<Order>[]>(() => [\n {\n id: 'mark-paid',\n label: 'Marcar como pago',\n icon: CreditCard,\n disabled: bulkBusy,\n onSelect: markPaid,\n },\n {\n id: 'cancel',\n label: 'Cancelar pedidos',\n icon: XCircle,\n destructive: true,\n overflow: true,\n disabled: bulkBusy,\n onSelect: (rows) => setCancelTarget(rows),\n },\n ], [bulkBusy, markPaid])\n\n const columns = useMemo<OrderListColumn<Order>[]>(() => [\n { key: 'orderNumber', header: 'Pedido', render: (o) => <span className=\"font-medium\">#{o.orderNumber}</span> },\n {\n key: 'customer', header: 'Cliente',\n // Links to the customer record. The row itself opens the order, so the\n // link stops the click from doing both.\n render: (o) => {\n const label = o.customerName ?? o.customerEmail ?? '—'\n if (!o.customerId) return <span>{label}</span>\n return (\n <PersonLink\n personId={o.customerId}\n name={label}\n lookup={shopCustomerLookup(() => resolveShopProvider(provider))}\n kind=\"shop_customer\"\n />\n )\n },\n },\n { key: 'total', header: 'Total', align: 'right', render: (o) => <span className=\"font-medium\">{currency(o.total, o.currency)}</span> },\n {\n key: 'financialStatus', header: 'Pagamento',\n render: (o) => badge(ORDER_STATUS_LABEL[o.financialStatus] ?? o.financialStatus, statusColors[o.financialStatus] ?? 'bg-gray-100 text-gray-700'),\n },\n {\n key: 'fulfillmentStatus', header: 'Entrega',\n render: (o) => {\n // A cancelled or archived order is not \"não enviado\" waiting to be\n // picked — it is out of the flow, and the list said nothing about it.\n if (o.status && o.status !== 'open') {\n return badge(ORDER_STATUS_LABEL[o.status] ?? o.status, statusColors[o.status] ?? 'bg-gray-100 text-gray-700')\n }\n // ENTREGUE é derivado dos envios, não um quarto valor de\n // `fulfillment_status` — um pedido que sai em duas caixas e só uma\n // chegou continua \"enviado\", que é a verdade.\n const shipments = (o.shipments ?? []).filter((s) => s.status !== 'cancelled')\n if (shipments.length > 0 && shipments.every((s) => s.status === 'delivered')) {\n return badge('Entregue', 'bg-emerald-100 text-emerald-800')\n }\n return badge(ORDER_STATUS_LABEL[o.fulfillmentStatus] ?? o.fulfillmentStatus, statusColors[o.fulfillmentStatus] ?? 'bg-gray-100 text-gray-700')\n },\n },\n {\n key: 'createdAt', header: 'Data',\n render: (o) => {\n // Time matters operationally: two orders on the same day are picked,\n // packed and settled in the order they arrived.\n const d = new Date(o.createdAt)\n return (\n <span className=\"whitespace-nowrap text-muted-foreground\">\n {d.toLocaleDateString('pt-BR')}\n <span className=\"ml-1.5 text-xs opacity-70\">{d.toLocaleTimeString('pt-BR', { hour: '2-digit', minute: '2-digit' })}</span>\n </span>\n )\n },\n },\n ], [provider])\n\n const stats = useMemo(() => {\n const live = orders.filter((o) => o.status !== 'cancelled')\n const delivered = (o: Order) => {\n const shipments = (o.shipments ?? []).filter((s) => s.status !== 'cancelled')\n return shipments.length > 0 && shipments.every((s) => s.status === 'delivered')\n }\n const toShip = live.filter((o) => o.fulfillmentStatus !== 'fulfilled' && !delivered(o))\n const toReceive = live.filter((o) => o.financialStatus === 'pending')\n const billed = live.filter((o) => o.financialStatus === 'paid').reduce((sum, o) => sum + o.total, 0)\n return [\n { label: 'Pedidos', value: String(live.length), icon: ShoppingBag },\n { label: 'A enviar', value: String(toShip.length), icon: Package },\n { label: 'A receber', value: String(toReceive.length), icon: CreditCard },\n { label: 'Recebido', value: currency(billed), icon: Wallet, hint: 'Soma dos pedidos pagos nesta lista' },\n ]\n }, [orders])\n\n // ── the board (#335) ────────────────────────────────────────────────────\n //\n // This is the case that proves the archetype's mapping is general: the shop's\n // board column comes from THREE axes — status, financial_status and\n // fulfillment_status — where the restaurant's comes from one derived value,\n // and both feed the same component.\n //\n // `Entrega` keeps deriving from the shipments here exactly as it does in the\n // list: an order that leaves in two boxes with one delivered is still\n // \"enviado\", which is the truth, and the board must not flatten it.\n const board = useMemo<OrderBoardConfig<Order>>(() => {\n const delivered = (o: Order) => {\n const shipments = (o.shipments ?? []).filter((s) => s.status !== 'cancelled')\n return shipments.length > 0 && shipments.every((s) => s.status === 'delivered')\n }\n return {\n columns: [\n { id: 'to_pay', label: 'A receber', color: 'bg-amber-500' },\n { id: 'to_ship', label: 'A enviar', color: 'bg-blue-500' },\n { id: 'shipped', label: 'Enviado', color: 'bg-cyan-500' },\n { id: 'delivered', label: 'Entregue', color: 'bg-emerald-500' },\n { id: 'cancelled', label: 'Cancelado', color: 'bg-red-500' },\n ],\n columnOf: (o) => {\n if (o.status && o.status !== 'open') return o.status === 'cancelled' ? 'cancelled' : null\n if (delivered(o)) return 'delivered'\n if (o.financialStatus === 'pending') return 'to_pay'\n if (o.fulfillmentStatus === 'fulfilled') return 'shipped'\n return 'to_ship'\n },\n // No advance handler and no bulk actions on the board: advancing a\n // storefront order is a shipment or a receipt, both of which are their own\n // screens. The board is for seeing where the work is.\n emptyColumn: 'Nada aqui',\n card: (o) => (\n <>\n <div className=\"mb-2 flex items-center justify-between\">\n <span className=\"text-sm font-bold\">#{o.orderNumber}</span>\n <span className=\"text-[10px] text-muted-foreground\">\n {new Date(o.createdAt).toLocaleDateString('pt-BR')}\n </span>\n </div>\n {o.customerName && <p className=\"truncate text-sm font-medium\">{o.customerName}</p>}\n {o.customerEmail && <p className=\"truncate text-xs text-muted-foreground\">{o.customerEmail}</p>}\n <div className=\"mt-3 flex items-center justify-between border-t pt-2\">\n <span className=\"text-sm font-bold\">{currency(o.total, o.currency)}</span>\n {badge(\n ORDER_STATUS_LABEL[o.financialStatus] ?? o.financialStatus,\n statusColors[o.financialStatus] ?? 'bg-gray-100 text-gray-700',\n )}\n </div>\n </>\n ),\n }\n }, [])\n\n if (error) return <ErrorState message={error} />\n\n return (\n <>\n <OrdersAgentSurface\n provider={() => resolveShopProvider(provider)}\n orders={orders}\n onChanged={reload}\n />\n <OrderListView<Order>\n // Declarado, não desenhado: era o último \"+\" do produto escrito na\n // própria etiqueta (\"+ Criar pedido\"), e por isso o único que no\n // celular ficava no cabeçalho em vez de virar o círculo do polegar.\n actions={(\n <PageActions\n actions={[{\n id: 'new-order',\n label: 'Criar pedido',\n icon: Plus,\n intent: 'primary',\n creates: true,\n testId: 'orders-create',\n onSelect: () => adminNavigateTo('/orders/new'),\n }, {\n // O pedido chega escrito — a outra porta para a mesma coisa, para\n // quem tem a mensagem do cliente na mão em vez de um formulário.\n //\n // `creates` porque ela CRIA um pedido, e é isso que decide a cara\n // do círculo no celular: o conjunto todo inserindo é um \"+\", e sem\n // esta linha a varinha rebaixava a tela inteira para o \"⋮\" neutro\n // — a lista de pedidos deixava de parecer uma tela em que se põe.\n id: 'new-order-ai',\n label: 'Criar com IA',\n description: 'Cole a mensagem do cliente e eu monto o pedido.',\n icon: WandSparkles,\n creates: true,\n testId: 'orders-create-ai',\n onSelect: () => askAI({\n hint: 'Cole a mensagem do cliente…',\n intro: ORDER_TAKING_INTRO,\n }),\n }]}\n />\n )}\n stats={stats}\n columns={columns}\n rows={orders}\n loading={loading}\n empty=\"Nenhum pedido ainda. Vendeu por telefone? Crie o pedido aqui.\"\n searchText={(o) => [o.orderNumber, o.customerName, o.customerEmail].filter(Boolean).join(' ')}\n searchPlaceholder=\"Buscar por número, cliente ou e-mail…\"\n onRowClick={(row) => adminNavigateTo(`/orders/${row.id}`)}\n bulkActions={bulkActions}\n viewKey=\"shop-orders\"\n views={['list', 'board']}\n defaultView=\"list\"\n board={board}\n />\n <ConfirmDialog\n open={cancelTarget !== null}\n variant=\"destructive\"\n loading={bulkBusy}\n title={`Cancelar ${cancelTarget?.length ?? 0} pedido(s)?`}\n description=\"O estoque reservado volta para a loja e o recebimento é encerrado. Não dá para desfazer.\"\n confirmLabel=\"Cancelar pedidos\"\n cancelLabel=\"Voltar\"\n onCancel={() => { if (!bulkBusy) setCancelTarget(null) }}\n onConfirm={confirmCancel}\n />\n </>\n )\n}\n\n// ---------------------------------------------------------------------------\n// Customers tab\n// ---------------------------------------------------------------------------\n\nfunction CustomersTab({ provider }: ShopPageProps) {\n const { items: customers, loading, error } = useShopList<ShopCustomer>(\n () => resolveShopProvider(provider).listCustomers({ limit: 50 }),\n [provider],\n )\n\n const columns = useMemo<ColumnDef<ShopCustomer, any>[]>(() => [\n {\n id: 'name', accessorFn: (c) => `${c.firstName} ${c.lastName}`, header: 'Nome',\n cell: ({ row }) => <span className=\"font-medium\">{row.original.firstName} {row.original.lastName}</span>,\n },\n { accessorKey: 'email', header: 'Email', cell: ({ getValue }) => <span className=\"text-muted-foreground\">{(getValue() as string | undefined) ?? '—'}</span> },\n { accessorKey: 'phone', header: 'Telefone', cell: ({ getValue }) => <span className=\"text-muted-foreground\">{(getValue() as string | undefined) ?? '—'}</span> },\n {\n accessorKey: 'ordersCount', header: () => <span className=\"block text-right\">Pedidos</span>,\n cell: ({ getValue }) => <div className=\"text-right\">{getValue() as number}</div>,\n },\n {\n accessorKey: 'totalSpent', header: () => <span className=\"block text-right\">Total Gasto</span>,\n cell: ({ getValue }) => <div className=\"text-right\">{currency(getValue() as number)}</div>,\n },\n ], [])\n\n return (\n <div>\n {error ? (\n <ErrorState message={error} />\n ) : (\n <DataTable\n loading={loading}\n columns={columns}\n data={customers}\n variant=\"card\"\n emptyMessage=\"Nenhum cliente ainda.\"\n />\n )}\n </div>\n )\n}\n\n// ---------------------------------------------------------------------------\n// Discounts tab\n// ---------------------------------------------------------------------------\n\nfunction DiscountsTab({ provider }: ShopPageProps) {\n const { items: discounts, loading, error } = useShopList<Discount>(\n () => resolveShopProvider(provider).listDiscounts({ limit: 50 }),\n [provider],\n )\n\n const columns = useMemo<ColumnDef<Discount, any>[]>(() => [\n { accessorKey: 'title', header: 'Título', cell: ({ getValue }) => <span className=\"font-medium\">{getValue() as string}</span> },\n { accessorKey: 'code', header: 'Código', cell: ({ getValue }) => <span className=\"font-mono text-sm\">{(getValue() as string | undefined) ?? '—'}</span> },\n { accessorKey: 'type', header: 'Tipo', cell: ({ getValue }) => <span className=\"text-muted-foreground\">{getValue() as string}</span> },\n {\n accessorKey: 'value', header: () => <span className=\"block text-right\">Valor</span>,\n cell: ({ row }) => <div className=\"text-right\">{row.original.type === 'percentage' ? `${row.original.value}%` : currency(row.original.value)}</div>,\n },\n {\n id: 'usos', accessorKey: 'timesUsed', header: () => <span className=\"block text-right\">Usos</span>,\n cell: ({ row }) => <div className=\"text-right\">{row.original.timesUsed}{row.original.usageLimit ? ` / ${row.original.usageLimit}` : ''}</div>,\n },\n {\n accessorKey: 'status', header: 'Status',\n cell: ({ getValue }) => {\n const status = getValue() as string\n return badge(status, statusColors[status] ?? 'bg-gray-100 text-gray-700')\n },\n },\n ], [])\n\n return (\n <div>\n {error ? (\n <ErrorState message={error} />\n ) : (\n <DataTable\n loading={loading}\n columns={columns}\n data={discounts}\n variant=\"card\"\n emptyMessage=\"Nenhum desconto cadastrado.\"\n />\n )}\n </div>\n )\n}\n\n// ---------------------------------------------------------------------------\n// Main page\n// ---------------------------------------------------------------------------\n\nconst TABS = [\n { id: 'products', label: 'Produtos' },\n { id: 'orders', label: 'Pedidos' },\n { id: 'customers', label: 'Clientes' },\n { id: 'discounts', label: 'Descontos' },\n] as const\n\ntype TabId = typeof TABS[number]['id']\n\nconst TAB_COPY: Record<TabId, { title: string; subtitle: string }> = {\n products: { title: 'Produtos', subtitle: 'Catálogo da loja: preço, estoque e status.' },\n orders: { title: 'Pedidos', subtitle: 'Pedidos recebidos, pagamento e entrega.' },\n customers: { title: 'Clientes', subtitle: 'Quem comprou, quanto e com que frequência.' },\n discounts: { title: 'Descontos', subtitle: 'Cupons, regras de uso e desempenho.' },\n}\n\n/**\n * `section` pins the page to one area, which is how the sidebar routes\n * /shop/products, /shop/orders, … as separate entries. Without it the page\n * keeps its own tab bar — the single-route behaviour, still used by /shop.\n */\nexport const ShopPage: React.FC<ShopPageProps & { section?: TabId }> = ({ provider, section }) => {\n const [tab, setTab] = useState<TabId>(section ?? 'products')\n const active = section ?? tab\n\n // /orders/<id> renders the detail. Orders deliberately do not go through\n // createCrudPage: an order is not an editable record, it is a document with\n // items, money and a shipment attached.\n //\n // O caminho é /orders e não /shop/orders desde que a loja passou a ter rotas\n // de topo: casar o prefixo antigo aqui é como o clique na linha deixava de\n // abrir o detalhe.\n const path = useAdminPath()\n const orderId = section === 'orders' ? path.match(/^\\/orders\\/([^/]+)$/)?.[1] : undefined\n // /orders/<id>/edit — a mesma tela do pedido novo, apontada para um que já\n // existe (0072). Casado antes do detalhe para o sufixo não virar um id.\n const editingId = section === 'orders' ? path.match(/^\\/orders\\/([^/]+)\\/edit$/)?.[1] : undefined\n\n // Before the id branch: /orders/new is a screen, not an order whose number\n // happens to be \"new\".\n if (section === 'orders' && (orderId === 'new' || editingId)) {\n return (\n <NewOrderPage\n provider={() => resolveShopProvider(provider)}\n orderId={editingId}\n onDone={(id) => adminNavigateTo(id ? `/orders/${id}` : '/orders')}\n onCancel={() => adminNavigateTo(editingId ? `/orders/${editingId}` : '/orders')}\n />\n )\n }\n\n if (orderId) {\n return (\n <div className=\"max-w-7xl\">\n <OrderDetailView\n orderId={orderId}\n provider={() => resolveShopProvider(provider)}\n onBack={() => adminNavigateTo('/orders')}\n />\n </div>\n )\n }\n const copy = section ? TAB_COPY[section] : { title: 'Loja', subtitle: 'Gerencie produtos, pedidos, clientes e descontos.' }\n\n return (\n // No padding of its own: AdminShell already wraps every page in `p-3 md:p-6`,\n // and a second p-6 here sat the orders list lower and wider than every CRUD\n // screen next to it.\n <div>\n {/* Orders follows the CRUD lists: the shell bar already names the page, so\n repeating it here was the title twice, 60px apart. */}\n {section !== 'orders' && (\n <div className=\"mb-6\">\n <h1 className=\"text-2xl font-semibold\">{copy.title}</h1>\n <p className=\"text-muted-foreground mt-1\">{copy.subtitle}</p>\n </div>\n )}\n\n {!section && (\n <div className=\"border-b mb-6\">\n <nav className=\"flex gap-1\">\n {TABS.map(t => (\n <button\n key={t.id}\n onClick={() => setTab(t.id)}\n className={`px-4 py-2 text-sm font-medium border-b-2 transition-colors ${\n tab === t.id\n ? 'border-primary text-primary'\n : 'border-transparent text-muted-foreground hover:text-foreground'\n }`}\n >\n {t.label}\n </button>\n ))}\n </nav>\n </div>\n )}\n\n {active === 'products' && <ProductsTab provider={provider} />}\n {active === 'orders' && <OrdersTab provider={provider} />}\n {active === 'customers' && <CustomersTab provider={provider} />}\n {active === 'discounts' && <DiscountsTab provider={provider} />}\n </div>\n )\n}\n\nShopPage.displayName = 'ShopPage'\n"]}