Árvore de páginas

01. VISÃO GERAL

Execução automática (ExecAuto) da rotina de liquidação a receber (FINA460).

02. PARÂMETROS


PosiçãoTipoNome

Descrição

1NumériconPosArotina

Utilizado para indicar a operação a ser executada. Utilizada apenas pela chamada da rotina padrão pelo menu. Enviar NIL ou 0 (zero).

2VetoraAutoCabUtilizado para enviar dados referentes ao processo, como:
  • Condição de pagamento (Se enviado é gravado no cabeçalho da liquidação, porém a rotina não reprocessa nem valida o vetor aAutoItens de acordo com a condição de pagamento, ou seja, a customização do cliente deve criar o vetor aAutoItens de acordo com a condição e enviar para a ExecAuto devidamente parametrizado - vide exemplo 1 desse documento).
  • Natureza do título a ser gerado
  • Tipo do título a ser gerado
  • Cliente do título a ser gerado
  • Moeda do título a ser gerado
  • Loja do cliente do título a ser gerado
  • Pix (default .T.)
3VetoraAutoItens

Vetor utilizado para envio dos dados referentes aos títulos a serem gerados, como:

  • Prefixo
  • Numero do Título
  • Parcela (Se não enviado, sistema irá calcular automaticamente as parcelas de acordo com parâmetro MV_1DUP)
  • Banco
  • Agencia
  • Conta
  • Numero do cheque (dará origem ao numero do título a ser gerado)
  • Emitente do cheque
  • Data de vencimento do título
  • Valor do cheque/título
  • Valor do acréscimo (quando houver)
  • Valor do decréscimo (quando houver)
  • Valor Adicional Negociado: deverá ser utilizada a variável nValorJur.

Exemplo:

Aadd(aItens,{;
{"E1_PREFIXO" ,'LIQ' },;
{'E1_NUM' , '300' },;
{'E1_PARCELA' , 'A' },;
{'E1_VENCTO' , STOD('20210215') },;
{'E1_VLCRUZ' , 1000.00 },;
{'nValorJur', 10}})

4NumériconOpcAutoProcesso que se deseja realizar:
3 = Liquidação
4 = Re-liquidação
5 = Cancelamento de Liquidação
5CaracterecAutoFil

Expressão ADVPL para filtro de seleção dos títulos geradores da liquidação (a serem liquidados). Será utilizado se o parâmetro cFilSQL não for informado.

Importante

Recomenda-se o uso do filtro em SQL (cFilSQL - posição 13), pois o filtro em ADVPL é limitado a 2000 caracteres. Mais informações em: Filter greater than 2000 bytes

6CaracterecNumLiqCanNúmero da liquidação que se quer cancelar. Enviado apenas em caso de nOpcAuto = 5
7VetoraRotAutoVA

Vetor utilizado para envio dos valores acessórios dos títulos que serão gerados.

8NumériconOutrMoed

Tratamento para outras moedas (idêntico à tela de filtro).

1 = Converte
2 = Não considera
3 = Variação monetária

9NumériconTxNegoc

Taxa da moeda da negociação.

Importante

Obrigatório apenas para a nOutrMoed = 3 - Variação monetária. É inicializado com a taxa do dia da negociação.

10NumériconTpTaxa

Tipo da taxa da negociação.

1=Fixa
2=Variável

Importante

Obrigatório apenas para a nOutrMoed = 3 - Variação monetária. É inicializado com 2 - Variável.

11CaracterecFunOrig

O valor desta variável será gravada no campo E1_ORIGEM.

Importante

Se esta variável não for informada, será gravada a informação da função chamadora da Execauto.

12NumériconTxCalJur
13CaracterecFilSQL

Expressão SQL para filtro de seleção dos títulos geradores da liquidação (a serem liquidados). Substitui o filtro em ADVPL (cAutoFil).

03. CONDIÇÃO DE PAGAMENTO

1) Se enviado condição de pagamento no array aAutoCab
A customização do cliente deve criar o array aAutoItens de acordo com a condição e enviar para a execauto devidamente parametrizado. Deve ser utilizada a função 'Condicao' para retornar a quantidade de parcelas.

2) Se NÃO enviado condição de pagamento no array aAutoCab
A customização do cliente deve criar o array aAutoItens manualmente e enviar para a execauto devidamente parametrizado.

3) Se enviado a(s) parcela(s) no array aAutoItens
A rotina irá gravar essa informação no campo E1_PARCELA dos títulos gerados.

