Jump to content
Fivewin Brasil

Rotina para Tratamento de Retorno de Boleros, pelo ACBRmonitor


marcioe

Recommended Posts

STATIC FUNCTION BolRetorno()
   ACBR_Pegar_Retorno()
RETURN NIL
////////////////////////////////////////////////////////////////////////////////    
Function ACBR_Pegar_Retorno()  
   LOCAL cRetDir := GetPvProfString("BOLETO", "DirArquivoRetorno", "", cACBrFld+"\"+cACBrIni), nSlc := SELECT()
   LOCAL lLerRet := GetPvProfString("BOLETO", "LerCedenteRetorno", "0", cACBrFld+"\"+cACBrIni)
   LOCAL aFiles    := ""
   LOCAL cLinha    := ""
   LOCAL aRetorno  := {}
   LOCAL oTxt, nRat
   LOCAL cF_ini := ALLTRIM(GetPvProfString( "ACESSOS", "ACBrIniFi", " ", ".\siscom.ini"))
   IF FILE(cF_ini) ; ACBr_Ler_Ini(cF_Ini) ; ENDIF // Forçar leitura do arquivo .ini

   IF ! lIsDir( cRetDir )
		SysRefresh() ; MsgAlert("Diretório Arquivo Retorno (DirArquivoRetorno) não definido no "+cACBrFld+"\"+cACBrIni, "Atenção")
		RETURN(.f.)
   ENDIF
   IF lLerRet <> "1"
		SysRefresh() ; MsgAlert("Ler Dados Cedente Retorno (LerCedenteRetorno) não habilitado no "+cACBrFld+"\"+cACBrIni, "Atenção")
		RETURN(.f.)
   ENDIF
   
   USE BANCOS SHARED NEW
   ordListClear()
   OrdListAdd("BANCOS", "BANCOD", "BANNOM")

	IF ! SelectBanco() // Posiciona no registro do Banco, caso existam vários.
	   CLOSE BANCOS
	   SELECT(nSlc)
	   RETURN(.f.)
	ENDIF
   
	ACBR_GravaCedente()
	
   CLOSE BANCOS
   SELECT( nSlc )

   IF FILE(cRetDir+"\Retorno.ini")
      IF fErase(cRetDir+"\Retorno.ini") = -1
      	MsgStop("Favor excluir o arquivo "+cRetDir+"\Retorno.ini"+" manualmente.","Atenção")
         RETURN(.F.)
      ENDIF
   ENDIF
   
   aFiles := cGetFile("Retornos(*.ret)|*.RET|Retornos(*.rst)|*.RST" ,"Selecione o Arquivo!", , cRetDir)
   IF EMPTY(ALLTRIM(aFiles))
   	MsgStop("ERRO na Abertura do Arquivo!","Atenção")
      RETURN(.F.)
   ENDIF
   cMD5ret := HB_MD5File(aFiles)
   IF RetJaProc( cMD5ret )
      nOpc := MyAlert("Arquivo já processado. O que gostaria de fazer?", {"Ver", "Porcessar", "Retornar"}, "Já processado")
      IF nOpc < 1 .OR. nOpc > 2 ; RETURN(.F.) ; ENDIF
      IF nOpc = 1 ; CntChkRet(aFiles) ; RETURN(.F.) ; ENDIF
   ENDIF
   
   cCmd           := ""
   //LIMPAR LISTA
   IF ! ACBR_BOL_Comando("BOLETO.LimparLista", ["]+cCmd+["] ) ; RETURN .F. ; ENDIF
    
   //CONFIGURAR CEDENTE
   cCmd       := cACBrFld+"\cedente.ini"
   IF ! ACBR_BOL_Comando("BOLETO.ConfigurarDados", ["]+cCmd+["] ) ; RETURN .F. ; ENDIF

   cCmd           := ""
   IF ! ACBR_BOL_Comando( "BOLETO.LimparLista", ["]+cCmd+["] ) ; RETURN .F. ; ENDIF
   
   nRat := Rat( "\", aFiles )
   cFld := Subs( aFiles, 1, nRat )
   cCmd := cFld+[","]+cFileName(aFiles)
   IF ! ACBR_BOL_Comando( "BOLETO.LerRetorno", ["]+cCmd+["] ) ; RETURN .F. ; ENDIF
   
   ACBR_END()

   SysWait(0.5) ; SysRefresh() // Dar tempo para o ACBr salvar o arquivo
   nTenta := 0
   WHILE ! FILE(cRetDir+"\Retorno.ini")
      SysWait(0.5) ; SysRefresh() // Dar tempo para o ACBr salvar o arquivo
      IF FILE(cRetDir+"\Retorno.ini") ; EXIT ; ENDIF
      nTenta ++ ; IF nTenta > 10 ; EXIT ; ENDIF // Não esperar mais que 5 segundos.
   END

   SysWait(0.5) ; SysRefresh() // Dar tempo para o ACBr salvar o arquivo
   IF ! FILE(cRetDir+"\Retorno.ini")
   	MsgStop("ERRO na leitura do Arquivo/Retorno!","Atenção")
      RETURN(.T.)
   ENDIF

   STORE "" TO ret_numerodoc, ret_nossonro, ret_id_ocorren, ret_nm_ocorren, ret_mot_rejeic
   STORE 0 TO ret_vltitulo, ret_vltaxa, ret_vlabatim, ret_vldesconto, ret_vljuros, ret_vlmulta, ret_vlpago
   STORE CTOD(" ") TO ret_dtvcto, ret_data, ret_dtocorrenc, ret_dtcredito
    
   oTxt := TTxtFile():New( cRetDir+"\Retorno.ini" )
   oTxt:Gotop()
   FOR i = 1 TO oTxt:RecCount() // oTxt:nTLines
     	cLinha := oTxt:cLine
      IF 	 AT("Vencimento=", cLinha) <> 0
      		 ret_dtvcto  	 := CTOD(Subs(cLinha,12,10))
      ELSEIF AT("DataDocumento=", cLinha) <> 0	
				 // DataDocumento=FileDate(aFiles)
		ELSEIF AT("NumeroDocumento=", cLinha) <> 0				
				 ret_numerodoc  := ALLTRIM(Subs(cLinha,17,15))
		ELSEIF AT("DataProcessamento=", cLinha) <> 0							
				 ret_data  		 := CTOD(Subs(cLinha,19,10))
		ELSEIF AT("NossoNumero=", cLinha) <> 0								
				 ret_nossonro   := ALLTRIM(Subs(cLinha,13,17))
		ELSEIF AT("ValorDocumento=", cLinha) <> 0											
				 ret_vltitulo   := ConverteCartValor(Subs(cLinha,16,15))
		ELSEIF AT("DataOcorrencia=", cLinha) <> 0														
			 	 ret_dtocorrenc := CTOD(Subs(cLinha,16,10))
		ELSEIF AT("DataCredito=", cLinha) <> 0																	
				 ret_dtcredito  := CTOD(Subs(cLinha,13,10))
		ELSEIF AT("ValorDespesaCobranca=", cLinha) <> 0																				
				 ret_vltaxa     := ConverteCartValor(Subs(cLinha,22,15))
		ELSEIF AT("ValorAbatimento=", cLinha) <> 0																							
				 ret_vlabatim   := ConverteCartValor(Subs(cLinha,17,15))
		ELSEIF AT("ValorDesconto=", cLinha) <> 0			
				 ret_vldesconto := ConverteCartValor(Subs(cLinha,15,15))
		ELSEIF AT("ValorMoraJuros=", cLinha) <> 0						
				 ret_vljuros    := ConverteCartValor(Subs(cLinha,16,15))
		ELSEIF AT("ValorIOF=", cLinha) <> 0									
				 // ValorIOF=0            // 13
		ELSEIF AT("ValorOutrasDespesas=", cLinha) <> 0												
				 // ValorOutrasDespesas=0 // 14
		ELSEIF AT("ValorOutrosCreditos=", cLinha) <> 0															
				 ret_vlmulta := ConverteCartValor(Subs(cLinha,21,15))
		ELSEIF AT("ValorRecebido=", cLinha) <> 0																		
				 // ValorRecebido=237,61  // 16
				 ret_vlpago := ConverteCartValor(Subs(cLinha,15,15))
		ELSEIF AT("DescricaoTipoOcorrencia=", cLinha) <> 0
				 ret_id_ocorren := Subs(cLinha,25,2)
				 ret_nm_ocorren := Subs(cLinha,28,80)
            /* Tabela de ocorrências
             Os códigos de movimento '06', '09' e '17' estão relacionados com a descrição C047-C. Domínio: 
            '02' = Entrada Confirmada 
            '03' = Entrada Rejeitada 
            '04' = Transferência de Carteira/Entrada 
            '05' = Transferência de Carteira/Baixa 
            '06' = Liquidação 
            '07' = Confirmação do Recebimento da Instrução de Desconto
            '08' = Confirmação do Recebimento do Cancelamento do Desconto
            '09' = Baixa 
            '11' = Títulos em Carteira (Em Ser) 
            '12' = Confirmação Recebimento Instrução de Abatimento 
            '13' = Confirmação Recebimento Instrução de Cancelamento Abatimento 
            '14' = Confirmação Recebimento Instrução Alteração de Vencimento 
            '15' = Franco de Pagamento 
            '17' = Liquidação Após Baixa ou Liquidação Título Não Registrado 
            '19' = Confirmação Recebimento Instrução de Protesto 
            '20' = Confirmação Recebimento Instrução de Sustação/Cancelamento de Protesto 
            '23' = Remessa a Cartório (Aponte em Cartório) 
            '24' = Retirada de Cartório e Manutenção em Carteira 
            '25' = Protestado e Baixado (Baixa por Ter Sido Protestado) 
            '26' = Instrução Rejeitada 
            '27' = Confirmação do Pedido de Alteração de Outros Dados 
            '28' = Débito de Tarifas/Custas */
		ELSEIF AT("MotivoRejeicao", cLinha) <> 0
   	       ret_mot_rejeic := ALLTRIM(Subs(cLinha,15,80))
				 AADD(aRetorno, {ret_dtvcto, ret_numerodoc, ret_data, ret_nossonro, ret_vltitulo, ret_dtocorrenc, ret_dtcredito,;
                             ret_vltaxa, ret_vlabatim, ret_vldesconto, ret_vljuros, ret_vlmulta, ret_vlpago, ret_id_ocorren,;
                             ret_nm_ocorren, ret_mot_rejeic})
             STORE "" TO ret_numerodoc, ret_nossonro, ret_id_ocorren, ret_nm_ocorren, ret_mot_rejeic
             STORE 0 TO ret_vltitulo, ret_vltaxa, ret_vlabatim, ret_vldesconto, ret_vljuros, ret_vlmulta, ret_vlpago
             STORE CTOD(" ") TO ret_dtvcto, ret_data, ret_dtocorrenc, ret_dtcredito
		ENDIF
		oTxt:skip()
   NEXT
   oTxt:Close()
   
   IF LEN(aRetorno) > 0
      // Excluir qualquer registro referente ao arquivo .ret
      REMRET->(DBSELECTAREA())
      REMRET->(DBSETORDER(3))
      IF REMRET->(DBSEEK( cMD5ret ))
         WHILE ! REMRET->(EOF())
            IF REMRET->ITEM02 <> cMD5ret ; EXIT ; ENDIF
            TRY
               REMRET->(RLOCK())
               REMRET->(DBDELETE())
               REMRET->(DBUNLOCK())
            CATCH oErr
            END
            REMRET->(DBSKIP())
         END
      ENDIF
      REMRET->(dbGoBottom())
      FOR nOc := 1 TO LEN(aRetorno)
         REMRET->(DBAPPEND())
         REPLACE REMRET->IDUNIC WITH GeraIdUnico()    // ID único (Salvo em vendas e itens de vendas)                         
         REPLACE REMRET->ITEM01 WITH aRetorno[nOc,02] // Número do documento
         REPLACE REMRET->ITEM02 WITH cMD5ret          // MD5 do arquivo .ret processado                                      
         REPLACE REMRET->ITEM03 WITH aRetorno[nOc,02] // Número do documento                                                  
         REPLACE REMRET->ITEM04 WITH aRetorno[nOc,14] // ID da ocorrência - Veja Tabela de ocorrências em ACBR_Pegar_Retorno()
         REPLACE REMRET->ITEM05 WITH aRetorno[nOc,15] // Descrição da ocorrência                                              
         REPLACE REMRET->ITEM06 WITH aRetorno[nOc,01] // Vencimento                                                           
         REPLACE REMRET->ITEM07 WITH aRetorno[nOc,03] // Data do processamento                                                
         REPLACE REMRET->ITEM08 WITH aRetorno[nOc,05] // Valor do documento                                                   
         REPLACE REMRET->ITEM09 WITH aRetorno[nOc,06] // Data da ocorrência                                                   
         REPLACE REMRET->ITEM10 WITH aRetorno[nOc,07] // Data do crédito                                                      
         REPLACE REMRET->ITEM11 WITH aRetorno[nOc,08] // Valor despesa cobrança                                               
         REPLACE REMRET->ITEM12 WITH aRetorno[nOc,09] // Valor do abatimento                                                  
         REPLACE REMRET->ITEM13 WITH aRetorno[nOc,10] // Valor do desconto                                                    
         REPLACE REMRET->ITEM14 WITH aRetorno[nOc,11] // Valor Mora Juros                                                     
         REPLACE REMRET->ITEM15 WITH aRetorno[nOc,12] // Valor Multa                                                          
         REPLACE REMRET->ITEM16 WITH aRetorno[nOc,13] // Valor Recebido                                                       
      NEXT
      REMRET->(dbGoTop())
      CntChkRet(aFiles)
   ELSE
      SysRefresh() ; MsgAlert("Arquivo de retorno sem ocorrências válidas","Aviso")
   ENDIF
   SELECT(nSlc)
RETURN(.T.)

Adapte à sua necessidade.

Link to comment
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Reply to this topic...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

Loading...
×
×
  • Create New...