Clipper On Line • Ver Tópico - Rotina para importar CTe

Rotina para importar CTe

Aqui você poderá oferecer suas Contribuições, Dicas e Tutoriais (Texto ou Vídeo) que sejam de interesse de todos.

Moderador: Moderadores

 

Rotina para importar CTe

Mensagempor Itamar M. Lins Jr. » 16 Dez 2021 11:04

Olá!
Usando os "bagulhos"(funções) do José Quintas!
********************************
FUNCTION CTeImportaXML(oDlgMain)
********************************
*
*
LOCAL oDlg, oFont, dhRec, cTitulo := "Importar CTe", dRecebido := Date(), cLocal
LOCAL lOk := .F.
PREPARE FONT oFont NAME "Verdana" WIDTH 0 HEIGHT -18

INIT DIALOG oDlg CLIPPER TITLE cTitulo Font oFont AT 0,0 SIZE 380,150

@ 005,035 Say "Recebimento:" size 130,20
@ 140,030 get oRecebido Var dRecebido size 100,30

@ 270,020 Button oBt Caption 'Cancelar'   Size 100,30  ON CLICK {||hwg_EndDialog()}
@ 270,070 Button oBt Caption 'Confirmar'  Size 100,30  ON CLICK {||lOk:=.t.,hwg_EndDialog()}

oDlg:Activate(,,,.T.)

IF !lOk
   Return .t.
ENDIF

cLocal :=  hb_GetEnv("USERPROFILE") + "\Downloads"

cArq := HWG_SelectFile( "Arquivos XML ( *.xml )", "*.xml", cLocal )

cStr := hb_MemoRead( cArq )

DirChange( cDirSist )

IF Empty( cStr )
   hwg_Msginfo("Não achou o arquivo XML")
   RETURN .T.
ENDIF

cTagProtCTe := XmlNode(cStr, "protCTe" )
IF Empty(cTagProtCTe)
   hwg_Msgstop( "TAG protCTe não localizada." )
   RETURN .T.
ENDIF
cTagInfProt := XmlNode(cStr, "infProt" )
IF Empty(cTagInfProt)
   hwg_Msgstop( "TAG infProt não localizada." )
   RETURN .T.
ENDIF   
cChCTe := XmlNode(cTagInfProt, "chCTe")

cTagIDE := XmlNode(cStr, "ide")
IF Empty(cTagIDE)
   hwg_Msgstop( "TAG <ide> não localizada." )
   RETURN .T.
ENDIF

cCCT     := XmlNode(cTagIDE, "cCT")
cCFOP    := XmlNode(cTagIDE, "CFOP")
cMod     := XmlNode(cTagIDE, "mod")
cSerie   := XmlNode(cTagIDE, "serie")
cNCT     := XmlNode(cTagIDE, "nCT")
dhEmi    := XmlNode(cTagIDE, "dhEmi")
dhEmi    := StrTran(dhEmi,"T"," "); dhEmi := SubStr(dhEmi,1,19); dhEmi := hb_StrToTS(dhEmi)         
dhSaiEnt := XmlNode(cTagIDE, "dhSaiEnt")
dhSaiEnt := StrTran(dhSaiEnt,"T"," "); dhSaiEnt := SubStr(dhSaiEnt,1,19); dhSaiEnt := hb_StrToTS(dhSaiEnt)
cTPCTe   := XmlNode(cTagIDE,"tpCTe")

If Empty(cNCT)
   hwg_Msgstop("CTe com problema."+hb_eol()+"Número da CTe, não informado.")
   RETURN .T.
EndIf
If Empty(dhEmi)
   hwg_Msgstop("CTe com problema."+hb_eol()+"DATA da emissão, não informada.")
   RETURN .T.
EndIf

