Example #1
0
        private void LoadConfig(bool isProducao)
        {
            _configuracao = _configuracaoService.GetConfiguracao();

            CscHom   = _configuracao.CscHom;
            CscIdHom = _configuracao.CscIdHom;
            EmailContabilidadeHom = _configuracao.EmailContabilidadeHom;
            ProximoNumNFCeHom     = _configuracao.ProximoNumNFCeHom;
            ProximoNumNFeHom      = _configuracao.ProximoNumNFeHom;
            SerieNFCeHom          = _configuracao.SerieNFCeHom;
            SerieNFeHom           = _configuracao.SerieNFeHom;

            CscProd   = _configuracao.Csc;
            CscIdProd = _configuracao.CscId;
            EmailContabilidadeProd = _configuracao.EmailContabilidade;
            ProximoNumNFCeProd     = _configuracao.ProximoNumNFCe;
            ProximoNumNFeProd      = _configuracao.ProximoNumNFe;
            SerieNFCeProd          = _configuracao.SerieNFCe;
            SerieNFeProd           = _configuracao.SerieNFe;
        }
        public async Task <Core.NotasFiscais.NotaFiscal> EnviarNota(NotaFiscalModel notaFiscalModel, Modelo modelo)
        {
            notaFiscalModel.ValidateModel();

            if (notaFiscalModel.HasErrors)
            {
                throw new ArgumentException("Nota fiscal contém erros de validação não resolvidos.");
            }

            if (notaFiscalModel.Pagamentos[0].FormaPagamento != "Sem Pagamento" &&
                notaFiscalModel.Produtos.Sum(c => c.QtdeProduto * c.ValorUnitario) !=
                notaFiscalModel.Pagamentos.Sum(p => p.QtdeParcelas * p.ValorParcela))
            {
                await _dialogService.ShowError("Valor total da nota não corresponde ao valor de pagamento.",
                                               "Erro!", "Ok", null);

                throw new ArgumentException("Valor total da nota não corresponde ao valor de pagamento.");
            }

            Core.NotasFiscais.NotaFiscal notaFiscal = null;
            var config   = _configuracaoService.GetConfiguracao();
            var ambiente = config.IsProducao ? Ambiente.Producao : Ambiente.Homologacao;

            await Task.Run(() =>
            {
                var modeloNota = modelo;
                const TipoEmissao tipoEmissao = TipoEmissao.Normal; //verificar status do serviço e etc
                var destinatario   = GetDestinatario(notaFiscalModel, ambiente, modelo);
                var documentoDanfe =
                    destinatario != null ? destinatario.DocumentoDanfe : "CPF"; //Encapsular isso aqui
                var emitente = _emissorService.GetEmissor();
                var codigoUF = (CodigoUfIbge)Enum.Parse(typeof(CodigoUfIbge), emitente.Endereco.UF);

                var identificacao = GetIdentificacao(notaFiscalModel, codigoUF, DateTime.Now, emitente, modeloNota,
                                                     Convert.ToInt32(notaFiscalModel.Serie), notaFiscalModel.Numero, tipoEmissao, ambiente, documentoDanfe);
                var produtos      = GetProdutos(notaFiscalModel, config);
                var pagamentos    = GetPagamentos(notaFiscalModel);
                var totalNFe      = GetTotalNFe(notaFiscalModel);
                var infoAdicional = new InfoAdicional(produtos);
                var transporte    = GetTransporte(notaFiscalModel, modelo);

                notaFiscal = new Core.NotasFiscais.NotaFiscal(emitente, destinatario, identificacao, transporte,
                                                              totalNFe, infoAdicional, produtos, pagamentos);

                var cscId = ambiente == Ambiente.Homologacao ? config.CscIdHom : config.CscId;
                var csc   = ambiente == Ambiente.Homologacao ? config.CscHom : config.Csc;
                _enviaNotaFiscalService.EnviarNotaFiscal(notaFiscal, cscId, csc);
            });

            NotaEnviadaEvent(notaFiscal);
            return(notaFiscal);
        }
