コード例 #1
0
        public async Task FinalizarConferenciaEnderecoRequisicao(FinalizarConferenciaEnderecoRequisicao requisicao, long idEmpresa, string idUsuarioExecucao)
        {
            using (var transacao = _unitOfWork.CreateTransactionScope())
            {
                LoteProdutoEndereco loteProdutoEndereco = _unitOfWork.LoteProdutoEnderecoRepository.PesquisarPorEndereco(requisicao.IdEnderecoArmazenagem);

                if (loteProdutoEndereco == null)
                {
                    throw new BusinessException("O produto não está instalado neste endereço.");
                }

                var qtdAnterior = loteProdutoEndereco.Quantidade;

                if (requisicao.QuantidadeFinal == 0)
                {
                    await _armazenagemService.RetirarVolumeEndereco(requisicao.IdEnderecoArmazenagem, loteProdutoEndereco.IdLote.Value, requisicao.IdProduto, idEmpresa, idUsuarioExecucao);
                }
                else
                {
                    await _armazenagemService.AjustarVolumeLote(new AjustarVolumeLoteRequisicao
                    {
                        IdEmpresa             = idEmpresa,
                        IdEnderecoArmazenagem = requisicao.IdEnderecoArmazenagem,
                        IdLote          = loteProdutoEndereco.IdLote.Value,
                        IdProduto       = requisicao.IdProduto,
                        IdUsuarioAjuste = idUsuarioExecucao,
                        Quantidade      = requisicao.QuantidadeFinal
                    });

                    await _unitOfWork.SaveChangesAsync();
                }

                var atividadeEstoque = _unitOfWork.AtividadeEstoqueRepository.GetById(requisicao.IdAtividadeEstoque);

                atividadeEstoque.QuantidadeInicial = qtdAnterior;
                atividadeEstoque.QuantidadeFinal   = requisicao.QuantidadeFinal;
                atividadeEstoque.IdUsuarioExecucao = idUsuarioExecucao;
                atividadeEstoque.DataExecucao      = DateTime.Now;
                atividadeEstoque.Finalizado        = true;

                await _unitOfWork.SaveChangesAsync();

                _coletorHistoricoService.GravarHistoricoColetor(new GravarHistoricoColetorRequisicao
                {
                    IdColetorAplicacao     = ColetorAplicacaoEnum.Armazenagem,
                    IdColetorHistoricoTipo = ColetorHistoricoTipoEnum.ConferirEndereco,
                    Descricao = $"Conferiu a atividade do endereço {atividadeEstoque.EnderecoArmazenagem.Codigo} do produto {atividadeEstoque.Produto.Referencia}," +
                                $" a quantidade anterior era de {atividadeEstoque.QuantidadeInicial} e quantidade conferida foi {atividadeEstoque.QuantidadeFinal}.",
                    IdEmpresa = idEmpresa,
                    IdUsuario = idUsuarioExecucao
                });

                await _unitOfWork.SaveChangesAsync();

                transacao.Complete();
            }
        }