cCMunEnv := XmlNode(cTagIDE, "cMunEnv")
cXMunEnv := XmlNode(cTagIDE, "xMunEnv")
cUFEnv   := XmlNode(cTagIDE, "cUFEnv")
cCMunIni := XmlNode(cTagIDE, "cMunIni")
cXMunIni := XmlNode(cTagIDE, "xMunIni")
cUFIni   := XmlNode(cTagIDE, "cUFIni")
cCMunFim := XmlNode(cTagIDE, "cMunFim")
cXMunFim := XmlNode(cTagIDE, "xMunFim")
cUFFim   := XmlNode(cTagIDE, "cUFFim")

cTagEmit := XmlNode(cStr, "emit")
IF Empty(cTagEmit)
   hwg_Msgstop( "TAG <emit> não localizada." )
   RETURN .T.
ENDIF

cCNPJ    := XmlNode(cTagEmit, "CNPJ")
cIE      := XmlNode(cTagEmit, "IE")
cXNome   := XmlNode(cTagEmit, "xNome")

cTagEnderEmit := XmlNode(cStr, "enderEmit")
IF Empty(cTagEnderEmit)
   hwg_Msgstop( "TAG <enderEmit> não localizada." )
   RETURN .T.
ENDIF

cXLgr    := XmlNode(cTagEnderEmit, "xLgr")
cNro     := XmlNode(cTagEnderEmit, "nro")
cXBairro := XmlNode(cTagEnderEmit, "xBairro")
cCMun    := XmlNode(cTagEnderEmit, "cMun")
cXMun    := XmlNode(cTagEnderEmit, "xMun")
cCEP     := XmlNode(cTagEnderEmit, "CEP")
cUF      := XmlNode(cTagEnderEmit, "UF")
cFone    := XmlNode(cTagEnderEmit, "fone")

cTagVPrest := XmlNode(cStr, "vPrest")
IF Empty(cTagVPrest)
   hwg_Msgstop( "TAG <vPrest> não localizada." )
   RETURN .T.
ENDIF
nVTPrest   := Val( XmlNode(cTagVPrest, "vTPrest") )
nVDesc     := 0

cTagImp := XmlNode(cStr, "imp")
IF Empty(cTagImp)
   hwg_Msgstop( "TAG <imp> não localizada." )
   RETURN .T.
ENDIF
nVBCUFFim  := Val( XmlNode(cTagImp, "vBCUFFim") )
nPICMSUFFim:= Val( XmlNode(cTagImp, "pICMSUFFim") )
nVICMSUFFim:= Val( XmlNode(cTagImp, "vICMSUFFim") )

cTagInfNFe := XmlNode(cStr, "infNFe")
IF Empty(cTagInfNFe)
   hwg_Msgstop( "TAG <infNFe> não localizada." )
   RETURN .T.
ENDIF
cChave   := XmlNode(cTagInfNFe, "chave")

cCodFor  := ""
 
fo->(OrdSetFocus(3)) //CNPJ     
IF lAchouFornec := fo->(DbSeek(cCNPJ))
   cCodFor := fo->cod_fornec
   AtualizarDadosFornededor(lAchouFornec,cCodFor,cCNPJ,cXNome,cXLgr,cNro,cXBairro,cCMun,cXMun,cUF,cCEP,cFone,cIE)

   tp70->(ordSetFocus(4)) //dtos(dataemi)+numero+cnpj
   IF tp70->( dbSeek( DToS(hb_ttod(dhEmi)) + cCNPJ + strzero(val(cNCT),9) ) ) //DToS(dhSaiEnt)) )
      tp70->(ordSetFocus(1))
      fo->(ordSetFocus(1))
      oDlgMain:oBrw:Refresh()
      hwg_MsgStop("CTe já cadastrada: " + strzero(val(cNCT),9) + " - " + cXNome + " - " + DToC(hb_TToD(dhEmi)) ) //DToS(dhSaiEnt) )
      RETURN .F.
   ENDIF                 
     
ENDIF

