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