Árvore de páginas

Para utilizar o processo de Compensação Automática Contas a Pagar é necessário chamar a função: FinCmpAut.
A compensação pode ser realizada de N para N: N adiantamentos/devoluções (PA ou NDF) para N títulos (NF, DP, etc.) ou vice-versa.

O estorno será aplicado a todas as compensações realizadas entre os títulos informados em aNF e aEstorno, não sendo possível escolher uma sequência específica. 

Cancelamento

Ao cancelar a compensação, para definir se será gerado o movimento de estorno na SE5, ou se o movimento será excluído da SE5, veja o ponto de entrada MaIntDel.

Compensação Automática com as mesmas regras do FINA340

O parâmetro MV_IMPCOM determina se a compensação automática de títulos a pagar será realizada no modelo legado (fonte apartado) ou com as regras do FINA340 (onde existe todo o processo de retenção dos impostos).

Utilização do parâmetro MV_IMPCOM


Parâmetros da função:

PosiçãoParâmetroTipo Descrição
1aNFarrayVetor com os RECNOs das notas a serem compensadas
2aPA_NDFarrayVetor com os RECNOs dos PAs/NDFs a serem compensados
3aContabilarrayVetor de 3 posições:  [1] - Contabiliza Online, [2] - Aglutina os movimentos contábeis, [3] - Mostra lançamento contábil
4bBlockbBlockBloco de código que será executado após cada compensação (Geração dos movimentos na tabela SE5).
5aEstornoarrayVetor de 1 elemento. Esse elemento será um outro vetor, contendo os RECNOs (SE2) a serem cancelados.
6nSldCompnuméricoNumérico com valor determinado a ser compensado. Caso não seja informado será considerado o saldo de cada título.
7dBaixadateData de realização da compensação
8nTaxaPAnuméricoTaxa de movimento a ser considerada no PA para moedas estrangeiras
9nTaxaNFnuméricoTaxa de movimento a ser considerada na NF em moedas estrangeiras
10nHdlnuméricoCabeçalho do arquivo contábil (Default = 0)
11nOperacaonuméricoNa operação de estorno/exclusão determina a ação que será realizada nos movimentos da compensação. 2 = Gera movimento de estorno, 3=Exclui os movimentos
12aRecSe5arrayVetor que contém os RECNOsda SE5 para posterior contabilização
13aNDFDados arrayVetor com as informações das NDFs
14lHelplógicoInforme .T. se deseja exibir o Help dos pagamentos antecipados que não possuem movimentação bancária



Exemplo #01 - Rotina automática
#INCLUDE "Protheus.ch"
#INCLUDE "RWMAKE.CH"
#INCLUDE "TBICONN.CH"

Static __COMPAUT := Nil

User Function CMPAUTOMA()
    Local lRet := .F.
    Local cQry := ""
    Local aTipos := {"NF ", "PA ", "NDF"}
    Local cTblTmp := ""
    Local aNF := {}
    Local aPA_NDF := {}
    Local aContabil := {}
    Local bBlock := Nil
    Local aEstorno := {}
    Local nSldComp := 0
    Local nTaxaPA := 0
    Local nTaxaNF := 0
    Local nHdl := 0
    Local nOperacao := 0
	Local aRecSE5 := {}
	Local aNDFDados := {}
	Local lHelp := .T.

    If __COMPAUT == Nil
        cQry := "SELECT E2_TIPO TIPO, R_E_C_N_O_ R_E_C_N_O FROM " + RetSqlName("SE2") + " "
        cQry += "WHERE E2_SALDO > 0 AND E2_TIPO IN (?) "
		cQry += "AND D_E_L_E_T_ = ' ' "
        cQry += "ORDER BY E2_TIPO" 
        cQry := ChangeQuery(cQry)
        __COMPAUT := FWPreparedStatement():New(cQry)
    EndIf

    __COMPAUT:SetIn(1, aTipos)
    cQry := __COMPAUT:GetFixQuery()
    cTblTmp := MpSysOpenQuery(cQry)

    While (cTblTmp)->(!Eof())
        If (cTblTmp)->TIPO $ MVPAGANT+"|"+MV_CPNEG
            Aadd(aPA_NDF, (cTblTmp)->R_E_C_N_O) 
        Else
            Aadd(aNF, (cTblTmp)->R_E_C_N_O)
        EndIf 

        (cTblTmp)->(DbSkip()) 
        lRet := .T.
    EndDo 

    (cTblTmp)->(DbCloseArea())
    cTblTmp := ""

    If lRet
        Pergunte("AFI340", .F.)
        lContabiliza := MV_PAR11 == 1
        lAglutina := MV_PAR08 == 1
        lDigita := MV_PAR09 == 1

        lRet := FinCmpAut(aNF, aPA_NDF, aContabil, bBlock, aEstorno, nSldComp, dDatabase, nTaxaPA ,nTaxaNF, nHdl, nOperacao, aRecSE5, aNDFDados, lHelp)

        If lRet
            Alert("Compensação realizada com sucesso")
        Else
            Alert("Ocorreu um erro no processo de compensação")
        EndIf
	Else
		Alert("Não existem dados a serem compensados")     
	EndIf

