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 }}