# RF-TENANT-002: Configuracion de Tenant

## Identificacion

| Campo | Valor |
|-------|-------|
| **ID** | RF-TENANT-002 |
| **Modulo** | MGN-004 Tenants |
| **Prioridad** | P0 - Critica |
| **Estado** | Ready |
| **Fecha** | 2025-12-05 |

---

## Descripcion

El sistema debe permitir a los administradores de cada tenant personalizar la configuracion de su organizacion, incluyendo informacion de la empresa, branding, configuraciones regionales, y parametros operativos. Esta configuracion afecta el comportamiento del sistema para todos los usuarios del tenant.

---

## Actores

| Actor | Descripcion |
|-------|-------------|
| Tenant Admin | Administrador del tenant que configura |
| Platform Admin | Puede modificar configuracion de cualquier tenant |

---

## Precondiciones

1. Usuario autenticado con permiso `tenants:update` o `settings:update`
2. Tenant activo

---

## Categorias de Configuracion

### 1. Informacion de la Empresa

| Campo | Descripcion | Ejemplo |
|-------|-------------|---------|
| companyName | Nombre legal | Empresa ABC S.A. de C.V. |
| tradeName | Nombre comercial | ABC Corp |
| taxId | RFC/NIT/RUC | EABC850101ABC |
| address | Direccion fiscal | Av. Principal #123 |
| city | Ciudad | Ciudad de Mexico |
| state | Estado/Provincia | CDMX |
| country | Pais | MX |
| postalCode | Codigo postal | 06600 |
| phone | Telefono principal | +52 55 1234 5678 |
| email | Email de contacto | contacto@empresaabc.com |
| website | Sitio web | https://empresaabc.com |

### 2. Branding

| Campo | Descripcion | Ejemplo |
|-------|-------------|---------|
| logo | Logo principal | URL/base64 |
| logoSmall | Logo pequeno/icono | URL/base64 |
| favicon | Favicon | URL/base64 |
| primaryColor | Color primario | #3B82F6 |
| secondaryColor | Color secundario | #10B981 |
| accentColor | Color de acento | #F59E0B |

### 3. Configuracion Regional

| Campo | Descripcion | Ejemplo |
|-------|-------------|---------|
| defaultLanguage | Idioma por defecto | es |
| defaultTimezone | Zona horaria | America/Mexico_City |
| defaultCurrency | Moneda por defecto | MXN |
| dateFormat | Formato de fecha | DD/MM/YYYY |
| timeFormat | Formato de hora | 24h |
| numberFormat | Formato numerico | es-MX |
| firstDayOfWeek | Primer dia semana | 1 (Lunes) |

### 4. Configuracion Operativa

| Campo | Descripcion | Ejemplo |
|-------|-------------|---------|
| fiscalYearStart | Inicio ano fiscal | 01-01 |
| workingDays | Dias laborables | [1,2,3,4,5] |
| businessHoursStart | Inicio horario | 09:00 |
| businessHoursEnd | Fin horario | 18:00 |
| defaultTaxRate | Tasa impuesto default | 16 |
| invoicePrefix | Prefijo facturas | FAC- |
| invoiceNextNumber | Siguiente numero | 1001 |

### 5. Configuracion de Seguridad

| Campo | Descripcion | Ejemplo |
|-------|-------------|---------|
| passwordMinLength | Longitud minima pass | 8 |
| passwordRequireSpecial | Requerir especiales | true |
| sessionTimeout | Timeout sesion (min) | 30 |
| maxLoginAttempts | Intentos maximos | 5 |
| lockoutDuration | Duracion bloqueo (min) | 15 |
| mfaRequired | MFA obligatorio | false |
| ipWhitelist | IPs permitidas | [] |

---

## Flujo Principal

### Ver Configuracion

```
1. Tenant Admin accede a Configuracion > Empresa
2. Sistema muestra configuracion actual organizada en tabs:
   - Informacion General
   - Branding
   - Regional
   - Operaciones
   - Seguridad
3. Admin puede navegar entre tabs
```

### Actualizar Configuracion

```
1. Admin modifica campos deseados
2. Sistema valida en tiempo real
3. Admin click en "Guardar Cambios"
4. Sistema valida todos los campos
5. Sistema guarda configuracion
6. Sistema aplica cambios (algunos requieren recarga)
7. Sistema muestra confirmacion
```

### Subir Logo

```
1. Admin click en "Cambiar Logo"
2. Sistema muestra modal de upload
3. Admin selecciona imagen
4. Sistema valida formato y tamano
5. Sistema genera versiones (original, thumbnail)
6. Sistema actualiza logo
7. Cambio visible inmediatamente en UI
```

---

## Reglas de Negocio

| ID | Regla |
|----|-------|
| RN-001 | Configuracion se hereda de defaults de plataforma |
| RN-002 | Tenant puede sobrescribir cualquier default |
| RN-003 | Algunos campos requieren validacion especial (taxId por pais) |
| RN-004 | Logo: max 5MB, formatos JPG/PNG/SVG |
| RN-005 | Colores deben ser hex validos |
| RN-006 | Cambios de seguridad aplican en siguiente login |
| RN-007 | IP Whitelist vacia = sin restriccion |

---

## Criterios de Aceptacion

### Escenario 1: Ver configuracion actual

```gherkin
Given un Tenant Admin autenticado
When accede a GET /api/v1/tenant/settings
Then el sistema retorna configuracion completa
  And incluye valores del tenant
  And incluye defaults de plataforma donde no hay override
```

### Escenario 2: Actualizar informacion de empresa

