Skip to content

Manual de Plantillas para Notificaciones de Solicitud de Firma ​

Este documento explica cómo utilizar los campos disponibles en las plantillas de notificaciones (correos electrónicos) utilizadas por el servicio de solicitud de firma.

Estructura de Datos Disponibles ​

Las plantillas de correo electrónico tienen acceso a las siguientes variables:

.Title        - El título del documento en formato HTML
.Body         - El cuerpo del documento en formato HTML
.Organization - La organización (acreedor)
.Entity       - La entidad (deudor o destinatario)
.Profile      - El perfil del destinatario
.URL          - La URL del documento

Objetos y Campos Principales ​

Objeto Organization ​

El objeto Organization contiene la información relacionada con el acreedor:

.Organization.ID             - ID de la organización
.Organization.Phone          - Número de teléfono
.Organization.Email          - Correo electrónico
.Organization.Nickname       - Apodo o alias
.Organization.Verified       - Si está verificado
.Organization.Type           - Tipo de entidad (natural o legal)
.Organization.IDType         - Tipo de identificación
.Organization.IDNumber       - Número de identificación
.Organization.Profile        - Perfil con datos personales
.Organization.ImportID       - ID de importación

Objeto Entity ​

El objeto Entity contiene la información relacionada con el deudor o destinatario:

.Entity.ID             - ID de la entidad
.Entity.Phone          - Número de teléfono
.Entity.Email          - Correo electrónico
.Entity.Nickname       - Apodo o alias
.Entity.Verified       - Si está verificado
.Entity.Type           - Tipo de entidad (natural o legal)
.Entity.IDType         - Tipo de identificación
.Entity.IDNumber       - Número de identificación
.Entity.Profile        - Perfil con datos personales
.Entity.ImportID       - ID de importación

Objeto Profile ​

El objeto Profile contiene los datos del perfil del destinatario:

.Profile             - El perfil completo

Estructura Detallada del Perfil ​

El objeto Profile puede ser de dos tipos principales: Natural (persona física) o Legal (persona jurídica). Cada tipo tiene campos específicos y se acceden de manera diferente.

Perfil de Tipo Natural (Persona Física) ​

Para acceder a los campos específicos de un perfil Natural:

.Profile.Natural.FirstName       - Nombre de la persona
.Profile.Natural.LastName        - Apellido de la persona
.Profile.Natural.IDNumber        - Número de identificación
.Profile.Natural.IDType          - Tipo de identificación (CC, CE, etc.)
.Profile.Natural.SSNumber        - Número de seguridad social
.Profile.Natural.DateOfBirth     - Fecha de nacimiento
.Profile.Natural.Gender          - Género
.Profile.Natural.JobTitle        - Cargo/posición laboral
.Profile.Natural.BusinessLine    - Línea de negocio
.Profile.Natural.EmployeeID      - ID de empleado
.Profile.Natural.Phone           - Teléfono personal
.Profile.Natural.Mobile          - Teléfono móvil
.Profile.Natural.Address         - Dirección
.Profile.Natural.AddressCity     - Ciudad de la dirección
.Profile.Natural.AddressState    - Estado/Departamento de la dirección
.Profile.Natural.AddressZipCode  - Código postal
.Profile.Natural.AddressCountry  - País de la dirección
.Profile.Natural.Email           - Correo electrónico
.Profile.Natural.AlternativeEmail - Correo electrónico alternativo
.Profile.Natural.NotificationEmail - Correo para notificaciones
.Profile.Natural.Picture         - Imagen/foto de perfil
.Profile.Natural.Verified        - Si está verificado
.Profile.Natural.IDFront         - Imagen frontal del documento de identidad
.Profile.Natural.IDBack          - Imagen posterior del documento de identidad
.Profile.Natural.MaritalStatus   - Estado civil

Para acceder a los campos específicos de un perfil Legal:

