# Validación de campos
## Resumen
Este documento define una nueva estructura de validación simple y estandarizada para todos los _agentFields_.
**Principio Clave**: Todas las validaciones se definen directamente en el archivo `agent-fields.json`. No se necesitan archivos externos de reglas de validación.
## Estructura Estándar de Validación
**Todas las validaciones deben estar contenidas en un _array_ `validations` :**
Es aquí donde se contiene las diferentes reglas que se validan para el campo. Se define el tipo de validación, el valor que se debe validar y el mensaje de error que se muestra cuando rompe la regla.
```json
{
"id": "receiverAccountNumber",
"label": "Número de cuenta",
"placeholder": "Ingrese su número de cuenta",
"type": "input",
"validations": [
{
"type": "regex",
"value": "^[0-9]{13,14}$",
"message": "El número de cuenta debe tener 13-14 dígitos"
}
]
}
```
## Tipos de Reglas Estándar
Inicialmente se considera la implementación de reglas comunes, permitiendo la escalabilidad mediante la expansión de ellas adicionando nuevas reglas a futuro según sea necesario.
### 1. Validación Regex
```json
{
"type": "regex",
"value": "^[0-9]{13,14}$",
"message": "Debe tener 13-14 dígitos"
}
```
### 2. Longitud Mínima
```json
{
"type": "min",
"value": 6,
"message": "Debe tener al menos 6 caracteres"
}
```
### 3. Longitud Máxima
```json
{
"type": "max",
"value": 12,
"message": "Debe tener como máximo 12 caracteres"
}
```
### 4. Requerido
```json
{
"type": "required",
"message": "Este campo es requerido"
}
```
### 5. Email
```json
{
"type": "email",
"message": "Debe ser una dirección de email válida"
}
```
### 6. Numérico
```json
{
"type": "numeric",
"message": "Debe contener solo números"
}
```
## Proceso de estandarización
### Utilizando los formatos actuales
Actualmente se utiliza validaciones con diferentes estructuras, persiguiendo un mismo objetivo que es validar entradas en campos ya sea mediante formularios o al momento de validar los datos enviados en el servidor.
A cotinuación se entregan ejemplos de estandarización para las diferentes validaciones utilizadas actualmente.
#### Formato Actual 1 (String Simple)
```json
// ❌ Actual
"validation": "^[0-9]{13,14}$"
// ✅ Estandarizado
"validations": [
{
"type": "regex",
"value": "^[0-9]{13,14}$",
"message": "Debe tener 13-14 dígitos"
}
]
```
#### Formato Actual 2 (Array con Mensajes)
```json
// ❌ Actual
"validation": [
{
"message": "Debe comenzar por 591",
"pattern": "^591.*$"
},
{
"message": "Debe tener 11 dígitos",
"pattern": "^[0-9]{11}$"
}
]
// ✅ Estandarizado
"validations": [
{
"type": "regex",
"value": "^591.*$",
"message": "Debe comenzar por 591"
},
{
"type": "regex",
"value": "^[0-9]{11}$",
"message": "Debe tener 11 dígitos"
}
]
```
#### Formato Actual 3 (Objeto con Pattern/Message)
```json
// ❌ Actual
"validation": {
"pattern": "^[0-9]{9}$|^[0-9]{10}$",
"message": "Debe tener 9 o 10 dígitos"
}
// ✅ Estandarizado
"validations": [
{
"type": "regex",
"value": "^[0-9]{9}$|^[0-9]{10}$",
"message": "Debe tener 9 o 10 dígitos"
}
]
```
### Validación de Campos Cruzados (fieldToValidate)
Para campos que validan otros campos, usa la misma estructura en las opciones:
```json
{
"id": "accountType",
"fieldToValidate": "receiverAccountNumber",
"options": [
{
"label": "CUENTA AHORRO",
"value": "CA",
"validations": [
{
"type": "regex",
"value": "^[0-9]{13,14}$",
"message": "La cuenta debe tener 13-14 dígitos"
}
]
}
]
}
```
### Ejemplo de Múltiples Reglas
```json
"validations": [
{
"type": "required",
"message": "El número de teléfono es requerido"
},
{
"type": "regex",
"value": "^591.*$",
"message": "Debe comenzar con 591"
},
{
"type": "regex",
"value": "^[0-9]{11}$",
"message": "Debe tener exactamente 11 dígitos"
},
{
"type": "min",
"value": 11,
"message": "Debe tener al menos 11 caracteres"
},
{
"type": "max",
"value": 11,
"message": "Debe tener como máximo 11 caracteres"
}
]
```
## Atributos de Campo
### Atributo Placeholder
El atributo `placeholder` es un string que se muestra como texto de ayuda en los controles del frontend/mobile para guiar al usuario sobre qué información debe ingresar.
**Reglas por tipo de campo:**
- **Para campos `input`**: Usar ejemplos específicos cuando sea posible (ej: "59167890123" para teléfonos)
- **Para campos `select`**: Priorizar el uso de usar "Seleccione una opción"
**Buenas prácticas para placeholders:**
- Mantener el texto corto y descriptivo
- Usar formato consistente
- En el caso de _selects_ priorizar el uso del texto "Seleccione una opción" por defecto (salvo que sea necesaria una especificación más detallada)
**Consideraciones:**
Considerar como **necesaria** la definición del campo _placeholder_ con la intención de estandarizar los mensajes que se muestra al usuario en los diferentes clientes y que se entregue el texto definido desde el servidor, siendo agnóstico de la implementación en la vista de presentación.
### Estructura Completa de un Campo de agente (_agentField_)
Cada campo puede incluir los siguientes atributos:
```json
{
"id": "receiverAccountNumber",
"afexId": "receiverProviderCode", // Opcional para mapeo con afexFields
"label": "Número de cuenta",
"placeholder": "Ingrese el número de cuenta del beneficiario",
"type": "input|select",
"fieldToValidate": "otherFieldId", // Opcional para validaciones cruzadas
"options": [...], // Solo para type: "select" (placeholder: "Seleccione una opción")
"validations": [...]
}
```
## Transformación hacia nueva estructura
Actualmente se presentan diferentes estructuras para definir validaciones, mencionadas en la seccion [Proceso de estandarización ](#Proceso-de-estandarización). Para realizar la migración hacia la nueva estructura de validaciones, se debe seguir los siguientes pasos:
1. **Encontrar todas las validaciones actuales** en agent-fields.json
2. **Convertir cada validación** al formato estándar:
- Cambiar de `{"validation": "..."` a `{"validations": [...]}`
- Cambiar `"pattern"` por `"type": "regex", "value"`
- Mantener/modificar mensajes existentes
- Agregar nuevas validaciones con sus correspondientes mensajes
3. **Agregar atributo placeholder** a todos los campos:
- Para campos `input`: Agregar placeholders descriptivos con ejemplos específicos
- Para campos `select`: Agregar `"placeholder": "Seleccione una opción"`
- Si no se desea mostrar placeholder, omitir la propiedad (el control no mostrará placeholder)
4. **Probar exhaustivamente** para asegurar que no hay cambios que rompan funcionalidad se debe generar un plan de pruebas riguroso
### Ejemplo de Migración Completa
```json
// ❌ Formato Actual
{
"id": "receiverAccountNumber",
"label": "Número de cuenta",
"type": "input",
"validation": "^[0-9]{13,14}$"
}
// ✅ Formato Estandarizado con Placeholder
{
"id": "receiverAccountNumber",
"label": "Número de cuenta",
"placeholder": "Ej: 12345678901234",
"type": "input",
"validations": [
{
"type": "required",
"message": "El número de cuenta es requerido"
},
{
"type": "regex",
"value": "^[0-9]{13,14}$",
"message": "El número de cuenta debe tener 13-14 dígitos"
}
]
}
```
```json
// ❌ Formato Actual (Select)
{
"id": "receiverBankCode",
"label": "Banco",
"type": "select",
"options": [
{
"label": "BANCO EJEMPLO",
"value": "BE"
}
]
}
// ✅ Formato Estandarizado con Placeholder
{
"id": "receiverBankCode",
"label": "Banco",
"placeholder": "Seleccione una opción",
"type": "select",
"options": [
{
"label": "BANCO EJEMPLO",
"value": "BE"
}
],
"validations": [
{
"type": "required",
"message": "El banco es requerido"
}
]
}
```
## Beneficios
- **Simple**: Solo una estructura de validación para recordar
- **Consistente**: Todos los campos usan el mismo formato
- **Flexible**: Múltiples reglas por campo
- **Claro**: Fácil de leer y entender
- **Mantenible**: Fácil agregar nuevos tipos de reglas
## Algunos ejemplos con casos actuales
```json
[
{
"id": "BC-PE-1",
"fields": [
{
"id": "receiverBankCode",
"afexId": "receiverProviderCode",
"label": "Banco",
"placeholder": "Seleccione una opción",
"options": [
{
"label": "BANCO DE CREDITO PERU",
"value": "BC",
"afexValue": "ADFW"
}
],
"type": "select",
"validations": [
{
"type": "required",
"message": "El banco es requerido"
}
]
},
{
"id": "accountType",
"label": "Tipo de cuenta",
"placeholder": "Seleccione una opción",
"fieldToValidate": "receiverAccountNumber",
"options": [
{
"label": "CUENTA AHORRO",
"value": "CA",
"validations": [
{
"type": "regex",
"value": "^[0-9]{13,14}$",
"message": "El número de cuenta debe tener 13-14 dígitos"
}
]
},
{
"label": "CUENTA CORRIENTE",
"value": "CC",
"validations": [
{
"type": "regex",
"value": "^[0-9]{13,14}$",
"message": "El número de cuenta debe tener 13-14 dígitos"
}
]
},
{
"label": "CUENTA MAESTRA",
"value": "CM",
"validations": [
{
"type": "regex",
"value": "^[0-9]{13,14}$",
"message": "El número de cuenta debe tener 13-14 dígitos"
}
]
}
],
"type": "select",
"validations": [
{
"type": "required",
"message": "El tipo de cuenta es requerido"
}
]
},
{
"id": "receiverAccountNumber",
"label": "Número de cuenta",
"placeholder": "Ingrese el número de cuenta del beneficiario",
"type": "input",
"validations": [
{
"type": "required",
"message": "El número de cuenta es requerido"
}
]
}
]
},
{
"id": "BG-BO-1",
"fields": [
{
"id": "receiverBankCode",
"afexId": "receiverProviderCode",
"label": "Banco",
"placeholder": "Seleccione una opción",
"options": [
{
"label": "BANCO GANADERO S.A.",
"value": "BG",
"afexValue": "ADSU"
}
],
"type": "select",
"validations": [
{
"type": "required",
"message": "El banco es requerido"
}
]
},
{
"id": "accountType",
"label": "Tipo de cuenta",
"placeholder": "Seleccione una opción",
"options": [
{
"label": "CUENTA MAESTRA",
"value": "0"
}
],
"type": "select",
"validations": [
{
"type": "required",
"message": "El tipo de cuenta es requerido"
}
]
},
{
"id": "receiverAccountNumber",
"label": "Número de cuenta",
"placeholder": "Ej: 1234567890123456789",
"type": "input",
"validations": [
{
"type": "required",
"message": "El número de cuenta es requerido"
},
{
"type": "regex",
"value": "^[0-9]{10,20}$",
"message": "El número de cuenta debe tener 10-20 dígitos"
}
]
}
]
},
{
"id": "PHONE-BO-1",
"fields": [
{
"id": "receiverPhoneNumber",
"label": "Número de teléfono",
"placeholder": "Ej: 59167890123",
"type": "input",
"validations": [
{
"type": "required",
"message": "El número de teléfono es requerido"
},
{
"type": "regex",
"value": "^591.*$",
"message": "Debe comenzar por 591"
},
{
"type": "regex",
"value": "^591[67].*$",
"message": "Debe comenzar por 591 seguido de 6 o 7"
},
{
"type": "regex",
"value": "^[0-9]{11}$",
"message": "Debe tener 11 dígitos en total"
}
]
}
]
},
{
"id": "ID-CO-1",
"fields": [
{
"id": "idType",
"label": "Tipo de identificación",
"placeholder": "Seleccione una opción",
"fieldToValidate": "receiverIdCode",
"options": [
{
"label": "NIT",
"agentValue": "TXID",
"value": "5",
"validations": [
{
"type": "regex",
"value": "^[0-9]{9,10}$",
"message": "El NIT debe tener 9-10 dígitos"
}
]
},
{
"label": "PASAPORTE",
"agentValue": "CCPT",
"value": "1",
"validations": [
{
"type": "regex",
"value": "^[a-zA-Z0-9]{5,12}$",
"message": "El pasaporte debe tener 5-12 caracteres alfanuméricos"
}
]
},
{
"label": "CEDULA DE CIUDADANIA",
"agentValue": "NIDN",
"value": "7",
"validations": [
{
"type": "regex",
"value": "^[0-9]{6,10}$",
"message": "La cédula debe tener 6-10 dígitos"
}
]
}
],
"type": "select",
"validation": {
"rules": [
{
"type": "required",
"message": "El tipo de identificación es requerido"
}
]
}
},
{
"id": "receiverIdCode",
"label": "Número de identificación",
"placeholder": "Ingrese el número de identificación",
"type": "input",
"validation": {
"rules": [
{
"type": "required",
"message": "El número de identificación es requerido"
},
{
"type": "regex",
"value": "^([1-9]|[a-zA-Z]).*$",
"message": "No puede iniciar con 0"
},
{
"type": "min",
"value": 6,
"message": "Debe tener al menos 6 caracteres"
},
{
"type": "max",
"value": 12,
"message": "Debe tener como máximo 12 caracteres"
}
]
}
}
]
},
{
"id": "EMAIL-EJEMPLO",
"fields": [
{
"id": "receiverEmail",
"label": "Correo electrónico",
"placeholder": "ejemplo@correo.com",
"type": "input",
"validation": {
"rules": [
{
"type": "required",
"message": "El correo electrónico es requerido"
},
{
"type": "email",
"message": "Debe ser una dirección de correo válida"
}
]
}
}
]
},
{
"id": "BANCO-COMPLEJO-1",
"fields": [
{
"id": "receiverBankCode",
"label": "Banco",
"placeholder": "Seleccione una opción",
"options": [
{
"label": "BBVA COLOMBIA",
"value": "1013",
"afexValue": "ADDX",
"validation": {
"rules": [
{
"type": "regex",
"value": "^[0-9]{9}$|^[0-9]{10}$|^[0-9]{16}$|^[0-9]{18}$|^[0-9]{20}$",
"message": "Debe tener 9, 10, 16, 18 o 20 dígitos"
}
]
}
}
],
"type": "select",
"validation": {
"rules": [
{
"type": "required",
"message": "El banco es requerido"
}
]
}
}
]
}
]
```