/// <summary> /// Validar regra /// </summary> /// <param name="entity"></param> private void ValidarRegra(inutNFe entity) { if (entity.infInut.ano > 99) { throw new FalhaValidacaoException("O ano deve possuir apenas 2 digitos"); } }
/// <summary> /// Validar schema /// </summary> /// <param name="entity"></param> private void ValidarSchema(inutNFe entity) { if (_emisorEmissorServicoConfig.ValidarSchema) { return; } var caminhoSchema = _emisorEmissorServicoConfig.DiretorioSchemaXsd; if (!Directory.Exists(caminhoSchema)) { throw new Exception("Diretório de Schemas não encontrado: \n" + caminhoSchema); } // Define o tipo de validação var cfg = new XmlReaderSettings { ValidationType = ValidationType.Schema }; //Listar arquivos XSD e inclui-las na validação var list = ObterListaNomeSchemas().ToList(); list.ForEach(n => { cfg.Schemas.Add(null, Path.Combine(caminhoSchema, n)); }); cfg.ValidationEventHandler += ValidationEventHandler; var xml = Utils.ObterStringXML(entity); var reader = XmlReader.Create(new StringReader(xml), cfg); var document = new XmlDocument(); document.Load(reader); //Valida xml document.Validate(ValidationEventHandler); }
/// <summary> /// Gerar Id /// </summary> /// <param name="entity"></param> private void GerarId(inutNFe entity) { var numId = string.Concat((int)entity.infInut.cUF, entity.infInut.ano, entity.infInut.CNPJ, (int)entity.infInut.mod, entity.infInut.serie.ToString().PadLeft(3, '0'), entity.infInut.nNFIni.ToString().PadLeft(9, '0'), entity.infInut.nNFFin.ToString().PadLeft(9, '0')); entity.infInut.Id = "ID" + numId; }
/// <summary> /// Assinar /// </summary> /// <param name="entity"></param> /// <returns></returns> private void Assinar(inutNFe entity) { try { var assinatura = AssinaturaDigital.AssinarNFe(entity, entity.infInut.Id, _certificadoDigital); entity.Signature = assinatura; } catch (Exception ex) { Utils.TraceException(ex); throw new FalhaAssinaturaException("Erro ao assinar arquivo Xml", ex); } }
/// <summary> /// Assina um objeto inutNFe /// </summary> /// <param name="inutNFe"></param> /// <returns>Retorna um objeto do tipo inutNFe assinado</returns> public static inutNFe Assina(this inutNFe inutNFe) { var inutNFeLocal = inutNFe; if (inutNFeLocal.infInut.Id == null) { throw new Exception("Não é possível assinar um onjeto inutNFe sem sua respectiva Id!"); } var assinatura = Assinador.ObterAssinatura(inutNFeLocal, inutNFeLocal.infInut.Id); inutNFeLocal.Signature = assinatura; return(inutNFeLocal); }
/// <summary> /// Assina um objeto inutNFe /// </summary> /// <param name="inutNFe"></param> /// <param name="certificadoDigital">Informe o certificado digital, se já possuir esse em cache, evitando novo acesso ao certificado</param> /// <returns>Retorna um objeto do tipo inutNFe assinado</returns> public static inutNFe Assina(this inutNFe inutNFe, X509Certificate2 certificadoDigital, string signatureMethodSignedXml = "http://www.w3.org/2000/09/xmldsig#rsa-sha1", string digestMethodReference = "http://www.w3.org/2000/09/xmldsig#sha1") { var inutNFeLocal = inutNFe; if (inutNFeLocal.infInut.Id == null) { throw new Exception("Não é possível assinar um onjeto inutNFe sem sua respectiva Id!"); } var assinatura = Assinador.ObterAssinatura(inutNFeLocal, inutNFeLocal.infInut.Id, certificadoDigital, false, signatureMethodSignedXml, digestMethodReference); inutNFeLocal.Signature = assinatura; return(inutNFeLocal); }
/// <summary> /// Obter mensagem Soap em formato Xml /// <para>Corpo da mensagem compativel com a especificação SOAP e requisitos Sefaz</para> /// </summary> /// <param name="urlWsdl">Endereço WSDL do serviço</param> /// <param name="entity"></param> /// <example></example> /// <returns></returns> protected virtual string ObterCorpoMensagemSoap(string urlWsdl, inutNFe entity) { var xmlCorpo = Utils.ObterStringXML(entity); var stringBuilder = new StringBuilder(); stringBuilder.Append("<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"yes\" ?>"); stringBuilder.Append( "<soap:Envelope xmlns:soap=\"http://www.w3.org/2003/05/soap-envelope\" xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\" xmlns:xsd=\"http://www.w3.org/2001/XMLSchema\">"); stringBuilder.Append("<soap:Body>"); stringBuilder.Append("<nfeDadosMsg xmlns=\"" + urlWsdl + "\">" + xmlCorpo + "</nfeDadosMsg>"); stringBuilder.Append("</soap:Body>"); stringBuilder.Append("</soap:Envelope>"); var msg = stringBuilder.ToString(); return(msg); }
/// <summary> /// Obter Dados /// </summary> /// <returns></returns> private inutNFe ObterDados() { var entity = new inutNFe { versao = VersaoServico.Ve400.ObterVersaoServico(), infInut = new infInutEnv { tpAmb = _emisorEmissorServicoConfig.Ambiente, cUF = _emisorEmissorServicoConfig.Estado, ano = _ano, CNPJ = _cnpj?.RetirarCaracteresEspeciais(), mod = _modelo, serie = _serie, nNFIni = _numeroInicial, nNFFin = _numeroFinal, xJust = _justificativa } }; ValidarRegra(entity); return(entity); }
private inutNFe FabricarInutNFe(eTipoAmbiente tpAmb, eUF uf, int ano, string cnpj, eModeloDocumento modelo, int serie, int numeroInicial, int numeroFinal, string justificativa) { //Zion.Common.Assertions.ZionAssertion.StringHasMinLen(justificativa, 15, "Justificativa deve conter entre 15 e 255 caracteres"); //Zion.Common.Assertions.ZionAssertion.StringHasMaxLen(justificativa, 255, "Justificativa deve conter entre 15 e 255 caracteres"); string versaoServico = cfgServico.VersaoInutilizacaoNFe.Descricao(); var pedInutilizacao = new inutNFe { versao = versaoServico, infInut = new infInutEnv { tpAmb = tpAmb, cUF = uf, ano = ano, CNPJ = cnpj, mod = modelo, serie = serie, nNFIni = numeroInicial, nNFFin = numeroFinal, xJust = justificativa } }; var numId = string.Concat( (int)pedInutilizacao.infInut.cUF, pedInutilizacao.infInut.ano.ToString("D2"), pedInutilizacao.infInut.CNPJ, (int)pedInutilizacao.infInut.mod, pedInutilizacao.infInut.serie.ToString().PadLeft(3, '0'), pedInutilizacao.infInut.nNFIni.ToString().PadLeft(9, '0'), pedInutilizacao.infInut.nNFFin.ToString().PadLeft(9, '0') ); pedInutilizacao.infInut.Id = "ID" + numId; pedInutilizacao.Assinar(ObterCertificado.Obter(cfgServico.ConfigCertificado)); return(pedInutilizacao); }
/// <summary> /// Inutiliza uma faixa de números /// </summary> /// <param name="cnpj"></param> /// <param name="ano"></param> /// <param name="modelo"></param> /// <param name="serie"></param> /// <param name="numeroInicial"></param> /// <param name="numeroFinal"></param> /// <param name="justificativa"></param> /// <returns>Retorna um objeto da classe RetornoNfeInutilizacao com o retorno do serviço NfeInutilizacao</returns> public RetornoNfeInutilizacao NfeInutilizacao(string cnpj, int ano, ModeloDocumento modelo, int serie, int numeroInicial, int numeroFinal, string justificativa) { var versaoServico = Auxiliar.VersaoServicoParaString(ServicoNFe.NfeInutilizacao, _cFgServico.VersaoNfeInutilizacao); #region Cria o objeto wdsl para consulta var ws = CriarServico(ServicoNFe.NfeInutilizacao, TipoRecepcaoEvento.Nenhum); ws.nfeCabecMsg = new nfeCabecMsg { cUF = _cFgServico.cUF, versaoDados = versaoServico }; #endregion #region Cria o objeto inutNFe var pedInutilizacao = new inutNFe { versao = versaoServico, infInut = new infInutEnv { tpAmb = _cFgServico.tpAmb, cUF = _cFgServico.cUF, ano = ano, CNPJ = cnpj, mod = modelo, serie = serie, nNFIni = numeroInicial, nNFFin = numeroFinal, xJust = justificativa } }; var numId = String.Concat((int)pedInutilizacao.infInut.cUF, pedInutilizacao.infInut.ano, pedInutilizacao.infInut.CNPJ, (int)pedInutilizacao.infInut.mod, pedInutilizacao.infInut.serie.ToString().PadLeft(3, '0'), pedInutilizacao.infInut.nNFIni.ToString().PadLeft(9, '0'), pedInutilizacao.infInut.nNFFin.ToString().PadLeft(9, '0')); pedInutilizacao.infInut.Id = "ID" + numId; pedInutilizacao.Assina(); #endregion #region Valida, Envia os dados e obtém a resposta var xmlInutilizacao = pedInutilizacao.ObterXmlString(); Validador.Valida(ServicoNFe.NfeInutilizacao, TipoRecepcaoEvento.Nenhum, _cFgServico.VersaoNfeInutilizacao, xmlInutilizacao); var dadosInutilizacao = new XmlDocument(); dadosInutilizacao.LoadXml(xmlInutilizacao); SalvarArquivoXml(numId + "-ped-inu.xml", xmlInutilizacao); var retorno = ws.Execute(dadosInutilizacao); var retornoXmlString = retorno.OuterXml; var retInutNFe = new retInutNFe().CarregarDeXmlString(retornoXmlString); SalvarArquivoXml(numId + "-inu.xml", retornoXmlString); return(new RetornoNfeInutilizacao(pedInutilizacao.ObterXmlString(), retInutNFe.ObterXmlString(), retornoXmlString, retInutNFe)); #endregion }
/// <summary> /// Converte o objeto inutNFe para uma string no formato XML /// </summary> /// <param name="pedInutilizacao"></param> /// <returns>Retorna uma string no formato XML com os dados do objeto inutNFe</returns> public static string ObterXmlString(this inutNFe pedInutilizacao) { return(FuncoesXml.ClasseParaXmlString(pedInutilizacao)); }
/// <summary> /// Coverte uma string XML no formato NFe para um objeto inutNFe /// </summary> /// <param name="inutNFe"></param> /// <param name="xmlString"></param> /// <returns>Retorna um objeto do tipo inutNFe</returns> public static inutNFe CarregarDeXmlString(this inutNFe inutNFe, string xmlString) { return(FuncoesXml.XmlStringParaClasse <inutNFe>(xmlString)); }