.Profile.Legal.Name              - Nombre de la empresa/entidad
.Profile.Legal.LegalName         - Razón social completa
.Profile.Legal.IDNumber          - Número de identificación tributaria (NIT/RUC)
.Profile.Legal.IDType            - Tipo de identificación
.Profile.Legal.BusinessLine      - Giro comercial/línea de negocio
.Profile.Legal.DateOfCreation    - Fecha de constitución
.Profile.Legal.Phone             - Teléfono principal
.Profile.Legal.Address           - Dirección
.Profile.Legal.AddressCity       - Ciudad
.Profile.Legal.AddressState      - Estado/Departamento
.Profile.Legal.AddressZipCode    - Código postal
.Profile.Legal.AddressCountry    - País
.Profile.Legal.Email             - Correo electrónico principal
.Profile.Legal.AlternativeEmail  - Correo electrónico alternativo
.Profile.Legal.NotificationEmail - Correo para notificaciones
.Profile.Legal.Logo              - Logotipo de la empresa
.Profile.Legal.Verified          - Si está verificado
.Profile.Legal.URL               - Sitio web oficial
.Profile.Legal.ChamberIDFront    - Documento de inscripción en cámara de comercio

Verificación del Tipo de Perfil ​

Es importante verificar el tipo de perfil antes de acceder a sus campos específicos:

{ { if eq .Profile.Type "Natural" }}
    <!-- Campos específicos de Natural -->
    { { .Profile.Natural.FirstName }} { { .Profile.Natural.LastName }}
{ { else }}
    <!-- Campos específicos de Legal -->
    { { .Profile.Legal.Name }}
{ { end }}

Ejemplos de Acceso a Datos Específicos del Perfil ​

Para acceder al nombre dependiendo del tipo de perfil:

{ { if eq .Profile.Type "Natural" }}
    { { .Profile.Natural.FirstName }} { { .Profile.Natural.LastName }}
{ { else }}
    { { .Profile.Legal.Name }}
{ { end }}

Para acceder al ID de manera segura:

{ { if eq .Profile.Type "Natural" }}
    { { .Profile.Natural.IDType }}: { { .Profile.Natural.IDNumber }}
{ { else }}
    { { .Profile.Legal.IDType }}: { { .Profile.Legal.IDNumber }}
{ { end }}

IMPORTANTE: Aunque es posible acceder directamente a los campos específicos como se muestra arriba, se recomienda usar la función commonData para acceder a los campos comunes entre ambos tipos de perfil, como se explica en la siguiente sección.

Acceso a Datos del Perfil con commonData ​

La función commonData está diseñada específicamente para acceder a campos comunes entre perfiles de tipo Natural y Legal. Esta función sólo permite acceder a un conjunto limitado de campos, y es la forma recomendada de obtener estos datos ya que maneja automáticamente las diferencias entre tipos de perfil.

Campos disponibles a través de commonData ​

La función commonData solo permite acceder a los siguientes campos:

{ { commonData .Profile "Name" }}        - Nombre (persona completo o empresa)
{ { commonData .Profile "Email" }}       - Correo electrónico
{ { commonData .Profile "Address" }}     - Dirección
{ { commonData .Profile "AddressCity" }} - Ciudad de la dirección
{ { commonData .Profile "IDNumber" }}    - Número de identificación
{ { commonData .Profile "Initials" }}    - Iniciales

Funciones Disponibles en Plantillas ​

Todas las funciones estándar de Go Templates están disponibles, junto con funciones personalizadas definidas en domain.Funcs().

Funciones útiles ​

{ { htmlEscape .Body }}       - Escapa caracteres HTML para mostrar código seguro
{ { urlEscape .URL }}         - Codifica una URL para uso seguro en enlaces

Ejemplos de Uso Común ​

Acceder al Nombre del Destinatario ​

{ { commonData .Profile "Name" }}

Acceder al Correo Electrónico del Acreedor ​

{ { .Organization.Email }}

Incluir la URL del Documento ​

<a href="{ { .URL }}">Ver documento</a>

Mostrar el Título del Documento ​

<h1>{ { .Title }}</h1>

Mostrar el Cuerpo del Documento ​

<div>{ { .Body }}</div>

Ejemplos Prácticos de Plantillas para Notificaciones de Solicitud de Firma ​

Ejemplo de Notificación de Solicitud de Firma para Deudor ​

Esta plantilla se envía a los deudores cuando se requiere su firma en un documento. La URL generada será específica para el portal del deudor.

