FJFrigo · Relatórios · menu 3-8 Indicadores — 383

Comparativo de Plantas

Abate, produção, consumo e compra do almoxarifado e custo formado por planta, ou de uma planta mês a mês — e a foto diária da produção que alimenta o 384, o 38A e o 38F.

Tela: Comparativo de Plantas (383)Origem: desenho novo, sem legadoSaída: XLS, PDF e painel em telaGrava: só a foto da produção (producao_industria)

Bloqueia

Recusa e não gera. HTTP 200 com statuscode 400 e a frase indicada.

Aviso

Comportamento que surpreende sem ser erro — origem da maioria dos chamados de "o número não bate". Parte sai como painel de avisos na tela.

A foto é a base

A produção vem de producao_industria, refeita pela rotina do estoque diário ou pelo botão da janela. Sem foto, a produção sai zerada.

Moeda local, sem conversão

O 383 não converte moeda; o valor do gado não entra aqui.

A

O que a tela mostra

Relatório entre plantas, relatório da unidade e painel em tela

O 383 junta, por planta, quatro fontes que antes ficavam em telas diferentes: o abate (compra de gado), a produção (uma foto diária tirada da indústria), o consumo e a compra do almoxarifado e o custo formado (folha, consumo, frete dos animais e refeitório). Desenho novo, sem legado. Tudo em moeda local; o valor do gado não entra (está no 387).

VisãoO que saiLinhas
Entre plantas (padrão)Os indicadores da tabela abaixo para o período inteiro.Uma linha por planta, agrupada por espécie (BOVINO, SUÍNO, BOVINO/SUÍNO, CICLO 2), com Subtotal por espécie (se há mais de uma) e TOTAL GERAL. Só entra planta que abateu ou produziu no período.
Unidade mês a mêsOs mesmos indicadores, uma planta.Um mês por linha + TOTAL. Com a opção "Consumo × compra por grupo" acrescenta a seção Consumo × compra do almoxarifado por grupo (consumo, compra insumos, outras, transf. entrada, consumo − compra insumos).

Painel "Ver em tela"

PainelComparativoPlantas.vue. Sempre na visão entre plantas (a visão Unidade do filtro é ignorada; só vale o filtro de filial). Seletor Bovino | Suíno | Todas | Ciclo 2 (em Todas somem as métricas por cabeça), indicadores contra o período anterior de mesmo tamanho (cabeças abatidas, kg carcaça por cabeça, rendimento de carne e de miúdos, folha por cabeça, consumo por cabeça, custo por kg produzido, consumo ÷ entradas), ranking pela métrica escolhida com a média, mês a mês (Almoxarifado | Folha), grade com barras e, ao clicar numa planta, o cartão Consumo × compra por grupo.

Cartão "Foto da produção" (na janela do filtro)

Mostra a última carga manual desde que o servidor subiu (andamento por filial e avisos). Refazer a foto da produção do período dispara a carga em segundo plano para a filial da sessão; a caixa todas as plantas só aparece para master/suporte. A rotina do estoque diário (a cada 2 h, ROTINA_ESTOQUE_DIARIO = 1) refaz sozinha os últimos 30 dias.

B

Filtros e opções

Com o valor que a tela abre
CampoPadrãoEfeito
Período de / atéDia 1 do mês corrente até hojeObrigatório. O abate corta por data_entrada; consumo por data_emissao; compra por data_entrada; foto por data; folha por data_emissao do título. Todos em faixa meio-aberta (exceto a foto, que é data <= até, dia puro).
VisãoEntre plantasPLANTAS ou UNIDADE.
FilialVazioPlantas: vazio = todas as filiais do usuário (entram as que abateram ou produziram). Unidade: uma só; vazio usa a filial da sessão.
Consumo × compra por grupoLigadoSó na visão unidade.
Paisagem (PDF)Ligado—
Moeda(não há)Sempre moeda local, sem conversão.

Saída: XLS e PDF (o painel é o Ver em tela). Barra de filtros salvos por usuário (código 383).

C

De onde vem cada número

Tabelas, colunas e filtros

Regras comuns: documento não excluído (COALESCE(excluido,'F') <> 'T', também nos itens); só as filiais do alcance do usuário; listas de tipos e centros vêm da Config. Globais (seção E). Os "por cabeça" ficam em branco no total misto boi + suíno.