Example #3
0
        private void LoadedCmd_Execute(string modelo)
        {
            NotaFiscal = new NFCeModel();

            if (modelo != null && modelo.Equals("55"))
            {
                _modelo = Modelo.Modelo55;
                NotaFiscal.IsImpressaoBobina = false;
            }
            else
            {
                _modelo = Modelo.Modelo65;
            }

            NotaFiscal.DestinatarioSelecionado = new DestinatarioModel();
            Pagamento = new PagamentoVO();
            Pagamento.FormaPagamento = "Dinheiro";

            var config = _configuracaoService.GetConfiguracao();

            NotaFiscal.Serie      = config.IsProducao ? config.SerieNFCe : config.SerieNFCeHom;
            NotaFiscal.Numero     = config.IsProducao ? config.ProximoNumNFCe : config.ProximoNumNFCeHom;
            NotaFiscal.ModeloNota = "NFC-e";

            NotaFiscal.DataEmissao       = DateTime.Now;
            NotaFiscal.HoraEmissao       = DateTime.Now;
            NotaFiscal.DataSaida         = DateTime.Now;
            NotaFiscal.HoraSaida         = DateTime.Now;
            NotaFiscal.IndicadorPresenca = PresencaComprador.Presencial;
            NotaFiscal.Finalidade        = "Normal";

            var produtos = _produtoService.GetProdutosByNaturezaOperacao("Venda");

            foreach (var produto in produtos)
            {
                ProdutosCombo.Add(produto);
            }

            var destinatarios = _destinatarioService.GetAll();

            foreach (var destDB in destinatarios)
            {
                Destinatarios.Add((DestinatarioModel)destDB);
            }
        }
        private void InutilizarNotaFiscal(NFCeModel notaFiscal)
        {
            var config = _configuracaoService.GetConfiguracao();

            var emitente   = _emissorService.GetEmissor();
            var codigoUF   = (CodigoUfIbge)Enum.Parse(typeof(CodigoUfIbge), emitente.Endereco.UF);
            var ambiente   = config.IsProducao ? Ambiente.Producao : Ambiente.Homologacao;
            var modeloNota = notaFiscal.Modelo.Contains("NFC-e") ? Modelo.Modelo65 : Modelo.Modelo55;

            if (modeloNota == Modelo.Modelo55) //NF-e
            {
                string proximoNumNFe = ambiente == Ambiente.Homologacao ? config.ProximoNumNFeHom : config.ProximoNumNFe;
                var    numAtual      = (int.Parse(proximoNumNFe) - 1).ToString();

                //Se o número atual não tiver mudado, significa que ela não foi enviada e pode ser excluída sem inutilizar.
                if (notaFiscal.Numero == numAtual)
                {
                    if (ambiente == Ambiente.Homologacao)
                    {
                        config.ProximoNumNFeHom = numAtual;
                    }
                    else
                    {
                        config.ProximoNumNFe = numAtual;
                    }

                    var modelo = notaFiscal.Modelo == "NFC-e" ? "65" : "55";
                    _notaFiscalRepository.ExcluirNota(notaFiscal.Chave, ambiente);
                    NotaInutilizadaEvent(notaFiscal);
                    _configuracaoService.Salvar(config);
                }
                else //caso o número atual seja diferente, é necessário inutilizar
                {
                    var mensagemRetorno = _notaInutilizadaService.InutilizarNotaFiscal(emitente.Endereco.UF, codigoUF, ambiente, emitente.CNPJ, modeloNota,
                                                                                       notaFiscal.Serie, notaFiscal.Numero, notaFiscal.Numero);

                    if (mensagemRetorno.Status != Core.NotasFiscais.Sefaz.NfeInutilizacao2.Status.ERRO)
                    {
                        _notaFiscalRepository.ExcluirNota(notaFiscal.Chave, ambiente);
                        NotaInutilizadaEvent(notaFiscal);
                        _configuracaoService.Salvar(config);
                    }
                    else
                    {
                        MessageBox.Show("Houve um erro ao tentar cancelar a nota. Tente novamente e, se o erro persistir, contate o suporte." + "\n\n" + mensagemRetorno.Mensagem, "Erro!", MessageBoxButton.OK, MessageBoxImage.Information);
                    }
                }
            }
            else //NFC-e
            {
                string proximoNumNFCe = ambiente == Ambiente.Homologacao ? config.ProximoNumNFeHom : config.ProximoNumNFe;
                var    numAtual       = (int.Parse(proximoNumNFCe) - 1).ToString();

                if (notaFiscal.Numero == numAtual)
                {
                    if (ambiente == Ambiente.Homologacao)
                    {
                        config.ProximoNumNFCeHom = numAtual;
                    }
                    else
                    {
                        config.ProximoNumNFCe = numAtual;
                    }

                    var modelo = notaFiscal.Modelo == "NFC-e" ? "65" : "55";
                    _notaFiscalRepository.ExcluirNota(notaFiscal.Chave, ambiente);
                    NotaInutilizadaEvent(notaFiscal);
                    _configuracaoService.Salvar(config);
                }
                else
                {
                    var mensagemRetorno = _notaInutilizadaService.InutilizarNotaFiscal(emitente.Endereco.UF, codigoUF, ambiente, emitente.CNPJ, modeloNota,
                                                                                       notaFiscal.Serie, notaFiscal.Numero, notaFiscal.Numero);

                    if (mensagemRetorno.Status != Core.NotasFiscais.Sefaz.NfeInutilizacao2.Status.ERRO)
                    {
                        _notaFiscalRepository.ExcluirNota(notaFiscal.Chave, ambiente);
                        NotaInutilizadaEvent(notaFiscal);
                        _configuracaoService.Salvar(config);
                    }
                    else
                    {
                        MessageBox.Show("Houve um erro ao tentar cancelar a nota. Tente novamente e, se o erro persistir, contate o suporte." + "\n\n" + mensagemRetorno.Mensagem, "Erro!", MessageBoxButton.OK, MessageBoxImage.Information);
                    }
                }
            }
        }
        public int EmitirNotaContingencia(NotaFiscal notaFiscal, string cscId, string csc)
        {
            var qrCode = string.Empty;
            string newNodeXml;
            const string nFeNamespaceName = "http://www.portalfiscal.inf.br/nfe";
            var digVal = string.Empty;

            var config = _configuracaoService.GetConfiguracao();

            notaFiscal.Identificacao.Numero = _configuracaoService.ObterProximoNumeroNotaFiscal(notaFiscal.Identificacao.Modelo);
            notaFiscal.Identificacao.DataHoraEntradaContigencia = config.DataHoraEntradaContingencia;
            notaFiscal.Identificacao.JustificativaContigencia = config.JustificativaContingencia;
            notaFiscal.Identificacao.TipoEmissao = notaFiscal.Identificacao.Modelo == Modelo.Modelo65
                ? TipoEmissao.ContigenciaNfce
                : TipoEmissao.FsDa;
            notaFiscal.CalcularChave();

            X509Certificate2 certificado;

            var certificadoEntity = _certificadoRepository.GetCertificado();

            if (!string.IsNullOrWhiteSpace(certificadoEntity.Caminho))
                certificado = _certificateManager.GetCertificateByPath(certificadoEntity.Caminho,
                    RijndaelManagedEncryption.DecryptRijndael(certificadoEntity.Senha));
            else
                certificado = _certificateManager.GetCertificateBySerialNumber(certificadoEntity.NumeroSerial, false);

            if (notaFiscal.Identificacao.Ambiente == Ambiente.Homologacao)
                notaFiscal.Produtos[0].Descricao = "NOTA FISCAL EMITIDA EM AMBIENTE DE HOMOLOGACAO - SEM VALOR FISCAL";

            var refUri = "#NFe" + notaFiscal.Identificacao.Chave;

            var xml = Regex.Replace(XmlUtil.GerarXmlLoteNFe(notaFiscal, nFeNamespaceName), "<motDesICMS>1</motDesICMS>",
                string.Empty);
            XmlNode node = AssinaturaDigital.AssinarLoteComUmaNota(xml, refUri, certificado, ref digVal);

            if (notaFiscal.Identificacao.Modelo == Modelo.Modelo65)
            {
                qrCode = QrCodeUtil.GerarQrCodeNFe(notaFiscal.Identificacao.Chave, notaFiscal.Destinatario,
                    digVal, notaFiscal.Identificacao.Ambiente,
                    notaFiscal.Identificacao.DataHoraEmissao,
                    notaFiscal.TotalNFe.IcmsTotal.ValorTotalNFe.ToString("F", CultureInfo.InvariantCulture),
                    notaFiscal.TotalNFe.IcmsTotal.ValorTotalIcms.ToString("F", CultureInfo.InvariantCulture), cscId,
                    csc, notaFiscal.Identificacao.TipoEmissao);

                newNodeXml = node.InnerXml.Replace("<qrCode />", "<qrCode>" + qrCode + "</qrCode>");
            }
            else
            {
                newNodeXml = node.InnerXml.Replace("<infNFeSupl><qrCode /></infNFeSupl>", "");
            }

            var document = new XmlDocument();
            document.LoadXml(newNodeXml);
            node = document.DocumentElement;

            if (node == null) throw new ArgumentException("Xml inválido.");

            var lote = (TEnviNFe)XmlUtil.Deserialize<TEnviNFe>(node.OuterXml);
            var nfe = lote.NFe[0];

            //salvar nota PreEnvio aqui
            notaFiscal.Identificacao.Status = Status.CONTINGENCIA;

            var idNotaCopiaSeguranca =  _notaFiscalRepository.SalvarNotaFiscalPendente(notaFiscal,
                XmlUtil.GerarNfeProcXml(nfe, qrCode),
                notaFiscal.Identificacao.Ambiente);

            var notaFiscalEntity =  _notaFiscalRepository.GetNotaFiscalById(idNotaCopiaSeguranca, false);
            notaFiscalEntity.Status = (int)Status.CONTINGENCIA;
            var nfeProcXml = XmlUtil.GerarNfeProcXml(nfe, qrCode);

             _notaFiscalRepository.Salvar(notaFiscalEntity, nfeProcXml);
            notaFiscal.QrCodeUrl = qrCode;
            return idNotaCopiaSeguranca;
        }
