예제 #1
0
        private void Movimentar(GDASession sessao, MovimentacaoDto movimentacao)
        {
            movimentacao.Usuario = movimentacao.Usuario != null ? movimentacao.Usuario : UserInfo.GetUserInfo;

            if (!GrupoProdDAO.Instance.AlterarEstoque(sessao, (int)movimentacao.IdProduto) && !movimentacao.LancamentoManual)
            {
                return;
            }

            if (movimentacao.IdLoja == 0)
            {
                throw new InvalidOperationException("A loja da movimentação de estoque não foi informada.");
            }

            uint idMovEstoque = 0;

            try
            {
                ProdutoBaixaEstoque[] produtosBaixaEstoque;

                if (movimentacao.AlterarMateriaPrima)
                {
                    produtosBaixaEstoque = ProdutoBaixaEstoqueDAO.Instance.GetByProd(
                        sessao,
                        movimentacao.IdProduto,
                        movimentacao.BaixarProprioProdutoSeNaoTiverMateriaPrima);
                }
                else
                {
                    produtosBaixaEstoque = new ProdutoBaixaEstoque[]
                    {
                        new ProdutoBaixaEstoque {
                            IdProd      = (int)movimentacao.IdProduto,
                            IdProdBaixa = (int)movimentacao.IdProduto,
                            Qtde        = 1,
                        },
                    };
                }

                foreach (var item in produtosBaixaEstoque)
                {
                    var tipoSubgrupo = SubgrupoProdDAO.Instance.ObtemTipoSubgrupo(sessao, (int)movimentacao.IdProduto);

                    // Se não for lançamento manual, não for mov. de produção e o produto for chapa de vidro mov. a matéria-prima
                    if (!movimentacao.LancamentoManual &&
                        movimentacao.AlterarProdutoBase &&
                        (tipoSubgrupo == TipoSubgrupoProd.ChapasVidro || tipoSubgrupo == TipoSubgrupoProd.ChapasVidroLaminado))
                    {
                        var m2Chapa    = ProdutoDAO.Instance.ObtemM2Chapa(sessao, item.IdProdBaixa);
                        var idProdBase = ProdutoDAO.Instance.ObterProdutoBase(sessao, item.IdProdBaixa);

                        if (idProdBase == item.IdProdBaixa)
                        {
                            throw new InvalidOperationException("O produto base não pode ser o próprio produto.");
                        }

                        if (idProdBase.HasValue)
                        {
                            var movimentacaoDto = movimentacao;
                            movimentacaoDto.IdProduto  = (uint)idProdBase.Value;
                            movimentacaoDto.Quantidade = movimentacaoDto.Quantidade * m2Chapa;
                            movimentacaoDto.BaixarProprioProdutoSeNaoTiverMateriaPrima = true;

                            this.Movimentar(sessao, movimentacaoDto);
                        }
                    }

                    var     qtde = movimentacao.Quantidade * (decimal)item.Qtde;
                    decimal saldoQtdeAnterior = 0, saldoValorAnterior = 0, saldoQtdeValidar = 0;

                    MovEstoqueDAO.Instance.ValidarMovimentarEstoque(
                        sessao,
                        item.IdProdBaixa,
                        (int)movimentacao.IdLoja,
                        movimentacao.Data,
                        movimentacao.Tipo,
                        qtde,
                        ref saldoQtdeAnterior,
                        ref saldoValorAnterior,
                        ref saldoQtdeValidar,
                        false);

                    // Registra a alteração do estoque
                    MovEstoque movEstoque = new MovEstoque();
                    movEstoque.IdProd            = (uint)item.IdProdBaixa;
                    movEstoque.IdLoja            = movimentacao.IdLoja;
                    movEstoque.IdFunc            = movimentacao.Usuario?.CodUser ?? 0;
                    movEstoque.IdPedido          = movimentacao.IdPedido;
                    movEstoque.IdCompra          = movimentacao.IdCompra;
                    movEstoque.IdLiberarPedido   = movimentacao.IdLiberarPedido;
                    movEstoque.IdProdPedProducao = movimentacao.IdProdPedProducao;
                    movEstoque.IdTrocaDevolucao  = movimentacao.IdTrocaDevolucao;
                    movEstoque.IdNf                 = movimentacao.IdNf;
                    movEstoque.IdPedidoInterno      = movimentacao.IdPedidoInterno;
                    movEstoque.IdProdPed            = movimentacao.IdProdPed;
                    movEstoque.IdProdCompra         = movimentacao.IdProdCompra;
                    movEstoque.IdProdLiberarPedido  = movimentacao.IdProdLiberarPedido;
                    movEstoque.IdProdTrocaDev       = movimentacao.IdProdTrocaDev;
                    movEstoque.IdProdTrocado        = movimentacao.IdProdTrocado;
                    movEstoque.IdProdNf             = movimentacao.IdProdNf;
                    movEstoque.IdProdPedInterno     = movimentacao.IdProdPedInterno;
                    movEstoque.IdRetalhoProducao    = movimentacao.IdRetalhoProducao;
                    movEstoque.IdPerdaChapaVidro    = movimentacao.IdPerdaChapaVidro;
                    movEstoque.IdCarregamento       = movimentacao.IdCarregamento;
                    movEstoque.IdVolume             = movimentacao.IdVolume;
                    movEstoque.IdInventarioEstoque  = movimentacao.IdInventarioEstoque;
                    movEstoque.IdProdImpressaoChapa = movimentacao.IdProdImpressaoChapa;
                    movEstoque.LancManual           = movimentacao.LancamentoManual;
                    movEstoque.TipoMov              = (int)movimentacao.Tipo;
                    movEstoque.DataMov              = movimentacao.Data.AddSeconds(1);
                    movEstoque.QtdeMov              = qtde;
                    movEstoque.Obs          = movimentacao.Observacao;
                    movEstoque.SaldoQtdeMov = Math.Round(saldoQtdeAnterior + (movimentacao.Tipo == MovEstoque.TipoMovEnum.Entrada ? qtde : -qtde), Configuracoes.Geral.NumeroCasasDecimaisTotM);

                    if (movimentacao.Data.Date != DateTime.Now.Date)
                    {
                        movEstoque.DataCad = DateTime.Now;
                    }

                    if (movEstoque.SaldoQtdeMov < 0)
                    {
                        movEstoque.ValorMov      = 0;
                        movEstoque.SaldoValorMov = 0;
                    }
                    else if (movimentacao.Tipo == MovEstoque.TipoMovEnum.Entrada && movimentacao.Total > 0)
                    {
                        var saldoQuantidadeMovimentada = movEstoque.SaldoQtdeMov > 0 ? movEstoque.SaldoQtdeMov : 1;
                        var perc = movimentacao.Quantidade > movEstoque.SaldoQtdeMov ? movimentacao.Quantidade / saldoQuantidadeMovimentada : 1;

                        movEstoque.ValorMov      = Math.Abs(movimentacao.Total);
                        movEstoque.SaldoValorMov = saldoValorAnterior + (movEstoque.ValorMov * perc);
                    }
                    else
                    {
                        var valorUnit = saldoValorAnterior / (saldoQtdeAnterior > 0 ? saldoQtdeAnterior : 1);

                        movEstoque.ValorMov      = Math.Abs(valorUnit * qtde);
                        movEstoque.SaldoValorMov = saldoValorAnterior - (valorUnit * qtde);
                    }

                    idMovEstoque = MovEstoqueDAO.Instance.Insert(sessao, movEstoque);

                    MovEstoqueDAO.Instance.AtualizaSaldo(sessao, movEstoque.IdMovEstoque);
                    ProdutoLojaDAO.Instance.AtualizarProdutoLoja(sessao, (int)movEstoque.IdProd, (int)movEstoque.IdLoja);

                    if (ProdutoDAO.Instance.IsProdutoProducao(sessao, item.IdProdBaixa))
                    {
                        var metroQuadrado = ProdutoDAO.Instance.ObtemM2BoxPadrao(sessao, item.IdProdBaixa);

                        if (metroQuadrado > 0)
                        {
                            ProdutoLojaDAO.Instance.AtualizarTotalM2(sessao, item.IdProdBaixa, (int)movimentacao.IdLoja, metroQuadrado);
                        }
                    }
                }
            }
            catch (Exception ex)
            {
                ErroDAO.Instance.InserirFromException($"MovEstoque - IdMovEstoque:{idMovEstoque}' IdProd:{movimentacao.IdProduto}' IdLoja:{movimentacao.IdLoja}", ex);
                throw;
            }
        }