html
<!DOCTYPE html>
<html>
  <head>
    <meta charset="UTF-8" />
    <meta name="viewport" content="width=device-width, initial-scale=1.0" />
    <title>Solicitud de Firma de Documento</title>
    <style>
      body {
        font-family: Arial, sans-serif;
        line-height: 1.6;
        color: #333;
        max-width: 600px;
        margin: 0 auto;
        padding: 20px;
      }
      .header {
        text-align: center;
        margin-bottom: 30px;
        border-bottom: 2px solid #eee;
        padding-bottom: 15px;
      }
      .content {
        background-color: #f9f9f9;
        padding: 20px;
        border-radius: 5px;
        border-left: 4px solid #1890ff;
      }
      .document-details {
        margin: 20px 0;
        padding: 15px;
        background-color: #fff;
        border-radius: 5px;
        box-shadow: 0 1px 3px rgba(0, 0, 0, 0.1);
      }
      .signature-options {
        margin: 20px 0;
        padding: 15px;
        background-color: #e6f7ff;
        border-radius: 5px;
      }
      .footer {
        margin-top: 30px;
        font-size: 12px;
        color: #777;
        text-align: center;
        border-top: 1px solid #eee;
        padding-top: 15px;
      }
      .button {
        display: inline-block;
        padding: 10px 20px;
        background-color: #1890ff;
        color: white;
        text-decoration: none;
        border-radius: 5px;
        font-weight: bold;
      }
    </style>
  </head>
  <body>
    <div class="header">
      <h2>Solicitud de Firma de Documento</h2>
    </div>

    <div class="content">
      <p>Estimado(a) { { commonData .Profile "Name" }},</p>

      <p>
        Ha recibido una solicitud para firmar el documento "<strong
          >{ { .Title }}</strong
        >" de parte de { { commonData .Organization.Profile "Name" }}.
      </p>

      <div class="document-details">
        <h3>Detalles del Documento</h3>
        <p><strong>Título:</strong> { { .Title }}</p>
        <p>
          <strong>Remitente:</strong> { { commonData .Organization.Profile
          "Name" }}
        </p>
      </div>

      <p>
        Para revisar y firmar el documento, haga clic en el siguiente botón:
      </p>

      <div style="text-align: center; margin: 30px 0;">
        <a href="{ { .URL }}" class="button">Revisar y Firmar Documento</a>
      </div>

      <div class="signature-options">
        <h3>Opciones de Firma Disponibles</h3>
        <p>
          Una vez que ingrese al portal, podrá utilizar diferentes métodos para
          firmar el documento, según las opciones habilitadas por el remitente.
        </p>
      </div>

      <p>
        Si el botón no funciona, puede copiar y pegar la siguiente dirección en
        su navegador:
      </p>
      <p style="word-break: break-all;">{ { .URL }}</p>
    </div>

    <div class="footer">
      <p>
        Este es un mensaje automático generado por el sistema de firma
        electrónica. Por favor no responda a este correo.
      </p>
      <p>
        © { { now.Year }} { { commonData .Organization.Profile "Name" }}. Todos
        los derechos reservados.
      </p>
    </div>
  </body>
</html>

Ejemplo de Notificación de Documento Firmado para Acreedor ​

Esta plantilla se envía al acreedor cuando un documento ha sido firmado por un destinatario. La URL generada apuntará al portal del acreedor.

