gioser

tawasuyu/brahman

Rust 476TOML 190Markdown 50JSON 176602 Definiciones

⎇ 932e7464d7574f32694619763f4561f17b63e5e7 examples/nakui-modules/sales_engine/module.json JSON · 149 líneas · 6.0 KB Historia crudo

feat(nakui-ui): Action::Morphism wired al pipeline real (compute -> log -> apply) 932e7464d · Sergio ·

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 UUID", "kind": "text", "required": true, "help": "Copiá el UUID corto de la lista de Stock — el runtime lo parsea como Uuid completo si es válido." },
131        { "name": "caja_id_input", "label": "Caja UUID", "kind": "text", "required": true, "help": "Idem para Caja." },
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}