# 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="/files/HuCuLI13bfWPYwSg8l9f" 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="/files/15N3vA7AcSiwTtuJIHaS" 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="/files/xWeLxsX6gCpliy8q9U6w" 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="/files/6kzFQZsIEmhHkXPyz82m" 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="/files/40fNwipcvkGHSPk1YGom" 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="/files/MnwH1nF5dbTLK3vuIcI2" 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]:


---

# Agent Instructions: Querying This Documentation

If you need additional information that is not directly available in this page, you can query the documentation dynamically by asking a question.

Perform an HTTP GET request on the current page URL with the `ask` query parameter:

```
GET https://sigadoc.gitbook.io/siga-doc/documentacao-adicional/criacao-de-modelos-de-documentos-no-siga-doc.md?ask=<question>
```

The question should be specific, self-contained, and written in natural language.
The response will contain a direct answer to the question and relevant excerpts and sources from the documentation.

Use this mechanism when the answer is not explicitly present in the current page, you need clarification or additional context, or you want to retrieve related documentation sections.
