Appearance
```txt { { $baseAmount := 1000000 }} { { $tax := decimalMul $baseAmount 0.19 }} { { $totalAmount := decimalAdd $baseAmount $tax }}
Monto base: { { currency $baseAmount }}
Impuesto (19%): { { currency $tax }}
Total a pagar: { { currency $totalAmount }}
{ { $price := 500000 }} { { $discount := decimalMul $price 0.10 }} { { $finalPrice := decimalSub $price $discount }}
Precio original: { { currency $price }}
Descuento (10%): { { currency $discount }}
Precio final: { { currency $finalPrice }}
```Explicación: Las funciones decimalAdd y decimalSub permiten sumar y restar valores decimales con precisión. Son especialmente útiles para cálculos financieros donde la precisión es crítica.
Funciones de Acceso a Datos
Ejemplo: Acceso a campos personalizados con customFields
txt
<!-- Acceder a campos personalizados de un perfil -->
<div class="custom-data">
<h3>Información adicional:</h3>
<p>
<strong>Profesión:</strong> { { customFields .Debtor.Profile.CustomFields
"profesion" }}
</p>
<p>
<strong>Años de experiencia:</strong> { { customFields
.Debtor.Profile.CustomFields "experiencia" }}
</p>
<p>
<strong>Sector económico:</strong> { { customFields
.Debtor.Profile.CustomFields "sector" }}
</p>
<!-- Acceso con valor por defecto -->
<p>
<strong>Observaciones:</strong> { { customFields
.Debtor.Profile.CustomFields "observaciones" "Sin observaciones" }}
</p>
</div>Explicación: La función customFields permite acceder a campos personalizados almacenados en un objeto. Recibe el objeto de campos personalizados, el nombre del campo a buscar y opcionalmente un valor por defecto si el campo no existe.
Ejemplo: Formateo de referencias con references y allReferences
txt
<!-- Mostrar referencias personales -->
<div class="references">
<h3>Referencias personales:</h3>
{ { references .Profile.References }}
</div>
<!-- Combinar todos los tipos de referencias -->
<div class="all-references">
<h3>Todas las referencias:</h3>
{ { allReferences .PersonalReferences .FamilyReferences .CommercialReferences
}}
</div>Explicación:
- La función
referencesformatea una lista de referencias de un perfil de manera legible. - La función
allReferencescombina y formatea referencias personales, familiares y comerciales en un solo bloque.
Ejemplo: Acceso a datos anidados con legalNested
txt
<!-- Mostrar representantes legales de una entidad -->
<div class="legal-representatives">
<h3>Representantes legales:</h3>
{ { legalNested .Profile.Legal.Representatives }}
</div>Explicación: La función legalNested facilita el acceso a datos anidados de entidades legales, como representantes legales, accionistas u otras estructuras complejas.
Ejemplo: Acceso a datos externos con dataXts
txt
<!-- Mostrar datos de fuentes externas -->
<div class="external-data">
<h3>Información de fuentes externas:</h3>
<p>
<strong>Score crediticio:</strong> { { dataXts .ExternalSources
"SCORE_CREDITICIO" }}
</p>
<p>
<strong>Ingresos verificados:</strong> { { currency (dataXts
.ExternalSources "INGRESOS_VERIFICADOS") }}
</p>
<p>
<strong>Nivel de riesgo:</strong> { { dataXts .ExternalSources
"NIVEL_RIESGO" "No disponible" }}
</p>
</div>Explicación: La función dataXts permite acceder a datos provenientes de fuentes externas o integraciones de terceros. Recibe el objeto de fuentes, la clave a buscar y opcionalmente un valor por defecto.
Funciones de Manipulación de Colecciones
Ejemplo: Procesamiento de cuotas con installments
txt
<!-- Mostrar información específica de una cuota -->
<p>
Valor de la primera cuota: { { installments .Credit.Installments "1"
"Payment" }}
</p>
<p>
Capital de la segunda cuota: { { installments .Credit.Installments "2"
"Principal" }}
</p>
<p>
Interés de la tercera cuota: { { installments .Credit.Installments "3"
"Interest" }}
</p>
<!-- Encontrar la cuota más alta -->
<p>Cuota más alta: { { installments .Credit.Installments "max" "Payment" }}</p>Explicación: La función installments permite acceder a información específica de las cuotas de un crédito. Recibe la lista de cuotas, el índice (o "max"/"min" para encontrar valores extremos) y el campo a consultar.
Ejemplo: Obtención de puntaje con scoreAcierta
txt
<!-- Mostrar el puntaje Acierta de un análisis de crédito -->
<div class="credit-score">
<h3>Resultado de evaluación crediticia:</h3>
{ { $score := scoreAcierta .Credit.Analysis }}
<p><strong>Puntaje Acierta:</strong> { { $score }}</p>
{ { if gt $score 700 }}
<p class="good-score">Puntaje excelente</p>
{ { else if gt $score 600 }}
<p class="medium-score">Puntaje bueno</p>
{ { else }}
<p class="low-score">Puntaje bajo</p>
{ { end }}
</div>Explicación: La función scoreAcierta extrae el puntaje del análisis de crédito realizado por la herramienta Acierta. Esto permite mostrar y evaluar la calificación crediticia del cliente.
Ejemplo: Verificación de NUT con checkNut
txt
<!-- Verificar y mostrar información del NUT -->
<div class="nut-verification">
<h3>Verificación de NUT:</h3>
{ { $nutStatus := checkNut .Credit }} { { if eq $nutStatus "VALID" }}
<p class="valid-nut">NUT válido y verificado</p>
{ { else if eq $nutStatus "PENDING" }}
<p class="pending-nut">Verificación de NUT pendiente</p>
{ { else }}
<p class="invalid-nut">NUT no válido o no encontrado</p>
{ { end }}
</div>Explicación: La función checkNut verifica el estado del Número Único de Trámite (NUT) asociado a un crédito. Es útil para validar si un crédito cumple con los requisitos regulatorios.
Ejemplo: Unidad de frecuencia con frecuencyUnit
txt
<!-- Mostrar plazo con la unidad correcta -->
<p>
Plazo del crédito: { { .Credit.Term }} { { frecuencyUnit .Credit.Frequency }}
</p>
<!-- Mostrar frecuencia de pago -->
<p>
Frecuencia de pago: Cada { { .Credit.PaymentFrequency }} { { frecuencyUnit
.Credit.Frequency }}
</p>Explicación: La función frecuencyUnit devuelve la unidad de tiempo correspondiente a la frecuencia de un crédito (días, semanas, meses, años). Permite mostrar textos correctos según la configuración del crédito.
Glosario de Términos Técnicos
Este glosario explica los términos técnicos utilizados en el sistema de plantillas de Kuenta de manera sencilla y accesible.
Términos Básicos
| Término | Explicación |
|---|---|
| Plantilla | Un documento con "huecos" que se rellenan con información específica. Comparable a un formulario donde las partes variables se completan automáticamente. |
| Variable | Un espacio reservado que será reemplazado por un valor real cuando se procese la plantilla. Por ejemplo, { {.Nombre}} será reemplazado por el nombre real del cliente. |
| Función | Una herramienta que transforma o formatea un valor. Por ejemplo, currency convierte 1000000 en "$1,000,000". |
| Condicional | Una instrucción que muestra contenido solo si se cumple una condición. Funciona como un "si... entonces..." en el lenguaje cotidiano. |
| Bucle (range) | Una instrucción que repite contenido para cada elemento de una lista, como generar filas en una tabla para cada cuota de un crédito. |
Sintaxis y Estructura
| Término | Explicación |
|---|---|
Delimitadores { { }} | Los "corchetes dobles" que indican dónde hay código de plantilla, diferenciándolo del texto normal. |
Punto . | Representa los datos actuales con los que trabaja la plantilla. Por ejemplo, .Credit.Amount se refiere al monto dentro del objeto crédito. |
Pipe | | Pasa el resultado de una operación a la siguiente, como en un conducto. Por ejemplo, .Date | date pasa la fecha a la función de formateo. |
| Contexto | El conjunto de datos disponibles en un momento dado dentro de la plantilla. |
Funciones Comunes
| Función | Explicación |
|---|---|
| currency | Formatea un número como moneda (ej: $1,000,000). |
| percentage | Formatea un número como porcentaje (ej: 15.5%). |
| date | Convierte una fecha técnica en formato legible (ej: 15/enero/2023). |
| commonData | Obtiene información básica como nombre o email sin importar si es persona o empresa. |
| dict | Crea una lista de pares "clave-valor", similar a un diccionario en el lenguaje cotidiano. |
| add, sub, mul, div | Funciones matemáticas básicas: suma, resta, multiplicación y división. |
Estructuras de Datos Comunes
| Término | Explicación |
|---|---|
| Perfil | Conjunto de datos personales o empresariales de un usuario. |
| Crédito | Información completa sobre un préstamo, incluyendo montos, tasas, fechas y partes involucradas. |
| Cuota | Cada uno de los pagos periódicos de un crédito. |
| Documento | Archivo que se genera a partir de una plantilla, como un contrato o certificado. |
| Sobre | Conjunto de documentos agrupados para un propósito específico. |
Términos Avanzados
| Término | Explicación |
|---|---|
| Sprig | Biblioteca de funciones adicionales disponible en algunos servicios que amplía las capacidades de las plantillas. |
| Recursividad | Técnica donde una plantilla se llama a sí misma, útil para datos con niveles anidados. |
| Objeto JSON | Formato de datos estructurado utilizado para intercambiar información entre sistemas. |
| HTML | Lenguaje utilizado para crear páginas web y dar formato a correos electrónicos. |
| SVG | Formato de gráficos que permite crear imágenes que se adaptan a cualquier tamaño sin perder calidad. |
Preguntas Frecuentes (FAQ)
Preguntas Generales
¿Qué es el sistema de plantillas de Kuenta? Es un sistema que permite personalizar documentos, correos, mensajes y otros contenidos de forma automática con datos específicos de cada usuario, crédito o transacción.
¿Por qué usar plantillas en lugar de documentos estáticos? Las plantillas permiten:
- Personalizar contenido para cada usuario o situación
- Mantener consistencia en todos los documentos
- Actualizar el formato o texto en un solo lugar
- Automatizar la generación de documentos complejos
¿Necesito saber programación para usar plantillas? No necesariamente. Para plantillas básicas, solo necesitas entender la sintaxis básica (cómo usar variables con { { }}) y conocer qué variables están disponibles. Para plantillas avanzadas, un conocimiento básico de lógica y programación puede ser útil.
Solución de Problemas
¿Por qué no aparece mi variable en el documento final? Posibles causas:
- La variable no existe en los datos proporcionados
- El nombre de la variable tiene un error de escritura
- La ruta de acceso a la variable es incorrecta (ej:
.Profile.Namevs.Credit.Debtor.Profile.Name) - La variable está vacía o es nula
¿Cómo puedo evitar errores si una variable no existe? Usa condicionales para verificar que la variable existe antes de usarla:
txt
{ { if .Variable }}{ { .Variable }}{ { else }}Valor predeterminado{ { end }}Mi fecha no se muestra correctamente, ¿qué hago? Usa la función date para formatear fechas:
txt
{ { date .Credit.CreatedAt }}¿Por qué mi tabla de amortización no muestra todas las cuotas? Verifica que estás usando correctamente el bucle range y que la colección de cuotas no está vacía:
txt
{ { if .Credit.Installments }}
{ { range .Credit.Installments }}
<!-- contenido de cada cuota -->
{ { end }}
{ { else }}
No hay cuotas disponibles
{ { end }}Uso Avanzado
¿Cómo puedo aplicar formato condicional en mi plantilla? Usa condicionales para aplicar diferentes estilos o contenido:
html
<span
class="{ { if gt .Value 1000000 }}high-value{ { else }}normal-value{ { end }}"
>
{ { currency .Value }}
</span>¿Es posible reutilizar bloques de plantilla en múltiples documentos? Sí, puedes definir bloques reutilizables en algunos servicios (principalmente documentos y webhooks) usando la sintaxis define y template.
¿Puedo realizar cálculos complejos en mis plantillas? Sí, usando las funciones matemáticas disponibles y variables temporales:
txt
{ { $subtotal := mul .Price .Quantity }}
{ { $tax := mul $subtotal 0.19 }}
{ { $total := add $subtotal $tax }}
Total: { { currency $total }}Guías Paso a Paso
Esta sección proporciona guías detalladas para las tareas más comunes relacionadas con plantillas en Kuenta.
Guía 1: Crear una Plantilla Básica de Documento
Paso 1: Planificar la Estructura
Antes de comenzar, identifique:
- Qué información necesita mostrar
- Qué variables estarán disponibles
- Qué secciones condicionales podría necesitar
Paso 2: Crear el Esqueleto HTML
html
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8" />
<title>Título del Documento</title>
<style>
/* Estilos básicos */
body {
font-family: Arial, sans-serif;
}
.header {
text-align: center;
margin-bottom: 20px;
}
.footer {
margin-top: 30px;
font-size: 12px;
}
table {
width: 100%;
border-collapse: collapse;
}
th,
td {
border: 1px solid #ddd;
padding: 8px;
}
</style>
</head>
<body>
<div class="header">
<h1>TÍTULO DEL DOCUMENTO</h1>
</div>
<div class="content">
<!-- Aquí irá el contenido dinámico -->
</div>
<div class="footer">
<p>Pie de página con información legal</p>
</div>
</body>
</html>Paso 3: Agregar Variables Básicas
Reemplace textos estáticos con variables:
html
<div class="header">
<h1>{ { .Title }}</h1>
</div>
<div class="content">
<p>Estimado(a) { { commonData .Profile "Name" }},</p>
<p>Este documento fue generado el { { now | date }}.</p>
<!-- Más contenido -->
</div>
<div class="footer">
<p>© { { now.Year }} { { commonData .Organization.Profile "Name" }}</p>
</div>Paso 4: Agregar Contenido Condicional
html
<div class="status">
{ { if eq .Document.Status "Signed" }}
<p class="signed">
Este documento ha sido firmado el { { date .Document.SignedAt }}.
</p>
{ { else if eq .Document.Status "Pending" }}
<p class="pending">Este documento está pendiente de firma.</p>
{ { else }}
<p class="draft">Este documento es un borrador.</p>
{ { end }}
</div>Paso 5: Agregar Listas o Tablas con Bucles
html
<table>
<tr>
<th>Ítem</th>
<th>Descripción</th>
<th>Valor</th>
</tr>
{ { range $index, $item := .Items }}
<tr>
<td>{ { add $index 1 }}</td>
<td>{ { $item.Description }}</td>
<td>{ { currency $item.Value }}</td>
</tr>
{ { end }}
</table>Paso 6: Probar la Plantilla
- Verifique que todas las variables existan en los datos de prueba
- Asegúrese de manejar casos donde los datos pueden estar vacíos
- Pruebe con diferentes conjuntos de datos para validar condicionales
Guía 2: Transformar Datos con Diccionarios
Paso 1: Identificar los Valores a Mapear
Por ejemplo, convertir códigos internos a nombres descriptivos.
Paso 2: Crear el Diccionario
txt
{ { $estadosCiviles := dict "S" "Soltero" "C" "Casado" "U" "Unión Libre" "V" "Viudo" "D" "Divorciado" }}Paso 3: Obtener el Valor Original
txt
{ { $estadoCivil := .Profile.Natural.MaritalStatus }}Paso 4: Realizar la Transformación
txt
Estado Civil: { { get $estadosCiviles $estadoCivil "No especificado" }}Diagrama Visual:
txt
Código Interno → [Diccionario de Mapeo] → Valor para Mostrar
"S" → {"S": "Soltero"} → "Soltero"Guía 3: Crear una Tabla de Amortización
Paso 1: Crear la Estructura de la Tabla
html
<table class="amortization">
<thead>
<tr>
<th>No.</th>
<th>Fecha</th>
<th>Cuota</th>
<th>Capital</th>
<th>Interés</th>
<th>Estado</th>
</tr>
</thead>
<tbody>
<!-- Aquí irán las filas -->
</tbody>
</table>Paso 2: Agregar el Bucle para las Cuotas
html
<tbody>
{ { range $idx, $installment := .Credit.Installments }}
<tr>
<td>{ { add $idx 1 }}</td>
<td>{ { date $installment.Date }}</td>
<td>{ { currency $installment.Payment }}</td>
<td>{ { currency $installment.Principal }}</td>
<td>{ { currency $installment.Interest }}</td>
<td>{ { if $installment.PaidAt }}Pagada{ { else }}Pendiente{ { end }}</td>
</tr>
{ { end }}
</tbody>Paso 3: Agregar Totales
html
<tfoot>
<tr>
<td colspan="2"><strong>Totales:</strong></td>
{ { $totalPayment := 0 }} { { $totalPrincipal := 0 }} { { $totalInterest :=
0 }} { { range $installment := .Credit.Installments }} { { $totalPayment =
add $totalPayment $installment.Payment }} { { $totalPrincipal = add
$totalPrincipal $installment.Principal }} { { $totalInterest = add
$totalInterest $installment.Interest }} { { end }}
<td><strong>{ { currency $totalPayment }}</strong></td>
<td><strong>{ { currency $totalPrincipal }}</strong></td>
<td><strong>{ { currency $totalInterest }}</strong></td>
<td></td>
</tr>
</tfoot>Paso 4: Agregar Estilo Condicional
html
<tbody>
{ { range $idx, $installment := .Credit.Installments }} { { $status :=
"pending" }} { { if $installment.PaidAt }} { { $status = "paid" }} { { else if
lt $installment.Date now }} { { $status = "overdue" }} { { end }}
<tr class="{ { $status }}-row">
<!-- Celdas de la tabla -->
</tr>
{ { end }}
</tbody>Diagramas de Conceptos Clave
Estructura de Plantillas en Kuenta
txt
┌───────────────────────────────────┐
│ PLANTILLA │
├───────────────────────────────────┤
│ │
│ ┌─────────────┐ ┌────────────┐ │
│ │ TEXTO │ │ CÓDIGO DE │ │
│ │ ESTÁTICO │ │ PLANTILLA │ │
│ └─────────────┘ └────────────┘ │
│ │
│ ┌───────────────────────────────┐│
│ │ VARIABLES DISPONIBLES ││
│ │ ││
│ │ .Credit .Profile .Title ││
│ │ .Document .Body .URL ││
│ └───────────────────────────────┘│
│ │
│ ┌───────────────────────────────┐│
│ │ FUNCIONES ││
│ │ ││
│ │ currency date if/else ││
│ │ percentage range dict ││
│ └───────────────────────────────┘│
└───────────────────────────────────┘Procesamiento de una Plantilla
txt
┌─────────────┐ ┌─────────────┐ ┌─────────────┐
│ PLANTILLA │ │ DATOS │ │ DOCUMENTO │
│ { { .Name }} │ + │ Name: Juan │ = │ Juan │
└─────────────┘ └─────────────┘ └─────────────┘Funciones y Transformación de Datos
txt
┌───────────┐ ┌───────────┐ ┌───────────┐
│ DATO │ │ FUNCIÓN │ │ RESULTADO │
│ 1000000 │ --> │ currency │ --> │ $1,000,000│
└───────────┘ └───────────┘ └───────────┘
┌───────────┐ ┌───────────┐ ┌───────────┐
│ DATO │ │ FUNCIÓN │ │ RESULTADO │
│ 0.155 │ --> │percentage │ --> │ 15.5% │
└───────────┘ └───────────┘ └───────────┘
┌───────────────┐ ┌───────────┐ ┌───────────────┐
│ DATO │ │ FUNCIÓN │ │ RESULTADO │
│ 2023-05-10T.. │-->│ date │-->│ 10/mayo/2023 │
└───────────────┘ └───────────┘ └───────────────┘Flujo Condicional
txt
┌─────────┐
│ if │
│condition│
└────┬────┘
│
┌───────────────┐
▼ ▼
┌─────────┐ ┌─────────┐
│ TRUE │ │ FALSE │
└────┬────┘ └────┬────┘
│ │
▼ ▼
┌─────────┐ ┌─────────┐
│Contenido│ │Contenido│
│ if │ │ else │
└─────────┘ └─────────┘Bucle Range
txt
┌─────────────────────────────────────────────┐
│ COLECCIÓN │
│ ┌────────┐ ┌────────┐ ┌────────┐ │
│ │ Ítem 1 │ │ Ítem 2 │ │ Ítem 3 │ │
│ └────┬───┘ └────┬───┘ └────┬───┘ │
└───────┼───────────┬─┼───────────┬─┼─────────┘
│ │ │ │ │
▼ ▼ ▼ ▼ ▼
┌─────────────────────────────────────────────┐
│ BUCLE │
│ │
│ { { range .Items }} │
│ <!-- Procesar cada ítem --> │
│ { { end }} │
└─────────────────────────────────────────────┘
│ │ │ │ │
▼ ▼ ▼ ▼ ▼
┌─────────────────────────────────────────────┐
│ RESULTADO │
│ ┌────────┐ ┌────────┐ ┌────────┐ │
│ │Contenido│ │Contenido│ │Contenido│ │
│ │ Ítem 1 │ │ Ítem 2 │ │ Ítem 3 │ │
│ └────────┘ └────────┘ └────────┘ │
└─────────────────────────────────────────────┘Ejemplos Comentados Línea por Línea
Ejemplo 1: Carta de Aprobación de Crédito
html
<!-- Encabezado del documento HTML -->
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8" />
<title>Aprobación de Crédito</title>
<style>
/* Estilos básicos para el documento */
body {
font-family: Arial, sans-serif;
line-height: 1.6;
}
.header {
background-color: #4caf50;
color: white;
padding: 20px;
text-align: center;
}
.content {
padding: 20px;
}
.footer {
background-color: #f1f1f1;
padding: 10px;
text-align: center;
font-size: 12px;
}
</style>
</head>
<body>
<!-- Encabezado con título -->
<div class="header">
<h1>¡Su Crédito ha sido Aprobado!</h1>
<!-- Título estático -->
</div>
<div class="content">
<!-- Saludo personalizado usando commonData para obtener el nombre independientemente del tipo de perfil -->
<p>Estimado(a) { { commonData .Credit.Debtor.Profile "Name" }}:</p>
<!-- Mensaje principal -->
<p>
Nos complace informarle que su solicitud de crédito ha sido
<strong>APROBADA</strong>.
</p>
<!-- Tabla con detalles del crédito -->
<h2>Detalles del Crédito:</h2>
<table border="1" cellpadding="5" cellspacing="0" width="100%">
<tr>
<td><strong>Monto aprobado:</strong></td>
<!-- Función currency para formatear el monto como moneda -->
<td>{ { currency .Credit.Amount }}</td>
</tr>
<tr>
<td><strong>Tasa de interés:</strong></td>
<!-- Función percentage para formatear la tasa como porcentaje -->
<td>{ { percentage .Credit.Rate }}</td>
</tr>
<tr>
<td><strong>Plazo:</strong></td>
<!-- Valor del plazo y función frecuencyUnit para mostrar la unidad correcta -->
<td>{ { .Credit.Term }} { { frecuencyUnit .Credit.Frequency }}</td>
</tr>
<tr>
<td><strong>Fecha de aprobación:</strong></td>
<!-- Función date para formatear la fecha -->
<td>{ { date .Credit.ApprovedAt }}</td>
</tr>
<!-- Bloque condicional: solo muestra esta fila si hay cuotas disponibles -->
{ { if .Credit.Installments }}
<tr>
<td><strong>Valor cuota:</strong></td>
<!-- Accede a la primera cuota (índice 0) y formatea su valor -->
<td>{ { currency .Credit.Installments.0.Payment }}</td>
</tr>
{ { end }}
</table>
<!-- Botón de acción que usa la URL proporcionada -->
<p style="text-align: center; margin: 30px 0;">
<a
href="{ { .URL }}"
style="background-color: #4CAF50; color: white; padding: 12px 24px; text-decoration: none; border-radius: 4px;"
>
Continuar al Desembolso
</a>
</p>
<!-- Código de verificación -->
<p><strong>Su código de verificación es:</strong> { { .Code }}</p>
<!-- Mensaje de cierre -->
<p>Si tiene alguna pregunta, no dude en contactarnos.</p>
<!-- Firma con el nombre de la organización -->
<p>
Atentamente,<br />
Equipo de { { commonData .Organization.Profile "Name" }}
</p>
</div>
<!-- Pie de página con información legal -->
<div class="footer">
<p>
Este correo es informativo y fue enviado a { { commonData
.Credit.Debtor.Profile "Email" }}.
</p>
<p>
No respondas a este mensaje. Para cualquier consulta, usa nuestros
canales oficiales de atención.
</p>
</div>
</body>
</html>Ejemplo 2: Transformación de Datos para API Externa (JSON)
json
{
// Identificador único del crédito
"credit_id": "{ {.Credit.ID}}",
// Estado actual, usando un diccionario para mapear valores internos a externos
"status": { {
// Creamos un diccionario que mapea estados internos a valores para API externa
$statusMap := dict
"ApprovedCredit" "APPROVED"
"RejectedCredit" "REJECTED"
"PendingCredit" "PENDING"
"CancelledCredit" "CANCELLED"
// Obtenemos el valor del diccionario usando el estado actual
$mapped := get $statusMap .Credit.Status "UNKNOWN"
}}"{ { $mapped }}",
// Timestamp actual formateado según ISO
"timestamp": "{ { now | date_format "2006-01-02T15:04:05Z07:00" }}",
// Información del cliente con lógica condicional para determinar su tipo
"customer": {
// Variable para almacenar el tipo de cliente
{ { $customerType := "" }}
// Variable para almacenar el tipo de documento
{ { $documentType := "" }}
// Condicional para determinar el tipo de perfil
{ { if eq .Credit.Debtor.Profile.Type "Natural" }}
{ { $customerType = "INDIVIDUAL" }}
{ { $documentType = .Credit.Debtor.Profile.Natural.IDType }}
{ { else }}
{ { $customerType = "BUSINESS" }}
{ { $documentType = .Credit.Debtor.Profile.Legal.IDType }}
{ { end }}
"type": "{ { $customerType }}",
"document_type": "{ { $documentType }}",
"document_number": "{ { commonData .Credit.Debtor.Profile "IDNumber" }}",
"name": "{ { commonData .Credit.Debtor.Profile "Name" }}",
"email": "{ { commonData .Credit.Debtor.Profile "Email" }}"
},
// Detalles financieros con cálculos
"financial_details": {
// Valores base
"principal_amount": { { .Credit.Principal }},
"total_amount": { { .Credit.Amount }},
"interest_rate": { { .Credit.Rate }},
// Cálculo de interés total
{ { $totalInterest := sub .Credit.Amount .Credit.Principal }}
"total_interest": { { $totalInterest }},
// Cálculo de porcentaje de interés sobre capital
{ { $interestPercentage := div (mul $totalInterest 100) .Credit.Principal }}
"interest_percentage": { { printf "%.2f" $interestPercentage }},
// Formateo de valores para visualización
"formatted": {
"principal": "{ { currency .Credit.Principal }}",
"total": "{ { currency .Credit.Amount }}",
"rate": "{ { percentage .Credit.Rate }}"
}
},
// Firma de seguridad generada con información del crédito
"signature": "{ { sha256sum (printf "%s-%s-%s" .Credit.ID .Credit.Status (now | date_format "20060102")) }}"
}