FJFrigo · Lançamentos · Faturamento/Exportações › Produção › 2394

Conferência de Caixas

Confere, caixa a caixa, o que o Embarque de Entrada (2324) recebeu numa ordem de compra. Cada leitura só marca a caixa como conferida. Cada regra traz a mensagem exata, quando dispara e o confronto com o sistema antigo.

Grava: estoque_item_movimentacao.conferido Antes: Embarque de Entrada (2324) Programa antigo: menu2394.prg

Bloqueia

Não grava. statuscode 400 com a frase abaixo, que a tela mostra como está.

Aviso

Passa, mas com um comportamento que surpreende quem está conferindo — ou é conferido só na tela.

Português ou espanhol

O servidor devolve a frase do sistema antigo, e várias eram em espanhol lá. Não é tradução faltando.

A

Ao listar

A grade de ordens
Bloqueia

A data final e anterior a inicial.

QuandoPeríodo invertido.

Todos
Aviso

(sem mensagem) — a grade só mostra a partir de ontem

QuandoPara usuário de grupo fora de ADM, GER, GVE, FAT e GIN. Escolher data mais antiga não alarga o que ele vê.

Sistema antigoO mesmo corte (:444).

PermissãoTipo de grupo ADM, GER, GVE, FAT ou GIN vê o período todo.

Todos
B

Ao abrir a ordem

Antes da primeira leitura
Bloqueia

Esta base não usa o controle de caixas (estoque_item) - a Conferência de Caixas não se aplica aqui.

QuandoO banco do cliente não tem as tabelas de caixa.

Todos
Bloqueia

Ordem 100312806 não encontrada.

QuandoA ordem não existe.

Todos
Bloqueia

Este lançamento foi excluído! Não será permitido prosseguir.

QuandoA ordem está excluída.

Sistema antigo"Este lançamento foi excluido!" (:657).

Todos
Bloqueia

A ordem 100312806 é de outra filial.

QuandoA ordem é de outra filial que não a da sessão.

Todos
C

A cada leitura de caixa

Na ordem em que o servidor confere

O número da caixa se repete (803.602 caixas para 799.340 números na filial 3). A caixa que tem movimentação nesta ordem vem primeiro.

Bloqueia

Código de barras inválido !

QuandoLeitura vazia.

Sistema antigoA mesma frase (:1201).

Todos
Bloqueia

Caixa 803602 não consta no estoque, não é possível até regularizar!

QuandoNúmero de caixa que não existe na filial.

Sistema antigo"Caixa não consta no recebimento…" (:1215) — só se a consulta falhava; com zero linhas o sistema antigo seguia e mostrava uma caixa fantasma como conferida.

Todos
Bloqueia

Caixa consta como cancelada, o recebimento não é possível até regularizar!

QuandoA caixa está cancelada.

Sistema antigoA mesma frase (:1224) — lá a trava nunca disparava.

Todos
Aviso

Caixa 803602 já estava conferida.

QuandoLer de novo uma caixa já conferida. Não grava nada.

Todos
Bloqueia

Produto 10057 - PICANHA não consta no pedido!

QuandoO produto da caixa não está no recebimento.

Sistema antigo"Produto não consta no pedido!" (:1246).

Todos
Bloqueia

Caixa 803602 não consta neste recebimento - ela não entrou por esta ordem.

QuandoA caixa existe e o produto está no pedido, mas ela entrou por outra ordem. O sistema antigo somava a caixa na tela sem gravar nada.

Todos
D

Permissões

Quem pode passar
OndeQuem passaComo conceder
corte da grade a partir de ontemtipo de grupo ADM, GER, GVE, FAT ou GIN vê o período todoGrupos de Usuário (442)

grep hUsuarioRegras no programa do sistema antigo devolve zero: esta tela não tem regra nomeada a conceder no Acesso dos Grupos (444).

E

Como o erro chega na tela

Para o QA reproduzir e reportar

Cada leitura de código de barras é uma requisição própria: a recusa vale só para aquela caixa, e as já lidas continuam gravadas — não há botão Gravar. A recusa chega como HTTP 200 com statuscode 400 e a frase. Erro inesperado traz o código de ocorrência de 8 caracteres — copie-o no chamado.

F

Regras chumbadas no código

Esperadas — não abrir como defeito
O queValor
grupos sem o corte de ontemADM, GER, GVE, FAT, GIN
G

Diferenças e decisões pendentes

