# RF-SETTINGS-002: Configuraciones por Tenant

## Identificacion

| Campo | Valor |
|-------|-------|
| **ID** | RF-SETTINGS-002 |
| **Modulo** | MGN-006 Settings |
| **Titulo** | Configuraciones por Tenant |
| **Prioridad** | P0 - Critica |
| **Estado** | Draft |
| **Fecha** | 2025-12-05 |

---

## Descripcion

El sistema debe permitir que cada tenant configure parametros especificos de su organizacion, como zona horaria, formato de fecha, moneda por defecto, y otras preferencias de negocio.

---

## Requisitos Funcionales

### RF-SETTINGS-002.1: Estructura de Configuracion por Tenant

| Campo | Tipo | Descripcion |
|-------|------|-------------|
| id | UUID | Identificador unico |
| tenant_id | UUID | FK al tenant |
| key | VARCHAR(100) | Clave de configuracion |
| value | JSONB | Valor de la configuracion |
| data_type | ENUM | Tipo de dato |
| inherited_from | ENUM | system, plan, custom |
| is_overridden | BOOLEAN | Si sobreescribe valor heredado |

### RF-SETTINGS-002.2: Herencia de Configuraciones

Las configuraciones tienen una jerarquia de herencia:

```
SYSTEM (base)
    │
    └── PLAN (por plan de suscripcion)
            │
            └── TENANT (personalizado)
```

**Reglas:**
- Si tenant no tiene valor, usa el del plan
- Si plan no tiene valor, usa el del sistema
- Un tenant puede sobreescribir valores del plan
- Algunos valores del sistema no son sobreescribibles

### RF-SETTINGS-002.3: Configuraciones de Localizacion

| Key | Tipo | Default | Descripcion |
|-----|------|---------|-------------|
| `locale.timezone` | string | UTC | Zona horaria |
| `locale.date_format` | string | YYYY-MM-DD | Formato fecha |
| `locale.time_format` | string | HH:mm:ss | Formato hora |
| `locale.currency_id` | UUID | null | Moneda por defecto |
| `locale.language` | string | es | Idioma |
| `locale.country_id` | UUID | null | Pais por defecto |

### RF-SETTINGS-002.4: Configuraciones de Negocio

| Key | Tipo | Default | Descripcion |
|-----|------|---------|-------------|
| `business.fiscal_year_start` | string | 01-01 | Inicio año fiscal |
| `business.week_start` | number | 1 | Dia inicio semana (1=Lunes) |
| `business.default_payment_terms` | number | 30 | Dias de credito |
| `business.require_vat` | boolean | false | VAT obligatorio |
| `business.tax_inclusive` | boolean | false | Precios con impuesto |

### RF-SETTINGS-002.5: Configuraciones de Apariencia

| Key | Tipo | Default | Descripcion |
|-----|------|---------|-------------|
| `appearance.logo_url` | string | null | Logo del tenant |
| `appearance.primary_color` | string | #1976d2 | Color primario |
| `appearance.favicon_url` | string | null | Favicon |
| `appearance.company_name` | string | null | Nombre a mostrar |

### RF-SETTINGS-002.6: Configuraciones de Modulos

Cada modulo puede tener configuraciones especificas:

```typescript
// Ejemplo: Configuraciones de inventario
{
  'inventory.default_warehouse_id': UUID,
  'inventory.allow_negative_stock': boolean,
  'inventory.auto_reorder': boolean
}

// Ejemplo: Configuraciones de ventas
{
  'sales.default_tax_id': UUID,
  'sales.require_approval': boolean,
  'sales.approval_threshold': number
}
```

---

## Operaciones CRUD

### Listar Configuraciones del Tenant

```typescript
GET /api/v1/settings/tenant?category=locale

Response:
{
  "data": [
    {
      "key": "locale.timezone",
      "value": "America/Mexico_City",
      "inheritedFrom": "custom",
      "isOverridden": true,
      "defaultValue": "UTC"
    }
  ]
}
```

### Obtener Configuracion Efectiva

```typescript
GET /api/v1/settings/tenant/:key

Response:
{
  "key": "locale.timezone",
  "value": "America/Mexico_City",
  "effectiveValue": "America/Mexico_City",
  "inheritedFrom": "custom",
  "systemDefault": "UTC",
  "planDefault": "America/Mexico_City"
}
```

### Actualizar Configuracion

```typescript
PUT /api/v1/settings/tenant/:key
{
  "value": "America/Bogota"
}
```

### Restaurar a Valor Heredado

```typescript
DELETE /api/v1/settings/tenant/:key

// Elimina la sobreescritura, vuelve al valor del plan/sistema
```

### Obtener Todas las Configuraciones Efectivas

```typescript
GET /api/v1/settings/tenant/effective

Response:
{
  "locale": {
    "timezone": "America/Mexico_City",
    "dateFormat": "DD/MM/YYYY",
    "currency": { "id": "...", "code": "MXN" }
  },
  "business": {
    "fiscalYearStart": "01-01",
    "weekStart": 1
  }
}
```

---

## Reglas de Negocio

| ID | Regla | Severidad |
|----|-------|-----------|
| BR-001 | Admin del tenant puede modificar configuraciones | Error |
| BR-002 | Configuraciones bloqueadas por plan no son editables | Error |
| BR-003 | Timezone debe ser valida (IANA) | Error |
| BR-004 | Currency debe existir en catalogos | Error |
| BR-005 | Cambios se replican a cache inmediatamente | Info |

---

## Criterios de Aceptacion

- [ ] Configuraciones por tenant aisladas
- [ ] Herencia system -> plan -> tenant funcional
- [ ] Sobreescritura y restauracion de valores
- [ ] Cache de configuraciones efectivas
- [ ] Validacion de valores segun tipo
- [ ] UI para editar configuraciones

---

## Historial

| Version | Fecha | Autor | Cambios |
|---------|-------|-------|---------|
| 1.0 | 2025-12-05 | Requirements-Analyst | Creacion inicial |
