FJFrigo · Lançamentos › Saídas/Vendas › 2331

Fila de Aprovação de Pedidos

Pedidos de venda esperando autorização de crédito e de preço, numa lista só, com o motivo de cada um e aprovação em lote pelos mesmos endpoints do 2332. Funciona também no celular.

Tabela: faturamento_venda_ordem_vendaEndpoints: /lancamento/pedido-venda/fila-aprovacao e /{id}/autorizacao[-preco]Programa antigo: nenhum (inovação; o 2332 vem do menu2332.prg)

Teste

Caso sugerido para QA: o que fazer, o que esperar e como conferir no banco.

Bloqueia

Recusa com a mensagem exata (HTTP 400, mostrada na tela).

Atenção

Limitação, pendência ou ponto em que o código e a ajuda não coincidem.

A

O que a tela é e faz

Identidade 2331

Fila do aprovador: os pedidos de venda (2332) que esperam autorização de crédito e, quando a alçada pede, de preço, numa tela só, o de entrega mais próxima primeiro (os atrasados no topo). Cada pedido é analisado "a seco" (as mesmas análises do botão Autorizar do 2332, sem gravar) para o aprovador ver as restrições antes, e "Aprovar marcados" chama os endpoints do 2332. Inovação do faturamento (27/09/2026): o legado e o ceif não têm. Pacote faturamento.pedidovenda: PedidoVendaFilaAprovacaoService e ...Controller; tela FilaAprovacaoPedidos.vue.

2331 = o antigo "2332 › A": nasceu dentro do menu do 2332 e seguia a permissão dele; em 29/09/2026 ganhou opção própria (2-Lançamentos › 3-Saídas/Vendas › 1-Fila de Aprovação de Pedidos (2331), histórico 368). Sem linha em grupo_permissao a tela some para quem não é ADM (conceder no 444). Em AppShell.TELA_SEM_REGISTRO o link direto /?abrir=2331 abre a fila sem id, com permissao: '2331' (o histórico 353 ainda fala em "permissão do 2332").

Quem aprova e as travas continuam sendo as do 2332: POST /lancamento/pedido-venda/{id}/autorizacao-preco e POST /lancamento/pedido-venda/{id}/autorizacao, ambos com ?confirmado=true. A fila não tem endpoint de gravação próprio. Documento do próprio 2332: ver a documentação técnica dessa opção.

B

Filtros, botões e opções

Padrões
CampoDefaultEfeito
Entrega de / até (Emissão de, fora do Brasil)hoje − 10 dias até hoje + 15 diasBrasil (codicfj 004): filtra fov.data_entrega; demais países: fov.data_emissao (faixa meio-aberta >= ini AND < fim + 1 dia: as colunas são datetime e há linhas com hora). Sem as duas datas o servidor recusa: "Informe as duas datas do período." (desde 04/10/2026)
Todas as minhas filiaisdesmarcadaDesmarcada: filial da sessão. Marcada: FiliaisDoUsuario.permitidas
Crédito e preço / Só crédito / Preço pendenteCrédito e preçoFiltro local sobre a lista: "Preço pendente" = pendentePreco (o crédito vai junto); "Só crédito" = !pendentePreco, os que aguardam só o crédito. Todo item aguarda crédito; os dois filtros repartem a lista (ver G)
Atualizar—Recarrega a lista e reanalisa tudo, um pedido por vez ("Analisando N de M…")
Abrir ao entrar pelo celulardesmarcadaGrava localStorage 'fjfrigo.telaInicialCelular' = '2331' (por aparelho; só vale com largura ≤ 768 px)
Copiar link—Copia <origin>/?abrir=2331; sem permissão de área de transferência abre um prompt com o link
Abrir—Abre o pedido (PedidoVendaEditWindow) para corrigir; ao gravar, o pedido é reanalisado
Interno—GET /lancamento/pedido-venda/{id}/demonstrativo.pdf?versao=interno (margens, custo e tabela mínima) em outra aba
Aprovar marcados—Pede confirmação ("Aprovar N pedido(s)?" e, quando há, "N deles com restrição mostrada na fila - serão aprovados mesmo assim.") e aprova um a um: preço antes (se pendente), pedido depois

Abaixo de 720 px a tabela vira cartões (celular). Cada linha mostra, além do pedido, cliente, valor, "em N dia(s)/N dia(s) atrás/hoje", o score de crédito (marcarScores), a coluna Motivo e o resultado da aprovação (verde "Aprovado" / vermelho com o texto do erro).

C

De onde vem cada dado e como se analisa

Lista e análise

Lista (GET /lancamento/pedido-venda/fila-aprovacao?dataInicial&dataFinal&multiFilial)

