@oondemand/create-central-oon 0.5.5 → 0.6.0

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.
Files changed (70) hide show
  1. package/README.md +41 -89
  2. package/bin/cli.js +4 -17
  3. package/docs/ADVANCED_UX_PATTERNS.md +3 -2
  4. package/docs/AGENTS.md +3 -4
  5. package/docs/BACKEND_API.md +2 -4
  6. package/docs/BACKEND_PATTERNS.md +1 -2
  7. package/docs/BACKEND_PROCESS_MANIFEST.md +6 -6
  8. package/docs/CAPABILITIES.md +2 -3
  9. package/docs/CHECKLIST_IMPLEMENTACAO.md +4 -4
  10. package/docs/FRONTEND_API.md +20 -23
  11. package/docs/FRONTEND_CODE_FIRST.md +35 -0
  12. package/docs/FRONTEND_PATTERNS.md +13 -15
  13. package/docs/METADATA_CRUD_UI.md +1 -1
  14. package/docs/PORTAL_COCKPIT_PATTERNS.md +10 -145
  15. package/docs/REACTIVE_DOMAIN_FORMULAS.md +2 -2
  16. package/package.json +1 -1
  17. package/schemas/central.app.schema.json +2 -16
  18. package/src/conformance.js +42 -106
  19. package/src/index.js +4 -28
  20. package/src/render.js +2 -1
  21. package/templates/_base/README.md +7 -6
  22. package/templates/_base/backend/package.json +1 -1
  23. package/templates/_base/central.app.json +4 -9
  24. package/templates/_base/frontend/package.json +1 -1
  25. package/templates/_base/frontend/src/app/app.tsx +25 -0
  26. package/templates/_base/frontend/src/app/navigation.ts +5 -0
  27. package/templates/_base/frontend/src/app/routes.tsx +6 -0
  28. package/templates/_base/frontend/src/app/theme.ts +8 -0
  29. package/templates/_base/frontend/src/components/gitkeep +1 -0
  30. package/templates/_base/frontend/src/features/gitkeep +1 -0
  31. package/templates/_base/frontend/src/layouts/gitkeep +1 -0
  32. package/templates/_base/frontend/src/main.tsx +3 -8
  33. package/templates/_base/frontend/src/pages/HomePage.tsx +25 -0
  34. package/templates/_base/frontend/tsconfig.json +1 -1
  35. package/templates/_base/package.json +1 -1
  36. package/docs/CONNECTORS_AND_INTEGRATIONS.md +0 -66
  37. package/docs/FRONTEND_MANIFEST_REFERENCE.md +0 -487
  38. package/templates/_base/backend/src/integrations/gitkeep +0 -0
  39. package/templates/_base/frontend/central.ui.json +0 -8
  40. package/templates/_base/frontend/src/collections/gitkeep +0 -0
  41. package/templates/_base/frontend/src/dashboards/gitkeep +0 -0
  42. package/templates/_base/frontend/src/documents/gitkeep +0 -0
  43. package/templates/_base/frontend/src/overrides/gitkeep +0 -0
  44. package/templates/_base/frontend/src/pipelines/gitkeep +0 -0
  45. package/templates/basic/backend/src/models/Pessoa.js +0 -21
  46. package/templates/basic/frontend/central.ui.json +0 -8
  47. package/templates/documentos-fiscais/backend/central.config.js +0 -32
  48. package/templates/documentos-fiscais/backend/src/models/DocumentoFiscal.js +0 -23
  49. package/templates/documentos-fiscais/frontend/central.ui.json +0 -16
  50. package/templates/multi-moedas/backend/central.config.js +0 -32
  51. package/templates/multi-moedas/backend/src/models/Cotacao.js +0 -23
  52. package/templates/multi-moedas/backend/src/models/Moeda.js +0 -15
  53. package/templates/multi-moedas/frontend/central.ui.json +0 -11
  54. package/templates/omie-sidecar/backend/central.config.js +0 -33
  55. package/templates/omie-sidecar/backend/src/mappings/pessoa-cliente.js +0 -20
  56. package/templates/omie-sidecar/backend/src/models/Pessoa.js +0 -24
  57. package/templates/omie-sidecar/backend/src/triggers/Pessoa.js +0 -14
  58. package/templates/omie-sidecar/frontend/central.ui.json +0 -8
  59. package/templates/pedidos-marketplace/backend/central.config.js +0 -32
  60. package/templates/pedidos-marketplace/backend/src/models/Pedido.js +0 -22
  61. package/templates/pedidos-marketplace/backend/src/models/Produto.js +0 -16
  62. package/templates/pedidos-marketplace/frontend/central.ui.json +0 -10
  63. package/templates/servicos-prestados/backend/central.config.js +0 -32
  64. package/templates/servicos-prestados/backend/src/models/Cliente.js +0 -15
  65. package/templates/servicos-prestados/backend/src/models/ServicoPrestado.js +0 -22
  66. package/templates/servicos-prestados/frontend/central.ui.json +0 -10
  67. package/templates/servicos-tomados/backend/central.config.js +0 -32
  68. package/templates/servicos-tomados/backend/src/models/Pessoa.js +0 -15
  69. package/templates/servicos-tomados/backend/src/models/Servico.js +0 -22
  70. package/templates/servicos-tomados/frontend/central.ui.json +0 -10
