No artigo de hoje, vamos ver como impedir um faturamento caso o cliente esteja bloqueado.
Imagine o seguinte cenário:
a. O pessoal do vendas, fez um pedido de venda para determinado cliente
b. Nisso passou cerca de 30 ou 40 dias, e esse cliente começou a ficar inadimplente e apresentar riscos
c. O pessoal do financeiro vai e bloqueia o cliente (A1_MSBLQL)
d. Mas o pedido de venda já está liberado e apto a ser faturado
e. Nisso algum usuário desavisado, vai e fatura o pedido para o cliente
Para tratar esse tipo de situação, é necessário duas travas serem criadas, a primeira no ponto de entrada M410PVNF, para que se o usuário tentar faturar pelo outras ações no pedido, não seja permitido:
User Function M410PVNF()
Local lContinua := .T.
Local aArea := GetArea()
Local aAreaSA1 := SA1->(GetArea())
Local cBlqCli := ""
//Busca se o cliente ta bloqueado
cBlqCli := Posicione("SA1",1, xFilial("SA1") + SC5->C5_CLIENTE + SC5->C5_LOJACLI, "A1_MSBLQL")
//Se cliente estiver bloqueado, barra o faturamento.
If cBlqCli == "1"
lContinua := .F.
ExibeHelp("Help", "Faturamento não permitido! Cliente Bloqueado!", "Verifique o cadastro do Cliente!")
EndIf
RestArea(aAreaSA1)
RestArea(aArea)
Return lContinua
A outra no ponto de entrada M460MARK, ao tentar marcar na tela de documento de saída.
#INCLUDE 'TOTVS.CH'
#INCLUDE 'TOPCONN.CH'
User Function M460MARK()
Local aArea := GetArea()
Local aAreaC9 := SC9->(GetArea())
Local aAreaC5 := SC5->(GetArea())
Local lRet := .T.
Local cMarca := ParamIXB[1]
Local lInverte := ParamIXB[2]
Local cQuery := ""
Local cMsgBlq := ""
Pergunte("MT461A", .F.)
//Criando a consulta
cQuery += " SELECT " + CRLF
cQuery += " DISTINCT "
cQuery += " C9_CLIENTE, " + CRLF
cQuery += " C9_LOJA, A1_NOME " + CRLF
cQuery += " FROM "+RetSQLName("SC9")+" SC9 " + CRLF
cQuery += " INNER JOIN "+RetSQLName("SC5")+" SC5 ON (" + CRLF
cQuery += " SC5.D_E_L_E_T_='' " + CRLF
cQuery += " AND C5_FILIAL = C9_FILIAL " + CRLF
cQuery += " AND C5_NUM = C9_PEDIDO " + CRLF
cQuery += " ) " + CRLF
cQuery += " INNER JOIN "+RetSQLName("SA1")+" SA1 ON (" + CRLF
cQuery += " SA1.D_E_L_E_T_='' " + CRLF
cQuery += " AND A1_COD = C9_CLIENTE " + CRLF
cQuery += " AND A1_LOJA = C9_LOJA " + CRLF
cQuery += " AND A1_MSBLQL = '1' " + CRLF // 1 = Bloqueado.
cQuery += " ) " + CRLF
cQuery += " WHERE SC9.D_E_L_E_T_ = ' ' " + CRLF
cQuery += " AND C9_FILIAL='"+FWxFilial("SC9")+"' " + CRLF
cQuery += " AND C9_OK"+Iif(lInverte, "<>", "=")+ "'"+cMarca+"' " + CRLF
cQuery += " AND C9_CLIENTE >= '" + MV_PAR07 + "' AND C9_CLIENTE <= '" + MV_PAR08 + "' " + CRLF
cQuery += " AND C9_LOJA >= '" + MV_PAR09 + "' AND C9_LOJA <= '" + MV_PAR10 + "' " + CRLF
cQuery += " AND C9_DATALIB >= '" + dToS(MV_PAR11) + "' AND C9_DATALIB <= '" + dToS(MV_PAR12) + "' " + CRLF
cQuery += " AND C9_PEDIDO >= '" + MV_PAR05 + "' AND C9_PEDIDO <= '" + MV_PAR06 + "' " + CRLF
cQuery += " AND C9_BLEST = '' AND C9_BLCRED = ''" + CRLF
//Executando a Cláusula
TCQuery cQuery NEW ALIAS QRY_SC9
cMsgBlq := "Cliente(s) Bloqueado(s): " + CRLF + CRLF
While !QRY_SC9->(Eof())
lRet := .F.
cMsgBlq += AllTrim(QRY_SC9->C9_CLIENTE) + '-' + QRY_SC9->C9_LOJA + ": " + AllTrim(QRY_SC9->A1_NOME) + CRLF
QRY_SC9->(dbSkip())
EndDo
QRY_SC9->(DbCloseArea())
If !lRet
ExibeHelp("Help", cMsgBlq, "Verifique o cadastro dos clientes!")
Endif
RestArea(aAreaC5)
RestArea(aAreaC9)
RestArea(aArea)
//Restaurando a pergunta do botão Prep.Doc.
Pergunte("MT460A", .F.)
Return lRet
Artigo desenvolvido com base nos exemplos gentilmente cedidos por Fernando Sauer ( LinkedIn ).
Bom pessoal, por hoje é só.
Abraços e até a próxima.