コード例 #2
0
        public async Task AjustarVolumeLote(AjustarVolumeLoteRequisicao requisicao)
        {
            var validarEnderecoInstalacaoRequisicao = new ValidarEnderecoAjusteRequisicao
            {
                IdEnderecoArmazenagem = requisicao.IdEnderecoArmazenagem
            };

            ValidarEnderecoAjuste(validarEnderecoInstalacaoRequisicao);

            ValidarProdutoAjuste(requisicao.IdEnderecoArmazenagem, requisicao.IdLote, requisicao.IdProduto, requisicao.IdEmpresa);

            ValidarQuantidadeAjuste(new ValidarQuantidadeAjusteRequisicao
            {
                IdEmpresa             = requisicao.IdEmpresa,
                IdEnderecoArmazenagem = requisicao.IdEnderecoArmazenagem,
                IdLote     = requisicao.IdLote,
                IdProduto  = requisicao.IdProduto,
                Quantidade = requisicao.Quantidade
            });

            Produto             produto         = _unitOfWork.ProdutoRepository.GetById(requisicao.IdProduto);
            LoteProdutoEndereco produtoEndereco = _unitOfWork.LoteProdutoEnderecoRepository.PesquisarPorEndereco(requisicao.IdEnderecoArmazenagem);
            decimal             pesoInstalacao  = produto.PesoLiquido / produto.MultiploVenda * requisicao.Quantidade;
            int quantidadeAnterior;

            try
            {
                using (var transacao = _unitOfWork.CreateTransactionScope())
                {
                    quantidadeAnterior = produtoEndereco.Quantidade;

                    produtoEndereco.Quantidade = requisicao.Quantidade;
                    produtoEndereco.PesoTotal  = pesoInstalacao;

                    _unitOfWork.LoteProdutoEnderecoRepository.Update(produtoEndereco);
                    await _unitOfWork.SaveChangesAsync();

                    var loteMovimentacao = new LoteMovimentacao
                    {
                        IdEmpresa              = requisicao.IdEmpresa,
                        IdLote                 = requisicao.IdLote,
                        IdProduto              = requisicao.IdProduto,
                        IdEnderecoArmazenagem  = requisicao.IdEnderecoArmazenagem,
                        IdUsuarioMovimentacao  = requisicao.IdUsuarioAjuste,
                        Quantidade             = requisicao.Quantidade,
                        IdLoteMovimentacaoTipo = LoteMovimentacaoTipoEnum.Ajuste,
                        DataHora               = DateTime.Now
                    };

                    _unitOfWork.LoteMovimentacaoRepository.Add(loteMovimentacao);
                    await _unitOfWork.SaveChangesAsync();

                    transacao.Complete();
                }

                var gravarHistoricoColetorRequisicao = new GravarHistoricoColetorRequisicao
                {
                    IdColetorAplicacao     = ColetorAplicacaoEnum.Armazenagem,
                    IdColetorHistoricoTipo = ColetorHistoricoTipoEnum.AjustarQuantidade,
                    Descricao = $"Ajustou a quantidade de {quantidadeAnterior} para {produtoEndereco.Quantidade} unidade(s) do produto {produtoEndereco.Produto.Referencia} do lote {produtoEndereco.Lote.IdLote} do endereço {produtoEndereco.EnderecoArmazenagem.Codigo}",
                    IdEmpresa = requisicao.IdEmpresa,
                    IdUsuario = requisicao.IdUsuarioAjuste
                };

                _coletorHistoricoService.GravarHistoricoColetor(gravarHistoricoColetorRequisicao);
            }
            catch
            {
                throw new BusinessException($"Erro ao ajustar a quantidade do produto {produto.Referencia} do lote {produtoEndereco.Lote.IdLote} e do endereço {produtoEndereco.EnderecoArmazenagem.Codigo}");
            }
        }
