clinica-dental/docs/04-fase-saas/MGN-017-plans/README.md
rckrdmrd 27b4e7bccf [DOCS] feat: Add phase 04-SAAS and 05-IA documentation structure
- Update docs/_MAP.md with new phase references
- Add docs/04-fase-saas/ phase structure
- Add docs/05-fase-ia/ phase structure

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-01-16 00:28:18 -06:00

174 lines
5.0 KiB
Markdown

---
id: MGN-017-plans
title: Modulo Plans - Planes y Feature Gating para Clinica Dental
type: Module
status: Draft
version: 1.0.0
created_date: 2026-01-13
updated_date: 2026-01-13
source: erp-core/MGN-017-plans
normativas: [NOM-013-SSA2-2015]
---
# MGN-017: Modulo Plans - Planes y Feature Gating Dental
## Descripcion
El modulo **Plans** gestiona la definicion de planes de suscripcion para clinicas dentales, feature gating por plan, y enforcement de limites y cuotas por consultorio. Controla acceso a funcionalidades especializadas como odontograma digital, radiografias, ortodoncia 3D y herramientas de IA.
## Objetivos
1. **Definicion de Planes Dentales** - Planes diferenciados por tipo de consultorio
2. **Feature Gating Odontologico** - Control de acceso a funcionalidades dentales
3. **Limites por Sillon** - Enforcar limites por numero de sillones
4. **Usage Tracking** - Monitorear uso de funcionalidades
5. **Upgrade/Downgrade** - Flujos para cambio de plan
## Planes para Clinica Dental
| Plan | Precio/mes | Sillones | Usuarios | Storage | Pacientes/mes |
|------|------------|----------|----------|---------|---------------|
| **Consultorio** | $499 MXN | 1 | 3 | 5 GB | 100 |
| **Clinica** | $1,499 MXN | 5 | 15 | 25 GB | 500 |
| **Centro Dental** | $3,999 MXN | Ilimitado | Ilimitado | 100 GB | Ilimitado |
## Features por Plan
| Feature | Consultorio | Clinica | Centro Dental |
|---------|-------------|---------|---------------|
| odontograma_basico | Si | Si | Si |
| odontograma_digital | No | Si | Si |
| radiografias_digitales | No | Si | Si |
| ortodoncia_3d | No | No | Si |
| presupuestos_dentales | Si | Si | Si |
| reportes_basicos | Si | Si | Si |
| reportes_avanzados | No | Si | Si |
| whatsapp_business | No | No | Si |
| asistente_ia | No | No | Si |
| multi_sucursal | No | No | Si |
| api_access | No | Si | Si |
| exportar_datos | Si | Si | Si |
| historial_auditoria | 7 dias | 30 dias | 365 dias |
## Limites por Plan
| Limite | Consultorio | Clinica | Centro Dental |
|--------|-------------|---------|---------------|
| Sillones | 1 | 5 | Ilimitado |
| Usuarios | 3 | 15 | Ilimitado |
| Pacientes/mes | 100 | 500 | Ilimitado |
| Storage | 5 GB | 25 GB | 100 GB |
| Radiografias/mes | 50 | 250 | Ilimitado |
| API calls/mes | 0 | 10,000 | Ilimitado |
## Alcance
| Caracteristica | Incluido | Notas |
|----------------|----------|-------|
| Plans CRUD | Si | Admin only |
| Limites por sillon | Si | Enforcement estricto |
| Feature flags dentales | Si | Boolean y limites |
| Quota enforcement | Si | Middleware |
| Usage tracking | Si | Snapshots diarios |
| Usage alerts | Si | 80%, 90%, 100% |
| Overage billing | No | Fase posterior |
## Arquitectura
### Flujo de Quota Check
```
Request (ej: crear_radiografia)
|
v
+-------------------+
| QuotaMiddleware |-----> Permitido (si dentro de limite)
+-------------------+
|
v (check)
+-------------------+
| PlanLimitsService |
+-------------------+
|
v
+-------------------+
| Usage Tracking |
+-------------------+
|
v (excede limite)
QuotaExceededException -> "Limite de radiografias alcanzado"
```
### Prioridad de Evaluacion
1. **Tenant Override** - Maxima prioridad, excepciones manuales
2. **Plan Features** - Features incluidas en plan de la clinica
3. **Global Flag** - Valor default con soporte de rollout
## Casos de Uso Odontologicos
### Ejemplo: Verificar Feature Odontograma Digital
```typescript
// Controller
@Get('odontograma/digital')
@FeatureGuard('odontograma_digital')
async getDigitalOdontograma(@Tenant() tenant: Tenant) {
// Solo accesible para planes Clinica y Centro
return this.odontogramaService.getDigital(tenant.id);
}
```
### Ejemplo: Verificar Limite de Radiografias
```typescript
// Antes de crear radiografia
const canCreate = await this.quotaService.checkLimit(
tenantId,
'radiografias_mes',
1 // cantidad a crear
);
if (!canCreate) {
throw new QuotaExceededException(
'Limite de radiografias mensuales alcanzado. ' +
'Actualiza a plan Clinica para mas radiografias.'
);
}
```
## Contenido del Modulo
- [_MAP.md](./_MAP.md) - Indice del modulo
- [requerimientos/](./requerimientos/) - Requerimientos funcionales
- [especificaciones/](./especificaciones/) - Especificaciones tecnicas
- [historias-usuario/](./historias-usuario/) - User stories
- [implementacion/](./implementacion/) - Trazabilidad
## Dependencias
### Modulos Requeridos
- **MGN-001-tenants** - Gestion de tenants (tenant_id)
- **MGN-016-billing** - Suscripciones y pagos (plan_id)
### Modulos Dependientes
- Odontograma (feature gating)
- Radiografias (limites)
- Ortodoncia (feature gating)
- IA (feature gating)
- WhatsApp (feature gating)
## Referencias
- **Fuente:** [erp-core/MGN-017-plans](../../../../../erp-core/docs/04-fase-saas/MGN-017-plans/)
- **Billing:** [MGN-016-billing](../MGN-016-billing/)
- **Feature Flags:** [MGN-019-feature-flags](../MGN-019-feature-flags/)
---
*Modulo: MGN-017-plans | Clinica Dental*
*Propagado desde erp-core via erp-clinicas*
*Actualizado: 2026-01-13*