Histórico da Página
Índice
01. VISÃO GERAL
Execução automática (ExecAuto) da rotina de liquidação a receber (FINA460).
02. PARÂMETROS
Posição | Tipo | Nome | Descrição |
---|---|---|---|
1 | Numérico | nPosArotina | Utilizado para indicar a operação a ser executada. Utilizada apenas pela chamada da rotina padrão pelo menu. Enviar NIL ou 0 (zero). |
2 | Vetor | aAutoCab | Utilizado para enviar dados referentes ao processo, como:
|
| ||||||||
3 | Vetor | aAutoItens | Vetor utilizado para envio dos dados referentes aos títulos a serem gerados, como:
Exemplo: Aadd(aItens,{; | |||||
4 | Numérico | nOpcAuto | Processo que se deseja realizar: 3 = Liquidação 4 = Re-liquidação 5 = Cancelamento de Liquidação | |||||
5 | Caractere | cAutoFil | 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.
| |||||
6 | Caractere | cNumLiqCan | Número da liquidação que se quer cancelar. Enviado apenas em caso de nOpcAuto = 5 | |||||
7 | Vetor | aRotAutoVA | Vetor utilizado para envio dos valores acessórios dos títulos que serão gerados. | |||||
8 | Numérico | nOutrMoed | Tratamento para outras moedas (idêntico à tela de filtro). 1 = Converte | |||||
9 | Numérico | nTxNegoc | Taxa da moeda da negociação.
| |||||
10 | Numérico | nTpTaxa | Tipo da taxa da negociação. 1=Fixa
| |||||
11 | Caractere | cFunOrig | O valor desta variável será gravada no campo E1_ORIGEM.
| |||||
12 | Numérico | nTxCalJur | ||||||
13 | Caractere | cFilSQL | 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.
...
Bloco de código | ||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|
| ||||||||||||
#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 |
Bloco de código | ||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|
| ||||||||||||
#INCLUDE 'Protheus.ch' User Function TST460() Local nX := 0 Local aCab := {} Local aItens := {} Local cFiltro cFilSQL := "" //filtro quem conterá os títulos que serão liquidados, gerado com base no array aTitOri Local aTitOri := {} Local cCliLiq := '000001' Local cLojaLiq := '01' Local cNaturez := '000001' Local nMoeda := 1 Local cTipoLiq := 'FT ' Local cCond := "" Private lMsErroAuto := .F. Private lAutoErrNoFile := .T. Aadd(aTitOri,{; 'D MG 01 ',; //E1_FILIAL 'LFG',; //E1_PREFIXO 'LFG100001',; //E1_NUM ' ',; //E1_PARCELA 'NF ',; //E1_TIPO '000001',; //E1_CLIENTE '01'; //E1_LOJA }) Aadd(aItens,{; {"E1_PREFIXO" ,'LFG' },; {'E1_NUM' , 'LFG100002' },; {'E1_PARCELA' , 'A' },; {'E1_VENCTO' , STOD('20190630') },; {'E1_VLCRUZ' , 500.00 } }) Aadd(aItens,{; {"E1_PREFIXO" ,'LFG' },; {'E1_NUM' , 'LFG100002' },; {'E1_PARCELA' , 'B' },; {'E1_VENCTO' , STOD('20190730') },; {'E1_VLCRUZ' , 500.00 } }) //Filtro do Usuario cFiltro := " (" For nX := 1 To Len(aTitOri) If nX > 1 cFiltro += " .Or. " EndIf cFiltro += " (" cFiltro += " E1_FILIAL == '" + aTitOri[nX][1] + "' .And. " cFiltro += " E1_PREFIXO == '" + aTitOri[nX][2] + "' .And. E1_NUM == '" + aTitOri[nX][3] + "' .And. " cFiltro += " E1_PARCELA == '" + aTitOri[nX][4] + "' .And. E1_TIPO == '" + aTitOri[nX][5] + "' .And. " cFiltro += " E1_CLIENTE == '" + aTitOri[nX][6] + "' .And. E1_LOJA == '" + aTitOri[nX][7] + "' )" Next cFiltro += ") .And. E1_SITUACA $ '0FG' .And. E1_SALDO > 0 .And. Empty(E1_NUMLIQ) " //Array do processo automatico (aAutoCab) aCab:={{"cCondicao" ,cCond },; {"cNatureza" ,cNaturez },; {"E1_TIPO" ,cTipoLiq },; {"cCliente" ,cCliLiq },; {"nMoeda" ,nMoeda },; {"cLoja" ,cLojaLiq }} Fina460(,aCab , aItens , 3, cFiltro) Returnlocal 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 |
Bloco de código | ||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|
| ||||||||||||
#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 |