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; } } }
/// <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; } } }