Modelos HTML de Conjunto (Relatório e Discriminação)

Os modelos HTML (.html e .htm) para o contexto de Conjunto são processados pelo motor de relatórios gráficos do RuB (RuBHtmlReport). Eles são especialmente projetados para gerar folhas A4/A5 ou relatórios em PDF com a discriminação detalhada de todos os produtos pertencentes a um kit ou agrupamento cadastrado.

graph LR
    A[Conjunto Cadastrado: ID_CONJUNTO] --> B[IntfEtiquetaPrintWriter]
    B -->|Itera ConjuntoProduto| C[reportCollection: Linhas de Itens]
    B -->|Mapeia Cabeçalho| D[toJasperMap: Variáveis do Kit]
    C --> E[RuBHtmlReport / Jasper Engine]
    D --> E
    E --> F[Documento PDF Gerado com Tabela de Produtos]

Como funciona a iteração de produtos no HTML

Quando a solicitação de etiqueta informa um conjunto existente no banco de dados (Conjunto.ID_CONJUNTO):

  1. O RuB carrega o registro do conjunto e define as variáveis de cabeçalho (CODIGO_CONJUNTO, LOJA, TOTAL_PRODUTOS_CONJUNTO, etc.).
  2. O sistema itera todos os itens vinculados ao conjunto (DB.iterateConjuntoProduto) e alimenta a coleção de linhas (reportCollection).
  3. Para cada produto, os campos são calculados conforme a sua natureza (produtos unitários ou pesáveis com peso variável).
  4. O template HTML recebe tanto os parâmetros de cabeçalho quanto o conjunto de dados para renderizar a tabela discriminada.

Campos da lista de produtos (reportCollection)

Em modelos HTML de conjunto, cada linha da tabela de produtos expõe os seguintes campos:

CampoDescriçãoRegra de FormataçãoExemplo de valor
FIELD_PRODUTODescrição completa do produto (label).p.getLabel()PICANHA BOVINA RESFRIADA VAC
FIELD_QTDQuantidade do item no kit formatada com sua unidade de medida.Para pesáveis: String.format("%.3f KG", qtd / 1000d).
Para unitários: qtd + " " + embalagem.getDescricao().
1.500 KG / 2 UN / 1 CX
FIELD_CODIGO_BARRASCódigo de barras EAN-13 da menor embalagem.Preenchido para produtos não pesáveis (emb.getFirstCodigo(13)).7891234567895
FIELD_SETORNome do setor mercadológico calculado do produto.p.getSetorCalculado().getLabel()AÇOUGUE & AVES
FIELD_CLASSE_RAIZNome da categoria / classe raiz do produto.p.getClasseProdutoRaiz().getLabel() (ou "Sem classe").CARNES NOBRES

Variáveis de cabeçalho disponíveis

VariávelDescriçãoExemplo de valor
${CODIGO_CONJUNTO}Código identificador do kit.KIT-CHURRASCO-01
${LOJA}Razão social ou nome da filial.HIPERMERCADO CENTRAL
${ID_LOJA}Identificador numérico da loja.101
${TOTAL_PRODUTOS_CONJUNTO}Contagem total de SKUs distintos contidos no kit.4
${LIMITE_PRODUTOS_CONJUNTO}Limite máximo de SKUs por kit.20
${DT_ATUAL}Data corrente da emissão.24/08/2026
${DTH_ATUAL}Data e hora completas da emissão.24/08/2026 18:30:00

Exemplos de Modelos HTML para Conjunto

Exemplo 1: Relatório Completo de Discriminação do Kit (A4 Vertical)

Layout corporativo para ficha técnica de kit promocional, acompanhamento de estoque e auditoria:

Template HTML (relatorio_kit_discriminado.html):

