Пример #1
0
        public async Task ConsultarFreteTipo()
        {
            if (!Convert.ToBoolean(ConfigurationManager.AppSettings["IntegracaoSankhya_Habilitar"]))
            {
                return;
            }

            string where = "WHERE NUCAMPO IN (SELECT NUCAMPO FROM TDDCAM WHERE NOMETAB = 'TGFCAB' AND NOMECAMPO = 'CIF_FOB')";

            List <FreteTipoIntegracao> freteTiposIntegracao = await IntegracaoSankhya.Instance.PreExecutarQuery <FreteTipoIntegracao>(where : where);

            foreach (var freteTipoInt in freteTiposIntegracao)
            {
                try
                {
                    ValidarDadosIntegracao(freteTipoInt);

                    bool freteTipoNovo = false;

                    FreteTipo freteTipo = _uow.FreteTipoRepository.ConsultarPorSigla(freteTipoInt.Sigla);

                    if (freteTipo == null)
                    {
                        freteTipoNovo = true;
                        freteTipo     = new FreteTipo();
                    }

                    freteTipo.Descricao = freteTipoInt.Descricao;
                    freteTipo.Sigla     = freteTipoInt.Sigla;

                    if (freteTipoNovo)
                    {
                        _uow.FreteTipoRepository.Add(freteTipo);
                    }
                    else
                    {
                        _uow.FreteTipoRepository.Update(freteTipo);
                    }

                    _uow.SaveChanges();
                }
                catch (Exception ex)
                {
                    _log.Error(string.Format("Erro na integração do tipo de frete: {0}.", freteTipoInt.Sigla), ex);
                }
            }
        }
