FJFrigo · Lançamentos · Faturamento/Exportações › Compra de Gado › 1-Ordem de Compra Animal · 2311

Ordem de Compra Animal

A ordem que combina com o pecuarista a compra dos animais antes do abate: datas e horários de abate, propriedade, forma de pagamento, comissão e um preço por tipo de animal. Inclui a autorização, a troca da data de abate, os relatórios e a API pública que a indústria consulta. Cada regra traz a mensagem exata e quando dispara.

Tabelas: ordem_compra_animal, ordem_compra_animal_item Programa antigo: não existe no legado — veio do ceif (OrdemCompraAnimalGrid/Form/ItemMasterDetail)

Bloqueia

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

Confirma

Pergunta antes de seguir. Nesta tela quem pergunta é sempre a própria tela, antes de chamar o servidor.

Aviso

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

De onde vêm as regras

O Harbour não tem esta tela. As regras são as do ceif, conferidas de novo no servidor — a tela só as reflete.

A

Grade e filtros

Período por data de compra ou de abate, Multi filial

A grade lê ordem_compra_animal pelo período escolhido na coluna data_compra ou data_abate (o combo "Data compra / Data abate"). Sem a regra de multi filial, só a filial da sessão; com ela, as filiais a que o usuário tem acesso (usuario_filial), ou uma só, escolhida no campo Filial.

Bloqueia

Informe a data inicial.

QuandoListar sem data inicial (vale também para a data final: "Informe a data final.").

Todos
Bloqueia

A data final é anterior à inicial.

QuandoPeríodo invertido.

Todos
Bloqueia

Data inválida: 2026-13-01

QuandoQualquer data da tela que não esteja em aaaa-mm-dd (grade, gravação, relatórios, data de abate).

Todos
Bloqueia

Você não tem acesso à filial 53.

QuandoCom a regra de multi filial, escolher uma filial que não está no usuario_filial do usuário. A mesma frase sai ao abrir, alterar, autorizar ou imprimir uma ordem de filial fora do alcance.

Todos
Aviso

(sem mensagem) — Multi filial sem a regra é ignorado

QuandoPedir multi filial (ou mandar idFilial) sem HABILITA_FILTRO_MULTI_FILIAL_ORDEM_COMPRA_ANIMAL: a grade volta só com a filial da sessão, sem recusa. A tela nem mostra o interruptor sem a regra.

Todos
B

Gravar — cabeçalho

Incluir e Alterar

A gravação é uma transação só (cabeçalho + itens). Numeração pela trigger. A observação é gravada como mediumblob em UTF-8, e vazia vira bytes vazios, como o ceif grava.

Bloqueia

Informe a data de compra.

QuandoSem data de compra.

Todos
Bloqueia

Informe a data de abate.

QuandoSem data de abate.

Todos
Bloqueia

A data de abate não pode ser anterior à data de compra.

QuandoAbate antes da compra. A tela confere antes de enviar, com a mesma frase; o servidor confere de novo.

Todos
Bloqueia

Informe o horário de início do abate.

QuandoSem horário de início (e "Informe o horário final do abate." sem o final).

Todos
Bloqueia

Horário inválido: 25:00

QuandoHorário fora de hh:mm ou hh:mm:ss.

Todos
Bloqueia

O horário de início do abate é depois do horário final.

QuandoInício depois do fim (conferido na tela e no servidor). Início igual ao fim passa.

Todos
Bloqueia

Informe o pecuarista.

QuandoSem pecuarista.

Todos
Bloqueia

O emitente 10254246 não está cadastrado como pecuarista.

QuandoO emitente não tem o tipo de emitente 12 (PEC) em emitente_tipo_emitente. A busca da tela (EMITENTE_PECUARISTA) já filtra; a recusa pega o id digitado ou enviado direto.

Todos
Bloqueia

Informe a propriedade.

QuandoSem propriedade.

Todos
Bloqueia

A propriedade 1005 não é do pecuarista escolhido.

QuandoA propriedade (emitente_propriedade) pertence a outro emitente, ou não existe. O combo do ceif filtra pelo pecuarista; aqui o servidor confere.

Todos
Bloqueia

O emitente 10033 não está cadastrado como comprador de gado.

QuandoComprador informado sem o tipo de emitente 4 (CGA). O comprador é opcional.

Todos
Bloqueia

Comissionista 10044 não encontrado.

QuandoComissionista informado que não existe em emitente. É opcional, e não se confere o tipo do emitente.