Motivo da coluna (já vem na lista)Condição
cliente sem limitevalorLimite ≤ 0
pendência + pedidos em aberto acima do limitevalorPendente + pedidosAbertos > valorLimite
atraso de N dia(s), tolerância Tatraso > toleranciaAtraso
cliente inativo (última nota aaaa-mm-dd)última nota há mais de 60 dias
parcela abaixo de 300valorParcela < 300
prazo fora do cadastro do clienteautorizadoPor = "PRAZO"
preço pede liberação (ADM|GER)pendentePreco

São os mesmos motivos da cor da linha do 2332 (constantes copiadas em PedidoVendaFilaAprovacaoService: 300, 60 dias, alçadas ADM/GER). Não substituem a análise por pedido.

Análise de um pedido (GET .../fila-aprovacao/{id}/analise)

ResultadoMensagens (exatas)Quando
Recusa de créditotipo de faturamento exige a regra ORDEM_VENDA_AUTORIZACAO_AJUSTE_ESTOQUE_REETIQUETAGEMBrasil, tipos 11105/11116, sem a regra
Recusa de créditodoação exige a regra ORDEM_VENDA_AUTORIZACAO_DOACAOBrasil, tipo 1120, sem a regra
Recusa de créditopedido sem aprovação de preçocontrola tabela mínima, alçada ADM e sem idusuario_preco (descartada pelo servidor na análise da fila quando o preço está pendente, porque "Aprovar" o libera junto)
Recusa de créditoeste pedido deve ter autorização de preço para faturamento (produto abaixo da tabela mínima)Brasil, controla tabela mínima, tipo com tabela mínima, alçada ADM/GER sem preço liberado e produto abaixo do mínimo
Recusa de créditopedido com produto repetidomesmo idproduto duas vezes na grade
Recusa de créditoemitente sem segmentaçãoBrasil, emitente sem segmentação
Recusa de créditoprazo fora do cadastro do emitente (exige ORDEM_VENDA_AUTORIZACAO_CREDITO)Brasil, prazo do pedido ausente dos prazos do emitente e usuário sem a regra
Recusa de crédito<produto>: sem tabela mínima / <produto>: produto sem NCM [vazio|valor]Brasil, tipo que controla pendência: sem tabela mínima (se controla), NCM vazio ou com 3 a 7 caracteres
Restrição de créditopendência (X) acima do limite (Y); pendência + pedidos em aberto (X) acima do limite (Y); emitente sem limite de venda cadastradoSó pedido a prazo, fora do Paraguai e fora do tipo de pagamento antecipado (10019)
Restrição de créditoatraso de N dia(s), tolerância de TIdem (a prazo, fora do Paraguai)
Restrição de créditocliente sem compras há mais de 60 dias; parcela de X, abaixo do mínimo de 300Brasil, qualquer prazo
Recusa / restrição de preçopedido já autorizado...; autorizar preço exige a regra ORDEM_VENDA_AUTORIZACAO_PRECO ou grupo ADM/GER/GVE; pedido com alçada GER exige a regra...; "<idindustria> <produto>: pedido X, mínimo Y (ML Z%)"Sem a regra necessária (..._PRECO alçada Gerente nos tipos 115, 1138, 1184, 1186, 11108, 11109, 11111, 11116, 11127; ..._PRECO_ABAIXO_MINIMO nos demais, abaixo do mínimo) vira recusa; com ela, restrição

Fora do bloco de crédito (sem recusa nem restrição) ficam os tipos de faturamento sem tipo_faturamento.ordem_venda_controla_pendencia e os emitentes cujo grupo (grupo_emitente.intercompany) é intercompany; nestes a análise devolve só as recusas de permissão por tipo, produto repetido, segmentação e preço.

Quando a linha pode ser marcada (front)

D

Permissões, travas e mensagens

Regras ORDEM_VENDA_*