Indicador (coluna)FonteRegra
Cabeças, Kg vivo, Kg carcaça, Kg carc./cab.faturamento_compra_gado × faturamento_compra_gado_produtos (quantidade, peso_vivo, peso_morto)Abate = compra de gado, todos os tipos de faturamento, pela data_entrada. Espécie por produto.tipoanimal (SUINO/LEITAO = suíno; o resto bovino). No central o bovino vem com peso_vivo = peso_morto.
Produção kg, Caixas, Carne kgproducao_industria (tipo = 'PRODUCAO', peso_liquido, quantidade)Fora os produtos da chave COMPARATIVO_PLANTAS_PRODUTOS_INTERMEDIARIOS (combos de matéria-prima). Carne = o que não é miúdo, subproduto nem industrializado (esses três vêm do grupo do produto, produto.idgrupo_produto, pelas chaves _GRUPOS_*).
Rend. carne %, Rend. miúdos %, Subprod. %, Industrializ. %Foto ÷ baseBase = kg carcaça da planta que abateu; para a planta sem abate (ciclo 2) a base é a entrada na produção (tipo = 'TRANSFERENCIA'). Em branco sem produção. Rendimento acima de 100% é sinal de dado (ver seção G).
Kg recebido, Kg entrada produção (ciclo 2)producao_industria (RECEBIMENTO, TRANSFERENCIA)Informação; só a entrada na produção é base do rendimento do ciclo 2. REC_INDUSTRIALIZADO (produto pronto recebido) também fica na foto.
Consumo, Consumo/cab., Consumo/kg prod.almoxarifado_saida × almoxarifado_saida_produto.custo_totalSó os tipos de COMPARATIVO_PLANTAS_TIPOS_CONSUMO (padrão 117), pela data_emissao. Remessas e demais saídas ficam fora. Valor = custo_total × valor_cambio da linha quando a moeda da linha não é a idmoeda_local da filial (como no 385; corrigido em 04/10/2026).
Compra insumos, Outras compras, Transf. entradaalmoxarifado_compra × almoxarifado_compra_produto.valor_total_mlTrês colunas, cada uma com a sua lista de tipos (_TIPOS_COMPRA_INSUMO 116, _COMPRA_OUTRAS 1116, _TRANSF_ENTRADA 1152), pela data_entrada.
Consumo ÷ (insumos + transf.) %Consumo ÷ (insumos + transferência de entrada)Não usa só insumos: Colorado recebe quase tudo por transferência e dava 600%.
Salários, Adiantamento, Encargos, Aluguel func., Serv. industrialização, Folha/cab., Folha/kg prod.financeiro_emissao pelo idcentro_custo (CustoPorCentro)Títulos pela emissão, só tipo_emissao P/R, valor = valor_parcela de pagar − receber, convertido à moeda local da filial (como o DRE gerencial). Folha = salários + adiantamento + encargos + aluguel func. + serviço de industrialização. Centros nas chaves COMPARATIVO_PLANTAS_CC_*.
Frete animaisIdem, centros de _CC_FRETE_ANIMAISConferido contra faturamento_compra_gado_transportadoras.valor_total_frete.
RefeitórioIdem, centros de _CC_REFEITORIO, sem os títulos do almoxarifadoTira os títulos cujo tipo tem tipo_operacao 101/111/131/102/132/112/171/172/501/502/551/552 (o material já está no consumo).
Custo total e Custo/kg prod.Folha + consumo + frete animais + refeitório; ÷ produção kgÉ o "custo formado" que o 384 usa.

A foto (producao_industria). Tabela criada no primeiro uso (scripts/sql/producao_industria.sql): chave (idfilial, data, tipo, idproduto_industria); origem = WEB, LEGADO ou TERCEIRO. WEB lê estoque_movimentacao PRODUCAO (igual ao 2392); LEGADO lê ind_caixaproducao + ind_gracharia, só caixa com ordem de produção (JOIN ind_ordemproducao), e converte produto.idindustria para o produto do ERP; TERCEIRO lê a 115 do ERP (faturamento_lancamentos_manuais). Caixa LEGADO com líquido maior que o bruto usa o bruto.

