# Criação de modelos de documentos no SIGA-DOC

## Conceitos Básicos

### O que é um modelo de documento?

Um modelo de um documento é um arquivo pré-formatado que serve como base para a **criação de documentos semelhantes**. Ele geralmente inclui elementos de design e formatação, como fontes, estilos, margens e espaçamentos, além de elementos de conteúdo, como cabeçalhos, rodapés, seções e áreas reservadas para inserção de textos e imagens.&#x20;

Os modelos são muito úteis para **garantir a consistência visual e de conteúdo** em documentos produzidos em larga escala, como ofícios, formulários, contratos e outros documentos corporativos.&#x20;

Eles também podem ser usados para **economizar tempo e esforço** na criação de documentos personalizados, permitindo que **os usuários preencham apenas os campos necessários.**

### Componentes do Modelo

**Entrevista:** Campos que são preenchidos pelo usuário.&#x20;

**Documento:** HTML que representa o documento e será posteriormente convertido em PDF.

**Descrição:** Resumo do conteúdo do documento que é apresentado ao usuário em listagens.&#x20;

**Ganchos de Execução:** Pequenos trechos de código que são executados em determinados pontos do ciclo de vida do documento.

### 3 Maneiras de Descrever Modelos

**Tradicional:** Primeira versão que foi disponibilizada.&#x20;

**Tradicional com campos padronizados:** Melhorias no que diz respeito aos campos da entrevista.&#x20;

**Simples:** Um novo sistema de modelos que pode ser utilizado sem conhecimento de Freemarker ou HTML.

### Variáveis

Em computação, uma variável é um local na memória do computador que pode ser **usado para armazenar um valor**.&#x20;

Essa memória **pode ser alterada** durante a execução de um programa de computador.&#x20;

As variáveis são **identificadas por um nome** e são usadas para armazenar **diferentes tipos de dados**, como números, strings (cadeias de caracteres), booleanos e objetos.

### Expressões

Em computação, uma **expressão é uma combinação de valores, variáveis e operadores que são avaliados para produzir um resultado.**&#x20;

As expressões podem ser simples ou complexas, e podem incluir **aritmética, comparação, lógica** e outras operações.&#x20;

Por exemplo, em uma expressão aritmética simples como "2 + 3", os valores "2" e "3" são somados pelo operador "+", produzindo o resultado "5".

### Expressões Booleanas

Uma expressão booleana é uma **expressão que retorna um valor verdadeiro ou falso**. As expressões booleanas são usadas para avaliar condições e **tomar decisões** em programas de computador.&#x20;

Por exemplo, a expressão booleana "5 é maior que 3" é verdadeira, enquanto a expressão "2 é igual a 3" é falsa. Essas expressões podem ser escritas em uma linguagem de programação como:&#x20;

**5 > 3** (verdadeiro)&#x20;

**2 == 3** (falso)

### Ciclo de Vida do Documento

**Temporário:** Durante a elaboração.&#x20;

**Finalizado:** Já está pronto para assinar.&#x20;

**Assinado:** Passa a produzir efeitos.

**Arquivado no Corrente:** Já concluiu seu trâmite e aguarda a destinação.&#x20;

**Arquivado no Intermediário:** É mantido para fins de prova.&#x20;

**Recolhido:** Foi incluído no Arquivo Permanente.&#x20;

**Eliminado:** Não tem mais utilidade e é descartado.

### Por Que Usamos PDF?

Consistência e fidelidade: o padrão PDF (Portable Document Format) é capaz de **preservar a formatação e o layout de um documento**, independentemente do dispositivo ou software usado para visualizá-lo.

Isso garante a consistência e fidelidade do documento original ao longo do tempo, tornando-o uma **escolha ideal para documentos arquivísticos que precisam ser preservados por longos períodos**.

### Conversão para PDF

O OpenHtmlToPdf é uma biblioteca Java gratuita e de código aberto para converter HTML em PDF.&#x20;

O OpenHtmlToPdf permite que os desenvolvedores gerem PDFs a partir de conteúdo HTML usando CSS para definir o estilo do documento.&#x20;

A biblioteca é fácil de usar e suporta uma variedade de recursos, incluindo imagens, tabelas, listas e outras estruturas HTML comuns.

<figure><img src="https://3976217335-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FJHNx08dXFZaOnNSrUxgQ%2Fuploads%2FiEIIng1iYmN84beo3IrT%2Fimage.png?alt=media&#x26;token=72c09737-ab29-4a37-ba20-d8ee6917d26f" alt=""><figcaption></figcaption></figure>

## Modelos Simples

### Introdução

Tradicionalmente os modelos do Siga-Doc são desenvolvidos utilizando **HTML** e a linguagem **FreeMarker**. Embora esta seja uma opção viável e muito flexível, em muitos casos o desenvolvimento dos modelos se torna demasiado complexo.&#x20;

Surgiu então a necessidade de simplificar os modelos, na esperança de que os próprios usuários, ou pessoas com menos conhecimento de programação, também fossem capazes de produzir modelos. Pelo menos **os mais simples**.

### Markdown e JModel

