@fayz-ai/plugin-fiscal-br 0.13.3 → 0.13.5
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 -9251
- package/dist/index.js.map +1 -1
- package/dist/migrations/index.d.ts +2 -1
- package/dist/migrations/index.d.ts.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,498 @@
|
|
|
1
|
+
import { orderNotes, noteErrorSentence } from './chunk-RZT2BO6E.js';
|
|
2
|
+
import { useState, useCallback, useEffect } from 'react';
|
|
3
|
+
import { CheckCircle2, Loader2, FileCheck2, ChevronDown, AlertTriangle, FileText, RefreshCw, XCircle } from 'lucide-react';
|
|
4
|
+
import { TooltipProvider, Tooltip, TooltipTrigger, Button, TooltipContent, Modal, ModalContent, ModalHeader, ModalTitle, ModalDescription, ModalBody, Badge, SegmentedControl, Skeleton, toast } from '@fayz-ai/ui';
|
|
5
|
+
import { usePermissionOptional } from '@fayz-ai/admin';
|
|
6
|
+
import { getSupabaseClientOptional, describeError, formatCurrency } from '@fayz-ai/core';
|
|
7
|
+
import { jsxs, Fragment, jsx } from 'react/jsx-runtime';
|
|
8
|
+
|
|
9
|
+
function sb() {
|
|
10
|
+
const supabase = getSupabaseClientOptional();
|
|
11
|
+
if (!supabase) throw new Error("Supabase not initialized");
|
|
12
|
+
return supabase;
|
|
13
|
+
}
|
|
14
|
+
var NOTE_COLUMNS = `document_id, model, status, environment, number, series, access_key,
|
|
15
|
+
verification_code, provider_integration_id, total_value, recipient_snapshot, rejection_payload,
|
|
16
|
+
created_at, authorized_at, cancelled_at, cancel_reason`;
|
|
17
|
+
function toNote(r) {
|
|
18
|
+
return {
|
|
19
|
+
documentId: r.document_id,
|
|
20
|
+
model: r.model,
|
|
21
|
+
status: r.status,
|
|
22
|
+
environment: r.environment ?? null,
|
|
23
|
+
number: r.number ?? null,
|
|
24
|
+
series: r.series ?? null,
|
|
25
|
+
accessKey: r.access_key ?? null,
|
|
26
|
+
verificationCode: r.verification_code ?? null,
|
|
27
|
+
integrationId: r.provider_integration_id ?? null,
|
|
28
|
+
totalValue: r.total_value == null ? null : Number(r.total_value),
|
|
29
|
+
recipient: r.recipient_snapshot ?? null,
|
|
30
|
+
rejection: r.rejection_payload ?? null,
|
|
31
|
+
createdAt: r.created_at,
|
|
32
|
+
authorizedAt: r.authorized_at ?? null,
|
|
33
|
+
cancelledAt: r.cancelled_at ?? null,
|
|
34
|
+
cancelReason: r.cancel_reason ?? null
|
|
35
|
+
};
|
|
36
|
+
}
|
|
37
|
+
async function listInvoiceNotes(invoiceId) {
|
|
38
|
+
const db = sb();
|
|
39
|
+
const { data: inv, error: invError } = await db.from("plg_financial_invoices").select("order_id").eq("id", invoiceId).maybeSingle();
|
|
40
|
+
if (invError) throw invError;
|
|
41
|
+
const orderId = inv?.order_id ?? null;
|
|
42
|
+
if (!orderId) return [];
|
|
43
|
+
const [linked, direct] = await Promise.all([
|
|
44
|
+
db.from("plg_fiscalbr_document_orders").select("document_id").eq("order_id", orderId),
|
|
45
|
+
db.from("plg_fiscalbr_documents").select(NOTE_COLUMNS).eq("order_id", orderId)
|
|
46
|
+
]);
|
|
47
|
+
if (linked.error) throw linked.error;
|
|
48
|
+
if (direct.error) throw direct.error;
|
|
49
|
+
const byId = /* @__PURE__ */ new Map();
|
|
50
|
+
for (const r of direct.data ?? []) byId.set(r.document_id, toNote(r));
|
|
51
|
+
const missing = (linked.data ?? []).map((r) => r.document_id).filter((id) => !byId.has(id));
|
|
52
|
+
if (missing.length) {
|
|
53
|
+
const { data, error } = await db.from("plg_fiscalbr_documents").select(NOTE_COLUMNS).in("document_id", missing);
|
|
54
|
+
if (error) throw error;
|
|
55
|
+
for (const r of data ?? []) byId.set(r.document_id, toNote(r));
|
|
56
|
+
}
|
|
57
|
+
return [...byId.values()].sort((a, b) => b.createdAt.localeCompare(a.createdAt));
|
|
58
|
+
}
|
|
59
|
+
async function listNoteEvents(documentId) {
|
|
60
|
+
const { data, error } = await sb().from("plg_fiscalbr_document_events").select("id, event_type, status, justification, created_at").eq("document_id", documentId).order("created_at", { ascending: false }).limit(30);
|
|
61
|
+
if (error) throw error;
|
|
62
|
+
return (data ?? []).map((e) => ({
|
|
63
|
+
id: e.id,
|
|
64
|
+
eventType: e.event_type,
|
|
65
|
+
status: e.status ?? null,
|
|
66
|
+
justification: e.justification ?? null,
|
|
67
|
+
createdAt: e.created_at
|
|
68
|
+
}));
|
|
69
|
+
}
|
|
70
|
+
async function refreshNote(documentId) {
|
|
71
|
+
try {
|
|
72
|
+
return (await orderNotes.read(documentId)).status;
|
|
73
|
+
} catch (error) {
|
|
74
|
+
throw new Error(noteErrorSentence(error));
|
|
75
|
+
}
|
|
76
|
+
}
|
|
77
|
+
async function cancelNote(documentId, justification) {
|
|
78
|
+
try {
|
|
79
|
+
return (await orderNotes.cancel(documentId, justification)).status;
|
|
80
|
+
} catch (error) {
|
|
81
|
+
throw new Error(noteErrorSentence(error));
|
|
82
|
+
}
|
|
83
|
+
}
|
|
84
|
+
async function fetchNotePdf(documentId) {
|
|
85
|
+
try {
|
|
86
|
+
return await orderNotes.pdf(documentId);
|
|
87
|
+
} catch (error) {
|
|
88
|
+
throw new Error(noteErrorSentence(error));
|
|
89
|
+
}
|
|
90
|
+
}
|
|
91
|
+
|
|
92
|
+
// src/lib/issued-note.ts
|
|
93
|
+
var MODEL_LABEL = { nfse: "NFS-e", nfce: "NFC-e", nfe: "NF-e" };
|
|
94
|
+
var STATUS_META = {
|
|
95
|
+
authorized: { label: "Autorizada", tone: "success" },
|
|
96
|
+
draft: { label: "Enviando", tone: "warning" },
|
|
97
|
+
processing: { label: "Processando", tone: "warning" },
|
|
98
|
+
rejected: { label: "Rejeitada", tone: "danger" },
|
|
99
|
+
denied: { label: "Denegada", tone: "danger" },
|
|
100
|
+
error: { label: "Erro", tone: "danger" },
|
|
101
|
+
cancelled: { label: "Cancelada", tone: "muted" },
|
|
102
|
+
substituted: { label: "Substitu\xEDda", tone: "muted" }
|
|
103
|
+
};
|
|
104
|
+
var EVENT_LABEL = {
|
|
105
|
+
emissao: "Emiss\xE3o enviada",
|
|
106
|
+
consulta: "Consulta de status",
|
|
107
|
+
cancelamento: "Cancelamento",
|
|
108
|
+
substituicao: "Substitui\xE7\xE3o",
|
|
109
|
+
cce: "Carta de corre\xE7\xE3o",
|
|
110
|
+
inutilizacao: "Inutiliza\xE7\xE3o",
|
|
111
|
+
webhook: "Notifica\xE7\xE3o do emissor fiscal",
|
|
112
|
+
erro: "Erro"
|
|
113
|
+
};
|
|
114
|
+
var EVENT_STATUS_LABEL = {
|
|
115
|
+
CRIADO: "Enviando",
|
|
116
|
+
PROCESSANDO: "Processando",
|
|
117
|
+
CONCLUIDO: "Autorizada",
|
|
118
|
+
REJEITADO: "Rejeitada",
|
|
119
|
+
DENEGADO: "Denegada",
|
|
120
|
+
CANCELADO: "Cancelada",
|
|
121
|
+
SUBSTITUIDO: "Substitu\xEDda",
|
|
122
|
+
SOLICITADO: "Solicitado",
|
|
123
|
+
ERRO: "Erro"
|
|
124
|
+
};
|
|
125
|
+
function eventStatusLabel(status) {
|
|
126
|
+
return status ? EVENT_STATUS_LABEL[status.toUpperCase()] ?? null : null;
|
|
127
|
+
}
|
|
128
|
+
var IN_FLIGHT = ["draft", "processing"];
|
|
129
|
+
var WITHOUT_EFFECT = ["rejected", "denied", "error", "cancelled", "substituted"];
|
|
130
|
+
function isWithoutEffect(status) {
|
|
131
|
+
return WITHOUT_EFFECT.includes(status);
|
|
132
|
+
}
|
|
133
|
+
function statusLabel(note) {
|
|
134
|
+
if (IN_FLIGHT.includes(note.status) && note.cancelledAt) return "Cancelamento solicitado";
|
|
135
|
+
return (STATUS_META[note.status] ?? STATUS_META.error).label;
|
|
136
|
+
}
|
|
137
|
+
function summarizeNotes(notes) {
|
|
138
|
+
const s = { hasValid: false, withoutEffect: 0, inFlight: 0, validIsTest: false };
|
|
139
|
+
for (const n of notes) {
|
|
140
|
+
if (n.status === "authorized") {
|
|
141
|
+
s.hasValid = true;
|
|
142
|
+
if (n.environment === "homologacao") s.validIsTest = true;
|
|
143
|
+
} else if (IN_FLIGHT.includes(n.status)) s.inFlight += 1;
|
|
144
|
+
else if (WITHOUT_EFFECT.includes(n.status)) s.withoutEffect += 1;
|
|
145
|
+
}
|
|
146
|
+
return s;
|
|
147
|
+
}
|
|
148
|
+
function notesButtonState(s) {
|
|
149
|
+
if (s.hasValid) return "authorized";
|
|
150
|
+
if (s.inFlight > 0) return "processing";
|
|
151
|
+
if (s.withoutEffect > 0) return "failed-only";
|
|
152
|
+
return "none";
|
|
153
|
+
}
|
|
154
|
+
var SEFAZ_HINTS = [
|
|
155
|
+
["E0120", "no padr\xE3o nacional a Inscri\xE7\xE3o Municipal \xE9 opcional (a nota identifica pelo CNPJ). Apague a IM na configura\xE7\xE3o fiscal da unidade e emita de novo."],
|
|
156
|
+
["E0312", "geralmente falta o C\xD3DIGO DE TRIBUTA\xC7\xC3O DO MUNIC\xCDPIO (3 d\xEDgitos) na configura\xE7\xE3o fiscal da unidade \u2014 n\xE3o o nacional. Cada prefeitura tem a sua tabela; confirme o c\xF3digo com a contabilidade."],
|
|
157
|
+
["E0314", "o c\xF3digo de tributa\xE7\xE3o do munic\xEDpio n\xE3o existe na tabela daquela prefeitura. Confirme o valor com a contabilidade da unidade \u2014 ele n\xE3o \xE9 o mesmo em todo munic\xEDpio. Fora do Rio de Janeiro, o normal \xE9 deixar esse campo VAZIO."],
|
|
158
|
+
["E0084", "o CNPJ n\xE3o consta como estabelecido nesse munic\xEDpio no cadastro nacional. Isso se resolve FORA do sistema: a empresa precisa ter inscri\xE7\xE3o municipal ativa na prefeitura e o endere\xE7o do CNPJ na Receita Federal apontando para o mesmo munic\xEDpio. Fale com a contabilidade \u2014 n\xE3o h\xE1 o que ajustar aqui."]
|
|
159
|
+
];
|
|
160
|
+
var FIELD_LABELS = {
|
|
161
|
+
"prestador.cpfCnpj": "CNPJ do emitente",
|
|
162
|
+
"tomador.cpfCnpj": "CPF/CNPJ do cliente",
|
|
163
|
+
"tomador.razaoSocial": "Nome do cliente",
|
|
164
|
+
"tomador.endereco.cep": "CEP do cliente",
|
|
165
|
+
"tomador.endereco.codigoCidade": "Munic\xEDpio do cliente",
|
|
166
|
+
"servico.codigo": "C\xF3digo de tributa\xE7\xE3o do servi\xE7o",
|
|
167
|
+
"servico.iss.aliquota": "Al\xEDquota de ISS",
|
|
168
|
+
"itens.ncm": "NCM do produto",
|
|
169
|
+
"itens.cfop": "CFOP do produto",
|
|
170
|
+
"pagamentos.meio": "Forma de pagamento (tPag)",
|
|
171
|
+
"emitente.inscricaoMunicipal": "Inscri\xE7\xE3o municipal",
|
|
172
|
+
"emitente.inscricaoEstadual": "Inscri\xE7\xE3o estadual"
|
|
173
|
+
};
|
|
174
|
+
function explainRejection(rejection) {
|
|
175
|
+
if (!rejection) return { summary: "Nota rejeitada sem detalhe do motivo.", fields: [] };
|
|
176
|
+
const r = Array.isArray(rejection) ? rejection[0] : rejection;
|
|
177
|
+
const err = r?.error ?? r;
|
|
178
|
+
let message = String(err?.message || r?.mensagem || r?.motivo || "Nota rejeitada.");
|
|
179
|
+
const embedded = message.match(/\[\s*\{[\s\S]*\}\s*\]/);
|
|
180
|
+
if (embedded) {
|
|
181
|
+
try {
|
|
182
|
+
const arr = JSON.parse(embedded[0]);
|
|
183
|
+
const parts = (Array.isArray(arr) ? arr : [arr]).map((e) => [e.Codigo ?? e.codigo, e.Descricao ?? e.descricao ?? e.Mensagem ?? e.mensagem].filter(Boolean).join(" \u2014 ")).filter(Boolean);
|
|
184
|
+
if (parts.length) message = parts.join("; ");
|
|
185
|
+
} catch {
|
|
186
|
+
}
|
|
187
|
+
}
|
|
188
|
+
const hint = SEFAZ_HINTS.find(([code]) => message.includes(code));
|
|
189
|
+
if (hint) message = `${message} \u2014 ${hint[1]}`;
|
|
190
|
+
const fieldsObj = err?.data?.fields ?? {};
|
|
191
|
+
const fields = Object.entries(fieldsObj).map(([field, msg]) => {
|
|
192
|
+
const normalized = field.replace(/\[\d+\]/g, "").replace(/\.\d+\./g, ".");
|
|
193
|
+
return { field, label: FIELD_LABELS[normalized] ?? field, message: String(msg) };
|
|
194
|
+
});
|
|
195
|
+
return { summary: message, fields };
|
|
196
|
+
}
|
|
197
|
+
function recipientLabel(recipient) {
|
|
198
|
+
if (!recipient) return "Consumidor final";
|
|
199
|
+
if (recipient.consumidor) return "Consumidor final";
|
|
200
|
+
return String(recipient.razaoSocial ?? recipient.nome ?? recipient.cpfCnpj ?? "Consumidor final");
|
|
201
|
+
}
|
|
202
|
+
var TONE_VARIANT = {
|
|
203
|
+
success: "success",
|
|
204
|
+
warning: "warning",
|
|
205
|
+
danger: "destructive",
|
|
206
|
+
muted: "default"
|
|
207
|
+
};
|
|
208
|
+
var dateTime = (v) => v ? new Date(v).toLocaleString("pt-BR", { dateStyle: "short", timeStyle: "short" }) : "\u2014";
|
|
209
|
+
var dayOrDateTime = (v) => {
|
|
210
|
+
if (!v) return "\u2014";
|
|
211
|
+
const d = new Date(v);
|
|
212
|
+
return d.getHours() === 0 && d.getMinutes() === 0 && d.getSeconds() === 0 ? d.toLocaleDateString("pt-BR") : dateTime(v);
|
|
213
|
+
};
|
|
214
|
+
var money = (v) => v == null ? "\u2014" : formatCurrency(v);
|
|
215
|
+
function buttonHint(s) {
|
|
216
|
+
const parts = [s.hasValid ? "Notas fiscais desta conta \u2014 h\xE1 uma nota v\xE1lida" : "Notas fiscais desta conta"];
|
|
217
|
+
if (s.withoutEffect > 0) parts.push(`${s.withoutEffect} cancelada(s), rejeitada(s) ou com erro`);
|
|
218
|
+
if (s.validIsTest) parts.push("a nota v\xE1lida \xE9 de TESTE, sem valor fiscal");
|
|
219
|
+
return parts.join(" \xB7 ");
|
|
220
|
+
}
|
|
221
|
+
function InvoiceNotesButton({ invoiceId, direction, cancelled }) {
|
|
222
|
+
const [notes, setNotes] = useState(null);
|
|
223
|
+
const [open, setOpen] = useState(false);
|
|
224
|
+
const can = usePermissionOptional();
|
|
225
|
+
const canCancel = can("financial", "edit");
|
|
226
|
+
const reload = useCallback(async () => {
|
|
227
|
+
if (!invoiceId || direction !== "credit") return;
|
|
228
|
+
try {
|
|
229
|
+
setNotes(await listInvoiceNotes(invoiceId));
|
|
230
|
+
} catch {
|
|
231
|
+
setNotes((prev) => prev ?? []);
|
|
232
|
+
}
|
|
233
|
+
}, [invoiceId, direction]);
|
|
234
|
+
useEffect(() => {
|
|
235
|
+
void reload();
|
|
236
|
+
}, [reload]);
|
|
237
|
+
if (!notes || notes.length === 0) return null;
|
|
238
|
+
const summary = summarizeNotes(notes);
|
|
239
|
+
const state = notesButtonState(summary);
|
|
240
|
+
return /* @__PURE__ */ jsxs(Fragment, { children: [
|
|
241
|
+
/* @__PURE__ */ jsx(TooltipProvider, { delayDuration: 200, children: /* @__PURE__ */ jsxs(Tooltip, { children: [
|
|
242
|
+
/* @__PURE__ */ jsx(TooltipTrigger, { asChild: true, children: /* @__PURE__ */ jsxs(Button, { type: "button", variant: "outline", size: "sm", className: "relative h-9 gap-1.5", "aria-label": "Nota Fiscal", onClick: () => setOpen(true), children: [
|
|
243
|
+
state === "authorized" ? /* @__PURE__ */ jsx(CheckCircle2, { className: "h-4 w-4 text-success", "aria-hidden": true }) : state === "processing" ? /* @__PURE__ */ jsx(Loader2, { className: "h-4 w-4 animate-spin text-warning", "aria-hidden": true }) : /* @__PURE__ */ jsx(FileCheck2, { className: "h-4 w-4", "aria-hidden": true }),
|
|
244
|
+
/* @__PURE__ */ jsx("span", { className: "hidden sm:inline", children: "Nota Fiscal" }),
|
|
245
|
+
summary.withoutEffect > 0 && /* @__PURE__ */ jsx("span", { className: "inline-flex h-4 min-w-4 items-center justify-center rounded-full bg-destructive px-1 text-[10px] font-bold text-destructive-foreground", children: summary.withoutEffect }),
|
|
246
|
+
summary.validIsTest && /* @__PURE__ */ jsx("span", { className: "rounded border border-destructive px-1 text-[10px] font-semibold text-destructive", children: "TESTE" })
|
|
247
|
+
] }) }),
|
|
248
|
+
/* @__PURE__ */ jsx(TooltipContent, { children: buttonHint(summary) })
|
|
249
|
+
] }) }),
|
|
250
|
+
/* @__PURE__ */ jsx(Modal, { open, onOpenChange: setOpen, children: /* @__PURE__ */ jsxs(ModalContent, { size: "2xl", children: [
|
|
251
|
+
/* @__PURE__ */ jsxs(ModalHeader, { children: [
|
|
252
|
+
/* @__PURE__ */ jsx(ModalTitle, { children: "Nota Fiscal" }),
|
|
253
|
+
/* @__PURE__ */ jsx(ModalDescription, { children: "Notas emitidas para esta conta." })
|
|
254
|
+
] }),
|
|
255
|
+
/* @__PURE__ */ jsxs(ModalBody, { className: "gap-2", children: [
|
|
256
|
+
notes.map((n) => /* @__PURE__ */ jsx(NoteRow, { note: n, canCancel, onChanged: reload }, n.documentId)),
|
|
257
|
+
/* @__PURE__ */ jsx("p", { className: "pt-2 text-xs text-muted-foreground", children: "Emitir uma nota nova por aqui chega na pr\xF3xima etapa." })
|
|
258
|
+
] })
|
|
259
|
+
] }) })
|
|
260
|
+
] });
|
|
261
|
+
}
|
|
262
|
+
var POLL_DELAYS = [3e3, 5e3, 8e3, 12e3, 2e4];
|
|
263
|
+
function NoteRow({ note, canCancel, onChanged }) {
|
|
264
|
+
const [expanded, setExpanded] = useState(false);
|
|
265
|
+
const [cancelling, setCancelling] = useState(false);
|
|
266
|
+
const [busy, setBusy] = useState(null);
|
|
267
|
+
const dimmed = isWithoutEffect(note.status);
|
|
268
|
+
const tone = (STATUS_META[note.status] ?? STATUS_META.error).tone;
|
|
269
|
+
const usable = note.status === "authorized" || note.status === "cancelled";
|
|
270
|
+
const inFlight = note.status === "processing" || note.status === "draft";
|
|
271
|
+
const cancellable = canCancel && note.status === "authorized" && !note.cancelledAt;
|
|
272
|
+
const openPdf = async () => {
|
|
273
|
+
const w = window.open("", "_blank");
|
|
274
|
+
setBusy("pdf");
|
|
275
|
+
try {
|
|
276
|
+
const blob = await fetchNotePdf(note.documentId);
|
|
277
|
+
const url = URL.createObjectURL(blob);
|
|
278
|
+
if (w) w.location.href = url;
|
|
279
|
+
else window.location.assign(url);
|
|
280
|
+
} catch (e) {
|
|
281
|
+
w?.close();
|
|
282
|
+
toast.error("PDF indispon\xEDvel", { description: describeError(e) });
|
|
283
|
+
} finally {
|
|
284
|
+
setBusy(null);
|
|
285
|
+
}
|
|
286
|
+
};
|
|
287
|
+
const refresh = async () => {
|
|
288
|
+
setBusy("refresh");
|
|
289
|
+
try {
|
|
290
|
+
const status = await refreshNote(note.documentId);
|
|
291
|
+
await onChanged();
|
|
292
|
+
toast(status === note.status ? "Ainda em processamento na SEFAZ/prefeitura" : `Nota ${statusLabel({ status, cancelledAt: null }).toLowerCase()}`);
|
|
293
|
+
} catch (e) {
|
|
294
|
+
toast.error("N\xE3o foi poss\xEDvel consultar", { description: describeError(e) });
|
|
295
|
+
} finally {
|
|
296
|
+
setBusy(null);
|
|
297
|
+
}
|
|
298
|
+
};
|
|
299
|
+
return /* @__PURE__ */ jsxs("div", { className: `rounded-lg border ${dimmed ? "bg-muted/30" : ""}`, children: [
|
|
300
|
+
/* @__PURE__ */ jsxs(
|
|
301
|
+
Button,
|
|
302
|
+
{
|
|
303
|
+
variant: "bare",
|
|
304
|
+
size: "bare",
|
|
305
|
+
type: "button",
|
|
306
|
+
className: "font-normal whitespace-normal justify-start flex w-full items-center gap-2 p-3 text-left",
|
|
307
|
+
onClick: () => setExpanded((v) => !v),
|
|
308
|
+
"aria-expanded": expanded,
|
|
309
|
+
children: [
|
|
310
|
+
/* @__PURE__ */ jsxs("span", { className: "flex min-w-0 flex-1 flex-wrap items-center gap-2", children: [
|
|
311
|
+
/* @__PURE__ */ jsx(Badge, { variant: "outline", children: MODEL_LABEL[note.model] ?? note.model }),
|
|
312
|
+
note.number && /* @__PURE__ */ jsxs("span", { className: "font-mono text-sm", children: [
|
|
313
|
+
"n\xBA ",
|
|
314
|
+
note.number
|
|
315
|
+
] }),
|
|
316
|
+
/* @__PURE__ */ jsx(Badge, { variant: TONE_VARIANT[tone], children: statusLabel(note) }),
|
|
317
|
+
note.environment === "homologacao" && /* @__PURE__ */ jsx("span", { className: "rounded border border-destructive px-1 text-[10px] font-semibold text-destructive", children: "TESTE" }),
|
|
318
|
+
/* @__PURE__ */ jsx("span", { className: "ml-auto text-xs tabular-nums text-muted-foreground", children: dateTime(note.createdAt) })
|
|
319
|
+
] }),
|
|
320
|
+
/* @__PURE__ */ jsx(ChevronDown, { className: `h-4 w-4 shrink-0 text-muted-foreground transition-transform ${expanded ? "rotate-180" : ""}`, "aria-hidden": true })
|
|
321
|
+
]
|
|
322
|
+
}
|
|
323
|
+
),
|
|
324
|
+
note.cancelReason && !expanded && /* @__PURE__ */ jsxs("p", { className: "flex items-start gap-1.5 px-3 pb-2 text-xs text-muted-foreground", children: [
|
|
325
|
+
/* @__PURE__ */ jsx(AlertTriangle, { className: "mt-0.5 h-3.5 w-3.5 shrink-0", "aria-hidden": true }),
|
|
326
|
+
/* @__PURE__ */ jsxs("span", { className: "break-words", children: [
|
|
327
|
+
"Motivo: ",
|
|
328
|
+
note.cancelReason
|
|
329
|
+
] })
|
|
330
|
+
] }),
|
|
331
|
+
(usable || inFlight || note.cancelledAt) && !cancelling && /* @__PURE__ */ jsxs("div", { className: "flex flex-wrap items-center gap-1.5 px-3 pb-3", children: [
|
|
332
|
+
usable && /* @__PURE__ */ jsxs(Button, { variant: "outline", size: "sm", className: "h-7 text-xs", disabled: busy === "pdf", onClick: openPdf, children: [
|
|
333
|
+
busy === "pdf" ? /* @__PURE__ */ jsx(Loader2, { className: "h-3.5 w-3.5 animate-spin", "aria-hidden": true }) : /* @__PURE__ */ jsx(FileText, { className: "h-3.5 w-3.5", "aria-hidden": true }),
|
|
334
|
+
"PDF"
|
|
335
|
+
] }),
|
|
336
|
+
(inFlight || note.cancelledAt && note.status === "authorized") && /* @__PURE__ */ jsxs(Button, { variant: "outline", size: "sm", className: "h-7 text-xs", disabled: busy === "refresh", onClick: refresh, children: [
|
|
337
|
+
busy === "refresh" ? /* @__PURE__ */ jsx(Loader2, { className: "h-3.5 w-3.5 animate-spin", "aria-hidden": true }) : /* @__PURE__ */ jsx(RefreshCw, { className: "h-3.5 w-3.5", "aria-hidden": true }),
|
|
338
|
+
"Atualizar"
|
|
339
|
+
] }),
|
|
340
|
+
cancellable && /* @__PURE__ */ jsxs(Button, { variant: "ghost", size: "sm", className: "ml-auto h-7 text-xs text-destructive hover:text-destructive", onClick: () => setCancelling(true), children: [
|
|
341
|
+
/* @__PURE__ */ jsx(XCircle, { className: "h-3.5 w-3.5", "aria-hidden": true }),
|
|
342
|
+
" Cancelar nota"
|
|
343
|
+
] })
|
|
344
|
+
] }),
|
|
345
|
+
cancelling && /* @__PURE__ */ jsx(CancelNotePanel, { note, onClose: () => setCancelling(false), onDone: async () => {
|
|
346
|
+
setCancelling(false);
|
|
347
|
+
await onChanged();
|
|
348
|
+
} }),
|
|
349
|
+
expanded && /* @__PURE__ */ jsx(NoteDetails, { note })
|
|
350
|
+
] });
|
|
351
|
+
}
|
|
352
|
+
var NFSE_REASONS = [
|
|
353
|
+
{ value: "1", label: "Erro na emiss\xE3o" },
|
|
354
|
+
{ value: "2", label: "Servi\xE7o n\xE3o prestado" },
|
|
355
|
+
{ value: "9", label: "Outros" }
|
|
356
|
+
];
|
|
357
|
+
function CancelNotePanel({ note, onClose, onDone }) {
|
|
358
|
+
const isNfse = note.model === "nfse";
|
|
359
|
+
const [code, setCode] = useState("2");
|
|
360
|
+
const [text, setText] = useState("");
|
|
361
|
+
const [working, setWorking] = useState(null);
|
|
362
|
+
const [error, setError] = useState(null);
|
|
363
|
+
const min = isNfse ? 10 : 15;
|
|
364
|
+
const missing = Math.max(0, min - text.trim().length);
|
|
365
|
+
const confirm = async () => {
|
|
366
|
+
setError(null);
|
|
367
|
+
setWorking("sending");
|
|
368
|
+
try {
|
|
369
|
+
let status = await cancelNote(note.documentId, text.trim());
|
|
370
|
+
setWorking("waiting");
|
|
371
|
+
for (const delay of POLL_DELAYS) {
|
|
372
|
+
if (status === "cancelled" || status === "authorized") break;
|
|
373
|
+
await new Promise((r) => setTimeout(r, delay));
|
|
374
|
+
try {
|
|
375
|
+
status = await refreshNote(note.documentId);
|
|
376
|
+
} catch {
|
|
377
|
+
}
|
|
378
|
+
}
|
|
379
|
+
if (status === "cancelled") toast.success(`${MODEL_LABEL[note.model]} n\xBA ${note.number ?? ""} cancelada`);
|
|
380
|
+
else if (status === "authorized") toast.error("A SEFAZ/prefeitura recusou o cancelamento", { description: "A nota continua v\xE1lida. Veja o hist\xF3rico nos detalhes." });
|
|
381
|
+
else toast("Cancelamento solicitado", { description: "A SEFAZ/prefeitura ainda est\xE1 processando. Use \xABAtualizar\xBB para conferir." });
|
|
382
|
+
await onDone();
|
|
383
|
+
} catch (e) {
|
|
384
|
+
setError(describeError(e));
|
|
385
|
+
setWorking(null);
|
|
386
|
+
}
|
|
387
|
+
};
|
|
388
|
+
return /* @__PURE__ */ jsxs("div", { className: "space-y-3 border-t bg-destructive-soft/40 px-3 py-3", children: [
|
|
389
|
+
/* @__PURE__ */ jsxs("p", { className: "text-sm font-semibold", children: [
|
|
390
|
+
"Cancelar ",
|
|
391
|
+
MODEL_LABEL[note.model],
|
|
392
|
+
" ",
|
|
393
|
+
note.number ? `n\xBA ${note.number}` : ""
|
|
394
|
+
] }),
|
|
395
|
+
/* @__PURE__ */ jsxs("p", { className: "text-xs text-muted-foreground", children: [
|
|
396
|
+
isNfse ? "O prazo de cancelamento da NFS-e \xE9 definido pelo munic\xEDpio." : "O prazo de cancelamento da NFC-e \xE9 curto (em geral ~30 minutos ap\xF3s a autoriza\xE7\xE3o, conforme a UF). Fora do prazo, a SEFAZ recusa.",
|
|
397
|
+
" ",
|
|
398
|
+
"Cancelar n\xE3o pode ser desfeito."
|
|
399
|
+
] }),
|
|
400
|
+
isNfse && /* @__PURE__ */ jsxs("div", { className: "space-y-1", children: [
|
|
401
|
+
/* @__PURE__ */ jsx("p", { className: "text-xs font-medium", children: "Motivo" }),
|
|
402
|
+
/* @__PURE__ */ jsx(SegmentedControl, { size: "sm", "aria-label": "Motivo do cancelamento", options: NFSE_REASONS, value: code, onChange: setCode })
|
|
403
|
+
] }),
|
|
404
|
+
/* @__PURE__ */ jsxs("div", { className: "space-y-1", children: [
|
|
405
|
+
/* @__PURE__ */ jsx("label", { htmlFor: `cancel-${note.documentId}`, className: "text-xs font-medium", children: "Justificativa" }),
|
|
406
|
+
/* @__PURE__ */ jsx(
|
|
407
|
+
"textarea",
|
|
408
|
+
{
|
|
409
|
+
id: `cancel-${note.documentId}`,
|
|
410
|
+
value: text,
|
|
411
|
+
onChange: (e) => setText(e.target.value),
|
|
412
|
+
maxLength: 255,
|
|
413
|
+
rows: 3,
|
|
414
|
+
disabled: !!working,
|
|
415
|
+
placeholder: isNfse ? "Descreva o motivo\u2026" : "Ex.: Emiss\xE3o em duplicidade por erro operacional",
|
|
416
|
+
className: "w-full resize-y rounded-md border bg-background px-3 py-2 text-sm",
|
|
417
|
+
autoFocus: true
|
|
418
|
+
}
|
|
419
|
+
),
|
|
420
|
+
/* @__PURE__ */ jsx("p", { className: "text-[11px] text-muted-foreground", children: missing > 0 ? `Faltam ${missing} caractere(s) \u2014 a justificativa vai para a SEFAZ/prefeitura.` : "Vai para a SEFAZ/prefeitura junto do pedido." })
|
|
421
|
+
] }),
|
|
422
|
+
error && /* @__PURE__ */ jsxs("p", { className: "flex items-start gap-1.5 rounded-md border border-destructive/40 bg-destructive-soft p-2 text-xs text-destructive-soft-foreground", children: [
|
|
423
|
+
/* @__PURE__ */ jsx(AlertTriangle, { className: "mt-0.5 h-3.5 w-3.5 shrink-0", "aria-hidden": true }),
|
|
424
|
+
" ",
|
|
425
|
+
/* @__PURE__ */ jsx("span", { className: "break-words", children: error })
|
|
426
|
+
] }),
|
|
427
|
+
/* @__PURE__ */ jsxs("div", { className: "flex flex-wrap justify-end gap-2", children: [
|
|
428
|
+
/* @__PURE__ */ jsx(Button, { variant: "outline", size: "sm", onClick: onClose, disabled: !!working, children: "Voltar" }),
|
|
429
|
+
/* @__PURE__ */ jsxs(Button, { variant: "destructive", size: "sm", onClick: confirm, disabled: !!working || missing > 0, children: [
|
|
430
|
+
working ? /* @__PURE__ */ jsx(Loader2, { className: "h-3.5 w-3.5 animate-spin", "aria-hidden": true }) : /* @__PURE__ */ jsx(XCircle, { className: "h-3.5 w-3.5", "aria-hidden": true }),
|
|
431
|
+
working === "waiting" ? "Aguardando a SEFAZ/prefeitura\u2026" : working ? "Enviando\u2026" : "Confirmar cancelamento"
|
|
432
|
+
] })
|
|
433
|
+
] })
|
|
434
|
+
] });
|
|
435
|
+
}
|
|
436
|
+
function NoteDetails({ note }) {
|
|
437
|
+
const [events, setEvents] = useState(null);
|
|
438
|
+
useEffect(() => {
|
|
439
|
+
let alive = true;
|
|
440
|
+
listNoteEvents(note.documentId).then((e) => {
|
|
441
|
+
if (alive) setEvents(e);
|
|
442
|
+
}).catch(() => {
|
|
443
|
+
if (alive) setEvents([]);
|
|
444
|
+
});
|
|
445
|
+
return () => {
|
|
446
|
+
alive = false;
|
|
447
|
+
};
|
|
448
|
+
}, [note.documentId]);
|
|
449
|
+
const failed = ["rejected", "denied", "error"].includes(note.status);
|
|
450
|
+
const rejection = failed ? explainRejection(note.rejection) : null;
|
|
451
|
+
const rows = [
|
|
452
|
+
["Refer\xEAncia", note.integrationId && /* @__PURE__ */ jsx("span", { className: "break-all font-mono text-xs", children: note.integrationId })],
|
|
453
|
+
["Chave de acesso", note.accessKey && /* @__PURE__ */ jsx("span", { className: "break-all font-mono text-xs", children: note.accessKey })],
|
|
454
|
+
["C\xF3digo de verifica\xE7\xE3o", note.verificationCode],
|
|
455
|
+
["Valor", money(note.totalValue)],
|
|
456
|
+
["Tomador", recipientLabel(note.recipient)],
|
|
457
|
+
["Criada em", dateTime(note.createdAt)],
|
|
458
|
+
["Autorizada em", note.authorizedAt && dayOrDateTime(note.authorizedAt)],
|
|
459
|
+
["Cancelada em", note.cancelledAt && `${dateTime(note.cancelledAt)}${note.cancelReason ? ` \u2014 ${note.cancelReason}` : ""}`]
|
|
460
|
+
];
|
|
461
|
+
return /* @__PURE__ */ jsxs("div", { className: "space-y-3 border-t px-3 py-3", children: [
|
|
462
|
+
/* @__PURE__ */ jsx("dl", { className: "text-sm", children: rows.filter(([, v]) => v).map(([label, value]) => /* @__PURE__ */ jsxs("div", { className: "flex gap-3 border-b py-1.5 last:border-0", children: [
|
|
463
|
+
/* @__PURE__ */ jsx("dt", { className: "w-28 shrink-0 text-muted-foreground sm:w-36", children: label }),
|
|
464
|
+
/* @__PURE__ */ jsx("dd", { className: "min-w-0 flex-1 break-words font-medium", children: value })
|
|
465
|
+
] }, label)) }),
|
|
466
|
+
rejection && /* @__PURE__ */ jsxs("div", { className: "space-y-1.5 rounded-md border border-destructive/40 bg-destructive-soft p-3", children: [
|
|
467
|
+
/* @__PURE__ */ jsx("p", { className: "text-sm font-semibold text-destructive-soft-foreground", children: "Por que foi rejeitada?" }),
|
|
468
|
+
/* @__PURE__ */ jsx("p", { className: "text-sm text-foreground", children: rejection.summary }),
|
|
469
|
+
rejection.fields.length > 0 && /* @__PURE__ */ jsx("ul", { className: "space-y-1 text-xs text-foreground", children: rejection.fields.map((f) => /* @__PURE__ */ jsxs("li", { children: [
|
|
470
|
+
/* @__PURE__ */ jsxs("span", { className: "font-medium", children: [
|
|
471
|
+
f.label,
|
|
472
|
+
":"
|
|
473
|
+
] }),
|
|
474
|
+
" ",
|
|
475
|
+
f.message
|
|
476
|
+
] }, f.field)) })
|
|
477
|
+
] }),
|
|
478
|
+
events === null ? /* @__PURE__ */ jsxs("div", { className: "space-y-1.5", children: [
|
|
479
|
+
/* @__PURE__ */ jsx(Skeleton, { className: "h-4 w-3/4" }),
|
|
480
|
+
/* @__PURE__ */ jsx(Skeleton, { className: "h-4 w-2/3" })
|
|
481
|
+
] }) : events.length > 0 && /* @__PURE__ */ jsxs("div", { children: [
|
|
482
|
+
/* @__PURE__ */ jsx("p", { className: "mb-1.5 text-sm font-semibold", children: "Hist\xF3rico" }),
|
|
483
|
+
/* @__PURE__ */ jsx("ul", { className: "space-y-1", children: events.map((e) => /* @__PURE__ */ jsxs("li", { className: "flex flex-wrap items-center gap-2 text-xs", children: [
|
|
484
|
+
/* @__PURE__ */ jsx("span", { className: "whitespace-nowrap tabular-nums text-muted-foreground", children: dateTime(e.createdAt) }),
|
|
485
|
+
/* @__PURE__ */ jsx(Badge, { variant: "outline", className: "text-[10px]", children: EVENT_LABEL[e.eventType] ?? "Evento" }),
|
|
486
|
+
eventStatusLabel(e.status) && /* @__PURE__ */ jsx("span", { className: "text-muted-foreground", children: eventStatusLabel(e.status) }),
|
|
487
|
+
e.justification && /* @__PURE__ */ jsxs("span", { className: "min-w-0 truncate", children: [
|
|
488
|
+
"\u2014 ",
|
|
489
|
+
e.justification
|
|
490
|
+
] })
|
|
491
|
+
] }, e.id)) })
|
|
492
|
+
] })
|
|
493
|
+
] });
|
|
494
|
+
}
|
|
495
|
+
|
|
496
|
+
export { EVENT_LABEL, InvoiceNotesButton, MODEL_LABEL, STATUS_META, cancelNote, eventStatusLabel, explainRejection, fetchNotePdf, isWithoutEffect, listInvoiceNotes, listNoteEvents, notesButtonState, recipientLabel, refreshNote, statusLabel, summarizeNotes };
|
|
497
|
+
//# sourceMappingURL=chunk-WID54RUV.js.map
|
|
498
|
+
//# sourceMappingURL=chunk-WID54RUV.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/data/issued.ts","../src/lib/issued-note.ts","../src/views/InvoiceNotesButton.tsx"],"names":[],"mappings":"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","file":"chunk-WID54RUV.js","sourcesContent":["import { getSupabaseClientOptional } from '@fayz-ai/core'\nimport { getActiveTenantId } from '@fayz-ai/admin'\nimport type { IssuedNote, IssuedNoteEvent } from '../lib/issued-note'\nimport { noteErrorSentence, orderNotes } from '../lib/notes'\n\nfunction sb() {\n const supabase = getSupabaseClientOptional() as any\n if (!supabase) throw new Error('Supabase not initialized')\n return supabase\n}\n\nconst NOTE_COLUMNS = `document_id, model, status, environment, number, series, access_key,\n verification_code, provider_integration_id, total_value, recipient_snapshot, rejection_payload,\n created_at, authorized_at, cancelled_at, cancel_reason`\n\nfunction toNote(r: any): IssuedNote {\n return {\n documentId: r.document_id,\n model: r.model,\n status: r.status,\n environment: r.environment ?? null,\n number: r.number ?? null,\n series: r.series ?? null,\n accessKey: r.access_key ?? null,\n verificationCode: r.verification_code ?? null,\n integrationId: r.provider_integration_id ?? null,\n totalValue: r.total_value == null ? null : Number(r.total_value),\n recipient: r.recipient_snapshot ?? null,\n rejection: r.rejection_payload ?? null,\n createdAt: r.created_at,\n authorizedAt: r.authorized_at ?? null,\n cancelledAt: r.cancelled_at ?? null,\n cancelReason: r.cancel_reason ?? null,\n }\n}\n\n/**\n * The notes of a financial invoice, reached through its order: a note covers\n * orders (N:N `plg_fiscalbr_document_orders`) or was issued straight from one\n * (`plg_fiscalbr_documents.order_id`, the restaurant tab).\n */\nexport async function listInvoiceNotes(invoiceId: string): Promise<IssuedNote[]> {\n const db = sb()\n const { data: inv, error: invError } = await db.from('plg_financial_invoices')\n .select('order_id').eq('id', invoiceId).maybeSingle()\n if (invError) throw invError\n const orderId: string | null = inv?.order_id ?? null\n if (!orderId) return []\n\n const [linked, direct] = await Promise.all([\n db.from('plg_fiscalbr_document_orders').select('document_id').eq('order_id', orderId),\n db.from('plg_fiscalbr_documents').select(NOTE_COLUMNS).eq('order_id', orderId),\n ])\n if (linked.error) throw linked.error\n if (direct.error) throw direct.error\n\n const byId = new Map<string, IssuedNote>()\n for (const r of direct.data ?? []) byId.set(r.document_id, toNote(r))\n const missing = (linked.data ?? []).map((r: any) => r.document_id as string).filter((id: string) => !byId.has(id))\n if (missing.length) {\n const { data, error } = await db.from('plg_fiscalbr_documents').select(NOTE_COLUMNS).in('document_id', missing)\n if (error) throw error\n for (const r of data ?? []) byId.set(r.document_id, toNote(r))\n }\n return [...byId.values()].sort((a, b) => b.createdAt.localeCompare(a.createdAt))\n}\n\nexport async function listNoteEvents(documentId: string): Promise<IssuedNoteEvent[]> {\n const { data, error } = await sb().from('plg_fiscalbr_document_events')\n .select('id, event_type, status, justification, created_at')\n .eq('document_id', documentId)\n .order('created_at', { ascending: false })\n .limit(30)\n if (error) throw error\n return (data ?? []).map((e: any) => ({\n id: e.id, eventType: e.event_type, status: e.status ?? null,\n justification: e.justification ?? null, createdAt: e.created_at,\n }))\n}\n\n/** Asks PlugNotas for the note's current state, through the integration service; returns the stored status. */\nexport async function refreshNote(documentId: string): Promise<string> {\n try {\n return (await orderNotes.read(documentId)).status\n } catch (error) {\n throw new Error(noteErrorSentence(error))\n }\n}\n\nexport async function cancelNote(documentId: string, justification: string): Promise<string> {\n try {\n return (await orderNotes.cancel(documentId, justification)).status\n } catch (error) {\n throw new Error(noteErrorSentence(error))\n }\n}\n\nexport async function fetchNotePdf(documentId: string): Promise<Blob> {\n try {\n return await orderNotes.pdf(documentId)\n } catch (error) {\n throw new Error(noteErrorSentence(error))\n }\n}\n","// Vocabulary and reading rules for an issued note (plg_fiscalbr_documents),\n// shared by every screen that shows one.\n\nexport type IssuedNoteModel = 'nfse' | 'nfce' | 'nfe'\nexport type IssuedNoteStatus =\n | 'draft' | 'processing' | 'authorized' | 'rejected' | 'error' | 'cancelled' | 'substituted' | 'denied'\n\nexport interface IssuedNote {\n documentId: string\n model: IssuedNoteModel\n status: IssuedNoteStatus\n environment: 'producao' | 'homologacao' | null\n number: string | null\n series: string | null\n accessKey: string | null\n verificationCode: string | null\n integrationId: string | null\n totalValue: number | null\n recipient: Record<string, unknown> | null\n rejection: unknown\n createdAt: string\n authorizedAt: string | null\n cancelledAt: string | null\n cancelReason: string | null\n}\n\nexport interface IssuedNoteEvent {\n id: string\n eventType: string\n status: string | null\n justification: string | null\n createdAt: string\n}\n\nexport const MODEL_LABEL: Record<IssuedNoteModel, string> = { nfse: 'NFS-e', nfce: 'NFC-e', nfe: 'NF-e' }\n\nexport type StatusTone = 'success' | 'warning' | 'danger' | 'muted'\n\nexport const STATUS_META: Record<IssuedNoteStatus, { label: string; tone: StatusTone }> = {\n authorized: { label: 'Autorizada', tone: 'success' },\n draft: { label: 'Enviando', tone: 'warning' },\n processing: { label: 'Processando', tone: 'warning' },\n rejected: { label: 'Rejeitada', tone: 'danger' },\n denied: { label: 'Denegada', tone: 'danger' },\n error: { label: 'Erro', tone: 'danger' },\n cancelled: { label: 'Cancelada', tone: 'muted' },\n substituted: { label: 'Substituída', tone: 'muted' },\n}\n\nexport const EVENT_LABEL: Record<string, string> = {\n emissao: 'Emissão enviada',\n consulta: 'Consulta de status',\n cancelamento: 'Cancelamento',\n substituicao: 'Substituição',\n cce: 'Carta de correção',\n inutilizacao: 'Inutilização',\n webhook: 'Notificação do emissor fiscal',\n erro: 'Erro',\n}\n\n// Provider/V1 words on the trail. Internal steps (nfce_start…) have no\n// translation on purpose: they show nothing rather than the raw code.\nconst EVENT_STATUS_LABEL: Record<string, string> = {\n CRIADO: 'Enviando', PROCESSANDO: 'Processando', CONCLUIDO: 'Autorizada', REJEITADO: 'Rejeitada',\n DENEGADO: 'Denegada', CANCELADO: 'Cancelada', SUBSTITUIDO: 'Substituída', SOLICITADO: 'Solicitado', ERRO: 'Erro',\n}\n\nexport function eventStatusLabel(status: string | null): string | null {\n return status ? EVENT_STATUS_LABEL[status.toUpperCase()] ?? null : null\n}\n\nconst IN_FLIGHT: IssuedNoteStatus[] = ['draft', 'processing']\nconst WITHOUT_EFFECT: IssuedNoteStatus[] = ['rejected', 'denied', 'error', 'cancelled', 'substituted']\n\nexport function isWithoutEffect(status: IssuedNoteStatus): boolean {\n return WITHOUT_EFFECT.includes(status)\n}\n\n/** A cancellation in progress sits in `processing` exactly like an issue in progress. */\nexport function statusLabel(note: Pick<IssuedNote, 'status' | 'cancelledAt'>): string {\n if (IN_FLIGHT.includes(note.status) && note.cancelledAt) return 'Cancelamento solicitado'\n return (STATUS_META[note.status] ?? STATUS_META.error).label\n}\n\nexport interface NotesSummary {\n hasValid: boolean\n withoutEffect: number\n inFlight: number\n /** Only an AUTHORIZED test note misleads; a rejected one in homologação fools nobody. */\n validIsTest: boolean\n}\n\nexport function summarizeNotes(notes: Pick<IssuedNote, 'status' | 'environment'>[]): NotesSummary {\n const s: NotesSummary = { hasValid: false, withoutEffect: 0, inFlight: 0, validIsTest: false }\n for (const n of notes) {\n if (n.status === 'authorized') {\n s.hasValid = true\n if (n.environment === 'homologacao') s.validIsTest = true\n } else if (IN_FLIGHT.includes(n.status)) s.inFlight += 1\n else if (WITHOUT_EFFECT.includes(n.status)) s.withoutEffect += 1\n }\n return s\n}\n\nexport type NotesButtonState = 'none' | 'authorized' | 'processing' | 'failed-only'\n\nexport function notesButtonState(s: NotesSummary): NotesButtonState {\n if (s.hasValid) return 'authorized'\n if (s.inFlight > 0) return 'processing'\n if (s.withoutEffect > 0) return 'failed-only'\n return 'none'\n}\n\n// The SEFAZ message says what is wrong, never what to do. These codes each cost\n// a full diagnosis in the V1 (measured on tenant 1, 23-09-2026), so the hint\n// travels with the message.\nconst SEFAZ_HINTS: Array<[string, string]> = [\n ['E0120', 'no padrão nacional a Inscrição Municipal é opcional (a nota identifica pelo CNPJ). '\n + 'Apague a IM na configuração fiscal da unidade e emita de novo.'],\n ['E0312', 'geralmente falta o CÓDIGO DE TRIBUTAÇÃO DO MUNICÍPIO (3 dígitos) na configuração '\n + 'fiscal da unidade — não o nacional. Cada prefeitura tem a sua tabela; confirme o código '\n + 'com a contabilidade.'],\n ['E0314', 'o código de tributação do município não existe na tabela daquela prefeitura. '\n + 'Confirme o valor com a contabilidade da unidade — ele não é o mesmo em todo município. '\n + 'Fora do Rio de Janeiro, o normal é deixar esse campo VAZIO.'],\n ['E0084', 'o CNPJ não consta como estabelecido nesse município no cadastro nacional. '\n + 'Isso se resolve FORA do sistema: a empresa precisa ter inscrição municipal ativa na '\n + 'prefeitura e o endereço do CNPJ na Receita Federal apontando para o mesmo município. '\n + 'Fale com a contabilidade — não há o que ajustar aqui.'],\n]\n\nconst FIELD_LABELS: Record<string, string> = {\n 'prestador.cpfCnpj': 'CNPJ do emitente',\n 'tomador.cpfCnpj': 'CPF/CNPJ do cliente',\n 'tomador.razaoSocial': 'Nome do cliente',\n 'tomador.endereco.cep': 'CEP do cliente',\n 'tomador.endereco.codigoCidade': 'Município do cliente',\n 'servico.codigo': 'Código de tributação do serviço',\n 'servico.iss.aliquota': 'Alíquota de ISS',\n 'itens.ncm': 'NCM do produto',\n 'itens.cfop': 'CFOP do produto',\n 'pagamentos.meio': 'Forma de pagamento (tPag)',\n 'emitente.inscricaoMunicipal': 'Inscrição municipal',\n 'emitente.inscricaoEstadual': 'Inscrição estadual',\n}\n\nexport interface RejectionField { field: string; label: string; message: string }\n\n/** PlugNotas rejection payload ({error:{message,data:{fields}}}) → something a person can act on. */\nexport function explainRejection(rejection: unknown): { summary: string; fields: RejectionField[] } {\n if (!rejection) return { summary: 'Nota rejeitada sem detalhe do motivo.', fields: [] }\n const r = (Array.isArray(rejection) ? rejection[0] : rejection) as Record<string, any>\n const err = r?.error ?? r\n let message: string = String(err?.message || r?.mensagem || r?.motivo || 'Nota rejeitada.')\n // The national issuer embeds the reason as JSON inside the string.\n const embedded = message.match(/\\[\\s*\\{[\\s\\S]*\\}\\s*\\]/)\n if (embedded) {\n try {\n const arr = JSON.parse(embedded[0])\n const parts = (Array.isArray(arr) ? arr : [arr])\n .map((e: any) => [e.Codigo ?? e.codigo, e.Descricao ?? e.descricao ?? e.Mensagem ?? e.mensagem]\n .filter(Boolean).join(' — '))\n .filter(Boolean)\n if (parts.length) message = parts.join('; ')\n } catch { /* keep the raw message */ }\n }\n const hint = SEFAZ_HINTS.find(([code]) => message.includes(code))\n if (hint) message = `${message} — ${hint[1]}`\n\n const fieldsObj: Record<string, unknown> = err?.data?.fields ?? {}\n const fields = Object.entries(fieldsObj).map(([field, msg]) => {\n const normalized = field.replace(/\\[\\d+\\]/g, '').replace(/\\.\\d+\\./g, '.')\n return { field, label: FIELD_LABELS[normalized] ?? field, message: String(msg) }\n })\n return { summary: message, fields }\n}\n\nexport function recipientLabel(recipient: Record<string, unknown> | null): string {\n if (!recipient) return 'Consumidor final'\n if (recipient.consumidor) return 'Consumidor final'\n return String(recipient.razaoSocial ?? recipient.nome ?? recipient.cpfCnpj ?? 'Consumidor final')\n}\n","import React, { useCallback, useEffect, useState } from 'react'\nimport { AlertTriangle, CheckCircle2, ChevronDown, FileCheck2, FileText, Loader2, RefreshCw, XCircle } from 'lucide-react'\nimport {\n Badge, Button, Modal, ModalBody, ModalContent, ModalDescription, ModalHeader, ModalTitle, SegmentedControl, Skeleton,\n Tooltip, TooltipContent, TooltipProvider, TooltipTrigger, toast,\n} from '@fayz-ai/ui'\nimport { usePermissionOptional } from '@fayz-ai/admin'\nimport { cancelNote, fetchNotePdf, listInvoiceNotes, listNoteEvents, refreshNote } from '../data/issued'\nimport {\n EVENT_LABEL, MODEL_LABEL, eventStatusLabel, STATUS_META, explainRejection, isWithoutEffect, notesButtonState,\n recipientLabel, statusLabel, summarizeNotes, type IssuedNote, type IssuedNoteEvent, type StatusTone,\n} from '../lib/issued-note'\nimport { describeError, formatCurrency } from '@fayz-ai/core'\n\nconst TONE_VARIANT: Record<StatusTone, 'success' | 'warning' | 'destructive' | 'default'> = {\n success: 'success', warning: 'warning', danger: 'destructive', muted: 'default',\n}\n\nconst dateTime = (v: string | null) => (v ? new Date(v).toLocaleString('pt-BR', { dateStyle: 'short', timeStyle: 'short' }) : '—')\n// The V1 kept only the day of authorization; a midnight here is \"no time known\", not 00:00.\nconst dayOrDateTime = (v: string | null) => {\n if (!v) return '—'\n const d = new Date(v)\n return d.getHours() === 0 && d.getMinutes() === 0 && d.getSeconds() === 0\n ? d.toLocaleDateString('pt-BR')\n : dateTime(v)\n}\nconst money = (v: number | null) => (v == null ? '—' : formatCurrency(v))\n\nfunction buttonHint(s: ReturnType<typeof summarizeNotes>): string {\n const parts = [s.hasValid ? 'Notas fiscais desta conta — há uma nota válida' : 'Notas fiscais desta conta']\n if (s.withoutEffect > 0) parts.push(`${s.withoutEffect} cancelada(s), rejeitada(s) ou com erro`)\n if (s.validIsTest) parts.push('a nota válida é de TESTE, sem valor fiscal')\n return parts.join(' · ')\n}\n\nexport interface InvoiceNotesButtonProps {\n invoiceId?: string\n direction?: string\n cancelled?: boolean\n}\n\n/** Header action of a receivable: the notes issued for it, as the V1's \"Nota Fiscal\" button. */\nexport function InvoiceNotesButton({ invoiceId, direction, cancelled }: InvoiceNotesButtonProps) {\n const [notes, setNotes] = useState<IssuedNote[] | null>(null)\n const [open, setOpen] = useState(false)\n const can = usePermissionOptional()\n // A cancelled invoice still lets a note be cancelled; only issuing stops there.\n const canCancel = can('financial', 'edit')\n\n const reload = useCallback(async () => {\n if (!invoiceId || direction !== 'credit') return\n try {\n setNotes(await listInvoiceNotes(invoiceId))\n } catch {\n // A fiscal read failing must not take the invoice screen down with it.\n setNotes((prev) => prev ?? [])\n }\n }, [invoiceId, direction])\n\n useEffect(() => { void reload() }, [reload])\n\n // Without emission in the V2 yet, an empty central would only say \"nothing here\".\n if (!notes || notes.length === 0) return null\n\n const summary = summarizeNotes(notes)\n const state = notesButtonState(summary)\n\n return (\n <>\n <TooltipProvider delayDuration={200}>\n <Tooltip>\n <TooltipTrigger asChild>\n <Button type=\"button\" variant=\"outline\" size=\"sm\" className=\"relative h-9 gap-1.5\" aria-label=\"Nota Fiscal\" onClick={() => setOpen(true)}>\n {state === 'authorized' ? (\n <CheckCircle2 className=\"h-4 w-4 text-success\" aria-hidden />\n ) : state === 'processing' ? (\n <Loader2 className=\"h-4 w-4 animate-spin text-warning\" aria-hidden />\n ) : (\n <FileCheck2 className=\"h-4 w-4\" aria-hidden />\n )}\n {/* A phone header has room for the screen title or this label, not both. */}\n <span className=\"hidden sm:inline\">Nota Fiscal</span>\n {summary.withoutEffect > 0 && (\n <span className=\"inline-flex h-4 min-w-4 items-center justify-center rounded-full bg-destructive px-1 text-[10px] font-bold text-destructive-foreground\">\n {summary.withoutEffect}\n </span>\n )}\n {summary.validIsTest && (\n <span className=\"rounded border border-destructive px-1 text-[10px] font-semibold text-destructive\">TESTE</span>\n )}\n </Button>\n </TooltipTrigger>\n <TooltipContent>{buttonHint(summary)}</TooltipContent>\n </Tooltip>\n </TooltipProvider>\n\n <Modal open={open} onOpenChange={setOpen}>\n <ModalContent size=\"2xl\">\n <ModalHeader>\n <ModalTitle>Nota Fiscal</ModalTitle>\n <ModalDescription>Notas emitidas para esta conta.</ModalDescription>\n </ModalHeader>\n <ModalBody className=\"gap-2\">\n {notes.map((n) => <NoteRow key={n.documentId} note={n} canCancel={canCancel} onChanged={reload} />)}\n <p className=\"pt-2 text-xs text-muted-foreground\">Emitir uma nota nova por aqui chega na próxima etapa.</p>\n </ModalBody>\n </ModalContent>\n </Modal>\n </>\n )\n}\n\nconst POLL_DELAYS = [3000, 5000, 8000, 12000, 20000]\n\nfunction NoteRow({ note, canCancel, onChanged }: { note: IssuedNote; canCancel: boolean; onChanged: () => Promise<void> }) {\n const [expanded, setExpanded] = useState(false)\n const [cancelling, setCancelling] = useState(false)\n const [busy, setBusy] = useState<'pdf' | 'refresh' | null>(null)\n const dimmed = isWithoutEffect(note.status)\n const tone = (STATUS_META[note.status] ?? STATUS_META.error).tone\n const usable = note.status === 'authorized' || note.status === 'cancelled'\n const inFlight = note.status === 'processing' || note.status === 'draft'\n const cancellable = canCancel && note.status === 'authorized' && !note.cancelledAt\n\n const openPdf = async () => {\n // Open synchronously: a window opened after an await is a blocked pop-up.\n const w = window.open('', '_blank')\n setBusy('pdf')\n try {\n const blob = await fetchNotePdf(note.documentId)\n const url = URL.createObjectURL(blob)\n if (w) w.location.href = url\n else window.location.assign(url)\n } catch (e) {\n w?.close()\n toast.error('PDF indisponível', { description: describeError(e) })\n } finally {\n setBusy(null)\n }\n }\n\n const refresh = async () => {\n setBusy('refresh')\n try {\n const status = await refreshNote(note.documentId)\n await onChanged()\n toast(status === note.status ? 'Ainda em processamento na SEFAZ/prefeitura' : `Nota ${statusLabel({ status: status as IssuedNote['status'], cancelledAt: null }).toLowerCase()}`)\n } catch (e) {\n toast.error('Não foi possível consultar', { description: describeError(e) })\n } finally {\n setBusy(null)\n }\n }\n\n return (\n <div className={`rounded-lg border ${dimmed ? 'bg-muted/30' : ''}`}>\n <Button variant=\"bare\" size=\"bare\"\n type=\"button\"\n className=\"font-normal whitespace-normal justify-start flex w-full items-center gap-2 p-3 text-left\"\n onClick={() => setExpanded((v) => !v)}\n aria-expanded={expanded}\n >\n <span className=\"flex min-w-0 flex-1 flex-wrap items-center gap-2\">\n <Badge variant=\"outline\">{MODEL_LABEL[note.model] ?? note.model}</Badge>\n {note.number && <span className=\"font-mono text-sm\">nº {note.number}</span>}\n <Badge variant={TONE_VARIANT[tone]}>{statusLabel(note)}</Badge>\n {note.environment === 'homologacao' && (\n <span className=\"rounded border border-destructive px-1 text-[10px] font-semibold text-destructive\">TESTE</span>\n )}\n <span className=\"ml-auto text-xs tabular-nums text-muted-foreground\">{dateTime(note.createdAt)}</span>\n </span>\n <ChevronDown className={`h-4 w-4 shrink-0 text-muted-foreground transition-transform ${expanded ? 'rotate-180' : ''}`} aria-hidden />\n </Button>\n {note.cancelReason && !expanded && (\n <p className=\"flex items-start gap-1.5 px-3 pb-2 text-xs text-muted-foreground\">\n <AlertTriangle className=\"mt-0.5 h-3.5 w-3.5 shrink-0\" aria-hidden />\n <span className=\"break-words\">Motivo: {note.cancelReason}</span>\n </p>\n )}\n\n {(usable || inFlight || note.cancelledAt) && !cancelling && (\n <div className=\"flex flex-wrap items-center gap-1.5 px-3 pb-3\">\n {usable && (\n <Button variant=\"outline\" size=\"sm\" className=\"h-7 text-xs\" disabled={busy === 'pdf'} onClick={openPdf}>\n {busy === 'pdf' ? <Loader2 className=\"h-3.5 w-3.5 animate-spin\" aria-hidden /> : <FileText className=\"h-3.5 w-3.5\" aria-hidden />}\n PDF\n </Button>\n )}\n {(inFlight || (note.cancelledAt && note.status === 'authorized')) && (\n <Button variant=\"outline\" size=\"sm\" className=\"h-7 text-xs\" disabled={busy === 'refresh'} onClick={refresh}>\n {busy === 'refresh' ? <Loader2 className=\"h-3.5 w-3.5 animate-spin\" aria-hidden /> : <RefreshCw className=\"h-3.5 w-3.5\" aria-hidden />}\n Atualizar\n </Button>\n )}\n {cancellable && (\n <Button variant=\"ghost\" size=\"sm\" className=\"ml-auto h-7 text-xs text-destructive hover:text-destructive\" onClick={() => setCancelling(true)}>\n <XCircle className=\"h-3.5 w-3.5\" aria-hidden /> Cancelar nota\n </Button>\n )}\n </div>\n )}\n\n {cancelling && (\n <CancelNotePanel note={note} onClose={() => setCancelling(false)} onDone={async () => { setCancelling(false); await onChanged() }} />\n )}\n {expanded && <NoteDetails note={note} />}\n </div>\n )\n}\n\nconst NFSE_REASONS = [\n { value: '1', label: 'Erro na emissão' },\n { value: '2', label: 'Serviço não prestado' },\n { value: '9', label: 'Outros' },\n] as const\n\n/** Inline, not a dialog over the central (no modal stacking). */\nfunction CancelNotePanel({ note, onClose, onDone }: { note: IssuedNote; onClose: () => void; onDone: () => Promise<void> }) {\n const isNfse = note.model === 'nfse'\n const [code, setCode] = useState<'1' | '2' | '9'>('2')\n const [text, setText] = useState('')\n const [working, setWorking] = useState<'sending' | 'waiting' | null>(null)\n const [error, setError] = useState<string | null>(null)\n // SEFAZ requires 15 characters on NFC-e; the V1 asks 10 on NFS-e so the history keeps a real reason.\n const min = isNfse ? 10 : 15\n const missing = Math.max(0, min - text.trim().length)\n\n const confirm = async () => {\n setError(null)\n setWorking('sending')\n try {\n let status = await cancelNote(note.documentId, text.trim())\n // City halls confirm later; follow for a while, as the V1 does.\n setWorking('waiting')\n for (const delay of POLL_DELAYS) {\n if (status === 'cancelled' || status === 'authorized') break\n await new Promise((r) => setTimeout(r, delay))\n try { status = await refreshNote(note.documentId) } catch { /* transient */ }\n }\n if (status === 'cancelled') toast.success(`${MODEL_LABEL[note.model]} nº ${note.number ?? ''} cancelada`)\n else if (status === 'authorized') toast.error('A SEFAZ/prefeitura recusou o cancelamento', { description: 'A nota continua válida. Veja o histórico nos detalhes.' })\n else toast('Cancelamento solicitado', { description: 'A SEFAZ/prefeitura ainda está processando. Use «Atualizar» para conferir.' })\n await onDone()\n } catch (e) {\n setError(describeError(e))\n setWorking(null)\n }\n }\n\n return (\n <div className=\"space-y-3 border-t bg-destructive-soft/40 px-3 py-3\">\n <p className=\"text-sm font-semibold\">Cancelar {MODEL_LABEL[note.model]} {note.number ? `nº ${note.number}` : ''}</p>\n <p className=\"text-xs text-muted-foreground\">\n {isNfse\n ? 'O prazo de cancelamento da NFS-e é definido pelo município.'\n : 'O prazo de cancelamento da NFC-e é curto (em geral ~30 minutos após a autorização, conforme a UF). Fora do prazo, a SEFAZ recusa.'}\n {' '}Cancelar não pode ser desfeito.\n </p>\n {isNfse && (\n <div className=\"space-y-1\">\n <p className=\"text-xs font-medium\">Motivo</p>\n <SegmentedControl size=\"sm\" aria-label=\"Motivo do cancelamento\" options={NFSE_REASONS} value={code} onChange={setCode} />\n </div>\n )}\n <div className=\"space-y-1\">\n <label htmlFor={`cancel-${note.documentId}`} className=\"text-xs font-medium\">Justificativa</label>\n <textarea\n id={`cancel-${note.documentId}`}\n value={text}\n onChange={(e) => setText(e.target.value)}\n maxLength={255}\n rows={3}\n disabled={!!working}\n placeholder={isNfse ? 'Descreva o motivo…' : 'Ex.: Emissão em duplicidade por erro operacional'}\n className=\"w-full resize-y rounded-md border bg-background px-3 py-2 text-sm\"\n autoFocus\n />\n <p className=\"text-[11px] text-muted-foreground\">\n {missing > 0 ? `Faltam ${missing} caractere(s) — a justificativa vai para a SEFAZ/prefeitura.` : 'Vai para a SEFAZ/prefeitura junto do pedido.'}\n </p>\n </div>\n {error && (\n <p className=\"flex items-start gap-1.5 rounded-md border border-destructive/40 bg-destructive-soft p-2 text-xs text-destructive-soft-foreground\">\n <AlertTriangle className=\"mt-0.5 h-3.5 w-3.5 shrink-0\" aria-hidden /> <span className=\"break-words\">{error}</span>\n </p>\n )}\n <div className=\"flex flex-wrap justify-end gap-2\">\n <Button variant=\"outline\" size=\"sm\" onClick={onClose} disabled={!!working}>Voltar</Button>\n <Button variant=\"destructive\" size=\"sm\" onClick={confirm} disabled={!!working || missing > 0}>\n {working ? <Loader2 className=\"h-3.5 w-3.5 animate-spin\" aria-hidden /> : <XCircle className=\"h-3.5 w-3.5\" aria-hidden />}\n {working === 'waiting' ? 'Aguardando a SEFAZ/prefeitura…' : working ? 'Enviando…' : 'Confirmar cancelamento'}\n </Button>\n </div>\n </div>\n )\n}\n\nfunction NoteDetails({ note }: { note: IssuedNote }) {\n const [events, setEvents] = useState<IssuedNoteEvent[] | null>(null)\n useEffect(() => {\n let alive = true\n listNoteEvents(note.documentId).then((e) => { if (alive) setEvents(e) }).catch(() => { if (alive) setEvents([]) })\n return () => { alive = false }\n }, [note.documentId])\n\n const failed = ['rejected', 'denied', 'error'].includes(note.status)\n const rejection = failed ? explainRejection(note.rejection) : null\n const rows: Array<[string, React.ReactNode]> = [\n ['Referência', note.integrationId && <span className=\"break-all font-mono text-xs\">{note.integrationId}</span>],\n ['Chave de acesso', note.accessKey && <span className=\"break-all font-mono text-xs\">{note.accessKey}</span>],\n ['Código de verificação', note.verificationCode],\n ['Valor', money(note.totalValue)],\n ['Tomador', recipientLabel(note.recipient)],\n ['Criada em', dateTime(note.createdAt)],\n ['Autorizada em', note.authorizedAt && dayOrDateTime(note.authorizedAt)],\n ['Cancelada em', note.cancelledAt && `${dateTime(note.cancelledAt)}${note.cancelReason ? ` — ${note.cancelReason}` : ''}`],\n ]\n\n return (\n <div className=\"space-y-3 border-t px-3 py-3\">\n <dl className=\"text-sm\">\n {rows.filter(([, v]) => v).map(([label, value]) => (\n <div key={label} className=\"flex gap-3 border-b py-1.5 last:border-0\">\n <dt className=\"w-28 shrink-0 text-muted-foreground sm:w-36\">{label}</dt>\n <dd className=\"min-w-0 flex-1 break-words font-medium\">{value}</dd>\n </div>\n ))}\n </dl>\n\n {rejection && (\n <div className=\"space-y-1.5 rounded-md border border-destructive/40 bg-destructive-soft p-3\">\n <p className=\"text-sm font-semibold text-destructive-soft-foreground\">Por que foi rejeitada?</p>\n <p className=\"text-sm text-foreground\">{rejection.summary}</p>\n {rejection.fields.length > 0 && (\n <ul className=\"space-y-1 text-xs text-foreground\">\n {rejection.fields.map((f) => <li key={f.field}><span className=\"font-medium\">{f.label}:</span> {f.message}</li>)}\n </ul>\n )}\n </div>\n )}\n\n {events === null ? (\n <div className=\"space-y-1.5\">\n <Skeleton className=\"h-4 w-3/4\" />\n <Skeleton className=\"h-4 w-2/3\" />\n </div>\n ) : events.length > 0 && (\n <div>\n <p className=\"mb-1.5 text-sm font-semibold\">Histórico</p>\n <ul className=\"space-y-1\">\n {events.map((e) => (\n <li key={e.id} className=\"flex flex-wrap items-center gap-2 text-xs\">\n <span className=\"whitespace-nowrap tabular-nums text-muted-foreground\">{dateTime(e.createdAt)}</span>\n <Badge variant=\"outline\" className=\"text-[10px]\">{EVENT_LABEL[e.eventType] ?? 'Evento'}</Badge>\n {eventStatusLabel(e.status) && <span className=\"text-muted-foreground\">{eventStatusLabel(e.status)}</span>}\n {e.justification && <span className=\"min-w-0 truncate\">— {e.justification}</span>}\n </li>\n ))}\n </ul>\n </div>\n )}\n </div>\n )\n}\n"]}
|
package/dist/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AACA,OAAO,EAA+B,KAAK,cAAc,EAAE,MAAM,eAAe,CAAA;AAkBhF,cAAc,wBAAwB,CAAA;AACtC,cAAc,gBAAgB,CAAA;AAC9B,cAAc,aAAa,CAAA;AAC3B,OAAO,EAAE,aAAa,EAAE,MAAM,uBAAuB,CAAA;AACrD,OAAO,EAAE,aAAa,EAAE,MAAM,uBAAuB,CAAA;AACrD,cAAc,0BAA0B,CAAA;AACxC,cAAc,SAAS,CAAA;AACvB,cAAc,eAAe,CAAA;AAC7B,cAAc,cAAc,CAAA;AAC5B,cAAc,eAAe,CAAA;AAC7B,cAAc,mBAAmB,CAAA;AACjC,OAAO,EAAE,kBAAkB,EAAE,MAAM,4BAA4B,CAAA;AAC/D,OAAO,EAAE,gBAAgB,EAAE,MAAM,0BAA0B,CAAA;AAC3D,OAAO,EAAE,gBAAgB,EAAE,MAAM,0BAA0B,CAAA;AAC3D,OAAO,EAAE,iBAAiB,EAAE,MAAM,2BAA2B,CAAA;AAC7D,OAAO,EAAE,UAAU,EAAE,OAAO,EAAE,MAAM,aAAa,CAAA;AACjD,OAAO,EAAE,eAAe,EAAE,iBAAiB,EAAE,aAAa,EAAE,MAAM,oBAAoB,CAAA;AACtF;;;;GAIG;AACH,OAAO,EAAE,yBAAyB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,MAAM,uBAAuB,CAAA;AAErH,MAAM,WAAW,4BAA4B;IAC3C,sGAAsG;IACtG,UAAU,CAAC,EAAE,MAAM,GAAG,WAAW,GAAG,UAAU,CAAA;IAC9C,WAAW,CAAC,EAAE,MAAM,CAAA;IACpB;;;;OAIG;IACH,YAAY,CAAC,EAAE,CAAC,SAAS,EAAE,MAAM,KAAK,MAAM,CAAA;CAC7C;AAED;;;GAGG;AACH,wBAAgB,qBAAqB,CAAC,OAAO,GAAE,4BAAiC,GAAG,cAAc,CA4EhG"}
|