Banco de indústria compartilhado (Colorado 10, 74, 75, 76 → industria-frigocol): a foto filtra pela filial gravada na indústria, só quando há outra filial com o mesmo host_ind + database_ind; banco de uma filial só não filtra (como o legado). O Importar do 2392 e a rotina passaram a filtrar igual (o legado não filtra e importaria a produção inteira de Colorado em 74, 75 e 76).

Rotina. Mês fechado não muda: o período da rotina começa no dia seguinte a parametros.udf_fat da filial. A carga manual (Refazer a foto) vai até 731 dias.

D

Regras, travas e avisos

O que recusa e o que surpreende

O 383 só lê — a única escrita é a foto da produção (tabela producao_industria), pela rotina ou pelo botão Refazer a foto. Sem regra de acesso nomeada: alcance pelas filiais do usuário.

Bloqueia

Escolha a planta.

QuandoVisão unidade, sem filial no filtro e sem filial na sessão (API).

Todos
Bloqueia

Na visão unidade escolha uma filial só (sem filial, vale a da sessão).

QuemA própria tela, antes de chamar o servidor, com mais de uma filial marcada.

Todos
Bloqueia

A filial N não está entre as filiais do usuário.

Todos
Bloqueia

Informe a data inicial. / A data final não pode ser anterior à inicial.

Todos
Bloqueia

Não foram encontrados dados nessas condições.

QuandoNenhuma planta abateu ou produziu no período (entre plantas) ou nenhum mês tem movimento (unidade).

Todos
Bloqueia

Refazer a foto de todas as plantas: só o master ou o suporte.

TambémSessão sem filial ativa., Informe o período (data inicial até a final)., Período de no máximo 731 dias., Data inválida: <valor>.

Todos
Bloqueia

A foto da produção já está sendo refeita neste banco. Aguarde terminar.

EfeitoUma carga por banco de cada vez; o botão fica desabilitado enquanto roda.

Todos
Aviso

A foto da produção ainda não foi tirada nesta base: a produção sai zerada. Use "Refazer a foto da produção".

EfeitoSem a tabela producao_industria (nasce no primeiro uso) todas as colunas de produção e rendimento saem zeradas; o resto sai normal. No painel: A foto da produção ainda não foi tirada: produção e rendimento saem zerados.

Todos
Aviso

Plantas cujo banco da indústria não responde ficam sem produção.

QuemDesta máquina de desenvolvimento não conectam: Colorado/74/75/76, Cacoal, Juruena e Venceslau. São Gabriel é WEB sem host_ind: não há estoque_movimentacao no ERP. Rodar a carga do servidor. A carga mostra Filial N: <mensagem> por filial que falhou.

Todos
Aviso

Rendimento de carne acima de 100%.

Causas já tratadasCombos de matéria-prima contados duas vezes (Iporã: bins de 150–500 kg, produtos 12000–12006, 12014, 12016 e os "MP": ficam na chave INTERMEDIARIOS) e caixas sem ordem de produção (carne importada etiquetada na entrada).

Ainda possívelCaixa digitada errada na indústria (caixa 10012272531 de 16/04/2026, Grão Pará: líquido 19.344 kg com vírgula — o relatório usa o bruto, mas a caixa precisa ser corrigida).

Todos
Aviso

Planta de ciclo 2 (charque, desossa de carcaça comprada): a base é a entrada na produção.

EfeitoNova Londrina 09/2026: recebeu 26,8 t com osso, mandou 78,6 t para a produção (estoque de antes) e produziu 59 t → carne 10,1 t sobre 78,6 t. Em Tarauacá a transferência (76.098 kg) bate com a carcaça (76.035 kg). Em branco quando a planta não tem TRANSFERENCIA na foto.

Todos
Aviso

Iporã não tem frete de suíno lançado.

MotivoNem título no centro de frete nem transportadora no abate; o preço do suinocultor deve incluir o frete. Custo/kg de Iporã fica sem essa parcela.

Todos
Aviso

Título em centro de custo de outra moeda.

EfeitoConvertido pela moeda da filial (DreGerencialMovimento.FATOR_EMISSAO); o banco do RH (rh_central) não tem dados aqui: não há número de funcionários.