4) Se NÃO enviado parcela no array aAutoItens
A rotina irá gravar o campo E1_PARCELA dos títulos gerados de acordo com o parâmetro MV_1DUP, DE FORMA sequencial.

04. EXEMPLO DE UTILIZAÇÃO


Exemplo 01 - Montando o vetor aAutoItens de acordo com a condição de pagamento
#include "PROTHEUS.CH"

User Function UFINA460()
	Local cNum := ""
	Local nZ := 0
	Local aCab := {}
	Local aItens := {}
	Local nOpc := 3 //3-Liquidação,4-Reliquidacao,5-Cancelamento da liquidação
	Local cFiltro := ""
	Local cLiqCan := Space(6) //numero da liquidacao a cancelar
	Local aParcelas := {}
	Local nValor := 2000 //Valor a liquidar
	Local cCond := '001' //Condicao de pagamento 1x
	Local nRadio := 1
	Local oRadio
	Local oLiqCan
    Local lAutoPix := .F.

	cNum := padr("200", tamSx3("E1_NUM")[1])

	//Tela utilizada apenas para exemplo
	nOpca := 0
	DEFINE MSDIALOG oDlg FROM 094,1 TO 240,300 TITLE "Liquidação Automatica" PIXEL
	@ 010,010 Radio oRadio VAR nRadio;
	ITEMS "Liquidar",;
	"Reliquidar",;
	"Cancelar";
	3D SIZE 50,10 OF oDlg PIXEL ;
	ON CHANGE ( oLiqCan:lReadOnly := If(nRadio != 3, .T., .F.))

	@ 022,070 SAY "Cancel. Liquidação:" SIZE 49, 07 OF oDlg PIXEL
	@ 030,070 MSGET oLiqCan VAR cLiqCan Valid !Empty(cLiqCan) SIZE 49, 11 OF oDlg PIXEL hasbutton

	DEFINE SBUTTON FROM 55,085 TYPE 1 ENABLE OF oDlg ACTION ( nOpca := 1, oDlg:End())
	DEFINE SBUTTON FROM 55,115 TYPE 2 ENABLE OF oDlg ACTION ( nOpca := 0, oDlg:End())

	ACTIVATE MSDIALOG oDlg CENTERED

	If nOpca == 1
		If nRadio == 1 .or. nRadio == 2
			If nRadio == 1 //liquidacao
				nOpc := 3
				//Filtro do Usuário
				cFiltro := "E1_FILIAL == '"+xFilial("SE1") + "' .And. "
				cFiltro += "E1_CLIENTE == '000100' .And. E1_LOJA == '01' .And. "
				cFiltro += "E1_SITUACA $ '0FG' .And. E1_SALDO > 0 .and. "
				cFiltro += 'Empty(E1_NUMLIQ)'
			Else
				nOpc := 4 //reliquidacao
				//Filtro do Usuário
				cFiltro := "E1_FILIAL == '"+xFilial("SE1") + "' .And. "
				cFiltro += "E1_CLIENTE == '000100' .And. E1_LOJA == '01' .And. "
				cFiltro += "E1_SITUACA $ '0FG' .And. E1_SALDO > 0 .and. "
				cFiltro += '!Empty(E1_NUMLIQ)'
			Endif

			//Array do processo automatico (aAutoCab)
			aCab := { {"cCondicao" ,cCond },;
			{"cNatureza" ,"001" },;
			{"E1_TIPO" ,"NF " },;
			{"cCLIENTE" ,"000100"},;
			{"nMoeda" ,1 },;
			{"cLOJA" ,"01" },;
            {"AUTMRKPIX", lAutoPix }} 
            //------------------------------------------------------------
			//Monta as parcelas de acordo com a condição de pagamento
			//------------------------------------------------------------
			aParcelas := Condicao( nValor, cCond,, dDataBase)

			//--------------------------------------------------------------
			//Não é possivel mandar Acrescimo e Decrescimo junto.
			//Se mandar os dois valores maiores que zero considera Acrescimo
			//--------------------------------------------------------------
			For nZ := 1 to Len(aParcelas)
				//Dados das parcelas a serem geradas
				Aadd(aItens,{{ "E1_PREFIXO", "LIQ" },; //Prefixo
				{"E1_BCOCHQ" , "CX1" },; //Banco
				{"E1_AGECHQ" , "00001" },; //Agencia
				{"E1_CTACHQ" , "0000000001" },; //Conta
				{"E1_NUM" , cNum },; //Nro. cheque (dará origem ao numero do titulo)
				{"E1_EMITCHQ" , "EXECAUTO" },; //Emitente do cheque
				{"E1_VENCTO" , aParcelas[nZ,1]},; //Data boa
				{"E1_VLCRUZ" , aParcelas[nZ,2]},; //Valor do cheque/titulo
				{"E1_ACRESC" , 0 },; //Acrescimo
				{"E1_DECRESC" , 0 }}) //Decrescimo

				cNum := Soma1(cNum, Len( Alltrim(cNum)))
			Next nZ

			If Len( aParcelas) > 0
				//Liquidacao e reliquidacao
				//FINA460(nPosArotina,aAutoCab,aAutoItens,nOpcAuto,cAutoFil,cNumLiqCan)
				FINA460(, aCab, aItens, nOpc, cFiltro) //Inclusao

				// Este aviso funciona apenas para teste monousuario
				Alert("Liquidacao Incluida -> " + GetMv("MV_NUMLIQ"))
			Endif
		Else
			nOpc := 5
			//Cancelamento
			FINA460(,,, nOpc,, cLiqCan) //Cancelamento
			Alert("Liquidacao Cancelada -> " + cLiqCan)
		Endif
	EndIf

