コード例 #1
0
        public async Task RegistrarConferenciaAutomatico(Lote lote, string userId)
        {
            lote.IdLoteStatus          = LoteStatusEnum.Conferencia;
            lote.DataInicioConferencia = DateTime.Now;

            await AtualizarNotaFiscalIntegracao(lote.NotaFiscal, lote.IdLoteStatus);

            _uow.LoteConferenciaRepository.DeletePorIdLote(lote.IdLote);

            _uow.SaveChanges();

            foreach (var item in lote.NotaFiscal.NotaFiscalItens)
            {
                LoteConferencia loteConf = new LoteConferencia()
                {
                    IdLote              = lote.IdLote,
                    IdTipoConferencia   = TipoConferenciaEnum.PorQuantidade,
                    IdProduto           = item.IdProduto,
                    Quantidade          = item.Quantidade,
                    DataHoraInicio      = DateTime.Now,
                    DataHoraFim         = DateTime.Now,
                    Tempo               = new DateTime(DateTime.Now.Year, DateTime.Now.Month, DateTime.Now.Day, 0, 0, 0),
                    IdUsuarioConferente = userId
                };

                _uow.LoteConferenciaRepository.Add(loteConf);
            }

            _uow.SaveChanges();

            await FinalizarConferencia(lote.IdLote, userId);
        }
コード例 #2
0
        public async Task <ConferenciaResponse> RegistrarConferencia(Lote lote, Produto produto, string idUsuario, string inicioConferencia, int idTipoConferencia, int quantidadePorCaixa, int quantidadeCaixa)
        {
            try
            {
                if (lote.IdLoteStatus != LoteStatusEnum.Conferencia)
                {
                    lote.IdLoteStatus = LoteStatusEnum.Conferencia;
                    _uow.LoteRepository.Update(lote);

                    await _loteService.AtualizarNotaFiscalIntegracao(lote.NotaFiscal, lote.IdLoteStatus);
                }

                if (!DateTime.TryParse(inicioConferencia, out DateTime dataHoraInicioConferencia))
                {
                    dataHoraInicioConferencia = DateTime.Now;
                }

                DateTime dataHoraFimConferencia = DateTime.Now;
                TimeSpan _tempoConferencia      = dataHoraFimConferencia - dataHoraInicioConferencia;
                DateTime tempoConferencia       = new DateTime(DateTime.Now.Year, DateTime.Now.Month, DateTime.Now.Day, _tempoConferencia.Hours, _tempoConferencia.Minutes, _tempoConferencia.Seconds);

                LoteConferencia loteConferencia = new LoteConferencia()
                {
                    IdLote              = lote.IdLote,
                    IdTipoConferencia   = (TipoConferenciaEnum)idTipoConferencia,
                    IdProduto           = produto.IdProduto,
                    Quantidade          = quantidadePorCaixa * quantidadeCaixa,
                    DataHoraInicio      = dataHoraInicioConferencia,
                    DataHoraFim         = dataHoraFimConferencia,
                    Tempo               = tempoConferencia,
                    IdUsuarioConferente = idUsuario
                };

                _uow.LoteConferenciaRepository.Add(loteConferencia);

                _uow.SaveChanges();

                conferenciaResponse.Lote    = lote;
                conferenciaResponse.Produto = produto;
            }
            catch (Exception)
            {
                throw;
            }

            return(conferenciaResponse);
        }
コード例 #3
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();
            }
        }
コード例 #4
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);
        }