@oondemand/create-central-oon 0.1.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 (62) hide show
  1. package/LICENSE +91 -0
  2. package/README.md +70 -0
  3. package/bin/cli.js +58 -0
  4. package/package.json +32 -0
  5. package/src/index.js +117 -0
  6. package/src/render.js +74 -0
  7. package/templates/_base/README.md +27 -0
  8. package/templates/_base/backend/central.config.js +33 -0
  9. package/templates/_base/backend/central.manifest.json +10 -0
  10. package/templates/_base/backend/env.example +12 -0
  11. package/templates/_base/backend/package.json +17 -0
  12. package/templates/_base/backend/src/collections/gitkeep +0 -0
  13. package/templates/_base/backend/src/controllers/gitkeep +0 -0
  14. package/templates/_base/backend/src/documents/gitkeep +0 -0
  15. package/templates/_base/backend/src/hooks/gitkeep +0 -0
  16. package/templates/_base/backend/src/integrations/gitkeep +0 -0
  17. package/templates/_base/backend/src/mappings/gitkeep +0 -0
  18. package/templates/_base/backend/src/models/gitkeep +0 -0
  19. package/templates/_base/backend/src/pipelines/gitkeep +0 -0
  20. package/templates/_base/backend/src/routes/gitkeep +0 -0
  21. package/templates/_base/backend/src/services/gitkeep +0 -0
  22. package/templates/_base/backend/src/triggers/gitkeep +0 -0
  23. package/templates/_base/backend/src/validations/gitkeep +0 -0
  24. package/templates/_base/frontend/central.ui.json +9 -0
  25. package/templates/_base/frontend/env.example +5 -0
  26. package/templates/_base/frontend/index.html +12 -0
  27. package/templates/_base/frontend/package.json +27 -0
  28. package/templates/_base/frontend/src/collections/gitkeep +0 -0
  29. package/templates/_base/frontend/src/dashboards/gitkeep +0 -0
  30. package/templates/_base/frontend/src/documents/gitkeep +0 -0
  31. package/templates/_base/frontend/src/main.tsx +12 -0
  32. package/templates/_base/frontend/src/overrides/gitkeep +0 -0
  33. package/templates/_base/frontend/src/pipelines/gitkeep +0 -0
  34. package/templates/_base/frontend/tsconfig.json +17 -0
  35. package/templates/_base/frontend/vite.config.ts +7 -0
  36. package/templates/_base/gitignore +6 -0
  37. package/templates/basic/backend/src/models/Pessoa.js +19 -0
  38. package/templates/basic/frontend/central.ui.json +9 -0
  39. package/templates/documentos-fiscais/backend/central.config.js +30 -0
  40. package/templates/documentos-fiscais/backend/src/models/DocumentoFiscal.js +23 -0
  41. package/templates/documentos-fiscais/frontend/central.ui.json +17 -0
  42. package/templates/multi-moedas/backend/central.config.js +30 -0
  43. package/templates/multi-moedas/backend/src/models/Cotacao.js +23 -0
  44. package/templates/multi-moedas/backend/src/models/Moeda.js +15 -0
  45. package/templates/multi-moedas/frontend/central.ui.json +12 -0
  46. package/templates/omie-sidecar/backend/central.config.js +31 -0
  47. package/templates/omie-sidecar/backend/src/mappings/pessoa-cliente.js +20 -0
  48. package/templates/omie-sidecar/backend/src/models/Pessoa.js +24 -0
  49. package/templates/omie-sidecar/backend/src/triggers/Pessoa.js +14 -0
  50. package/templates/omie-sidecar/frontend/central.ui.json +9 -0
  51. package/templates/pedidos-marketplace/backend/central.config.js +30 -0
  52. package/templates/pedidos-marketplace/backend/src/models/Pedido.js +22 -0
  53. package/templates/pedidos-marketplace/backend/src/models/Produto.js +16 -0
  54. package/templates/pedidos-marketplace/frontend/central.ui.json +11 -0
  55. package/templates/servicos-prestados/backend/central.config.js +30 -0
  56. package/templates/servicos-prestados/backend/src/models/Cliente.js +15 -0
  57. package/templates/servicos-prestados/backend/src/models/ServicoPrestado.js +22 -0
  58. package/templates/servicos-prestados/frontend/central.ui.json +11 -0
  59. package/templates/servicos-tomados/backend/central.config.js +30 -0
  60. package/templates/servicos-tomados/backend/src/models/Pessoa.js +15 -0
  61. package/templates/servicos-tomados/backend/src/models/Servico.js +22 -0
  62. package/templates/servicos-tomados/frontend/central.ui.json +11 -0
