⎇ 6588d0ed6c355a57194a34a488c1ff2b3d8eb6b3
examples/nakui-modules/crm/module.json
Ñawpa willay
ch'uya
feat(nakui): Fase 3 del ERP — ficha de detalle
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}