예제 #2
0
        /// <summary>
        /// Dá baixa no estoque no produto da loja passados
        /// </summary>
        private void MovimentaEstoqueCliente(GDASession sessao, uint idCliente, uint idProd, uint idLoja, MovEstoque.TipoMovEnum tipoMov, uint?idNf, uint?idProdNf,
                                             uint?idPedido, uint?idProdPed, uint?idLiberarPedido, uint?idProdLiberarPedido, uint?idProdPedProducao, bool lancManual, decimal qtdeMov,
                                             decimal qtdeMovAreaMinima, decimal total, DateTime dataMov, string obs)
        {
            if (!EstoqueConfig.ControlarEstoqueVidrosClientes)
            {
                return;
            }

            ProdutoBaixaEstoque[] prodBaixEst;

            if (!lancManual)
            {
                prodBaixEst = ProdutoBaixaEstoqueDAO.Instance.GetByProd(sessao, idProd);
            }
            else
            {
                prodBaixEst = new ProdutoBaixaEstoque[]
                {
                    new ProdutoBaixaEstoque()
                    {
                        IdProd      = (int)idProd,
                        IdProdBaixa = (int)idProd,
                        Qtde        = 1
                    }
                }
            };

            foreach (var pbe in prodBaixEst)
            {
                bool executou     = false;
                var  tipoSubgrupo = SubgrupoProdDAO.Instance.ObtemTipoSubgrupo(sessao, (int)idProd);

                //Se não for lançamento manual e o produto for chapa de vidro mov. a matéria-prima
                if (!lancManual && (tipoSubgrupo == TipoSubgrupoProd.ChapasVidro || tipoSubgrupo == TipoSubgrupoProd.ChapasVidroLaminado))
                {
                    decimal m2Chapa             = ProdutoDAO.Instance.ObtemM2Chapa(sessao, (int)pbe.IdProdBaixa);
                    decimal qtdeMovMateriaPrima = (decimal)pbe.Qtde * m2Chapa;

                    uint?idProdBase = ProdutoDAO.Instance.ObtemValorCampo <uint?>(sessao, "idProdBase", "idProd=" + pbe.IdProdBaixa);

                    if (idProdBase.HasValue && idProd != idProdBase)
                    {
                        MovimentaEstoqueCliente(sessao, idCliente, idProdBase.Value, idLoja, tipoMov, idNf, idProdNf, idPedido, idProdPed,
                                                idLiberarPedido, idProdLiberarPedido, idProdPedProducao, lancManual, qtdeMov, qtdeMovAreaMinima, total, dataMov, obs);

                        executou = true;
                    }
                }

                if (!executou)
                {
                    decimal qtde     = (qtdeMovAreaMinima > 0 ? qtdeMovAreaMinima : qtdeMov) * (decimal)pbe.Qtde;
                    decimal totalMov = pbe.IdProdBaixa != idProd?MovEstoqueDAO.Instance.GetTotalEstoqueManual(sessao, (int)pbe.IdProdBaixa, qtde) :
                                           total * (decimal)pbe.Qtde;

                    // Registra a alteração do estoque
                    MovEstoqueCliente movEstoque = new MovEstoqueCliente();
                    movEstoque.IdCliente           = idCliente;
                    movEstoque.IdProd              = (uint)pbe.IdProdBaixa;
                    movEstoque.IdLoja              = idLoja;
                    movEstoque.IdFunc              = UserInfo.GetUserInfo.CodUser;
                    movEstoque.IdNf                = idNf;
                    movEstoque.IdProdNf            = idProdNf;
                    movEstoque.IdPedido            = idPedido;
                    movEstoque.IdProdPed           = idProdPed;
                    movEstoque.IdLiberarPedido     = idLiberarPedido;
                    movEstoque.IdProdLiberarPedido = idProdLiberarPedido;
                    movEstoque.IdProdPedProducao   = idProdPedProducao;
                    movEstoque.LancManual          = lancManual;
                    movEstoque.TipoMov             = (int)tipoMov;
                    movEstoque.DataMov             = dataMov;
                    if (dataMov.Date != DateTime.Now.Date)
                    {
                        movEstoque.DataCad = DateTime.Now;
                    }
                    movEstoque.QtdeMov    = qtde;
                    movEstoque.Observacao = obs;

                    movEstoque.IdMovEstoqueCliente = Insert(sessao, movEstoque);

                    // Recupera os dados da movimentação anterior
                    decimal saldoQtdeAnterior  = ObtemSaldoQtdeMov(sessao, movEstoque.IdMovEstoqueCliente, idCliente, (uint)pbe.IdProdBaixa, idLoja, dataMov, true);
                    decimal saldoValorAnterior = ObtemSaldoValorMov(sessao, movEstoque.IdMovEstoqueCliente, idCliente, (uint)pbe.IdProdBaixa, idLoja, dataMov, true);

                    movEstoque.SaldoQtdeMov = Math.Round(saldoQtdeAnterior + (tipoMov == MovEstoque.TipoMovEnum.Entrada ? qtde : -qtde), Geral.NumeroCasasDecimaisTotM);

                    if (movEstoque.SaldoQtdeMov < 0)
                    {
                        movEstoque.ValorMov      = 0;
                        movEstoque.SaldoValorMov = 0;
                    }
                    else if (tipoMov == MovEstoque.TipoMovEnum.Entrada)
                    {
                        decimal perc = tipoMov == MovEstoque.TipoMovEnum.Entrada && qtde > movEstoque.SaldoQtdeMov ?
                                       qtde / (movEstoque.SaldoQtdeMov > 0 ? movEstoque.SaldoQtdeMov : 1) : 1;

                        movEstoque.ValorMov      = Math.Abs(totalMov);
                        movEstoque.SaldoValorMov = saldoValorAnterior + (movEstoque.ValorMov * perc);
                    }
                    else
                    {
                        decimal valorUnit = saldoValorAnterior / (saldoQtdeAnterior > 0 ? saldoQtdeAnterior : 1);
                        movEstoque.ValorMov      = Math.Abs(valorUnit * qtde);
                        movEstoque.SaldoValorMov = saldoValorAnterior - (valorUnit * qtde);
                    }

                    base.Update(sessao, movEstoque);

                    if (TemMovimentacaoPosterior(sessao, movEstoque.IdMovEstoqueCliente))
                    {
                        AtualizaSaldo(sessao, movEstoque.IdMovEstoqueCliente);
                    }
                }
            }
        }