@fayz-ai/plugin-fiscal-br 0.13.4 → 0.13.6
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/GapScreens-RDPPFZMG.js +3 -0
- package/dist/GapScreens-RDPPFZMG.js.map +1 -0
- package/dist/InboundNotesPage-R72EC5E4.js +5 -0
- package/dist/InboundNotesPage-R72EC5E4.js.map +1 -0
- package/dist/InvoiceNotesButton-3SMNHWMQ.js +5 -0
- package/dist/InvoiceNotesButton-3SMNHWMQ.js.map +1 -0
- package/dist/NoteReconcileView-3KVXZLCG.js +4 -0
- package/dist/NoteReconcileView-3KVXZLCG.js.map +1 -0
- package/dist/OrderNoteCard-H6P66R4J.js +5 -0
- package/dist/OrderNoteCard-H6P66R4J.js.map +1 -0
- package/dist/UnitFiscalWidgets-KCHSISBS.js +503 -0
- package/dist/UnitFiscalWidgets-KCHSISBS.js.map +1 -0
- package/dist/chunk-2GHTB3Z2.js +66 -0
- package/dist/chunk-2GHTB3Z2.js.map +1 -0
- package/dist/chunk-7NW3EBOQ.js +101 -0
- package/dist/chunk-7NW3EBOQ.js.map +1 -0
- package/dist/chunk-G7T5YMNY.js +241 -0
- package/dist/chunk-G7T5YMNY.js.map +1 -0
- package/dist/chunk-JRP5AZFJ.js +64 -0
- package/dist/chunk-JRP5AZFJ.js.map +1 -0
- package/dist/chunk-OGXYHL3Z.js +590 -0
- package/dist/chunk-OGXYHL3Z.js.map +1 -0
- package/dist/chunk-RZT2BO6E.js +64 -0
- package/dist/chunk-RZT2BO6E.js.map +1 -0
- package/dist/chunk-UYGGBJCR.js +2314 -0
- package/dist/chunk-UYGGBJCR.js.map +1 -0
- package/dist/chunk-WID54RUV.js +498 -0
- package/dist/chunk-WID54RUV.js.map +1 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +146 -9391
- package/dist/index.js.map +1 -1
- package/dist/migrations/main.browser.js +39 -0
- package/dist/migrations/main.browser.js.map +1 -0
- package/dist/migrations/main.js +4912 -0
- package/dist/migrations/main.js.map +1 -0
- package/dist/views/InboundNotesPage.d.ts.map +1 -1
- package/dist/views/inventoryView.d.ts.map +1 -1
- package/package.json +11 -5
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/views/UnitFiscalWidgets.tsx"],"names":[],"mappings":"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","file":"UnitFiscalWidgets-KCHSISBS.js","sourcesContent":["import React from 'react'\nimport {\n Badge, Button, Card, CardContent, CardDescription, CardHeader, CardTitle, Input, Select, SelectContent,\n SelectItem, SelectTrigger, SelectValue, Skeleton, Switch, toast,\n} from '@fayz-ai/ui'\nimport { getActiveTenantId, getSupabaseClientOptional, maskCpfCnpj } from '@fayz-ai/core'\nimport { adminNavigateTo } from '@fayz-ai/admin'\nimport { Check, Info, ShieldCheck, X } from 'lucide-react'\nimport { emitterErrorSentence, emitters, EmitterError, GATE_LABELS } from '../lib/emitters'\n\n/**\n * The \"Certificado\" and \"Emissão Fiscal\" tabs of the V1 company form, on the\n * unit detail page. One row per legal entity (017): two units with the same\n * CNPJ share it. `nfce_csc_token` is write-only — it is outside the SELECT\n * grant, and the screen reads `nfce_csc_token_set`.\n *\n * The A1, the NFC-e settings and the company's registration go through the\n * integration service (control-sdk-backend ADR 0008), which checks them and\n * talks to PlugNotas; the NFS-e block and the DF-e switch are still written\n * here, under the emitter-settings policy.\n */\n\nconst COLUMNS = [\n 'id', 'legal_entity_id',\n 'nfse_enabled', 'nfse_production', 'nfse_national', 'nfse_service_code_national', 'nfse_service_code_municipal',\n 'nfse_nbs_code', 'nfse_cnae', 'nfse_iss_rate', 'nfse_iss_taxation', 'nfse_ibscbs_cst', 'nfse_ibscbs_classification',\n 'nfse_simples_regime', 'nfse_net_value', 'nfse_additional_info',\n 'nfce_enabled', 'nfce_production', 'nfce_series', 'nfce_csc_id', 'nfce_csc_token_set', 'nfce_generic_item',\n 'certificate_cn', 'certificate_expires_at', 'certificate_uploaded_at',\n 'dfe_sync_enabled', 'dfe_last_sync_at', 'dfe_last_error', 'provider_synced_at',\n].join(', ')\n\ntype Settings = Record<string, any>\n\ninterface UnitItem {\n id?: string\n tenantId?: string\n legalEntityId?: string | null\n legalName?: string | null\n cnpj?: string | null\n stateRegistration?: string | null\n municipalRegistration?: string | null\n taxRegime?: string | null\n cnae?: string | null\n ibgeCityCode?: string | null\n}\n\nconst sb = () => getSupabaseClientOptional() as any\n\nasync function uploadCertificate(legalEntityId: string, file: File, password: string) {\n try {\n const emitter = await emitters.certificate(legalEntityId, file, password)\n return { cn: emitter.certificate?.holder ?? '', expiresAt: emitter.certificate?.expiresAt ?? '', warning: null as string | null }\n } catch (error) {\n throw new Error(emitterErrorSentence(error))\n }\n}\n\nfunction useEmitterSettings(legalEntityId: string | null | undefined) {\n const [row, setRow] = React.useState<Settings | null>(null)\n const [loading, setLoading] = React.useState(true)\n\n React.useEffect(() => {\n if (!legalEntityId) { setLoading(false); return }\n let alive = true\n void sb()?.from('plg_fiscalbr_emitter_settings').select(COLUMNS).eq('legal_entity_id', legalEntityId).maybeSingle()\n .then(({ data, error }: { data: Settings | null; error: { message: string } | null }) => {\n if (!alive) return\n if (error) toast.error('Não foi possível ler a configuração fiscal', { description: error.message })\n setRow(data ?? {})\n setLoading(false)\n })\n return () => { alive = false }\n }, [legalEntityId])\n\n const save = React.useCallback(async (tenantId: string, patch: Settings): Promise<boolean> => {\n if (!legalEntityId) return false\n const payload = { ...patch, tenant_id: tenantId, legal_entity_id: legalEntityId, updated_at: new Date().toISOString() }\n const { data, error } = await sb().from('plg_fiscalbr_emitter_settings')\n .upsert(payload, { onConflict: 'legal_entity_id' }).select(COLUMNS).single()\n if (error) {\n toast.error('Não foi possível salvar', { description: error.message })\n return false\n }\n setRow(data)\n return true\n }, [legalEntityId])\n\n return { row, loading, save, setRow }\n}\n\nfunction NeedsLegalEntity({ item, what }: { item: UnitItem; what: string }) {\n return (\n <Card>\n <CardContent className=\"flex flex-col items-start gap-3 py-6\">\n <p className=\"text-sm font-medium\">Falta o CNPJ desta unidade</p>\n <p className=\"text-sm text-muted-foreground\">\n {what} pertence à pessoa jurídica. Preencha a razão social e o CNPJ em Dados da empresa para configurar aqui.\n </p>\n <Button variant=\"outline\" onClick={() => adminNavigateTo(`/settings/locations/${item.id}/edit`)}>Preencher CNPJ</Button>\n </CardContent>\n </Card>\n )\n}\n\nfunction LoadingCard() {\n return (\n <Card>\n <CardContent className=\"space-y-3 py-6\">\n <Skeleton className=\"h-5 w-48\" />\n <Skeleton className=\"h-10 w-full\" />\n <Skeleton className=\"h-10 w-full\" />\n </CardContent>\n </Card>\n )\n}\n\nfunction ToggleRow({ title, description, checked, onChange, disabled, children }: {\n title: string; description?: string; checked: boolean; onChange: (v: boolean) => void; disabled?: boolean; children?: React.ReactNode\n}) {\n return (\n <div className=\"flex items-center justify-between gap-4\">\n <div className=\"min-w-0\">\n <p className=\"text-sm font-medium\">{title}</p>\n {description && <p className=\"text-xs text-muted-foreground\">{description}</p>}\n </div>\n <div className=\"flex shrink-0 items-center gap-2\">\n {children}\n <Switch checked={checked} disabled={disabled} onCheckedChange={onChange} />\n </div>\n </div>\n )\n}\n\nfunction Field({ label, hint, children }: { label: string; hint?: string; children: React.ReactNode }) {\n return (\n <div className=\"space-y-1.5\">\n <span className=\"text-sm font-medium\">{label}</span>\n {children}\n {hint && <p className=\"text-xs text-muted-foreground\">{hint}</p>}\n </div>\n )\n}\n\n/** The closed state of a fiscal block: what is configured, and the button to change it. */\nfunction SummaryCard({ title, lines, badge, onConfigure }: {\n title: string\n lines: Array<{ label: string; value: string }>\n badge?: { text: string; tone: 'ok' | 'muted' | 'bad' }\n onConfigure: () => void\n}) {\n return (\n <Card>\n <CardHeader className=\"flex-row items-start justify-between gap-3 space-y-0\">\n <div className=\"min-w-0\">\n <CardTitle className=\"text-base\">{title}</CardTitle>\n <dl className=\"mt-2 grid gap-x-6 gap-y-1 text-sm\" style={{ gridTemplateColumns: 'auto 1fr' }}>\n {lines.map((l) => (\n <React.Fragment key={l.label}>\n <dt className=\"text-muted-foreground\">{l.label}</dt>\n <dd className=\"text-foreground\">{l.value}</dd>\n </React.Fragment>\n ))}\n </dl>\n </div>\n <div className=\"flex shrink-0 items-center gap-2\">\n {badge && (\n <Badge\n variant={badge.tone === 'bad' ? 'destructive' : 'outline'}\n className={badge.tone === 'ok' ? 'border-emerald-500/40 bg-emerald-500/10 text-emerald-700 dark:text-emerald-400' : badge.tone === 'muted' ? 'text-muted-foreground' : undefined}\n >\n {badge.text}\n </Badge>\n )}\n <Button variant=\"outline\" size=\"sm\" onClick={onConfigure}>Configurar</Button>\n </div>\n </CardHeader>\n </Card>\n )\n}\n\nconst fmtDateTime = (v?: string | null) => (v ? new Date(v).toLocaleString('pt-BR') : null)\n\n// ── Certificado ─────────────────────────────────────────────────────────────\n\nexport function UnitCertificateWidget({ item }: { item?: UnitItem }) {\n const { row, loading, save, setRow } = useEmitterSettings(item?.legalEntityId)\n const [open, setOpen] = React.useState(false)\n const [file, setFile] = React.useState<File | null>(null)\n const [password, setPassword] = React.useState('')\n const [sending, setSending] = React.useState(false)\n // An expired certificate is why someone landed here: open on the upload.\n const expiredNow = !!row?.certificate_expires_at && Date.parse(row.certificate_expires_at) < Date.now()\n React.useEffect(() => { if (expiredNow) setOpen(true) }, [expiredNow])\n if (!item?.id) return null\n if (!item.legalEntityId) return <NeedsLegalEntity item={item} what=\"O certificado digital\" />\n if (loading || !row) return <LoadingCard />\n\n const expires = row.certificate_expires_at ? new Date(row.certificate_expires_at) : null\n const expired = expires ? expires.getTime() < Date.now() : false\n const hasCertificate = !!row.certificate_uploaded_at\n\n if (!open) {\n return (\n <SummaryCard\n title=\"Certificado digital e DANFes\"\n lines={[\n { label: 'Certificado A1', value: hasCertificate\n ? [row.certificate_cn, expires ? `válido até ${expires.toLocaleDateString('pt-BR')}` : null].filter(Boolean).join(' · ') || 'Enviado'\n : 'Nenhum certificado enviado' },\n { label: 'Receber DANFes', value: row.dfe_sync_enabled ? `Ligado · última sincronização ${fmtDateTime(row.dfe_last_sync_at) ?? 'nunca'}` : 'Desligado' },\n ]}\n badge={hasCertificate ? { text: expired ? 'Vencido' : 'Ativo', tone: expired ? 'bad' : 'ok' } : { text: 'Sem certificado', tone: 'muted' }}\n onConfigure={() => setOpen(true)}\n />\n )\n }\n\n return (\n <Card>\n <CardHeader className=\"flex-row items-start justify-between gap-3 space-y-0\">\n <CardTitle className=\"text-base\">Certificado digital e DANFes</CardTitle>\n <Button variant=\"ghost\" size=\"sm\" onClick={() => setOpen(false)}>Fechar</Button>\n </CardHeader>\n <CardContent className=\"space-y-5\">\n <ToggleRow\n title=\"Receber DANFes automaticamente\"\n description=\"Busca por hora as NF-e emitidas contra o CNPJ desta empresa.\"\n checked={!!row.dfe_sync_enabled}\n onChange={(v) => void save(item.tenantId!, { dfe_sync_enabled: v }).then((ok) => ok && toast.success(v ? 'Recepção ligada' : 'Recepção desligada'))}\n />\n\n <div className=\"rounded-md border bg-muted/40 p-3 text-sm\">\n <p className=\"mb-1.5 flex items-center gap-1.5 font-medium\"><Info className=\"h-4 w-4\" /> Como funciona</p>\n <ul className=\"ml-5 list-disc space-y-1 text-muted-foreground\">\n <li><strong className=\"text-foreground\">O que faz:</strong> consulta a SEFAZ e lista as NF-e emitidas contra o CNPJ, para você aceitar ou rejeitar e gerar entrada de estoque ou conta a pagar.</li>\n <li><strong className=\"text-foreground\">Requer certificado digital A1</strong> (.pfx) válido desta empresa. O arquivo vai direto ao serviço fiscal e não fica armazenado no nosso sistema.</li>\n <li><strong className=\"text-foreground\">Não faz manifestação na SEFAZ</strong> (ciência, confirmação, desconhecimento) nem emite NF-e.</li>\n </ul>\n </div>\n\n <div className=\"rounded-md border p-4 space-y-4\">\n <div className=\"flex items-start justify-between gap-3\">\n <div>\n <p className=\"flex items-center gap-1.5 text-sm font-medium\"><ShieldCheck className=\"h-4 w-4\" /> Certificado digital A1</p>\n <p className=\"text-xs text-muted-foreground\">\n {hasCertificate\n ? [row.certificate_cn, expires ? `válido até ${expires.toLocaleDateString('pt-BR')}` : null].filter(Boolean).join(' · ')\n : 'Nenhum certificado enviado'}\n </p>\n </div>\n {hasCertificate && <Badge variant={expired ? 'destructive' : 'secondary'}>{expired ? 'Vencido' : 'Ativo'}</Badge>}\n </div>\n <div className=\"fz-container\">\n <div className=\"fz-fields fz-fields-2 gap-4\">\n <Field label=\"Arquivo (.pfx)\">\n <Input type=\"file\" accept=\".pfx,.p12,application/x-pkcs12\" data-testid=\"certificate-file\"\n onChange={(e: React.ChangeEvent<HTMLInputElement>) => setFile(e.target.files?.[0] ?? null)} />\n </Field>\n <Field label=\"Senha do certificado\">\n <Input type=\"password\" autoComplete=\"new-password\" name=\"pfx-password\" value={password} data-testid=\"certificate-password\"\n onChange={(e: React.ChangeEvent<HTMLInputElement>) => setPassword(e.target.value)} />\n </Field>\n </div>\n </div>\n <div className=\"flex justify-end\">\n <Button\n size=\"sm\"\n data-testid=\"certificate-send\"\n disabled={!file || !password || sending}\n onClick={() => {\n if (!file) return\n setSending(true)\n void uploadCertificate(item.legalEntityId!, file, password)\n .then(async (res) => {\n setRow((r: Settings | null) => ({ ...(r ?? {}), certificate_cn: res.cn, certificate_expires_at: res.expiresAt,\n certificate_uploaded_at: new Date().toISOString(), dfe_last_error: res.warning ?? null }))\n // A certificate is what the DF-e pull waits for: switch it on, as before.\n if (!row.dfe_sync_enabled) await save(item.tenantId!, { dfe_sync_enabled: true })\n setFile(null); setPassword('')\n if (res.warning) toast.warning('Certificado enviado, com um aviso', { description: res.warning })\n else toast.success(`Certificado enviado · válido até ${new Date(res.expiresAt).toLocaleDateString('pt-BR')}`)\n })\n .catch((e: Error) => toast.error('Não foi possível enviar o certificado', { description: e.message }))\n .finally(() => setSending(false))\n }}\n >\n {sending ? 'Enviando…' : hasCertificate ? 'Atualizar certificado' : 'Enviar certificado'}\n </Button>\n </div>\n {row.dfe_last_error && <p className=\"text-xs text-destructive\">{row.dfe_last_error}</p>}\n </div>\n\n <p className=\"text-xs text-muted-foreground\">\n Última sincronização: {fmtDateTime(row.dfe_last_sync_at) ?? 'nunca'}\n </p>\n </CardContent>\n </Card>\n )\n}\n\n// ── Emissão fiscal ──────────────────────────────────────────────────────────\n\nconst ISS_TAXATION = [\n { value: '6', label: 'Tributável no município' },\n { value: '7', label: 'Tributável fora do município' },\n { value: '1', label: 'Isento' },\n { value: '2', label: 'Imune' },\n]\nconst SIMPLES_REGIME = [\n { value: 'auto', label: 'Automático (1 — tudo pelo Simples; excesso → 3)' },\n { value: '1', label: '1 — Federais e ISS pelo Simples (DAS)' },\n { value: '2', label: '2 — Federais pelo Simples; ISS pela NFS-e (lei municipal)' },\n { value: '3', label: '3 — Federais e ISS fora do Simples (sublimite)' },\n]\n\nfunction EnvSelect({ value, onChange, disabled }: { value: boolean; onChange: (prod: boolean) => void; disabled?: boolean }) {\n return (\n <Select value={value ? 'prod' : 'hom'} onValueChange={(v) => onChange(v === 'prod')} disabled={disabled}>\n <SelectTrigger className=\"h-8 w-36\"><SelectValue /></SelectTrigger>\n <SelectContent>\n <SelectItem value=\"hom\">Homologação</SelectItem>\n <SelectItem value=\"prod\">Produção</SelectItem>\n </SelectContent>\n </Select>\n )\n}\n\nexport function UnitFiscalWidget({ item }: { item?: UnitItem }) {\n const { row, loading, save, setRow } = useEmitterSettings(item?.legalEntityId)\n const [draft, setDraft] = React.useState<Settings>({})\n const [cscToken, setCscToken] = React.useState('')\n const [saving, setSaving] = React.useState(false)\n const [open, setOpen] = React.useState(false)\n const [registering, setRegistering] = React.useState(false)\n const [missing, setMissing] = React.useState<string[]>([])\n\n React.useEffect(() => { if (row) setDraft(row) }, [row])\n\n if (!item?.id) return null\n if (!item.legalEntityId) return <NeedsLegalEntity item={item} what=\"A emissão fiscal\" />\n if (loading || !row) return <LoadingCard />\n\n const set = (patch: Settings) => setDraft((d) => ({ ...d, ...patch }))\n const generic = (draft.nfce_generic_item ?? {}) as { ncm?: string; cfop?: string; csosn?: string }\n const setGeneric = (patch: Partial<typeof generic>) => set({ nfce_generic_item: { ...generic, ...patch } })\n const isSimples = (item.taxRegime ?? '').startsWith('simples')\n\n const checks = [\n { ok: !!row.certificate_uploaded_at && !(row.certificate_expires_at && Date.parse(row.certificate_expires_at) < Date.now()), label: 'Certificado A1 válido' },\n // Only what the switched-on documents need: NFS-e off does not block a restaurant that issues NFC-e.\n ...(draft.nfse_enabled ? [\n { ok: !!draft.nfse_service_code_national, label: 'Código de tributação do serviço' },\n { ok: draft.nfse_iss_rate != null && draft.nfse_iss_rate !== '', label: 'Alíquota de ISS' },\n ] : []),\n ...(draft.nfce_enabled ? [\n { ok: !!item.stateRegistration && !!draft.nfce_csc_id && (!!row.nfce_csc_token_set || !!cscToken), label: 'IE + CSC (NFC-e)' },\n ] : []),\n { ok: !!row.provider_synced_at, label: 'Empresa registrada para emitir' },\n ]\n const ready = (draft.nfse_enabled || draft.nfce_enabled) && checks.every((c) => c.ok)\n\n const saveNfce = async (): Promise<boolean> => {\n try {\n await emitters.save(item.legalEntityId!, {\n nfce: {\n enabled: !!draft.nfce_enabled,\n production: !!draft.nfce_production,\n series: draft.nfce_series ? Number(draft.nfce_series) : null,\n cscId: draft.nfce_csc_id ? String(draft.nfce_csc_id).trim() : null,\n ...(cscToken ? { cscToken } : {}),\n },\n })\n return true\n } catch (error) {\n toast.error('Não foi possível salvar a NFC-e', { description: emitterErrorSentence(error) })\n return false\n }\n }\n\n const onSave = async () => {\n setSaving(true)\n // NFC-e first: the service may refuse it (a CSC id that is not digits), and then nothing is half-saved.\n if (!(await saveNfce())) { setSaving(false); return }\n const { id: _id, legal_entity_id: _le, nfce_csc_token_set: _t, certificate_cn: _cn, certificate_expires_at: _e,\n certificate_uploaded_at: _u, dfe_last_sync_at: _d, provider_synced_at: _p,\n nfce_enabled: _ne, nfce_production: _np, nfce_series: _ns, nfce_csc_id: _nc, ...patch } = draft\n const issRate = patch.nfse_iss_rate === '' || patch.nfse_iss_rate == null ? null : Number(String(patch.nfse_iss_rate).replace(',', '.'))\n const ok = await save(item.tenantId!, {\n ...patch,\n nfse_iss_rate: Number.isFinite(issRate as number) ? issRate : null,\n nfse_iss_taxation: patch.nfse_iss_taxation ? Number(patch.nfse_iss_taxation) : null,\n nfse_simples_regime: patch.nfse_simples_regime && patch.nfse_simples_regime !== 'auto' ? Number(patch.nfse_simples_regime) : null,\n })\n setSaving(false)\n if (ok) { setCscToken(''); setOpen(false); toast.success('Configuração fiscal salva') }\n }\n\n const onRegister = async () => {\n setRegistering(true)\n setMissing([])\n try {\n if (!(await saveNfce())) return\n const after = await emitters.register(item.legalEntityId!)\n setRow((r: Settings | null) => ({ ...(r ?? {}), provider_synced_at: after.providerSyncedAt }))\n toast.success('Empresa cadastrada na PlugNotas')\n } catch (error) {\n if (error instanceof EmitterError) setMissing(error.gates.filter((g) => !g.ok).map((g) => GATE_LABELS[g.id] ?? g.id))\n toast.error('Não foi possível cadastrar na PlugNotas', { description: emitterErrorSentence(error) })\n } finally {\n setRegistering(false)\n }\n }\n\n if (!open) {\n const env = (prod: boolean) => (prod ? 'Produção' : 'Homologação')\n return (\n <SummaryCard\n title=\"Emissão fiscal (NFS-e / NFC-e)\"\n lines={[\n { label: 'NFS-e', value: row.nfse_enabled ? `Ligada · ${env(!!row.nfse_production)}` : 'Desligada' },\n { label: 'NFC-e', value: row.nfce_enabled ? `Ligada · ${env(!!row.nfce_production)}${row.nfce_series ? ` · série ${row.nfce_series}` : ''}` : 'Desligada' },\n ]}\n badge={ready ? { text: 'Pronto para emitir', tone: 'ok' } : { text: 'Configuração incompleta', tone: 'muted' }}\n onConfigure={() => setOpen(true)}\n />\n )\n }\n\n return (\n <Card>\n <CardHeader className=\"flex-row items-start justify-between gap-3 space-y-0\">\n <div>\n <CardTitle className=\"text-base\">Emissão fiscal (NFS-e / NFC-e)</CardTitle>\n <CardDescription>{item.legalName ?? 'Pessoa jurídica'}{item.cnpj ? ` · CNPJ ${maskCpfCnpj(item.cnpj)}` : ''}</CardDescription>\n </div>\n <div className=\"flex shrink-0 items-center gap-2\">\n <Badge variant={ready ? 'default' : 'secondary'}>\n {ready ? 'Pronto para emitir' : 'Configuração incompleta'}\n </Badge>\n <Button variant=\"ghost\" size=\"sm\" onClick={() => { setDraft(row); setCscToken(''); setOpen(false) }}>Cancelar</Button>\n </div>\n </CardHeader>\n <CardContent className=\"space-y-5\">\n <section className=\"space-y-4 rounded-md border p-4\">\n <ToggleRow title=\"NFS-e — Nota de Serviço\" description=\"Padrão nacional (RJ, Vitória e demais aderentes)\"\n checked={!!draft.nfse_enabled} onChange={(v) => set({ nfse_enabled: v })}>\n <EnvSelect value={!!draft.nfse_production} onChange={(v) => set({ nfse_production: v })} disabled={!draft.nfse_enabled} />\n </ToggleRow>\n {draft.nfse_enabled && (\n <div className=\"fz-container space-y-4\">\n <div className=\"fz-fields fz-fields-2 gap-4\">\n <Field label=\"Cód. tributação nacional\"><Input value={draft.nfse_service_code_national ?? ''} placeholder=\"ex.: 06.02.01\" onChange={(e) => set({ nfse_service_code_national: e.target.value })} /></Field>\n <Field label=\"Cód. tributação municipal\"><Input value={draft.nfse_service_code_municipal ?? ''} placeholder=\"ex.: 001\" onChange={(e) => set({ nfse_service_code_municipal: e.target.value })} /></Field>\n <Field label=\"Código NBS\"><Input value={draft.nfse_nbs_code ?? ''} placeholder=\"ex.: 1.2602.90.00\" onChange={(e) => set({ nfse_nbs_code: e.target.value })} /></Field>\n <Field label=\"CNAE do serviço\"><Input value={draft.nfse_cnae ?? ''} placeholder=\"ex.: 9602-5/02\" onChange={(e) => set({ nfse_cnae: e.target.value })} /></Field>\n <Field label=\"Alíquota ISS (%)\"><Input inputMode=\"decimal\" value={draft.nfse_iss_rate ?? ''} placeholder=\"ex.: 5\" onChange={(e) => set({ nfse_iss_rate: e.target.value })} /></Field>\n <Field label=\"Tributação ISS\">\n <Select value={draft.nfse_iss_taxation != null ? String(draft.nfse_iss_taxation) : undefined} onValueChange={(v) => set({ nfse_iss_taxation: v })}>\n <SelectTrigger><SelectValue placeholder=\"Selecione\" /></SelectTrigger>\n <SelectContent>{ISS_TAXATION.map((o) => <SelectItem key={o.value} value={o.value}>{o.label}</SelectItem>)}</SelectContent>\n </Select>\n </Field>\n <Field label=\"IBS/CBS — CST\"><Input value={draft.nfse_ibscbs_cst ?? ''} placeholder=\"ex.: 000\" onChange={(e) => set({ nfse_ibscbs_cst: e.target.value })} /></Field>\n <Field label=\"IBS/CBS — Classificação\"><Input value={draft.nfse_ibscbs_classification ?? ''} placeholder=\"ex.: 000001\" onChange={(e) => set({ nfse_ibscbs_classification: e.target.value })} /></Field>\n {isSimples && (\n <Field label=\"Apuração dos tributos no Simples\">\n <Select value={draft.nfse_simples_regime != null ? String(draft.nfse_simples_regime) : 'auto'} onValueChange={(v) => set({ nfse_simples_regime: v })}>\n <SelectTrigger><SelectValue /></SelectTrigger>\n <SelectContent>{SIMPLES_REGIME.map((o) => <SelectItem key={o.value} value={o.value}>{o.label}</SelectItem>)}</SelectContent>\n </Select>\n </Field>\n )}\n </div>\n <ToggleRow title=\"Emitir pelo valor líquido\" checked={!!draft.nfse_net_value} onChange={(v) => set({ nfse_net_value: v })} />\n <Field label=\"Informações complementares da nota\">\n <Input value={draft.nfse_additional_info ?? ''} placeholder=\"ex.: Totais Aproximados dos Tributos cfe. Lei nº 12.741/2012…\" onChange={(e) => set({ nfse_additional_info: e.target.value })} />\n </Field>\n </div>\n )}\n </section>\n\n <section className=\"space-y-4 rounded-md border p-4\">\n <ToggleRow title=\"NFC-e — Cupom do Consumidor\" description=\"Produtos / comanda\"\n checked={!!draft.nfce_enabled} onChange={(v) => set({ nfce_enabled: v })}>\n <EnvSelect value={!!draft.nfce_production} onChange={(v) => set({ nfce_production: v })} disabled={!draft.nfce_enabled} />\n </ToggleRow>\n {draft.nfce_enabled && (\n <div className=\"fz-container space-y-4\">\n <div className=\"fz-fields fz-fields-2 gap-4\">\n <Field label=\"Série\"><Input inputMode=\"numeric\" value={draft.nfce_series ?? ''} onChange={(e) => set({ nfce_series: e.target.value.replace(/\\D/g, '') })} /></Field>\n <Field label=\"CSC — ID\"><Input value={draft.nfce_csc_id ?? ''} onChange={(e) => set({ nfce_csc_id: e.target.value })} /></Field>\n </div>\n <Field label=\"CSC — Token\" hint=\"O CSC (id numérico + token) é gerado no portal da SEFAZ do estado — não é o login de nenhum sistema.\">\n <Input type=\"password\" value={cscToken} placeholder={row.nfce_csc_token_set ? '•••••••• (configurado — digite para trocar)' : ''} onChange={(e) => setCscToken(e.target.value)} />\n </Field>\n <div className=\"fz-fields fz-fields-2 gap-4\">\n <Field label=\"Item genérico — NCM\"><Input value={generic.ncm ?? ''} onChange={(e) => setGeneric({ ncm: e.target.value })} /></Field>\n <Field label=\"Item genérico — CFOP\"><Input value={generic.cfop ?? ''} onChange={(e) => setGeneric({ cfop: e.target.value })} /></Field>\n <Field label=\"Item genérico — CSOSN/CST\"><Input value={generic.csosn ?? ''} onChange={(e) => setGeneric({ csosn: e.target.value })} /></Field>\n </div>\n </div>\n )}\n </section>\n\n <ul className=\"flex flex-wrap gap-2\">\n {checks.map((c) => (\n <li key={c.label}>\n <Badge variant=\"outline\" className={c.ok ? 'gap-1 border-emerald-500/40 text-emerald-700 dark:text-emerald-400' : 'gap-1 text-muted-foreground'}>\n {c.ok ? <Check className=\"h-3 w-3\" /> : <X className=\"h-3 w-3\" />}{c.label}\n </Badge>\n </li>\n ))}\n </ul>\n\n <div className=\"flex flex-wrap items-center justify-end gap-3\">\n {missing.length > 0 && (\n <p className=\"mr-auto text-xs text-destructive\">Falta: {missing.join(', ')}</p>\n )}\n <Button variant=\"outline\" onClick={() => void onRegister()} disabled={saving || registering}>\n {registering ? 'Cadastrando…' : row.provider_synced_at ? 'Atualizar na PlugNotas' : 'Cadastrar na PlugNotas'}\n </Button>\n <Button onClick={() => void onSave()} disabled={saving || registering}>{saving ? 'Salvando…' : 'Salvar configuração'}</Button>\n </div>\n </CardContent>\n </Card>\n )\n}\n"]}
|
|
@@ -0,0 +1,66 @@
|
|
|
1
|
+
import { getSupabaseClientOptional, getActiveTenantId } from '@fayz-ai/core';
|
|
2
|
+
import { serviceBaseUrl } from '@fayz-ai/admin';
|
|
3
|
+
|
|
4
|
+
// src/lib/service.ts
|
|
5
|
+
var EmitterError = class extends Error {
|
|
6
|
+
constructor(status, code, message, gates = [], field = null) {
|
|
7
|
+
super(message);
|
|
8
|
+
this.status = status;
|
|
9
|
+
this.code = code;
|
|
10
|
+
this.gates = gates;
|
|
11
|
+
this.field = field;
|
|
12
|
+
this.name = "EmitterError";
|
|
13
|
+
}
|
|
14
|
+
};
|
|
15
|
+
async function send(method, path, body) {
|
|
16
|
+
const base = serviceBaseUrl();
|
|
17
|
+
const supabase = getSupabaseClientOptional();
|
|
18
|
+
if (!base || !supabase) throw new EmitterError(503, "no_client", "the integration service is not configured");
|
|
19
|
+
const { data } = await supabase.auth.getSession();
|
|
20
|
+
const token = data?.session?.access_token;
|
|
21
|
+
if (!token) throw new EmitterError(401, "unauthorized", "sign in again");
|
|
22
|
+
const tenant = getActiveTenantId();
|
|
23
|
+
try {
|
|
24
|
+
return await fetch(`${base}${path}`, {
|
|
25
|
+
method,
|
|
26
|
+
headers: {
|
|
27
|
+
authorization: `Bearer ${token}`,
|
|
28
|
+
...tenant ? { "x-fayz-tenant": tenant } : {},
|
|
29
|
+
...body === void 0 ? {} : { "content-type": "application/json" }
|
|
30
|
+
},
|
|
31
|
+
...body === void 0 ? {} : { body: JSON.stringify(body) }
|
|
32
|
+
});
|
|
33
|
+
} catch (error) {
|
|
34
|
+
throw new EmitterError(503, "unavailable", error instanceof Error ? error.message : String(error));
|
|
35
|
+
}
|
|
36
|
+
}
|
|
37
|
+
async function refusal(response) {
|
|
38
|
+
const text = await response.text();
|
|
39
|
+
let payload = null;
|
|
40
|
+
try {
|
|
41
|
+
payload = text ? JSON.parse(text) : null;
|
|
42
|
+
} catch {
|
|
43
|
+
}
|
|
44
|
+
return new EmitterError(
|
|
45
|
+
response.status,
|
|
46
|
+
payload?.error ?? "unavailable",
|
|
47
|
+
payload?.message ?? text.slice(0, 200),
|
|
48
|
+
Array.isArray(payload?.gates) ? payload.gates : [],
|
|
49
|
+
typeof payload?.field === "string" ? payload.field : null
|
|
50
|
+
);
|
|
51
|
+
}
|
|
52
|
+
async function request(method, path, body) {
|
|
53
|
+
const response = await send(method, path, body);
|
|
54
|
+
if (!response.ok) throw await refusal(response);
|
|
55
|
+
const text = await response.text();
|
|
56
|
+
return text ? JSON.parse(text) : null;
|
|
57
|
+
}
|
|
58
|
+
async function requestFile(path) {
|
|
59
|
+
const response = await send("GET", path);
|
|
60
|
+
if (!response.ok) throw await refusal(response);
|
|
61
|
+
return response.blob();
|
|
62
|
+
}
|
|
63
|
+
|
|
64
|
+
export { EmitterError, request, requestFile };
|
|
65
|
+
//# sourceMappingURL=chunk-2GHTB3Z2.js.map
|
|
66
|
+
//# sourceMappingURL=chunk-2GHTB3Z2.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/lib/service.ts"],"names":[],"mappings":"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","file":"chunk-2GHTB3Z2.js","sourcesContent":["// One call to the integration service (control-sdk-backend) as the signed-in\n// member: the service verifies who is asking and checks every rule; a refusal\n// comes back as its code, for the screen to turn into a sentence.\nimport { getActiveTenantId, getSupabaseClientOptional } from '@fayz-ai/core'\nimport { serviceBaseUrl } from '@fayz-ai/admin'\n\n/** One check the service ran, as it answers it with a refusal. */\nexport interface ServiceGate {\n id: string\n ok: boolean\n detail: string | null\n}\n\n/** A refusal from the service: `code` picks the sentence, `gates` lists what is missing. */\nexport class EmitterError extends Error {\n constructor(readonly status: number, readonly code: string, message: string, readonly gates: ServiceGate[] = [], readonly field: string | null = null) {\n super(message)\n this.name = 'EmitterError'\n }\n}\n\n\ntype Method = 'GET' | 'POST' | 'PATCH' | 'PUT'\n\nasync function send(method: Method, path: string, body?: unknown): Promise<Response> {\n const base = serviceBaseUrl()\n const supabase = getSupabaseClientOptional() as any\n if (!base || !supabase) throw new EmitterError(503, 'no_client', 'the integration service is not configured')\n const { data } = await supabase.auth.getSession()\n const token: string | undefined = data?.session?.access_token\n if (!token) throw new EmitterError(401, 'unauthorized', 'sign in again')\n const tenant = getActiveTenantId()\n try {\n return await fetch(`${base}${path}`, {\n method,\n headers: {\n authorization: `Bearer ${token}`,\n ...(tenant ? { 'x-fayz-tenant': tenant } : {}),\n ...(body === undefined ? {} : { 'content-type': 'application/json' }),\n },\n ...(body === undefined ? {} : { body: JSON.stringify(body) }),\n })\n } catch (error) {\n throw new EmitterError(503, 'unavailable', error instanceof Error ? error.message : String(error))\n }\n}\n\nasync function refusal(response: Response): Promise<EmitterError> {\n const text = await response.text()\n let payload: any = null\n try {\n payload = text ? JSON.parse(text) : null\n } catch {\n // not JSON: the status alone decides the sentence\n }\n return new EmitterError(\n response.status, payload?.error ?? 'unavailable', payload?.message ?? text.slice(0, 200),\n Array.isArray(payload?.gates) ? payload.gates : [], typeof payload?.field === 'string' ? payload.field : null,\n )\n}\n\nexport async function request<T>(method: Method, path: string, body?: unknown): Promise<T> {\n const response = await send(method, path, body)\n if (!response.ok) throw await refusal(response)\n const text = await response.text()\n return (text ? JSON.parse(text) : null) as T\n}\n\n/** A file the service streams (a note's PDF or XML). */\nexport async function requestFile(path: string): Promise<Blob> {\n const response = await send('GET', path)\n if (!response.ok) throw await refusal(response)\n return response.blob()\n}\n"]}
|
|
@@ -0,0 +1,101 @@
|
|
|
1
|
+
import { EmitterError, request } from './chunk-2GHTB3Z2.js';
|
|
2
|
+
|
|
3
|
+
// src/lib/emitters.ts
|
|
4
|
+
var SENTENCES = {
|
|
5
|
+
no_client: "O servi\xE7o de integra\xE7\xF5es n\xE3o est\xE1 configurado neste app.",
|
|
6
|
+
not_configured: "A emiss\xE3o fiscal ainda n\xE3o est\xE1 ligada no servidor.",
|
|
7
|
+
unauthorized: "Sua sess\xE3o expirou. Entre de novo.",
|
|
8
|
+
not_allowed: "Seu acesso n\xE3o permite alterar a configura\xE7\xE3o fiscal.",
|
|
9
|
+
unavailable: "N\xE3o foi poss\xEDvel falar com o servi\xE7o fiscal. Tente de novo em instantes.",
|
|
10
|
+
unknown_emitter: "Esta empresa n\xE3o foi encontrada nesta conta.",
|
|
11
|
+
cnpj_elsewhere: "Este CNPJ j\xE1 est\xE1 configurado para emiss\xE3o em outra conta.",
|
|
12
|
+
observed: "Esta empresa j\xE1 emite pelo sistema anterior. Ela fica s\xF3 para consulta aqui at\xE9 a migra\xE7\xE3o.",
|
|
13
|
+
not_ready: "Ainda falta preencher o que o cadastro na PlugNotas exige.",
|
|
14
|
+
no_cnpj: "A empresa n\xE3o tem um CNPJ de 14 d\xEDgitos.",
|
|
15
|
+
wrong_password: "A senha n\xE3o abre este certificado. Confira a senha do arquivo .pfx.",
|
|
16
|
+
not_a_certificate: "Este arquivo n\xE3o \xE9 um certificado A1 (.pfx ou .p12).",
|
|
17
|
+
no_certificate: "O arquivo n\xE3o traz nenhum certificado.",
|
|
18
|
+
certificate_of_another_cnpj: "Este certificado \xE9 de outro CNPJ.",
|
|
19
|
+
certificate_expired: "Este certificado est\xE1 vencido.",
|
|
20
|
+
not_base64: "N\xE3o foi poss\xEDvel ler o arquivo do certificado.",
|
|
21
|
+
invalid_setting: "Um dos valores n\xE3o \xE9 aceito.",
|
|
22
|
+
plugnotas_refused: "A PlugNotas recusou o envio.",
|
|
23
|
+
admin_only: "S\xF3 o suporte pode mudar isso.",
|
|
24
|
+
series_taken: "Esta s\xE9rie j\xE1 \xE9 usada por outro sistema neste CNPJ. Escolha outra.",
|
|
25
|
+
not_registered: "A empresa ainda n\xE3o est\xE1 cadastrada na PlugNotas.",
|
|
26
|
+
no_series: "Escolha a s\xE9rie da NFC-e."
|
|
27
|
+
};
|
|
28
|
+
var FIELD_SENTENCES = {
|
|
29
|
+
"nfce.cscId": "O ID do CSC tem s\xF3 n\xFAmeros.",
|
|
30
|
+
"nfce.series": "A s\xE9rie vai de 1 a 889.",
|
|
31
|
+
"nfe.series": "A s\xE9rie vai de 1 a 889.",
|
|
32
|
+
"nfce.nextNumber": "O pr\xF3ximo n\xFAmero precisa ser 1 ou maior.",
|
|
33
|
+
"nfe.nextNumber": "O pr\xF3ximo n\xFAmero precisa ser 1 ou maior.",
|
|
34
|
+
taxRegimeCode: "Escolha o regime tribut\xE1rio.",
|
|
35
|
+
specialTaxRegimeCode: "O regime especial vai de 0 a 11."
|
|
36
|
+
};
|
|
37
|
+
function emitterErrorSentence(error) {
|
|
38
|
+
if (error instanceof EmitterError) {
|
|
39
|
+
if (error.field && FIELD_SENTENCES[error.field]) return FIELD_SENTENCES[error.field];
|
|
40
|
+
return SENTENCES[error.code] ?? error.message;
|
|
41
|
+
}
|
|
42
|
+
return error instanceof Error ? error.message : String(error);
|
|
43
|
+
}
|
|
44
|
+
var GATE_LABELS = {
|
|
45
|
+
cnpj: "CNPJ da empresa",
|
|
46
|
+
legal_name: "Raz\xE3o social",
|
|
47
|
+
tax_regime: "Regime tribut\xE1rio",
|
|
48
|
+
email: "E-mail fiscal",
|
|
49
|
+
state_registration: "Inscri\xE7\xE3o estadual (ou ISENTO)",
|
|
50
|
+
address: "Endere\xE7o fiscal completo (rua, cidade, UF e CEP)",
|
|
51
|
+
ibge_city_code: "C\xF3digo IBGE da cidade",
|
|
52
|
+
certificate: "Certificado A1 enviado",
|
|
53
|
+
certificate_holder: "Certificado do mesmo CNPJ",
|
|
54
|
+
certificate_valid: "Certificado dentro da validade",
|
|
55
|
+
nfce_enabled: "NFC-e ligada",
|
|
56
|
+
nfce_series: "S\xE9rie da NFC-e",
|
|
57
|
+
csc: "CSC (ID e c\xF3digo) da NFC-e",
|
|
58
|
+
registered: "Empresa cadastrada na PlugNotas"
|
|
59
|
+
};
|
|
60
|
+
var one = (legalEntityId, rest = "") => `/v1/fiscal/emitters/${encodeURIComponent(legalEntityId)}${rest}`;
|
|
61
|
+
async function base64Of(file) {
|
|
62
|
+
const bytes = new Uint8Array(await file.arrayBuffer());
|
|
63
|
+
let binary = "";
|
|
64
|
+
for (let i = 0; i < bytes.length; i += 32768) binary += String.fromCharCode(...bytes.subarray(i, i + 32768));
|
|
65
|
+
return btoa(binary);
|
|
66
|
+
}
|
|
67
|
+
var emitters = {
|
|
68
|
+
list: async () => (await request("GET", "/v1/fiscal/emitters")).emitters,
|
|
69
|
+
/** Also asks PlugNotas what it holds, and lists what issuing still needs. */
|
|
70
|
+
read: (legalEntityId) => request("GET", one(legalEntityId)),
|
|
71
|
+
save: (legalEntityId, settings) => request("PATCH", one(legalEntityId), settings),
|
|
72
|
+
certificate: async (legalEntityId, file, password) => request("PUT", one(legalEntityId, "/certificate"), { pfxBase64: await base64Of(file), password, fileName: file.name }),
|
|
73
|
+
register: (legalEntityId) => request("PUT", one(legalEntityId, "/registration")),
|
|
74
|
+
/** Issue in parallel with the previous system: adds this app's own NFC-e series, nothing else. */
|
|
75
|
+
addOwnSeries: (legalEntityId) => request("PUT", one(legalEntityId, "/nfce-series"))
|
|
76
|
+
};
|
|
77
|
+
var TAX_REGIMES = [
|
|
78
|
+
{ value: 1, label: "Simples Nacional" },
|
|
79
|
+
{ value: 2, label: "Simples Nacional \u2014 excesso" },
|
|
80
|
+
// Presumed and real profit are both "normal" in PlugNotas' words; the label
|
|
81
|
+
// says so for the store to find its own (V1).
|
|
82
|
+
{ value: 3, label: "Regime Normal (Lucro Presumido / Lucro Real)" }
|
|
83
|
+
];
|
|
84
|
+
var SPECIAL_TAX_REGIMES = [
|
|
85
|
+
{ value: 0, label: "Sem regime especial" },
|
|
86
|
+
{ value: 1, label: "Microempresa municipal" },
|
|
87
|
+
{ value: 2, label: "Estimativa" },
|
|
88
|
+
{ value: 3, label: "Sociedade de profissionais" },
|
|
89
|
+
{ value: 4, label: "Cooperativa" },
|
|
90
|
+
{ value: 5, label: "MEI" },
|
|
91
|
+
{ value: 6, label: "ME ou EPP" },
|
|
92
|
+
{ value: 7, label: "Lucro Real" },
|
|
93
|
+
{ value: 8, label: "Lucro Presumido" },
|
|
94
|
+
{ value: 9, label: "Tributa\xE7\xE3o normal" },
|
|
95
|
+
{ value: 10, label: "Simples Nacional com excesso do sublimite" },
|
|
96
|
+
{ value: 11, label: "Empresa de responsabilidade limitada" }
|
|
97
|
+
];
|
|
98
|
+
|
|
99
|
+
export { GATE_LABELS, SPECIAL_TAX_REGIMES, TAX_REGIMES, emitterErrorSentence, emitters };
|
|
100
|
+
//# sourceMappingURL=chunk-7NW3EBOQ.js.map
|
|
101
|
+
//# sourceMappingURL=chunk-7NW3EBOQ.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/lib/emitters.ts"],"names":[],"mappings":"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","file":"chunk-7NW3EBOQ.js","sourcesContent":["// The fiscal emitters as the integration service onboards them\n// (control-sdk-backend ADR 0008, /v1/fiscal/emitters). The service verifies who\n// is asking, checks every rule and talks to PlugNotas; this file only sends and\n// turns a refusal code into the sentence the screen shows. No PlugNotas key,\n// certificate or CSC token is ever kept in the browser.\nimport { EmitterError, request } from './service'\n\nexport { EmitterError }\n\nexport type EmitterMode = 'observe' | 'own'\n\nexport interface EmitterModel {\n enabled: boolean\n production: boolean\n series: number | null\n nextNumber: number | null\n}\n\nexport interface EmitterGate {\n id: string\n ok: boolean\n detail: string | null\n}\n\nexport interface Emitter {\n legalEntityId: string\n cnpj: string\n legalName: string | null\n tradeName: string | null\n /** null in the list until the emitter itself is read. */\n mode: EmitterMode | null\n bindingId: string | null\n /** The NFC-e series this app issues on while the previous system manages the company. */\n ownSeries?: number | null\n taxRegimeCode: number | null\n specialTaxRegimeCode: number\n nfe: EmitterModel\n nfce: EmitterModel & { cscId: string | null; cscTokenSet: boolean }\n certificate: { holder: string | null; expiresAt: string | null; uploadedAt: string | null; warning: 'expired' | 'expiring' | null } | null\n providerSyncedAt: string | null\n providerWebhookAt: string | null\n provider?: {\n registered: boolean\n certificate: { id: string; holder: string | null; expiresAt: string | null } | null\n nfce: { active: boolean; production: boolean; series: number[] } | null\n nfe: { active: boolean; dfe: boolean } | null\n webhook: { url: string } | null\n }\n gates?: EmitterGate[]\n ready?: boolean\n}\n\nexport interface EmitterSettingsInput {\n taxRegimeCode?: number | null\n specialTaxRegimeCode?: number\n nfe?: Partial<Pick<EmitterModel, 'enabled' | 'production' | 'series' | 'nextNumber'>>\n nfce?: Partial<Pick<EmitterModel, 'enabled' | 'production' | 'series' | 'nextNumber'>> & { cscId?: string | null; cscToken?: string | null }\n}\n\n/** What the store reads for each refusal code. */\nconst SENTENCES: Record<string, string> = {\n no_client: 'O serviço de integrações não está configurado neste app.',\n not_configured: 'A emissão fiscal ainda não está ligada no servidor.',\n unauthorized: 'Sua sessão expirou. Entre de novo.',\n not_allowed: 'Seu acesso não permite alterar a configuração fiscal.',\n unavailable: 'Não foi possível falar com o serviço fiscal. Tente de novo em instantes.',\n unknown_emitter: 'Esta empresa não foi encontrada nesta conta.',\n cnpj_elsewhere: 'Este CNPJ já está configurado para emissão em outra conta.',\n observed: 'Esta empresa já emite pelo sistema anterior. Ela fica só para consulta aqui até a migração.',\n not_ready: 'Ainda falta preencher o que o cadastro na PlugNotas exige.',\n no_cnpj: 'A empresa não tem um CNPJ de 14 dígitos.',\n wrong_password: 'A senha não abre este certificado. Confira a senha do arquivo .pfx.',\n not_a_certificate: 'Este arquivo não é um certificado A1 (.pfx ou .p12).',\n no_certificate: 'O arquivo não traz nenhum certificado.',\n certificate_of_another_cnpj: 'Este certificado é de outro CNPJ.',\n certificate_expired: 'Este certificado está vencido.',\n not_base64: 'Não foi possível ler o arquivo do certificado.',\n invalid_setting: 'Um dos valores não é aceito.',\n plugnotas_refused: 'A PlugNotas recusou o envio.',\n admin_only: 'Só o suporte pode mudar isso.',\n series_taken: 'Esta série já é usada por outro sistema neste CNPJ. Escolha outra.',\n not_registered: 'A empresa ainda não está cadastrada na PlugNotas.',\n no_series: 'Escolha a série da NFC-e.',\n}\n\nconst FIELD_SENTENCES: Record<string, string> = {\n 'nfce.cscId': 'O ID do CSC tem só números.',\n 'nfce.series': 'A série vai de 1 a 889.',\n 'nfe.series': 'A série vai de 1 a 889.',\n 'nfce.nextNumber': 'O próximo número precisa ser 1 ou maior.',\n 'nfe.nextNumber': 'O próximo número precisa ser 1 ou maior.',\n taxRegimeCode: 'Escolha o regime tributário.',\n specialTaxRegimeCode: 'O regime especial vai de 0 a 11.',\n}\n\nexport function emitterErrorSentence(error: unknown): string {\n if (error instanceof EmitterError) {\n if (error.field && FIELD_SENTENCES[error.field]) return FIELD_SENTENCES[error.field]!\n return SENTENCES[error.code] ?? error.message\n }\n return error instanceof Error ? error.message : String(error)\n}\n\n/** What each gate asks of the store, in its words. */\nexport const GATE_LABELS: Record<string, string> = {\n cnpj: 'CNPJ da empresa',\n legal_name: 'Razão social',\n tax_regime: 'Regime tributário',\n email: 'E-mail fiscal',\n state_registration: 'Inscrição estadual (ou ISENTO)',\n address: 'Endereço fiscal completo (rua, cidade, UF e CEP)',\n ibge_city_code: 'Código IBGE da cidade',\n certificate: 'Certificado A1 enviado',\n certificate_holder: 'Certificado do mesmo CNPJ',\n certificate_valid: 'Certificado dentro da validade',\n nfce_enabled: 'NFC-e ligada',\n nfce_series: 'Série da NFC-e',\n csc: 'CSC (ID e código) da NFC-e',\n registered: 'Empresa cadastrada na PlugNotas',\n}\n\nconst one = (legalEntityId: string, rest = '') => `/v1/fiscal/emitters/${encodeURIComponent(legalEntityId)}${rest}`\n\n/** The bytes of a picked file as base64, for the certificate upload. */\nasync function base64Of(file: File): Promise<string> {\n const bytes = new Uint8Array(await file.arrayBuffer())\n let binary = ''\n for (let i = 0; i < bytes.length; i += 0x8000) binary += String.fromCharCode(...bytes.subarray(i, i + 0x8000))\n return btoa(binary)\n}\n\nexport const emitters = {\n list: async () => (await request<{ emitters: Emitter[] }>('GET', '/v1/fiscal/emitters')).emitters,\n /** Also asks PlugNotas what it holds, and lists what issuing still needs. */\n read: (legalEntityId: string) => request<Emitter>('GET', one(legalEntityId)),\n save: (legalEntityId: string, settings: EmitterSettingsInput) => request<Emitter>('PATCH', one(legalEntityId), settings),\n certificate: async (legalEntityId: string, file: File, password: string) =>\n request<Emitter>('PUT', one(legalEntityId, '/certificate'), { pfxBase64: await base64Of(file), password, fileName: file.name }),\n register: (legalEntityId: string) => request<Emitter>('PUT', one(legalEntityId, '/registration')),\n /** Issue in parallel with the previous system: adds this app's own NFC-e series, nothing else. */\n addOwnSeries: (legalEntityId: string) => request<Emitter>('PUT', one(legalEntityId, '/nfce-series')),\n}\n\nexport const TAX_REGIMES = [\n { value: 1, label: 'Simples Nacional' },\n { value: 2, label: 'Simples Nacional — excesso' },\n // Presumed and real profit are both \"normal\" in PlugNotas' words; the label\n // says so for the store to find its own (V1).\n { value: 3, label: 'Regime Normal (Lucro Presumido / Lucro Real)' },\n] as const\n\n/** PlugNotas' regimeTributarioEspecial codes, as the V1 screen lists them. */\nexport const SPECIAL_TAX_REGIMES = [\n { value: 0, label: 'Sem regime especial' },\n { value: 1, label: 'Microempresa municipal' },\n { value: 2, label: 'Estimativa' },\n { value: 3, label: 'Sociedade de profissionais' },\n { value: 4, label: 'Cooperativa' },\n { value: 5, label: 'MEI' },\n { value: 6, label: 'ME ou EPP' },\n { value: 7, label: 'Lucro Real' },\n { value: 8, label: 'Lucro Presumido' },\n { value: 9, label: 'Tributação normal' },\n { value: 10, label: 'Simples Nacional com excesso do sublimite' },\n { value: 11, label: 'Empresa de responsabilidade limitada' },\n] as const\n"]}
|
|
@@ -0,0 +1,241 @@
|
|
|
1
|
+
import { orderNotes, noteErrorSentence, NOTE_STATUS_LABEL, CANCEL_MIN_JUSTIFICATION } from './chunk-RZT2BO6E.js';
|
|
2
|
+
import React from 'react';
|
|
3
|
+
import { Button, Skeleton, Badge, toast, Modal, ModalContent, ModalHeader, ModalTitle, ModalDescription, Textarea, ModalFooter } from '@fayz-ai/ui';
|
|
4
|
+
import { OrderDetailBlock } from '@fayz-ai/admin';
|
|
5
|
+
import { RefreshCw, Loader2, AlertCircle, RotateCcw, FileText, Download } from 'lucide-react';
|
|
6
|
+
import { jsxs, jsx } from 'react/jsx-runtime';
|
|
7
|
+
|
|
8
|
+
var POLL_DELAYS = [3, 5, 8, 12, 20, 20];
|
|
9
|
+
var tone = (status) => status === "authorized" ? "border-emerald-500/40 bg-emerald-500/10 text-emerald-700 dark:text-emerald-400" : status === "rejected" || status === "error" ? "border-destructive/40 bg-destructive/10 text-destructive" : "text-muted-foreground";
|
|
10
|
+
async function openFile(blob, fileName, download) {
|
|
11
|
+
const url = URL.createObjectURL(blob);
|
|
12
|
+
if (download) {
|
|
13
|
+
const a = document.createElement("a");
|
|
14
|
+
a.href = url;
|
|
15
|
+
a.download = fileName;
|
|
16
|
+
a.click();
|
|
17
|
+
} else {
|
|
18
|
+
window.open(url, "_blank", "noopener");
|
|
19
|
+
}
|
|
20
|
+
setTimeout(() => URL.revokeObjectURL(url), 6e4);
|
|
21
|
+
}
|
|
22
|
+
function OrderNoteCard({ orderId }) {
|
|
23
|
+
const [notes, setNotes] = React.useState(null);
|
|
24
|
+
const [error, setError] = React.useState(null);
|
|
25
|
+
const [issuing, setIssuing] = React.useState(false);
|
|
26
|
+
const [cancelling, setCancelling] = React.useState(null);
|
|
27
|
+
const load = React.useCallback(async () => {
|
|
28
|
+
if (!orderId) return;
|
|
29
|
+
try {
|
|
30
|
+
setNotes(await orderNotes.list(orderId));
|
|
31
|
+
setError(null);
|
|
32
|
+
} catch (e) {
|
|
33
|
+
setError(noteErrorSentence(e));
|
|
34
|
+
}
|
|
35
|
+
}, [orderId]);
|
|
36
|
+
React.useEffect(() => {
|
|
37
|
+
void load();
|
|
38
|
+
}, [load]);
|
|
39
|
+
const processing = notes?.find((n) => n.status === "processing" || n.cancellation === "processing");
|
|
40
|
+
React.useEffect(() => {
|
|
41
|
+
if (!processing) return;
|
|
42
|
+
let alive = true;
|
|
43
|
+
let step = 0;
|
|
44
|
+
let timer;
|
|
45
|
+
const tick = async () => {
|
|
46
|
+
if (!alive || step >= POLL_DELAYS.length) return;
|
|
47
|
+
timer = setTimeout(async () => {
|
|
48
|
+
step++;
|
|
49
|
+
try {
|
|
50
|
+
const fresh = await orderNotes.read(processing.documentId);
|
|
51
|
+
if (!alive) return;
|
|
52
|
+
setNotes((list) => list?.map((n) => n.documentId === fresh.documentId ? fresh : n) ?? null);
|
|
53
|
+
if (fresh.status === "processing" || fresh.cancellation === "processing") void tick();
|
|
54
|
+
else if (fresh.status === "authorized" && !fresh.cancellation) toast.success(`NFC-e n\xBA ${fresh.number ?? ""} autorizada`);
|
|
55
|
+
else if (fresh.status === "rejected") toast.error("A SEFAZ rejeitou a NFC-e", { description: fresh.rejection?.message ?? void 0 });
|
|
56
|
+
} catch {
|
|
57
|
+
void tick();
|
|
58
|
+
}
|
|
59
|
+
}, POLL_DELAYS[step] * 1e3);
|
|
60
|
+
};
|
|
61
|
+
void tick();
|
|
62
|
+
return () => {
|
|
63
|
+
alive = false;
|
|
64
|
+
clearTimeout(timer);
|
|
65
|
+
};
|
|
66
|
+
}, [processing?.documentId, processing?.status, processing?.cancellation]);
|
|
67
|
+
if (!orderId) return null;
|
|
68
|
+
const current = notes?.[0] ?? null;
|
|
69
|
+
const earlier = notes?.slice(1) ?? [];
|
|
70
|
+
const failed = current?.status === "rejected" || current?.status === "error";
|
|
71
|
+
const canIssue = notes !== null && !error && (!current || failed || current.status === "cancelled");
|
|
72
|
+
const issue = async () => {
|
|
73
|
+
setIssuing(true);
|
|
74
|
+
try {
|
|
75
|
+
const note = await orderNotes.issueNfce(orderId);
|
|
76
|
+
setNotes((list) => [note, ...list ?? []]);
|
|
77
|
+
if (note.status === "rejected") toast.error("A NFC-e foi recusada", { description: reasonOf(note) ?? void 0 });
|
|
78
|
+
else toast.success("NFC-e enviada. Aguardando a SEFAZ\u2026");
|
|
79
|
+
} catch (e) {
|
|
80
|
+
toast.error("N\xE3o foi poss\xEDvel emitir a NFC-e", { description: noteErrorSentence(e) });
|
|
81
|
+
} finally {
|
|
82
|
+
setIssuing(false);
|
|
83
|
+
}
|
|
84
|
+
};
|
|
85
|
+
return /* @__PURE__ */ jsxs(
|
|
86
|
+
OrderDetailBlock,
|
|
87
|
+
{
|
|
88
|
+
title: "Nota fiscal",
|
|
89
|
+
actions: canIssue && !failed ? /* @__PURE__ */ jsxs(Button, { size: "sm", onClick: () => void issue(), disabled: issuing, children: [
|
|
90
|
+
/* @__PURE__ */ jsx(FileText, { className: "mr-1.5 h-4 w-4" }),
|
|
91
|
+
issuing ? "Emitindo\u2026" : "Emitir NFC-e"
|
|
92
|
+
] }) : void 0,
|
|
93
|
+
children: [
|
|
94
|
+
error && /* @__PURE__ */ jsxs("div", { className: "flex items-center justify-between gap-3 text-sm", children: [
|
|
95
|
+
/* @__PURE__ */ jsx("span", { className: "text-muted-foreground", children: error }),
|
|
96
|
+
/* @__PURE__ */ jsx(Button, { variant: "ghost", size: "sm", onClick: () => void load(), children: /* @__PURE__ */ jsx(RefreshCw, { className: "h-4 w-4" }) })
|
|
97
|
+
] }),
|
|
98
|
+
!error && notes === null && /* @__PURE__ */ jsx(Skeleton, { className: "h-10 w-full" }),
|
|
99
|
+
!error && current === null && notes !== null && /* @__PURE__ */ jsx("p", { className: "text-sm text-muted-foreground", children: "Nenhuma nota emitida para este pedido." }),
|
|
100
|
+
!error && current && current.status === "processing" && /* @__PURE__ */ jsxs("div", { className: "flex items-center gap-2 text-sm text-muted-foreground", children: [
|
|
101
|
+
/* @__PURE__ */ jsx(Loader2, { className: "h-4 w-4 animate-spin" }),
|
|
102
|
+
current.uncertain ? "Aguardando a resposta da SEFAZ\u2026" : "Enviando \xE0 SEFAZ\u2026"
|
|
103
|
+
] }),
|
|
104
|
+
!error && current && failed && /* @__PURE__ */ jsxs("div", { className: "space-y-2 rounded-md border border-destructive/30 bg-destructive/5 p-3 text-sm", children: [
|
|
105
|
+
/* @__PURE__ */ jsxs("p", { className: "flex items-center gap-1.5 font-medium text-destructive", children: [
|
|
106
|
+
/* @__PURE__ */ jsx(AlertCircle, { className: "h-4 w-4" }),
|
|
107
|
+
current.status === "rejected" ? "A SEFAZ recusou a NFC-e" : "N\xE3o foi poss\xEDvel emitir a NFC-e"
|
|
108
|
+
] }),
|
|
109
|
+
reasonOf(current) && /* @__PURE__ */ jsx("p", { children: reasonOf(current) }),
|
|
110
|
+
/* @__PURE__ */ jsx("p", { className: "text-xs text-muted-foreground", children: "Nenhuma nota foi emitida: n\xE3o h\xE1 o que cancelar. Corrija o motivo e emita de novo." }),
|
|
111
|
+
/* @__PURE__ */ jsx("div", { className: "flex justify-end", children: /* @__PURE__ */ jsxs(Button, { size: "sm", onClick: () => void issue(), disabled: issuing, children: [
|
|
112
|
+
/* @__PURE__ */ jsx(RotateCcw, { className: "mr-1.5 h-4 w-4" }),
|
|
113
|
+
issuing ? "Emitindo\u2026" : "Emitir novamente"
|
|
114
|
+
] }) })
|
|
115
|
+
] }),
|
|
116
|
+
!error && current && (current.status === "authorized" || current.status === "cancelled" || current.status === "substituted") && /* @__PURE__ */ jsx(NoteDetails, { note: current, onCancel: () => setCancelling(current) }),
|
|
117
|
+
!error && earlier.length > 0 && /* @__PURE__ */ jsxs("details", { className: "mt-3 text-xs text-muted-foreground", children: [
|
|
118
|
+
/* @__PURE__ */ jsxs("summary", { className: "cursor-pointer select-none", children: [
|
|
119
|
+
"Tentativas anteriores (",
|
|
120
|
+
earlier.length,
|
|
121
|
+
")"
|
|
122
|
+
] }),
|
|
123
|
+
/* @__PURE__ */ jsx("ul", { className: "mt-2 space-y-1.5", children: earlier.map((n) => /* @__PURE__ */ jsxs("li", { className: "flex flex-wrap items-baseline gap-x-2", children: [
|
|
124
|
+
/* @__PURE__ */ jsx("span", { children: new Date(n.createdAt).toLocaleString("pt-BR", { dateStyle: "short", timeStyle: "short" }) }),
|
|
125
|
+
/* @__PURE__ */ jsx("span", { className: "font-medium", children: NOTE_STATUS_LABEL[n.status] }),
|
|
126
|
+
n.status === "authorized" || n.status === "cancelled" ? /* @__PURE__ */ jsxs("span", { children: [
|
|
127
|
+
"n\xBA ",
|
|
128
|
+
n.number,
|
|
129
|
+
" \xB7 s\xE9rie ",
|
|
130
|
+
n.series
|
|
131
|
+
] }) : null,
|
|
132
|
+
reasonOf(n) && /* @__PURE__ */ jsx("span", { className: "basis-full", children: reasonOf(n) })
|
|
133
|
+
] }, n.documentId)) })
|
|
134
|
+
] }),
|
|
135
|
+
cancelling && /* @__PURE__ */ jsx(
|
|
136
|
+
CancelDialog,
|
|
137
|
+
{
|
|
138
|
+
note: cancelling,
|
|
139
|
+
onClose: () => setCancelling(null),
|
|
140
|
+
onDone: (fresh) => {
|
|
141
|
+
setNotes((list) => list?.map((x) => x.documentId === fresh.documentId ? fresh : x) ?? null);
|
|
142
|
+
setCancelling(null);
|
|
143
|
+
}
|
|
144
|
+
}
|
|
145
|
+
)
|
|
146
|
+
]
|
|
147
|
+
}
|
|
148
|
+
);
|
|
149
|
+
}
|
|
150
|
+
function reasonOf(n) {
|
|
151
|
+
const raw = n.rejection?.message?.trim();
|
|
152
|
+
if (!raw) return null;
|
|
153
|
+
const text = raw.replace(/^rejei[cç][aã]o\s*:?\s*/i, "").trim();
|
|
154
|
+
return text ? text.charAt(0).toUpperCase() + text.slice(1) : null;
|
|
155
|
+
}
|
|
156
|
+
function NoteDetails({ note, onCancel }) {
|
|
157
|
+
const at = note.authorizedAt ? new Date(note.authorizedAt).toLocaleString("pt-BR", { dateStyle: "short", timeStyle: "short" }) : null;
|
|
158
|
+
return /* @__PURE__ */ jsxs("div", { className: "space-y-1.5 text-sm", children: [
|
|
159
|
+
/* @__PURE__ */ jsxs("div", { className: "flex flex-wrap items-center gap-2", children: [
|
|
160
|
+
/* @__PURE__ */ jsxs("span", { className: "font-medium", children: [
|
|
161
|
+
note.model === "nfce" ? "NFC-e" : "NF-e",
|
|
162
|
+
" n\xBA ",
|
|
163
|
+
note.number,
|
|
164
|
+
" \xB7 s\xE9rie ",
|
|
165
|
+
note.series
|
|
166
|
+
] }),
|
|
167
|
+
/* @__PURE__ */ jsx(Badge, { variant: "outline", className: tone(note.status), children: note.cancellation === "processing" ? "Cancelando\u2026" : NOTE_STATUS_LABEL[note.status] }),
|
|
168
|
+
note.environment === "homologation" && /* @__PURE__ */ jsx(Badge, { variant: "outline", className: "text-muted-foreground", children: "Homologa\xE7\xE3o" })
|
|
169
|
+
] }),
|
|
170
|
+
at && /* @__PURE__ */ jsxs("p", { className: "text-xs text-muted-foreground", children: [
|
|
171
|
+
"Autorizada em ",
|
|
172
|
+
at
|
|
173
|
+
] }),
|
|
174
|
+
note.accessKey && /* @__PURE__ */ jsx("p", { className: "break-all font-mono text-xs text-muted-foreground", children: note.accessKey.replace(/(\d{4})(?=\d)/g, "$1 ") }),
|
|
175
|
+
note.status === "cancelled" && note.cancelReason && /* @__PURE__ */ jsxs("p", { className: "text-xs text-muted-foreground", children: [
|
|
176
|
+
"Cancelada: ",
|
|
177
|
+
note.cancelReason
|
|
178
|
+
] }),
|
|
179
|
+
/* @__PURE__ */ jsxs("div", { className: "flex flex-wrap gap-2 pt-1", children: [
|
|
180
|
+
/* @__PURE__ */ jsxs(Button, { variant: "outline", size: "sm", onClick: () => void orderNotes.pdf(note.documentId).then((b) => openFile(b, `nfce-${note.number ?? note.documentId}.pdf`, false)).catch((e) => toast.error("N\xE3o foi poss\xEDvel abrir o DANFE", { description: noteErrorSentence(e) })), children: [
|
|
181
|
+
/* @__PURE__ */ jsx(FileText, { className: "mr-1.5 h-4 w-4" }),
|
|
182
|
+
"DANFE"
|
|
183
|
+
] }),
|
|
184
|
+
/* @__PURE__ */ jsxs(Button, { variant: "outline", size: "sm", onClick: () => void orderNotes.xml(note.documentId).then((b) => openFile(b, `nfce-${note.number ?? note.documentId}.xml`, true)).catch((e) => toast.error("N\xE3o foi poss\xEDvel baixar o XML", { description: noteErrorSentence(e) })), children: [
|
|
185
|
+
/* @__PURE__ */ jsx(Download, { className: "mr-1.5 h-4 w-4" }),
|
|
186
|
+
"XML"
|
|
187
|
+
] }),
|
|
188
|
+
note.status === "authorized" && !note.cancellation && /* @__PURE__ */ jsx(Button, { variant: "ghost", size: "sm", className: "text-destructive", onClick: onCancel, children: "Cancelar nota" })
|
|
189
|
+
] })
|
|
190
|
+
] });
|
|
191
|
+
}
|
|
192
|
+
function CancelDialog({ note, onClose, onDone }) {
|
|
193
|
+
const [text, setText] = React.useState("");
|
|
194
|
+
const [sending, setSending] = React.useState(false);
|
|
195
|
+
const ok = text.trim().length >= CANCEL_MIN_JUSTIFICATION;
|
|
196
|
+
const send = async () => {
|
|
197
|
+
setSending(true);
|
|
198
|
+
try {
|
|
199
|
+
const fresh = await orderNotes.cancel(note.documentId, text.trim());
|
|
200
|
+
toast.success("Cancelamento enviado. Aguardando a SEFAZ\u2026");
|
|
201
|
+
onDone(fresh);
|
|
202
|
+
} catch (e) {
|
|
203
|
+
toast.error("N\xE3o foi poss\xEDvel cancelar a nota", { description: noteErrorSentence(e) });
|
|
204
|
+
} finally {
|
|
205
|
+
setSending(false);
|
|
206
|
+
}
|
|
207
|
+
};
|
|
208
|
+
return /* @__PURE__ */ jsx(Modal, { open: true, onOpenChange: (open) => {
|
|
209
|
+
if (!open) onClose();
|
|
210
|
+
}, children: /* @__PURE__ */ jsxs(ModalContent, { children: [
|
|
211
|
+
/* @__PURE__ */ jsxs(ModalHeader, { children: [
|
|
212
|
+
/* @__PURE__ */ jsxs(ModalTitle, { children: [
|
|
213
|
+
"Cancelar NFC-e",
|
|
214
|
+
note.number ? ` n\xBA ${note.number}` : ""
|
|
215
|
+
] }),
|
|
216
|
+
/* @__PURE__ */ jsx(ModalDescription, { children: "A SEFAZ s\xF3 aceita o cancelamento de uma NFC-e logo depois da emiss\xE3o (em geral, 30 minutos). Para emitir uma NF-e no lugar, cancele primeiro esta nota." })
|
|
217
|
+
] }),
|
|
218
|
+
/* @__PURE__ */ jsx(
|
|
219
|
+
Textarea,
|
|
220
|
+
{
|
|
221
|
+
value: text,
|
|
222
|
+
onChange: (e) => setText(e.target.value),
|
|
223
|
+
placeholder: "Ex.: Emiss\xE3o em duplicidade por erro operacional",
|
|
224
|
+
rows: 3
|
|
225
|
+
}
|
|
226
|
+
),
|
|
227
|
+
/* @__PURE__ */ jsxs("p", { className: "text-xs text-muted-foreground", children: [
|
|
228
|
+
"Pelo menos ",
|
|
229
|
+
CANCEL_MIN_JUSTIFICATION,
|
|
230
|
+
" caracteres."
|
|
231
|
+
] }),
|
|
232
|
+
/* @__PURE__ */ jsxs(ModalFooter, { children: [
|
|
233
|
+
/* @__PURE__ */ jsx(Button, { variant: "outline", onClick: onClose, disabled: sending, children: "Voltar" }),
|
|
234
|
+
/* @__PURE__ */ jsx(Button, { variant: "destructive", onClick: () => void send(), disabled: !ok || sending, children: sending ? "Cancelando\u2026" : "Cancelar nota" })
|
|
235
|
+
] })
|
|
236
|
+
] }) });
|
|
237
|
+
}
|
|
238
|
+
|
|
239
|
+
export { OrderNoteCard };
|
|
240
|
+
//# sourceMappingURL=chunk-G7T5YMNY.js.map
|
|
241
|
+
//# sourceMappingURL=chunk-G7T5YMNY.js.map
|