Return

Exemplo 02 - Montando o vetor aAutoItens manualmente, sem utilizar uma condição de pagamento
#INCLUDE 'Protheus.ch'

User Function TST460()
	Local nX        :=  0
	Local aCab      :=  {}
	Local aItens    :=  {}
	Local cFilSQL	:=  ""  //filtro quem conterá os títulos que serão liquidados, gerado com base no array aTitOri
	Local aTitOri   :=  {}     
	Local cNaturez  :=  '000001'
	Local nMoeda    :=  1
	Local cTipoLiq  :=  'FT '
	Local cCond     :=  ""

	local cLiqPref		:= 'FIN'
	local cLiqNum		:= '000000242'
	local cLiqParcela 	:= 'A'
	Local cLiqTipo 		:= "FT "
	local cLiqCli		:= '000001'
	local cLiqLoja		:= '01'
	local nValLiq		:= 2000
    Local lAutoPix := .F.

	Private lMsErroAuto     := .F.
	Private lAutoErrNoFile  := .T.
	
	Aadd(aTitOri,{'D MG 01 ', 'FIN', '000000001', 'A', 'NF ', '000001', '01'})
	Aadd(aTitOri,{'D MG 01 ', 'FIN', '000000001', 'B', 'NF ', '000001', '01'})

	Aadd(aItens,{{"E1_PREFIXO",cLiqPref}, {'E1_NUM', cLiqNum}, {'E1_PARCELA', cLiqParcela}, {'E1_VENCTO', dDatabase}, {'E1_VLCRUZ', nLiqVal}})	

	cFilSQL := " (" 
	For nX := 1 To Len(aTitOri)
		If nX > 1
			cFilSQL += " OR "
		EndIf 
		cFilSQL += " (" 
		cFilSQL += " E1_FILIAL  = '" + aTitOri[nX][1] + "' AND "
		cFilSQL += " E1_PREFIXO = '" + aTitOri[nX][2] + "' AND E1_NUM  = '" + aTitOri[nX][3] + "' AND "
		cFilSQL += " E1_PARCELA = '" + aTitOri[nX][4] + "' AND E1_TIPO = '" + aTitOri[nX][5] + "' AND "
		cFilSQL += " E1_CLIENTE = '" + aTitOri[nX][6] + "' AND E1_LOJA = '" + aTitOri[nX][7] + "' )"	
	Next nX
	cFilSQL += ") AND E1_SITUACA IN ('0','F','G') AND E1_SALDO > 0 AND LTRIM(E1_NUMLIQ) = '' "

	aCab := {}
	aAdd(aCab, {"cCondicao", 	cCond}) //Condição de pagamento
	aAdd(aCab, {"cNatureza", 	cNaturez}) //Natureza
	aAdd(aCab, {"E1_TIPO", 		cLiqTipo}) //Tipo
	aAdd(aCab, {"cCliente", 	cLiqCli}) //Cliente
	aAdd(aCab, {"cLoja", 		cLiqLoja}) //Loja
	aAdd(aCab, {"nMoeda",	 	nMoeda}) //Moeda
 	aAdd(aCab, {"AUTMRKPIX",    lAutoPix}) //Pix

	Fina460(/*nPosArotina*/,aCab,aItens,3,/*cFiltroADVPL*/,/*xNumLiq*/,/*xRotAutoVa*/,/*xOutMoe*/,/*xTxNeg*/,/*xTpTaxa*/,/*xFunOrig*/,/*xTxCalJur*/,cFilSQL)
