gioser

tawasuyu/brahman

Rust 492TOML 194Markdown 53JSON 176939 Sutichaykuna

⎇ 6588d0ed6c355a57194a34a488c1ff2b3d8eb6b3 examples/nakui-modules/crm/module.json JSON · 233 siq'ikuna · 9.6 KB Ñawpa willay ch'uya

feat(nakui): Fase 3 del ERP — ficha de detalle 6588d0ed6 · sergio ·

1{
2  "id": "crm",
3  "label": "CRM",
4  "description": "CRM conectado al módulo nakui-core 'crm': clientes, oportunidades que recorren un pipeline de ventas e interacciones. Los formularios «Abrir», «Mover» y «Registrar» disparan morfismos reales con validación del kernel.",
5  "nakui_module_dir": "../../../crates/modules/nakui/modules/crm",
6  "entities": [
7    {
8      "name": "Cliente",
9      "label": "Cliente",
10      "fields": [
11        { "name": "id", "label": "ID", "kind": "text" },
12        { "name": "nombre", "label": "Nombre", "kind": "text", "required": true },
13        { "name": "email", "label": "Email", "kind": "text", "required": true },
14        { "name": "empresa", "label": "Empresa", "kind": "text" }
15      ]
16    },
17    {
18      "name": "Oportunidad",
19      "label": "Oportunidad",
20      "fields": [
21        { "name": "id", "label": "ID", "kind": "text" },
22        { "name": "cliente_id", "label": "Cliente", "kind": "entity_ref", "ref_entity": "Cliente" },
23        { "name": "titulo", "label": "Título", "kind": "text" },
24        { "name": "monto", "label": "Monto", "kind": "number" },
25        { "name": "currency", "label": "Moneda", "kind": "text" },
26        { "name": "etapa", "label": "Etapa", "kind": "text" },
27        { "name": "timestamp", "label": "Fecha", "kind": "text" }
28      ]
29    },
30    {
31      "name": "Interaccion",
32      "label": "Interacción",
33      "fields": [
34        { "name": "id", "label": "ID", "kind": "text" },
35        { "name": "cliente_id", "label": "Cliente", "kind": "entity_ref", "ref_entity": "Cliente" },
36        { "name": "canal", "label": "Canal", "kind": "text" },
37        { "name": "nota", "label": "Nota", "kind": "multiline" },
38        { "name": "timestamp", "label": "Fecha", "kind": "text" }
39      ]
40    }
41  ],
42  "menu": [
43    { "label": "Clientes", "view": "cliente_list", "icon": "👤" },
44    { "label": "+ Cliente", "view": "cliente_form", "icon": "✚" },
45    { "label": "Oportunidades", "view": "oportunidad_list", "icon": "🎯" },
46    { "label": "Abrir oportunidad", "view": "abrir_form", "icon": "✚" },
47    { "label": "Mover oportunidad", "view": "mover_form", "icon": "⏩" },
48    { "label": "Interacciones", "view": "interaccion_list", "icon": "💬" },
49    { "label": "Registrar interacción", "view": "interaccion_form", "icon": "✚" }
50  ],
51  "views": {
52    "cliente_list": {
53      "kind": "list",
54      "title": "Clientes",
55      "entity": "Cliente",
56      "columns": [
57        { "field": "nombre", "label": "Nombre", "weight": 2.0 },
58        { "field": "email", "label": "Email", "weight": 2.5 },
59        { "field": "empresa", "label": "Empresa", "weight": 2.0 }
60      ],
61      "actions": [
62        { "kind": "open_view", "view": "cliente_form", "label": "✚ Nuevo cliente" }
63      ],
64      "search_in": ["nombre", "email", "empresa"],
65      "row_detail": "cliente_detail"
66    },
67    "cliente_form": {
68      "kind": "form",
69      "title": "Nuevo cliente",
70      "entity": "Cliente",
71      "fields": [
72        { "name": "nombre", "label": "Nombre", "kind": "text", "required": true },
73        { "name": "email", "label": "Email", "kind": "text", "required": true },
74        { "name": "empresa", "label": "Empresa", "kind": "text" }
75      ],
76      "on_submit": {
77        "kind": "seed_entity",
78        "entity": "Cliente",
79        "next_view": "cliente_list"
80      }
81    },
82    "oportunidad_list": {
83      "kind": "list",
84      "title": "Oportunidades",
85      "entity": "Oportunidad",
86      "columns": [
87        { "field": "titulo", "label": "Título", "weight": 2.5 },
88        { "field": "etapa", "label": "Etapa", "weight": 1.2 },
89        { "field": "monto", "label": "Monto", "weight": 1.2, "format": { "kind": "currency", "symbol": "$" } },
90        { "field": "cliente_id", "label": "Cliente", "weight": 2.0, "ref_entity": "Cliente" }
91      ],
92      "actions": [
93        { "kind": "open_view", "view": "abrir_form", "label": "✚ Abrir oportunidad" },
94        { "kind": "open_view", "view": "mover_form", "label": "⏩ Mover etapa" }
95      ],
96      "search_in": ["titulo", "etapa"],
97      "row_detail": "oportunidad_detail"
98    },
99    "abrir_form": {
100      "kind": "form",
101      "title": "Abrir oportunidad (morphism)",
102      "entity": "Oportunidad",
103      "fields": [
104        { "name": "cliente_ref", "label": "Cliente", "kind": "entity_ref", "ref_entity": "Cliente", "required": true, "help": "Click en un cliente de la lista para seleccionarlo." },
105        { "name": "oportunidad_id", "label": "ID de la oportunidad", "kind": "auto_id" },
106        { "name": "titulo", "label": "Título", "kind": "text", "required": true },
107        { "name": "monto", "label": "Monto", "kind": "number", "required": true, "default": "0" },
108        { "name": "currency", "label": "Moneda", "kind": "text", "default": "USD" },
109        { "name": "timestamp", "label": "Fecha ISO", "kind": "text", "required": true, "default": "2026-05-21T12:00:00Z" }
110      ],
111      "on_submit": {
112        "kind": "morphism",
113        "name": "abrir_oportunidad",
114        "inputs": { "cliente": "cliente_ref" },
115        "params": ["oportunidad_id", "titulo", "monto", "currency", "timestamp"],
116        "next_view": "oportunidad_list"
117      }
118    },
119    "mover_form": {
120      "kind": "form",
121      "title": "Mover oportunidad (morphism)",
122      "entity": "Oportunidad",
123      "fields": [
124        { "name": "oportunidad_ref", "label": "Oportunidad", "kind": "entity_ref", "ref_entity": "Oportunidad", "required": true, "help": "Click en una oportunidad de la lista." },
125        {
126          "name": "etapa", "label": "Etapa destino", "kind": "select", "required": true,
127          "options": [
128            { "value": "prospecto", "label": "Prospecto" },
129            { "value": "calificado", "label": "Calificado" },
130            { "value": "propuesta", "label": "Propuesta" },
131            { "value": "negociacion", "label": "Negociación" },
132            { "value": "ganada", "label": "Ganada" },
133            { "value": "perdida", "label": "Perdida" }
134          ]
135        },
136        { "name": "timestamp", "label": "Fecha ISO", "kind": "text", "required": true, "default": "2026-05-21T12:00:00Z" }
137      ],
138      "on_submit": {
139        "kind": "morphism",
140        "name": "mover_oportunidad",
141        "inputs": { "oportunidad": "oportunidad_ref" },
142        "params": ["etapa", "timestamp"],
143        "next_view": "oportunidad_list"
144      }
145    },
146    "interaccion_list": {
147      "kind": "list",
148      "title": "Interacciones",
149      "entity": "Interaccion",
150      "columns": [
151        { "field": "canal", "label": "Canal", "weight": 1.0 },
152        { "field": "nota", "label": "Nota", "weight": 3.0 },
153        { "field": "cliente_id", "label": "Cliente", "weight": 2.0, "ref_entity": "Cliente" },
154        { "field": "timestamp", "label": "Fecha", "weight": 1.2 }
155      ],
156      "actions": [
157        { "kind": "open_view", "view": "interaccion_form", "label": "✚ Registrar interacción" }
158      ],
159      "search_in": ["canal", "nota"]
160    },
161    "interaccion_form": {
162      "kind": "form",
163      "title": "Registrar interacción (morphism)",
164      "entity": "Interaccion",
165      "fields": [
166        { "name": "cliente_ref", "label": "Cliente", "kind": "entity_ref", "ref_entity": "Cliente", "required": true, "help": "Click en un cliente de la lista." },
167        { "name": "interaccion_id", "label": "ID de la interacción", "kind": "auto_id" },
168        {
169          "name": "canal", "label": "Canal", "kind": "select", "required": true,
170          "options": [
171            { "value": "llamada", "label": "Llamada" },
172            { "value": "email", "label": "Email" },
173            { "value": "reunion", "label": "Reunión" }
174          ]
175        },
176        { "name": "nota", "label": "Nota", "kind": "multiline" },
177        { "name": "timestamp", "label": "Fecha ISO", "kind": "text", "required": true, "default": "2026-05-21T12:00:00Z" }
178      ],
179      "on_submit": {
180        "kind": "morphism",
181        "name": "registrar_interaccion",
182        "inputs": { "cliente": "cliente_ref" },
183        "params": ["interaccion_id", "canal", "nota", "timestamp"],
184        "next_view": "interaccion_list"
185      }
186    },
187    "cliente_detail": {
188      "kind": "detail",
189      "title": "Ficha del cliente",
190      "entity": "Cliente",
191      "fields": [
192        { "field": "nombre", "label": "Nombre" },
193        { "field": "email", "label": "Email" },
194        { "field": "empresa", "label": "Empresa" }
195      ],
196      "related": [
197        {
198          "title": "Oportunidades",
199          "entity": "Oportunidad",
200          "via_field": "cliente_id",
201          "columns": [
202            { "field": "titulo", "label": "Título", "weight": 2.5 },
203            { "field": "etapa", "label": "Etapa", "weight": 1.2 },
204            { "field": "monto", "label": "Monto", "weight": 1.2, "format": { "kind": "currency", "symbol": "$" } }
205          ]
206        },
207        {
208          "title": "Interacciones",
209          "entity": "Interaccion",
210          "via_field": "cliente_id",
211          "columns": [
212            { "field": "canal", "label": "Canal", "weight": 1.0 },
213            { "field": "nota", "label": "Nota", "weight": 3.0 },
214            { "field": "timestamp", "label": "Fecha", "weight": 1.2 }
215          ]
216        }
217      ]
218    },
219    "oportunidad_detail": {
220      "kind": "detail",
221      "title": "Ficha de la oportunidad",
222      "entity": "Oportunidad",
223      "fields": [
224        { "field": "titulo", "label": "Título" },
225        { "field": "etapa", "label": "Etapa" },
226        { "field": "monto", "label": "Monto", "format": { "kind": "currency", "symbol": "$" } },
227        { "field": "currency", "label": "Moneda" },
228        { "field": "cliente_id", "label": "Cliente", "ref_entity": "Cliente" },
229        { "field": "timestamp", "label": "Fecha" }
230      ]
231    }
232  }
233}