Esempio n. 1
0
        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);
        }
Esempio n. 2
0
        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);
        }