コード例 #3
0
        public async Task InstalarVolumeLote(InstalarVolumeLoteRequisicao requisicao)
        {
            var validarEnderecoInstalacaoRequisicao = new ValidarEnderecoInstalacaoRequisicao
            {
                IdEmpresa             = requisicao.IdEmpresa,
                IdLote                = requisicao.IdLote,
                IdProduto             = requisicao.IdProduto,
                Quantidade            = requisicao.Quantidade,
                IdEnderecoArmazenagem = requisicao.IdEnderecoArmazenagem
            };

            ValidarEnderecoInstalacao(validarEnderecoInstalacaoRequisicao);

            Produto             produto             = _unitOfWork.ProdutoRepository.GetById(requisicao.IdProduto);
            EnderecoArmazenagem enderecoArmazenagem = _unitOfWork.EnderecoArmazenagemRepository.GetById(requisicao.IdEnderecoArmazenagem);
            decimal             pesoInstalacao      = produto.PesoLiquido / produto.MultiploVenda * requisicao.Quantidade;

            using (var transacao = _unitOfWork.CreateTransactionScope())
            {
                var loteProdutoEndereco = new LoteProdutoEndereco
                {
                    IdEmpresa             = requisicao.IdEmpresa,
                    DataHoraInstalacao    = DateTime.Now,
                    IdEnderecoArmazenagem = requisicao.IdEnderecoArmazenagem,
                    IdLote              = requisicao.IdLote,
                    IdProduto           = requisicao.IdProduto,
                    IdUsuarioInstalacao = requisicao.IdUsuarioInstalacao,
                    Quantidade          = requisicao.Quantidade,
                    QuantidadeCaixas    = requisicao.QuantidadeCaixas,
                    PesoTotal           = pesoInstalacao
                };

                _unitOfWork.LoteProdutoEnderecoRepository.Add(loteProdutoEndereco);
                await _unitOfWork.SaveChangesAsync();

                var loteMovimentacao = new LoteMovimentacao
                {
                    IdEmpresa              = requisicao.IdEmpresa,
                    IdLote                 = requisicao.IdLote,
                    IdProduto              = requisicao.IdProduto,
                    IdEnderecoArmazenagem  = requisicao.IdEnderecoArmazenagem,
                    IdUsuarioMovimentacao  = requisicao.IdUsuarioInstalacao,
                    Quantidade             = requisicao.Quantidade,
                    IdLoteMovimentacaoTipo = LoteMovimentacaoTipoEnum.Entrada,
                    DataHora               = DateTime.Now
                };

                _unitOfWork.LoteMovimentacaoRepository.Add(loteMovimentacao);
                await _unitOfWork.SaveChangesAsync();

                transacao.Complete();
            }

            var gravarHistoricoColetorRequisicao = new GravarHistoricoColetorRequisicao
            {
                IdColetorAplicacao     = ColetorAplicacaoEnum.Armazenagem,
                IdColetorHistoricoTipo = ColetorHistoricoTipoEnum.InstalarProduto,
                Descricao = $"Instalou o produto {produto.Referencia} quantidade {requisicao.Quantidade} peso {pesoInstalacao} do lote {requisicao.IdLote} no endereço {enderecoArmazenagem.Codigo}",
                IdEmpresa = requisicao.IdEmpresa,
                IdUsuario = requisicao.IdUsuarioInstalacao
            };

            _coletorHistoricoService.GravarHistoricoColetor(gravarHistoricoColetorRequisicao);
        }
コード例 #4
0
        public void ValidarEnderecoInstalacao(ValidarEnderecoInstalacaoRequisicao requisicao)
        {
            if (requisicao.IdEnderecoArmazenagem <= 0)
            {
                throw new BusinessException("O endereço deve ser informado.");
            }

            var validarLoteRequisicao = new ValidarLoteRequisicao
            {
                IdLote    = requisicao.IdLote,
                IdEmpresa = requisicao.IdEmpresa
            };

            ValidarLote(validarLoteRequisicao);

            var validarLoteProdutoRequisicao = new ValidarLoteProdutoInstalacaoRequisicao
            {
                IdEmpresa = requisicao.IdEmpresa,
                IdLote    = requisicao.IdLote,
                IdProduto = requisicao.IdProduto
            };

            ValidarLoteProdutoInstalacao(validarLoteProdutoRequisicao);

            var validarQuantidadeRequisicao = new ValidarQuantidadeInstalacaoRequisicao
            {
                IdEmpresa  = requisicao.IdEmpresa,
                IdLote     = requisicao.IdLote,
                IdProduto  = requisicao.IdProduto,
                Quantidade = requisicao.Quantidade
            };

            ValidarQuantidadeInstalacao(validarQuantidadeRequisicao);

            EnderecoArmazenagem enderecoArmazenagem = _unitOfWork.EnderecoArmazenagemRepository.GetById(requisicao.IdEnderecoArmazenagem);

            if (enderecoArmazenagem == null)
            {
                throw new BusinessException("O endereço não foi encontrado.");
            }

            if (enderecoArmazenagem.IsPontoSeparacao)
            {
                throw new BusinessException("Não é possível instalar volume em um endereço de Picking.");
            }

            if (enderecoArmazenagem.PontoArmazenagem.IdTipoArmazenagem != TipoArmazenagemEnum.Volume)
            {
                throw new BusinessException("Tipo de Movimentação inválido.");
            }

            if (enderecoArmazenagem.Ativo == false)
            {
                throw new BusinessException("O endereço não está ativo.");
            }

            if (enderecoArmazenagem.PontoArmazenagem.Ativo == false)
            {
                throw new BusinessException("O ponto de armazenagem não está ativo.");
            }

            if (enderecoArmazenagem.PontoArmazenagem.NivelArmazenagem.Ativo == false)
            {
                throw new BusinessException("O nível de armazenagem não está ativo.");
            }

            LoteProdutoEndereco loteProdutoEndereco = _unitOfWork.LoteProdutoEnderecoRepository.PesquisarPorEndereco(requisicao.IdEnderecoArmazenagem);

            if (loteProdutoEndereco != null)
            {
                throw new BusinessException("O endereço já está ocupado.");
            }

            Produto produto        = _unitOfWork.ProdutoRepository.GetById(requisicao.IdProduto);
            decimal pesoInstalacao = produto.PesoLiquido / produto.MultiploVenda * requisicao.Quantidade;

            ValidarPeso(enderecoArmazenagem, pesoInstalacao);
        }
