feat(web): telas de Suporte e Fiscal no EDEN Core

Continuação direta, sem parar para autorização. 2 subagentes
eden-frontend em paralelo.

- Suporte: lista de tickets, criação, detalhe com painel de SLA
  (prazos, cumprido/violado/pendente, aviso "SLA pausado"), thread de
  comentários públicos/internos, histórico de status, transições
  limitadas aos alvos válidos com campos condicionais de causa raiz/
  resolução ao fechar.
- Fiscal: NCM/CFOP/Municípios (CRUD simples), Naturezas de Operação
  (só leitura, seed fixo), nova seção "Fiscal" em ProductFormPage
  (só ao editar) com aviso de que um novo perfil do mesmo componente
  substitui automaticamente o anterior — invariante confirmada ao vivo
  pelo próprio agente antes de entregar.

Reconciliação manual de App.tsx/AuthenticatedLayout.tsx/
ProductFormPage.tsx/format.ts entre os 2 agentes. Ambos restauraram a
base manualmente (sem git merge) — diff -rq contra main confirmou zero
desvio de restauração nos dois casos antes de aceitar qualquer arquivo
como novo.

Verificado: pnpm turbo run typecheck build (28/28); containers
eden-api/eden-core reconstruídos; testado ao vivo através do proxy
same-origin (porta 3001); trilha de auditoria conferida no Postgres.

Com esta leva, o EDEN Core tem UI real para praticamente todo o
backend construído até agora, exceto HR-Timeclock e Documentos.

Claude-Session: https://claude.ai/code/session_01BcWWuKfykGtUweXmHD6cKx

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
This commit is contained in:
2026-09-04 05:53:20 -03:00
parent 7021994d8e
commit 828e6e8ddb
17 changed files with 2420 additions and 0 deletions

View File

@@ -37,6 +37,13 @@ import { BillingRunsListPage } from "./routes/billing/BillingRunsListPage.js";
import { BillingRunFormPage } from "./routes/billing/BillingRunFormPage.js";
import { BillingRunDetailPage } from "./routes/billing/BillingRunDetailPage.js";
import { InvoicesListPage } from "./routes/billing/InvoicesListPage.js";
import { NcmListPage } from "./routes/fiscal/NcmListPage.js";
import { CfopListPage } from "./routes/fiscal/CfopListPage.js";
import { MunicipalitiesListPage } from "./routes/fiscal/MunicipalitiesListPage.js";
import { OperationNaturesListPage } from "./routes/fiscal/OperationNaturesListPage.js";
import { TicketsListPage } from "./routes/support/TicketsListPage.js";
import { TicketFormPage } from "./routes/support/TicketFormPage.js";
import { TicketDetailPage } from "./routes/support/TicketDetailPage.js";
export function App() {
return (
@@ -96,6 +103,15 @@ export function App() {
<Route path="/billing/runs/new" element={<BillingRunFormPage />} />
<Route path="/billing/runs/:id" element={<BillingRunDetailPage />} />
<Route path="/billing/invoices" element={<InvoicesListPage />} />
<Route path="/fiscal/ncm" element={<NcmListPage />} />
<Route path="/fiscal/cfop" element={<CfopListPage />} />
<Route path="/fiscal/municipalities" element={<MunicipalitiesListPage />} />
<Route path="/fiscal/operation-natures" element={<OperationNaturesListPage />} />
<Route path="/support/tickets" element={<TicketsListPage />} />
<Route path="/support/tickets/new" element={<TicketFormPage />} />
<Route path="/support/tickets/:id" element={<TicketDetailPage />} />
</Route>
</Route>
</Routes>