O que muda em relação ao sistema antigo
PontoSituação
caixa não encontrada, cancelada e de outro recebimentoo sistema antigo mostrava as três como conferidas sem gravar; aqui recusa
o Status da gradesaía sempre em branco no sistema antigo (lia um campo que a consulta não traz); corrigido
o impressoo sistema antigo imprimia o id interno como "Número Caixa"; aqui sai o número da etiqueta
desfazer uma conferêncianão existe, nem no sistema antigo
período da gradenão existe no sistema antigo; aqui abre nos últimos 30 dias
H

Comparação com o CEIF — botões, permissões e campos (17/09/2026)

menu2394.prg · CEI254.PRG / CEI256.PRG (CEIF) · com.fjfrigo.back.faturamento.conferenciacaixa + ConferenciaCaixa.vue

O cabeçalho do .prg legado diz "Romaneio Entrada", mas está desatualizado — o conteúdo real da classe sempre foi Conferência de Caixas, e o número 2394 nunca foi realocado (ver Achado 1, abaixo). O CEIF não tem correspondência real: CEI254.PRG/CEI256.PRG ("Romaneio de Recebimento/Descarga") são a pista óbvia pelo nome, mas pertencem a um sistema Clipper/DOS completamente diferente — cliente Grupo Torlim Frigorificos, de 1999 — sem código de barras, balança nem estoque_item: não é a mesma linhagem de produto (ver Achado 2).

BotãoLegadoCEIFPorte
Conferir (grade)oButtonIncluir, "Conferir" — testUsPermissao(cClassName,"incluir"), abre ::dados(2, current)—t('fat.conferencia.conferir'); chama abrir(selected), habilitado só com linha selecionada
Visualizar (grade)oButtonAlterar, "Visualizar" — permissão "visualiza", grid não vazio, abre ::dados(4, current)—não existe como botão separado — a ação "Conferir" sempre abre a ordem para leitura (ver Achado 5)
Atualizar (grade)oButtonAtualizar, sem checagem de permissão — populaGrid(1)—t('comum.atualizar'); chama carregar()
Imprimir (grade)oButtonImprimir, permissão "imprimir", grid não vazio — ::impressao(oGrid, current, "demonstrativo")—t('fat.conferencia.imprimir'); GET .../{id}/romaneio.pdf
Imprimir (dentro da ordem)não existe botão dedicado — só o da grade—botão próprio no rodapé da janela da ordem, mesma ação
Ok / Fechar (ordem)oButtonCancelar, "Ok", só com nOperacao>=4; fecha o diálogo—t('comum.fechar'); chama fecharOrdem()
Confirma F5 (leitura manual/balança)oButtonConfirma — dispara ::validQuant(.T.)—não portado — código morto no legado (ver Achado 4); o porte só lê código de barras
Localiza emitente "..."oButtonLocalizaEmitente—não aplicável — emitente vem só de leitura
Localiza produto "..."oButtonLocalizaProduto, só se !lCarne—não aplicável — porte não edita produto na grade, só lê caixa
Gravar / Excluir (romaneio)comentados no fonte, nunca chamados—corretamente não portados
Campo "Código de barras"oCodigoBarras, VALID {|| ::validCB(...)}—input com @keyup.enter="ler"
Campo / colunaLegado (grade)CEIFPorte
Idsim, coluna 1—id
Data de emissãosim, mas rotulada "Pedido" apesar de trazer data_emissao—dataEmissao, rotulada corretamente "Emissão"
"Entrega"coluna própria, mas a query traz data_emissao AS data_entrega — mesma data apelidada, não dado novo—não replicada — corretamente, já que não é informação distinta
Data de embarquesim—dataEmbarque
Emitentesim—emitente
Statuscoluna 6 — bug: testa fieldGet('qtd_emb'), campo de uma consulta anterior comentada; a viva renomeou para peso_pedido → coluna sempre em branco—status calculado corretamente a partir do peso recebido — bug do legado corrigido, não replicado (ver Achado 6)
Status (2ª coluna)coluna 7, sempre recebe "" — morta—não replicada, corretamente
Observaçãosim—observacao
Peso embarcadoúnica coluna de peso, rótulo "Peso embarcado"—desdobrado em duas: pesoRecebido e pesoConferido — mais informativo que o legado
Cabeçalho da ordem (id, data, emitente, status, obs.)sim, todos lidos em populaCampos—idêntico, aberto.{id,dataEmissao,emitente,status,observacao}
Código de barras (leitura)cCodigoBarras—codigoBarras
Grid "Produtos" (síntese por produto)aGridProdutos — Id/Produto/Peças/Peso pedido/Peças emb/Peso emb—produtos com idProduto/produto/caixas/peso/caixasConferidas/pesoConferido
Grid "Analítico" (caixa a caixa lida)aGridAnalitico — Código/Produto/Qtd/Peso—conferidas com numeroCaixa/produto/peso
lGado (ramo pecuária)sim, calculado de tipo_ped—não portado — código morto (ver Achado 4)
Achados
Confirmado — sem achado