Return Nil



Exemplo #02 - Rotina automática para compensação ou estorno
#INCLUDE "PROTHEUS.CH"
#include "tbiconn.ch"

user function xCmpCP()
    local aPerg as array
    local aRet as array
    local aEstorno as array
    local aRecTit as array
    local aRecCmp as array
    local aRecEst as array
    local cRecTit as character
    local cRecCmp as character
    local cJanela as character
    local cCodCanc as character
    local cValor as character
    local lContabiliza as logical
    local lAglutina as logical
    local lDigita as logical
    local lHelp as logical
    local nSldComp as numeric
    local nHdl as numeric
    local nOperacao as numeric

    cJanela := "Compensação automática CP"    
    aPerg := {}
    aRet := {}
    aEstorno := {}
    aRecTit := {}
    aRecCmp := {}
    aRecEst := {}
    cValor := cCodCanc := cRecTit := cRecCmp := replicate(" ",50)
    nSldComp = 0   
    nHdl := 0
    nOperacao := 0 
    lHelp := .F.
    
    PREPARE ENVIRONMENT EMPRESA "T1" FILIAL "D MG 01 " MODULO "FIN"
        conOut("INICIO DA ROTINA AUTOMATICA")

        PERGUNTE("AFI340",.F.)
        lContabiliza := MV_PAR11 == 1
        lAglutina := MV_PAR08 == 1
        lDigita := MV_PAR09 == 1

        aAdd(aPerg,{1, 'RecNo título de partida', cRecTit, "@", nil, nil, nil, 50, .T.})
        aAdd(aPerg,{1, 'RecNo título a compensar', cRecCmp, "@", nil, nil, nil, 50, .T.})
        aAdd(aPerg,{2, 'Comp/Est?', "1", {"1=Compensação","2=Estorno"}, 100, nil, .T.})
        aAdd(aPerg,{1, 'Valor', cValor, "@", nil, nil, nil, 50, .F.})

        if paramBox(aPerg, cJanela, aRet)
            aAdd(aRecTit, val(aRet[1]))
            if aRet[3] = "1"
                aAdd(aRecCmp, val(aRet[2]))
            else
                aAdd(aRecEst, val(aRet[2]))
                nOperacao := 2 // 2 = Gera movimento de estorno, 3=Exclui os movimentos
                aEstorno := {aRecEst}
            endif
            if !Empty(AllTrim(aRet[4]))
                nSldComp := val(aRet[4])
            else
                nSaldo := nil
            endif

            if FinCmpAut(aRecTit, aRecCmp, {lContabiliza,lAglutina,lDigita}, /*bBlock*/, aEstorno, nSldComp, dDatabase, /*nTaxaPA*/,/*nTaxaNF*/, nHdl, nOperacao, /*aRecSE5*/, /*aNDFDados*/, lHelp)           
                conOut("Processo concluido com exito.")
            else
                conOut("Processo nao concluido.")            
            endif
        endif

        conOut("FIM DA ROTINA AUTOMATICA")
    RESET ENVIRONMENT
Return nil