@@ -1,32 +0,0 @@
1
- /**
2
- * Central __NAME__ — template documentos-fiscais. Liga o módulo de documentos
3
- * do Core (aprovação, anexos, status).
4
- */
5
- module.exports = {
6
- ecosystem: { role: "member" },
7
- activation: { enabled: true, configurationVersion: 1, fields: [] },
8
- name: "__NAME__",
9
- slug: "__SLUG__",
10
-
11
- modules: {
12
- collections: true,
13
- documents: true,
14
- pipelines: false,
15
- integrations: false,
16
- omie: false,
17
- assistants: false,
18
- currencies: false,
19
- },
20
-
21
- domain: {
22
- models: "src/models",
23
- validations: "src/validations",
24
- triggers: "src/triggers",
25
- hooks: "src/hooks",
26
- mappings: "src/mappings",
27
- documents: "src/documents",
28
- pipelines: "src/pipelines",
29
- integrations: "src/integrations",
30
- routes: "src/routes",
31
- },
32
- };
@@ -1,23 +0,0 @@
1
- const { defineModel, fields } = require("@oondemand/oon-core-back");
2
-
3
- /**
4
- * Documento fiscal com fluxo de aprovação. O front (CoreDocument) usa o
5
- * `status` para badge e as actions RESTful approve/reject do Core.
6
- */
7
- defineModel({
8
- name: "DocumentoFiscal",
9
- singular: "documentoFiscal",
10
- basePath: "/documentos-fiscais",
11
- schema: {
12
- numero: fields.string({ required: true, label: "Número" }),
13
- tipo: fields.enum(["nfe", "nfse", "nfce", "outro"], { label: "Tipo", default: "nfe" }),
14
- emitente: fields.string({ label: "Emitente" }),
15
- valor: fields.currency({ label: "Valor" }),
16
- dataEmissao: fields.date({ label: "Emissão" }),
17
- status: fields.enum(["pendente", "aprovado", "reprovado"], {
18
- default: "pendente",
19
- label: "Status",
20
- }),
21
- },
22
- crud: { enabled: true, roles: { write: ["admin"] } },
23
- });
@@ -1,16 +0,0 @@
1
- {
2
- "schemaVersion": 2,
3
- "backend": { "metadataUrl": "/core/metadata" },
4
- "navigation": { "mode": "auto" },
5
- "collections": [],
6
- "pipelines": [],
7
- "documents": [
8
- {
9
- "model": "DocumentoFiscal",
10
- "label": "Documentos fiscais",
11
- "approval": true,
12
- "attachments": true,
13
- "section": "Fiscal"
14
- }
15
- ]
16
- }
@@ -1,32 +0,0 @@
1
- /**
2
- * Central __NAME__ — template multi-moedas. Liga o módulo de moedas do Core
3
- * (cotações, conversão).
4
- */
5
- module.exports = {
6
- ecosystem: { role: "member" },
7
- activation: { enabled: true, configurationVersion: 1, fields: [] },
8
- name: "__NAME__",
9
- slug: "__SLUG__",
10
-
11
- modules: {
12
- collections: true,
13
- documents: false,
14
- pipelines: false,
15
- integrations: false,
16
- omie: false,
17
- assistants: false,
18
- currencies: true,
19
- },
20
-
21
- domain: {
22
- models: "src/models",
23
- validations: "src/validations",
24
- triggers: "src/triggers",
25
- hooks: "src/hooks",
26
- mappings: "src/mappings",
27
- documents: "src/documents",
28
- pipelines: "src/pipelines",
29
- integrations: "src/integrations",
30
- routes: "src/routes",
31
- },
32
- };
@@ -1,23 +0,0 @@
1
- const { defineModel, fields } = require("@oondemand/oon-core-back");
2
-
3
- /**
4
- * Cotação em moeda estrangeira com valor convertido para BRL. Mostra os
5
- * helpers `fields.currency*` do módulo Multi-moedas.
6
- */
7
- defineModel({
8
- name: "Cotacao",
9
- singular: "cotacao",
10
- basePath: "/cotacoes",
11
- schema: {
12
- descricao: fields.string({ required: true, label: "Descrição" }),
13
- valor: fields.currency({ label: "Valor" }),
14
- moeda: fields.currencyCode({ label: "Moeda" }),
15
- valorConvertido: fields.currencyConverted({ base: "BRL", label: "Valor (BRL)" }),
16
- validade: fields.date({ label: "Validade" }),
17
- status: fields.enum(["rascunho", "enviada", "aprovada", "recusada"], {
18
- default: "rascunho",
19
- label: "Status",
20
- }),
21
- },
22
- crud: { enabled: true, roles: { write: ["admin"] } },
23
- });
@@ -1,15 +0,0 @@
1
- const { defineModel, fields } = require("@oondemand/oon-core-back");
2
-
3
- /** Moeda com cotação corrente (atualizada via action do módulo currencies). */
4
- defineModel({
5
- name: "Moeda",
6
- singular: "moeda",
7
- basePath: "/moedas",
8
- schema: {
9
- codigo: fields.currencyCode({ required: true, label: "Código" }),
10
- nome: fields.string({ required: true, label: "Nome" }),
11
- cotacao: fields.number({ label: "Cotação (BRL)", default: 1 }),
12
- ativa: fields.boolean({ label: "Ativa", default: true }),
13
- },
14
- crud: { enabled: true, roles: { write: ["admin"] } },
15
- });
@@ -1,11 +0,0 @@
1
- {
2
- "schemaVersion": 2,
3
- "backend": { "metadataUrl": "/core/metadata" },
4
- "navigation": { "mode": "auto" },
5
- "collections": [
6
- { "model": "Moeda", "mode": "dynamic", "section": "Multi-moedas" },
7
- { "model": "Cotacao", "mode": "dynamic", "section": "Multi-moedas" }
8
- ],
9
- "pipelines": [],
10
- "documents": []
11
- }
@@ -1,33 +0,0 @@
1
- /**
2
- * Central __NAME__ — template omie-sidecar. Liga os módulos de integração e
3
- * Omie do Core. O engine de Omie (chaves, fila, retries) vive no Core; aqui só
4
- * declaramos o mapping de domínio.
5
- */
6
- module.exports = {
7
- ecosystem: { role: "member" },
8
- activation: { enabled: true, configurationVersion: 1, fields: [] },
9
- name: "__NAME__",
10
- slug: "__SLUG__",
11
-
12
- modules: {
13
- collections: true,
14
- documents: false,
15
- pipelines: false,
16
- integrations: true,
17
- omie: true,
18
- assistants: false,
19
- currencies: false,
20
- },
21
-
22
- domain: {
23
- models: "src/models",
24
- validations: "src/validations",
25
- triggers: "src/triggers",
26
- hooks: "src/hooks",
27
- mappings: "src/mappings",
28
- documents: "src/documents",
29
- pipelines: "src/pipelines",
30
- integrations: "src/integrations",
31
- routes: "src/routes",
32
- },
33
- };
@@ -1,20 +0,0 @@
1
- const { defineOmieMapping } = require("@oondemand/oon-core-back");
2
-
3
- /**
4
- * Mapping de domínio Pessoa -> Cliente Omie. `toOmie` traduz o payload do
5
- * domínio na chamada da API Omie. O engine (chaves, fila, retries) é do Core.
6
- */
7
- defineOmieMapping("pessoa-cliente", {
8
- toOmie: (pessoa) => ({
9
- endpoint: "geral/clientes/",
10
- call: "IncluirCliente",
11
- param: [
12
- {
13
- codigo_cliente_integracao: String(pessoa.idPessoa || pessoa._id || ""),
14
- razao_social: pessoa.nome,
15
- email: pessoa.email,
16
- cnpj_cpf: pessoa.documento,
17
- },
18
- ],
19
- }),
20
- });
@@ -1,24 +0,0 @@
1
- const { defineModel, fields } = require("@oondemand/oon-core-back");
2
-
3
- /**
4
- * Pessoa/Cliente sincronizada com a Omie. Os campos de sincronização são
5
- * preenchidos pelo Core via o mapping declarado em src/mappings.
6
- */
7
- defineModel({
8
- name: "Pessoa",
9
- singular: "pessoa",
10
- basePath: "/pessoas",
11
- schema: {
12
- nome: fields.string({ required: true, label: "Nome" }),
13
- email: fields.string({ label: "E-mail" }),
14
- documento: fields.string({ label: "Documento" }),
15
- tipo: fields.enum(["pf", "pj"], { label: "Tipo", default: "pf" }),
16
- codigo_cliente_omie: fields.string({ searchable: false, label: "Código Omie" }),
17
- status_sincronizacao_omie: fields.enum(["pendente", "sucesso", "erro"], {
18
- default: "pendente",
19
- label: "Sync Omie",
20
- }),
21
- status: fields.enum(["ativo", "inativo"], { label: "Status", default: "ativo" }),
22
- },
23
- crud: { enabled: true, roles: { write: ["admin"] } },
24
- });
@@ -1,14 +0,0 @@
1
- const { defineTrigger, omie } = require("@oondemand/oon-core-back");
2
-
3
- /**
4
- * Após criar/alterar uma Pessoa, enfileira o sync com a Omie usando o mapping
5
- * declarado. No-op seguro se a Omie não estiver configurada (sem app_key).
6
- */
7
- defineTrigger("Pessoa", {
8
- after: async (doc) => {
9
- await omie.sync({
10
- mapping: "pessoa-cliente",
11
- payload: { idPessoa: String(doc._id), nome: doc.nome, email: doc.email, documento: doc.documento },
12
- });
13
- },
14
- });
@@ -1,8 +0,0 @@
1
- {
2
- "schemaVersion": 2,
3
- "backend": { "metadataUrl": "/core/metadata" },
4
- "navigation": { "mode": "auto" },
5
- "collections": [{ "model": "Pessoa", "mode": "dynamic", "section": "Cadastros" }],
6
- "pipelines": [],
7
- "documents": []
8
- }
@@ -1,32 +0,0 @@
1
- /**
2
- * Central __NAME__ — template pedidos-marketplace. Catálogo de produtos +
3
- * esteira de pedidos.
4
- */
5
- module.exports = {
6
- ecosystem: { role: "member" },
7
- activation: { enabled: true, configurationVersion: 1, fields: [] },
8
- name: "__NAME__",
9
- slug: "__SLUG__",
10
-
11
- modules: {
12
- collections: true,
13
- documents: false,
14
- pipelines: true,
15
- integrations: false,
16
- omie: false,
17
- assistants: false,
18
- currencies: false,
19
- },
20
-
21
- domain: {
22
- models: "src/models",
23
- validations: "src/validations",
24
- triggers: "src/triggers",
25
- hooks: "src/hooks",
26
- mappings: "src/mappings",
27
- documents: "src/documents",
28
- pipelines: "src/pipelines",
29
- integrations: "src/integrations",
30
- routes: "src/routes",
31
- },
32
- };
@@ -1,22 +0,0 @@
1
- const { defineModel, fields } = require("@oondemand/oon-core-back");
2
-
3
- /**
4
- * Pedido do marketplace. O campo `status` define as colunas da esteira de
5
- * fulfillment renderizada pelo front (CorePipeline).
6
- */
7
- defineModel({
8
- name: "Pedido",
9
- singular: "pedido",
10
- basePath: "/pedidos",
11
- schema: {
12
- numero: fields.string({ required: true, label: "Número" }),
13
- cliente: fields.string({ label: "Cliente" }),
14
- total: fields.currency({ label: "Total" }),
15
- dataPedido: fields.date({ label: "Data" }),
16
- status: fields.enum(
17
- ["novo", "pago", "separacao", "enviado", "entregue", "cancelado"],
18
- { default: "novo", label: "Status" }
19
- ),
20
- },
21
- crud: { enabled: true, roles: { write: ["admin"] } },
22
- });
@@ -1,16 +0,0 @@
1
- const { defineModel, fields } = require("@oondemand/oon-core-back");
2
-
3
- /** Produto do catálogo do marketplace. */
4
- defineModel({
5
- name: "Produto",
6
- singular: "produto",
7
- basePath: "/produtos",
8
- schema: {
9
- nome: fields.string({ required: true, label: "Produto" }),
10
- sku: fields.string({ label: "SKU" }),
11
- preco: fields.currency({ label: "Preço" }),
12
- estoque: fields.number({ label: "Estoque", default: 0 }),
13
- status: fields.enum(["ativo", "inativo"], { label: "Status", default: "ativo" }),
14
- },
15
- crud: { enabled: true, roles: { write: ["admin"] } },
16
- });
@@ -1,10 +0,0 @@
1
- {
2
- "schemaVersion": 2,
3
- "backend": { "metadataUrl": "/core/metadata" },
4
- "navigation": { "mode": "auto" },
5
- "collections": [{ "model": "Produto", "mode": "dynamic", "section": "Catálogo" }],
6
- "pipelines": [
7
- { "model": "Pedido", "label": "Pedidos", "stageField": "status", "section": "Operação" }
8
- ],
9
- "documents": []
10
- }
@@ -1,32 +0,0 @@
1
- /**
2
- * Central __NAME__ — template servicos-prestados. Esteira de acompanhamento
3
- * dos serviços prestados ao cliente.
4
- */
5
- module.exports = {
6
- ecosystem: { role: "member" },
7
- activation: { enabled: true, configurationVersion: 1, fields: [] },
8
- name: "__NAME__",
9
- slug: "__SLUG__",
10
-
11
- modules: {
12
- collections: true,
13
- documents: false,
14
- pipelines: true,
15
- integrations: false,
16
- omie: false,
17
- assistants: false,
18
- currencies: false,
19
- },
20
-
21
- domain: {
22
- models: "src/models",
23
- validations: "src/validations",
24
- triggers: "src/triggers",
25
- hooks: "src/hooks",
26
- mappings: "src/mappings",
27
- documents: "src/documents",
28
- pipelines: "src/pipelines",
29
- integrations: "src/integrations",
30
- routes: "src/routes",
31
- },
32
- };
@@ -1,15 +0,0 @@
1
- const { defineModel, fields } = require("@oondemand/oon-core-back");
2
-
3
- /** Cliente a quem os serviços são prestados. */
4
- defineModel({
5
- name: "Cliente",
6
- singular: "cliente",
7
- basePath: "/clientes",
8
- schema: {
9
- nome: fields.string({ required: true, label: "Nome" }),
10
- email: fields.string({ label: "E-mail" }),
11
- documento: fields.string({ label: "Documento" }),
12
- status: fields.enum(["ativo", "inativo"], { label: "Status", default: "ativo" }),
13
- },
14
- crud: { enabled: true, roles: { write: ["admin"] } },
15
- });
@@ -1,22 +0,0 @@
1
- const { defineModel, fields } = require("@oondemand/oon-core-back");
2
-
3
- /**
4
- * Serviço prestado a um Cliente. O campo `etapa` define as colunas da esteira
5
- * renderizada pelo front (CorePipeline).
6
- */
7
- defineModel({
8
- name: "ServicoPrestado",
9
- singular: "servicoPrestado",
10
- basePath: "/servicos-prestados",
11
- schema: {
12
- descricao: fields.string({ required: true, label: "Descrição" }),
13
- cliente: fields.ref("Cliente", { required: true, label: "Cliente" }),
14
- valor: fields.currency({ label: "Valor" }),
15
- dataInicio: fields.date({ label: "Início" }),
16
- etapa: fields.enum(["proposta", "em-execucao", "entregue", "faturado", "cancelado"], {
17
- default: "proposta",
18
- label: "Etapa",
19
- }),
20
- },
21
- crud: { enabled: true, roles: { write: ["admin"] } },
22
- });
@@ -1,10 +0,0 @@
1
- {
2
- "schemaVersion": 2,
3
- "backend": { "metadataUrl": "/core/metadata" },
4
- "navigation": { "mode": "auto" },
5
- "collections": [{ "model": "Cliente", "mode": "dynamic", "section": "Cadastros" }],
6
- "pipelines": [
7
- { "model": "ServicoPrestado", "label": "Serviços prestados", "stageField": "etapa", "section": "Operação" }
8
- ],
9
- "documents": []
10
- }
@@ -1,32 +0,0 @@
1
- /**
2
- * Central __NAME__ — template servicos-tomados. Liga o módulo de esteiras
3
- * (pipelines) do Core para acompanhar o processamento dos serviços.
4
- */
5
- module.exports = {
6
- ecosystem: { role: "member" },
7
- activation: { enabled: true, configurationVersion: 1, fields: [] },
8
- name: "__NAME__",
9
- slug: "__SLUG__",
10
-
11
- modules: {
12
- collections: true,
13
- documents: false,
14
- pipelines: true,
15
- integrations: false,
16
- omie: false,
17
- assistants: false,
18
- currencies: false,
19
- },
20
-
21
- domain: {
22
- models: "src/models",
23
- validations: "src/validations",
24
- triggers: "src/triggers",
25
- hooks: "src/hooks",
26
- mappings: "src/mappings",
27
- documents: "src/documents",
28
- pipelines: "src/pipelines",
29
- integrations: "src/integrations",
30
- routes: "src/routes",
31
- },
32
- };
@@ -1,15 +0,0 @@
1
- const { defineModel, fields } = require("@oondemand/oon-core-back");
2
-
3
- /** Prestador de serviço. */
4
- defineModel({
5
- name: "Pessoa",
6
- singular: "pessoa",
7
- basePath: "/pessoas",
8
- schema: {
9
- nome: fields.string({ required: true, label: "Nome" }),
10
- email: fields.string({ label: "E-mail" }),
11
- documento: fields.string({ label: "Documento" }),
12
- status: fields.enum(["ativo", "inativo"], { label: "Status", default: "ativo" }),
13
- },
14
- crud: { enabled: true, roles: { write: ["admin"] } },
15
- });
@@ -1,22 +0,0 @@
1
- const { defineModel, fields } = require("@oondemand/oon-core-back");
2
-
3
- /**
4
- * Serviço tomado, vinculado a uma Pessoa. O campo `statusProcessamento` define
5
- * as colunas da esteira renderizada pelo front (CorePipeline).
6
- */
7
- defineModel({
8
- name: "Servico",
9
- singular: "servico",
10
- basePath: "/servicos",
11
- schema: {
12
- descricao: fields.string({ required: true, label: "Descrição" }),
13
- pessoa: fields.ref("Pessoa", { required: true, label: "Prestador" }),
14
- valor: fields.currency({ label: "Valor" }),
15
- dataContratacao: fields.date({ label: "Contratação" }),
16
- statusProcessamento: fields.enum(
17
- ["aberto", "pendente", "processando", "pago", "cancelado"],
18
- { default: "aberto", label: "Etapa" }
19
- ),
20
- },
21
- crud: { enabled: true, roles: { write: ["admin"] } },
22
- });
@@ -1,10 +0,0 @@
1
- {
2
- "schemaVersion": 2,
3
- "backend": { "metadataUrl": "/core/metadata" },
4
- "navigation": { "mode": "auto" },
5
- "collections": [{ "model": "Pessoa", "label": "Prestadores", "mode": "dynamic", "section": "Cadastros" }],
6
- "pipelines": [
7
- { "model": "Servico", "label": "Serviços tomados", "stageField": "statusProcessamento", "section": "Operação" }
8
- ],
9
- "documents": []
10
- }