コード例 #1
0
        private List <LoteDivergencia> GravarTratamentoDivergencia(TratarDivergenciaRequest request)
        {
            List <LoteDivergencia> loteDivergenciasMenos = new List <LoteDivergencia>();

            foreach (TratarDivergenciaItemRequest divergencia in request.Divergencias)
            {
                LoteDivergencia loteDivergencia = _uow.LoteDivergenciaRepository.GetById(divergencia.IdLoteDivergencia);

                loteDivergencia.QuantidadeDivergenciaMais  = divergencia.QuantidadeMaisTratado ?? 0;
                loteDivergencia.QuantidadeDivergenciaMenos = divergencia.QuantidadeMenosTratado ?? 0;
                loteDivergencia.IdUsuarioDivergencia       = request.IdUsuario;
                loteDivergencia.IdLoteDivergenciaStatus    = LoteDivergenciaStatusEnum.DivergenciaTratada;
                loteDivergencia.DataTratamentoDivergencia  = DateTime.Now;

                _uow.LoteDivergenciaRepository.Update(loteDivergencia);

                if (loteDivergencia.QuantidadeDivergenciaMenos > 0)
                {
                    loteDivergenciasMenos.Add(loteDivergencia);
                }
            }

            _uow.SaveChanges();

            return(loteDivergenciasMenos);
        }
コード例 #2
0
        private void AtualizarSaldoArmazenagem(Dictionary <long, List <NotaFiscalItem> > nfItens, NotaFiscal notafiscal, List <LoteDivergencia> loteDivergenciasMenos)
        {
            foreach (var nfItem in nfItens)
            {
                LoteDivergencia divergencia = null;

                if (!loteDivergenciasMenos.NullOrEmpty())
                {
                    divergencia = loteDivergenciasMenos.FirstOrDefault(w => w.IdProduto == nfItem.Key);
                }

                int qtdNF = nfItem.Value.Sum(s => s.Quantidade);

                if (divergencia != null && divergencia.QuantidadeDivergenciaMenos > 0)
                {
                    qtdNF = qtdNF - divergencia.QuantidadeDivergenciaMenos.Value;
                }

                _uow.ProdutoEstoqueRepository.AtualizarSaldoArmazenagem(nfItem.Key, notafiscal.IdEmpresa, qtdNF);
            }
        }
コード例 #3
0
        private void RegistrarLoteProduto(Dictionary <long, List <NotaFiscalItem> > nfItens, Lote lote, List <LoteDivergencia> loteDivergenciasMenos)
        {
            LoteProduto loteProduto;

            foreach (var nfItem in nfItens)
            {
                LoteDivergencia divergencia = null;

                //Verifica se houve divergência a menos do produto no lote.
                if (!loteDivergenciasMenos.NullOrEmpty())
                {
                    divergencia = loteDivergenciasMenos.FirstOrDefault(w => w.IdProduto == nfItem.Key); //Captura a divergência do produto.
                }

                //Captura a quantidade total do produto na nota.
                int qtdNF = nfItem.Value.Sum(s => s.Quantidade);

                if (divergencia != null && divergencia.QuantidadeDivergenciaMenos > 0)
                {
                    //Subtrai a quantidade de peças a menos da quantidade total do produto.
                    qtdNF = qtdNF - divergencia.QuantidadeDivergenciaMenos.Value;
                }

                loteProduto = new LoteProduto();

                loteProduto.IdEmpresa          = lote.NotaFiscal.IdEmpresa;
                loteProduto.IdLote             = lote.IdLote;
                loteProduto.IdProduto          = nfItem.Key;
                loteProduto.QuantidadeRecebida = qtdNF;
                loteProduto.Saldo = qtdNF;

                _uow.LoteProdutoRepository.Add(loteProduto);
            }

            _uow.SaveChanges();
        }