File without changes
@@ -0,0 +1,17 @@
1
+ {
2
+ "compilerOptions": {
3
+ "target": "ES2020",
4
+ "lib": ["ES2020", "DOM", "DOM.Iterable"],
5
+ "module": "ESNext",
6
+ "moduleResolution": "bundler",
7
+ "jsx": "react-jsx",
8
+ "strict": true,
9
+ "skipLibCheck": true,
10
+ "noEmit": true,
11
+ "allowImportingTsExtensions": true,
12
+ "resolveJsonModule": true,
13
+ "isolatedModules": true,
14
+ "types": ["vite/client"]
15
+ },
16
+ "include": ["src", "central.ui.json", "vite.config.ts"]
17
+ }
@@ -0,0 +1,7 @@
1
+ import { defineConfig } from "vite";
2
+ import react from "@vitejs/plugin-react";
3
+
4
+ export default defineConfig({
5
+ plugins: [react()],
6
+ server: { port: 5173 },
7
+ });
@@ -0,0 +1,6 @@
1
+ node_modules
2
+ .env
3
+ dist
4
+ build
5
+ *.log
6
+ .DS_Store
@@ -0,0 +1,19 @@
1
+ const { defineModel, fields } = require("@oondemand/oon-core-back");
2
+
3
+ /**
4
+ * Pessoa — domínio puro: só schema + CRUD. Auth, RBAC, paginação, auditoria e
5
+ * metadata vêm do Core. A tela é renderizada pelo front a partir da metadata.
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
+ status: fields.enum(["ativo", "inativo"], { label: "Status", default: "ativo" }),
17
+ },
18
+ crud: { enabled: true, roles: { write: ["admin"] } },
19
+ });
@@ -0,0 +1,9 @@
1
+ {
2
+ "name": "__NAME__",
3
+ "slug": "__SLUG__",
4
+ "backend": { "metadataUrl": "/core/metadata" },
5
+ "navigation": { "mode": "auto" },
6
+ "collections": [{ "model": "Pessoa", "mode": "dynamic" }],
7
+ "pipelines": [],
8
+ "documents": []
9
+ }
@@ -0,0 +1,30 @@
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
+ name: "__NAME__",
7
+ slug: "__SLUG__",
8
+
9
+ modules: {
10
+ collections: true,
11
+ documents: true,
12
+ pipelines: false,
13
+ integrations: false,
14
+ omie: false,
15
+ assistants: false,
16
+ currencies: false,
17
+ },
18
+
19
+ domain: {
20
+ models: "src/models",
21
+ validations: "src/validations",
22
+ triggers: "src/triggers",
23
+ hooks: "src/hooks",
24
+ mappings: "src/mappings",
25
+ documents: "src/documents",
26
+ pipelines: "src/pipelines",
27
+ integrations: "src/integrations",
28
+ routes: "src/routes",
29
+ },
30
+ };
@@ -0,0 +1,23 @@
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
+ });
@@ -0,0 +1,17 @@
1
+ {
2
+ "name": "__NAME__",
3
+ "slug": "__SLUG__",
4
+ "backend": { "metadataUrl": "/core/metadata" },
5
+ "navigation": { "mode": "auto" },
6
+ "collections": [],
7
+ "pipelines": [],
8
+ "documents": [
9
+ {
10
+ "model": "DocumentoFiscal",
11
+ "label": "Documentos fiscais",
12
+ "approval": true,
13
+ "attachments": true,
14
+ "section": "Fiscal"
15
+ }
16
+ ]
17
+ }
@@ -0,0 +1,30 @@
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
+ name: "__NAME__",
7
+ slug: "__SLUG__",
8
+
9
+ modules: {
10
+ collections: true,
11
+ documents: false,
12
+ pipelines: false,
13
+ integrations: false,
14
+ omie: false,
15
+ assistants: false,
16
+ currencies: true,
17
+ },
18
+
19
+ domain: {
20
+ models: "src/models",
21
+ validations: "src/validations",
22
+ triggers: "src/triggers",
23
+ hooks: "src/hooks",
24
+ mappings: "src/mappings",
25
+ documents: "src/documents",
26
+ pipelines: "src/pipelines",
27
+ integrations: "src/integrations",
28
+ routes: "src/routes",
29
+ },
30
+ };
@@ -0,0 +1,23 @@
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
+ });
@@ -0,0 +1,15 @@
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
+ });
@@ -0,0 +1,12 @@
1
+ {
2
+ "name": "__NAME__",
3
+ "slug": "__SLUG__",
4
+ "backend": { "metadataUrl": "/core/metadata" },
5
+ "navigation": { "mode": "auto" },
6
+ "collections": [
7
+ { "model": "Moeda", "mode": "dynamic", "section": "Multi-moedas" },
8
+ { "model": "Cotacao", "mode": "dynamic", "section": "Multi-moedas" }
9
+ ],
10
+ "pipelines": [],
11
+ "documents": []
12
+ }
@@ -0,0 +1,31 @@
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
+ name: "__NAME__",
8
+ slug: "__SLUG__",
9
+
10
+ modules: {
11
+ collections: true,
12
+ documents: false,
13
+ pipelines: false,
14
+ integrations: true,
15
+ omie: true,
16
+ assistants: false,
17
+ currencies: false,
18
+ },
19
+
20
+ domain: {
21
+ models: "src/models",
22
+ validations: "src/validations",
23
+ triggers: "src/triggers",
24
+ hooks: "src/hooks",
25
+ mappings: "src/mappings",
26
+ documents: "src/documents",
27
+ pipelines: "src/pipelines",
28
+ integrations: "src/integrations",
29
+ routes: "src/routes",
30
+ },
31
+ };
@@ -0,0 +1,20 @@
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
+ });
@@ -0,0 +1,24 @@
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
+ });
@@ -0,0 +1,14 @@
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
+ });
@@ -0,0 +1,9 @@
1
+ {
2
+ "name": "__NAME__",
3
+ "slug": "__SLUG__",
4
+ "backend": { "metadataUrl": "/core/metadata" },
5
+ "navigation": { "mode": "auto" },
6
+ "collections": [{ "model": "Pessoa", "mode": "dynamic", "section": "Cadastros" }],
7
+ "pipelines": [],
8
+ "documents": []
9
+ }
@@ -0,0 +1,30 @@
1
+ /**
2
+ * Central __NAME__ — template pedidos-marketplace. Catálogo de produtos +
3
+ * esteira de pedidos.
4
+ */
5
+ module.exports = {
6
+ name: "__NAME__",
7
+ slug: "__SLUG__",
8
+
9
+ modules: {
10
+ collections: true,
11
+ documents: false,
12
+ pipelines: true,
13
+ integrations: false,
14
+ omie: false,
15
+ assistants: false,
16
+ currencies: false,
17
+ },
18
+
19
+ domain: {
20
+ models: "src/models",
21
+ validations: "src/validations",
22
+ triggers: "src/triggers",
23
+ hooks: "src/hooks",
24
+ mappings: "src/mappings",
25
+ documents: "src/documents",
26
+ pipelines: "src/pipelines",
27
+ integrations: "src/integrations",
28
+ routes: "src/routes",
29
+ },
30
+ };
@@ -0,0 +1,22 @@
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
+ });
@@ -0,0 +1,16 @@
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
+ });
@@ -0,0 +1,11 @@
1
+ {
2
+ "name": "__NAME__",
3
+ "slug": "__SLUG__",
4
+ "backend": { "metadataUrl": "/core/metadata" },
5
+ "navigation": { "mode": "auto" },
6
+ "collections": [{ "model": "Produto", "mode": "dynamic", "section": "Catálogo" }],
7
+ "pipelines": [
8
+ { "model": "Pedido", "label": "Pedidos", "stageField": "status", "section": "Operação" }
9
+ ],
10
+ "documents": []
11
+ }
@@ -0,0 +1,30 @@
1
+ /**
2
+ * Central __NAME__ — template servicos-prestados. Esteira de acompanhamento
3
+ * dos serviços prestados ao cliente.
4
+ */
5
+ module.exports = {
6
+ name: "__NAME__",
7
+ slug: "__SLUG__",
8
+
9
+ modules: {
10
+ collections: true,
11
+ documents: false,
12
+ pipelines: true,
13
+ integrations: false,
14
+ omie: false,
15
+ assistants: false,
16
+ currencies: false,
17
+ },
18
+
19
+ domain: {
20
+ models: "src/models",
21
+ validations: "src/validations",
22
+ triggers: "src/triggers",
23
+ hooks: "src/hooks",
24
+ mappings: "src/mappings",
25
+ documents: "src/documents",
26
+ pipelines: "src/pipelines",
27
+ integrations: "src/integrations",
28
+ routes: "src/routes",
29
+ },
30
+ };
@@ -0,0 +1,15 @@
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
+ });
@@ -0,0 +1,22 @@
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
+ });
@@ -0,0 +1,11 @@
1
+ {
2
+ "name": "__NAME__",
3
+ "slug": "__SLUG__",
4
+ "backend": { "metadataUrl": "/core/metadata" },
5
+ "navigation": { "mode": "auto" },
6
+ "collections": [{ "model": "Cliente", "mode": "dynamic", "section": "Cadastros" }],
7
+ "pipelines": [
8
+ { "model": "ServicoPrestado", "label": "Serviços prestados", "stageField": "etapa", "section": "Operação" }
9
+ ],
10
+ "documents": []
11
+ }
@@ -0,0 +1,30 @@
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
+ name: "__NAME__",
7
+ slug: "__SLUG__",
8
+
9
+ modules: {
10
+ collections: true,
11
+ documents: false,
12
+ pipelines: true,
13
+ integrations: false,
14
+ omie: false,
15
+ assistants: false,
16
+ currencies: false,
17
+ },
18
+
19
+ domain: {
20
+ models: "src/models",
21
+ validations: "src/validations",
22
+ triggers: "src/triggers",
23
+ hooks: "src/hooks",
24
+ mappings: "src/mappings",
25
+ documents: "src/documents",
26
+ pipelines: "src/pipelines",
27
+ integrations: "src/integrations",
28
+ routes: "src/routes",
29
+ },
30
+ };
@@ -0,0 +1,15 @@
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
+ });
@@ -0,0 +1,22 @@
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
+ });
@@ -0,0 +1,11 @@
1
+ {
2
+ "name": "__NAME__",
3
+ "slug": "__SLUG__",
4
+ "backend": { "metadataUrl": "/core/metadata" },
5
+ "navigation": { "mode": "auto" },
6
+ "collections": [{ "model": "Pessoa", "label": "Prestadores", "mode": "dynamic", "section": "Cadastros" }],
7
+ "pipelines": [
8
+ { "model": "Servico", "label": "Serviços tomados", "stageField": "statusProcessamento", "section": "Operação" }
9
+ ],
10
+ "documents": []
11
+ }