//Novo fornecedor
If Empty(cCodFor)
   fo->(OrdSetFocus(1))
   fo->(DbGoBottom())
   nPos := hb_At( SubStr(fo->cod_fornec,1,1), "ABCDEFGHIJKLMNOPQRSTUVWXYZ" )
   IF SubStr(fo->cod_fornec,2,3) == "999"
      cCodFor := SubStr("ABCDEFGHIJKLMNOPQRSTUVWXYZ",nPos+1,1) + "001"   
   Else
      cCodFor := SubStr(fo->cod_fornec,1,1) + strzero(val(substr(fo->cod_fornec,2,3))+1,3)
   ENDIF                   
   AtualizarDadosFornededor(lAchouFornec,cCodFor,cCNPJ,cXNome,cXLgr,cNro,cXBairro,cCMun,cXMun,cUF,cCEP,cFone,cIE)
EndIF

Incluir('tp70')
tp70->cod_fornec := cCodFor
tp70->fornecedor := cXNome
tp70->cnpj       := cCNPJ
tp70->uf         := cUF
tp70->ctechave   := cChCTe
tp70->ctechavere := cChave
tp70->datarec    := dRecebido
tp70->dataemi    := hb_ttod(dhEmi)
tp70->ctetipo    := cTPCTe
tp70->modelo     := Val(cMod)
tp70->serie      := cSerie
tp70->subserie   := ""
tp70->numero     := Val(cNCT)
tp70->cfop       := cCFOP
tp70->total      := nVTPrest
tp70->desconto   := nVDesc
tp70->baseicms   := nVBCUFFim
tp70->aliquota   := nPICMSUFFim
tp70->valoricms  := nVICMSUFFim
tp70->vlrredbc   := 0
tp70->isenta     := 0
tp70->outras     := nVICMSUFFim
tp70->ciffob     := "2"
tp70->situacao   := "N"
tp70->cod_inf    := ""
tp70->ctaconta   := ""
tp70->CodMunDest := cCMunFim
tp70->CodMunOrig := cCMunIni
tp70->loja       := "001"

tp70->(ordSetFocus(1))
fo->(ordSetFocus(1))
oDlgMain:oBrw:Refresh()

RETURN .T.

****************************************
FUNCTION XmlNode( cXml, cNode, lComTag )
****************************************
*
*
   LOCAL nInicio, nFim, cResultado := ""

   hb_Default( @lComTag, .F. )
   nInicio := At( "<" + cNode, cXml )
   // a linha abaixo é depois de pegar o início, senão falha
   IF " " $ cNode
      cNode := Substr( cNode, 1, At( " ", cNode ) - 1 )
   ENDIF
   IF nInicio != 0
      IF ! lComTag
         nInicio := nInicio + Len( cNode ) + 2
         IF nInicio != 1 .AND. Substr( cXml, nInicio - 1, 1 ) != ">" // Quando tem elementos no bloco
            nInicio := hb_At( ">", cXml, nInicio ) + 1
         ENDIF
      ENDIF
      nFim := hb_At( "</" + cNode + ">", cXml, nInicio )     
      IF nFim != 0
         nFim -= 1
         IF lComTag
            nFim := nFim + Len( cNode ) + 3
         ENDIF
         cResultado := Substr( cXml, nInicio, nFim - nInicio + 1 )
      ENDIF
   ENDIF

   RETURN cResultado



Li alhures, que CTe gera crédito de ICMS para as empresas.

Saudações,
Itamar M. Lins Jr.
Avatar de usuário

Itamar M. Lins Jr.
Colaborador

Colaborador
 
Mensagens: 6927
Data de registro: 30 Mai 2007 11:31
Cidade/Estado: Ilheus Bahia
Curtiu: 309 vezes
Mens.Curtidas: 503 vezes



Retornar para Contribuições, Dicas e Tutoriais

Quem está online

Usuários vendo este fórum: Nenhum usuário registrado online e 17 visitantes


Ola Amigo, espero que meu site e forum tem lhe beneficiado, com exemplos e dicas de programacao.
Entao divulgue o link da Doacao abaixo para seus amigos e redes sociais ou faça uma doacao para o site forum...
MUITO OBRIGADO PELA SUA DOACAO!
Faça uma doação para o forum
cron
v
Olá visitante, seja bem-vindo ao Fórum Clipper On Line!
Efetue o seu login ou faça o seu Registro