コード例 #5
0
        public void AtualizarOuInserirEnderecoArmazenagem(long idProduto, long idEnderecoArmazenagem, long idEmpresa, string idUsuario)
        {
            var produtoEstoque = _unitOfWork.ProdutoEstoqueRepository.ConsultarPorProduto(idProduto, idEmpresa);

            if (produtoEstoque == null)
            {
                throw new BusinessException("Produto não localizado!");
            }

            LoteProdutoEndereco loteProdutoEndereco = null;

            if (produtoEstoque.IdEnderecoArmazenagem.HasValue)
            {
                loteProdutoEndereco = _unitOfWork.LoteProdutoEnderecoRepository.PesquisarPorEnderecoProdutoEmpresaPicking(produtoEstoque.IdEnderecoArmazenagem.Value, produtoEstoque.IdProduto, produtoEstoque.IdEmpresa);
            }

            if (loteProdutoEndereco?.Quantidade > 0)
            {
                throw new BusinessException("Existem peças no picking, não é possível alterar");
            }

            using (var transacao = _unitOfWork.CreateTransactionScope())
            {
                if (loteProdutoEndereco != null && loteProdutoEndereco.IdEnderecoArmazenagem != idEnderecoArmazenagem)
                {
                    _unitOfWork.LoteProdutoEnderecoRepository.Delete(loteProdutoEndereco);
                    _unitOfWork.SaveChanges();

                    loteProdutoEndereco = null;
                }

                produtoEstoque.IdEnderecoArmazenagem = idEnderecoArmazenagem;

                _unitOfWork.ProdutoEstoqueRepository.Update(produtoEstoque);
                _unitOfWork.SaveChanges();

                if (loteProdutoEndereco == null)
                {
                    var newLoteProdutoEndereco = new LoteProdutoEndereco();

                    newLoteProdutoEndereco.IdLoteProdutoEndereco = 0;
                    newLoteProdutoEndereco.IdEnderecoArmazenagem = idEnderecoArmazenagem;
                    newLoteProdutoEndereco.IdProduto             = produtoEstoque.IdProduto;
                    newLoteProdutoEndereco.IdLote              = null;
                    newLoteProdutoEndereco.Quantidade          = 0;
                    newLoteProdutoEndereco.PesoTotal           = 0;
                    newLoteProdutoEndereco.IdEmpresa           = produtoEstoque.IdEmpresa;
                    newLoteProdutoEndereco.IdUsuarioInstalacao = idUsuario;
                    newLoteProdutoEndereco.DataHoraInstalacao  = DateTime.Now;

                    _unitOfWork.LoteProdutoEnderecoRepository.Add(newLoteProdutoEndereco);
                }
                else
                {
                    loteProdutoEndereco.IdEnderecoArmazenagem = idEnderecoArmazenagem;
                    loteProdutoEndereco.DataHoraInstalacao    = DateTime.Now;

                    _unitOfWork.LoteProdutoEnderecoRepository.Update(loteProdutoEndereco);
                }

                _unitOfWork.SaveChanges();

                transacao.Complete();
            }
        }