Relatórios em PDF¶
Com o Estúdio, você pode editar relatórios PDF existentes (ex.: faturas, cotações, etc.) ou criar novos relatórios.
Layout padrão¶
O layout padrão dos relatórios é gerenciado fora do Estúdio. Vá para Empresas, clique em Configurar layout do documento. As configurações de layout são específicas da empresa, mas se aplicam a todos os relatórios.
e, em seguida, na seçãoDica
Você pode ver como as diferentes configurações afetam o layout do relatório na visualização do relatório à direita ou fazer download de um PDF de fatura de amostra clicando em Baixar visualização em PDF.
Usar as seguintes definições:
Layout: Quatro layouts estão disponíveis:
Fonte: Sete fontes estão disponíveis: Lato, Roboto, Open Sans, Montserrat, Oswald, Raleway e Tajawal (que suporta scripts árabes e latinos). Acesse o site do Google Fonts <https://fonts.google.com/>`_ para visualizá-las.
Logotipo da empresa: Clique no botão Editar para carregar ou alterar o logotipo. Isso adiciona o logotipo ao registro da empresa no modelo Empresa, que pode ser acessado indo até e clicando em Atualizar informações na seção Empresas.
Cores: Altera as cores primárias e secundárias usadas para estruturar os relatórios. As cores padrão são geradas automaticamente com base nas cores do logotipo.
Plano de fundo do layout: Os seguintes planos de fundo estão disponíveis:
Em branco: nada é exibido.
Geométrico: uma imagem com formas geométricas é exibida em segundo plano.
Personalizado: carregue uma imagem de fundo personalizada.
guilabel:
Slogan da empresa
: Isso é exibido no cabeçalho dos relatórios externos. Você pode adicionar várias linhas de texto.
guilabel:
Detalhes da empresa
: São exibidos no cabeçalho dos relatórios externos. Você pode adicionar várias linhas de texto.
Formato da folha: para definir o tamanho padrão do papel dos relatórios. Você pode selecionar A4 (21 cm x 29,7 cm), Carta (EUA) (21,59 cm x 27,54 cm) ou Página de códigos QR. Isso também pode ser definido para relatórios individuais no campo Formato da folha no Estúdio.
Criação de novos relatórios em PDF¶
Para criar um novo relatório para um modelo, acesse o modelo, clique no botão Ativar/desativar Estúdio e, em seguida, clique em Relatórios. Clique em Novo e, na janela pop-up que se abre, selecione o tipo de relatório. Isso é usado exclusivamente para determinar o que é exibido no cabeçalho e no rodapé:
Depois de criar o relatório, você pode começar a editá-lo.
Edição de relatórios em PDF¶
Para acessar os relatórios disponíveis para um modelo, acesse o modelo (por exemplo, pedidos de vendas), clique no botão Ativar/desativar Estúdio e, em seguida, clique em Relatórios. Selecione um relatório existente para abri-lo ou crie um novo relatório.
Dica
Como alternativa, você também pode abrir o Estúdio, clicar em Relatórios e procurar um relatório ou modelo específico.
Importante
É altamente recomendável duplicar o relatório padrão e fazer alterações na versão duplicada. Para duplicar um relatório, passe o ponteiro do mouse sobre o canto superior direito do relatório, clique no ícone de reticências verticais (⋮) e selecione Duplicar.
Opções¶
Depois de selecionar ou criar um relatório, você pode usar as opções na parte esquerda da tela para:
Alterar o Nome do relatório. O novo nome é aplicado em todos os lugares (no Estúdio, sob o botão Imprimir e no nome do arquivo PDF).
Modificar o Formato da folha. Se nenhum valor for selecionado, o formato definido no layout padrão será usado.
Mostrar no menu de impressão: para adicionar o relatório no menu Impressão disponível no registro.
Recarregar do anexo: para salvar o relatório como um anexo no registro na primeira vez em que ele for gerado e recarregar a versão original do relatório em qualquer momento subsequente. Isso é legalmente exigido para faturas e é usado principalmente nesse caso.
Limitar a visibilidade para grupos: para limitar a disponibilidade do relatório em PDF a grupos de usuários específicos :doc:` <../general/users/access_rights>`.
Editar fontes: para modificar o relatório diretamente no arquivo XML.
Redefinir relatório: para descartar todas as alterações feitas no relatório e redefini-lo para sua versão padrão.
Imprimir visualização: para gerar e baixar uma visualização do relatório.
Editor de relatórios¶
O editor de relatórios permite que você modifique a formatação e o conteúdo do relatório.
Dica
Você pode Desfazer ou Refazer as alterações usando os botões relacionados ou os atalhos
CTRL Z
eCTRL Y
.As alterações são salvas automaticamente quando você sai do relatório ou manualmente usando o botão Salvar.
Você pode redefinir o relatório para sua versão padrão clicando no botão Redefinir relatório na parte esquerda da tela.
Importante
A edição do cabeçalho e do rodapé de um relatório afeta todos os relatórios padrão e personalizados.
Blocos condicionais¶
Os retângulos tracejados representam blocos condicionais (instruções if/else). Eles são usados para mostrar/ocultar conteúdo com base em condições específicas. Clique no bloco para visualizar as condições.
Selecione um valor para visualizar o resultado correspondente e editá-la, se necessário.
Nota
As condições só podem ser editadas em XML.
Outros conteúdos¶
Há dois tipos de conteúdo de texto nos relatórios:
Texto estático, ou seja, o texto que não está destacado em azul, que pode ser modificado diretamente no editor.
Texto dinâmico, ou seja, o texto destacado em azul, que é substituído por valores de campo quando o relatório é gerado, por exemplo, o número do pedido de venda ou a data da cotação.
Você pode adicionar conteúdo (ex.: campos, listas, tabelas, imagens, banners, etc.) ao relatório usando comandos. Digite /
para abrir a powerbox e, em seguida, digite o nome do comando ou selecione-o na lista.
Para adicionar texto estático ao relatório, digite o texto onde você quiser.
Para fazer alterações mais avançadas, você pode editar o relatório no XML diretamente.
Adicionar um campo¶
Para adicionar um campo, digite /
e selecione o comando Campo. Na lista que se abre, selecione ou pesquise o campo; clique na seta para a direita ao lado do nome do campo para acessar a lista de campos relacionados, se necessário. Em seguida, especifique o valor padrão e pressione Enter
.
Adicionar uma tabela de dados¶
As tabelas de dados são usadas para exibir campos relacionais. Para adicionar uma tabela de dados, digite /
, selecione o comando Tabela dinâmica e selecione a relação a ser exibida na tabela.
Nota
Somente as relações do tipo one2many
ou many2many
podem ser exibidas como tabelas de dados.
Depois que a tabela tiver sido adicionada, você poderá adicionar colunas usando as ferramentas de tabela. Posicione o cursor na parte superior da coluna, clique no retângulo roxo e selecione uma opção.
Em seguida, você pode inserir o campo de sua escolha nas colunas. A caixa de diálogo que se abre mostra o objeto de origem do campo (ex.:, o modelo Marcador) e a lista de campos disponíveis.
Nota
A linha padrão itera automaticamente sobre o conteúdo do campo, gerando uma linha no relatório para cada valor de campo (por exemplo, uma linha por marcador). Você pode adicionar linhas de conteúdo estático acima ou abaixo das linhas geradas usando as ferramentas de tabela.
Você também pode adicionar tabelas de dados ao modificar o XML do relatório.
Formatação¶
Para formatar o texto no relatório, selecione-o e, em seguida, formate-o usando as opções no Editor de texto.
Editar o XML do relatório¶
Aviso
Modificar o XML diretamente pode resultar em problemas de relatório durante upgrades. Se isso acontecer, basta copiar suas alterações da base de dados antiga para o base de dados atualizada.
Para editar o XML do relatório, clique em Editar fontes no painel esquerdo.
Exemplos¶
Às vezes, as tabelas não são reconhecidas adequadamente como tal devido a estruturas complexas. Nesses casos, você ainda pode modificá-las manualmente no XML do relatório. Por exemplo, com um pedido de vendas, você pode encontrar a seguinte estrutura no XML (simplificada para fins de documentação):
<!-- table root element --> <table> <!-- thead = table header, the row with column titles --> <thead> <!-- table row element --> <tr> <!-- table header element --> <th>Name</th> <th>Price</th> </tr> </thead> <!-- table body, the main content --> <tbody> <!-- we create a row for each subrecord with t-foreach --> <tr t-foreach="record.some_relation_ids" t-as="line"> <!-- for each line, we output the name and price as table cells --> <td t-out="line.name"/> <td t-out="line.price"/> </tr> </tbody> </table>Para modificar uma tabela, você deve garantir que cada linha tenha o mesmo número de células de dados. Por exemplo, no caso acima, é necessário adicionar uma célula na seção de cabeçalho (com, por exemplo, o título da coluna) e outra na seção de corpo com o conteúdo do campo (geralmente, com uma diretiva
t-out
out-field
).<table> <!-- table root element --> <thead> <!-- thead = table header, the row with column titles --> <tr> <!-- table row element --> <th>Name</th> <!-- table header element --> <th>Price</th> <th>Category</th> </tr> </thead> <tbody> <!-- table body, the main content --> <tr t-foreach="record.some_relation_ids" t-as="line"> <!-- we create a row for each subrecord with t-foreach --> <td t-out="line.name"/> <!-- for each line, we output the name and price as table cells --> <td t-out="line.price"/> <td t-out="line.category_id.display_name"/> </tr> </tbody> </table>Nota
As células podem abranger várias linhas ou colunas. Para obter mais informações, acesse o site da Mozilla Developer Network.
Por exemplo, você pode modificar o relatório de Cotação/Pedido para adicionar uma coluna para exibir a categoria do produto na tabela principal:
<table class="table table-sm o_main_table table-borderless mt-4"> <!-- In case we want to repeat the header, remove "display: table-row-group" --> <thead style="display: table-row-group"> <tr> <th name="th_description" class="text-start">Description</th> <th>Product Category</th> <th name="th_quantity" class="text-end">Quantity</th> <th name="th_priceunit" class="text-end">Unit Price</th> [...] <tr t-att-class="'bg-200 fw-bold o_line_section' if line.display_type == 'line_section' else 'fst-italic o_line_note' if line.display_type == 'line_note' else ''"> <t t-if="not line.display_type"> <td name="td_name"><span t-field="line.name">Bacon Burger</span></td> <td t-out="line.product_id.categ_id.display_name"/> <td name="td_quantity" class="text-end"> <span t-field="line.product_uom_qty">3</span> <span t-field="line.product_uom">units</span> <span t-if="line.product_packaging_id">
Para adicionar uma tabela em XML, você precisa saber os nomes dos campos e objetos que quer acessar e exibir. Como exemplo, vamos adicionar uma tabela que detalha os marcadores em um pedido de vendas:
<!-- table root element -->
<table class="table">
<!-- thead = table header, the row with column titles -->
<thead>
<!-- table row element -->
<tr>
<!-- table header element -->
<th>ID</th>
<th>Name</th>
</tr>
</thead>
<!-- table body, the main content -->
<tbody>
<!-- we create a row for each subrecord with t-foreach -->
<tr t-foreach="doc.tag_ids" t-as="tag">
<!-- for each line, we output the name and price as table cells -->
<td t-out="tag.id"/>
<td t-out="tag.name"/>
</tr>
</tbody>
</table>
Nota
Ao adicionar tabelas manualmente, estilize-as usando as classes Bootstrap, como a classe table
incluída no exemplo acima.
Se quiser mostrar/ocultar conteúdo com base em condições específicas, você pode adicionar manualmente instruções de controle if/else
no XML do relatório.
Por exemplo, se você quiser ocultar uma tabela de dados personalizada se não houver marcadores, poderá usar o atributo t-if
para definir a condição, que é então avaliada como Verdadeira
ou Falsa
. A tabela não será exibida se não houver cotações na cotação.
<!-- table root element -->
<table class="table" t-if="len(doc.tag_ids) > 0">
<!-- thead = table header, the row with column titles -->
<thead>
<!-- table row element -->
<tr>
<!-- table header element -->
<th>ID</th>
<th>Name</th>
</tr>
</thead>
<!-- table body, the main content -->
<tbody>
<!-- we create a row for each subrecord with t-foreach -->
<tr t-foreach="doc.tag_ids" t-as="tag">
<!-- for each line, we output the name and price as table cells -->
<td t-out="tag.id"/>
<td t-out="tag.name"/>
</tr>
</tbody>
</table>
Se quiser exibir outro bloco caso a instrução t-if
seja avaliada como Falsa
, você poderá especificá-lo usando a instrução t-else
. O bloco t-else
deve seguir diretamente o bloco t-if
na estrutura do documento. Não há necessidade de especificar nenhuma condição no atributo t-else
. Como exemplo, vamos mostrar uma mensagem rápida explicando que não há marcadores na cotação:
<!-- table root element -->
<table class="table" t-if="len(doc.tag_ids) > 0">
<!-- thead = table header, the row with column titles -->
<thead>
<!-- table row element -->
<tr>
<!-- table header element -->
<th>ID</th>
<th>Name</th>
</tr>
</thead>
<!-- table body, the main content -->
<tbody>
<!-- we create a row for each subrecord with t-foreach -->
<tr t-foreach="doc.tag_ids" t-as="tag">
<!-- for each line, we output the name and price as table cells -->
<td t-out="tag.id"/>
<td t-out="tag.name"/>
</tr>
</tbody>
</table>
<div class="text-muted" t-else="">No tag present on this document.</div>
Ao usar a notação t-if/t-else
, o editor de relatórios reconhece que essas seções são mutuamente exclusivas e devem ser exibidas como blocos condicionais:
Você pode alternar as condições usando o editor para visualizar o resultado:
Se quiser ter várias opções, você também pode usar as diretivas t-elif
para adicionar condições intermediárias. Por exemplo, é assim que o título dos relatórios de pedidos de vendas muda com base na condição do documento subjacente.
<h2 class="mt-4">
<span t-if="env.context.get('proforma', False) or is_pro_forma">Pro-Forma Invoice # </span>
<span t-elif="doc.state in ['draft','sent']">Quotation # </span>
<span t-else="">Order # </span>
<span t-field="doc.name">SO0000</span>
</h2>
O título Fatura Pro-Forma é usado dependendo de algumas condições contextuais. Se essas condições não forem atendidas e a situação do documento for provisório
ou enviado
, será usada Cotação. Se nenhuma dessas condições for atendida, o título do relatório será Pedido.
Trabalhar com imagens em um relatório pode ser um desafio, pois o controle preciso sobre o tamanho e o comportamento da imagem nem sempre é óbvio. É possível inserir campos de imagem usando o editor de relatórios (usar o comando /Field), mas inseri-los em XML usando a diretiva t-field
e os atributos t-options
que a acompanham proporciona melhor controle de dimensionamento e posicionamento.
Por exemplo, o código a seguir gera o campo image_128
do produto da linha como uma imagem de 64px de largura (com uma altura automática baseada na proporção da imagem).
<span t-field="line.product_id.image_128" t-options-widget="image" t-options-width="64px"/>
As seguintes opções estão disponíveis para widgets de imagem:
largura
: largura da imagem, geralmente em pixels ou unidades de comprimento CSS (por exemplo,rem
) (deixe em branco para largura automática).altura
: altura da imagem, geralmente em pixels ou unidades de comprimento CSS (ex.:rem
) (deixe em branco para altura automática).classe
: Classes CSS aplicadas no marcadorimg
; Classes do Bootstrap estão disponíveis.alt
: texto alternativo da imagemestilo
: atributo de estilo; permite que você substitua estilos mais livremente do que com as classes do Bootstrap.
Esses atributos devem conter cadeias de caracteres, ou seja, texto entre aspas dentro de aspas, por exemplo, t-options-width="'64px'"
(ou, alternativamente, uma expressão Python válida).
Nota
O widget de imagem não pode ser usado em um marcador img
. Em vez disso, defina a diretiva t-field
em um nó span
(para conteúdo em linha) ou div
(para conteúdo em bloco).
Por exemplo, vamos adicionar uma coluna com a imagem do produto na tabela de cotação:
<table class="table table-sm o_main_table table-borderless mt-4">
<thead style="display: table-row-group">
<tr>
<th>Image</th>
<th name="th_description" class="text-start">Description</th>
<th>Product Category</th>
<th name="th_quantity" class="text-end">Quantity</th>
<th name="th_priceunit" class="text-end">Unit Price</th>
[...]
<t t-foreach="lines_to_report" t-as="line">
<t t-set="current_subtotal" t-value="current_subtotal + line.price_subtotal"/>
<tr t-att-class="'bg-200 fw-bold o_line_section' if line.display_type == 'line_section' else 'fst-italic o_line_note' if line.display_type == 'line_note' else ''">
<t t-if="not line.display_type">
<td>
<span t-field="line.product_template_id.image_128"
t-options-widget="'image'"
t-options-width="'64px'"
t-options-class="'rounded-3 shadow img-thumbnail'"
/>
</td>
<td name="td_name"><span t-field="line.name">Bacon Burger</span></td>
<td t-out="line.product_id.categ_id.display_name"/>
O atributo t-options-width
restringe a largura da imagem a 64 pixels, e as classes o Bootstrap usadas em t-options-class
criam uma borda semelhante a uma miniatura com cantos arredondados e uma sombra.