Exemple #1
0
        private void ValidarCompra(Glass.Data.Model.Compra compra)
        {
            // Verifica se o Pedido possui produtos
            if (ProdutosCompraDAO.Instance.CountInCompra(compra.IdCompra) == 0)
            {
                throw new Exception("Inclua pelo menos um produto na compra para finalizá-la.");
            }

            int pagtoFornecedor = ParcelasDAO.Instance.GetCountByFornecedor(compra.IdFornec.GetValueOrDefault(), ParcelasDAO.TipoConsulta.Todos);

            if (pagtoFornecedor > 0)
            {
                pagtoFornecedor = ParcelasDAO.Instance.GetCountByFornecedor(compra.IdFornec.GetValueOrDefault(), ParcelasDAO.TipoConsulta.Prazo);
                if (pagtoFornecedor == 0 && compra.TipoCompra != (int)Glass.Data.Model.Compra.TipoCompraEnum.AVista)
                {
                    throw new Exception("Esse fornecedor aceita apenas compras à vista.");
                }
            }

            // Se for compra à prazo
            if (compra.TipoCompra == (int)Glass.Data.Model.Compra.TipoCompraEnum.APrazo)
            {
                // Calcula o valor de entrada + o valor à prazo
                decimal valorTotalPago = (decimal)compra.ValorEntrada;

                // Se forem mais de (FinanceiroConfig.Compra.NumeroParcelasCompra) parcelas, o cálculo de parcelas é automático
                if (compra.NumParc > FinanceiroConfig.Compra.NumeroParcelasCompra)
                {
                    valorTotalPago += (compra.NumParc * (decimal)compra.ValorParc);
                }

                // Cálculo feito a partir das parcelas salvas
                else
                {
                    // Busca o valor das parcelas
                    var lstParc = ParcelasCompraDAO.Instance.GetByCompra(compra.IdCompra);
                    foreach (var p in lstParc)
                    {
                        valorTotalPago += (decimal)p.Valor;
                    }
                }

                // Verifica se o valor total da compra bate com o valorTotalPago
                if (Math.Round(compra.Total, 2) != Math.Round(valorTotalPago, 2) && compra.ValorTributado == 0)
                {
                    throw new Exception("O valor total da compra não bate com o valor do pagamento da mesma. Valor Compra: " +
                                        Math.Round(compra.Total, 2).ToString("C") + " Valor Pago: " + Math.Round(valorTotalPago, 2).ToString("C"));
                }

                // Verifica se a data base de vencimento das parcelas foi informado
                if (compra.NumParc > FinanceiroConfig.Compra.NumeroParcelasCompra && compra.DataBaseVenc == null)
                {
                    throw new Exception("Informe a data base de vencimento das parcelas.");
                }
            }
            else if (compra.TipoCompra == (int)Glass.Data.Model.Compra.TipoCompraEnum.AntecipFornec)
            {
                try
                {
                    if (!compra.IdAntecipFornec.HasValue)
                    {
                        throw new Exception("Informe a Antecipação.");
                    }

                    uint idFornec = AntecipacaoFornecedorDAO.Instance.GetIdFornec(compra.IdAntecipFornec.Value);

                    if (compra.IdFornec != idFornec)
                    {
                        throw new Exception("O fornecedor da antecipação deve ser o mesmo da compra.");
                    }

                    decimal saldoAntecip = AntecipacaoFornecedorDAO.Instance.GetSaldo(compra.IdAntecipFornec.Value);

                    if (saldoAntecip < compra.Total && compra.Situacao == Glass.Data.Model.Compra.SituacaoEnum.Ativa)
                    {
                        throw new Exception("O saldo da antecipação é menor que o valor desta compra. Saldo da antecipação: " + saldoAntecip.ToString("C"));
                    }
                }
                catch (Exception ex)
                {
                    throw ex;
                }
            }
        }