Пример #2
0
        public async Task ConsultaNotaFiscalCompra()
        {
            if (!Convert.ToBoolean(ConfigurationManager.AppSettings["IntegracaoSankhya_Habilitar"]))
            {
                return;
            }

            var where = " WHERE TGFCAB.TIPMOV = 'C' AND TGFCAB.STATUSNOTA <> 'L' AND (TGFCAB.AD_STATUSREC = 0 OR TGFCAB.AD_STATUSREC IS NULL)";
            var inner = " INNER JOIN TGFITE ON TGFCAB.NUNOTA = TGFITE.NUNOTA";

            List <NotaFiscalIntegracao> notasIntegracao = await IntegracaoSankhya.Instance.PreExecutarQuery <NotaFiscalIntegracao>(where, inner);

            List <FreteTipo>     tiposFrete = _uow.FreteTipoRepository.RetornarTodos();
            IQueryable <Empresa> empresas   = _uow.EmpresaRepository.Tabela();
            var unidadesMedida = _uow.UnidadeMedidaRepository.RetornarTodos();

            Dictionary <string, List <NotaFiscalIntegracao> > notasIntegracaoGrp = notasIntegracao.GroupBy(g => g.CodigoIntegracao).ToDictionary(d => d.Key, d => d.ToList());

            foreach (var notasInt in notasIntegracaoGrp)
            {
                try
                {
                    var notafiscalIntegracao = notasInt.Value.First();

                    ValidarDadosIntegracao(notafiscalIntegracao);

                    var     codEmp  = Convert.ToInt64(notafiscalIntegracao.CodigoIntegracaoEmpresa);
                    Empresa empresa = empresas.FirstOrDefault(f => f.CodigoIntegracao == codEmp);
                    if (empresa == null)
                    {
                        throw new Exception(string.Format("Código da Empresa (CODEMP: {0}) inválido", notafiscalIntegracao.CodigoIntegracaoEmpresa));
                    }

                    var            codParcTransp  = Convert.ToInt64(notafiscalIntegracao.CodigoIntegracaoTransportadora);
                    Transportadora transportadora = _uow.TransportadoraRepository.Todos().FirstOrDefault(f => f.CodigoIntegracao == codParcTransp);
                    if (transportadora == null)
                    {
                        throw new Exception(string.Format("Código da Transportadora (CODPARCTRANSP: {0}) inválido", notafiscalIntegracao.CodigoIntegracaoTransportadora));
                    }

                    var        codParc    = Convert.ToInt64(notafiscalIntegracao.CodigoIntegracaoFornecedor);
                    Fornecedor fornecedor = _uow.FornecedorRepository.Todos().FirstOrDefault(f => f.CodigoIntegracao == codParc);
                    if (fornecedor == null)
                    {
                        throw new Exception(string.Format("Código da Fornecedor (CODPARC: {0}) inválido", notafiscalIntegracao.CodigoIntegracaoFornecedor));
                    }

                    DateTime?dataVencimento = null;

                    try
                    {
                        dataVencimento = await ConsultarDataVencimento(notafiscalIntegracao.CodigoIntegracao);
                    }
                    catch (Exception)
                    {
                        throw new Exception(string.Format("Data de Vencimento inválida (NUMNOTA: {0})", notafiscalIntegracao.CodigoIntegracao));
                    }

                    bool notaNova = true;

                    var        codNota    = Convert.ToInt64(notafiscalIntegracao.CodigoIntegracao);
                    NotaFiscal notafiscal = _uow.NotaFiscalRepository.ObterPorCodigoIntegracao(codNota);

                    if (notafiscal != null)
                    {
                        notaNova = false;
                        var lote = _uow.LoteRepository.PesquisarLotePorNotaFiscal(notafiscal.IdNotaFiscal);

                        if (lote != null)
                        {
                            throw new Exception("Já existe um lote aberto para esta nota fiscal, portanto não é possível integrá-la novamente.");
                        }
                    }
                    else
                    {
                        notafiscal = new NotaFiscal();
                    }

                    notafiscal.Numero                   = Convert.ToInt32(notafiscalIntegracao.Numero);
                    notafiscal.Serie                    = notafiscalIntegracao.Serie;
                    notafiscal.CodigoIntegracao         = codNota;
                    notafiscal.ValorTotal               = Convert.ToDecimal(notafiscalIntegracao.ValorTotal.Replace(".", ","));
                    notafiscal.ValorFrete               = Convert.ToDecimal(notafiscalIntegracao.ValorFrete.Replace(".", ","));
                    notafiscal.NumeroConhecimento       = notafiscalIntegracao.NumeroConhecimento == null ? (long?)null : Convert.ToInt64(notafiscalIntegracao.NumeroConhecimento);
                    notafiscal.PesoBruto                = notafiscalIntegracao.PesoBruto == null ? (decimal?)null : Convert.ToDecimal(notafiscalIntegracao.PesoBruto.Replace(".", ","));
                    notafiscal.Quantidade               = Convert.ToInt32(notafiscalIntegracao.QuantidadeVolume);
                    notafiscal.Especie                  = notafiscalIntegracao.Especie;
                    notafiscal.StatusIntegracao         = notafiscalIntegracao.StatusIntegracao;
                    notafiscal.IdNotaFiscalStatus       = NotaFiscalStatusEnum.ProcessandoIntegracao;
                    notafiscal.ChaveAcesso              = notafiscalIntegracao.ChaveAcesso;
                    notafiscal.IdFornecedor             = fornecedor.IdFornecedor;
                    notafiscal.DataEmissao              = notafiscalIntegracao.DataEmissao == null ? DateTime.Now : DateTime.ParseExact(notafiscalIntegracao.DataEmissao, "ddMMyyyy HH:mm:ss", CultureInfo.InvariantCulture);
                    notafiscal.IdEmpresa                = empresa.IdEmpresa;
                    notafiscal.IdTransportadora         = transportadora.IdTransportadora;
                    notafiscal.CodigoIntegracaoVendedor = Convert.ToInt32(notafiscalIntegracao.CodigoIntegracaoVendedor);
                    notafiscal.IdNotaFiscalTipo         = NotaFiscalTipoEnum.Compra;
                    notafiscal.NumeroFicticioNF         = notafiscalIntegracao.NumeroFicticioNF;
                    notafiscal.DataVencimento           = dataVencimento;

                    FreteTipo freteTipo = tiposFrete.FirstOrDefault(f => f.Sigla == notafiscalIntegracao.FreteTipo);
                    if (freteTipo != null)
                    {
                        notafiscal.IdFreteTipo = freteTipo.IdFreteTipo;
                    }

                    var notafiscalItens = notasInt.Value.Select(s => new { s.CodigoIntegracao, s.CodigoIntegracaoProduto, s.UnidadeMedida, s.Quantidade, s.ValorUnitarioItem, s.ValorTotal, s.Sequencia, s.QuantidadeDevolucao }).ToList();

                    List <NotaFiscalItem> itemsNotaFsical = new List <NotaFiscalItem>();

                    foreach (var item in notafiscalItens)
                    {
                        var codProduto = Convert.ToInt64(item.CodigoIntegracaoProduto);
                        var qtdNeg     = Convert.ToInt32(item.Quantidade);
                        var sequencia  = Convert.ToInt32(item.Sequencia);

                        Produto produto = _uow.ProdutoRepository.Todos().FirstOrDefault(f => f.CodigoIntegracao == codProduto);
                        if (produto == null)
                        {
                            throw new Exception(string.Format("Código da Produto (CODPROD: {0}) inválido", item.CodigoIntegracaoProduto));
                        }

                        var unidade = unidadesMedida.FirstOrDefault(f => f.Sigla == item.UnidadeMedida);
                        if (unidade == null)
                        {
                            throw new Exception(string.Format("Código da Unidade de Medida (CODVOL: {0}) inválido", item.UnidadeMedida));
                        }

                        NotaFiscalItem notaFiscalItem = new NotaFiscalItem();
                        notaFiscalItem.IdUnidadeMedida     = unidade.IdUnidadeMedida;
                        notaFiscalItem.IdProduto           = produto.IdProduto;
                        notaFiscalItem.Quantidade          = qtdNeg;
                        notaFiscalItem.ValorUnitario       = Convert.ToDecimal(item.ValorUnitarioItem.Replace(".", ","));
                        notaFiscalItem.ValorTotal          = Convert.ToDecimal(item.ValorTotal.Replace(".", ","));
                        notaFiscalItem.CodigoNotaFiscal    = codNota;
                        notaFiscalItem.Sequencia           = sequencia;
                        notaFiscalItem.QuantidadeDevolucao = item.QuantidadeDevolucao.NullOrEmpty() ? 0 : Convert.ToInt32(item.QuantidadeDevolucao);

                        itemsNotaFsical.Add(notaFiscalItem);
                    }

                    int diasPrazoEntrega = _uow.ProdutoEstoqueRepository.ObterDiasPrazoEntrega(notafiscal.IdEmpresa, itemsNotaFsical.Select(s => s.IdProduto).ToList());

                    notafiscal.PrazoEntregaFornecedor = notafiscal.DataEmissao.AddDays(diasPrazoEntrega);

                    try
                    {
                        await AtualizarNotaFiscalRecebimento(notafiscal.ChaveAcesso).ConfigureAwait(false);
                    }
                    catch (Exception)
                    {
                        throw new Exception(string.Format("Erro ao atualizar a nota fiscal de recebimento de sequinte chave de acesso: {0}.", notafiscal.ChaveAcesso));
                    }

                    using (var transacao = _uow.CreateTransactionScope())
                    {
                        if (!notafiscal.NotaFiscalItens.NullOrEmpty())
                        {
                            _uow.NotaFiscalItemRepository.DeleteRange(notafiscal.NotaFiscalItens.ToList());
                        }

                        notafiscal.NotaFiscalItens = itemsNotaFsical;

                        if (notaNova)
                        {
                            _uow.NotaFiscalRepository.Add(notafiscal);
                        }
                        else
                        {
                            _uow.NotaFiscalRepository.Update(notafiscal);
                        }

                        _uow.SaveChanges();

                        transacao.Complete();
                    }

                    Dictionary <string, string> campoChave = new Dictionary <string, string> {
                        { "NUNOTA", notafiscal.CodigoIntegracao.ToString() }
                    };

                    await IntegracaoSankhya.Instance.AtualizarInformacaoIntegracao("CabecalhoNota", campoChave, "AD_STATUSREC", NotaFiscalStatusEnum.AguardandoRecebimento.GetHashCode());

                    notafiscal.IdNotaFiscalStatus = NotaFiscalStatusEnum.AguardandoRecebimento;

                    _uow.SaveChanges();
                }
                catch (Exception ex)
                {
                    _log.Error(string.Format("Erro na integração da seguinte nota fiscal: {0}.", notasInt.Key), ex);

                    continue;
                }
            }
        }