diff --git a/NFe.AppTeste/MainWindow.xaml b/NFe.AppTeste/MainWindow.xaml
index 4c8704abc..7a793539b 100644
--- a/NFe.AppTeste/MainWindow.xaml
+++ b/NFe.AppTeste/MainWindow.xaml
@@ -974,6 +974,8 @@
Margin="10,260,0,0" VerticalAlignment="Top" Width="177" Click="BtnConciliacaoFinanceira_Click" />
+
diff --git a/NFe.AppTeste/MainWindow.xaml.cs b/NFe.AppTeste/MainWindow.xaml.cs
index 0b006c1d2..1409fa640 100644
--- a/NFe.AppTeste/MainWindow.xaml.cs
+++ b/NFe.AppTeste/MainWindow.xaml.cs
@@ -2263,6 +2263,61 @@ private void BtnCancelarNFeSubstituicao_OnClick(object sender, RoutedEventArgs e
}
}
-
+ private void BtnAtorInteressado_Click(object sender, RoutedEventArgs e)
+ {
+ const string titulo = "Evento Ator Interessado na NF-e";
+
+ try
+ {
+ #region Evento Ator Interessado na NF-e
+
+ var idlote = Funcoes.InpuBox(this, titulo, "Identificador de controle do Lote de envio:", "1");
+ if (string.IsNullOrEmpty(idlote)) throw new Exception("A Id do Lote deve ser informada!");
+
+ var sequenciaEvento = Funcoes.InpuBox(this, titulo, "Número sequencial do evento:", "2");
+ if (string.IsNullOrEmpty(sequenciaEvento)) throw new Exception("O número sequencial deve ser informado!");
+
+ var chave = Funcoes.InpuBox(this, titulo, "Chave da NFe:", "28241132876302000114550010000090041001283454");
+ if (string.IsNullOrEmpty(chave)) throw new Exception("A Chave deve ser informada!");
+ if (chave.Length != 44) throw new Exception("Chave deve conter 44 caracteres!");
+
+ var cnpjTransportador = Funcoes.InpuBox(this, titulo, "CPF/CNPJ do Ator Interessado:", "10526704000156");
+ if (string.IsNullOrEmpty(cnpjTransportador)) throw new Exception("O CPF/CNPJ do Ator Interessado deve ser informado!");
+ if (cnpjTransportador.Length != 14 && cnpjTransportador.Length != 11) throw new Exception("O CPF/CNPJ deve conter 11 ou 14 caracteres!");
+
+ var servicoNFe = new ServicosNFe(_configuracoes.CfgServico);
+ var cpfcnpj = string.IsNullOrEmpty(_configuracoes.Emitente.CNPJ)
+ ? _configuracoes.Emitente.CPF
+ : _configuracoes.Emitente.CNPJ;
+
+ var retornoAtorInteressado = servicoNFe.RecepcaoEventoAtorInteressado(
+ Convert.ToInt32(idlote),
+ Convert.ToInt16(sequenciaEvento),
+ cpfcnpj,
+ chave,
+ cnpjTransportador,
+ Classes.Servicos.Evento.TipoAutor.taEmpresaEmitente,
+ Classes.Servicos.Evento.TipoAutorizacao.Permite,
+ DFe.Classes.Entidades.Estado.SE);
+
+ TrataRetorno(retornoAtorInteressado);
+
+ #endregion
+ }
+ catch (ComunicacaoException ex)
+ {
+ Funcoes.Mensagem(ex.Message, "Erro", MessageBoxButton.OK);
+ }
+ catch (ValidacaoSchemaException ex)
+ {
+ Funcoes.Mensagem(ex.Message, "Erro", MessageBoxButton.OK);
+ }
+ catch (Exception ex)
+ {
+ if (!string.IsNullOrEmpty(ex.Message))
+ Funcoes.Mensagem(ex.Message, "Erro", MessageBoxButton.OK);
+ }
+ }
+
}
}
\ No newline at end of file
diff --git a/NFe.AppTeste/Schemas/110150_v1.00.xsd b/NFe.AppTeste/Schemas/110150_v1.00.xsd
new file mode 100644
index 000000000..f263537df
--- /dev/null
+++ b/NFe.AppTeste/Schemas/110150_v1.00.xsd
@@ -0,0 +1,88 @@
+
+
+
+
+
+
+ Schema XML de validação do evento de Ator Interessado na NF-e - Transportador (110150)”
+
+
+
+
+
+ Descrição do Evento - "Ator interessado na NF-e”"
+
+
+
+
+
+
+
+
+
+
+
+ Tipo do Órgão Autor do Evento. Informar uma das opções 1=Geração do Evento pelo Emitente; 2=Geração do Evento pelo Destinatário; 3=Geração do Evento pelo Transportador
+Outros valores: 1=Empresa Emitente, 2=Empresa destinatária; 3=Empresa; 5=Fisco; 6=RFB; 9=Outros Órgãos;
+
+
+
+
+
+
+
+
+
+
+
+
+ Versão do aplicativo do Autor do Evento.
+
+
+
+
+ Pessoas autorizadas a acessar o XML da NF-e
+
+
+
+
+
+
+
+
+
+
+ 0 – Não permite; 1 – Permite o transportador autorizado pelo emitente ou destinatário autorizar outros transportadores para ter acesso ao download da NF-e
+
+
+
+
+
+
+
+
+
+
+
+
+ Texto Fixo com as Condição de uso do tipo de autorização para o transportador:
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/NFe.Classes/Servicos/Evento/detEvento.cs b/NFe.Classes/Servicos/Evento/detEvento.cs
index befaedb01..774547c93 100644
--- a/NFe.Classes/Servicos/Evento/detEvento.cs
+++ b/NFe.Classes/Servicos/Evento/detEvento.cs
@@ -32,9 +32,11 @@
/********************************************************************************/
using System;
using System.Collections.Generic;
+using System.Runtime.ConstrainedExecution;
using System.Xml.Serialization;
using DFe.Classes.Entidades;
using DFe.Utils;
+using NFe.Classes.Informacoes;
using NFe.Classes.Informacoes.Identificacao.Tipos;
using Shared.NFe.Classes.Servicos.Evento;
@@ -54,20 +56,6 @@ public class detEvento
///
public string descEvento { get; set; }
- #region Carta de Correção
-
- ///
- /// HP20 - Correção a ser considerada, texto livre. A correção mais recente substitui as anteriores.
- ///
- public string xCorrecao { get; set; }
-
- ///
- /// HP20a - Condições de uso da Carta de Correção
- ///
- public string xCondUso { get; set; }
-
- #endregion
-
#region EPEC
///
@@ -328,5 +316,44 @@ public bool ShouldSerializedetPag()
}
#endregion
+
+ #region Ator Interessado NFe
+ ///
+ /// P23 - Pessoas autorizadas a acessar o XML da NF-e
+ ///
+ [XmlElement("autXML")]
+ public List autXML { get; set; }
+
+ ///
+ /// P26 - 0 = Não permite;
+ /// 1 = Permite o transportador autorizado pelo
+ /// emitente ou destinatário autorizar outros
+ /// transportadores para ter acesso ao download da
+ /// NF-e
+ ///
+ public TipoAutorizacao? tpAutorizacao { get; set; }
+
+ public bool ShouldSerializetpAutorizacao()
+ {
+ return tpAutorizacao != null;
+ }
+
+ #endregion
+
+ #region Carta de Correção
+
+ ///
+ /// HP20 - Correção a ser considerada, texto livre. A correção mais recente substitui as anteriores.
+ ///
+ public string xCorrecao { get; set; }
+
+ ///
+ /// HP20a - Condições de uso da Carta de Correção.
+ /// P27 - Condição de uso do tipo de autorização para o transportador.
+ ///
+ public string xCondUso { get; set; }
+
+ #endregion
+
}
}
\ No newline at end of file
diff --git a/NFe.Classes/Servicos/Evento/detEventoTipos.cs b/NFe.Classes/Servicos/Evento/detEventoTipos.cs
index c2e3832d2..bcf74bd1d 100644
--- a/NFe.Classes/Servicos/Evento/detEventoTipos.cs
+++ b/NFe.Classes/Servicos/Evento/detEventoTipos.cs
@@ -31,6 +31,7 @@
/* Rua Comendador Francisco josé da Cunha, 111 - Itabaiana - SE - 49500-000 */
/********************************************************************************/
using System.ComponentModel;
+using System.Runtime.ConstrainedExecution;
using System.Xml.Serialization;
namespace NFe.Classes.Servicos.Evento
@@ -128,4 +129,31 @@ public enum MotivoInsucesso
[XmlEnum("4")]
Outros = 4
}
+
+ ///
+ /// 0 – Não permite;
+ /// 1 – Permite o transportador autorizado pelo
+ /// emitente ou destinatário autorizar outros
+ /// transportadores para ter acesso ao download da
+ /// NF-e
+ ///
+ public enum TipoAutorizacao
+ {
+ ///
+ /// 0 – Não permite
+ ///
+ [Description("Não permite")]
+ [XmlEnum("0")]
+ NaoPermite = 0,
+
+ ///
+ /// 1 – Permite o transportador autorizado pelo
+ /// emitente ou destinatário autorizar outros
+ /// transportadores para ter acesso ao download da
+ /// NF-e
+ ///
+ [Description("Permite")]
+ [XmlEnum("1")]
+ Permite = 1
+ }
}
\ No newline at end of file
diff --git a/NFe.Classes/Servicos/Evento/retEvento.cs b/NFe.Classes/Servicos/Evento/retEvento.cs
index 69b2b26cd..88a3d8bc2 100644
--- a/NFe.Classes/Servicos/Evento/retEvento.cs
+++ b/NFe.Classes/Servicos/Evento/retEvento.cs
@@ -31,6 +31,7 @@
/* Rua Comendador Francisco josé da Cunha, 111 - Itabaiana - SE - 49500-000 */
/********************************************************************************/
using System.Xml.Serialization;
+using DFe.Classes.Assinatura;
namespace NFe.Classes.Servicos.Evento
{
@@ -47,5 +48,12 @@ public class retEvento
/// HR11 - Grupo de informações do registro do Evento
///
public infEventoRet infEvento { get; set; }
+
+ ///
+ /// HR91 - Assinatura Digital do documento XML, a assinatura deverá ser aplicada no elemento infEvento.
+ /// A decisão de assinar a mensagem fica da critério da UF.
+ ///
+ [XmlElement(Namespace = "http://www.w3.org/2000/09/xmldsig#")]
+ public Signature Signature { get; set; }
}
}
\ No newline at end of file
diff --git a/NFe.Classes/Servicos/Tipos/NFeServicosTipos.cs b/NFe.Classes/Servicos/Tipos/NFeServicosTipos.cs
index c0f8a1a6f..7e1f5a6c9 100644
--- a/NFe.Classes/Servicos/Tipos/NFeServicosTipos.cs
+++ b/NFe.Classes/Servicos/Tipos/NFeServicosTipos.cs
@@ -89,6 +89,11 @@ public enum ServicoNFe
///
RecepcaoEventoManifestacaoDestinatario,
+ ///
+ /// serviço destinado à recepção de mensagem do Evento de Ator Interessado da NF-e
+ ///
+ RecepcaoEventoAtorInteressado,
+
///
/// serviço destinado à recepção de mensagens de lote de NF-e versão 2.0
///
@@ -184,6 +189,7 @@ public enum IndicadorSincronizacao
/// 110112 - Cancelamento por substituição
/// 110130 - Comprovante de Entrega da NF-e
/// 110131 - Cancelamento Comprovante de Entrega da NF-e
+ /// 110150 - Ator Interessado na NF-e
/// 110192 - Insucesso na Entrega da NF-e
/// 110193 - Cancelamento Insucesso na Entrega da NF-e
/// 110750 - Conciliação Financeira da NF-e
@@ -222,6 +228,13 @@ public enum NFeTipoEvento
[Description("Cancelamento por substituicao")]
[XmlEnum("110112")]
TeNfeCancelamentoSubstituicao = 110112,
+
+ ///
+ /// 110150 - Ator interessado na NF-e
+ ///
+ [Description("Ator interessado na NF-e")]
+ [XmlEnum("110150")]
+ TeNfeAtorInteressadoNFe = 110150,
///
/// 110192 - Insucesso na Entrega da NF-e
diff --git a/NFe.Servicos/ServicoNfeFactory.cs b/NFe.Servicos/ServicoNfeFactory.cs
index 50e418b22..1f19fce86 100644
--- a/NFe.Servicos/ServicoNfeFactory.cs
+++ b/NFe.Servicos/ServicoNfeFactory.cs
@@ -249,6 +249,9 @@ public static INfeServico CriaWsdlOutros(ServicoNFe servico, ConfiguracaoServico
return new RecepcaoEvento(url, certificado, cfg.TimeOut);
+ case ServicoNFe.RecepcaoEventoAtorInteressado:
+ return new RecepcaoEvento4AN(url, certificado, cfg.TimeOut);
+
case ServicoNFe.RecepcaoEventoEpec:
if (cfg.VersaoRecepcaoEventoEpec == VersaoServico.Versao400)
{
diff --git a/NFe.Servicos/ServicosNFe.cs b/NFe.Servicos/ServicosNFe.cs
index 8f3b49b09..3473a0c3a 100644
--- a/NFe.Servicos/ServicosNFe.cs
+++ b/NFe.Servicos/ServicosNFe.cs
@@ -78,6 +78,7 @@
using System.Xml.Linq;
using NFe.Classes.Servicos.ConsultaGtin;
using NFe.Utils.ConsultaGtin;
+using NFe.Classes.Informacoes;
namespace NFe.Servicos
{
@@ -409,7 +410,8 @@ private RetornoRecepcaoEvento RecepcaoEvento(int idlote, List eventos, S
ServicoNFe.RecepcaoEventoComprovanteEntregaNFe,
ServicoNFe.RecepcaoEventoCancComprovanteEntregaNFe,
ServicoNFe.RecepcaoEventoConciliacaoFinanceiraNFe,
- ServicoNFe.RecepcaoEventoCancConciliacaoFinanceiraNFe
+ ServicoNFe.RecepcaoEventoCancConciliacaoFinanceiraNFe,
+ ServicoNFe.RecepcaoEventoAtorInteressado
};
if (
!listaEventos.Contains(servicoEvento))
@@ -592,6 +594,76 @@ private RetornoRecepcaoEvento RecepcaoEventoCancelamento(NFeTipoEvento tipoEvent
return retorno;
}
+ ///
+ /// Processa a recepção do evento "Ator Interessado na NF-e - Transportador"
+ ///
+ /// Número do lote
+ /// Sequência do evento
+ /// CNPJ ou CPF do autor do evento
+ /// Chave da NFe
+ /// CNPJ ou CPF do ator interessado emitente de CT-e
+ /// Tipo do autor gerador do evento
+ /// Tipo de autorização do ator interessado
+ /// Unidade federativa do autor
+ /// Versão do aplicativo do autor do evento
+ /// Data e hora do evento
+ /// Resultado da recepção do evento
+ public RetornoRecepcaoEvento RecepcaoEventoAtorInteressado(int idlote, int sequenciaEvento, string cpfCnpjAtorEvento,
+ string chaveNFe, string cnpfCnpjAtorInteressado, TipoAutor? tipoAutor = null, TipoAutorizacao? tipoAutorizacao = null,
+ Estado? ufAutor = null, string versaoAplicativo = null, DateTimeOffset? dhEvento = null)
+ {
+ var tipoAutorEmitenteOuDestinataria = tipoAutor == TipoAutor.taEmpresaEmitente || tipoAutor == TipoAutor.taEmpresaDestinataria;
+
+ var versaoServico = ServicoNFe.RecepcaoEventoCancelmento.VersaoServicoParaString(
+ _cFgServico.VersaoRecepcaoEventoAtorInteressado);
+
+ var detEvento = new detEvento
+ {
+ versao = versaoServico,
+ descEvento = NFeTipoEvento.TeNfeAtorInteressadoNFe.Descricao(),
+ cOrgaoAutor = ufAutor ?? _cFgServico.cUF,
+ tpAutor = tipoAutor,
+ verAplic = versaoAplicativo ?? "1.0",
+ autXML = new List
+ {
+ new autXML
+ {
+ CPF = cnpfCnpjAtorInteressado.Length == 11 ? cnpfCnpjAtorInteressado : null,
+ CNPJ = cnpfCnpjAtorInteressado.Length == 11 ? null : cnpfCnpjAtorInteressado
+ }
+ },
+ tpAutorizacao = tipoAutorEmitenteOuDestinataria ? tipoAutorizacao : null,
+ xCondUso = tipoAutorEmitenteOuDestinataria
+ ? "O emitente ou destinatário da NF-e, declara que permite o transportador declarado no campo CNPJ/CPF deste evento a autorizar os transportadores subcontratados ou redespachados a terem acesso ao download da NF-e"
+ : null
+ };
+
+ var infEvento = new infEventoEnv
+ {
+ cOrgao = Estado.AN,
+ tpAmb = _cFgServico.tpAmb,
+ CNPJ = cpfCnpjAtorEvento.Length == 11 ? null : cpfCnpjAtorEvento,
+ CPF = cpfCnpjAtorEvento.Length == 11 ? cpfCnpjAtorEvento : null,
+ chNFe = chaveNFe,
+ dhEvento = dhEvento ?? DateTime.Now,
+ tpEvento = NFeTipoEvento.TeNfeAtorInteressadoNFe,
+ nSeqEvento = sequenciaEvento,
+ verEvento = versaoServico,
+ detEvento = detEvento
+ };
+
+ var evento = new evento
+ {
+ versao = versaoServico,
+ infEvento = infEvento
+ };
+
+ var retorno = RecepcaoEvento(idlote, new List { evento },
+ ServicoNFe.RecepcaoEventoAtorInteressado, _cFgServico.VersaoRecepcaoEventoAtorInteressado, true);
+
+ return retorno;
+ }
+
///
/// Envia um evento do tipo "Carta de Correção"
///
diff --git a/NFe.Utils/ConfiguracaoServico.cs b/NFe.Utils/ConfiguracaoServico.cs
index 112bfc5d9..14f4033bc 100644
--- a/NFe.Utils/ConfiguracaoServico.cs
+++ b/NFe.Utils/ConfiguracaoServico.cs
@@ -65,6 +65,7 @@ public sealed class ConfiguracaoServico : INotifyPropertyChanged
private VersaoServico _versaoRecepcaoEventoConciliacaoFinanceira;
private VersaoServico _versaoRecepcaoEventoEpec;
private VersaoServico _versaoRecepcaoEventoManifestacaoDestinatario;
+ private VersaoServico _versaoRecepcaoEventoAtorInteressado;
private VersaoServico _versaoNfeRecepcao;
private VersaoServico _versaoNfeRetRecepcao;
private VersaoServico _versaoNfeConsultaCadastro;
@@ -242,6 +243,7 @@ private void AtualizaVersoes()
VersaoRecepcaoEventoConciliacaoFinanceira = obterVersao(ServicoNFe.RecepcaoEventoConciliacaoFinanceiraNFe);
VersaoRecepcaoEventoEpec = obterVersao(ServicoNFe.RecepcaoEventoEpec);
VersaoRecepcaoEventoManifestacaoDestinatario = obterVersao(ServicoNFe.RecepcaoEventoManifestacaoDestinatario);
+ VersaoRecepcaoEventoAtorInteressado = obterVersao(ServicoNFe.RecepcaoEventoAtorInteressado);
VersaoNfeRecepcao = obterVersao(ServicoNFe.NfeRecepcao);
VersaoNfeRetRecepcao = obterVersao(ServicoNFe.NfeRetRecepcao);
VersaoNfeConsultaCadastro = obterVersao(ServicoNFe.NfeConsultaCadastro);
@@ -345,6 +347,20 @@ public VersaoServico VersaoRecepcaoEventoManifestacaoDestinatario
}
}
+ ///
+ /// Versão do serviço RecepcaoEvento para Ator interessado
+ ///
+ public VersaoServico VersaoRecepcaoEventoAtorInteressado
+ {
+ get { return _versaoRecepcaoEventoAtorInteressado; }
+ set
+ {
+ if (value == _versaoRecepcaoEventoAtorInteressado) return;
+ _versaoRecepcaoEventoAtorInteressado = value;
+ OnPropertyChanged();
+ }
+ }
+
///
/// Versão do serviço NfeRecepcao
///
diff --git a/NFe.Utils/Enderecos/Enderecador.cs b/NFe.Utils/Enderecos/Enderecador.cs
index 5dc607c27..895fa7814 100644
--- a/NFe.Utils/Enderecos/Enderecador.cs
+++ b/NFe.Utils/Enderecos/Enderecador.cs
@@ -1613,6 +1613,9 @@ private static List CarregarEnderecosServicos()
// Comprovante de Entrega
addServico(new[] { ServicoNFe.RecepcaoEventoComprovanteEntregaNFe, ServicoNFe.RecepcaoEventoCancComprovanteEntregaNFe }, versao1, hom, TipoEmissao.teNormal, estado, modelo, "https://hom1.nfe.fazenda.gov.br/NFeRecepcaoEvento4/NFeRecepcaoEvento4.asmx");
+
+ // Ator Interessado
+ addServico(new[] { ServicoNFe.RecepcaoEventoAtorInteressado }, versao1, hom, TipoEmissao.teNormal, estado, modelo, "https://hom1.nfe.fazenda.gov.br/NFeRecepcaoEvento4/NFeRecepcaoEvento4.asmx");
}
}
@@ -1645,6 +1648,9 @@ private static List CarregarEnderecosServicos()
// Comprovante de Entrega
addServico(new[] { ServicoNFe.RecepcaoEventoComprovanteEntregaNFe, ServicoNFe.RecepcaoEventoCancComprovanteEntregaNFe }, versao1, prod, TipoEmissao.teNormal, estado, modelo, "https://www.nfe.fazenda.gov.br/NFeRecepcaoEvento4/NFeRecepcaoEvento4.asmx");
+
+ // Ator Interessado
+ addServico(new[] { ServicoNFe.RecepcaoEventoAtorInteressado }, versao1, prod, TipoEmissao.teNormal, estado, modelo, "https://www.nfe.fazenda.gov.br/NFeRecepcaoEvento4/NFeRecepcaoEvento4.asmx");
}
}
@@ -1720,6 +1726,8 @@ public static void CarregarEnderecos()
return cfgServico.VersaoRecepcaoEventoEpec;
case ServicoNFe.RecepcaoEventoManifestacaoDestinatario:
return cfgServico.VersaoRecepcaoEventoManifestacaoDestinatario;
+ case ServicoNFe.RecepcaoEventoAtorInteressado:
+ return cfgServico.VersaoRecepcaoEventoAtorInteressado;
case ServicoNFe.NfeRecepcao:
return cfgServico.VersaoNfeRecepcao;
case ServicoNFe.NfeRetRecepcao:
diff --git a/NFe.Utils/Validacao/Validador.cs b/NFe.Utils/Validacao/Validador.cs
index 82e9d20dc..cf30b2ae7 100644
--- a/NFe.Utils/Validacao/Validador.cs
+++ b/NFe.Utils/Validacao/Validador.cs
@@ -78,6 +78,8 @@ internal static string ObterArquivoSchema(ServicoNFe servicoNFe, VersaoServico v
return "envEPEC_v1.00.xsd";
case ServicoNFe.RecepcaoEventoManifestacaoDestinatario:
return "envConfRecebto_v1.00.xsd";
+ case ServicoNFe.RecepcaoEventoAtorInteressado:
+ return "envEventoAtorInteressado_v1.00.xsd";
case ServicoNFe.NfeInutilizacao:
switch (versaoServico)
{