Impedir Faturamento de Cliente Bloqueado

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.

Dan (Daniel Atilio)
Cristão de ramificação protestante. Especialista em Engenharia de Software pela FIB, graduado em Banco de Dados pela FATEC Bauru e técnico em informática pelo CTI da Unesp. Entusiasta de soluções Open Source e blogueiro nas horas vagas. Autor e mantenedor do portal Terminal de Informação.

Deixe uma resposta

Terminal de Informação