public List <ContaTransferenciaModel> Listar(ContaTransferenciaModel obj)
 {
     try
     {
         return(Selecionar(obj));
     }
     catch (Exception e)
     {
         throw e;
     }
 }
 public ContaTransferenciaModel Consultar(ContaTransferenciaModel obj)
 {
     try
     {
         List <ContaTransferenciaModel> lst = Selecionar(obj);
         return(lst.Count > 0 ? lst.FirstOrDefault() : null);
     }
     catch (Exception e)
     {
         throw e;
     }
 }
        public IActionResult Transferir(ContaTransferenciaModel formulario)
        {
            ContaTransferenciaBE contaTransferenciaBE = null;
            ContaBE contaBE = null;

            try
            {
                contaTransferenciaBE = new ContaTransferenciaBE();
                contaBE = new ContaBE(contaTransferenciaBE.GetSqlCommand());
                formulario.ContaOrigem = new ContaModel(HttpContextAccessor);
                formulario.ContaOrigem = contaBE.ValidarConta(formulario.ContaOrigem);

                if (formulario.ContaDestino.Numero != "" && formulario.ContaDestino.Agencia != "" && formulario.Valor > 0)
                {
                    var contaDestino = contaBE.ValidarConta(formulario.ContaDestino);

                    if (contaDestino != null && contaDestino.Id > 0)
                    {
                        if (formulario.ContaOrigem.ContaTipo.Sigla == "CP" && formulario.ContaDestino.ContaTipo.Sigla == "CC")
                        {
                            ViewBag.SaldoInsulficiente = "Conta Poupança não pode transferir para conta corrente.";
                            return(View());
                        }

                        if ((formulario.ContaOrigem.Saldo + formulario.ContaOrigem.ChequeEspecial) < formulario.Valor)
                        {
                            ViewBag.SaldoInsulficiente = "O saldo é insulficiente para fazer a transferência.";
                            return(View());
                        }

                        formulario.ContaDestino = contaDestino;
                        contaTransferenciaBE.Transferir(formulario);
                        return(RedirectToAction("Menu", "Home"));
                    }

                    ViewBag.SaldoInsulficiente = "Conta de destino não é uma conta válida.";
                    return(View());
                }

                ViewBag.SaldoInsulficiente = "Deve ser preenchido todos os campos.";
                return(View());
            }
            catch (Exception)
            {
                return(View());
            }
        }
        public int Inserir(ContaTransferenciaModel obj)
        {
            int id = 0;

            try
            {
                StringBuilder strBuilder = new StringBuilder();

                GetSqlCommand().Parameters.Clear();
                strBuilder.AppendLine(@"INSERT INTO dbo.ContaTransferencia
                                        (
	                                        IdContaMovimento, 
	                                        IdContaDestino, 
	                                        Valor
                                        )
                                        VALUES              
                                        (
	                                        @IdContaMovimento, 
	                                        @IdContaDestino, 
	                                        @Valor
                                        )");

                GetSqlCommand().CommandText = "";
                GetSqlCommand().CommandText = strBuilder.ToString();

                GetSqlCommand().Parameters.AddWithValue("IdContaMovimento", obj.ContaMovimento.Id);
                GetSqlCommand().Parameters.AddWithValue("IdContaDestino", obj.ContaDestino.Id);
                GetSqlCommand().Parameters.AddWithValue("Valor", obj.Valor);


                GetSqlCommand().ExecuteNonQuery();

                id = UltimoIdInseridoIdentity("ContaTransferencia");

                return(id);
            }
            catch (Exception ex)
            {
                throw ex;
            }
        }
        public bool Transferir(ContaTransferenciaModel obj)
        {
            ContaMovimentoDAO     contaMovimentoDAO     = null;
            ContaTransferenciaDAO contaTransferenciaDAO = null;
            ContaOperacaoDAO      contaOperacaoDAO      = null;
            ContaDAO contaDAO = null;
            ContaMovimentoOperacaoDAO contaMovimentoOperacaoDAO = null;

            ContaMovimentoTipoDAO contaMovimentoTipoDAO = null;
            OperacaoDAO           operacaoDAO           = null;
            bool primeiraOperacao = true;
            var  dataNow          = DateTime.Now;

            try
            {
                contaMovimentoDAO     = new ContaMovimentoDAO(GetSqlCommand());
                contaTransferenciaDAO = new ContaTransferenciaDAO(GetSqlCommand());
                contaOperacaoDAO      = new ContaOperacaoDAO(GetSqlCommand());
                contaDAO = new ContaDAO(GetSqlCommand());
                contaMovimentoOperacaoDAO = new ContaMovimentoOperacaoDAO(GetSqlCommand());

                contaMovimentoTipoDAO = new ContaMovimentoTipoDAO(GetSqlCommand());
                operacaoDAO           = new OperacaoDAO(GetSqlCommand());

                var movimentoTipo = contaMovimentoTipoDAO.Consultar(new ContaMovimentoTipoModel()
                {
                    Sigla        = "TR",
                    TipoContabil = { Sigla = "D" }
                });

                var operacao = operacaoDAO.Consultar(new OperacaoModel()
                {
                    Sigla = "TR"
                });

                var contaOperacao = contaOperacaoDAO.Consultar(new ContaOperacaoModel()
                {
                    Ano      = dataNow.Year,
                    Mes      = dataNow.Month,
                    Operacao = { Id = operacao.Id },
                    Conta    = { Id = obj.ContaOrigem.Id }
                });

                if (contaOperacao != null && contaOperacao.Id > 0)
                {
                    primeiraOperacao = false;
                }

                BeginTransaction();

                obj.ContaMovimento.Id = contaMovimentoDAO.Inserir(new ContaMovimentoModel()
                {
                    Conta = { Id = obj.ContaOrigem.Id },
                    ContaMovimentoTipo = { Id = movimentoTipo.Id },
                    DataMovimento      = dataNow,
                    Valor = obj.Valor
                });

                obj.ContaMovimento.ContaOperacao.Id = contaOperacaoDAO.Inserir(new ContaOperacaoModel()
                {
                    Conta        = { Id = obj.ContaOrigem.Id },
                    Operacao     = { Id = operacao.Id },
                    DataOperacao = dataNow
                });

                contaMovimentoOperacaoDAO.Inserir(new ContaMovimentoOperacaoModel()
                {
                    ContaMovimento = { Id = obj.ContaMovimento.Id },
                    ContaOperacao  = { Id = obj.ContaMovimento.ContaOperacao.Id }
                });

                contaTransferenciaDAO.Inserir(obj);

                if (obj.ContaOrigem.Saldo > 0)
                {
                    obj.ContaOrigem.Saldo -= obj.Valor;
                    if (obj.ContaOrigem.Saldo < 0)
                    {
                        var saldoAtual = obj.ContaOrigem.Saldo;
                        obj.ContaOrigem.ChequeEspecial -= (saldoAtual * -1);
                        obj.ContaOrigem.Saldo           = 0;
                    }
                }
                else
                {
                    obj.ContaOrigem.ChequeEspecial -= obj.Valor;
                }

                if (!primeiraOperacao)
                {
                    movimentoTipo = contaMovimentoTipoDAO.Consultar(new ContaMovimentoTipoModel()
                    {
                        Sigla        = "OP",
                        TipoContabil = { Sigla = "D" }
                    });

                    contaMovimentoDAO.Inserir(new ContaMovimentoModel()
                    {
                        Conta = { Id = obj.ContaOrigem.Id },
                        ContaMovimentoTipo = { Id = movimentoTipo.Id },
                        DataMovimento      = dataNow,
                        Valor = operacao.Custo
                    });

                    if (obj.ContaOrigem.Saldo > 0)
                    {
                        obj.ContaOrigem.Saldo -= operacao.Custo;
                        if (obj.ContaOrigem.Saldo < 0)
                        {
                            var saldoAtual = obj.ContaOrigem.Saldo;
                            obj.ContaOrigem.ChequeEspecial -= (saldoAtual * -1);
                            obj.ContaOrigem.Saldo           = 0;
                        }
                    }
                    else
                    {
                        obj.ContaOrigem.ChequeEspecial -= operacao.Custo;
                    }
                }

                contaDAO.AtualizarSaldo(obj.ContaOrigem);

                movimentoTipo = contaMovimentoTipoDAO.Consultar(new ContaMovimentoTipoModel()
                {
                    Sigla        = "TR",
                    TipoContabil = { Sigla = "C" }
                });

                contaMovimentoDAO.Inserir(new ContaMovimentoModel()
                {
                    Conta = { Id = obj.ContaDestino.Id },
                    ContaMovimentoTipo = { Id = movimentoTipo.Id },
                    DataMovimento      = dataNow,
                    Valor = obj.Valor
                });

                obj.ContaDestino.ChequeEspecial += obj.Valor;
                var dif = obj.ContaDestino.ChequeEspecial - 300;
                if (dif > 0)
                {
                    obj.ContaDestino.ChequeEspecial = 300;
                    obj.ContaDestino.Saldo         += dif;
                }

                contaDAO.AtualizarSaldo(obj.ContaDestino);

                Commit();

                return(true);
            }
            catch (Exception ex)
            {
                Rollback();
                throw ex;
            }
        }
        private List <ContaTransferenciaModel> Selecionar(ContaTransferenciaModel obj)
        {
            List <ContaTransferenciaModel> lst = null;

            try
            {
                objSbSelect = new StringBuilder();

                objSbSelect.AppendLine(@"
                                            SELECT ContaTransferencia.IdContaTransferencia
                                                 , ContaTransferencia.IdContaDestino
                                                 , ContaTransferencia.Valor
                                                 , ContaTransferencia.DataTransferencia
                                                 , ContaMovimento.IdContaMovimento
                                                 , Conta.IdConta
                                            FROM ContaTransferencia
                                            INNER JOIN ContaMovimento
                                                    ON ContaTransferencia.IdContaMovimento = ContaMovimento.IdContaMovimento
                                            INNER JOIN Conta
                                                    ON ContaMovimento.IdConta = Conta.IdConta
                                            INNER JOIN Conta Destino
                                                    ON ContaTransferencia.IdContaDestino = Destino.IdConta
                                            WHERE 1 = 1 ");

                if (obj != null)
                {
                    GetSqlCommand().Parameters.Clear();
                    if (obj.Id > 0)
                    {
                        objSbSelect.AppendLine(@" AND ContaTransferencia.IdContaTransferencia = @IdContaTransferencia");
                        GetSqlCommand().Parameters.Add("IdContaTransferencia", SqlDbType.Int).Value = obj.Id;
                    }
                    if (obj.ContaMovimento.Id > 0)
                    {
                        objSbSelect.AppendLine(@" AND ContaMovimento.IdContaMovimento = @IdContaMovimento");
                        GetSqlCommand().Parameters.Add("IdContaMovimento", SqlDbType.Int).Value = obj.ContaMovimento.Id;
                    }
                    if (obj.ContaMovimento.Conta.Id > 0)
                    {
                        objSbSelect.AppendLine(@" AND Conta.IdConta = @IdConta");
                        GetSqlCommand().Parameters.Add("IdConta", SqlDbType.Int).Value = obj.ContaMovimento.Conta.Id;
                    }
                    if (obj.ContaDestino.Id > 0)
                    {
                        objSbSelect.AppendLine(@" AND ContaTransferencia.IdContaDestino = @IdContaDestino");
                        GetSqlCommand().Parameters.Add("IdContaDestino", SqlDbType.Int).Value = obj.ContaDestino.Id;
                    }
                    if (obj.DataTransferencia != new DateTime())
                    {
                        objSbSelect.AppendLine(@" AND ContaTransferencia.DataTransferencia = @DataTransferencia");
                        GetSqlCommand().Parameters.Add("DataTransferencia", SqlDbType.DateTime).Value = obj.DataTransferencia;
                    }
                }

                GetSqlCommand().CommandText = "";
                GetSqlCommand().CommandText = objSbSelect.ToString();

                lst = new List <ContaTransferenciaModel>();

                while (GetSqlDataReader().Read())
                {
                    ContaTransferenciaModel item = new ContaTransferenciaModel();

                    if (!(GetSqlDataReader().IsDBNull(GetSqlDataReader().GetOrdinal("IdContaTransferencia"))))
                    {
                        item.Id = Convert.ToInt32(GetSqlDataReader()["IdContaOperaIdContaTransferenciacao"]);
                    }

                    if (!(GetSqlDataReader().IsDBNull(GetSqlDataReader().GetOrdinal("IdContaMovimento"))))
                    {
                        item.ContaMovimento.Id = Convert.ToInt32(GetSqlDataReader()["IdContaMovimento"]);
                    }

                    if (!(GetSqlDataReader().IsDBNull(GetSqlDataReader().GetOrdinal("IdConta"))))
                    {
                        item.ContaMovimento.Conta.Id = Convert.ToInt32(GetSqlDataReader()["IdConta"]);
                    }

                    if (!(GetSqlDataReader().IsDBNull(GetSqlDataReader().GetOrdinal("IdContaDestino"))))
                    {
                        item.ContaDestino.Id = Convert.ToInt32(GetSqlDataReader()["IdContaDestino"]);
                    }

                    if (!(GetSqlDataReader().IsDBNull(GetSqlDataReader().GetOrdinal("Valor"))))
                    {
                        item.Valor = Convert.ToDecimal(GetSqlDataReader()["Valor"]);
                    }

                    if (!(GetSqlDataReader().IsDBNull(GetSqlDataReader().GetOrdinal("DataTransferencia"))))
                    {
                        item.DataTransferencia = Convert.ToDateTime(GetSqlDataReader()["DataTransferencia"]);
                    }

                    lst.Add(item);
                }

                return(lst);
            }
            catch (Exception ex)
            {
                throw ex;
            }
            finally
            {
                if (objSbSelect != null)
                {
                    objSbSelect = null;
                }
                Close();
            }
        }