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:
+25
-1
@@ -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`).
|
||||
|
||||
Reference in New Issue
Block a user