Todos
E

Configuração e permissões

Config. Globais, grupo faturamento

Todas as chaves são texto de ids separados por vírgula, ponto e vírgula ou espaço (system_config.valor_string, varchar(1000) — o script scripts/sql/system_config_valor_string_1000.sql está rodado só no central de homologação; onde não rodou, a Config. Globais limita a 255 caracteres e a lista de intermediários pode não caber). Chave vazia usa o padrão; onde o padrão é vazio, o componente fica zerado.

ChavePadrãoEfeito / BMG
COMPARATIVO_PLANTAS_TIPOS_CONSUMO117Tipos de saída que são consumo. BMG: 117.
COMPARATIVO_PLANTAS_TIPOS_COMPRA_INSUMO116Compra de insumos. A confirmar para a BMG: acrescentar 11211 e 1141.
COMPARATIVO_PLANTAS_TIPOS_COMPRA_OUTRAS1116Outras compras. A confirmar: 1191, 11191 e 1111.
COMPARATIVO_PLANTAS_TIPOS_TRANSF_ENTRADA1152Transferência de entrada. A confirmar: 1155 (transferência de couro).
COMPARATIVO_PLANTAS_GRUPOS_MIUDOS / _SUBPRODUTOS / _INDUSTRIALIZADOSvazioIds de produto_grupo. BMG: miúdos 1263, 1234, 10073, 10155; subprodutos 12312, 10115, 10054; industrializados 1302 (Jerked Beef). Vazio = tudo é carne.
COMPARATIVO_PLANTAS_PRODUTOS_INTERMEDIARIOSvazioIds de produto (não de grupo) fora da produção. BMG: 32 ids, 260 caracteres. Também vale para o 38A e o 38F.
COMPARATIVO_PLANTAS_CC_SALARIOS / _ADIANTAMENTO / _ENCARGOS / _ALUGUEL_FUNC / _SERV_INDUSTRIALIZACAOvazioIds de centro de custo da folha. BMG: salários 9 centros; adiantamento 4; encargos 18 (INSS, FGTS, 13º, férias, rescisões); aluguel func. 10229, 106483, 102343; serviço de industrialização 101722 (Maringá).
COMPARATIVO_PLANTAS_CC_FRETE_ANIMAISvazioBMG: 10245, 10249, 101734, 106490, 101134, 101135.
COMPARATIVO_PLANTAS_CC_REFEITORIOvazioBMG: 101329, 102378, 101720, 101128.
ROTINA_ESTOQUE_DIARIO (+ _USUARIO)0Liga a rotina (a cada 2 h, últimos 30 dias, depois do udf_fat): produção 115, foto da produção, foto do saldo. A produção 115 é gravada com o usuário de ROTINA_ESTOQUE_DIARIO_USUARIO (ou o último que importou naquela filial); sem nenhum, só a foto roda. Ligada no central.
CUSTO_KG_FILIAIS_FORAvazioNão vale no 383 (só no 384, 38F). Citada aqui para não confundir.

