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