コード例 #4
0
        public async Task FinalizarConferencia(long idlote, string userId)
        {
            Lote                   lote             = _uow.LoteRepository.GetById(idlote);
            NotaFiscal             notafiscal       = _uow.NotaFiscalRepository.GetById(lote.IdNotaFiscal);
            List <LoteConferencia> loteConferencias = _uow.LoteConferenciaRepository.Obter(lote.IdLote);
            List <LoteDivergencia> loteDivergencias = new List <LoteDivergencia>();
            List <LoteConferencia> loteNaoConferido = new List <LoteConferencia>();

            var nfItens = notafiscal.NotaFiscalItens.GroupBy(g => g.IdProduto).ToDictionary(g => g.Key, g => g.ToList());

            foreach (var nfItem in nfItens)
            {
                LoteDivergencia divergencia = null;

                var qtdOriginal  = nfItem.Value.Sum(s => s.Quantidade);
                var qtdDevolucao = nfItem.Value.Sum(s => s.QuantidadeDevolucao);
                var conferencia  = loteConferencias.Where(x => x.IdProduto == nfItem.Key).ToList();

                if (conferencia.NullOrEmpty())
                {
                    divergencia = new LoteDivergencia
                    {
                        QuantidadeConferenciaMenos = qtdOriginal,
                        QuantidadeDevolucao        = qtdDevolucao,
                        QuantidadeConferencia      = 0,
                        QuantidadeConferenciaMais  = 0
                    };

                    var loteConferencia = new LoteConferencia()
                    {
                        IdLote              = lote.IdLote,
                        IdTipoConferencia   = notafiscal.Empresa.EmpresaConfig.IdTipoConferencia.Value,
                        IdProduto           = nfItem.Key,
                        Quantidade          = 0,
                        QuantidadeDevolucao = qtdDevolucao,
                        DataHoraInicio      = DateTime.Now,
                        DataHoraFim         = DateTime.Now,
                        Tempo = new DateTime(DateTime.Now.Year, DateTime.Now.Month, DateTime.Now.Day, 0, 0, 0),
                        IdUsuarioConferente = userId
                    };

                    loteNaoConferido.Add(loteConferencia);
                }
                else
                {
                    var qtdConferida = conferencia.Sum(s => s.Quantidade);

                    if (qtdConferida == qtdOriginal)
                    {
                        continue;
                    }

                    divergencia = new LoteDivergencia
                    {
                        QuantidadeConferencia      = qtdConferida,
                        QuantidadeDevolucao        = qtdDevolucao,
                        QuantidadeConferenciaMais  = qtdConferida > qtdOriginal ? qtdConferida - qtdOriginal : 0,
                        QuantidadeConferenciaMenos = qtdConferida < qtdOriginal ? qtdOriginal - qtdConferida : 0
                    };
                }

                if (divergencia == null)
                {
                    continue;
                }

                divergencia.IdProduto               = nfItem.Key;
                divergencia.IdLote                  = lote.IdLote;
                divergencia.IdNotaFiscal            = lote.IdNotaFiscal;
                divergencia.IdLoteDivergenciaStatus = LoteDivergenciaStatusEnum.AguardandoTratativa;

                loteDivergencias.Add(divergencia);
            }
            ;

            var conferenciaMais = loteConferencias.Where(s => !nfItens.Any(w => w.Key == s.IdProduto)).GroupBy(g => g.IdProduto).ToDictionary(g => g.Key, g => g.ToList());

            foreach (var item in conferenciaMais)
            {
                var qtdConferida = item.Value.Sum(s => s.Quantidade);
                var qtdDevolucao = item.Value.Sum(s => s.QuantidadeDevolucao);

                LoteDivergencia divergencia = new LoteDivergencia
                {
                    QuantidadeConferenciaMais  = qtdConferida,
                    QuantidadeConferenciaMenos = 0,
                    QuantidadeConferencia      = qtdConferida,
                    QuantidadeDevolucao        = qtdDevolucao,
                    IdProduto               = item.Key,
                    IdLote                  = lote.IdLote,
                    IdNotaFiscal            = lote.IdNotaFiscal,
                    IdLoteDivergenciaStatus = LoteDivergenciaStatusEnum.AguardandoTratativa
                };

                loteDivergencias.Add(divergencia);
            }

            var tempoTotal = new TimeSpan(0, 0, 0);

            loteConferencias.ForEach(f => { tempoTotal = tempoTotal.Add(new TimeSpan(f.Tempo.Hour, f.Tempo.Minute, f.Tempo.Second)); });
            lote.TempoTotalConferencia = Convert.ToInt64(tempoTotal.TotalSeconds);

            NotaFiscalStatusEnum notaStatus;
            LoteStatusEnum       loteStatus;

            if (loteDivergencias.NullOrEmpty())
            {
                loteStatus = LoteStatusEnum.Finalizado;
                notaStatus = NotaFiscalStatusEnum.Confirmada;

                await AtualizarNotaFiscalIntegracao(notafiscal, loteStatus);
                await ConfirmarNotaFiscalIntegracao(notafiscal.CodigoIntegracao);
            }
            else
            {
                loteStatus = LoteStatusEnum.ConferidoDivergencia;
                notaStatus = NotaFiscalStatusEnum.ConferidaDivergencia;

                await AtualizarNotaFiscalIntegracao(notafiscal, loteStatus);
            }

            using (TransactionScope transactionScope = _uow.CreateTransactionScope())
            {
                lote.IdLoteStatus             = loteStatus;
                lote.DataFinalConferencia     = DateTime.Now;
                notafiscal.IdNotaFiscalStatus = notaStatus;

                _uow.LoteConferenciaRepository.AddRange(loteNaoConferido);
                _uow.LoteDivergenciaRepository.AddRange(loteDivergencias);
                _uow.SaveChanges();

                if (notaStatus == NotaFiscalStatusEnum.Confirmada)
                {
                    //Registrar quantidade recebida na entidade LoteProduto.
                    RegistrarLoteProduto(nfItens, lote, null);

                    AtualizarSaldoArmazenagem(nfItens, notafiscal, null);
                }

                transactionScope.Complete();
            }
        }