Permissão. Item de menu sem idOpcao: qualquer usuário logado abre. O alcance é o das filiais do usuário. Refazer a foto: a filial da sessão é livre; todas as plantas, só master ou suporte (RegraAcessoService.suporteOuMaster). Os endpoints da foto (GET /lancamento/producao-industria/situacao, POST .../fotografar) estão dentro da allowlist /lancamento/* (JWT).

F

Casos de teste sugeridos

Com o resultado esperado e como conferir no banco

Banco: central (BMG). Os números abaixo foram conferidos em 03–04/10/2026; a produção depende de a foto ter sido refeita para o período.

#PassoEsperadoComo conferir
1Entre plantas, 01/03/2026 a 31/03/2026, todas as filiais.Colorado (10): 4.120 cabeças e 978.544,5 kg carcaça, igual ao ABATE do estoque da indústria WEB (8.240 bandas, 978.533 kg). Espécie BOVINO; Iporã e Grão Pará SUÍNO.
SELECT g.idfilial,
       CASE WHEN pr.tipoanimal IN ('SUINO','LEITAO') THEN 'SUINO' ELSE 'BOVINO' END AS especie,
       SUM(gp.quantidade) AS cabecas, SUM(gp.peso_vivo) AS kg_vivo, SUM(gp.peso_morto) AS kg_carcaca
FROM faturamento_compra_gado g
JOIN faturamento_compra_gado_produtos gp ON gp.idfaturamento_compra_gado = g.id
     AND gp.idfilial = g.idfilial AND COALESCE(gp.excluido,'F') <> 'T'
LEFT JOIN produto pr ON pr.id = gp.idproduto
WHERE COALESCE(g.excluido,'F') <> 'T' AND g.idfilial = 10
  AND g.data_entrada >= '2026-03-01' AND g.data_entrada < '2026-04-01'
GROUP BY 1, 2
-- Colorado 03/2026 (04/10/2026): 4.120 cab. e 978.544,5 kg carcaça
2Entre plantas, setembro/2026.Produção kg de Iporã ≤ 2.949.271 (a SQL abaixo inclui os intermediários que o relatório tira); Grão Pará ≈ 525 mil kg.
SELECT idfilial, tipo, ROUND(SUM(peso_liquido)) AS kg, SUM(quantidade) AS caixas, MAX(atualizado_em) AS foto_de
FROM producao_industria
WHERE data >= '2026-09-01' AND data <= '2026-09-30'
GROUP BY idfilial, tipo ORDER BY kg DESC
-- PRODUCAO set/2026 em 04/10: Iporã (5) 2.949.271 kg; Grão Pará (11) 525.190; filial 53: 102.678
-- (o relatório tira os produtos da chave COMPARATIVO_PLANTAS_PRODUTOS_INTERMEDIARIOS: fica menor)
3Mesmo caso, linha de planta sem abate (Nova Londrina).Espécie CICLO 2; rendimentos sobre a entrada na produção (TRANSFERENCIA); Kg carcaça zerado.SELECT tipo, SUM(peso_liquido) FROM producao_industria WHERE idfilial = <planta> AND data BETWEEN ... GROUP BY tipo
4Unidade mês a mês, filial 5, 01/01–30/09/2026, com grupos.Uma linha por mês com movimento, TOTAL, e a seção por grupo do almoxarifado (consumo, insumos, outras, transf.).A soma dos meses = o caso "Entre plantas" de Iporã no mesmo período.
5Unidade com duas filiais marcadas.Tela recusa: Na visão unidade escolha uma filial só ....—
6Frete dos animais, setembro/2026.Frete animais de Grão Pará = 34.500 e Tarauacá = 15.732; Iporã = 0.
SELECT g.idfilial, ROUND(SUM(t.valor_total_frete), 2) AS frete
FROM faturamento_compra_gado g
JOIN faturamento_compra_gado_transportadoras t ON t.idfaturamento_compra_gado = g.id AND t.excluido <> 'T'
WHERE COALESCE(g.excluido,'F') <> 'T' AND g.data_entrada >= '2026-09-01' AND g.data_entrada < '2026-10-01'
GROUP BY g.idfilial
-- set/2026: Tarauacá 15.732 e Grão Pará (11) 34.500 (iguais ao título do centro de custo)
7Folha de uma planta num mês.Salários = soma dos centros da chave para a filial (pagar − receber), na moeda local.
SELECT fe.idfilial, ROUND(SUM(IF(fe.tipo_emissao = 'P', 1, -1) * fe.valor_parcela), 2) AS valor   -- sem câmbio: só para moeda local
FROM financeiro_emissao fe
WHERE COALESCE(fe.excluido,'F') <> 'T' AND fe.tipo_emissao IN ('P','R')
  AND fe.idcentro_custo IN (/* ids da chave COMPARATIVO_PLANTAS_CC_SALARIOS */)
  AND fe.data_emissao >= '2026-09-01' AND fe.data_emissao < '2026-10-01'
