/// <summary>
        /// Insere uma movimentacao na conta bancária e atualiza os dados da conta associada
        /// </summary>
        /// <param name="movimentacaoConta">movimentacao da conta</param>
        /// <param name="conta">conta associada</param>
        /// <returns></returns>
        public Int64 Inserir(MovimentacaoConta movimentacaoConta)
        {
            try
            {
                MovimentacaoContaE _movimentacaoContaE = new MovimentacaoContaE();
                Atribuir(movimentacaoConta, _movimentacaoContaE);

                repMovimentacaoConta.Inserir(_movimentacaoContaE);
                saceContext.SaveChanges();

                // Atualiza saldo da conta bancária
                var query = from conta in saceContext.ContaSet
                            where conta.codConta == _movimentacaoContaE.codConta
                            select conta;
                ContaE _contaE = query.FirstOrDefault();
                if (_contaE != null)
                {
                    AtualizaSituacaoConta(_contaE, _movimentacaoContaE, false);
                    AtualizaSituacaoPagamentosEntrada(_contaE);
                    AtualizaSituacaoPagamentosSaida(_contaE, _movimentacaoContaE, false);
                }

                return(_movimentacaoContaE.codMovimentacao);
            }
            catch (Exception e)
            {
                throw new DadosException("Movimentação de Conta", e.Message, e);
            }
        }
 /// <summary>
 /// Atualiza conta para quitada quando todas a soma de todas as movimentacoes quitam a conta
 /// </summary>
 /// <param name="_contaE"></param>
 private ContaE AtualizaSituacaoConta(ContaE contaE, MovimentacaoContaE movimentacaoE, bool removeuMovimento)
 {
     if (contaE != null)
     {
         decimal valorConta = Math.Round(contaE.valor - contaE.desconto, 2);
         if (valorConta == movimentacaoE.valor)
         {
             if (removeuMovimento)
             {
                 contaE.codSituacao = SituacaoConta.SITUACAO_ABERTA;
             }
             else
             {
                 contaE.codSituacao = SituacaoConta.SITUACAO_QUITADA;
             }
         }
         else
         {
             decimal totalMovimentacoesConta = ObterPorConta(contaE.codConta).Sum(c => c.Valor);
             if (valorConta <= totalMovimentacoesConta)
             {
                 contaE.codSituacao = SituacaoConta.SITUACAO_QUITADA;
             }
             else
             {
                 contaE.codSituacao = SituacaoConta.SITUACAO_ABERTA;
             }
         }
     }
     saceContext.SaveChanges();
     return(contaE);
 }
        /// <summary>
        /// Remover movimentacao
        /// </summary>
        /// <param name="codMovimentacaoConta"></param>
        public void Remover(Int64 codMovimentacaoConta)
        {
            try
            {
                var queryMovimentacao = from movimentacaoContaE in saceContext.MovimentacaoContaSet
                                        where movimentacaoContaE.codMovimentacao == codMovimentacaoConta
                                        select movimentacaoContaE;
                MovimentacaoContaE _movimentacaoContaE = queryMovimentacao.ToList().ElementAtOrDefault(0);
                if (_movimentacaoContaE != null)
                {
                    long codConta = (long)_movimentacaoContaE.codConta;
                    // Atualiza status da conta, entrada e saída
                    var query = from conta in saceContext.ContaSet
                                where conta.codConta == _movimentacaoContaE.codConta
                                select conta;
                    ContaE _contaE = query.FirstOrDefault();

                    repMovimentacaoConta.Remover(_movimentacaoContaE);
                    saceContext.SaveChanges();

                    if (_contaE != null)
                    {
                        AtualizaSituacaoConta(_contaE, _movimentacaoContaE, true);
                        AtualizaSituacaoPagamentosEntrada(_contaE);
                        AtualizaSituacaoPagamentosSaida(_contaE, _movimentacaoContaE, true);
                    }
                }
            }
            catch (Exception e)
            {
                throw new DadosException("Movimentação de Conta", e.Message, e);
            }
        }
 /// <summary>
 /// Atribui a classe entidade para entidade persistente
 /// </summary>
 /// <param name="movimentacaoConta"></param>
 /// <param name="_movimentacaoE"></param>
 private void Atribuir(MovimentacaoConta movimentacaoConta, MovimentacaoContaE _movimentacaoE)
 {
     _movimentacaoE.codConta            = movimentacaoConta.CodConta;
     _movimentacaoE.codContaBanco       = movimentacaoConta.CodContaBanco;
     _movimentacaoE.codResponsavel      = movimentacaoConta.CodResponsavel;
     _movimentacaoE.codTipoMovimentacao = movimentacaoConta.CodTipoMovimentacao;
     _movimentacaoE.dataHora            = movimentacaoConta.DataHora;
     _movimentacaoE.valor = movimentacaoConta.Valor;
 }
 /// <summary>
 /// Atualiza Situacao dos pagamentos da saída para quitado quando todas as contas estão quitadas
 /// </summary>
 /// <param name="_contaE"></param>
 private void AtualizaSituacaoPagamentosSaida(ContaE contaE, MovimentacaoContaE movimentacaoContaE, bool removeuMovimento)
 {
     if (!contaE.codSaida.Equals(Global.SAIDA_PADRAO))
     {
         var query = from saida in saceContext.tb_saida
                     where saida.codSaida == contaE.codSaida
                     select saida;
         tb_saida _saidaE = query.FirstOrDefault();
         if (_saidaE != null)
         {
             if (_saidaE.totalAVista == movimentacaoContaE.valor)
             {
                 if (removeuMovimento)
                 {
                     _saidaE.codSituacaoPagamentos = SituacaoPagamentos.LANCADOS;
                 }
                 else
                 {
                     _saidaE.codSituacaoPagamentos = SituacaoPagamentos.QUITADA;
                 }
             }
             else
             {
                 if (GerenciadorConta.GetInstance(saceContext).ObterPorSituacaoSaida(SituacaoConta.SITUACAO_ABERTA, (long)contaE.codSaida).ToList().Count == 0)
                 {
                     _saidaE.codSituacaoPagamentos = SituacaoPagamentos.QUITADA;
                     IEnumerable <Conta> contas         = GerenciadorConta.GetInstance(saceContext).ObterPorSaida(_saidaE.codSaida);
                     List <long>         listaCodContas = new List <long>();
                     foreach (Conta conta in contas)
                     {
                         listaCodContas.Add(conta.CodConta);
                     }
                     decimal somaMovimentacoes = 0;
                     IEnumerable <MovimentacaoConta> listaMovimentacoes = ObterPorContas(listaCodContas);
                     foreach (MovimentacaoConta movimentacao in listaMovimentacoes)
                     {
                         somaMovimentacoes += movimentacao.Valor;
                     }
                     GerenciadorSaida.GetInstance(saceContext).AtualizarTipoPedidoGeradoPorSaida(_saidaE.codTipoSaida, _saidaE.pedidoGerado, _saidaE.tipoDocumentoFiscal, somaMovimentacoes, _saidaE.codSaida);
                     //_saidaE.totalAVista = somaMovimentacoes;
                 }
                 else
                 {
                     _saidaE.codSituacaoPagamentos = SituacaoPagamentos.LANCADOS;
                 }
             }
             saceContext.SaveChanges();
         }
     }
 }
        /// <summary>
        /// Insere o valor de uma movimentacao, inserindo uma nova movimentacao para cada conta
        /// </summary>
        /// <param name="movimentacaoConta"></param>
        /// <param name="listaContas"></param>
        /// <returns></returns>
        public Int64 Inserir(MovimentacaoConta movimentacaoConta, List <long> listaContas, List <MovimentacaoConta> listaMovimentacaoConta)
        {
            try
            {
                using (TransactionScope transaction = new TransactionScope())
                {
                    decimal totalMovimentacao = movimentacaoConta.Valor;
                    var     queryContas       = from conta in saceContext.ContaSet
                                                where listaContas.Contains(conta.codConta)
                                                orderby conta.dataVencimento
                                                select conta;
                    IEnumerable <ContaE> contasE = queryContas.ToList();

                    // adiciona os créditos de devolução ao valor da movimentação
                    decimal totalCreditos = contasE.Where(c => c.valor < 0).Sum(c => (c.valor - c.desconto));
                    totalMovimentacao += Math.Abs(totalCreditos);

                    foreach (ContaE _contaE in contasE)
                    {
                        // Se conta de devolução já dá baixa
                        if (_contaE.valor < 0)
                        {
                            movimentacaoConta.CodConta = _contaE.codConta;
                            movimentacaoConta.Valor    = Math.Round(_contaE.valor - _contaE.desconto, 2);
                            MovimentacaoContaE _movimentacaoE = new MovimentacaoContaE();
                            Atribuir(movimentacaoConta, _movimentacaoE);

                            repMovimentacaoConta.Inserir(_movimentacaoE);
                            saceContext.SaveChanges();

                            AtualizaSituacaoConta(_contaE, _movimentacaoE, false);
                            AtualizaSituacaoPagamentosEntrada(_contaE);
                            AtualizaSituacaoPagamentosSaida(_contaE, _movimentacaoE, false);
                        }
                        else if (totalMovimentacao > 0)
                        {
                            if (!_contaE.codSituacao.Equals(SituacaoConta.SITUACAO_QUITADA))
                            {
                                movimentacaoConta.CodConta = _contaE.codConta;
                                decimal totalPago  = listaMovimentacaoConta.Where(m => m.CodConta == _contaE.codConta).Sum(m => m.Valor);
                                decimal valorPagar = Math.Round(_contaE.valor - _contaE.desconto, 2) - totalPago;

                                if (valorPagar <= totalMovimentacao)
                                {
                                    movimentacaoConta.Valor = valorPagar;
                                }
                                else
                                {
                                    movimentacaoConta.Valor = totalMovimentacao;
                                }
                                totalMovimentacao -= movimentacaoConta.Valor;
                                totalPago          = 0;

                                MovimentacaoContaE _movimentacaoE = new MovimentacaoContaE();
                                Atribuir(movimentacaoConta, _movimentacaoE);

                                repMovimentacaoConta.Inserir(_movimentacaoE);
                                saceContext.SaveChanges();

                                AtualizaSituacaoConta(_contaE, _movimentacaoE, false);
                                AtualizaSituacaoPagamentosEntrada(_contaE);
                                AtualizaSituacaoPagamentosSaida(_contaE, _movimentacaoE, false);
                            }
                        }
                    }
                    transaction.Complete();
                }
            }
            catch (Exception e)
            {
                throw new DadosException("Movimentação de Conta", e.Message, e);
            }
            return(0);
        }