⎇ fc727266668baca3ad8d9bc6ac4c09ee62b360b3
examples/nakui-modules/sales_engine/module.json
Historia
crudo
feat(nakui-ui): FieldKind::EntityRef — selector clickable de records existentes
1{
2 "id": "sales_engine",
3 "label": "Ventas (con morphism)",
4 "description": "Módulo conectado al manifest nakui-core 'sales': el form 'Vender' dispara el morphism que valida + mueve stock y caja con KCL post-checks reales.",
5 "nakui_module_dir": "../../../crates/modules/nakui/modules/sales",
6 "entities": [
7 {
8 "name": "Stock",
9 "label": "Stock",
10 "fields": [
11 { "name": "id", "label": "ID", "kind": "text" },
12 { "name": "sku_id", "label": "SKU", "kind": "text", "required": true },
13 { "name": "ubicacion", "label": "Ubicación", "kind": "text" },
14 { "name": "cantidad", "label": "Cantidad", "kind": "number", "required": true }
15 ]
16 },
17 {
18 "name": "Caja",
19 "label": "Caja",
20 "fields": [
21 { "name": "id", "label": "ID", "kind": "text" },
22 { "name": "name", "label": "Nombre", "kind": "text", "required": true },
23 { "name": "currency", "label": "Moneda", "kind": "text", "default": "USD" },
24 { "name": "saldo", "label": "Saldo", "kind": "number", "default": "0" }
25 ]
26 },
27 {
28 "name": "Venta",
29 "label": "Venta",
30 "fields": [
31 { "name": "id", "label": "ID", "kind": "text" },
32 { "name": "stock_id", "label": "Stock ref", "kind": "text" },
33 { "name": "caja_id", "label": "Caja ref", "kind": "text" },
34 { "name": "cantidad", "label": "Cantidad vendida", "kind": "number" },
35 { "name": "precio_unitario", "label": "Precio unit.", "kind": "number" },
36 { "name": "total", "label": "Total", "kind": "number" }
37 ]
38 }
39 ],
40 "menu": [
41 { "label": "Stock", "view": "stock_list", "icon": "📦" },
42 { "label": "+ Stock", "view": "stock_form", "icon": "✚" },
43 { "label": "Cajas", "view": "caja_list", "icon": "💰" },
44 { "label": "+ Caja", "view": "caja_form", "icon": "✚" },
45 { "label": "Ventas registradas", "view": "venta_list", "icon": "🧾" },
46 { "label": "Vender", "view": "vender_form", "icon": "⚡" }
47 ],
48 "views": {
49 "stock_list": {
50 "kind": "list",
51 "title": "Stock",
52 "entity": "Stock",
53 "columns": [
54 { "field": "sku_id", "label": "SKU", "weight": 1.5 },
55 { "field": "ubicacion", "label": "Ubicación", "weight": 1.5 },
56 { "field": "cantidad", "label": "Cantidad", "weight": 1.0 }
57 ],
58 "actions": [
59 { "kind": "open_view", "view": "stock_form", "label": "✚ Stock" }
60 ],
61 "search_in": ["sku_id", "ubicacion"]
62 },
63 "stock_form": {
64 "kind": "form",
65 "title": "Nuevo stock",
66 "entity": "Stock",
67 "fields": [
68 { "name": "id", "label": "ID interno", "kind": "text", "help": "El UUID lo genera el runtime; este field es para el campo `id` de la entity (Nakui lo usa)." },
69 { "name": "sku_id", "label": "SKU", "kind": "text", "required": true },
70 { "name": "ubicacion", "label": "Ubicación", "kind": "text", "required": true, "default": "loc-default" },
71 { "name": "cantidad", "label": "Cantidad inicial", "kind": "number", "required": true, "default": "0" }
72 ],
73 "on_submit": {
74 "kind": "seed_entity",
75 "entity": "Stock",
76 "next_view": "stock_list"
77 }
78 },
79 "caja_list": {
80 "kind": "list",
81 "title": "Cajas",
82 "entity": "Caja",
83 "columns": [
84 { "field": "name", "label": "Nombre", "weight": 2.0 },
85 { "field": "currency", "label": "Moneda", "weight": 0.5 },
86 { "field": "saldo", "label": "Saldo", "weight": 1.0 }
87 ],
88 "actions": [
89 { "kind": "open_view", "view": "caja_form", "label": "✚ Caja" }
90 ],
91 "search_in": ["name", "currency"]
92 },
93 "caja_form": {
94 "kind": "form",
95 "title": "Nueva caja",
96 "entity": "Caja",
97 "fields": [
98 { "name": "id", "label": "ID interno", "kind": "text" },
99 { "name": "name", "label": "Nombre", "kind": "text", "required": true },
100 { "name": "currency", "label": "Moneda", "kind": "text", "default": "USD" },
101 { "name": "saldo", "label": "Saldo inicial", "kind": "number", "default": "0" }
102 ],
103 "on_submit": {
104 "kind": "seed_entity",
105 "entity": "Caja",
106 "next_view": "caja_list"
107 }
108 },
109 "venta_list": {
110 "kind": "list",
111 "title": "Ventas",
112 "entity": "Venta",
113 "columns": [
114 { "field": "stock_id", "label": "Stock ref", "weight": 1.0 },
115 { "field": "caja_id", "label": "Caja ref", "weight": 1.0 },
116 { "field": "cantidad", "label": "Cant.", "weight": 0.6 },
117 { "field": "precio_unitario", "label": "Precio", "weight": 0.8 },
118 { "field": "total", "label": "Total", "weight": 1.0 }
119 ],
120 "actions": [
121 { "kind": "open_view", "view": "vender_form", "label": "⚡ Vender" }
122 ],
123 "search_in": ["stock_id", "caja_id"]
124 },
125 "vender_form": {
126 "kind": "form",
127 "title": "Vender (morphism)",
128 "entity": "Venta",
129 "fields": [
130 { "name": "stock_id_input", "label": "Stock", "kind": "entity_ref", "ref_entity": "Stock", "required": true, "help": "Click en un Stock de la lista para seleccionar." },
131 { "name": "caja_id_input", "label": "Caja", "kind": "entity_ref", "ref_entity": "Caja", "required": true, "help": "Click en una Caja de la lista para seleccionar." },
132 { "name": "venta_id", "label": "Venta UUID (idempotencia)", "kind": "text", "required": true, "help": "UUID nuevo por cada intento; mismo UUID = idempotente." },
133 { "name": "cantidad", "label": "Cantidad a vender", "kind": "number", "required": true, "default": "1" },
134 { "name": "precio_unitario", "label": "Precio unitario", "kind": "number", "required": true, "default": "0" },
135 { "name": "timestamp", "label": "Timestamp ISO", "kind": "text", "required": true, "default": "2026-05-09T12:00:00Z" }
136 ],
137 "on_submit": {
138 "kind": "morphism",
139 "name": "vender",
140 "inputs": {
141 "stock": "stock_id_input",
142 "caja": "caja_id_input"
143 },
144 "params": ["venta_id", "cantidad", "precio_unitario", "timestamp"],
145 "next_view": "venta_list"
146 }
147 }
148 }
149}