GROUP BY fe.idfilial
8Mudar COMPARATIVO_PLANTAS_TIPOS_CONSUMO de 117 para 117,102 e regerar.Consumo e Custo total aumentam; produção e abate não mudam.SELECT id, descricao FROM tipo_faturamento WHERE id IN (117,102)
9Banco sem a tabela producao_industria (ou antes da 1ª foto).Aviso A foto da produção ainda não foi tirada...; produção zerada, resto normal.SELECT COUNT(*) FROM information_schema.tables WHERE table_schema = DATABASE() AND table_name = 'producao_industria'
10Refazer a foto: período de 800 dias; depois duas vezes seguidas; depois "todas" com usuário comum.Período de no máximo 731 dias.; A foto da produção já está sendo refeita...; Refazer a foto de todas as plantas: só o master ou o suporte. (a caixa nem aparece para o comum).—
11Banco de indústria compartilhado: refazer a foto de Colorado (10) e de 74/75/76.Cada filial só recebe a produção gravada com o seu idfilial na indústria; 74/75/76 não somam a produção de Colorado.SELECT idfilial, SUM(peso_liquido) FROM producao_industria WHERE idfilial IN (10,74,75,76) AND tipo='PRODUCAO' GROUP BY 1
12"Ver em tela" com Visão = Unidade no filtro.Abre o painel entre plantas (a visão é ignorada), com os filtros de filial.—
13Painel: alternar Bovino | Suíno | Todas | Ciclo 2; clicar numa planta.Em Todas somem as métricas por cabeça; o clique mostra o cartão Consumo × compra por grupo (maiores consumos; "+ N grupo(s) menores" só no XLS).Comparar com a seção por grupo da visão Unidade.
G

Limitações, pendências e achados

O que ainda não existe ou merece atenção

Pendências: teste de tela (o backend precisa reiniciar); carga da foto das plantas cujo banco não responde desta máquina (Colorado/74-76, Cacoal, Juruena, Venceslau) — rodar do servidor; confirmar com o usuário os tipos de compra da BMG nas chaves _TIPOS_COMPRA_*; tipo TRANSFERENCIA (transferência para produção) quando a tela de transferência entrar; valor do gado (hoje só no 387/384).

Plantas desativadas no 384 (Juruena 12, Vila Bela 14, Rolim 16, Distriboi 17, RioBeef 27, mais 51, 52, 56, 64) entram no 383 normalmente; a lista CUSTO_KG_FILIAIS_FORA não age aqui.

Achados ao ler o código (não corrigidos)

1. Consumo sem câmbio. SUM(custo_total) da saída não aplica o câmbio da linha (o 385 aplica). No Paraguai (saída em U$/EUR/R$) o consumo e o custo formado saem em valor errado; hoje o 383 só é usado na BMG (moeda única). Corrigido em 04/10/2026: a soma aplica o câmbio da linha (fjfrigo_concepcion, 07/2026, filial 2: 656,7 mi → 1.702,2 mi Gs; filial 8: 0,8 mi → 101,3 mi).

2. Mesma seleção de intermediários em três relatórios. Mexer em COMPARATIVO_PLANTAS_PRODUTOS_INTERMEDIARIOS muda o 383, o 38A e o 38F ao mesmo tempo.

3. Valor atribuído a = e não a +=. Em apurar, consumo, compras, folha e entrada na produção são atribuídos (=) por chave: só é correto porque cada consulta já agrupa pela mesma chave. Alterar o agrupamento sem rever isso perde valores.

4. Documentação do histórico divergente do código. O histórico (385) ainda diz que título em outra moeda soma sem converter; o código atual converte pela moeda da filial (CustoPorCentro).

5. Foto é do momento em que foi tirada. Produção corrigida depois na indústria só entra com nova foto (a rotina refaz 30 dias, mas não mês fechado: udf_fat).

H

Como o erro chega na tela

Para o QA reproduzir e reportar

Toda resposta sai com HTTP 200; quem diz o que aconteceu é o statuscode no corpo — 400 para as recusas deste documento.

O arquivo é pedido como download, mas a recusa chega como mensagem: a tela mostra a frase no lugar do arquivo. Enquanto gera, o botão mostra o contador Gerando… (Ns).

Avisos (cotação faltando, foto sem produção, estorno sem nota...) não interrompem: vêm no cabeçalho X-Aviso-Sistema e a tela mostra o painel de avisos. Teste sempre olhando o painel, não só o arquivo.

Ao abrir chamado, copie o código de ocorrência de 8 caracteres dos erros inesperados. Erro de tela vai para o log em POST /cadastro/erros-front.

Nenhuma regra bate com essa busca. Tente um trecho menor da mensagem, ou limpe os filtros.