feat(nakui): módulo crm — clientes, pipeline de ventas, interacciones

Módulo CRM declarativo (schema.ncl + nsmc.json + morfismos Rhai) con
tres entities (Cliente, Oportunidad, Interaccion) y tres morfismos:
abrir_oportunidad, mover_oportunidad (pipeline con validación de
transiciones) y registrar_interaccion.

crm_demo: demo realista de 18 eventos que —a diferencia de los otros
demos— conserva el event log e imprime el comando de nakui-explorer,
así el explorador muestra un CRM con cuerpo. tests/crm.rs: 8 tests.

Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
This commit is contained in:
sergio
2026-05-21 18:21:09 +00:00
parent bb21c28eb1
commit 78fbde12b4
38 changed files with 1229 additions and 334 deletions
+25 -1
View File
@@ -2,7 +2,31 @@
ERP categórico.
### fix(nakui-core): schema_bundle_hash debe reflejar el contenido real del schema
### feat(nakui): módulo `crm` — clientes, pipeline de ventas, interacciones
Módulo CRM funcional, declarativo como inventory/sales/treasury
(`crates/modules/nakui/modules/crm/`): `schema.ncl` + `nsmc.json` +
morfismos Rhai. Tres entities — `Cliente`, `Oportunidad`, `Interaccion`
— y tres morfismos:
- `abrir_oportunidad(cliente)` — crea una `Oportunidad` en etapa
`prospecto`.
- `mover_oportunidad(oportunidad)` — avanza el pipeline
(prospecto→calificado→propuesta→negociacion→ganada/perdida). Valida:
etapa destino conocida, no mover una oportunidad cerrada, no retroceder.
- `registrar_interaccion(cliente)` — crea una `Interaccion`
(llamada/email/reunión).
- `core/src/bin/crm_demo.rs` — demo realista (3 clientes, 18 eventos).
A diferencia de los otros demos **no borra el event log**: lo deja en
disco e imprime el comando para abrirlo con `nakui-explorer` — así el
explorador, que sólo mostraba un log vacío, muestra un CRM con cuerpo.
- `core/tests/crm.rs` — 8 tests de integración (pipeline completo +
rechazos: retroceso, oportunidad cerrada, etapa/canal/monto inválidos).
Nota: el engine Rhai de `nakui-core` es `Engine::new_raw()` con paquetes
selectos — `Array::index_of` no resuelve; los morfismos usan sólo
`if`/`==`/`throw`.
Iter 17. Regresión surfaceada por el workspace test
`verify_log_rejects_seed_after_schema_kcl_changes` (rebautizado a
`verify_log_rejects_seed_after_schema_changes`).