Exemple #2
0
        /// <summary>
        /// Finaliza uma cotação de compra, gerando compras (uma por fornecedor).
        /// </summary>
        public void Finalizar(uint codigoCotacaoCompra, Glass.Data.Model.CotacaoCompra.TipoCalculoCotacao tipoCalculo)
        {
            using (var transaction = new GDATransaction())
            {
                try
                {
                    transaction.BeginTransaction();

                    var calculados = CalcularCotacao.Instance.CalcularPorFornecedor(transaction, codigoCotacaoCompra, tipoCalculo);

                    // Recupera as informações dos fornecedores, validando-as
                    Dictionary <uint, DadosFornecedor> fornecedores = new Dictionary <uint, DadosFornecedor>();

                    foreach (uint codigoFornecedor in calculados.Keys.Select(x => x.CodigoFornecedor).Distinct())
                    {
                        DadosFornecedor f = new DadosFornecedor()
                        {
                            Nome       = FornecedorDAO.Instance.GetNome(transaction, codigoFornecedor),
                            FormaPagto = FornecedorDAO.Instance.ObtemTipoPagto(transaction, codigoFornecedor),
                            PlanoConta = FornecedorDAO.Instance.ObtemIdConta(transaction, codigoFornecedor)
                        };

                        if (f.FormaPagto == null)
                        {
                            throw new Exception("Configure a forma de pagamento padrão do fornecedor " + f.Nome);
                        }

                        if (f.PlanoConta == null)
                        {
                            throw new Exception("Configure o plano de conta padrão do fornecedor " + f.Nome);
                        }

                        fornecedores.Add(codigoFornecedor, f);
                    }

                    Glass.Data.Model.Compra         compra;
                    Glass.Data.Model.ProdutosCompra produtoCompra;
                    uint idCompra;

                    foreach (var dadosFornec in calculados.Keys)
                    {
                        // Insere a compra
                        compra = new Glass.Data.Model.Compra()
                        {
                            IdFornec     = dadosFornec.CodigoFornecedor,
                            IdLoja       = UserInfo.GetUserInfo.IdLoja,
                            IdConta      = fornecedores[dadosFornec.CodigoFornecedor].PlanoConta.Value,
                            IdFormaPagto = fornecedores[dadosFornec.CodigoFornecedor].FormaPagto.Value,
                            TipoCompra   = dadosFornec.DatasParcelas.Length == 0 ? (int)Glass.Data.Model.Compra.TipoCompraEnum.AVista :
                                           (int)Glass.Data.Model.Compra.TipoCompraEnum.APrazo,
                            Situacao    = Glass.Data.Model.Compra.SituacaoEnum.Ativa,
                            DataFabrica = DateTime.Now.ObtemDataDiasUteis((int)dadosFornec.PrazoEntregaDias),
                        };

                        idCompra = CompraDAO.Instance.InsertFromCotacao(transaction, compra, codigoCotacaoCompra);

                        // Insere os produtos da compra
                        foreach (var produto in calculados[dadosFornec])
                        {
                            produtoCompra = new Glass.Data.Model.ProdutosCompra()
                            {
                                IdCompra  = idCompra,
                                IdProd    = produto.CodigoProduto,
                                Qtde      = produto.QuantidadeProduto,
                                Valor     = produto.CustoUnitarioProdutoFornecedor,
                                Total     = produto.CustoTotalProdutoFornecedor,
                                Altura    = produto.AlturaProduto,
                                Largura   = produto.LarguraProduto,
                                TotM      = produto.TotalM2Produto,
                                Espessura = ProdutoDAO.Instance.ObtemEspessura(transaction, (int)produto.CodigoProduto)
                            };

                            ProdutosCompraDAO.Instance.Insert(transaction, produtoCompra);
                        }

                        // Salva as parcelas da compra
                        if (dadosFornec.DatasParcelas.Length > 0)
                        {
                            CompraDAO.Instance.AlteraParcelas(transaction, idCompra, dadosFornec.DatasParcelas.Length, dadosFornec.DatasParcelas);
                        }
                    }

                    // Finaliza a cotação de compra
                    CotacaoCompraDAO.Instance.Finalizar(transaction, codigoCotacaoCompra, tipoCalculo);

                    transaction.Commit();
                    transaction.Close();
                }
                catch
                {
                    transaction.Rollback();
                    transaction.Close();
                    throw;
                }
            }
        }