<!DOCTYPE html>
<html lang="pt-BR">
<head>
    <meta charset="UTF-8">
    <style>
        @page {
            size: A4 portrait;
            margin: 12mm;
        }
        * {
            box-sizing: border-box;
            font-family: Arial, Helvetica, sans-serif;
            margin: 0;
            padding: 0;
        }
        body { color: #222222; }
        .header-kit {
            border-bottom: 3px solid #0b5394;
            padding-bottom: 12px;
            margin-bottom: 15px;
            display: flex;
            justify-content: space-between;
            align-items: center;
        }
        .titulo-kit { font-size: 20pt; font-weight: bold; color: #0b5394; }
        .subtitulo-kit { font-size: 11pt; color: #666666; margin-top: 4px; }
        .badge-codigo {
            background-color: #0b5394;
            color: #ffffff;
            font-size: 14pt;
            font-weight: bold;
            padding: 8px 14px;
            border-radius: 6px;
        }
        .tabela-produtos {
            width: 100%;
            border-collapse: collapse;
            margin-top: 15px;
        }
        .tabela-produtos th {
            background-color: #f0f4f8;
            color: #0b5394;
            font-size: 11pt;
            text-align: left;
            padding: 10px 8px;
            border-bottom: 2px solid #c9d7e4;
        }
        .tabela-produtos td {
            padding: 9px 8px;
            font-size: 10.5pt;
            border-bottom: 1px solid #e0e0e0;
        }
        .tabela-produtos tr:nth-child(even) { background-color: #fafbfc; }
        .col-qtd { font-weight: bold; text-align: center; width: 15%; }
        .col-ean { font-family: monospace; font-size: 10pt; width: 20%; }
        .col-setor { color: #555555; width: 20%; }
        .resumo-kit {
            margin-top: 25px;
            background-color: #f9f9f9;
            border-left: 4px solid #0b5394;
            padding: 12px 15px;
            font-size: 11pt;
            display: flex;
            justify-content: space-between;
        }
    </style>
</head>
<body>
    <div class="header-kit">
        <div>
            <div class="titulo-kit">DISCRIMINAÇÃO DO CONJUNTO / KIT</div>
            <div class="subtitulo-kit">Loja: ${LOJA} (ID: ${ID_LOJA}) | Emissão: ${DTH_ATUAL}</div>
        </div>
        <div class="badge-codigo">#${CODIGO_CONJUNTO}</div>
    </div>

    <table class="tabela-produtos">
        <thead>
            <tr>
                <th style="width: 45%;">Descrição do Produto</th>
                <th class="col-qtd">Qtd no Kit</th>
                <th class="col-ean">Cód. Barras</th>
                <th class="col-setor">Setor / Categoria</th>
            </tr>
        </thead>
        <tbody>
            <!-- Iteração dinâmica pelas linhas alimentadas em reportCollection -->
            <tr th:each="item : ${reportCollection}">
                <td th:text="${item.FIELD_PRODUTO}">PICANHA BOVINA RESFRIADA VAC</td>
                <td class="col-qtd" th:text="${item.FIELD_QTD}">1.500 KG</td>
                <td class="col-ean" th:text="${item.FIELD_CODIGO_BARRAS}">7891234567895</td>
                <td class="col-setor" th:text="${item.FIELD_SETOR}">AÇOUGUE &amp; CARNES</td>
            </tr>
        </tbody>
    </table>

    <div class="resumo-kit">
        <span><strong>Total de Itens Distintos:</strong> ${TOTAL_PRODUTOS_CONJUNTO} itens</span>
        <span><strong>Limite Cadastral:</strong> ${LIMITE_PRODUTOS_CONJUNTO} SKUs</span>
    </div>
</body>
</html>

Protótipo visual do relatório impresso:

+===============================================================================+
| DISCRIMINAÇÃO DO CONJUNTO / KIT                      [ #KIT-CHURRASCO-01 ]   |
| Loja: HIPERMERCADO CENTRAL (ID: 101) | Emissão: 24/08/2026 18:30:00           |
+-------------------------------------------------------------------------------+
| Descrição do Produto             | Qtd no Kit | Cód. Barras   | Setor / Categ |
|----------------------------------+------------+---------------+---------------|
| PICANHA BOVINA RESFRIADA VAC     |  1.500 KG  | 7891234567895 | AÇOUGUE       |
| LINGUIÇA TOSCANA SUÍNA 1KG       |    2 UN    | 7899876543210 | EMBUTIDOS     |
| CARVÃO VEGETAL ESPECIAL 3KG      |    1 UN    | 7895554443332 | UTILIDADES    |
| SAL GROSSO CHURRASCO 1KG         |    1 UN    | 7891112223334 | MERCEARIA     |
+-------------------------------------------------------------------------------+
| Total de Itens Distintos: 4 itens                Limite Cadastral: 20 SKUs    |
+===============================================================================+

Exemplo 2: Folha de Separação e Montagem de Cesta Básica (Checklist)

Modelo com caixas de conferência (checkbox) para operadores de depósito e logística realizarem a montagem física dos conjuntos:

Template HTML (checklist_montagem_cesta.html):

<!DOCTYPE html>
<html lang="pt-BR">
<head>
    <meta charset="UTF-8">
    <style>
        @page {
            size: A4 portrait;
            margin: 10mm;
        }
        * {
            box-sizing: border-box;
            font-family: Arial, sans-serif;
            margin: 0;
            padding: 0;
        }
        .header {
            border: 2px solid #333333;
            padding: 10px;
            margin-bottom: 15px;
            display: flex;
            justify-content: space-between;
        }
        .titulo { font-size: 16pt; font-weight: bold; }
        .meta { font-size: 10pt; color: #555555; margin-top: 4px; }
        .tabela-checklist {
            width: 100%;
            border-collapse: collapse;
        }
        .tabela-checklist th, .tabela-checklist td {
            border: 1px solid #666666;
            padding: 8px;
            font-size: 10pt;
        }
        .tabela-checklist th {
            background-color: #eeeeee;
            text-align: left;
        }
        .col-check { width: 8%; text-align: center; }
        .box-check {
            width: 18px;
            height: 18px;
            border: 2px solid #333333;
            display: inline-block;
        }
        .footer-conferencia {
            margin-top: 20px;
            display: flex;
            justify-content: space-between;
            padding-top: 15px;
            border-top: 1px dashed #666666;
            font-size: 10pt;
        }
    </style>
</head>
<body>
    <div class="header">
        <div>
            <div class="titulo">ORDEM DE MONTAGEM E CONFERÊNCIA DE CONJUNTO</div>
            <div class="meta">Conjunto: <strong>${CODIGO_CONJUNTO}</strong> | Loja: ${LOJA}</div>
        </div>
        <div style="text-align: right;">
            <div class="meta">Data: ${DT_ATUAL}</div>
            <div class="meta">Total Itens: ${TOTAL_PRODUTOS_CONJUNTO}</div>
        </div>
    </div>

    <table class="tabela-checklist">
        <thead>
            <tr>
                <th class="col-check">Conf.</th>
                <th style="width: 50%;">Item / Descrição</th>
                <th style="width: 15%;">Quantidade</th>
                <th style="width: 27%;">Código de Barras</th>
            </tr>
        </thead>
        <tbody>
            <!-- Iteração dinâmica pelas linhas do conjunto -->
            <tr th:each="item : ${reportCollection}">
                <td class="col-check"><div class="box-check"></div></td>
                <td th:text="${item.FIELD_PRODUTO}">ARROZ TIPO 1 PACOTE 5KG</td>
                <td th:text="${item.FIELD_QTD}">2 UN</td>
                <td th:text="${item.FIELD_CODIGO_BARRAS}">7891000111222</td>
            </tr>
        </tbody>
    </table>

    <div class="footer-conferencia">
        <div>Operador Responsável: ___________________________</div>
        <div>Visto Conferente: ___________________________</div>
    </div>
</body>
</html>

Protótipo visual da folha de montagem:

+===============================================================================+
| ORDEM DE MONTAGEM E CONFERÊNCIA DE CONJUNTO           Data: 24/08/2026        |
| Conjunto: KIT-CESTA-BASICA | Loja: HIPERMERCADO       Total Itens: 4          |
+-------------------------------------------------------------------------------+
| Conf. | Item / Descrição                   | Quantidade   | Código de Barras  |
|-------+------------------------------------+--------------+-------------------|
| [   ] | ARROZ TIPO 1 PACOTE 5KG            | 2 UN         | 7891000111222     |
| [   ] | FEIJÃO CARIOCA 1KG                 | 3 UN         | 7892000222333     |
| [   ] | ÓLEO DE SOJA REFINADO 900ML        | 2 UN         | 7893000333444     |
| [   ] | AÇÚCAR REFINADO 1KG                | 2 UN         | 7894000444555     |
+-------------------------------------------------------------------------------+
| Operador Responsável: _________________  Visto Conferente: _________________  |
+===============================================================================+