html
<!DOCTYPE html>
<html>
  <head>
    <meta charset="UTF-8" />
    <meta name="viewport" content="width=device-width, initial-scale=1.0" />
    <title>Documento Firmado por Destinatario</title>
    <style>
      body {
        font-family: Arial, sans-serif;
        line-height: 1.6;
        color: #333;
        max-width: 600px;
        margin: 0 auto;
        padding: 20px;
      }
      .notification {
        background-color: #e6ffed;
        border-left: 4px solid #52c41a;
        padding: 15px;
        margin-bottom: 20px;
      }
      .document-info {
        background-color: #f8f8f8;
        padding: 15px;
        border-radius: 5px;
        margin: 20px 0;
      }
      .signer-info {
        background-color: #fff;
        padding: 15px;
        border-radius: 5px;
        margin: 20px 0;
        border: 1px solid #eee;
      }
      .actions {
        text-align: center;
        margin: 30px 0;
      }
      .button {
        display: inline-block;
        padding: 10px 20px;
        background-color: #52c41a;
        color: white;
        text-decoration: none;
        border-radius: 5px;
        font-weight: bold;
      }
      .footer {
        margin-top: 30px;
        font-size: 12px;
        color: #777;
        border-top: 1px solid #eee;
        padding-top: 20px;
      }
    </style>
  </head>
  <body>
    <div class="notification">
      <h2>Documento Firmado</h2>
      <p>Un destinatario ha firmado uno de sus documentos.</p>
    </div>

    <p>Estimado(a) { { commonData .Organization.Profile "Name" }},</p>

    <p>
      Le informamos que el documento "<strong>{ { .Title }}</strong>" ha sido
      firmado por { { commonData .Profile "Name" }}.
    </p>

    <div class="document-info">
      <h3>Información del Documento</h3>
      <p><strong>Título:</strong> { { .Title }}</p>
      <p><strong>Estado:</strong> Firmado</p>
    </div>

    <div class="signer-info">
      <h3>Información del Firmante</h3>
      <p><strong>Nombre:</strong> { { commonData .Profile "Name" }}</p>
      <p>
        <strong>Identificación:</strong> { { commonData .Profile "IDNumber" }}
      </p>
      <p><strong>Correo:</strong> { { commonData .Profile "Email" }}</p>
    </div>

    <p>
      Para ver el documento firmado completo y descargar el archivo, haga clic
      en el siguiente enlace:
    </p>

    <div class="actions">
      <a href="{ { .URL }}" class="button">Ver Documento Firmado</a>
    </div>

    <div class="footer">
      <p>
        Este mensaje fue enviado desde el sistema de gestión de firmas. Por
        favor no responda a este correo.
      </p>
      <p>
        © { { now.Year }} { { commonData .Organization.Profile "Name" }}. Todos
        los derechos reservados.
      </p>
      <p>Si tiene preguntas, comuníquese con el administrador del sistema.</p>
    </div>
  </body>
</html>

Ejemplo de Certificado de Documento Firmado ​

Esta plantilla muestra cómo se puede estructurar un certificado de firma generado por el sistema.

html
<!DOCTYPE html>
<html>
  <head>
    <meta charset="UTF-8" />
    <meta name="viewport" content="width=device-width, initial-scale=1.0" />
    <title>Certificado de Firma Digital</title>
    <style>
      body {
        font-family: Arial, sans-serif;
        line-height: 1.6;
        color: #333;
        max-width: 800px;
        margin: 0 auto;
        padding: 20px;
      }
      .certificate-header {
        text-align: center;
        margin-bottom: 30px;
        border-bottom: 3px solid #333;
        padding-bottom: 20px;
      }
      .certificate-title {
        font-size: 24px;
        font-weight: bold;
        margin-bottom: 10px;
      }
      .document-details {
        margin: 20px 0;
        padding: 15px;
        background-color: #f8f8f8;
        border: 1px solid #ddd;
      }
      .signers-section {
        margin: 30px 0;
      }
      .signer-block {
        border: 1px solid #ddd;
        padding: 15px;
        margin-bottom: 20px;
        background-color: #fff;
      }
      .certificate-footer {
        margin-top: 40px;
        text-align: center;
        font-size: 12px;
        color: #666;
        border-top: 1px solid #ddd;
        padding-top: 20px;
      }
      .verification-block {
        text-align: center;
        margin: 30px 0;
        padding: 15px;
        background-color: #f0f8ff;
        border: 1px solid #b3d9ff;
      }
      .qr-code {
        text-align: center;
        margin: 20px 0;
      }
      .timestamp {
        font-style: italic;
        margin-top: 10px;
        text-align: right;
      }
    </style>
  </head>
  <body>
    <div class="certificate-header">
      <div class="certificate-title">CERTIFICADO DE FIRMA DIGITAL</div>
      <p>Referencia: { { .Document.Reference }}</p>
    </div>

    <div class="document-details">
      <h2>Información del Documento</h2>
      <p><strong>Título:</strong> { { .Document.Title }}</p>
      <p>
        <strong>Fecha de certificación:</strong> { { .Document.CertificateDate
        }}
      </p>
      <p><strong>Estado:</strong> FIRMADO</p>
    </div>

    <div class="signers-section">
      <h2>Firmantes del Documento</h2>

      { { range .Document.SignatureRequests }}
      <div class="signer-block">
        <h3>Firmante</h3>
        <p>
          <strong>Nombre:</strong> { { commonData .Recipient.PartyProfile "Name"
          }}
        </p>
        <p>
          <strong>Identificación:</strong> { { commonData
          .Recipient.PartyProfile "IDNumber" }}
        </p>
        <p>
          <strong>Método de Firma:</strong>
          { { if .Signature.Type }} { { .Signature.Type }} { { else }} Firma
          Digital { { end }}
        </p>
        <p><strong>Fecha y Hora:</strong> { { .Signature.CreatedAt }}</p>
        <p><strong>Dirección IP:</strong> { { .Signature.IP }}</p>
      </div>
      { { end }}
    </div>

    <div class="verification-block">
      <h3>Verificación de Autenticidad</h3>
      <p>
        Este documento ha sido firmado digitalmente y puede ser verificado
        escaneando el siguiente código QR o visitando el portal de verificación
        en: { { .URL }}/verify
      </p>
      <div class="qr-code">[Código QR de Verificación]</div>
    </div>

    <div class="timestamp">
      Generado el: { { now.Format "02/01/2006 15:04:05" }}
    </div>

    <div class="certificate-footer">
      <p>
        Este certificado confirma que el documento ha sido firmado digitalmente
        por todas las partes involucradas de acuerdo a los requisitos legales y
        técnicos establecidos.
      </p>
      <p>
        © { { now.Year }} { { commonData .Organization.Profile "Name" }}. Todos
        los derechos reservados.
      </p>
    </div>
  </body>
