Public Markdown Document
Contexto Exportacao de Dados
Missao: adicionar exportacao/download de dados nas abas e views do FastApp que mostram registros de objetos. A feature deve respeitar o modelo do produto: apps sao definidos por JSON, objetos sao modulares e o runtime dinamico deve ofere...
Contexto - Exportacao de Dados
Overview
Missao: adicionar exportacao/download de dados nas abas e views do FastApp que
mostram registros de objetos. A feature deve respeitar o modelo do produto:
apps sao definidos por JSON, objetos sao modulares e o runtime dinamico deve
oferecer a capacidade de forma transversal.
Branch da sprint: feat/export-data, criada a partir da main.
Estado atual: Sprint concluida na branch feat/export-data. Tasks 1 a 8
concluidas e notificadas no Task Board.
Decisoes Tomadas
- O ponto principal da UI deve ser
CoreDynamicCRUD, porque ele orquestra as
views de tabela, lista, kanban, agenda, mapa e hibrida. - A API ja tem parsers (
$parser=csv|yaml|markdown) emserver/utils/api-parser.ts; CSV deve ser preservado e endurecido. - A sprint deve adicionar Excel e PDF como formatos reais de arquivo.
- A exportacao deve reaproveitar a API dinamica e seus contratos de filtros,
sort, app hint, data sources externos, computed fields e RBAC. - Configuracao por objeto deve ser feita em
schema.ui_config.export, com
defaults seguros quando ausente. - Tasks da sprint devem viver no Task Board (
task_item), nao em arquivos de
task separados.
Evidencias Lidas
docs/ura-ai/SPEC.mdedocs/ura-ai/CONTEXT.mdpara seguir o modelo SDD.task-board-app.jsonescripts/seed-task-board.mjspara entender o
taskboard como app/objetotask_item.app/pages/[app]/[module]/[object]/index.vuepara entender carregamento de
schema, dados, filtros e app hint.app/components/core/DynamicCRUD.vuepara localizar action bar universal,
view modes e eventos de CRUD/bulk.app/components/core/DynamicTable.vuepara entender DataTable, selecao,
filtros e bulk toolbar.server/api/v1/data/[app]/[object]/index.get.tspara entender listagem,
data source externo/interno, RBAC, enrichment e parser.server/utils/api-parser.tsedocs/api-parsers.mdpara mapear CSV atual.server/utils/query-parser.tspara filtros, sort e limite.server/api/v1/data/[app]/[object]/bulk.patch.tsebulk.delete.tspara
entender selected/query bulk flows.server/utils/dynamic-db.ts,app/stores/appData.ts,server/utils/app-catalog.tspara confirmar Firestore como storage primario.
Estado das Tasks
Fase 0
- Conferir branch atual e pendencias da URA.
feat/URA-AIestava limpa, sem mudancas rastreadas para commitar.
- Atualizar base e criar branch da sprint.
mainestava atualizada comorigin/main.- Branch
feat/export-datacriada a partir damain.
- Ler arquitetura relevante.
- Validado pelas evidencias listadas acima.
- Criar spec/contexto SDD.
- Criados
docs/export-data/SPEC.mde este arquivo.
- Criados
- Criar cards no Task Board.
- Criados registros
task_item[Export Data] Task 1ateTask 8. Task 1ficou emCONCLUIDA;Task 2aTask 8ficaram emBACKLOG.- Correcao em 2026-06-05: a primeira criacao foi feita direto no Firestore e
usouapp_origem_id: 16, entao nao passou pelo dispatcher nem casou com a
regra de comunicado do apptask-board(scope_app_id: 25). Os cards
foram removidos e recriados comapp_origem_id: 25; a regra ativaTeste Taskboardenviou notificacao por email para cada card criado. - Ajuste posterior em 2026-06-05: os templates de alerta de
task_item
passaram a incluir{{record.descricao}}no corpo do email. Tambem foram
criadas regras de update para o apptask-boardcom filtros de statusTODO,EM_ANDAMENTOeCONCLUIDA. - Ajuste posterior em 2026-06-05: foi criada tambem a regra generica
Alerta Taskboard - Update Generico, sem filtro de status, com assunto
"Seu card foi atualizado". O endpoint de PATCH agora passa o registro
anterior e os campos enviados ao dispatcher, permitindo usar{{record.__changes_summary}}no template para listar o que mudou.
- Criados registros
Sprint feat/export-data
- Task 1 - Contexto e planejamento SDD.
- Task 2 - Contrato server-side de exportacao.
- Movida para
EM_ANDAMENTOem 2026-06-05. O update do card disparou a
regra especificaAlerta Taskboard - Update EM ANDAMENTOe a regra
genericaAlerta Taskboard - Update Generico, validando o corpo com diff
de status. - Movida para
CONCLUIDAem 2026-06-05. O update do card disparou a regra
especificaAlerta Taskboard - Update CONCLUIDAe a regra generica. - Implementado contrato inicial em
server/api/v1/data/[app]/[object]/export.get.ts. - Criado utilitario
server/utils/export-data.tspara config default,
colunas exportaveis, filename, headers e serializacao CSV/JSON. - Default de formatos por objeto:
csv,xlsx,pdf,json. Nesta task
CSV/JSON ja respondem; XLSX/PDF retornam501com mensagem explicita e
serao implementados na Task 3. - Testes adicionados em
tests/api/export-data.spec.ts. - Validacao:
npm run test:apipassou.npm run buildexcedeu 120s enpx tsc --noEmit -p .nuxt/tsconfig.server.jsonnao rodou porquetypescriptnao esta instalado diretamente no projeto.
- Movida para
- Task 3 - Serializadores CSV/XLSX/PDF/JSON.
- Movida para
EM_ANDAMENTOem 2026-06-05. O update do card disparou a
regra especificaAlerta Taskboard - Update EM ANDAMENTOe a regra
genericaAlerta Taskboard - Update Generico. - Movida para
CONCLUIDAem 2026-06-05. O update do card disparou a regra
especificaAlerta Taskboard - Update CONCLUIDAe a regra generica. - Instaladas dependencias
exceljs,pdfkite@types/pdfkit. server/utils/export-data.tsagora serializa CSV, JSON, XLSX e PDF.server/api/v1/data/[app]/[object]/export.get.tsresponde os quatro
formatos do contrato com headers de download.- Testes cobrem buffers XLSX/PDF, CSV com BOM/escape e JSON por colunas.
- Validacao:
npm run test:apipassou com 3 arquivos e 11 testes.npm run buildexcedeu 300s.
- Movida para
- Task 4 - UI universal no CoreDynamicCRUD.
- Movida para
EM_ANDAMENTOem 2026-06-05. O update do card disparou a
regra especificaAlerta Taskboard - Update EM ANDAMENTOe a regra
genericaAlerta Taskboard - Update Generico. - Implementado botao universal de exportacao no action bar do
app/components/core/DynamicCRUD.vue, sem duplicar logica nas views
filhas. - O menu respeita
schema.ui_config.export.enabledeschema.ui_config.export.formats; quando ausente, todos os objetos
continuam nascendo exportaveis comcsv,xlsx,pdfejson. - O download usa
/api/v1/data/:app/:object/export, preserva filtros atuais
deroute.query,fixedFiltereappHint, exibe loading e toasts de
sucesso/erro. - Movida para
CONCLUIDAem 2026-06-05. O update do card disparou a regra
especificaAlerta Taskboard - Update CONCLUIDAe a regra generica. - Validacao:
npm run test:apipassou com 3 arquivos e 11 testes.npm run buildvoltou a exceder 300s.
- Movida para
- Task 5 - Escopos de exportacao.
- Movida para
EM_ANDAMENTOem 2026-06-05. O update do card disparou a
regra especificaAlerta Taskboard - Update EM ANDAMENTOe a regra
genericaAlerta Taskboard - Update Generico. - O endpoint
/api/v1/data/:app/:object/exportagora entendescope=current_query|current_page|selected. current_queryexporta a consulta filtrada ignorando paginacao de tela e
usando o limite seguro do schema.current_pagerespeita$limite$skippara baixar apenas a pagina
visivel.selectedaceitaidsstring ou numericos, busca registros locais por ID
sem depender do operadorindo Firestore e valida o limite maximo antes
de gerar arquivo.- O menu de exportacao do
CoreDynamicCRUDganhou controle compacto de
escopo antes dos formatos, com suporte opcional aschema.ui_config.export.scopes. - Testes cobrem resolucao de escopos e IDs mistos. Validacao:
npm run test:apipassou com 3 arquivos e 12 testes.npm run buildvoltou a exceder 300s. - Movida para
CONCLUIDAem 2026-06-05. O update do card disparou a regra
especificaAlerta Taskboard - Update CONCLUIDAe a regra generica.
- Movida para
- Task 6 - Cobertura em CMS e views especiais.
- Movida para
EM_ANDAMENTOem 2026-06-05. O update do card disparou a
regra especificaAlerta Taskboard - Update EM ANDAMENTOe a regra
genericaAlerta Taskboard - Update Generico. - Extraido o menu de exportacao para
CoreExportDataButton, mantendo o
mesmo comportamento doCoreDynamicCRUDe permitindo reuso por views que
nao passam pelo CRUD universal. CoreDynamicCRUDagora usaCoreExportDataButtonem vez de manter a
logica de exportacao embutida.useCmsBindingpassou a exporqueryParamsderivados dos filtros, sort,
projection e limit configurados na secao CMS.CoreCmsElementProxyganhou exportacao para elementos de listagem comoobject_list_simple,object_list_integrated,object_kanbaneobject_schedule.CoreCmsSectionObjectTableeCoreCmsSectionObjectListtambem ganharam o
botao de exportacao no cabecalho, preservando filtros/sort da binding CMS.- Validacao:
npm run test:apipassou com 3 arquivos e 12 testes.npm run buildvoltou a exceder 300s. - Movida para
CONCLUIDAem 2026-06-05. O update do card disparou a regra
especificaAlerta Taskboard - Update CONCLUIDAe a regra generica.
- Movida para
- Task 7 - Testes e regressao.
- Movida para
EM_ANDAMENTOem 2026-06-05. O update do card disparou a
regra especificaAlerta Taskboard - Update EM_ANDAMENTOe a regra
genericaAlerta Taskboard - Update Generico. - Extraido helper client-side
app/utils/export-client.tspara tornar a
montagem de query/download doCoreExportDataButtontestavel sem DOM. CoreExportDataButtonpassou a usar o helper client-side, reduzindo
logica interna e preservando o comportamento visual.- Testes adicionados para formatos/escopos desabilitados, remocao de
paginacao emcurrent_query, pagina atual, selecionados, IDs de selecao e
leitura de filename emContent-Disposition. - Validacao:
npm run test:apipassou com 3 arquivos e 16 testes.npm run buildvoltou a exceder 300s. - Movida para
CONCLUIDAem 2026-06-05. O update do card disparou a regra
especificaAlerta Taskboard - Update CONCLUIDAe a regra generica.
- Movida para
- Task 8 - Documentacao final e handoff.
- Movida para
EM_ANDAMENTOem 2026-06-05. O update do card disparou a
regra especificaAlerta Taskboard - Update EM_ANDAMENTOe a regra
genericaAlerta Taskboard - Update Generico. docs/api-parsers.mdfoi atualizado para documentar a diferenca entre
parsers inline ($parser/$format) e endpoint de download/export.docs/export-data/SPEC.mdfoi atualizado de Gate 1 para spec final da
sprint, com decisoes fechadas, endpoint, configuracao JSON, arquivos de
handoff e riscos restantes.- Este contexto foi atualizado para refletir conclusao completa da sprint.
- Validacao final:
npm run test:apideve permanecer com 3 arquivos e 16
testes;npm run buildpermaneceu excedendo 300s durante a sprint. - Movida para
CONCLUIDAem 2026-06-05. O update do card disparou a regra
especificaAlerta Taskboard - Update CONCLUIDAe a regra generica.
- Movida para
Proximo Passo
Branch feat/export-data pronta para validacao manual e posterior merge paramain quando o usuario aprovar.
Prompt de Continuacao
Voce esta na branch feat/export-data. Antes de continuar:
- Leia
docs/export-data/SPEC.mde este arquivo inteiro. - Confira
git status --short --branch. - Abra o Task Board e confirme os cards
Task 1ateTask 8. - Ao criar ou recriar cards do Task Board, use o fluxo da API/dispatcher ou
dispare as regras decomunicado_configdo apptask-board; nao inserir
direto no Firestore sem notificar. - So implemente feature code depois da aprovacao do usuario.
- Sprint implementada em commits pequenos e cards movidos para
CONCLUIDA. - Antes de subir para
main, validar manualmente os downloads CSV/XLSX/PDF/JSON
nos escopos Consulta, Pagina e Selecionados em uma tela dinamica e em uma
view CMS.