O cabeçalho do .prg está desatualizado, não o número da opção.

ConclusãoO conteúdo real da classe sempre foi, e continua sendo, "Conferência de Caixas". Evidência dentro do próprio menu2394.prg: o título da janela MDI de verdade vem de ::init("Conferencia de Caixas (Recebimento de produtos)", ...), o impresso interno se chama "ROMANEIO DE CONFERENCIA ENTRADA" e o fluxo inteiro (validCB) lê código de barras contra estoque_item_movimentacao com tipomovimentacaocaixa='ENTRADA'. Só o comentário do cabeçalho (linha 2, "Romaneio Entrada") ficou para trás — não houve realocação de número de opção.

Todos
Gap esperado (CEIF)

O CEIF não tem tela equivalente à Conferência de Caixas.

QuandoCEI254.PRG/CEI256.PRG ("Romaneio de Recebimento/Descarga") pareciam a pista óbvia pelo nome, mas pertencem a um sistema completamente diferente: Clipper/DOS em modo texto, sem classes, para o cliente Grupo Torlim Frigorificos (não FJ/BMG), datado de 1999. O fluxo ali é digitação de quantidade/peso por produto numa "Ordem de Descarga" — sem código de barras, sem balança, sem estoque_item/estoque_item_movimentacao, sem o conceito de caixa individual conferida. Buscas amplas por CAIXA (27 arquivos, todos de caixa registradora/financeiro) e CONFERENCIA (só CEI332.PRG, "Planilha de Rendimentos") no diretório CEIF inteiro não acharam nada equivalente.

Todos
Confirmado — sem achado

grep hUsuarioRegras devolve zero nas três pontas.

QuandoNão existe, no legado, nenhuma regra de acesso nomeada para esta tela — nem para conferir, nem para imprimir. O CEIF e o porte confirmam a mesma ausência: não há nada a nomear/cadastrar aqui além do que grupo_permissao já cobre por visibilidade de menu.

Todos
Confirmado — sem achado

Código morto no legado, corretamente não portado.

QuandovalidQuant (leitura manual de peso) e lerBalanca (leitura por balança) terminam chamando ::gravaItem(...), mas esse método não existe na classe Menu2394 — no Harbour isso derruba em erro de execução se algum dia for exercitado. O ramo de gado (lGado) e o botão "Confirma F5" dependem inteiramente desse caminho morto. O porte, implementando só a leitura por código de barras (o único caminho que de fato grava), está certo em não reproduzir nada disso.

Todos
Achado real

Gap de permissão por botão no porte: não há distinção entre quem pode conferir, visualizar ou imprimir.

QuandoO legado usa a matriz grupo_permissao/ testUsPermissao para diferenciar quem pode conferir ("incluir"), visualizar ("visualiza") e imprimir ("imprimir"). O backend novo não faz nenhuma dessas checagens — qualquer sessão autenticada com o menu visível pode ler caixas e imprimir. É o mesmo padrão já observado em outras opções desta leva (234, 2392, 2393): grupo_permissao no porte só controla visibilidade de menu, não ação dentro da tela já aberta. Não é bug introduzido por esta tela — é decisão arquitetural já assumida no projeto, mas fica registrado como divergência real, merecendo decisão do usuário.

Todos
Confirmado — sem achado

O porte é mais estrito que o legado em dois pontos, corrigindo bugs reais dele.

Quando(a) caixa cancelada nunca era recusada no legado porque ele testa fieldGet('cancelada') num SELECT que traz a coluna cancelado (erro de nome de campo) — o porte lê a coluna certa e recusa de verdade; (b) caixa lida que pertence a outro recebimento (mas cujo produto existe também nesta ordem) era contada como conferida no legado (o UPDATE filtra por iddevolucao e não acha linha, mas a tela soma a caixa do mesmo jeito) — o porte confere idMovimento e recusa, dizendo por quê. Os dois são melhorias de integridade já feitas e conferidas no próprio código — registrado aqui só para constar.

Todos
Divergência de UX

"Já conferida" virou aviso explícito em vez de silencioso.

QuandoNo legado, reler uma caixa já conferida simplesmente não fazia nada — o msginfo("ja conferida") está comentado no fonte. O porte devolve situacao=JA_CONFERIDA e mostra um aviso explícito na tela, para quem lê não achar que o leitor falhou. Divergência pequena e intencional, deliberada.

Todos

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