</html>

Casos Específicos ​

Plantillas para Notificaciones a Deudores ​

Para plantillas enviadas a deudores, la URL será:

{DomainURL}/debtor/documents/{DocumentID}

Plantillas para Notificaciones a Acreedores ​

Para plantillas enviadas a acreedores, la URL será:

{DomainURL}/creditor/documents/{DocumentID}

Estados de Documento ​

Los estados de documento disponibles son:

DocumentStatusPending         - Pendiente
DocumentStatusAccepted        - Aceptado
DocumentStatusRejected        - Rechazado
DocumentStatusPartiallySigned - Parcialmente firmado
DocumentStatusNoNeedSignature - No requiere firma

Solución de Problemas Comunes ​

Acceso a Datos del Perfil ​

Para acceder correctamente al nombre del destinatario, use:

{ { commonData .Profile "Name" }}

Verificación de Estados de Documento ​

Para verificar el estado de un documento y mostrar contenido condicional:

{ { if eq .Document.Status "DocumentStatusAccepted" }}
    El documento ha sido aceptado
{ { else if eq .Document.Status "DocumentStatusPartiallySigned" }}
    El documento está parcialmente firmado
{ { else }}
    El documento está pendiente de firma
{ { end }}

Manejo de Tipos de Firma ​

Para mostrar información sobre el tipo de firma utilizado:

{ { if .Signature.Type }}
    { { if eq .Signature.Type "AttachedSignature" }}
        Firma adjunta
    { { else if eq .Signature.Type "CheckboxSignature" }}
        Firma por casilla de verificación
    { { else if eq .Signature.Type "VoiceSignature" }}
        Firma por voz
    { { else }}
        Otro tipo de firma
    { { end }}
{ { else }}
    Firma estándar
{ { end }}

Tabla de Campos Disponibles con commonData ​

Campos comunes disponibles a través de commonData ​

CampoDescripciónEjemplo de uso
NameNombre{ { commonData .Profile "Name" }}
EmailCorreo electrónico{ { commonData .Profile "Email" }}
AddressDirección{ { commonData .Profile "Address" }}
AddressCityCiudad{ { commonData .Profile "AddressCity" }}
IDNumberNúmero de identificación{ { commonData .Profile "IDNumber" }}
InitialsIniciales{ { commonData .Profile "Initials" }}

Consejos Importantes ​

  1. Utilice ÚNICAMENTE la función commonData para acceder a los campos comunes entre perfiles, y recuerde que solo los 6 campos listados están disponibles a través de esta función.

  2. Los campos .Title y .Body ya están en formato HTML, por lo que no necesitan procesamiento adicional.

  3. Para plantillas de certificado, es importante incluir toda la información relevante de firmantes, fechas y métodos de verificación.

  4. Cuando trabaje con listas de firmantes (SignatureRequests), utilice el rango apropiado para iterar a través de ellos:

    { { range .Document.SignatureRequests }}
        // Acceda a los datos del firmante aquí
    { { end }}
  5. Para acceder a información de firma, asegúrese de que el objeto Signature exista:

    { { if .Signature }}
        // Acceda a datos de firma aquí
    { { end }}