Beispiel #1
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);
        }
        public bool AtualizarAtividadeAbastecerPicking(AtividadeEstoqueRequisicao atividadeEstoqueRequisicao, long IdEmpresa, string IdUsuario)
        {
            bool finalizouuAtividadeEstoque = false;

            var atividade = _unitOfWork.AtividadeEstoqueRepository.GetById(atividadeEstoqueRequisicao.IdAtividadeEstoque);

            _armazenagemService.ValidarEnderecoAbastecer(atividade.IdEnderecoArmazenagem);

            _armazenagemService.ValidarLoteAbastecer(atividade.IdEnderecoArmazenagem, atividadeEstoqueRequisicao.IdLote, atividade.IdProduto);

            _armazenagemService.ValidarQuantidadeAbastecer(atividade.IdEnderecoArmazenagem, atividadeEstoqueRequisicao.IdLote, atividade.IdProduto, atividadeEstoqueRequisicao.QuantidadeFinal);

            var loteProduto = _unitOfWork.LoteProdutoRepository.ConsultarPorLoteProduto(atividadeEstoqueRequisicao.IdLote, atividade.IdProduto);

            var loteProdutoEndereco = _unitOfWork.LoteProdutoEnderecoRepository.PesquisarPorEndereco(atividade.IdEnderecoArmazenagem);

            var enderecoArmazenagem = _unitOfWork.EnderecoArmazenagemRepository.GetById(atividade.IdEnderecoArmazenagem);

            try
            {
                using (var transacao = _unitOfWork.CreateTransactionScope())
                {
                    loteProduto.Saldo -= atividadeEstoqueRequisicao.QuantidadeFinal;

                    _unitOfWork.LoteProdutoRepository.Update(loteProduto);
                    _unitOfWork.SaveChanges();

                    loteProdutoEndereco.Quantidade += atividadeEstoqueRequisicao.QuantidadeFinal;

                    _unitOfWork.LoteProdutoEnderecoRepository.Update(loteProdutoEndereco);
                    _unitOfWork.SaveChanges();

                    var loteMovimentacao = new LoteMovimentacao
                    {
                        IdEmpresa              = IdEmpresa,
                        IdLote                 = atividadeEstoqueRequisicao.IdLote,
                        IdProduto              = atividade.IdProduto,
                        IdEnderecoArmazenagem  = atividade.IdEnderecoArmazenagem,
                        IdUsuarioMovimentacao  = IdUsuario,
                        Quantidade             = atividadeEstoqueRequisicao.QuantidadeFinal,
                        IdLoteMovimentacaoTipo = LoteMovimentacaoTipoEnum.Abastecimento,
                        DataHora               = DateTime.Now
                    };

                    _unitOfWork.LoteMovimentacaoRepository.Add(loteMovimentacao);
                    _unitOfWork.SaveChanges();

                    if (loteProdutoEndereco.Quantidade >= enderecoArmazenagem.EstoqueMinimo)
                    {
                        atividade.QuantidadeInicial = atividadeEstoqueRequisicao.QuantidadeInicial;
                        atividade.QuantidadeFinal   = atividade.QuantidadeInicial + atividadeEstoqueRequisicao.QuantidadeFinal;
                        atividade.IdUsuarioExecucao = IdUsuario;
                        atividade.DataExecucao      = DateTime.Now;
                        atividade.Finalizado        = true;

                        _unitOfWork.SaveChanges();

                        finalizouuAtividadeEstoque = true;
                    }

                    transacao.Complete();
                }

                var gravarHistoricoColetorRequisicao = new GravarHistoricoColetorRequisicao
                {
                    IdColetorAplicacao     = ColetorAplicacaoEnum.Armazenagem,
                    IdColetorHistoricoTipo = ColetorHistoricoTipoEnum.AjustarQuantidade,
                    Descricao = $"Abasteceu o produto {loteProdutoEndereco.Produto.Referencia} do lote {loteProduto.Lote.IdLote} no endereço de picking {loteProdutoEndereco.EnderecoArmazenagem.Codigo}",
                    IdEmpresa = IdEmpresa,
                    IdUsuario = IdUsuario
                };

                _coletorHistoricoService.GravarHistoricoColetor(gravarHistoricoColetorRequisicao);

                return(finalizouuAtividadeEstoque);
            }
            catch
            {
                throw new BusinessException($"Erro ao abastecer o picking com o produto {loteProduto.Produto.Referencia} do lote {loteProduto.Lote.IdLote}");
            }
        }