Todos
Bloqueia

Informe a moeda.

QuandoSem moeda, ou moeda que não existe no cadastro. A ordem nova nasce na moeda local da filial.

Todos
Bloqueia

Tipo de compra inválido.

QuandoTipo de compra diferente de 1 (Vivo) e 2 (Morto). Sem valor vale Morto.

Todos
Bloqueia

Compra a prazo: informe um prazo maior que zero.

QuandoTipo de pagamento "Prazo" com prazo vazio ou zero.

Todos
Bloqueia

Tipo de pagamento inválido.

QuandoTipo de pagamento diferente de 1 (A Vista) e 2 (Prazo). Sem valor vale A Vista.

Todos
Bloqueia

Tipo de comissão inválido.

QuandoFora de 1 a 4 (Sem comissão, Valor cabeça, Valor Quilo, Quilo cabeça). Sem valor vale Sem comissão.

Todos
Bloqueia

O valor da comissão não pode ser negativo.

QuandoValor de comissão negativo num tipo que tem comissão.

Todos
Aviso

(sem mensagem) — à vista grava prazo 0; "Sem comissão" grava valor 0

QuandoO servidor normaliza: com A Vista o prazo digitado é descartado (a tela já trava o campo), e com Sem comissão o valor da comissão vai a zero.

Todos
C

Gravar — itens (preço por tipo de animal)

A grade de itens

Os itens vão para ordem_compra_animal_item, acertados linha a linha (o id da linha se mantém, como o orphanRemoval do ceif). Linha sem tipo de animal é descartada antes de conferir. Tipo de animal, tipo de mercado e padrão de preço têm de ser da filial da ordem. Habilitação vazia vale TODOS.

Bloqueia

Informe os itens da ordem de compra.

QuandoNenhuma linha com tipo de animal.

Todos
Bloqueia

Tipo de animal 1003 não é desta filial.

QuandoO tipo de animal da linha não é do cadastro 18J › Tipo Animal da filial da ordem.

Todos
Bloqueia

Sem valor de preço para o item BOI_INTEIRO.

QuandoPreço vazio, zero ou negativo. A grade marca a célula com "Informe o preço" antes de enviar.

Todos
Bloqueia

Sem quantidade para o item BOI_INTEIRO.

QuandoQuantidade vazia (zero é aceito).

Todos
Bloqueia

Quantidade inválida no item BOI_INTEIRO.

QuandoQuantidade negativa (a grade marca "Quantidade inválida").

Todos
Bloqueia

Informe o tipo de mercado do item BOI_INTEIRO.

QuandoSem tipo de mercado, ou tipo de mercado de outra filial (a grade marca "Informe o tipo de mercado").

Todos
Bloqueia

Sem padrão de preço para o item BOI_INTEIRO.

QuandoSem padrão de preço, ou padrão de outra filial (a grade marca "Informe o padrão de preço").

Todos
Bloqueia

O padrão de preço do item BOI_INTEIRO é de outro tipo de animal.

QuandoO padrao_preco.idtipo_animal escolhido não é o tipo da linha.

Todos
Bloqueia

Habilitação HILTON não cadastrada.

QuandoA habilitação da linha não está na lista de habilitações do banco.

Todos
Bloqueia

Combinação duplicada: Tipo Animal: BOI_INTEIRO e Habilitação: TODOS.

QuandoDuas linhas com o mesmo tipo de animal e a mesma habilitação.

Todos
Bloqueia

Deve ter pelo menos um item do tipo VACA e habilitação TODOS.

QuandoAlgum tipo de animal da filial não tem linha com habilitação TODOS. Na inclusão a tela já nasce com uma linha fixa por tipo de animal da filial.

AtençãoTipo de animal novo cadastrado no 18J passa a ser exigido em toda ordem da filial, inclusive ao regravar ordens antigas.

Todos
Aviso

Tipos de animal sem padrão de preço: VACA, NOVILHA

QuandoConferido só na tela, ao abrir a inclusão: tipos de animal da filial sem padrão de preço ativo. Sem cadastrar o padrão (18J › Padrão Preço), a gravação vai recusar a linha.

Todos
D

Alterar e excluir

As travas da ordem gravada

Excluir é lógico: marca excluido = 'T' e o usuário que excluiu.

Bloqueia

Ordem de compra 100211 não encontrada.

QuandoO id não existe (abrir, alterar, excluir, autorizar, trocar a data de abate, demonstrativo).

Todos
Bloqueia

