public static bool GerarXMLLMC(TRegistro_LMC val, TRegistro_CfgNfe rCfgNfe, ref string Msg) { bool ret = false; val.Chaveacesso = CamadaNegocio.PostoCombustivel.TCN_LMC.GerarChaveLMC(val); //Validar certificado srvNFE.ConsultaStatusServico.ConsultaStatusServico.ValidarCertificado(rCfgNfe); StringBuilder xml = new StringBuilder(); xml.Append("<?xml version=\"1.0\" encoding=\"iso-8859-1\"?> "); #region autorizacao xml.Append("<autorizacao xmlns=\"http://www.fazenda.pr.gov.br/sefaws\">"); #region LivroCombustivel xml.Append("<livroCombustivel xmlns=\"http://www.fazenda.pr.gov.br/sefaws\">"); #region infLivroCombustivel xml.Append("<infLivroCombustivel versao=\"" + rCfgNfe.Cd_versaoLMC.Trim() + "\" Id=\"LMC" + val.Chaveacesso.Trim() + "\">"); #region Ambiente xml.Append("<tpAmb>"); xml.Append(rCfgNfe.Tp_ambiente_lmc); xml.Append("</tpAmb>"); #endregion #region Codigo LMC xml.Append("<cNumerico>"); xml.Append(val.Id_lmcstr.FormatStringEsquerda(5, '0')); xml.Append("</cNumerico>"); #endregion #region Codigo Digito Verificador Chave Acesso xml.Append("<cDV>"); xml.Append(val.Chaveacesso.Substring(val.Chaveacesso.Length - 1, 1)); xml.Append("</cDV>"); #endregion #region Emitente LMC xml.Append("<emit>"); #region Insc. Estadual xml.Append("<IE>"); xml.Append(val.IE_empresa.SoNumero()); xml.Append("</IE>"); #endregion #region CNPJ xml.Append("<CNPJ>"); xml.Append(val.Cnpj_empresa.SoNumero()); xml.Append("</CNPJ>"); #endregion #region Nome Emitente xml.Append("<xNome>"); xml.Append(val.Nm_empresa.Trim().SubstCaracteresEsp()); xml.Append("</xNome>"); #endregion xml.Append("</emit>"); #endregion #region Movimento xml.Append("<movimento dEmissao=\"" + val.Dt_emissao.Value.ToString("yyyy-MM-dd") + "\">"); #region infMovimento CamadaNegocio.PostoCombustivel.TCN_MovLMC.Buscar(val.Cd_empresa, val.Id_lmcstr, string.Empty, null).ForEach(p => { xml.Append("<infMovimento nrProduto=\"" + p.Tp_combustivel + "\">"); //Volume Abertura xml.Append("<volEstoqueAbertura>"); xml.Append(Convert.ToDecimal(string.Format("{0:N3}", p.Volumeabertura)).ToString(new System.Globalization.CultureInfo("en-US", true))); xml.Append("</volEstoqueAbertura>"); #region volumeRecebido p.lRec = CamadaNegocio.PostoCombustivel.TCN_MovRec.Buscar(p.Cd_empresa, p.Id_lmcstr, p.Id_movtostr, null); if (p.lRec.Count > 0) { p.lRec.ForEach(v => { xml.Append("<volumeRecebido>"); //CNPJ xml.Append("<CNPJ>"); xml.Append(v.Cnpj_fornecedor.SoNumero()); xml.Append("</CNPJ>"); //Nota Fiscal xml.Append("<nNF>"); xml.Append(v.Nr_notafiscalstr); xml.Append("</nNF>"); //Data Nota xml.Append("<dNF>"); xml.Append(v.Dt_saient.Value.ToString("yyyy-MM-dd")); xml.Append("</dNF>"); //Volume Recebido xml.Append("<volVolume>"); xml.Append(Convert.ToDecimal(string.Format("{0:N3}", v.VolumeRecebido)).ToString(new System.Globalization.CultureInfo("en-US", true))); xml.Append("</volVolume>"); //Tanque xml.Append("<xTanque>"); xml.Append(v.Id_tanquestr); xml.Append("</xTanque>"); xml.Append("</volumeRecebido>"); }); } #endregion #region volumeVendido p.lVend = CamadaNegocio.PostoCombustivel.TCN_MovVend.Buscar(p.Cd_empresa, p.Id_lmcstr, p.Id_movtostr, null); if (p.lVend.Count > 0) { p.lVend.ForEach(v => { xml.Append("<volumeVendido>"); //Tanque xml.Append("<xTanque>"); xml.Append(v.Id_tanquestr); xml.Append("</xTanque>"); //Bico xml.Append("<nrBico>"); xml.Append(v.Ds_labelbico); xml.Append("</nrBico>"); //Fechamento xml.Append("<volFechamento>"); xml.Append(Convert.ToDecimal(string.Format("{0:N3}", v.Volfechamento)).ToString(new System.Globalization.CultureInfo("en-US", true))); xml.Append("</volFechamento>"); //Abertura xml.Append("<volAbertura>"); xml.Append(Convert.ToDecimal(string.Format("{0:N3}", v.Volabertura)).ToString(new System.Globalization.CultureInfo("en-US", true))); xml.Append("</volAbertura>"); //Afericoes xml.Append("<volAfericoes>"); xml.Append(Convert.ToDecimal(string.Format("{0:N3}", v.Volafericao)).ToString(new System.Globalization.CultureInfo("en-US", true))); xml.Append("</volAfericoes>"); xml.Append("</volumeVendido>"); }); } #endregion //Estoque Fechamento xml.Append("<volEstoqueFechamento>"); xml.Append(Convert.ToDecimal(string.Format("{0:N3}", p.Volumefechamento)).ToString(new System.Globalization.CultureInfo("en-US", true))); xml.Append("</volEstoqueFechamento>"); //Valor Vendas Dia xml.Append("<valVendasDiaBomba>"); xml.Append(Convert.ToDecimal(string.Format("{0:N2}", p.Vl_vendasdia)).ToString(new System.Globalization.CultureInfo("en-US", true))); xml.Append("</valVendasDiaBomba>"); //Vendas Acumuladas Mes xml.Append("<valAcumuladoMes>"); xml.Append(Convert.ToDecimal(string.Format("{0:N2}", p.Vl_vendasdia)).ToString(new System.Globalization.CultureInfo("en-US", true))); xml.Append("</valAcumuladoMes>"); //Observacoes xml.Append("<observacoes>"); xml.Append(p.Obs.Trim().SubstCaracteresEsp()); xml.Append("</observacoes>"); xml.Append("</infMovimento>"); }); #endregion xml.Append("</movimento>"); #endregion xml.Append("</infLivroCombustivel>"); #endregion xml.Append("</livroCombustivel>"); #endregion xml.Append("</autorizacao>"); #endregion //Assinar documento XML string xmlassinado = new Utils.Assinatura.TAssinatura2(rCfgNfe.Nr_certificado_nfe, Utils.Assinatura.TAssinatura2.TTpArq.tpLMCe, xml.ToString()).Assinar(); //Validar Schema XML Utils.ValidaSchema.ValidaXML2.validaXML(xmlassinado, rCfgNfe.Path_nfe_schemas.SeparadorDiretorio() + "autorizacao_v" + rCfgNfe.Cd_versaoLMC.Trim() + ".xsd", "LMC"); if (!string.IsNullOrEmpty(Utils.ValidaSchema.ValidaXML2.Retorno)) { throw new Exception(Utils.ValidaSchema.ValidaXML2.Retorno.Trim()); } //Enviar arquivo para Receita XmlDocument doc = new XmlDocument(); doc.LoadXml(xmlassinado); XmlNode retorno = ConectarWebService(doc.DocumentElement, rCfgNfe); if (retorno != null) { if (retorno["autorizacaoRetorno"]["livroCombustivelRetorno"]["protLivroCombustivel"]["infProt"]["cStat"].InnerText.Trim().Equals("100") || retorno["autorizacaoRetorno"]["livroCombustivelRetorno"]["protLivroCombustivel"]["infProt"]["cStat"].InnerText.Trim().Equals("101") || retorno["autorizacaoRetorno"]["livroCombustivelRetorno"]["protLivroCombustivel"]["infProt"]["cStat"].InnerText.Trim().Equals("1001")) { try { CamadaDados.TDataQuery query = new CamadaDados.TDataQuery(); System.Collections.Hashtable hs = new System.Collections.Hashtable(); hs.Add("@P_CHAVE", val.Chaveacesso); hs.Add("@P_RECEBIMENTO", DateTime.Parse(retorno["autorizacaoRetorno"]["livroCombustivelRetorno"]["protLivroCombustivel"]["infProt"]["dhRecbto"].InnerText)); hs.Add("@P_STATUS", retorno["autorizacaoRetorno"]["livroCombustivelRetorno"]["protLivroCombustivel"]["infProt"]["cStat"].InnerText); hs.Add("@P_XMOTIVO", retorno["autorizacaoRetorno"]["livroCombustivelRetorno"]["protLivroCombustivel"]["infProt"]["xMotivo"].InnerText); hs.Add("@P_NPROT", retorno["autorizacaoRetorno"]["livroCombustivelRetorno"]["protLivroCombustivel"]["infProt"]["nProt"].InnerText); hs.Add("@P_DIGVAL", retorno["autorizacaoRetorno"]["livroCombustivelRetorno"]["protLivroCombustivel"]["infProt"]["digVal"].InnerText); hs.Add("@P_XML", xmlassinado); hs.Add("@P_EMPRESA", val.Cd_empresa); hs.Add("@P_LMC", val.Id_lmc); query.executarSql("update tb_pdc_lmc set " + "chaveacesso = @P_CHAVE, " + "dt_recebimento = @P_RECEBIMENTO, " + "status = @P_STATUS, " + "xMotivo = @P_XMOTIVO, " + "nProt = @P_NPROT, " + "digVal = @P_DIGVAL, " + "xml_lmc = @P_XML, " + "dt_alt = getdate() " + "where cd_empresa = @P_EMPRESA and id_lmc = @P_LMC", hs); ret = true; Msg = retorno["autorizacaoRetorno"]["livroCombustivelRetorno"]["protLivroCombustivel"]["infProt"]["xMotivo"].InnerText; } catch (Exception ex) { throw new Exception("Erro gravar chave acesso LMC-e: " + ex.Message.Trim()); } } else { try { CamadaDados.TDataQuery query = new CamadaDados.TDataQuery(); System.Collections.Hashtable hs = new System.Collections.Hashtable(); hs.Add("@P_STATUS", retorno["autorizacaoRetorno"]["livroCombustivelRetorno"]["protLivroCombustivel"]["infProt"]["cStat"].InnerText); hs.Add("@P_XMOTIVO", retorno["autorizacaoRetorno"]["livroCombustivelRetorno"]["protLivroCombustivel"]["infProt"]["xMotivo"].InnerText); hs.Add("@P_EMPRESA", val.Cd_empresa); hs.Add("@P_LMC", val.Id_lmc); query.executarSql("update tb_pdc_lmc set " + "status = @P_STATUS, " + "xMotivo = @P_XMOTIVO, " + "dt_alt = getdate() " + "where cd_empresa = @P_EMPRESA and id_lmc = @P_LMC", hs); } catch (Exception ex) { throw new Exception("Erro gravar chave acesso LMC-e: " + ex.Message.Trim()); } Msg = retorno["autorizacaoRetorno"]["livroCombustivelRetorno"]["protLivroCombustivel"]["infProt"]["xMotivo"].InnerText; } } return(ret); }
public static bool EnviarLote(decimal?Id_lote, List <CamadaDados.Faturamento.PDV.TRegistro_NFCe> lNFCe) { bool ret = false; if (lNFCe.Count > 0) { //Validar Certificado srvNFE.ConsultaStatusServico.ConsultaStatusServico.ValidarCertificado(lNFCe[0].rCfgNFCe); //Verificar status do servico junto a receita if (ConsultaStatusServico.TConsultaStatusServico.StatusServico(lNFCe[0].rCfgNFCe).Trim() != "107") { throw new Exception("Serviço indisponivel no momento.\r\nAguarde alguns minutos e tente novamente."); } GerarXML.TGerarXML.GerarXML(lNFCe); StringBuilder xml = new StringBuilder(); xml.Append("<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n"); #region enviNFe xml.Append("<enviNFe xmlns=\"http://www.portalfiscal.inf.br/nfe\" versao=\"" + lNFCe[0].rCfgNFCe.Cd_versaonfce.Trim() + "\">\n"); if (!Id_lote.HasValue) { Id_lote = GerarIdLote(null, null, null, decimal.Zero, "A", null, string.Empty, lNFCe[0].rCfgNFCe); } if (!Id_lote.HasValue) { throw new Exception("Erro gerar Id. do lote"); } #region "idLote" xml.Append("<idLote>"); xml.Append(Id_lote.ToString().PadLeft(15, '0')); xml.Append("</idLote>\n"); #endregion #region indSinc xml.Append("<indSinc>"); xml.Append(lNFCe.Count > 1 ? "0" : "1"); xml.Append("</indSinc>"); #endregion lNFCe.ForEach(p => { XmlDocument documento = new XmlDocument(); documento.LoadXml(p.XmlNFCe); //Gravar lote x nota fiscal GravarLoteXNFCe(Id_lote.Value, p, null, decimal.Zero, string.Empty, decimal.Zero, string.Empty, string.Empty); xml.Append(p.XmlNFCe + "\n"); }); xml.Append("</enviNFe>\n"); #endregion //Validar Arquivo Lote Utils.ValidaSchema.ValidaXML2.validaXML(xml.ToString(), lNFCe[0].rCfgNFCe.Path_nfe_schemas.SeparadorDiretorio() + "enviNFe_v" + lNFCe[0].rCfgNFCe.Cd_versaonfce.Trim() + ".xsd", "NFE"); if (!string.IsNullOrEmpty(Utils.ValidaSchema.ValidaXML2.Retorno)) { throw new Exception(Utils.ValidaSchema.ValidaXML2.Retorno.Trim()); } try { //Enviar Lote para Receita XmlDocument doc = new XmlDocument(); doc.LoadXml(xml.ToString()); XmlNode retorno = ConectarWebService(doc.DocumentElement, lNFCe[0].rCfgNFCe); //Tratar retorno if (retorno != null) { if (retorno["cStat"].InnerText.Trim().Equals("103") || retorno["cStat"].InnerText.Trim().Equals("104")) { //Lote recebido com sucesso //Gravar dados do lote no banco de dados decimal? nRec = null; DateTime?dhRecbto = null; decimal? tMed = null; try { dhRecbto = Convert.ToDateTime(retorno["dhRecbto"].InnerText); } catch { } if (retorno.InnerXml.Contains("infRec")) { nRec = Convert.ToDecimal(retorno["infRec"]["nRec"].InnerText); tMed = Convert.ToDecimal(retorno["infRec"]["tMed"].InnerText); } else if (retorno.InnerXml.Contains("protNFe")) { DateTime?dt_rec = null; try { dt_rec = Convert.ToDateTime(retorno["protNFe"]["infProt"]["dhRecbto"].InnerText); lNFCe.Find(p => p.Chave_acesso.Trim().Equals(retorno["protNFe"]["infProt"]["chNFe"].InnerText)).Dt_processamento = dt_rec; } catch { } decimal nprot = decimal.Zero; try { nprot = Convert.ToDecimal(retorno["protNFe"]["infProt"]["nProt"].InnerText); lNFCe.Find(p => p.Chave_acesso.Trim().Equals(retorno["protNFe"]["infProt"]["chNFe"].InnerText)).Nr_protocolo = nprot; } catch { } decimal status = decimal.Zero; try { status = Convert.ToDecimal(retorno["protNFe"]["infProt"]["cStat"].InnerText); if (status.Equals(100)) { lNFCe.Find(p => p.Chave_acesso.Trim().Equals(retorno["protNFe"]["infProt"]["chNFe"].InnerText)).Digval = retorno["protNFe"]["infProt"]["digVal"].InnerText; } } catch { } GravarLoteXNFCe(Id_lote.Value, lNFCe.Find(p => p.Chave_acesso.Trim().Equals(retorno["protNFe"]["infProt"]["chNFe"].InnerText)), dt_rec, nprot, (status.Equals(100) ? retorno["protNFe"]["infProt"]["digVal"].InnerText : string.Empty), status, retorno["protNFe"]["infProt"]["xMotivo"].InnerText, retorno["protNFe"]["infProt"]["verAplic"].InnerText); if (lNFCe.Find(p => p.Chave_acesso.Trim().Equals(retorno["protNFe"]["infProt"]["chNFe"].InnerText)).Id_contingencia.HasValue&& lNFCe.Find(p => p.Chave_acesso.Trim().Equals(retorno["protNFe"]["infProt"]["chNFe"].InnerText)).St_registro.Trim().ToUpper().Equals("C")) { try { //Buscar evento de cancelamento CamadaDados.Faturamento.PDV.TList_EventoNFCe lEvento = CamadaNegocio.Faturamento.PDV.TCN_EventoNFCe.Buscar(lNFCe.Find(p => p.Chave_acesso.Trim().Equals(retorno["protNFe"]["infProt"]["chNFe"].InnerText)).Cd_empresa, lNFCe.Find(p => p.Chave_acesso.Trim().Equals(retorno["protNFe"]["infProt"]["chNFe"].InnerText)).Id_nfcestr, string.Empty, null); if (lEvento.Count > 0) { if (!lEvento[0].St_registro.Trim().ToUpper().Equals("T")) { lEvento[0].Chave_acesso_nfce = retorno["protNFe"]["infProt"]["chNFe"].InnerText; NFCe.EventoNFCe.TEventoNFCe.EnviarEvento(lEvento[0], lNFCe[0].rCfgNFCe); } } } catch { } } ret = true; } GerarIdLote(Id_lote, nRec, dhRecbto, tMed, ret ? "P" : "E", Convert.ToDecimal(retorno["cStat"].InnerText), retorno["xMotivo"].InnerText, lNFCe[0].rCfgNFCe); //Gravar xml e chave acesso no banco lNFCe.ForEach(p => { CamadaDados.TDataQuery query = new CamadaDados.TDataQuery(); System.Collections.Hashtable hs = new System.Collections.Hashtable(3); hs.Add("@CHAVE", p.Chave_acesso); hs.Add("@CD_EMPRESA", p.Cd_empresa); hs.Add("@ID_NFCE", p.Id_nfce); query.executarSql("update tb_pdv_nfce set chave_acesso = @CHAVE, dt_alt = getdate() " + "where cd_empresa = @CD_EMPRESA and id_nfce = @ID_NFCE", hs); new CamadaDados.Faturamento.PDV.TCD_XML_NFCe() .Gravar(new CamadaDados.Faturamento.PDV.TRegistro_XML_NFCe { Cd_empresa = p.Cd_empresa, Id_nfce = p.Id_nfce, Xml_nfce = p.XmlNFCe }); }); } else { //Erro no envio do lote //Gravar mensagem de erro de envio do lote GerarIdLote(Id_lote, null, null, null, "A", Convert.ToDecimal(retorno["cStat"].InnerText), retorno["xMotivo"].InnerText, lNFCe[0].rCfgNFCe); } } else { throw new Exception("Serviço Enviar NFC-e indisponivel no momento."); } } catch (Exception ex) { DeletarNFCeLotesProblemas(lNFCe[0].rCfgNFCe); DeletarLotesProblemas(lNFCe[0].rCfgNFCe); throw new Exception(ex.Message.Trim()); } } return(ret); }