O período do estoque de acabado vai até 92 dias.
QuandoMais de 92 dias entre a data inicial e a final (contando as duas).
Recusa e não gera. HTTP 200 com statuscode 400 e a frase indicada.
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.
Planta com banco de indústria (WEB/LEGADO): caixas da indústria. Demais filiais e plantas sem indústria alcançável: saldo do ERP.
Saldo do ERP inconsistente (negativo > 5% do positivo) e ERP sem giro (> 1 t e cobertura > 365 dias) ficam na grade, mas fora dos totais.
O 38F mostra, na data final, quanto há de produto acabado por filial (kg, caixas, produtos), a evolução no período, a cobertura (dias de saída), a idade e o vencimento das caixas das plantas e os produtos parados. Desenho novo, sem legado. A fonte do saldo depende da filial (decisão do usuário, 03/10: "ERP + indústria"), porque o saldo de carne do ERP não fecha nas plantas.
| Visão | Linhas |
|---|---|
| Por filial (padrão): posição na data final | Uma linha por filial: origem, kg, caixas, produtos, valor a preço de venda, cobertura, idade média, vencido, vence em 30 dias, parados. |
| Filial por produto | Filial × produto (carne, miúdos, subprodutos e industrializados — não se limita a carne), com o kg, a idade, o vencimento e o parado. |
| Filial dia a dia | Saldo, entradas e saídas de cada dia do período por filial. |
Indicadores: Kg em estoque (caixas, produtos), Valor a preço de venda (e o kg sem preço), Cobertura (dias; saída média em kg/dia), Idade média (caixas da indústria), acima de 90 dias, Vencido, vencem em 30 dias, Parados (sem saída no período). Gráficos: evolução do estoque (todas as filiais do recorte), cobertura por filial (as 15 com mais estoque; azul = indústria, verde = ERP; o clique escolhe a filial), idade do estoque das plantas (Até 30, 31-60, 61-90, 91-180, Mais de 180 dias, pela data de produção da caixa), grade por filial (com as marcas ERP inconsistente e ERP sem giro) e por produto (com filtro "só os parados"). Enquanto apura mostra Apurando… (Ns); mostra apurado em e tem Atualizar.
| Campo | Padrão | Efeito |
|---|---|---|
| Período de / até | 30 dias (data final = hoje; inicial = hoje − 29) | Até 92 dias. A posição é a da data final; o período dá a evolução e a saída média (cobertura). Obrigatório. |
| Filial (multi) | Vazio = filiais do usuário com estoque de carne | Filial de CUSTO_KG_FILIAIS_FORA (granjas) é removida, mesmo pedida — com aviso quando foi pedida (04/10/2026). |
| Visão | Por filial | FILIAIS, PRODUTOS ou EVOLUCAO. |
| Paisagem (PDF) | Ligado | — |
| Moeda | (não há) | Valor em moeda local. |
Saída: XLS e PDF (nas três visões) e painel. Barra de filtros salvos por usuário (código 38F).
Quem entra: (1) planta com banco de indústria = filial.sistema_industrial WEB ou LEGADO e host_ind preenchido; (2) qualquer outra filial do alcance com item de carne (faturamento_venda_produtos.tipo_produto = '1', não excluído) nos 180 dias até a data final em nota de natureza venda* de saída (a mesma do 384) ou transf_saida — o CD que só abastece lojas fica (decisão do usuário, 04/10/2026). Tipo de faturamento sem natureza cadastrada (tipo_natop vazio) também conta: a base que não classificou os tipos (Paraguai) não perde as lojas por falta de cadastro. Fora: as filiais de CUSTO_KG_FILIAIS_FORA e os produtos de COMPARATIVO_PLANTAS_PRODUTOS_INTERMEDIARIOS. As filiais são lidas três por vez (o pool do ERP é 3).
| Fonte | Quem | Como lê |
|---|---|---|
| INDÚSTRIA (LEGADO) | Plantas LEGADO (Iporã, Grão Pará) | ind_caixaproducao + ind_caixamovimentacao: cada caixa vale +1 na entrada (INGRESO_PRODUCCION, RECIBIMIENTO, DEVOLUCION) e −1 nas demais, fora EMBARQUE_ANULADO (o ramo padrão do 3233); só caixa não cancelada e produzida nos últimos 2 anos (índice de dataproducao: 12 s em vez de 80 s; 68.117 de 68.118 caixas em Iporã). O produto da indústria vira o do ERP pelo produto.idindustria. Saída = movimento EMBARQUE; produção = INGRESO_PRODUCCION. |
| INDÚSTRIA (WEB) | Plantas WEB (Tarauacá, Nova Londrina, Maringá, Colorado quando alcançável) | estoque_movimentacao (peso_liquido com sinal) somado por caixa (estoque), saldo até a data final; idade pela data_producao (senão data); vencimento pela data_vencimento; só caixas dos últimos 2 anos. Saída = EMBARQUE_*. Matéria-prima fica fora: caixa que teve ABATE, RECEBIMENTO_COM_OSSO, TRANSFERENCIA_PRODUCAO_SAIDA, CANCELAMENTO_TRANSFERENCIA_PRODUCAO ou QUARTEIO_ENTRADA sai do saldo e do movimento diário (o charque produz, transfere de volta e produz de novo). RECEBIMENTO_INDUSTRIALIZADO (produto pronto recebido, Maringá 17 t) é acabado. |
| ERP | Demais filiais (CDs, lojas) e plantas cuja indústria não responde | O saldo diário de carne do ERP pela porta faturamento.estoquediario.SaldoDiario: a foto (estoque_saldo_diario) quando cobre todos os dias do período, senão o cálculo na hora (sem gravar). Sem idade (o ERP não guarda a data de produção por caixa). Planta cuja indústria não responde: aviso Indústria de N - nome fora do alcance (causa): vai pelo saldo do ERP. |
Banco de indústria compartilhado (Colorado 10, 74, 75, 76): filtra pela filial gravada na indústria (estoque.idfilial / cj.idfilial), só quando há outra filial com o mesmo host_ind + database_ind.
Caixa com saldo negativo (embarcada duas vezes) não abate o estoque: vai para "kg negativo" (a filial só vira inconsistente pelo critério do ERP).
Evolução: saldo final − líquido dos dias seguintes (conferido: nenhum dia negativo nas cinco plantas).
| Número | Cálculo |
|---|---|
| Valor a preço de venda | kg × preço médio de venda do produto nos 90 dias até a data final (faturamento_venda, natureza venda* de saída, itens tipo_produto='1', sem as duas chaves DEMONSTRATIVO_*, em todas as filiais do usuário). Sem venda, sem preço (o kg fica em "kg sem preço"). |
| Cobertura (dias) | kg em estoque ÷ saída média por dia do período (saída = embarques; no ERP, a saída do saldo diário). |
| Idade média | Média ponderada pelo kg da idade da caixa (data final − produção); faixas: até 30, 31–60, 61–90, 91–180, mais de 180. |
| Vencido / vence em 30 dias | Kg com vencimento < data final / com data final ≤ vencimento < data final + 31 dias. |
| Parado | Produto com estoque e sem saída no período. |
| ERP inconsistente | Filial ERP cujo saldo negativo passa de 5% do positivo e de 100 kg: fora dos totais, com aviso Saldo de carne do ERP inconsistente (saldo negativo acima de 5% do positivo), fora dos totais: <filiais>. |
| ERP sem giro | Filial ERP com mais de 1 t e cobertura acima de 365 dias (ou sem nenhuma saída): fora dos totais, com aviso Estoque do ERP sem giro (cobertura acima de 365 dias ou sem saída no período), fora dos totais: <filiais>. |
Cache: a apuração (~75 s no central; a primeira pode passar de meio minuto) fica guardada 15 min por banco + filiais permitidas do usuário + filiais pedidas + período; Atualizar refaz. Outro usuário com as mesmas filiais permitidas reaproveita.
Não há apuração parcial: filial que falha vira aviso Falha ao apurar N - nome (fica fora): <causa>.
O 38F só lê. Sem regra de acesso nomeada: alcance pelas filiais do usuário.
O período do estoque de acabado vai até 92 dias.
QuandoMais de 92 dias entre a data inicial e a final (contando as duas).
A filial N não está entre as filiais do usuário.
TambémInforme a data inicial., A data final não pode ser anterior à inicial. e Visão desconhecida: <valor> (FILIAIS, PRODUTOS ou EVOLUCAO). (só por chamada direta).
Não foram encontrados dados nessas condições.
QuandoNenhuma filial com estoque ou saída no recorte. O painel mostra Nenhuma filial com estoque de carne no recorte.
Indústria de N - nome fora do alcance (<causa>): vai pelo saldo do ERP.
QuemDesta máquina: Colorado (10), Cacoal, Venceslau, 74, 75 e 76. A planta passa a ser "ERP" — e o ERP das plantas não fecha (Iporã +1,9 mi / −13,7 mi kg; Grão Pará +0,27 / −1,9 mi; Maringá +0,6 / −1,9 mi; São Gabriel −83 mi; filial 64 −132 mi). Vai provavelmente cair em "inconsistente".
ServidorNo servidor de produção as indústrias respondem; o teste desta máquina não prova o comportamento de produção.
Saldo de carne do ERP inconsistente / Estoque do ERP sem giro.
Ibiúnaset/2026: 7,0 mi kg saindo 21 kg/dia (75% do total, cobertura de 334 mil dias): sem giro. São José: 289 t para 534 kg/dia. Provável saldo antigo nunca baixado (Ibiúna, São José, Aurora, Cambé).
EfeitoA filial aparece na grade com a marca e não soma nos indicadores nem nos gráficos de totais.
Nova Londrina acumula estoque.
EfeitoEm set/2026: 20.936 kg, 487 caixas, saída de 20 kg/dia, cobertura de 1.047 dias, idade média de 33,9 dias. Embarca pouco (600 kg no mês): a saída do charque deve ir por outro caminho (venda pelo ERP de outra filial?) — a conferir.
Produto parado muito grande.
EfeitoTripa suína salgada MY PORK (100526): 100,7 t paradas em Iporã, idade média de 278 dias e 33,8 t vencidas (achado na prévia).
"Saída" difere por fonte.
EfeitoIndústria: embarques (EMBARQUE/EMBARQUE_*). ERP: saída do saldo diário (inclui venda, transferência, consumo). A cobertura de uma planta e a de um CD não são comparáveis de forma estrita.
O primeiro carregamento é lento.
EfeitoAté ~75 s (o saldo do ERP percorre todo o movimento da filial). A homologação chegou a cair por timeout de conexão três vezes nas medições de 03/10.
| Origem | Efeito |
|---|---|
CUSTO_KG_FILIAIS_FORA | Filiais fora (granjas e desativadas). BMG: 12,14,16,17,27,51,52,56,64. Vale aqui e no 384. |
COMPARATIVO_PLANTAS_PRODUTOS_INTERMEDIARIOS | Produtos fora do estoque (combos de matéria-prima). Vale também no 383 e no 38A. |
COMPARATIVO_PLANTAS_GRUPOS_MIUDOS / _SUBPRODUTOS / _INDUSTRIALIZADOS | Categoria do produto na grade por produto (carne/miúdos/subprodutos/industrializados). |
DEMONSTRATIVO_FATURAMENTO_EXCLUIR_TIPOS e _GERENCIAL | Tipos de venda fora do preço médio. |
filial.sistema_industrial, host_ind, database_ind | Decidem se a filial é planta (WEB/LEGADO com banco externo) e qual indústria ler. |
ROTINA_ESTOQUE_DIARIO e estoque_saldo_diario | Alimentam a foto do saldo do ERP (fonte das filiais não-planta). Ver o documento da rotina (2392). |
Permissão. Item de menu sem idOpcao: qualquer usuário logado abre; alcance pelas filiais do usuário. O 38F tem controller próprio (RelatorioEstoqueAcabadoController): POST /lancamento/relatorios/estoqueAcabado (XLS/PDF) e .../estoqueAcabado/dados (atualizar=true refaz).
Leitura da indústria: industria.BancoIndustria (somente leitura, por filial). Sem conexão, a filial cai no ERP com aviso.
Banco: central (BMG). Os números abaixo são de set/2026 (apuração de 03/10/2026, 01/09 a 30/09). As plantas só se conferem a partir de uma máquina que alcance os bancos de indústria (scratchpad/ConsultaIndustria.java faz um SELECT no banco da indústria de uma filial).
| # | Passo | Esperado | Como conferir |
|---|---|---|---|
| 1 | Por filial, 01/09–30/09/2026, todas as filiais. | Iporã (LEGADO): 1.663.822 kg, 67.635 caixas, saída 78.950 kg/dia, cobertura 21,1, idade 40,7, vencido 35.850 kg. Grão Pará (LEGADO): 236.596 kg, 13.656 caixas, saída 16.727, cobertura 14,1, idade 16,7, vencido 0. Tarauacá (WEB): 26.821 kg, 517 caixas, 2.627, 10,2, 48,5, 9.000. Nova Londrina (WEB): 20.936 kg, 487 caixas, 20, 1.047, 33,9, 378. Maringá (WEB): 13.127 kg, 768 caixas, 3.176, 4,1, 57,6, 74. | Banco da indústria da filial: LEGADO soma ind_caixaproducao/ind_caixamovimentacao; WEB soma estoque_movimentacao por estoque. |
| 2 | Idade das plantas (Iporã). | 66% do kg com até 30 dias; 6% acima de 180. | Faixas pela dataproducao da caixa. |
| 3 | Visão por produto, Iporã, só parados. | Tripa suína salgada MY PORK (100526) com ≈ 100,7 t, idade média ≈ 278 dias, ≈ 33,8 t vencidas. | Caixas do produto na indústria com datavencimento < data final. |
| 4 | Filial ERP com saldo negativo grande (ex.: São Gabriel, 64). | Marcada ERP inconsistente e fora dos totais; aviso nomeando a filial. | Soma negativa vs positiva do saldo na foto:-- saldo de carne do ERP (a foto diária) na data final, por filial e produto — filiais que NÃO são planta SELECT idfilial, idproduto, data, peso, entradas, saidas FROM estoque_saldo_diario WHERE idfilial = <filial> AND data = '2026-09-30' -- (colunas conforme EstoqueSaldoDiarioRepository; a foto cobre o período, senão o cálculo roda na hora sem gravar) |
| 5 | Ibiúna, São José. | ERP sem giro: kg > 1 t com cobertura > 365 dias (Ibiúna: 7,0 mi kg a 21 kg/dia). | kg ÷ saída média por dia do período. |
| 6 | Filial listada em CUSTO_KG_FILIAIS_FORA marcada no filtro. | Não aparece; aviso "fora do estoque de acabado (… CUSTO_KG_FILIAIS_FORA)". | — |
| 7 | Quem entra além das plantas. | Só filiais com item de venda nos 180 dias até a data final (inclui transferência, pois não filtra tipo). | -- quem entra além das plantas: filial com algum item de venda nos 180 dias até a data final SELECT DISTINCT fv.idfilial FROM faturamento_venda fv JOIN faturamento_venda_produtos fvp ON fvp.idfaturamento_venda = fv.id AND fvp.tipo_produto = '1' WHERE IFNULL(fv.excluido,'F') <> 'T' AND fv.data_emissao >= '2026-04-03' AND fv.data_emissao < '2026-10-01' |
| 8 | Planta com a indústria fora do alcance (Colorado). | Aviso Indústria de 10 - ... fora do alcance (...): vai pelo saldo do ERP.; a filial sai pelo ERP. | Teste de conexão ao host_ind da filial. |
| 9 | Período de 93 dias. | O período do estoque de acabado vai até 92 dias. | — |
| 10 | Mesmo filtro duas vezes seguidas; depois Atualizar. | A segunda vem na hora (cache de 15 min, "apurado em"); Atualizar refaz (~75 s). | Hora do apurado em. |
| 11 | Valor a preço de venda de um produto. | kg × preço médio de venda dos 90 dias até a data final (todas as filiais do usuário). | -- preço médio de venda do produto nos 90 dias até a data final (filiais do usuário, visão gerencial) SELECT fvp.idproduto, SUM(fvp.valor_total * IF(fv.idmoeda = f.idmoeda_local OR IFNULL(fv.valor_cambio,0) = 0, 1, fv.valor_cambio)) / SUM(fvp.peso_liquido) AS preco_kg FROM faturamento_venda fv JOIN filial f ON f.id_filial = fv.idfilial JOIN tipo_faturamento t ON t.id = fv.idtipo_faturamento JOIN faturamento_venda_produtos fvp ON fvp.idfaturamento_venda = fv.id AND fvp.tipo_produto = '1' AND IFNULL(fvp.excluido,'F') <> 'T' WHERE IFNULL(fv.excluido,'F') <> 'T' AND t.tipo_natop LIKE 'venda%' AND t.entrada_saida = 'S' AND fv.idtipo_faturamento NOT IN (1121,11195,11196,11203) AND fv.data_emissao >= '2026-07-03' AND fv.data_emissao < '2026-10-01' AND fvp.idproduto = <produto> GROUP BY fvp.idproduto |
| 12 | Visão dia a dia de uma planta. | Saldo do último dia = kg da posição; nenhum dia negativo. | — |
| 13 | Usuário com poucas filiais. | Preço de venda (e, portanto, valor) diferente do de um usuário com todas as filiais. | A SQL de preço com fv.idfilial IN (<filiais do usuário>). |
Pendências: teste de tela (o backend precisa reiniciar); por que o saldo de carne do ERP das plantas fica negativo (o usuário pediu para investigar depois do painel; o cálculo é o mesmo da foto diária e do custo médio); Nova Londrina embarcar pouco (como a saída do charque é registrada); saldo do ERP parado em Ibiúna/São José/Aurora/Cambé; indústrias fora do alcance desta máquina (Colorado, Cacoal, Venceslau, 74, 75, 76).
Fora do escopo: idade e vencimento das filiais ERP (o ERP não guarda a data de produção por caixa); acuracidade do saldo.
1. "Venda de carne" é qualquer venda. A regra "só filiais com venda de carne nos 180 dias" (histórico e javadoc) é, no SQL, qualquer faturamento_venda_produtos.tipo_produto = '1' de qualquer tipo de faturamento (inclui transferências e remessas): uma filial que só vendeu insumo entra e fica sem estoque (sai do resultado se não tem saldo nem saída). Em 04/10/2026 passou a ignorar o item excluído (fvp.excluido). Corrigido em 04/10/2026 (decisão do usuário): só natureza venda* de saída ou transf_saida (tipo sem natureza continua contando). No central (180 dias até 04/10/2026) saem Cambé 2 e Jandira 59 (só cancelamento de compra); Venceslau 50 (só outras saídas) continua por ser planta com banco de indústria; Margarida 61, Fab. de Ração 58, Granja Acácia 65, Aurora 62 e Rio de Janeiro 15 continuam (transferem carne) — as granjas e a fábrica de ração saem pela CUSTO_KG_FILIAIS_FORA, configuração do usuário. No fjfrigo_concepcion nada muda (os tipos das lojas não têm natureza).
2. Estoque não é só carne. A grade por produto traz também miúdos, subprodutos e industrializados (a categoria só rotula); o histórico fala em "estoque de carne".
3. Preço de venda pelo alcance do usuário. Como no 38A, precificar usa filiaisDoUsuario.permitidas; o mesmo recorte dá valor diferente por usuário.
4. Cache sem o usuário na chave. A chave é banco + filiais pedidas + período: dois usuários que pedem as mesmas filiais mas têm alcances diferentes compartilham a apuração (e o preço de venda) do primeiro que abriu, por até 15 min. Corrigido em 04/10/2026: a chave leva também as filiais permitidas do usuário.
5. Filial fora silenciosa. Como no 384, CUSTO_KG_FILIAIS_FORA remove a filial pedida sem aviso. Corrigido em 04/10/2026: filial pedida e tirada vira aviso na tela.
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.