Example #6
0
        public Task <string> GerarZipEnvioContabilidadeAsync(DateTime periodo)
        {
            return(Task.Run(() =>
            {
                var config = _configuracaoService.GetConfiguracao();

                var notasNoPeriodo = _notaFiscalRepository.GetNotasFiscaisPorMesAno(periodo, config.IsProducao, true);
                var nfeNoPeriodo = notasNoPeriodo.Where(n => n.Modelo.Equals("55")).ToList();
                var nfceNoPeriodo = notasNoPeriodo.Where(n => n.Modelo.Equals("65")).ToList();

                var eventosCancelamentoNFe = _eventoService.GetEventosPorNotasId(nfeNoPeriodo.Select(n => n.Id), true);
                var eventosCancelamentoNFCe = _eventoService.GetEventosPorNotasId(nfceNoPeriodo.Select(n => n.Id), true);

                var nfeXMLs = nfeNoPeriodo.Select(n => new NotaXml(n.Chave, n.LoadXml())).ToList();
                var eventoNfeXMLs = eventosCancelamentoNFe.Select(e => new EventoCancelamentoXml(e.ChaveIdEvento, e.Xml)).ToList();
                var nfceXMLs = nfceNoPeriodo.Select(n => new NotaXml(n.Chave, n.LoadXml())).ToList();
                var eventoNfceXMLs = eventosCancelamentoNFCe.Select(e => new EventoCancelamentoXml(e.ChaveIdEvento, e.Xml)).ToList();

                var notasZip = notasNoPeriodo.ToList();

                var notasInutilizadas = _notaInutilizadaService.GetNotasFiscaisPorMesAno(periodo, config.IsProducao).ToList();

                string startPath = Path.Combine(Path.GetTempPath(), "EmissorNFe");

                try
                {
                    if (!Directory.Exists(startPath))
                    {
                        Directory.CreateDirectory(startPath);
                    }
                    else
                    {
                        Directory.Delete(startPath, true);
                        Directory.CreateDirectory(startPath);
                    }

                    string nfeDir = Path.Combine(startPath, "NFe");
                    string nfceDir = Path.Combine(startPath, "NFCe");

                    string zipPath = Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.Desktop), @"Notas Fiscais " + periodo.ToString("MM_yyyy") + ".zip");

                    if (File.Exists(zipPath))
                    {
                        File.Delete(zipPath);
                    }

                    _geradorPdf.GerarRelatorioGerencial(notasZip, notasInutilizadas, periodo, startPath);
                    //Gerar arquivos de notas inutilizadas e adicioná-las ao relatório

                    if (GravarXmlsNfe(nfeXMLs, eventoNfeXMLs, nfeDir) &&
                        GravarXmlsNfce(nfceXMLs, eventoNfceXMLs, nfceDir) &&
                        GerarXmlsNotasInutilizadas(notasInutilizadas, startPath))
                    {
                        ZipFile.CreateFromDirectory(startPath, zipPath);
                    }

                    return zipPath;
                }
                catch (Exception e)
                {
                    log.Error(e);
                    throw;
                }
                finally
                {
                    Directory.Delete(startPath, true);
                }
            }));
        }
        private async void EnviarNotaNovamenteCmd_ExecuteAsync(NotaFiscalMemento notaPendenteMemento)
        {
            IsBusy      = true;
            BusyContent = "Enviando...";

            var config = _configuracaoService.GetConfiguracao();

            var modelo = notaPendenteMemento.Tipo == "NFC-e" ? Modelo.Modelo65 : Modelo.Modelo55;

            //Preencher objeto da NotaFiscal a partir do XML e enviar para a correspondente ViewModel NFe ou NFCe
            var app        = Application.Current;
            var mainWindow = app.MainWindow;

            if (!_consultaStatusServicoService.ExecutarConsultaStatus(config, modelo))
            {
                MessageBox.Show(mainWindow,
                                "Serviço continua indisponível. Aguarde o reestabelecimento da conexão e tente novamente.",
                                "Erro de conexão ou serviço indisponível", MessageBoxButton.OK, MessageBoxImage.Information);
                return;
            }

            var ambiente     = config.IsProducao ? Ambiente.Producao : Ambiente.Homologacao;
            var notaFiscalDb = _notaFiscalRepository.GetNotaFiscalByChave(notaPendenteMemento.Chave);
            var xml          = await notaFiscalDb.LoadXmlAsync();

            var notaFiscalBo = _notaFiscalRepository.GetNotaFiscalFromNfeProcXml(xml);

            notaFiscalBo.Identificacao.DataHoraEmissao = DateTime.Now;

            foreach (var prod in notaFiscalBo.Produtos)
            {
                var produtoDb = _produtoService.GetByCodigo(prod.Codigo);
                prod.Id = produtoDb.Id;
            }

            try
            {
                var cscId = ambiente == Ambiente.Homologacao ? config.CscIdHom : config.CscId;
                var csc   = ambiente == Ambiente.Homologacao ? config.CscHom : config.Csc;

                _notaFiscalRepository.ExcluirNota(notaPendenteMemento.Chave, ambiente);
                _enviaNotaFiscalService.EnviarNotaFiscal(notaFiscalBo, cscId, csc);

                IsBusy = false;

                var mbResult = MessageBox.Show(mainWindow, "Nota enviada com sucesso! Deseja imprimi-la?",
                                               "Emissão NFe", MessageBoxButton.YesNo, MessageBoxImage.Question, MessageBoxResult.No);

                if (mbResult == MessageBoxResult.Yes)
                {
                    BusyContent = "Gerando impressão...";
                    IsBusy      = true;
                    await GeradorPDF.GerarPdfNotaFiscal(notaFiscalBo);
                }

                IsBusy = false;

                var          notaIndex = NotasFiscais.IndexOf(notaPendenteMemento);
                Destinatario destinatario;
                var          destinatarioUf = notaFiscalBo.Emitente.Endereco.UF;

                if (notaFiscalBo.Destinatario != null)
                {
                    destinatario   = notaFiscalBo.Destinatario;
                    destinatarioUf = destinatario.Endereco != null ? destinatario.Endereco.UF : destinatarioUf;
                }
                else
                {
                    destinatario = new Destinatario("CONSUMIDOR NÃO IDENTIFICADO");
                }

                var valorTotalProdutos = notaFiscalBo.ValorTotalProdutos.ToString("N2", new CultureInfo("pt-BR"));

                var notaMemento = new NotaFiscalMemento(notaFiscalBo.Identificacao.Numero,
                                                        notaFiscalBo.Identificacao.Modelo, notaFiscalBo.Identificacao.DataHoraEmissao,
                                                        notaFiscalBo.DataHoraAutorização, destinatario.NomeRazao, destinatarioUf, valorTotalProdutos,
                                                        notaFiscalBo.Identificacao.Status, notaFiscalBo.Identificacao.Chave);

                NotasFiscais[notaIndex] = notaMemento;
                NotaPendenteReenviadaEvent(notaFiscalBo);
            }
            catch (Exception e)
            {
                log.Error(e);
                MessageBox.Show(mainWindow,
                                "Ocorreram os seguintes erros ao tentar enviar a nota fiscal:\n\n" + e.InnerException.Message,
                                "Erro", MessageBoxButton.OK, MessageBoxImage.Information);
            }
        }