コード例 #5
0
        public async Task <LoteStatusEnum> RegistrarDevolucaoTotal(Lote lote, string userId)
        {
            NotaFiscal notafiscal = _uow.NotaFiscalRepository.GetById(lote.IdNotaFiscal);

            List <LoteDivergencia> loteDivergencias = new List <LoteDivergencia>();
            List <LoteConferencia> loteConferencias = new List <LoteConferencia>();

            var nfItens = notafiscal.NotaFiscalItens.GroupBy(g => g.IdProduto).ToDictionary(g => g.Key, g => g.ToList());

            foreach (var nfItem in nfItens)
            {
                LoteConferencia conferencia = null;
                LoteDivergencia divergencia = null;

                //Captura quantidade e quantidade devolução da nota.
                var quantidade          = nfItem.Value.Sum(s => s.Quantidade);
                var quantidadeDevolucao = nfItem.Value.Sum(s => s.QuantidadeDevolucao);

                conferencia = new LoteConferencia()
                {
                    IdLote              = lote.IdLote,
                    IdTipoConferencia   = notafiscal.Empresa.EmpresaConfig.IdTipoConferencia.Value,
                    IdProduto           = nfItem.Key,
                    Quantidade          = 0,
                    QuantidadeDevolucao = quantidadeDevolucao,
                    DataHoraInicio      = DateTime.Now,
                    DataHoraFim         = DateTime.Now,
                    Tempo = new DateTime(DateTime.Now.Year, DateTime.Now.Month, DateTime.Now.Day, 0, 0, 0),
                    IdUsuarioConferente = userId
                };

                divergencia = new LoteDivergencia()
                {
                    IdLote                     = lote.IdLote,
                    IdProduto                  = nfItem.Key,
                    IdNotaFiscal               = lote.IdNotaFiscal,
                    IdLoteDivergenciaStatus    = LoteDivergenciaStatusEnum.AguardandoTratativa,
                    IdUsuarioDivergencia       = userId,
                    QuantidadeConferencia      = quantidade,
                    QuantidadeConferenciaMais  = 0,
                    QuantidadeConferenciaMenos = 0,
                    QuantidadeDivergenciaMais  = 0,
                    QuantidadeDivergenciaMenos = 0,
                    QuantidadeDevolucao        = quantidadeDevolucao,
                    DataTratamentoDivergencia  = DateTime.Now
                };

                loteConferencias.Add(conferencia);
                loteDivergencias.Add(divergencia);
            }
            ;

            //Captura o tempo total da conferência. Neste caso, 0.
            var tempoTotal = new TimeSpan(0, 0, 0);

            loteConferencias.ForEach(f => { tempoTotal = tempoTotal.Add(new TimeSpan(f.Tempo.Hour, f.Tempo.Minute, f.Tempo.Second)); });
            lote.TempoTotalConferencia = Convert.ToInt64(tempoTotal.TotalSeconds);

            NotaFiscalStatusEnum notaStatus;
            LoteStatusEnum       loteStatus;

            //Atribui diretamente que o status do lote e da nota é ConferidoDivergencia.
            loteStatus = LoteStatusEnum.ConferidoDivergencia;
            notaStatus = NotaFiscalStatusEnum.ConferidaDivergencia;

            await AtualizarNotaFiscalIntegracao(notafiscal, loteStatus);

            using (TransactionScope transactionScope = _uow.CreateTransactionScope())
            {
                lote.IdLoteStatus             = loteStatus;
                lote.DataFinalConferencia     = DateTime.Now;
                notafiscal.IdNotaFiscalStatus = notaStatus;

                _uow.LoteConferenciaRepository.AddRange(loteConferencias);
                _uow.LoteDivergenciaRepository.AddRange(loteDivergencias);
                _uow.SaveChanges();

                transactionScope.Complete();
            }

            lote.IdLoteStatus = LoteStatusEnum.AguardandoCriacaoNFDevolucao;

            await AtualizarNotaFiscalIntegracao(notafiscal, lote.IdLoteStatus);
            await ConfirmarNotaFiscalIntegracao(notafiscal.CodigoIntegracao);

            notafiscal.IdNotaFiscalStatus = NotaFiscalStatusEnum.Confirmada;
            _uow.SaveChanges();

            return(lote.IdLoteStatus);
        }