FA080TIT em resumo
- Onde fica
fA080Tit()(baixa individual, opção “Baixar” ou baixa automática) eFa080But()(botão OK da tela de cada título na baixa em lote, opção “Lote”), ambas doFINA080.- Quando dispara
- depois de o usuário confirmar a tela de baixa, antes das validações finais e da gravação.
- PARAMIXB
- nenhum. O padrão chama o ponto de entrada sem argumentos.
- Retorno
- lógico, usado.
.F.impede a baixa. - Serve para bloquear?
- Sim. É o lugar para uma regra de negócio que decide se este título pode ser baixado.
Consulta rápida6 seções
Este é o equivalente a pagar do FA070TIT, mas com uma diferença que muda o código: o FA070TIT recebe o acumulado já baixado em PARAMIXB[1], o FA080TIT não recebe nada. O que você sabe sobre o título vem da SE2 posicionada.
Ele também não mostra mensagem por conta própria. Quem retorna .F. precisa explicar o motivo, senão a baixa simplesmente não acontece.
Para o mecanismo geral de chamada, veja Ponto de entrada no Protheus.
Os três caminhos até ele
| Caminho | Função que chama | O que acontece com .F. |
|---|---|---|
| Baixa individual, com tela | fA080Tit() | Volta para a tela, para o usuário corrigir os dados |
Baixa automática (FINA080 chamado com array de cabeçalho) | fA080Tit() | Não há tela: o padrão sai do laço de confirmação e abandona a baixa |
| Baixa em lote | Fa080But(), no OK da tela de cada título | A função devolve .F. e não segue para as validações finais nem para a gravação daquele título |
Na baixa individual o ponto de entrada roda dentro de um laço de confirmação:
o título só avança quando o retorno é .T.. Por isso, na tela, .F. devolve
o usuário ao diálogo, não encerra a rotina. Isso importa para a mensagem: se
ela não disser o que corrigir, o usuário fica preso num ciclo de OK e volta.
No lote, o ponto de entrada roda uma vez por título, no OK da tela daquele título. Uma consulta pesada se multiplica pelo tamanho do lote.
Onde ele cai na sequência
Na baixa individual, o FA080TIT roda depois das validações de data (data da
baixa menor que a emissão), de valor maior que o máximo a pagar, de cheque e de
cotação de moeda zerada; e antes da checagem de motivo de baixa vazio, de
valor zerado e da gravação. No lote, roda logo na entrada do tratamento do OK,
antes da validação de banco, de motivo de cancelamento e da conferência final
(Fa080OK).
Consequência prática: um título que já falharia nessas validações do padrão chega ao seu código ou não, conforme a validação; não assuma que o ponto de entrada é sempre a primeira coisa a bloquear.
O que está disponível lá dentro
- A
SE2está posicionada no título que será baixado. É a fonte segura para decidir por fornecedor, natureza, tipo ou vencimento, nos três caminhos. - Na baixa individual, as variáveis
dBaixa(data da baixa),nValPgto(valor pago) ecMotBx(motivo de baixa) existem comoPrivateda própria rotina. Na baixa em lote o que existe não foi verificado: se a sua regra depende delas, trate a ausência (por exemplo comType()) ou use só aSE2.
A armadilha: o retorno sobrescreve
Nos dois pontos de chamada o retorno é atribuído direto a lRet, sem combinar
com um valor anterior. Devolva .T. somente quando a sua regra passou ou não
se aplica, e sempre um lógico explícito. Um Return sem valor, ou um valor de
outro tipo, faz o teste do padrão sobre lRet falhar.
Exemplo
Regra de exemplo: título de fornecedor bloqueado no cadastro (A2_MSBLQL igual
a "1") não pode ser baixado. O campo e suas opções podem ter sido
customizados no seu ambiente; confira antes de copiar a regra.
#Include "Protheus.ch"
/*/{Protheus.doc} FA080TIT
Confirmação da baixa a pagar (FINA080): individual, automática e lote.
Bloqueia a baixa de título de fornecedor com bloqueio cadastral.
@type user function
@return logical, .F. impede a baixa
/*/
User Function FA080TIT()
Local aArea := GetArea()
Local aAreaSA2 := SA2->(GetArea())
Local lRet := .T.
// Sem PARAMIXB: a decisão usa só a SE2 posicionada no título.
SA2->(DbSetOrder(1))
If SA2->(DbSeek(FWxFilial("SA2") + SE2->E2_FORNECE + SE2->E2_LOJA))
If SA2->A2_MSBLQL == "1"
lRet := .F.
// O padrão não explica a recusa: o aviso é por nossa conta.
// Sem tela (IsBlind), o motivo vai para o console.
If IsBlind()
ConOut("[FA080TIT] Baixa negada: fornecedor bloqueado. Título " + ;
SE2->E2_PREFIXO + SE2->E2_NUM + SE2->E2_PARCELA)
Else
Help(" ", 1, "FA080TIT",, ;
"Fornecedor bloqueado no cadastro. Baixa não permitida.", 1, 0)
EndIf
EndIf
EndIf
RestArea(aAreaSA2)
RestArea(aArea)
Return lRetArmadilhas específicas
Esperar PARAMIXB. Quem vem do FA070TIT costuma ler PARAMIXB[1]. Aqui não
há argumento; leia a SE2.
Recusar em silêncio. O padrão não avisa. Use Help() ou equivalente antes
de devolver .F., e ConOut quando a baixa vier de rotina automática.
Perguntar ao usuário quando não há usuário. Sem ninguém para responder, um
MsgYesNo pode travar a thread. Guarde com IsBlind().
Mexer na posição das tabelas. O padrão continua usando a SE2 depois do
retorno. Salve e restaure a área de tudo que você reposicionar, como no exemplo.
Usar o ponto de entrada como gatilho de gravação. Ele roda antes da baixa existir. Para reagir a uma baixa que já aconteceu, o lugar é outro ponto de entrada.
Continue por aqui
- Vídeo
DesenvolvimentoReferência técnica
F340VALOK: o ponto de entrada que barra o OK da compensação a pagar
F340VALOK roda ao clicar OK na lista de títulos da compensação a pagar, recebe a lista em PARAMIXB e, retornando .F., mantém o usuário na lista.
- Vídeo
DesenvolvimentoReferência técnica
F340VLD: o ponto de entrada que barra a compensação no Contas a Pagar
F340VLD roda ao confirmar a primeira tela da compensação a pagar (FINA340), sem PARAMIXB. Retornando .F., a tela não fecha e nenhum título chega a ser listado.
- Vídeo
DesenvolvimentoReferência técnica
F40DELPR: o ponto de entrada que troca a baixa do provisório pela exclusão
F40DELPR roda ao abrir a substituição de título provisório no Contas a Receber, sem PARAMIXB. Retornando .T., o provisório é excluído em vez de baixado.