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):
- O RuB carrega o registro do conjunto e define as variáveis de cabeçalho (
CODIGO_CONJUNTO,LOJA,TOTAL_PRODUTOS_CONJUNTO, etc.). - O sistema itera todos os itens vinculados ao conjunto (
DB.iterateConjuntoProduto) e alimenta a coleção de linhas (reportCollection). - Para cada produto, os campos são calculados conforme a sua natureza (produtos unitários ou pesáveis com peso variável).
- 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:
| Campo | Descrição | Regra de Formatação | Exemplo de valor |
|---|---|---|---|
FIELD_PRODUTO | Descrição completa do produto (label). | p.getLabel() | PICANHA BOVINA RESFRIADA VAC |
FIELD_QTD | Quantidade 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_BARRAS | Código de barras EAN-13 da menor embalagem. | Preenchido para produtos não pesáveis (emb.getFirstCodigo(13)). | 7891234567895 |
FIELD_SETOR | Nome do setor mercadológico calculado do produto. | p.getSetorCalculado().getLabel() | AÇOUGUE & AVES |
FIELD_CLASSE_RAIZ | Nome da categoria / classe raiz do produto. | p.getClasseProdutoRaiz().getLabel() (ou "Sem classe"). | CARNES NOBRES |
Variáveis de cabeçalho disponíveis
| Variável | Descrição | Exemplo 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 & 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: _________________ |
+===============================================================================+