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 Definições e, em seguida, na seção 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.

Dica

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:

    Amostra de layout de relatório leve
  • 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.

  • 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.

Duplicação de um relatório em PDF

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 e CTRL 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.

Visualizar as condições aplicadas a um bloco.

Selecione um valor para visualizar o resultado correspondente e editá-la, se necessário.

Visualizar o resultado de outra condição.

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.

Selecionar um campo relacionado.
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.

Adicionar uma coluna em uma tabela dinâmica.

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.

Lista de campos disponíveis para o modelo "Marcador".

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.

Formatar texto usando o 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 ou t-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">
Adicione uma coluna "Categoria de produto" em um PV.

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>
Adicionar uma tabela de dados em XML

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:

Visualização do resultado se houver marcadores.

Você pode alternar as condições usando o editor para visualizar o resultado:

Visualização do resultado se não houver marcadores.

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 marcador img; Classes do Bootstrap estão disponíveis.

  • alt: texto alternativo da imagem

  • estilo: 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.

Adicionar uma coluna com a imagem do produto na tabela de cotação.