Return
Exemplo 03 - Manipulando valor do título a ser liquidado
#Include "Protheus.ch"
#Include "rwmake.ch"
#Include "FWMVCDEF.ch"

Static nValTot      := 0
Static lCpoFK7      := Nil
Static FunName      := Nil
Static aIDDOC       := {}

User Function FINA460A()

Local aParam    := PARAMIXB
Local xRet      := .T.
Local oObj      := NIL
Local cIdPonto  := ''
Local cIdModel  := ''
Local nDescon   := 10
Local nI        := 0
Local cCli460   := ""
Local nValAux   := 0
Local nLenFO2   := 0
Local nValParc  := 0
Local nTxMul    := 10
Local nTxJur    := 1

If FunName == Nil
    FunName   := AllTrim(FunName())
EndIf

If FunName != "FINA460"
    If lCpoFK7 == Nil
        lCpoFK7   := FK7->(ColumnPos("FK7_CLIFOR")) > 0
    EndIf

    /*Taxa de Juros" (FO1_TXJUR), "Taxa da Multa" (FO1_TXMUL), "Val. Desconto" (FO1_DESCON) e "Vlr.Adic.Neg" (FO1_VLADIC), */

    If aParam <> NIL
        oObj := aParam[1]

        cIdPonto := aParam[2]
        cIdModel := aParam[3]

        If cIdPonto == 'FORMLINEPOS'
            If cIdModel == 'TITSELFO1'
                cTit    := Posicione( "FK7", 1, xFilial("FK7") + oObj:GetValue( "FO1_IDDOC" ), "FK7_NUM" )
                cCli460 := Posicione( "FK7", 1, xFilial("FK7") + oObj:GetValue( "FO1_IDDOC" ), "FK7_CLIFOR" )
                If aScan( aIDDOC, oObj:GetValue( "FO1_IDDOC" ) ) == 0
                    aAdd(aIDDOC, oObj:GetValue( "FO1_IDDOC" ) )
                    For nI := 1 to oObj:Length()
                        oObj:GoLine(nI)
                        nValAux := 0
                        If cCli460 == 'CDESCO' .And. cTit == oObj:GetValue("FO1_NUM") // Cliente com desconto
                            nValAux     := oObj:GetValue("FO1_TOTAL") - nDescon
                            oObj:LoadValue("FO1_DESCON", nDescon)
                            oObj:LoadValue("FO1_TOTAL", nValAux)
                        EndIf
                        If cCli460 == 'JURMUL' .And. cTit == oObj:GetValue("FO1_NUM")// Cliente com Juros e Multa
                            nValAux     := oObj:GetValue("FO1_TOTAL")
                            nDias       := dDataBase - FDtVento()
                            oObj:LoadValue("FO1_TXJUR", nTxJur)
                            oObj:LoadValue("FO1_VLJUR", ( nValAux * nTxJur * nDias ) / 100 )
                            oObj:LoadValue("FO1_TXMUL", nTxMul)
                            oObj:LoadValue("FO1_VLMUL", ( nValAux * nTxMul ) / 100 )
                            oObj:LoadValue("FO1_VLADIC", 14.5)
                            nValAux     := nValAux + oObj:GetValue("FO1_VLADIC") + oObj:GetValue("FO1_VLMUL") + oObj:GetValue("FO1_VLJUR")
                            oObj:LoadValue("FO1_TOTAL", nValAux)
                        EndIf
                        nValTot += nValAux
                    Next
                EndIf
                
            EndIf
        ElseIf cIdPonto == 'MODELPOS'

            If cIdModel == "FINA460A"
                oObjFO2 := oObj:GetModel("TITGERFO2")
                nLenFO2 := oObjFO2:Length()
                nValParc := ( nValTot / nLenFO2 )
                For nI := 1 to nLenFO2
                    oObjFO2:GoLine(nI)
                    oObjFO2:LoadValue("FO2_TXJUR", 2 )
                    oObjFO2:LoadValue("FO2_VALOR", nValTot)
                    oObjFO2:LoadValue("FO2_TOTAL", nValTot)
                Next
            EndIf
        EndIf
    EndIf
EndIf

Return xRet

Static Function FDtVento()

    Local dData := CTOD("  /  /  ")
    Local aArea := SE1->(GetArea())

    dData   := Posicione( "SE1", 1, xFilial("SE1") + FK7->(FK7_PREFIXO + FK7_NUM + FK7_PARCELA + FK7_TIPO + FK7_CLIFOR + FK7_LOJA ), "E1_VENCREA" )

    RestArea(aArea)

Return dData