/// <summary> /// Envia nota fiscal atravéz do WebService /// </summary> /// <param name="ilNotas_Fiscais">IList<Dados_Arquivos_NFe> com todas as notas para exportação.</param> /// <param name="sFolder">string com a Path completa para envio da NF-e.</param> public void Enviar_NFe(IList <CompSoft.NFe.Dados_Arquivo_NFe> ilNotas_Fiscais, string sFolder) { CompSoft.Tools.frmWait f = new CompSoft.Tools.frmWait("Aguarde, buscando informações no banco de dados."); f.Show(); //-- Busca dados para geração da NF-e ERP.NFe.GerarDadosNFe dados_NFe = new ERP.NFe.GerarDadosNFe(); dados_NFe.Gerar_Dados_NFe(ilNotas_Fiscais); f.Mensagem = "Aguarde, gerando arquivos XML da NF-e."; //-- Gera NF-e em uma pasta especifica para envio ao cliente. ERP.NFe.XML_NFe nfe = new ERP.NFe.XML_NFe(sFolder, dados_NFe.DataSet_NFe, ilNotas_Fiscais); nfe.Gerar_XML_NFe(); f.Progresso = true; f.Maximo_Progresso = ilNotas_Fiscais.Count; f.Mensagem = "Aguarde, o sistema está assinando, transfêrindo e imprimindo o DANFE das notas fiscais autorizadas."; //-- Instancia classe de tratamento do WebService NF-e //-- Verifica se o WebService está ativo. NFeWebService wb_Nfe = new NFeWebService(); if (wb_Nfe.Status_WebService(ilNotas_Fiscais[0])) { //-- Assina o XML. foreach (Dados_Arquivo_NFe daNFe in ilNotas_Fiscais) { //-- Assina NF-e CompSoft.NFe.AssinaXML assinar = new CompSoft.NFe.AssinaXML(); assinar.AssinarArquivoXML(daNFe.Arquivo_XML, "infNFe", this.Retorna_SerialNumber(daNFe.Empresa)); //-- Envia o Lote da NF-e. this.SalvaXML_DB(daNFe, false); XmlDocument doc = wb_Nfe.Enviar_LoteNFe(daNFe); int iAguardar = this.Trata_Arquivo_Retorno_NFe(doc, daNFe); //-- Faz o tratamento dos dados e envia para o banco de dados. //-- Aguarda 3 vezes o tempo necessário para garentir a recepção do retorno dos dados. System.Threading.Thread.Sleep(5000); //-- Captura o resultado de processamento. this.Resultado_Processamento_NFe(daNFe); //-- avança um na barra de progresso. f.Atual_Progresso++; } } else { MsgBox.Show("O WebService está fora do ar, tente novamente mais tarde." , "Atenção" , System.Windows.Forms.MessageBoxButtons.OK , System.Windows.Forms.MessageBoxIcon.Error); } f.Close(); f.Dispose(); }
/// <summary> /// Captura o resultado do processamento do lote na Secretária da Fazenda. /// </summary> /// <param name="daNFe">Dados_Arquivo_NFe</param> internal void Resultado_Processamento_NFe(Dados_Arquivo_NFe daNFe) { bool bImprimiDanfe = false; NFeWebService wb_NFe = new NFeWebService(); //-- Verifica se o arquivo XML da NF-e existe, caso não exista o sistema salva o existente no DB para envio ao cliente. this.Verifica_XML_Existe(daNFe); //-- Busca o resultado do processamento do lote. XmlDocument doc = wb_NFe.Resultado_Processamento_NFe(daNFe); //-- Verifica se o status é regsitrado como lote processado. if (doc.GetElementsByTagName("cStat")[0].InnerText.Equals("104")) { string sCodigo_Mensagem_Retorno = doc.GetElementsByTagName("cStat")[1].InnerText; string sMensagem_Retorno = doc.GetElementsByTagName("xMotivo")[1].InnerText; if (!sCodigo_Mensagem_Retorno.Trim().Equals("999")) { sMensagem_Retorno = "NULL"; } else { sMensagem_Retorno = "'" + sMensagem_Retorno + "'"; } //-- Caso a mensagem de retorno for de autorização de uso. string sProt = string.Empty; if (sCodigo_Mensagem_Retorno.Equals("100")) { bImprimiDanfe = true; } //-- Verifica se a mensagem de erro existe e inclui bool bExiste_MensRet = (int.Parse(SQL.ExecuteScalar(string.Format("select count(codigo_mensagem_retorno) from dbo.Mensagens_Retorno_NFe where codigo_mensagem_retorno = {0}" , sCodigo_Mensagem_Retorno)).ToString()) > 0); if (!bExiste_MensRet) { //-- inclui a mensagem. SQL.Execute(string.Format("insert Mensagens_Retorno_NFe values({0}, '{1}')" , sCodigo_Mensagem_Retorno , doc.GetElementsByTagName("xMotivo")[1].InnerText.Replace("'", ""))); } //-- Monta query para atualização do lote da NF-e StringBuilder sb = new StringBuilder(); sb.Append("update notas_fiscais_lotes set "); sb.AppendFormat(" Data_Processamento = '{0}'", doc.GetElementsByTagName("dhRecbto")[0].InnerText.Replace("T", " ").Replace("-", "").Substring(0, 17)); sb.AppendFormat(" , Codigo_Mensagem_Retorno_NFe = {0}", sCodigo_Mensagem_Retorno); sb.AppendFormat(" , Mensagem_retorno_NFe = {0}", sMensagem_Retorno); sb.Append(" , Retorno_Capturado = 1"); sb.AppendFormat("{0}", sProt); sb.AppendFormat(" where nota_fiscal_lote = {0}", daNFe.Cod_Nota_Fiscal_Lote); SQL.ExecuteNonQuery(sb.ToString()); //-- Marca a NF como exportada. if (bImprimiDanfe) { //-- Atualiza o número do protocolo de autenticação sb.Remove(0, sb.Length); sb.AppendLine("update notas_fiscais set "); sb.AppendFormat(" NFe_Protocolo = '{0}'\r\n", doc.GetElementsByTagName("nProt")[0].InnerText); sb.AppendFormat(" , NFe_Protocolo_Data = '{0}'\r\n", doc.GetElementsByTagName("dhRecbto")[0].InnerText.Replace("T", " ").Replace("-", "").Substring(0, 17)); sb.AppendFormat(" where Nota_Fiscal = {0}", daNFe.Nota_Fiscal); SQL.ExecuteNonQuery(sb.ToString()); //-- Salva Xml no Banco de dados. this.SalvaXML_DB(daNFe, true); } } else { string sCodigo_Mensagem_Retorno = doc.GetElementsByTagName("cStat")[0].InnerText; string sMensagem_Retorno = doc.GetElementsByTagName("xMotivo")[0].InnerText; if (!sCodigo_Mensagem_Retorno.Trim().Equals("999")) { sMensagem_Retorno = "NULL"; } else { sMensagem_Retorno = "'" + sMensagem_Retorno + "'"; } //-- Atualiza mensagens do lote da NF-e StringBuilder sb = new StringBuilder(); sb.Append("update notas_fiscais_lotes set "); sb.AppendFormat(" Codigo_Mensagem_Retorno_NFe = {0}", sCodigo_Mensagem_Retorno); sb.AppendFormat(" , Mensagem_retorno_NFe = {0}", sMensagem_Retorno); sb.Append(" , Retorno_Capturado = 1"); sb.AppendFormat(" where nota_fiscal_lote = {0}", daNFe.Cod_Nota_Fiscal_Lote); SQL.ExecuteNonQuery(sb.ToString()); } //-- Imprimi danfe. if (bImprimiDanfe) { //-- Faz a impressão do DANFE Impressao_Danfe imp_danfe; imp_danfe.Imprimir_Danfe(daNFe, false); //-- Envia a NF-e por e-mail Enviar_XML_Email envMail_NFe; envMail_NFe.Enviar_XML(daNFe); } }