```gherkin
Given un Tenant Admin autenticado
When actualiza companyName a "Nueva Empresa S.A."
Then el sistema guarda el cambio
  And retorna configuracion actualizada
  And el nombre aparece en toda la UI del tenant
```

### Escenario 3: Personalizar branding

```gherkin
Given un Tenant Admin con configuracion default
When sube un logo y cambia primaryColor a "#FF5733"
Then el sistema guarda el logo en storage
  And actualiza el color primario
  And la UI refleja los cambios de branding
```

### Escenario 4: Configuracion de seguridad

```gherkin
Given configuracion de seguridad actual
When Tenant Admin establece passwordMinLength=12
Then el sistema guarda la configuracion
  And nuevas contrasenas deben tener minimo 12 caracteres
  And usuarios existentes no son afectados hasta cambio de pass
```

### Escenario 5: Herencia de defaults

```gherkin
Given tenant sin configuracion de timezone
  And plataforma con default "America/Mexico_City"
When se consulta configuracion del tenant
Then timezone muestra "America/Mexico_City"
  And se indica que es valor heredado (no override)
```

---

## Mockup / Wireframe

```
+------------------------------------------------------------------+
|  [Logo]   Configuracion de Empresa                                |
+------------------------------------------------------------------+
| [General] [Branding] [Regional] [Operaciones] [Seguridad]        |
+------------------------------------------------------------------+
|                                                                   |
| Tab: General                                                      |
| ┌─────────────────────────────────────────────────────────────┐  |
| │ INFORMACION LEGAL                                            │  |
| │                                                               │  |
| │ Razon Social      [Empresa ABC S.A. de C.V.         ]       │  |
| │ Nombre Comercial  [ABC Corp                          ]       │  |
| │ RFC               [EABC850101ABC                     ]       │  |
| │                                                               │  |
| │ DIRECCION FISCAL                                             │  |
| │                                                               │  |
| │ Direccion         [Av. Principal #123               ]       │  |
| │ Ciudad            [Ciudad de Mexico                  ]       │  |
| │ Estado            [CDMX                      ▼]              │  |
| │ Codigo Postal     [06600                            ]       │  |
| │ Pais              [Mexico                    ▼]              │  |
| │                                                               │  |
| │ CONTACTO                                                     │  |
| │                                                               │  |
| │ Telefono          [+52 55 1234 5678                 ]       │  |
| │ Email             [contacto@empresaabc.com          ]       │  |
| │ Sitio Web         [https://empresaabc.com           ]       │  |
| └─────────────────────────────────────────────────────────────┘  |
|                                                                   |
| [  Cancelar  ]                           [ Guardar Cambios ]     |
+------------------------------------------------------------------+

Tab: Branding
┌─────────────────────────────────────────────────────────────────┐
│ LOGOS                                                            │
│                                                                   │
│ +-------------+    +-------+                                     │
│ |             |    |       |                                     │
│ |    LOGO     |    | ICON  |    [Cambiar Logo] [Cambiar Icono]  │
│ |             |    |       |                                     │
│ +-------------+    +-------+                                     │
│                                                                   │
│ COLORES                                                          │
│                                                                   │
│ Primario     [#3B82F6] ████████                                 │
│ Secundario   [#10B981] ████████                                 │
│ Acento       [#F59E0B] ████████                                 │
│                                                                   │
│ [Vista previa]                                                   │
└─────────────────────────────────────────────────────────────────┘
```

---

## Notas Tecnicas

### API Endpoints

```typescript
// Obtener configuracion completa
GET /api/v1/tenant/settings

// Response 200
{
  "company": {
    "companyName": "Empresa ABC S.A. de C.V.",
    "tradeName": "ABC Corp",
    "taxId": "EABC850101ABC",
    // ...
    "_inherited": false
  },
  "branding": {
    "logo": "https://storage.../logo.png",
    "primaryColor": "#3B82F6",
    // ...
    "_inherited": ["secondaryColor"]  // campos heredados
  },
  "regional": {
    "defaultLanguage": "es",
    "defaultTimezone": "America/Mexico_City",
    // ...
  },
  "operational": { ... },
  "security": { ... }
}

// Actualizar configuracion (parcial)
PATCH /api/v1/tenant/settings
{
  "company": {
    "companyName": "Nueva Empresa S.A."
  },
  "branding": {
    "primaryColor": "#FF5733"
  }
}

// Subir logo
POST /api/v1/tenant/settings/logo
Content-Type: multipart/form-data
logo: [file]
type: "main" | "small" | "favicon"

// Reset a defaults
POST /api/v1/tenant/settings/reset
{ "sections": ["branding"] }  // o "all"
```

### Estructura de Settings

```typescript
interface TenantSettings {
  company: CompanySettings;
  branding: BrandingSettings;
  regional: RegionalSettings;
  operational: OperationalSettings;
  security: SecuritySettings;
}

// Se guarda como JSONB en la tabla tenant_settings
// con merge inteligente con defaults
```

---

## Dependencias

| ID | Descripcion |
|----|-------------|
| RF-TENANT-001 | Tenant debe existir |
| Storage | Para logos e imagenes |
| Cache | Para settings frecuentes |

---

## Estimacion

| Tarea | Puntos |
|-------|--------|
| Backend: Settings endpoints | 3 |
| Backend: Logo upload | 2 |
| Backend: Merge con defaults | 2 |
| Backend: Tests | 2 |
| Frontend: SettingsPage (5 tabs) | 6 |
| Frontend: BrandingPreview | 2 |
| Frontend: Tests | 2 |
| **Total** | **19 SP** |

---

## Historial

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