Example #8
0
        private void LoadedCmd_Execute(string modelo)
        {
            NotaFiscal = new NFeModel();

            if (modelo != null && modelo.Equals("55"))
            {
                _modelo = Modelo.Modelo55;
                NotaFiscal.IsImpressaoBobina = false;
            }
            else
            {
                _modelo = Modelo.Modelo65;
            }

            NotaFiscal.DestinatarioSelecionado = new DestinatarioModel();
            Pagamento = new PagamentoVO();
            Pagamento.FormaPagamento = "Dinheiro";

            var config = _configuracaoService.GetConfiguracao();

            NotaFiscal.Serie      = config.IsProducao ? config.SerieNFe : config.SerieNFeHom;
            NotaFiscal.Numero     = config.IsProducao ? config.ProximoNumNFe : config.ProximoNumNFeHom;
            NotaFiscal.ModeloNota = "NF-e";

            NotaFiscal.DataEmissao       = DateTime.Now;
            NotaFiscal.HoraEmissao       = DateTime.Now;
            NotaFiscal.DataSaida         = DateTime.Now;
            NotaFiscal.HoraSaida         = DateTime.Now;
            NotaFiscal.IndicadorPresenca = PresencaComprador.Presencial;
            NotaFiscal.Finalidade        = "Normal";

            if (Destinatarios.Count <= 0)
            {
                var destinatarios = _destinatarioService.GetAll();

                foreach (var destDB in destinatarios)
                {
                    Destinatarios.Add((DestinatarioModel)destDB);
                }
            }

            if (Transportadoras.Count <= 0)
            {
                var transportadoras = _transportadoraService.GetAll();

                foreach (var transpDB in transportadoras)
                {
                    Transportadoras.Add((TransportadoraModel)transpDB);
                }
            }

            if (NaturezasOperacoes.Count <= 0)
            {
                var naturezasDB = _naturezaOperacaoService.GetAll();

                foreach (var naturezaDB in naturezasDB)
                {
                    var natModel = new NaturezaOperacaoModel()
                    {
                        Id = naturezaDB.Id, Descricao = naturezaDB.Descricao
                    };
                    NaturezasOperacoes.Add(natModel);

                    if (natModel.Descricao.Equals(DEFAULT_NATUREZA_OPERACAO))
                    {
                        NaturezaOperacaoSelecionada = natModel;
                    }
                }
            }
            else
            {
                NaturezaOperacaoSelecionada = NaturezasOperacoes.FirstOrDefault(n => n.Descricao.Equals(DEFAULT_NATUREZA_OPERACAO));
            }
        }