A lista e a análise não exigem regra: qualquer usuário com a opção no menu (e o endpoint sob /lancamento/* com JWT) vê a fila. A aprovação exige o que o 2332 exige, aplicado no servidor no momento do clique:

Bloqueia

Usuário não tem permissão para autorizar pedidos (regra ORDEM_VENDA_*).

QuandoAprovar em filial 003/004 sem nenhuma regra ORDEM_VENDA_*. A linha mostra o texto em vermelho no resultado.

Bloqueia

Usuário não tem permissão para autorizar pedidos [grupo].

QuandoAprovar em outro país com grupo fora de ADM/GER/GVE/FAT/FIN/CRE.

Bloqueia

autorizar preço exige a regra ORDEM_VENDA_AUTORIZACAO_PRECO ou grupo ADM/GER/GVE (o seu é X)

QuandoAprovação de preço sem regra e sem grupo. Aparece como recusa na análise: a linha nem fica marcável.

Aviso

Aprovar N pedido(s)?

QuandoConfirmação do navegador antes de gravar (cancelar não faz nada).

E

Configuração e dependências

filial, tipo, regras
OndeItemEfeito
filialcontrola_pendencias_pedidoDesligada: não há análise de crédito (a tela mostra só o preço)
filialcontrola_tabela_minimaLiga a conferência de tabela mínima/preço
filialautorizar_pedido_simples (coluna opcional; ausente = falso)No Brasil, dispensa regra para liberar preço e restrição só de limite
tipo_faturamentoordem_venda_controla_pendenciaTipo fora do bloco de crédito (antes: lista de 13 ids chumbada)
grupo_emitenteintercompanyEmitente de grupo intercompany fica fora do bloco de crédito
grupo_usuario / usuariotipo_grupo, tipo, idvendedorQuem pode autorizar fora do Brasil; vendedor só vê os pedidos dele
Regras de acessoORDEM_VENDA_AUTORIZACAO, _CREDITO, _INATIVO, _MENOR_300_REAIS, _PRECO, _PRECO_ABAIXO_MINIMO, _RESTRICAO, _DOACAO, _AJUSTE_ESTOQUE_REETIQUETAGEMCadastradas no central; "basta UMA da família" para autorizar (critério do legado; o ceif exige ORDEM_VENDA_AUTORIZACAO nominal)
Navegadorfjfrigo.telaInicialCelularAbrir a fila ao entrar pelo celular (largura ≤ 768 px)
public/manifest.webmanifestatalho "Aprovação" → /?abrir=2331App instalável no celular (sem service worker; não testado em celular)

Constantes na fila: parcela mínima 300, 60 dias para cliente inativo (cópias das do 2332), alçadas com preço ADM/GER. Sem rotina agendada e sem e-mail.

F

Casos de teste sugeridos

QA
Teste

Abrir a fila

FazerAbrir 2331 (Brasil) com os padrões.

EsperadoLista os pedidos não autorizados, não excluídos e não faturados com entrega entre hoje − 10 e hoje + 15, atrasados no topo. "Analisando N de M…" cresce até M; cada linha ganha cor e Motivo.

ConferirSELECT fov.id, fov.data_emissao, fov.data_entrega, fov.autorizado, fov.idusuario_preco, fov.tipo_aut_preco FROM faturamento_venda_ordem_venda fov WHERE fov.excluido <> 'T' AND fov.autorizado <> 'T' AND fov.data_entrega >= :de AND fov.data_entrega <= :ate AND fov.idfilial = :filial AND NOT EXISTS (SELECT 1 FROM faturamento_venda fv WHERE fv.excluido <> 'T' AND fv.idpedido = fov.id) ORDER BY fov.data_entrega, fov.idA contagem da tela deve bater com a consulta (no vendedor "VEN", só os pedidos dele). Referência (central, 04/10/2026): 1.048 pedidos não autorizados no total, na história inteira.

Teste

Fora do Brasil usa a data de emissão

FazerRepetir em tenant paraguaio.

EsperadoO rótulo vira "Emissão de" e o filtro é data_emissao.

Teste

Análise por pedido

FazerEscolher um pedido com cliente sem limite ou com atraso e outro limpo.

EsperadoO primeiro mostra restrição em laranja e (se houver limite) o limite sugerido pelo score; o limpo fica sem cor e marcável. Pedido sem NCM no item, produto repetido ou cliente sem segmentação (Brasil): vermelho, não marcável. Filial com controla_pendencias_pedido desligado: sem análise de crédito.

ConferirSELECT controla_pendencias_pedido, controla_tabela_minima, autorizar_pedido_simples FROM filial WHERE id_filial = :filial (a coluna opcional pode não existir).

Teste

Restrição de crédito sem a regra

FazerCom um usuário sem ORDEM_VENDA_AUTORIZACAO_CREDITO, abrir um pedido com atraso.

EsperadoA linha fica laranja mas não marcável (a análise diz que o usuário não pode liberar). Com a regra, marca e, ao aprovar, o aviso conta quantas linhas têm restrição.

Teste

Aprovar pedido só de crédito

FazerMarcar um pedido sem preço pendente e clicar "Aprovar marcados" e confirmar.

EsperadoA linha fica verde "Aprovado" e some da fila no próximo Atualizar; resumo "1 aprovado(s), 0 com falha.".

ConferirSELECT autorizado, idusuario_autorizou FROM faturamento_venda_ordem_venda WHERE id = :id

Teste

Aprovar pedido com preço pendente

FazerMarcar um pedido de alçada ADM/GER sem preço liberado, com usuário que tem a regra de preço.

EsperadoPrimeiro idusuario_preco é gravado, depois autorizado = 'T' (ordem obrigatória). As recusas "pedido sem aprovação de preço" (ADM) e "este pedido deve ter autorização de preço..." (GER abaixo do mínimo) não aparecem na fila por causa disso; repetir com um pedido GER abaixo do mínimo, que agora fica marcável.

ConferirSELECT autorizado, idusuario_preco, tipo_aut_preco FROM faturamento_venda_ordem_venda WHERE id = :id

Teste

Sem permissão para autorizar

FazerUsuário sem nenhuma regra ORDEM_VENDA_* (003/004) tenta aprovar um pedido marcável.

EsperadoA linha vira vermelha com "Usuário não tem permissão para autorizar pedidos (regra ORDEM_VENDA_*)."; nada é gravado; o resumo conta 1 falha.

Teste

Filtros Só crédito / Só preço

FazerAlternar o combo.

Esperado"Só preço" mostra os pendentes de preço; "Só crédito" mostra os sem preço pendente (um pedido pendente de crédito e de preço só aparece em "Só preço" e em "Crédito e preço").

Teste

Celular e link direto

FazerAbrir /?abrir=2331 logado e em tela ≤ 720 px; marcar "Abrir ao entrar pelo celular".

EsperadoAbre direto a fila; a tabela vira cartões; "Interno" abre o PDF do demonstrativo interno em outra aba; na próxima entrada pelo celular a fila abre sozinha.

Teste

Aprovar não exercitado: validar em homologação

FazerAprovar de fato é o único ponto que o histórico 350 marca como não exercitado (só a lista e a análise foram rodadas, filiais 5, 64 e 32 do central).

EsperadoFazer o roteiro acima em homologação com pelo menos: pedido limpo, com restrição liberável, com recusa e com preço pendente.

G

Limitações, pendências e pontos de atenção

Achados da leitura do código
Atenção

Corrigido em 04/10/2026: bloqueio indevido na alçada GER com preço abaixo do mínimo

A tela só descartava a recusa "pedido sem aprovação de preço" (ADM). A da alçada GER — "este pedido deve ter autorização de preço para faturamento (produto abaixo da tabela mínima)" — ficava, e o pedido não era marcável embora "Aprovar" libere o preço antes. Agora PedidoVendaFilaAprovacaoService.analisar tira as duas de recusasCredito quando precoPendente (constantes PedidoVendaCredito.RECUSA_SEM_APROVACAO_PRECO e RECUSA_DEVE_TER_PRECO); a tela não compara mais texto. Recusa do próprio preço (regra que falta) continua em recusasPreco e impede. Conferido no menu2332.prg: no legado são dois cliques (Aut. Preço e depois Autorizar). Não testado na tela.

Atenção

Ajustado em 04/10/2026: rótulos do filtro de pendência

Todo item aguarda crédito; "Só crédito" (!pendentePreco) é o pedido que aguarda só o crédito e o antigo "Só preço" virou "Preço pendente" (o crédito vai junto na mesma aprovação), com dica no item. Os dois repartem a lista; o comportamento não mudou.

Atenção

Análise usa os parâmetros da filial da sessão, não os do pedido (decisão em aberto)

Com "Todas as minhas filiais", analisar lê filialParametros.buscar(jdbc, user.idFilial()) e FlagDaFilial.ligada(jdbc, user.idFilial(), ...). É o mesmo que a autorização do 2332 faz (alternarAutorizacao/alternarAutorizacaoPreco) e o mesmo do legado (oParametros da sessão, com lMultiFilial na grade). Mudar só a fila faria a análise "a seco" divergir do que o Aprovar confere; se for para mudar, é no 2332 inteiro (parâmetros da filial do pedido). Não alterado: decisão de negócio (04/10/2026).

Atenção

Lista e análise sem regra de acesso

Quem tem o menu vê todos os pedidos pendentes (e seus motivos de crédito) das filiais escolhidas, mesmo sem poder aprovar; a aprovação é que checa as regras.

Atenção

Corrigido em 04/10/2026: sem datas a lista vinha vazia sem aviso

O serviço agora recusa: "Informe as duas datas do período.". Junto, o recorte de data do 2332 (PedidoVendaRepository.aplicarFiltros, que a fila usa) passou a faixa meio-aberta: data_entrega/data_emissao são datetime e em central há linhas com hora (54 entregas e 10.507 emissões em 2026), que o <= fim perdia no último dia. Vale também para a grade do 2332.

Atenção

Pendências

Status REVISAR (status-porte.csv, 02/10/2026; data da última conferência vazia). Aprovar não foi exercitado e a tela não foi testada (histórico 350); PWA/celular não testado em aparelho (353). O Javadoc do serviço diz "autorizado = 'F'", o SQL é autorizado <> 'T' (equivalente se a coluna nunca for nula).

Nada bate com essa busca. Tente um trecho menor, ou limpe os filtros.