Em vez de HTML, os modelos simples utilizam **Markdown**, que é uma linguagem de marcação muito mais simples e concisa, e que é convertida facilmente em HTML. Markdown é utilizado por muitas empresas, como a Wikipedia e o GitHub, que precisam gerar documentos padronizados, sem dar espaço para muitas "invenções", mas mantendo as principais **capacidades de formatação** que o HTML oferece.&#x20;

Em vez do FreeMarker foi desenvolvida uma nova ferramenta de processamento de modelos chamada **JModel**. O JModel tem por objetivo facilitar ao máximo o trabalho de marcar onde entram os campos que devem compor a "entrevista".

### Markdown vs HTML

<mark style="color:green;">**Markdown**</mark>

* É fácil de aprender e usar
* Ótimo para Criar conteúdo simples
* Ideal para documentação e texto básico\
  \
  **Exemplo:**\
  \
  \# Bem-vindo à minha página

  Esta é uma página simples criada com Markdown.

<mark style="color:red;">**HTML**</mark>

* Mais complexo e detalhado
* Permite controle mais preciso sobre a apresentação
* Melhor para desenvolvimento web avançado\
  \
  **Exemplo:**\
  \
  \<!DOCTYPE html>\
  \<html>\
  \<body>\
  &#x20;        \<h1> Bem-vindo à minha página! \</h1>\
  &#x20;        \<p> Esta é uma página simples criada usando HTML.\</p>\
  \</body>\
  \</html>

### StackEdit.io

O StackEdit.io é um editor de texto online gratuito que permite escrever, formatar e publicar documentos na web usando a linguagem de marcação Markdown. Ele possui recursos avançados de edição de texto e integração com diversas plataformas, facilitando a escrita e a publicação do conteúdo.

<figure><img src="https://3976217335-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FJHNx08dXFZaOnNSrUxgQ%2Fuploads%2FhWFerIDTMhNyQqBDHvGm%2Fimage.png?alt=media&#x26;token=2bbc5c6b-837a-4b72-85d3-baabf6f057b5" alt=""><figcaption></figcaption></figure>

### JModel vs Freemarker

Para demonstrar a diferença entre o JModel e o Freemarker, basta observar como um modelo bem simples em JModel ficaria se fossemos fazer a mesma coisa em Freemarker e HTML.