A ordem de compra 100211 foi excluída.

QuandoAlterar, excluir, autorizar, trocar a data de abate ou imprimir o demonstrativo de ordem excluída.

Todos
Bloqueia

Esta ordem de compra já foi autorizada e não pode ser alterada - desautorize-a antes.

QuandoOrdem com idusuario_autorizou preenchido. Na exclusão a frase termina em "não pode ser excluída - desautorize-a antes." A tela já abre travada ("Ordem autorizada por … — não pode ser alterada; desautorize-a antes.") e o botão Excluir fica desabilitado.

Todos
Bloqueia

A ordem de compra 100211 é da filial 53 - entre nessa filial para alterá-la.

QuandoAlterar ou excluir uma ordem de outra filial (aberta pelo Multi filial). A gravação usa a filial da ordem, e o usuário precisa estar nela.

Todos
E

Autorizar / desautorizar

O alternador da grade

Autorizar grava idusuario_autorizou e data_autorizou; desautorizar os zera. A chegada na indústria é lida em chegada_animal pela ordem_compra.idordem_compra_ceif do banco da indústria (conexão só de leitura).

Confirma

Confirma a autorização da ordem de compra?

QuandoPergunta da tela. Com a ordem autorizada a pergunta é "Ordem já autorizada. Desautorizar?". Resposta: "Ordem autorizada." / "Ordem desautorizada."

Todos
Bloqueia

Sem permissão para autorizar [AUTORIZAR_ORDEM_COMPRA_ANIMAL].

QuandoAutorizar ou desautorizar sem a regra (a tela deixa o botão desabilitado).

Todos
Bloqueia

Já existe chegada de animais na indústria para esta ordem de compra - não é possível desautorizar.

QuandoDesautorizar com chegada registrada no banco da indústria. Filial sistema_industrial LEGADO não consulta; filial fora da WEB sem host_ind também não.

Todos
Bloqueia

A filial BMG TARAUACA não possui host de indústria configurado. Id ordem compra: 100211

QuandoDesautorizar em filial com sistema_industrial WEB e filial.host_ind vazio — não há como conferir a chegada.

Todos
Bloqueia

Só quem autorizou pode desautorizar esta ordem.

QuandoOutro usuário (mesmo com a regra, mesmo master) tenta desautorizar.

Todos
F

Alterar data de abate

O botão da grade

Grava só data_abate. Vale também em ordem autorizada — é para isso que o botão existe.

Bloqueia

Informe a nova data de abate.

QuandoSem a data nova.

Todos
Bloqueia

Não é possível alterar a data de abates anteriores a 21/09/2026.

QuandoA data de abate gravada é de mais de 3 dias atrás (a data na frase é hoje − 3).

Todos
Bloqueia

A data de abate não pode ser anterior à data de compra.

QuandoA data nova é anterior à data de compra gravada na ordem. A mesma regra e a mesma frase da gravação.

Todos
Aviso

(sem mensagem) — ordem de outra filial do usuário

QuandoO botão alcança ordem de outra filial desde que ela esteja nas filiais do usuário (não pede para entrar nela). A janela nasce com a data de hoje.

Todos
G

Relatórios

O combo "Relatórios…" da grade

Escala de abate prevista MOD 1 e MOD 2 (sempre pela data de abate), Ordem de compra MOD 1 em PDF ou XLS (pela data do combo da grade) e Demonstrativo da ordem selecionada. Todos são de uma filial: a da sessão, ou a escolhida com a regra de multi filial. As colunas de animal saem dos tipos que as ordens têm. No MOD 2 a folha fecha com até 30 ordens.

Bloqueia

Sem permissão para outra filial [HABILITA_FILTRO_MULTI_FILIAL_ORDEM_COMPRA_ANIMAL].

QuandoPedir um relatório de filial diferente da sessão sem a regra de multi filial. Com a regra, a filial ainda tem de estar no alcance do usuário.

Todos
Bloqueia

Não há dados para gerar o relatório.

QuandoNenhuma ordem viva no período (e na filial) do relatório.

Todos
H

API pública da indústria

/publico/industria/<banco>/ordem-compra-animal/

Os cinco endpoints do OrdemCompraAnimalApi do ceif, sem sessão e sem token: {id}, buscar-por-data?dataIncluiu&idFilial (inclusões desde a data − 6 dias), buscar-por-data-alterou e buscar-por-data-autorizou (da data até o fim de hoje) e buscar-padrao-preco?idFilial. JSON com os nomes de campo do ceif. Ordem excluída vai com excluido: true; item excluído não vai. Não há frase de regra aqui: o que a indústria recebe é o status HTTP.

