Skip to content
```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 references formatea una lista de referencias de un perfil de manera legible.
  • La función allReferences combina 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érminoExplicación
PlantillaUn documento con "huecos" que se rellenan con información específica. Comparable a un formulario donde las partes variables se completan automáticamente.
VariableUn 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ónUna herramienta que transforma o formatea un valor. Por ejemplo, currency convierte 1000000 en "$1,000,000".
CondicionalUna 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érminoExplicació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.
ContextoEl conjunto de datos disponibles en un momento dado dentro de la plantilla.

Funciones Comunes

FunciónExplicación
currencyFormatea un número como moneda (ej: $1,000,000).
percentageFormatea un número como porcentaje (ej: 15.5%).
dateConvierte una fecha técnica en formato legible (ej: 15/enero/2023).
commonDataObtiene información básica como nombre o email sin importar si es persona o empresa.
dictCrea una lista de pares "clave-valor", similar a un diccionario en el lenguaje cotidiano.
add, sub, mul, divFunciones matemáticas básicas: suma, resta, multiplicación y división.

Estructuras de Datos Comunes

TérminoExplicación
PerfilConjunto de datos personales o empresariales de un usuario.
CréditoInformación completa sobre un préstamo, incluyendo montos, tasas, fechas y partes involucradas.
CuotaCada uno de los pagos periódicos de un crédito.
DocumentoArchivo que se genera a partir de una plantilla, como un contrato o certificado.
SobreConjunto de documentos agrupados para un propósito específico.

Términos Avanzados

TérminoExplicación
SprigBiblioteca de funciones adicionales disponible en algunos servicios que amplía las capacidades de las plantillas.
RecursividadTécnica donde una plantilla se llama a sí misma, útil para datos con niveles anidados.
Objeto JSONFormato de datos estructurado utilizado para intercambiar información entre sistemas.
HTMLLenguaje utilizado para crear páginas web y dar formato a correos electrónicos.
SVGFormato 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.Name vs .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")) }}"
}