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); }
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); } }
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(); }
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(); } }
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); }