NFe.ConvertTxt.NFeW.GerarChaveNFe C# (CSharp) Method

GerarChaveNFe() public method

MontaChave Cria a chave de acesso da NFe
public GerarChaveNFe ( string ArqPedido, System.Boolean xml ) : void
ArqPedido string
xml System.Boolean
return void
        public void GerarChaveNFe(string ArqPedido, Boolean xml)
        {
            int emp = Empresas.FindEmpresaByThread();

            // XML - pedido
            // Filename: XXXXXXXX-gerar-chave.xml
            // -------------------------------------------------------------------
            // <?xml version="1.0" encoding="UTF-8"?>
            // <gerarChave>
            //      <UF>35</UF>                 //se não informado, assume a da configuração
            //      <tpEmis>1</tpEmis>          //se não informado, assume a da configuração. Wandrey 22/03/2010
            //      <nNF>1000</nNF>
            //      <cNF>0</cNF>                //se não informado, eu gero
            //      <serie>1</serie>
            //      <AAMM>0912</AAMM>
            //      <CNPJ>55801377000131</CNPJ>
            // </gerarChave>
            //
            // XML - resposta
            // Filename: XXXXXXXX-ret-gerar-chave.xml
            // -------------------------------------------------------------------
            // <?xml version="1.0" encoding="UTF-8"?>
            // <retGerarChave>
            //      <chaveNFe>350912</chaveNFe>
            // </retGerarChave>
            //

            // TXT - pedido
            // Filename: XXXXXXXX-gerar-chave.txt
            // -------------------------------------------------------------------
            // UF|35
            // tpEmis|1
            // nNF|1000
            // cNF|0
            // serie|1
            // AAMM|0912
            // CNPJ|55801377000131
            //
            // TXT - resposta
            // Filename: XXXXXXXX-ret-gerar-chave.txt
            // -------------------------------------------------------------------
            // 35091255801377000131550010000000010000176506
            //
            // -------------------------------------------------------------------
            // ERR - resposta
            // Filename: XXXXXXXX-gerar-chave.err

            string ArqXMLRetorno = Empresas.Configuracoes[emp].PastaXmlRetorno + "\\" + (xml ? Functions.ExtrairNomeArq(ArqPedido, Propriedade.ExtEnvio.GerarChaveNFe_XML) + "-ret-gerar-chave.xml" : Functions.ExtrairNomeArq(ArqPedido, Propriedade.ExtEnvio.GerarChaveNFe_TXT) + "-ret-gerar-chave.txt");
            string ArqERRRetorno = Empresas.Configuracoes[emp].PastaXmlRetorno + "\\" + (xml ? Functions.ExtrairNomeArq(ArqPedido, Propriedade.ExtEnvio.GerarChaveNFe_XML) + "-gerar-chave.err" : Functions.ExtrairNomeArq(ArqPedido, Propriedade.ExtEnvio.GerarChaveNFe_TXT) + "-gerar-chave.err");

            try
            {
                Functions.DeletarArquivo(ArqXMLRetorno);
                Functions.DeletarArquivo(ArqERRRetorno);
                Functions.DeletarArquivo(Empresas.Configuracoes[emp].PastaXmlErro + "\\" + ArqPedido);

                if (!File.Exists(ArqPedido))
                {
                    throw new Exception("Arquivo " + ArqPedido + " não encontrado");
                }

                //                if (!Auxiliar.FileInUse(ArqPedido))
                //                {
                int serie = 0;
                int tpEmis = Empresas.Configuracoes[emp].tpEmis;
                int nNF = 0;
                int cNF = 0;
                int cUF = Empresas.Configuracoes[emp].UnidadeFederativaCodigo;
                string cAAMM = "0000";
                string cChave = "";
                string cCNPJ = "";
                string cError = "";
                string cMod = "";

                if (xml)
                {
                    XmlDocument doc = new XmlDocument();
                    doc.Load(ArqPedido);

                    XmlNodeList mChaveList = doc.GetElementsByTagName("gerarChave");

                    foreach (XmlNode mChaveNode in mChaveList)
                    {
                        XmlElement mChaveElemento = (XmlElement)mChaveNode;

                        if (mChaveElemento.GetElementsByTagName(TpcnResources.UF.ToString()).Count != 0)
                            cUF = Convert.ToInt32("0" + mChaveElemento.GetElementsByTagName(TpcnResources.UF.ToString())[0].InnerText);

                        if (mChaveElemento.GetElementsByTagName(TpcnResources.tpEmis.ToString()).Count != 0)
                            tpEmis = Convert.ToInt32("0" + mChaveElemento.GetElementsByTagName(TpcnResources.tpEmis.ToString())[0].InnerText);

                        if (mChaveElemento.GetElementsByTagName(TpcnResources.nNF.ToString()).Count != 0)
                            nNF = Convert.ToInt32("0" + mChaveElemento.GetElementsByTagName(TpcnResources.nNF.ToString())[0].InnerText);

                        if (mChaveElemento.GetElementsByTagName(TpcnResources.cNF.ToString()).Count != 0)
                            cNF = Convert.ToInt32("0" + mChaveElemento.GetElementsByTagName(TpcnResources.cNF.ToString())[0].InnerText);

                        if (mChaveElemento.GetElementsByTagName(TpcnResources.serie.ToString()).Count != 0)
                            serie = Convert.ToInt32("0" + mChaveElemento.GetElementsByTagName(TpcnResources.serie.ToString())[0].InnerText);

                        if (mChaveElemento.GetElementsByTagName(TpcnResources.AAMM.ToString()).Count != 0)
                            cAAMM = mChaveElemento.GetElementsByTagName(TpcnResources.AAMM.ToString())[0].InnerText;

                        if (mChaveElemento.GetElementsByTagName(TpcnResources.CNPJ.ToString()).Count != 0)
                            cCNPJ = mChaveElemento.GetElementsByTagName(TpcnResources.CNPJ.ToString())[0].InnerText;

                        if (mChaveElemento.GetElementsByTagName(TpcnResources.mod.ToString()).Count != 0)
                            cMod = mChaveElemento.GetElementsByTagName(TpcnResources.mod.ToString())[0].InnerText;
                    }
                }
                else
                {
                    List<string> cLinhas = Functions.LerArquivo(ArqPedido);
                    string[] dados;
                    foreach (string cLinha in cLinhas)
                    {
                        dados = cLinha.Split('|');
                        dados[0] = dados[0].ToUpper();
                        if (dados.GetLength(0) == 1)
                            cError += "Segmento [" + dados[0] + "] inválido" + Environment.NewLine;
                        else
                            switch (dados[0].ToLower())
                            {
                                case "uf":
                                    cUF = Convert.ToInt32("0" + dados[1].Trim());
                                    break;
                                case "tpemis":
                                    tpEmis = Convert.ToInt32("0" + dados[1].Trim());
                                    break;
                                case "nnf":
                                    nNF = Convert.ToInt32("0" + dados[1].Trim());
                                    break;
                                case "cnf":
                                    cNF = Convert.ToInt32("0" + dados[1].Trim());
                                    break;
                                case "serie":
                                    serie = Convert.ToInt32("0" + dados[1].Trim());
                                    break;
                                case "aamm":
                                    cAAMM = dados[1].Trim();
                                    break;
                                case "cnpj":
                                    cCNPJ = dados[1].Trim();
                                    break;
                                case "mod":
                                    cMod = dados[1].Trim();
                                    break;
                            }
                    }
                }

                if (nNF == 0)
                    cError = "Número da nota fiscal deve ser informado" + Environment.NewLine;

                if (string.IsNullOrEmpty(cAAMM))
                    cError += "Ano e mês da emissão deve ser informado" + Environment.NewLine;

                if (string.IsNullOrEmpty(cCNPJ))
                    cError += "CNPJ deve ser informado" + Environment.NewLine;

                if (cAAMM.Substring(0, 2) == "00")
                    cError += "Ano da emissão inválido" + Environment.NewLine;

                if (Convert.ToInt32(cAAMM.Substring(2, 2)) <= 0 || Convert.ToInt32(cAAMM.Substring(2, 2)) > 12)
                    cError += "Mês da emissão inválido" + Environment.NewLine;

                if (cMod == "")
                {
                    switch (Empresas.Configuracoes[emp].Servico)
                    {
                        case TipoAplicativo.Cte:
                            cMod = ((int)TpcnMod.modCTe).ToString();
                            break;
                        case TipoAplicativo.MDFe:
                            cMod = ((int)TpcnMod.modMDFe).ToString();
                            break;
                        case TipoAplicativo.NFCe:
                            cMod = ((int)TpcnMod.modNFCe).ToString();
                            break;
                        case TipoAplicativo.Nfe:
                            cMod = ((int)TpcnMod.modNFe).ToString();
                            break;
                        default:

                            if (!("55,57,58,65").Contains(cMod))
                                cError += "Mod inválido. Deve ser '55 p/NFe','57 p/Cte','58 p/MDF-e' ou '65 p/NFC-e'" + Environment.NewLine;
                            break;
                    }
                }


                if (cError != "")
                    throw new Exception(cError);

                Int64 iTmp = Convert.ToInt64("0" + cCNPJ);
                cChave = cUF.ToString("00") + cAAMM.Trim() + iTmp.ToString("00000000000000") + cMod;

                if (cNF == 0)
                {
                    ///
                    /// gera codigo aleatorio
                    /// 
                    cNF = GerarCodigoNumerico(nNF);
                }

                ///
                /// calcula do digito verificador
                /// 
                string ccChave = cChave + serie.ToString("000") + nNF.ToString("000000000") + tpEmis.ToString("0") + cNF.ToString("00000000");
                int cDV = GerarDigito(ccChave);
                ///
                /// monta a chave da NFe
                /// 
                cChave += serie.ToString("000") + nNF.ToString("000000000") + tpEmis.ToString("0") + cNF.ToString("00000000") + cDV.ToString("0");

                ///
                /// grava o XML/TXT de resposta
                /// 
                string vMsgRetorno = (xml ? "<?xml version=\"1.0\" encoding=\"UTF-8\"?><retGerarChave><chaveNFe>" + cChave + "</chaveNFe></retGerarChave>" : cChave);
                File.WriteAllText(ArqXMLRetorno, vMsgRetorno, Encoding.Default);

                ///
                /// exclui o XML/TXT de pedido
                /// 
                Functions.DeletarArquivo(ArqPedido);
            }
            catch (Exception ex)
            {
                try
                {
                    new Auxiliar().MoveArqErro(ArqPedido);

                    File.WriteAllText(ArqERRRetorno, "Arquivo " + ArqERRRetorno + Environment.NewLine + ex.Message, Encoding.Default);
                }
                catch
                {
                    //Se der algum erro na hora de gravar o arquivo de erro para o ERP, infelizmente não vamos poder fazer nada, visto que 
                    //pode ser algum problema com a rede, hd, permissões, etc... Wandrey 22/03/2010
                }
            }
        }
        #endregion