Bloqueia

Base central_x não encontrada.

QuandoHTTP 404 com {"status":404,"error":"Base não encontrada","message":…}: o nome do banco no caminho tem caractere fora de [A-Za-z0-9_-], não está na tabela conexao ou está fora do ar.

Todos
Bloqueia

(sem corpo) — HTTP 400

QuandoNas buscas por data e de padrão: data ausente ou fora de aaaa-mm-dd, ou idFilial ausente ou não numérico.

Todos
Bloqueia

OrdemCompraAnimal não encontrada com ID: 100211

QuandoHTTP 404, "error":"Erro ao buscar a ordem de compra": id inexistente ou não numérico. Falha de leitura sai como "Erro ao ler a ordem 100211", também 404.

Todos
Aviso

(sem corpo) — HTTP 404 em buscar-padrao-preco

QuandoA filial não tem padrão de preço — é a resposta do ceif, reproduzida. As buscas por data sem resultado devolvem 200 com lista vazia.

AtençãoFalha inesperada: 404 na busca por inclusão, 500 nas demais (sem pilha, o erro nunca passa pelo tratador geral).

Todos
Aviso

(sem corpo) — HTTP 401, hoje desligado

QuandoA conferência do cabeçalho token contra system_config.INDUSTRIA_API_TOKEN daquele banco está pronta e desligada (OrdemCompraAnimalApiService.EXIGE_TOKEN = false, decisão de 24/09/2026). Ligada, token ausente, diferente ou chave vazia dá 401.

Todos
I

Permissões

Quem pode passar
Regra nomeadaO que libera
AUTORIZAR_ORDEM_COMPRA_ANIMALo botão Autorizar/Desautorizar; desautorizar exige ainda ser quem autorizou
HABILITA_FILTRO_MULTI_FILIAL_ORDEM_COMPRA_ANIMALo interruptor Multi filial e o campo Filial da grade, e relatório de outra filial — sempre limitado às filiais do usuário

As duas vêm do ceif e se concedem no 444 (ao grupo) ou no 443 (ao usuário); o master passa. Incluir, alterar e excluir não têm regra própria além do acesso à opção do menu. GET /lancamento/ordem-compra-animal/permissoes diz à tela o que liberar.

J

Como o erro chega na tela

Para o QA reproduzir e reportar

Recusa de regra: HTTP 200 com statuscode 400 e a frase, que a janela mostra no rodapé (a grade, na faixa de erro acima dela). As perguntas desta tela são todas da própria tela (window.confirm) — o servidor não devolve 409. A API pública responde com o status HTTP de verdade (400/401/404/500), sem sessão. Erro inesperado traz o código de ocorrência de 8 caracteres — copie-o no chamado.

K

Regras chumbadas no código

Esperadas — não abrir como defeito
O quêValor
tipo de emitente do pecuarista / comprador de gado12 (PEC) / 4 (CGA)
habilitação obrigatória por tipo de animalTODOS
corte da troca de data de abate3 dias antes de hoje
janela da busca por inclusão da APIdata − 6 dias, sem data final (a do ceif)
ordens por folha na Escala MOD 2até 30
L

Diferenças e decisões pendentes

O que muda em relação ao ceif
PontoSituação
moeda da ordem novaa moeda local da filial, não o literal 111 do ceif
tipo animal / mercado / padrão de outra filialrecusados no servidor; o ceif só filtra o combo
Multi filialalcança as filiais do usuário, não o banco inteiro
consulta da chegada na indústriadecidida por filial.sistema_industrial e host_ind, no lugar da lista de ids do ceif (5, 11, 12, 14, 16, 17, 27); dá o mesmo resultado nas 13 filiais com gado do central
mensagem da data de abatediz o corte certo (o ceif confere 3 dias e escreve 1)
relatórioscolunas de animal pelos tipos presentes; quantidade soma as linhas do tipo e o preço é o da linha TODOS (o ceif fixa 7 colunas e casa por LIKE '%BOI%'); SIF de filial.numero_sif
API: banco no caminhoinevitável — o ceif atende um banco só
API: item excluídonão vai (o ceif mandaria sem marca)
pendente: token da APIdesligado para manter a compatibilidade com a indústria; ligar EXIGE_TOKEN quando ela mandar o cabeçalho

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