<mark style="color:purple;">**JModel:**</mark> \
\
[Olá, {nome}!](#user-content-fn-1)[^1]

<mark style="color:orange;">**Freemarker:**</mark>\
\
\[@interview]\
&#x20; \[@field var='nome'/]\
\[/@interview]\
\[@document]\
&#x20;  \<p> Olá\
&#x20;      \[@value var='nome'/]!\
&#x20; \</p>\
\[/@document]

### Modelo Básico

O modelo mais simples de todos é composto de um único parágrafo de texto no qual existe a inserção de um campo para perguntar, por exemplo, o nome de uma pessoa. Este modelo pode ser visto abaixo:

<mark style="color:blue;">**Olá, {nome} !**</mark>\
\
Se, na entrevista, for fornecido o nome "Renato" o documento resultante terá um único parágrafo, que será assim:

<mark style="color:red;">**Olá, Renato!**</mark>

### Modelo Básico 2

Claro que é possível criar mais parágrafos, e para isso basta pular uma linha no texto. Também se pode introduzir quantos campos quiser. Só com esse conhecimento, já seria possível criar um modelo bem básico, algo do tipo:\
\ <mark style="color:blue;">**Eu, {nome}, portador do CPF número {cpf}, venho pedir {pedido}.**</mark>\
\ <mark style="color:blue;">**Alego ao meu favor que {alegacao}.**</mark>

#### Exemplo no Siga-Doc

Vamos experimentar cadastrar um modelo bem básico no Siga-Doc para ver o resultado. Com a formatação do Markdown e os campos do JModel já dá para fazer muitas coisas interessantes.

<figure><img src="https://3976217335-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FJHNx08dXFZaOnNSrUxgQ%2Fuploads%2FSjWxEvQnL32bECZ4Bxrf%2Fimage.png?alt=media&#x26;token=b6f59234-7bf3-4cd4-b746-9e2df33ff2d0" alt=""><figcaption></figcaption></figure>

### Identificadores

Uma coisa importante a respeito dos campos é que o nome que é utilizado deve sempre começar com uma letra minúscula e ser composto por letras não acentuadas, números e o caracter sublinhado (\_).&#x20;

Este nome é o identificador de uma variável, por isso tem que respeitar estas limitações.

<figure><img src="https://3976217335-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FJHNx08dXFZaOnNSrUxgQ%2Fuploads%2FC39OF2pDvcWOhr2cvgz9%2Fimage.png?alt=media&#x26;token=b2d30ff6-273b-41f4-bd23-f5a9b4a8b04b" alt=""><figcaption></figcaption></figure>

### Tipos de Campos

<table data-full-width="false"><thead><tr><th width="153" align="center">Tipo</th><th width="118" align="center">Prefixo</th><th width="441">Descrição</th></tr></thead><tbody><tr><td align="center">texto</td><td align="center">-</td><td>Campo de texto padrão</td></tr><tr><td align="center">selecao</td><td align="center">-</td><td>Campo de seleção em lista</td></tr><tr><td align="center">memo</td><td align="center">memo</td><td>Campo de texto de múltiplas linhas</td></tr><tr><td align="center">data</td><td align="center">dt</td><td>Campo de texto para entrada de data</td></tr><tr><td align="center">hora</td><td align="center">hm</td><td>Campo de texto para entrada de hora</td></tr><tr><td align="center">numero</td><td align="center">num</td><td>Campo de texto para entrada de número inteiro</td></tr><tr><td align="center">valor</td><td align="center">val</td><td>Campo de texto para entrada de valor monetário</td></tr><tr><td align="center">checkbox</td><td align="center">chk</td><td>Campo do tipo "checkbox" do HTML</td></tr><tr><td align="center">radio</td><td align="center">rad</td><td>Campo do tipo "radio" do HTML</td></tr><tr><td align="center">editor</td><td align="center">editor</td><td>Campo de edição de HTML</td></tr><tr><td align="center">cpf</td><td align="center">cpf</td><td>Campo de texto para entrada de CPF</td></tr><tr><td align="center">cnpj</td><td align="center">cnpj</td><td>Campo de texto para entrada de CNPJ</td></tr><tr><td align="center">pessoa</td><td align="center">pessoa</td><td>Campo de seleção de pessoa</td></tr><tr><td align="center">lotacao</td><td align="center">lotacao</td><td>Campo de seleção de lotação</td></tr><tr><td align="center">cossignatario</td><td align="center"></td><td>Campo para seleção de cossignatário (será automaticamente incluído na lista de cossignatários do documento)</td></tr><tr><td align="center">funcao</td><td align="center">funcao</td><td>Campo para seleção de função gratificada</td></tr><tr><td align="center">oculto</td><td align="center"></td><td>Campo do tipo "hidden" do HTML</td></tr></tbody></table>

### Utilizando o tipo Checkbox

O modo de utilização do tipo checkbox na entrevista é igual ao dos outros tipos. Para que um campo seja mostrado na entrevista como do tipo checkbox, basta colocar kind='checkbox'. No entanto, para visualizar o conteúdo desse campo, é necessário realizar mais um passo. Isso ocorre pois, como padrão, o SIGA evidencia no documento a palavra 'Sim', caso o checkbox esteja marcado e 'Não', se o mesmo estiver desmarcado. \
Desta forma, para mostrar o conteúdo pode-se valer da ferramenta IF, que será explicada mais a frente, conforme figura abaixo.\
\ <mark style="color:blue;">**{var\_1 title='Registro de presença' kind='checkbox' document=false}**</mark>\
\ <mark style="color:blue;">**{if var\_1=='Sim'}**</mark>\ <mark style="color:blue;">**- Registro de presença**</mark>\ <mark style="color:blue;">**{/if}**</mark><br>

O atributo 'document=false' foi colocado justamente para que não seja mostrado no documento o valor atribuído a variável var\_1 ('Sim' para checkbox marcado e 'Não' para o não selecionado}.\
Com a sequência de comandos das imagens acima, é possível imprimir no documento 'Registro de Presença'.

### Utilizando o atributo HINT

Caso deseje colocar uma observação/recomendação abaixo de um campo na entrevista (conforme imagem a seguir) deve-se utilizar o atributo HINT da seguinte forma:\
\ <mark style="color:blue;">**{var\_1 title=’Celular’ hint=’Colocar o número no padrão (00) 00000-0000’}**</mark>\
\ <br>

<figure><img src="https://3976217335-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FJHNx08dXFZaOnNSrUxgQ%2Fuploads%2FUYGesPNPgXPazhEH9dJ9%2Fimage.png?alt=media&#x26;token=e40833c1-2496-491e-9242-d673a27aed7f" alt=""><figcaption></figcaption></figure>

### Utilizando um tipo inexistente

Às vezes, há necessidade de se colocar um campo na entrevista somente para funcionar como se fosse um título/subtítulo, sem o objetivo de ter um espaço logo abaixo para editar. Para que isso seja possível, é necessário atribuir um tipo inexistente.\
\ <mark style="color:blue;">**{var\_1 title='Justiça Federal' kind='meu'}**</mark>\ <mark style="color:blue;">**{var\_2 title='Lotação'}**</mark>

O tipo 'meu' explicitado na var\_1 não existe, sendo assim, esta variável assumirá a seguinte forma na entrevista. Note que abaixo do campo 'Lotação' aparece o editor padrão do SIGA.

<figure><img src="https://3976217335-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FJHNx08dXFZaOnNSrUxgQ%2Fuploads%2FBEQmnlvfi3Lzk62o17sU%2Fimage.png?alt=media&#x26;token=beb014cf-4207-429d-8ec8-9ebac971a30c" alt=""><figcaption></figcaption></figure>

### Inferindo o Tipo da Variável

O nome da variável pode ser utilizado para inferir o tipo.&#x20;

Por exemplo, se o nome for "cpf" ou "cpf\_servidor" ou "cpfServidor" será automaticamente atribuído o tipo "cpf".&#x20;

Isto acontece porque, como pode ser visto na tabela acima, para alguns tipos de campo existe um "prefixo".&#x20;

O tipo também pode ser especificado diretamente, através do parâmetro "tipo". No exemplo abaixo, todos os campos serão do tipo CPF:\
\ <mark style="color:blue;">**{cpf}**</mark>\ <mark style="color:blue;">**{cpf\_servidor}**</mark>\ <mark style="color:blue;">**{cpfServidor}**</mark>\ <mark style="color:blue;">**{codigo kind='cpf'}**</mark>

### Inferindo o Tipo “Selecao”

Existe um tipo de campo chamado "selecao" que contém uma lista de opções dentre as quais o usuário deve escolher apenas uma. A lista de opções deve ser informada no parâmetro options e precisa estar separada por ";".&#x20;

Quando o tipo não é informado e nenhum prefixo é reconhecido, se for informado o parâmetro "options" será assumido o tipo "selecao", caso o contrário, será assumido o tipo "texto".\
\ <mark style="color:blue;">**{pais options='Brasil;Argentina'}**</mark>\
\ <mark style="color:blue;">**{field var='pais' kind='selecao' options='Brasil;Argentina'}**</mark>

### Um Exemplo com Tipos de Variáveis

No exemplo abaixo, o campo {cpf} será automaticamente reconhecido e permitirá apenas a entrada de um número válido.&#x20;

O campo {pedido options='férias;licença médica'} apresentará apenas estas duas opções para o usuário selecionar.&#x20;

Além disso, o campo {alegacao kind='memo'} permitirá que o usuário digite um texto de várias linhas.\
\ <mark style="color:blue;">**Eu, {nome}, portador do CPF número {cpf}, venho pedir {pedido options='férias;licença médica'}.**</mark>\
\ <mark style="color:blue;">**Alego ao meu favor que {alegacao kind='memo'}.**</mark>

### Outros Parâmetros dos Campos

O título de um campo na entrevista pode ser especificado através do parâmetro **title**:\
\ <mark style="color:blue;">**Servidor: {nome title='Nome do Servidor'}**</mark><br>

O número de linhas e colunas de um campo do tipo memo pode ser especificado conforme o exemplo abaixo:\
\ <mark style="color:blue;">**{memoJust columns=80 lines=3}**</mark><br>

Por padrão o preenchimento dos campos é opcional, mas se for obrigatório, basta incluir o parâmetro **required=true**:\
\ <mark style="color:blue;">**Nome: {nome required=true}**</mark><br>

Caso deseje informar um valor **default** para o campo, isso pode ser obtido conforme o exemplo abaixo:\
\ <mark style="color:blue;">**País: {pais default='Brasil'}**</mark>

### Trechos Opcionais com o Comando IF

Quando precisamos que trechos do modelo sejam apresentados, ou não, dependendo do preenchimento de algum campo anterior, podemos utilizar o comando IF.&#x20;

No exemplo abaixo, a Unidade Federativa será perguntada apenas se a esfera for "Estadual". Se a esfera for "Federal", nenhuma pergunta posterior será feita.\
\ <mark style="color:blue;">**Esfera: {esfera options='Federal;Estadual' refresh='esf'}**</mark>\
\ <mark style="color:blue;">**{if esfera=='Estadual' depend='esf'}**</mark>\
\ <mark style="color:blue;">**Estado: {uf options='RJ;SP'}**</mark>\
\ <mark style="color:blue;">**{/if}**</mark>

### Os Parâmetros Refresh e Depend

Os parâmetros refresh e depend são utilizados para indicar ao sistema que, quando é feita uma alteração no campo que tem o parâmetro refresh, o comando que tem o depend deve ser atualizado.&#x20;

É importante que o valor informado para o refresh seja o mesmo que foi informado para o depend.&#x20;

Se não utilizarmos o refresh e o depend a entrevista não será automaticamente alterada para apresentar o campo "Estado" quando o usuário selecionar a esfera "Estadual".

O comando refresh sempre aceita um único valor. Já o depend pode receber uma lista de valores separados por ponto-e-vírgula para indicar que qualquer alteração em um dos campos marcados com refresh causará a atualização do comando. Por exemplo, poderíamos ter um comando assim:\
\ <mark style="color:blue;">**{if pais=='Brasil' && esfera=='Estadual' depend='pais;esf'}**</mark>

#### Refresh e Depend Automáticos

É importante entender como funciona o refresh e o depend mas, para a maior parte dos casos, podemos contar com o padrão.&#x20;

Nas versões mais recentes do Siga, o refresh é por padrão o nome da variável. Já o depend é obtido a partir de uma análise que é feita na expressão, buscando identificadores válidos.

O resultado é que, para o exemplo acima, que representa um caso bem simples, podemos usar simplesmente assim:\
\ <mark style="color:blue;">**Esfera: {esfera options='Federal;Estadual'}**</mark>\ <mark style="color:blue;">**{if esfera=='Estadual'}**</mark>\ <mark style="color:blue;">**Estado: {uf options='RJ;SP'}**</mark>\ <mark style="color:blue;">**{/if}**</mark>

### Os Comandos {if} e {/if}

O comando **{if esfera=='Estadual' depend='esf'}** marca o início do trecho que é opcional, e o comando **{/if}** marca o final. Tudo que está entre estes dois comandos será suprimido caso a expressão **esfera=='Estadual'** não seja verdadeira.&#x20;

No exemplo acima estamos comparando o valor da variável **esfera** com a constante **'Estadual'**, que está entre aspas simples. Isso é necessário para que o valor da constante não se confunda com o nome de outra variável.&#x20;

Estamos usando o operador de igualdade, **==**, mas muitos outros operadores poderiam ser utilizados como, por exemplo, o de desigualdade: **!=**. Todas as **expressões** do FreeMarker estão disponíveis para uso e, inclusive, podem conter operadores lógicos como "e" (**&&**), "ou" (**||**) e "não" (**!**).

### Repetição com o Comando FOR

Em algumas situações é necessário repetir um trecho do documento ou da entrevista diversas vezes, por exemplo, se desejarmos colher o nome de várias pessoas.&#x20;

Uma maneira comum de fazer isso é perguntando primeiro quantas pessoas são e depois usando o comando **for** para repetir várias vezes o trecho do documento que contém o campo que pergunta o nome.\
\ <mark style="color:blue;">**Número de pessoas: {qtd options='1;2;3;4;5' refresh='qtd'}**</mark>\ <mark style="color:blue;">**{for qtd depend='qtd'}**</mark>\ <mark style="color:blue;">**Nome: {nome}**</mark>\ <mark style="color:blue;">**{/for}**</mark>

#### O Índice do Comando FOR

Os campos que estiverem dentro de um **for** terão seus nomes acrescidos de um sufixo que varia de 1 até o número final da repetição.&#x20;

Por exemplo, se o usuário selecionar o número 3, em um **{for 3}** os 3 campos de nome gerados ganhariam os nomes: **nome1, nome2 e nome3**.&#x20;

Se houver a necessidade de utilizar esse contador em alguma expressão do FreeMarker, ou simplesmente imprimi-lo no documento final, o contador fica disponível na variável automática *index. Por exemplo, se desejarmos incluir o número do contador no título do campo que aparece na entrevista, podemos fazer assim:*\
\ <mark style="color:blue;">**{nome title='Nome '+\_index}**</mark>

### Organizando os Campos na Entrevista com o Comando GROUP

Se desejarmos agrupar alguns campos da entrevista, ou se quisermos acrescentar um aviso ao usuário que vai minutar o documento, podemos utilizar o comando **group**: \
\ <mark style="color:blue;">**{group title='Identificação'}**</mark>\ <mark style="color:blue;">**Nome: {nome}**</mark>\ <mark style="color:blue;">**CPF: {cpf}**</mark>\ <mark style="color:blue;">**{/group}**</mark>

Existe a possibilidade de acrescentar um aviso ao usuário que vai minutar o documento. Esse alerta/informação pode ser de 3 tipos, que deve ser escolhido de acordo com o objetivo da mensagem,  variando o fundo do texto digitado, conforme disposto abaixo.

<table data-full-width="false"><thead><tr><th width="153">Atributo</th><th>Fundo</th></tr></thead><tbody><tr><td>Info</td><td>Azul</td></tr><tr><td>Warning</td><td>Amarelo</td></tr><tr><td>Danger</td><td>Vermelho</td></tr></tbody></table>

Para utilizar esses atributos, deve-se proceder da forma discriminada abaixo:

<mark style="color:blue;">**{group title='Dados pessoais' warning='Seus dados serão mantidos em sigilo'}**</mark>\ <mark style="color:blue;">**Nome: {nome}**</mark>\ <mark style="color:blue;">**CPF: {cpf}**</mark>\ <mark style="color:blue;">**{/group}**</mark>

### Organizando os Campos da Entrevista em Colunas

Por padrão cada campo ocupará uma linha inteira na página de entrevista. Muitas vezes este tamanho todo é desnecessário. Para criar campos menores, podemos utilizar o parâmetro **col**.&#x20;

Para o sistema, uma linha da entrevista contém o equivalente a 12 colunas. Sendo assim, poderíamos criar 2 campos, cada um com a largura de 6 colunas para que eles dividam a linha meio-a-meio:\
\ <mark style="color:blue;">**Nome: {nome col=6}**</mark>\ <mark style="color:blue;">**Telefone: {tel col=6}**</mark>

Outras opções podem ser exploradas, por exemplo, o nome poderia ocupar 2/3 da linha e o CPF o terço restante:\
\ <mark style="color:blue;">**Nome: {nome col=8}**</mark>\ <mark style="color:blue;">**Telefone: {tel col=4}**</mark>

### Variáveis do Contexto

Além de variáveis obtidas da “entrevista”, também podemos acessar metadados do documento ou informações de outros documentos interligados. Para tanto, utilizaremos o comando **“print”**, assim:\
\ <mark style="color:blue;">**{print doc.sigla}**</mark><br>

| Parâmetro                                       | Referência                             |
| ----------------------------------------------- | -------------------------------------- |
| Nome do subscritor                              | doc.subscritor.descricao               |
| Matrícula do subscritor                         | doc.subscritor.sigla                   |
| Lotação do subscritor                           | doc.subscritor.lotacao                 |
| Cargo do subscritor                             | doc.subscritor.cargo.nomeCargo         |
| Data                                            | doc.dtDocDDMMYYYY                      |
| Destinatário                                    | doc.destinatarioString                 |
| Descrição                                       | doc.descrDocumento                     |
| Sigla do pai                                    | doc.pai.sigla                          |
| Sigla do autuado                                | ref.pai.autuado.mob.sigla              |
| Lista por modelo                                | ref.modelo('MODELO')                   |
| Sigla do documento mais recente de certo modelo | ref.modelo('MODELO’').ultimo.mob.sigla |
| Campo de documento interligado                  | ref.modelo('MODELO').form.CAMPO        |

Caso seja necessário fazer referência a lotação, função de confiança e cargo de um servidor, <mark style="color:red;">**que não seja o subscritor**</mark>, deve-se utilizar os comandos abaixo, substituindo o campo "nomevariavel" pela nomenclatura da respectiva variável que faz menção ao nome do servidor. É importante destacar que para utilizar as funções abaixo, a variável deve ser do tipo 'pessoa'.

**Nome:** func.pessoa((.vars\['<mark style="color:orange;">nomevariavel</mark>\_pessoaSel.id'])?number).descricao\
**Matrícula:** func.pessoa((.vars\['<mark style="color:orange;">nomevariavel</mark>\_pessoaSel.id'])?number).sigla\
**Lotação:** func.pessoa((.vars\['<mark style="color:orange;">nomevariavel</mark>\_pessoaSel.id'])?number).lotacao\
**Função de confiança:** func.pessoa((.vars\['<mark style="color:orange;">nomevariavel</mark>\_pessoaSel.id'])?number).funcaoConfianca.descricao\
**Cargo:**  func.pessoa((.vars\['<mark style="color:orange;">nomevariavel</mark>\_pessoaSel.id'])?number).cargo.descricao

### Selecionando o Estilo do Documento

Até agora vimos como se faz para criar o texto do documento e não consideramos outros aspectos como brasão, cabeçalho, assinatura, rodapé, etc.&#x20;

Existem alguns estilos pré-definidos para os documentos e para inserirmos nosso texto dentro de um deles utilizaremos o comando **{set}**. O que este comando faz é atribuir valores para algumas variáveis que controlam a seleção do estilo e alguns parâmetros para configurar detalhes de formatação.

#### Selecionando o STYLE

Existem algumas variáveis que são padrão do JModel e é fácil identificá-las pois os nomes são em inglês e elas são escritas em letras todas maiúsculas. A principal variável que precisa ser definida se chama **STYLE** e é utilizada para escolher o estilo do documento. A tabela completa pode ser vista abaixo.

<table><thead><tr><th width="211">Variável</th><th>Objetivo</th></tr></thead><tbody><tr><td>STYLE</td><td>Define o estilo do documento e aceita as seguintes opções, todas entre aspas simples: memorando, assentamentoFuncional, requerimento, processo, provimento, portaria, oficio e solicitacao. Se nenhum valor for informado será criado um documento do estilo default apenas com brasão centralizado e assinatura.</td></tr><tr><td>PAGE_SIZE</td><td>Define o formato da página, o valor default é 'A4'</td></tr><tr><td>PAGE_ORIENTATION</td><td>Define a orientação da página que por padrão é 'portrait' mas pode também ser 'landscape'</td></tr><tr><td>MARGIN_LEFT</td><td>Margem esquerda que por padrão é '3cm'</td></tr><tr><td>MARGIN_RIGHT</td><td>Margem direita que por padrão é '2cm'</td></tr><tr><td>MARGIN_TOP</td><td>Margem superior que por padrão é '1cm'</td></tr><tr><td>MARGIN_BOTTOM</td><td>Margem inferior que por padrão é '2cm'</td></tr></tbody></table>

#### Selecionando Outros Parâmetros de Estilo

Também existem parâmetros complementares que são específicos do Siga-Doc e podem ser vistos nas tabelas abaixo.

<table><thead><tr><th width="287">Variável</th><th>Objetivo</th></tr></thead><tbody><tr><td>_fecho</td><td>Indica o fecho de um memorando, requerimento ou ofício, o valor default é 'Atenciosamente,' para memorando e requerimento</td></tr><tr><td>_tamanhoLetra</td><td>Permite aumentar ou diminuir o tamanho do fonte, as opções são Pequena, Normal e Grande, o valor default é 'Normal'</td></tr><tr><td>_tipo</td><td>Sobrescreve o tipo do documento que é apresentado logo antes do número</td></tr><tr><td>_formatarOrgao</td><td>Apresenta o nome do órgão junto aos dados da assinatura</td></tr><tr><td>_ementa</td><td>Texto da ementa, apenas para provimento</td></tr><tr><td>_titulo</td><td>Título, apenas para provimento</td></tr><tr><td>_subtitulo</td><td>Subtítulo, apenas para provimento</td></tr><tr><td>_dispoeSobre</td><td>Texto informado sobre o que dispõe a portaria</td></tr><tr><td>_abertura</td><td>Texto de abertura da portaria</td></tr><tr><td>_tipoAutoridade</td><td>Tipo de autoridade do ofício</td></tr><tr><td>_genero</td><td>Gênero da autoridade do ofício</td></tr><tr><td>_vocativo</td><td>Vocativo da autoridade do ofício</td></tr><tr><td>_enderecamentoDest</td><td>Endereçamento do destinatário do ofício</td></tr><tr><td>_nomeDest</td><td>Nome do destinatário do ofício</td></tr><tr><td>_cargoDest</td><td>Cargo do destinatário do ofício</td></tr><tr><td>_orgaoDest</td><td>Órgão destinatário do ofício</td></tr><tr><td>_enderecoDest</td><td>Endereço do destinatário do ofício</td></tr><tr><td>_assunto</td><td>Assunto da solicitação</td></tr><tr><td>_exibeAssinatura</td><td>Indica se o estilo default deve exibir assinatura, o default é true</td></tr><tr><td>_orgaoCabecalho</td><td>Indica se o estilo default deve apresentar o nome do órgão no cabeçalho, o valor default e true</td></tr><tr><td>_numeracaoCentralizada</td><td>Indica se a numeração do estilo default deve ser centralizada, o valor default é false</td></tr><tr><td>_dataAntesDaAssinatura</td><td>Indica se a data deve ser exibida logo antes da assinatura no estilo default, o valor default é false</td></tr><tr><td>_incluirMioloDJE</td><td>Indica se o "miolo" do documento deve ser exportado para o Diário no estilo default, o valor default é false</td></tr><tr><td>_omitirCodigo</td><td>Indica se o código do documento deve ser omitido no estilo default, o valor default é false</td></tr><tr><td>_omitirData</td><td>Indica se a data do documento deve ser omitido no estilo default, o valor default é false</td></tr><tr><td>_topoPrimeiraPagina</td><td>Texto a ser incluído no topo da primeira página do documento no estilo default</td></tr><tr><td>_incluirAssinaturaBIE</td><td>Indica se a assinatura deve ser incluída no Boletim Interno no estilo default, o valor default é true</td></tr><tr><td>_exibeClassificacaoDocumental</td><td>Indica se o código da classificação documental deve ser incluída no documento no estilo default, o valor default é true</td></tr><tr><td>_exibeRodapeEnderecamento</td><td>Indica se o rodapé de endereçamento deve ser incluída no documento no estilo default, o valor default é false</td></tr></tbody></table>

#### Estilo de Memorando

Um memorando bem simples poderia ser gerado da seguinte forma:\
\ <mark style="color:blue;">**{set STYLE='memorando' \_fecho='Cordialmente,'}**</mark>\ <mark style="color:blue;">**Eu, {nome}, estou de acordo.**</mark>

### Descrição Automática

Com os Modelos Simples, podemos criar descrição automática para os documentos criados. Para isso, basta escrever o conteúdo da descrição entre os comandos **{description} e {/description}**, como pode ser visto no exemplo abaixo. Além dos campos utilizados no documento, a descrição pode incluir novos campos de entrevista.\
\ <mark style="color:blue;">**Eu, {nome}, estou de acordo.**</mark>\ <mark style="color:blue;">**{description}**</mark>\ <mark style="color:blue;">**Despacho de aprovação de {nome}, matrícula: {matricula}**</mark>\ <mark style="color:blue;">**{/description}**</mark><br>

### Executando Operações em Momentos do Ciclo de Vida com o Comando HOOK

É comum acrescentarmos trechos de código FreeMarker que são executados em determinados momentos do ciclo de vida de um documento. Por exemplo, podemos querer iniciar um procedimento de Workflow quando o documento é assinado, ou validar o preenchimento de algum perfil antes da assinatura. Para isso existe o comando **hook**. No exemplo abaixo, temos o hook sendo utilizado exatamente para esse fim:\
\ <mark style="color:blue;">**{hook 'BEFORE\_SIGN'}**</mark> \
&#x20;  <mark style="color:blue;">**\[#if !doc.getResponsaveisPorPapel("gestor")??]**</mark> \
&#x20;      <mark style="color:blue;">**\[#assign x = exbl.appException("Não é permitido assinar este documento antes de definir uma pessoa ou lotação com o papel de Gestor para representar o proponente da solicitação de deslocamento") /]**</mark> \
&#x20;  <mark style="color:blue;">**\[/#if]**</mark> \ <mark style="color:blue;">**{/hook}**</mark> \
\ <mark style="color:blue;">**{hook 'AFTER\_SIGN'}**</mark> \
&#x20;  <mark style="color:blue;">**\[#assign criado = func.criarWorkflow('TRF2: Solicitação de Deslocamento', doc, cadastrante, titular, lotaCadastrante, lotaTitular) /]**</mark> \ <mark style="color:blue;">**{/hook}**</mark>

#### Hook e Etapas do Ciclo de Vida

As etapas do ciclo de vida que são interceptadas pelo hook são as seguintes:

<table><thead><tr><th width="167">Identificador</th><th>Etapa</th></tr></thead><tbody><tr><td>BEFORE_SAVE</td><td>Imediatamente antes de gravar o documento</td></tr><tr><td>AFTER_DRAFT</td><td>Quando o documento em elaboração é finalizado</td></tr><tr><td>BEFORE_SIGN</td><td>Imediatamente antes de gravar a assinatura</td></tr><tr><td>AFTER_SIGN</td><td>Imediatamente depois de gravar a assinatura</td></tr></tbody></table>

### Inserindo os Modelos no Siga-Doc

Existem duas maneiras para inserir Modelos Simples no Siga-Doc.

A primeira consiste em selecionar a opção "FreeMarker" e incluir o modelo diretamente. O Siga-Doc faz uma avaliação do modelo e concluirá que se trata de um modelo simples desde que ele não encontre nenhuma das macros **@entrevista, @documento, @descricao ou @markdown**.

A segunda opção, portanto, consiste em incluir o Modelo Simples entre as pseudo macros **\[@markdown] e \[/@markdown].**\
\ <mark style="color:blue;">**\[@entrevista]**</mark> \
&#x20;  <mark style="color:blue;">**\[@campo var="nome" /]**</mark> \ <mark style="color:blue;">**\[/@entrevista]**</mark> \
\ <mark style="color:blue;">**\[@markdown]**</mark> \
&#x20;   <mark style="color:blue;">**Olá {print nome!}!**</mark> \ <mark style="color:blue;">**\[/@markdown]**</mark>

### Limitações do Markdown e do JModel

Em determinadas situações pode ser necessário criar algum tipo de diagramação não suportada pelo Markdown.&#x20;

De maneira geral, isso provavelmente significa que estamos querendo criar um documento digital como se ele fosse um daqueles **antigos formulários para serem preenchidos a mão.** Por favor, não façam isso.&#x20;

A estética desses documentos é coisa de outra época. Mesmo assim, ainda existem pessoas que acreditam que é assim que fica bonito. **Fazer documentos digitais com caixinhas como se eles fossem ser preenchidos manualmente dificulta, complica e é muito contraproducente.**&#x20;

Se, mesmo assim, for detectada a necessidade de usar algum tipo de diagramação não suportada pelo Markdown, **a boa notícia é que código HTML pode ser escrito junto com o Markdown**, sem problema algum:\
\ <mark style="color:blue;">**\<p style="color: red">**</mark> \
&#x20;   <mark style="color:blue;">**Olá, {nome}!**</mark> \ <mark style="color:blue;">**\</p>**</mark>

Por outro lado, pode ser necessário usar IFs ou FORs ou expressões mais complexas.&#x20;

Neste caso, é possível **aplicar código FreeMarker diretamente no Modelo Simples**, conforme pode ser visto ao lado.\
\ <mark style="color:blue;">**País: {pais options='Brasil;Argentina'}**</mark> \
\ <mark style="color:blue;">**\[#if pais=='Brasil']**</mark> \
&#x20; <mark style="color:blue;">**Ótimo lugar para se morar!**</mark> \ <mark style="color:blue;">**\[/#if]**</mark>

### Somando valores

Para somar valores, deve-se atribuir uma variável no início do modelo \[#assign <mark style="color:orange;">nomedavariável</mark> = 0 document=false]. Considerando que o valor a ser adicionado esteja dentro de um FOR,  é necessário colocar  \[#assign <mark style="color:orange;">nomedavariavel</mark> = <mark style="color:orange;">nomedavariavel</mark> + .vars\['<mark style="color:green;">variavel\_que\_se\_deseja\_somar</mark>'+\_index]?replace('.', '')?replace(',', '.')?number] dentro do FOR, onde:

o   .vars\['<mark style="color:green;">variavel\_que\_se\_deseja\_somar</mark>'+\_index]: utilizado para somar o valor que está dentro do FOR e o +\_index é justamente para especificar a rodada do FOR que está.

o   ?replace('.', '')?replace(',', '.'): utilizado para substituir os ‘.’ e as ‘,’ conforme fórmulas

o   ?number: para converter em número, visto que o termo é entendido como string pelo freemarker.

**Exemplo:** \
\[#assign valortotal = 0 document=false]\
{qtd\_imoveis title='Qual é a quantidade de salas/imóveis?' options='1;2;3;4;5;6;7;8;9;10;11;12;13;14;15;16;17;18;19;20' document=false}\
\
{for qtd\_imoveis} \
\[#assign valortotal = valortotal + .vars\['valor'+\_index]?replace('.', '')?replace(',', '.')?number] \
{/for}

\[#assign valortotal = valortotal?string.currency] (A função ?string.currency é utilizada para colocar a formatação de moeda no valor)\
\
Para visualizar o valor da variável, é necessário efetuar um print.\ <br>

[^1]:
