PC SOFT
ONLINE REPOSITORY
FOR WINDEVWEBDEV AND WINDEV MOBILE

Home |  | Sign in | English US
[DLL Unimake.DFe] Como gerar e enviar XML para a SEFAZ: Cancelamento CTe, desacordo CTE e consulta cadastro do contribuinte.
Published by Wandrey
in the category Various
New features



Description
No 19º episódio do Wandrey Descomplica sobre a DLL Unimake.DFe, aprendemos:

- Como gerar o XML de consulta do cadastro do contribuinte e Enviar para a SEFAZ;
- - Como consultar o cadastro do contribuinte via API ReceitaWS, para estados que não disponibilizam a consulta.
- Como gerar o XML do evento de cancelamento do CTe/CTeOS e enviar para SEFAZ;
- Como gerar o XML do evento de desacordo do CTe/CTeOS e enviar para SEFAZ.

A seguir, apresento o código em WINDEV para realizar as tarefas descritas acima.

Como gerar o XML de consulta do cadastro do contribuinte e Enviar para a SEFAZ:

```
// Estados que disponibilizam a consulta cadastro:
// - Via SVRS..........: AC, ES, RN, PB, SC
// - Webservice próprio: BA, GO, MG, MS, MT, PE, PR, RS, SP
//
// Estados que não disponibilizam a consulta cadastro:
// - AL, AP, CE, DF, MA, PA, PI, RJ, RO, RR, SE, TO
// Para resolver isso utilize a API: https://developers.receitaws.com.br/#/

//Criar as configurações mínimas necessárias para consumir o serviço
oConfiguracao is Unimake.Business.DFe.Servicos.Configuracao()
oConfiguracao.TipoDFe = TipoDFe.NFe
oConfiguracao.CertificadoArquivo = "C:\Projetos\certificados\UnimakePV.pfx"
oConfiguracao.CertificadoSenha = "12345678"

//Criar o XML
oConsCad is Unimake.Business.DFe.XML.NFe.ConsCad()
oConsCad.Versao = "2.00"

oInfCons is Unimake.Business.DFe.XML.NFe.InfCons()
oInfCons.CNPJ = "06117473000150"
oInfCons.UF = UFBrasil.PR

oConsCad.InfCons = oInfCons

WHEN EXCEPTION IN
//Consumir o serviço
oConsultaCadastro is Unimake.Business.DFe.Servicos.NFe.ConsultaCadastro()
oConsultaCadastro.Executar(oConsCad, oConfiguracao)

//Ver o conteúdo da tag CStat e XMotivo
oRetConsCad is Unimake.Business.DFe.XML.NFe.RetConsCad <- oConsultaCadastro.Result
EDT_RetornoWSString = oRetConsCad.InfCons.CStat + " - " + oRetConsCad.InfCons.xMotivo + CR + CR
EDT_RetornoWSString += "DADOS DO CONTRIBUINTE:" + CR + CR
EDT_RetornoWSString += "IE: " + oRetConsCad.InfCons.InfCad.IE + CR
EDT_RetornoWSString += "Razao: " + oRetConsCad.InfCons.InfCad.XNome + CR + CR

//Ver a string completa do XML retornado pelo WEBSERVICE
EDT_RetornoWSString += "String do XML retornado:" + CR + CR + oConsultaCadastro.RetornoWSString
DO
Info(ExceptionInfo(errFullDetails)) //Ele também pega o conteúdo da Exception do lado do C#, importante envolver o código em Try/Catch
END
```

Como consultar o cadastro do contribuinte via API ReceitaWS, para estados que não disponibilizam a consulta:
```
// Limites da API na sua versão gratuita:
// - 3 consultas por minuto
// - 130.000 consultas por mês
// - Não é consulta em tempo real na base da receita, então pode ter uma defasagem nas informações. No retorno do Json tem a data da ultima atualização do cadastro

// Definindo a URL da API
sCNPJ is string = "06117473000150"
sURL is string = "https://receitaws.com.br/v1/cnpj/" + sCNPJ

IF HTTPRequest(sURL) THEN
// Requisição bem-sucedida, agora vamos tratar o JSON de retorno
sJSON is string = HTTPGetResult(httpResult)

// Declarando a estrutura para as atividades principais
AtividadePrincipal is Structure
text is string
code is string
END

// Declarando a estrutura para as atividades secundárias
AtividadeSecundaria is Structure
text is string
code is string
END

// Declarando a estrutura principal para armazenar os dados do JSON
RespostaCNPJ is Structure
cnpj is string
Tipo is string
abertura is string
nome is string
fantasia is string
atividade_principal is array of AtividadePrincipal
atividades_secundarias is array of AtividadeSecundaria
natureza_juridica is string
logradouro is string
numero is string
complemento is string
cep is string
bairro is string
municipio is string
uf is string
telefone is string
email is string
END

retornoAPI is RespostaCNPJ

Deserialize(retornoAPI, sJSON, psdJSON)

// Agora você pode acessar os dados da estrutura
EDT_RetornoWSString = retornoAPI.nome + CR
EDT_RetornoWSString += retornoAPI.cnpj + CR
EDT_RetornoWSString += retornoAPI.atividade_principal[1].Text
ELSE
// Tratamento de erro
Error("Erro ao acessar a API.")
END
```

Como gerar o XML do evento de cancelamento do CTe/CTeOS e enviar para SEFAZ:
```
//Criar as configurações mínimas necessárias para consumir o serviço
oConfiguracao is Unimake.Business.DFe.Servicos.Configuracao()
oConfiguracao.TipoDFe = TipoDFe.CTe
oConfiguracao.CertificadoArquivo = "C:\Projetos\certificados\UnimakePV.pfx"
oConfiguracao.CertificadoSenha = "12345678"

//Criar tag do lote de eventos <eventoCTe>
oEventoCTe is Unimake.Business.DFe.XML.CTe.EventoCTe
oEventoCTe.Versao = "4.00"

//Criar tag <detEvento>
oDetEventoCanc is Unimake.Business.DFe.XML.CTe.DetEventoCanc
oDetEventoCanc.VersaoEvento = "4.00"
oDetEventoCanc.NProt = "141190000660363"
oDetEventoCanc.XJust = "Justificativa para cancelamento do CTe de teste"

//Criar tag <infEvento>
oInfEvento is Unimake.Business.DFe.XML.CTe.InfEvento

//Adicionar o Objeto oDetEventoCanc dentro do objeto DetEvento
oInfEvento.DetEvento = oDetEventoCanc

//Atualizar propriedades da oInfEvento
//IMPORTANTE: Atualização da propriedade TpEvento deve acontecer depois que o DetEvento recebeu o oDetEventoCanc para que funcione sem erro
oInfEvento.COrgao = 41 // UFBrasil.PR
oInfEvento.ChCTe = "41191006117473000150550010000579281779843610"
oInfEvento.CNPJ = "06117473000150"
oInfEvento.DhEvento = SysDateTime()
oInfEvento.TpEvento = 110111 //TipoEventoCTe.Cancelamento
oInfEvento.NSeqEvento = 1
oInfEvento.TpAmb = 2 //TipoAmbiente.Homologacao

//Adicionar a tag <infEvento> dentro da tag <eventoCTe>
oEventoCTe.InfEvento = oInfEvento

EDT_RetornoWSString = "Versao schema: " + CR + oEventoCTe.Versao + CR + CR
EDT_RetornoWSString += "CNPJ: " + CR + oEventoCTe.InfEvento.CNPJ + CR + CR

WHEN EXCEPTION IN
//Consumir o serviço
oRecepcaoEvento is Unimake.Business.DFe.Servicos.CTe.RecepcaoEvento()
oRecepcaoEvento.SetXMLConfiguracao(oEventoCTe, oConfiguracao)

eventoAssinado is string = oRecepcaoEvento.GetConteudoXMLAssinado()

EDT_RetornoWSString += "XML Assinado: " + CR + eventoAssinado + CR + CR

// Gravar o XML assinado no HD
fDelete("d:\testenfe\CancelamentoCTe.xml")
fSaveText("d:\testenfe\CancelamentoCTe.xml", eventoAssinado)

oRecepcaoEvento.Executar(oEventoCTe, oConfiguracao)

//Ver retorno da SEFAZ
EDT_RetornoWSString += "XML Retornado: " + CR + oRecepcaoEvento.RetornoWSString + CR + CR

//Ver o conteúdo da tag CStat e XMotivo
oRetEventoCTe is Unimake.Business.DFe.XML.CTe.RetEventoCTe <-oRecepcaoEvento.Result
EDT_RetornoWSString += "CStat: " + CR + oRetEventoCTe.InfEvento.CStat + CR + CR
EDT_RetornoWSString += "XMotivo: " + CR + oRetEventoCTe.InfEvento.XMotivo + CR + CR

SWITCH oRetEventoCTe.InfEvento.CStat
CASE 134, 135, 156
oRecepcaoEvento.GravarXmlDistribuicao("d:\testenfe")

OTHER CASE
//Evento rejeitado
//Realizar as ações necessárias
END
DO
Info(ExceptionInfo(errFullDetails)) //Ele também pega o conteúdo da Exception do lado do C#, importante envolver o código em Try/Catch
END
```

Como gerar o XML do evento de desacordo do CTe/CTeOS e enviar para SEFAZ:
```
//Criar as configurações mínimas necessárias para consumir o serviço
oConfiguracao is Unimake.Business.DFe.Servicos.Configuracao()
oConfiguracao.TipoDFe = TipoDFe.CTe
oConfiguracao.CertificadoArquivo = "C:\Projetos\certificados\UnimakePV.pfx"
oConfiguracao.CertificadoSenha = "12345678"

//Criar tag do lote de eventos <eventoCTe>
oEventoCTe is Unimake.Business.DFe.XML.CTe.EventoCTe
oEventoCTe.Versao = "4.00"

//Criar tag <detEvento>
oDetEventoPrestDesacordo is Unimake.Business.DFe.XML.CTe.DetEventoPrestDesacordo
oDetEventoPrestDesacordo.VersaoEvento = "4.00"
oDetEventoPrestDesacordo.DescEvento = "Prestacao do Servico em Desacordo"
oDetEventoPrestDesacordo.IndDesacordoOper = "1"
oDetEventoPrestDesacordo.XObs = "Teste de manifestacao de servico em desacordo, ambiente de homolocacao"

//Criar tag <infEvento>
oInfEvento is Unimake.Business.DFe.XML.CTe.InfEvento

//Adicionar o Objeto oDetEventoPrestDesacordo dentro do objeto DetEvento
oInfEvento.DetEvento = oDetEventoPrestDesacordo

//Atualizar propriedades da oInfEvento
//IMPORTANTE: Atualização da propriedade TpEvento deve acontecer depois que o DetEvento recebeu o oDetEventoCanc para que funcione sem erro
oInfEvento.COrgao = 41 // UFBrasil.PR // Tem que ser o estado de origem do CTe, dois primeiros digitos da chave do CTe que está no evento.
oInfEvento.ChCTe = "41191006117473000150550010000579281779843610"
oInfEvento.CNPJ = "06117473000150"
oInfEvento.DhEvento = SysDateTime()
oInfEvento.TpEvento = 610110 //TipoEventoCTe.PrestDesacordo
oInfEvento.NSeqEvento = 1
oInfEvento.TpAmb = 2 //TipoAmbiente.Homologacao

//Adicionar a tag <infEvento> dentro da tag <eventoCTe>
oEventoCTe.InfEvento = oInfEvento

EDT_RetornoWSString = "Versao schema: " + CR + oEventoCTe.Versao + CR + CR
EDT_RetornoWSString += "CNPJ: " + CR + oEventoCTe.InfEvento.CNPJ + CR + CR

WHEN EXCEPTION IN
//Consumir o serviço
oRecepcaoEvento is Unimake.Business.DFe.Servicos.CTe.RecepcaoEvento()
oRecepcaoEvento.SetXMLConfiguracao(oEventoCTe, oConfiguracao)

eventoAssinado is string = oRecepcaoEvento.GetConteudoXMLAssinado()

EDT_RetornoWSString += "XML Assinado: " + CR + eventoAssinado + CR + CR

// Gravar o XML assinado no HD
fDelete("d:\testenfe\DesacordoCTe.xml")
fSaveText("d:\testenfe\DesacordoCTe.xml", eventoAssinado)

oRecepcaoEvento.Executar(oEventoCTe, oConfiguracao)

//Ver retorno da SEFAZ
EDT_RetornoWSString += "XML Retornado: " + CR + oRecepcaoEvento.RetornoWSString + CR + CR

//Ver o conteúdo da tag CStat e XMotivo
oRetEventoCTe is Unimake.Business.DFe.XML.CTe.RetEventoCTe <-oRecepcaoEvento.Result
EDT_RetornoWSString += "CStat: " + CR + oRetEventoCTe.InfEvento.CStat + CR + CR
EDT_RetornoWSString += "XMotivo: " + CR + oRetEventoCTe.InfEvento.XMotivo + CR + CR

SWITCH oRetEventoCTe.InfEvento.CStat
CASE 134, 135, 156
oRecepcaoEvento.GravarXmlDistribuicao("d:\testenfe")

OTHER CASE
//Evento rejeitado
//Realizar as ações necessárias
END
DO
Info(ExceptionInfo(errFullDetails)) //Ele também pega o conteúdo da Exception do lado do C#, importante envolver o código em Try/Catch
END
```

Para uma explicação mais detalhada do conteúdo deste post, confira o vídeo no seguinte link:
https://www.youtube.com/watch?v=qUosXijsuPw
Illustrations, screen shots
none
none
User reviews
(To evaluate this resource, click 'Write a review')
No review or comment? Be the first one!