/// <summary> /// Efetua estorno bancário de pagto /// </summary> private uint[] EstornoBancario(GDASession session, uint idPagto, uint idContaBanco, uint idConta, uint idContaEstorno, bool estornarMovimentacaoBancaria, DateTime?dataEstornoBanco, int?contadorDataUnica) { if (!estornarMovimentacaoBancaria) { // Pega a primeira movimentação da conta bancária referente ao pagto object obj = objPersistence.ExecuteScalar(session, "Select idMovBanco from mov_banco Where idContaBanco=" + idContaBanco + " And idPagto=" + idPagto + " order by idMovBanco asc limit 1"); uint idMovBanco = obj != null && !String.IsNullOrEmpty(obj.ToString()) ? Glass.Conversoes.StrParaUint(obj.ToString()) : 0; if (idMovBanco == 0) { return(new uint[0]); } // Verifica a conciliação bancária ConciliacaoBancariaDAO.Instance.VerificaDataConciliacao(session, idMovBanco); MovBanco movAnterior = MovBancoDAO.Instance.ObtemMovAnterior(session, idMovBanco); // Corrige saldo objPersistence.ExecuteCommand(session, string.Format( "Update mov_banco Set valorMov=0, DataUnica=Concat(DataUnica, {0}) Where idConta=" + idConta + " And idPagto=" + idPagto, contadorDataUnica != null ? "''": contadorDataUnica.Value.ToString())); if (movAnterior != null) { MovBancoDAO.Instance.CorrigeSaldo(session, movAnterior.IdMovBanco, idMovBanco); } // Exclui movimentações geradas objPersistence.ExecuteCommand(session, "Delete From mov_banco Where idConta=" + idConta + " And idPagto=" + idPagto); return(new uint[0]); } else { // Verifica a conciliação bancária ConciliacaoBancariaDAO.Instance.VerificaDataConciliacao(session, idContaBanco, dataEstornoBanco.Value); List <uint> lst = new List <uint>(); Pagto pagto = GetPagto(session, idPagto); foreach (MovBanco m in MovBancoDAO.Instance.GetByPagto(session, idPagto, idConta)) { // Condição necessária para não estornar a conta mais de uma vez, no caso de efetuar um pagamento com duas ou mais // formas de pagamento que envolvem conta bancária (pagto. bancário) if (idContaBanco == m.IdContaBanco) { lst.Add(ContaBancoDAO.Instance.MovContaPagto(session, idContaBanco, idContaEstorno, (int)UserInfo.GetUserInfo.IdLoja, idPagto, null, pagto.IdFornec, m.TipoMov == 1 ? 2 : 1, m.ValorMov, m.Juros, dataEstornoBanco.Value, m.Obs)); } } return(lst.ToArray()); } }
/// <summary> /// Credita/Debita valor da conta bancária /// </summary> private uint MovimentaConta(GDASession sessao, uint idContaBanco, uint idConta, int idLoja, uint?idCliente, uint?idFornec, uint?idPedido, uint?idSinal, uint?idSinalCompra, uint?idContaR, uint?idAcerto, uint?idDeposito, uint?idCheque, uint?idPagto, uint?idContaPg, uint?idLiberarPedido, uint?idContaBancoDest, uint?idObra, uint?idAntecipFornec, uint?idAntecipContaRec, uint?idTrocaDevolucao, int tipoMov, decimal valorMov, decimal juros, DateTime dataMov, string obs, uint?idAcertoCheque, uint?idDevolucaoPagto, uint?idCreditoFornecedor, uint?idDepositoNaoIdentificado, uint?idCartaoNaoIdentificado, int?idArquivoQuitacaoParcelaCartao, uint?idArquivoRemessa, bool lancManual) { // Verifica a conciliação bancária ConciliacaoBancariaDAO.Instance.VerificaDataConciliacao(sessao, idContaBanco, dataMov); // Gera movimentação MovBanco mov = new MovBanco(); mov.IdLoja = idLoja; mov.DataMov = dataMov; mov.DataOriginal = dataMov; mov.TipoMov = tipoMov; mov.ValorMov = valorMov; mov.Juros = juros; mov.IdContaBanco = idContaBanco; mov.IdCliente = idCliente; mov.IdFornecedor = idFornec == 0 ? null : idFornec; mov.IdContaBancoDest = idContaBancoDest; mov.IdConta = idConta; mov.IdContaR = idContaR; mov.IdAcerto = idAcerto; mov.IdPedido = idPedido; mov.IdSinal = idSinal; mov.IdSinalCompra = idSinalCompra; mov.IdDeposito = idDeposito; mov.IdPagto = idPagto; mov.IdContaPg = idContaPg; mov.IdCheque = idCheque; mov.IdLiberarPedido = idLiberarPedido; mov.IdObra = idObra; mov.IdAntecipFornec = idAntecipFornec; mov.IdAcertoCheque = idAcertoCheque; mov.IdAntecipContaRec = idAntecipContaRec; mov.IdTrocaDevolucao = idTrocaDevolucao; mov.IdDevolucaoPagto = idDevolucaoPagto; mov.IdCreditoFornecedor = idCreditoFornecedor; mov.IdDepositoNaoIdentificado = idDepositoNaoIdentificado; mov.IdCartaoNaoIdentificado = idCartaoNaoIdentificado; mov.IdArquivoQuitacaoParcelaCartao = idArquivoQuitacaoParcelaCartao; mov.IdArquivoRemessa = idArquivoRemessa; mov.Saldo = tipoMov == 1 ? MovBancoDAO.Instance.GetSaldo(sessao, idContaBanco) + valorMov : MovBancoDAO.Instance.GetSaldo(sessao, idContaBanco) - valorMov; mov.Obs = obs; mov.LancManual = lancManual; return(MovBancoDAO.Instance.Insert(sessao, mov)); }
/// <summary> /// Cria o Log de Cancelamento para a movimentação bancária. /// </summary> /// <param name="movimentacaoBancaria"></param> /// <param name="motivo"></param> public void LogMovimentacaoBancaria(MovBanco movimentacaoBancaria, string motivo, bool manual) { InserirLog(UserInfo.GetUserInfo.CodUser, LogCancelamento.TabelaCancelamento.MovimentacaoBancaria, movimentacaoBancaria.IdMovBanco, movimentacaoBancaria, motivo, manual); }
public void Cancela(uint idCreditoFornecedor, string motivo) { lock (_cancelaLock) { using (var transaction = new GDATransaction()) { try { transaction.BeginTransaction(); CreditoFornecedor cred = ObterCreditoFornecedor(transaction, idCreditoFornecedor); decimal valor = 0; var lstMov = MovBancoDAO.Instance.GetByCreditoFornec(transaction, idCreditoFornecedor, null); foreach (PagtoCreditoFornecedor p in cred.Pagamentos) { valor += p.ValorPagto; } // Verifica se o fornecedor possui crédito suficiente para que este seja cancelado if (FornecedorDAO.Instance.GetCredito(transaction, cred.IdFornecedor) < valor) { throw new Exception("O crédito gerado já foi utilizado, não é possível cancelá-lo."); } var cheques = ChequesDAO.Instance.GetByCreditoFornecedor(transaction, cred.IdCreditoFornecedor); // Ao efetuar um pagamento com cheque próprio Compensado o campo ValorReceb fica zerado, é preenchido na quitação do cheque próprio que foi cadastrado em aberto no pagamento. if (cheques.Count(f => f.Tipo == 1 && (f.ValorReceb > 0 || f.IdDeposito > 0)) > 0) { var idsAcertoCheques = new List <int>(); if (cheques.Count(f => f.Tipo == 1 && f.ValorReceb > 0) > 0) { foreach (var cheque in cheques.Where(f => f.Tipo == 1 && f.ValorReceb > 0).ToList()) { var idsAcertoCheque = ItemAcertoChequeDAO.Instance.GetIdsAcertoByCheque(transaction, cheque.IdCheque, true); if (!string.IsNullOrEmpty(idsAcertoCheque)) { idsAcertoCheques.AddRange(idsAcertoCheque.Split(',').Select(f => f.StrParaInt()).ToList()); } } } if (cheques.Count(f => f.Tipo == 1 && f.IdDeposito > 0) > 0 || idsAcertoCheques.Count > 0) { throw new Exception(string.Format(@"Não é possível cancelar este pagamento, o(s) cheque(s) próprio de número {0} foi(ram) quitado(s):\n\n{1}{2}\n\n Cancele a quitação dos cheques e tente cancelar o pagamento novamente.", string.Join(", ", cheques.Where(f => f.Tipo == 1 && (f.ValorReceb > 0 || f.IdDeposito > 0)).Select(f => f.Num).ToList()), idsAcertoCheques.Count > 0 ? string.Format("Acerto(s) de cheque próprio {0}", string.Join(", ", idsAcertoCheques)) : string.Empty, cheques.Count(f => f.Tipo == 1 && f.IdDeposito > 0) > 0 ? string.Format("{0}Depósito(s) {1}", idsAcertoCheques.Count > 0 ? "\n" : string.Empty, string.Join(", ", cheques.Where(f => f.Tipo == 1 && f.IdDeposito > 0).Select(f => f.IdDeposito).ToList())) : string.Empty)); } } if (cheques.Any(f => f.Situacao == (int)Cheques.SituacaoCheque.Devolvido)) { throw new Exception(string.Format(@"Não é possível cancelar este pagamento, o(s) cheque(s) de número {0} foi(ram) devolvido(s). Cancele a devolução deles para, depois, cancelar o pagamento.", string.Join(", ", cheques.Where(f => f.Situacao == (int)Cheques.SituacaoCheque.Devolvido).Select(f => f.Num).ToList()))); } objPersistence.ExecuteCommand(transaction, "update credito_fornecedor set situacao=?s where idCreditoFornecedor=" + idCreditoFornecedor, new GDAParameter("?s", (int)CreditoFornecedor.SituacaoCredito.Cancelado)); foreach (PagtoCreditoFornecedor p in cred.Pagamentos) { #region Dinheiro // Se a forma de pagto for Dinheiro, gera movimentação no caixa geral if (p.IdFormaPagto == (uint)Glass.Data.Model.Pagto.FormaPagto.Dinheiro) { CaixaGeralDAO.Instance.MovCxCreditoFornecedor(transaction, idCreditoFornecedor, cred.IdFornecedor, UtilsPlanoConta.GetPlanoContaEstornoCreditoFornec((uint)Glass.Data.Model.Pagto.FormaPagto.Dinheiro), 1, p.ValorPagto, 1, true, null, null); } #endregion #region Cheques // Se a forma de pagamento for cheques próprios, cadastra cheques, associa os mesmos com as contas // que estão sendo pagas, debita valor da conta que foi escolhida em cada cheque else if ((p.IdFormaPagto == (uint)Glass.Data.Model.Pagto.FormaPagto.ChequeProprio || p.IdFormaPagto == (uint)Glass.Data.Model.Pagto.FormaPagto.ChequeTerceiro)) { var contadorDataUnica = 0; foreach (Cheques c in cheques) { // Só executa para o tipo de cheque da forma de pagamento adequada if ((c.Tipo == 1 && p.IdFormaPagto == (uint)Glass.Data.Model.Pagto.FormaPagto.ChequeTerceiro) || (c.Tipo == 2 && p.IdFormaPagto == (uint)Glass.Data.Model.Pagto.FormaPagto.ChequeProprio)) { continue; } CaixaGeralDAO.Instance.MovCxCreditoFornecedor(transaction, idCreditoFornecedor, cred.IdFornecedor, UtilsPlanoConta.GetPlanoContaEstornoCreditoFornec(p.IdFormaPagto), 1, c.Valor, 2, true, null, contadorDataUnica++); // Cheque próprio if (c.Tipo == 1) { ChequesDAO.Instance.Delete(transaction, c); // Para cada cheque "Compensado" utilizado neste pagamento, debita o valor da conta bancária associada ao mesmo if (c.Situacao == (int)Cheques.SituacaoCheque.Compensado && c.IdContaBanco > 0) { // Pega a primeira movimentação da conta bancária referente ao pagto object obj = objPersistence.ExecuteScalar(transaction, "Select idMovBanco from mov_banco Where idContaBanco=" + c.IdContaBanco + " And idCreditoFornecedor=" + idCreditoFornecedor + " and idCheque=" + c.IdCheque + " order by idMovBanco asc limit 1"); uint idMovBanco = obj != null && !String.IsNullOrEmpty(obj.ToString()) ? Glass.Conversoes.StrParaUint(obj.ToString()) : 0; if (idMovBanco == 0) { return; } // Verifica a conciliação bancária ConciliacaoBancariaDAO.Instance.VerificaDataConciliacao(transaction, idMovBanco); MovBanco movAnterior = MovBancoDAO.Instance.ObtemMovAnterior(transaction, idMovBanco); // Corrige saldo objPersistence.ExecuteCommand(transaction, "Update mov_banco Set valorMov=0 Where idCheque=" + c.IdCheque + " And idCreditoFornecedor=" + idCreditoFornecedor); if (movAnterior != null) { MovBancoDAO.Instance.CorrigeSaldo(transaction, movAnterior.IdMovBanco, idMovBanco); } // Exclui movimentações geradas objPersistence.ExecuteCommand(transaction, "Delete From mov_banco Where idCheque=" + c.IdCheque + " And idCreditoFornecedor=" + idCreditoFornecedor); } } // Cheque de terceiros else if (c.Tipo == 2) { objPersistence.ExecuteCommand(transaction, @"update cheques set jurosPagto=null, multaPagto=null, idCreditoFornecedor=null, situacao=" + (int)Cheques.SituacaoCheque.EmAberto + " where idCheque=" + c.IdCheque); } } } #endregion #region Depósito (Pagto. Bancário) ou Boleto else if (p.IdFormaPagto == (uint)Glass.Data.Model.Pagto.FormaPagto.Deposito || p.IdFormaPagto == (uint)Glass.Data.Model.Pagto.FormaPagto.Boleto) { uint idConta = UtilsPlanoConta.GetPlanoContaCreditoFornec(p.IdFormaPagto); // Pega a primeira movimentação da conta bancária referente ao pagto object obj = objPersistence.ExecuteScalar(transaction, "Select idMovBanco from mov_banco Where " + "idCreditoFornecedor=" + idCreditoFornecedor + " and idConta=" + idConta + " order by idMovBanco asc limit 1"); uint idMovBanco = obj != null && !String.IsNullOrEmpty(obj.ToString()) ? Glass.Conversoes.StrParaUint(obj.ToString()) : 0; if (idMovBanco == 0) { continue; } // Verifica a conciliação bancária ConciliacaoBancariaDAO.Instance.VerificaDataConciliacao(transaction, idMovBanco); MovBanco movAnterior = MovBancoDAO.Instance.ObtemMovAnterior(transaction, idMovBanco); // Corrige saldo objPersistence.ExecuteCommand(transaction, "Update mov_banco Set valorMov=0 Where idConta=" + idConta + " And idCreditoFornecedor=" + idCreditoFornecedor); if (movAnterior != null) { MovBancoDAO.Instance.CorrigeSaldo(transaction, movAnterior.IdMovBanco, idMovBanco); } // Exclui movimentações geradas objPersistence.ExecuteCommand(transaction, "Delete From mov_banco Where idConta=" + idConta + " And idCreditoFornecedor=" + idCreditoFornecedor); // Salva o pagto. bancário no Cx. Geral CaixaGeralDAO.Instance.MovCxCreditoFornecedor(transaction, idCreditoFornecedor, cred.IdFornecedor, UtilsPlanoConta.GetPlanoContaEstornoCreditoFornec(p.IdFormaPagto), 1, p.ValorPagto, 0, false, null, null); } #endregion #region Permuta else if (p.IdFormaPagto == (uint)Glass.Data.Model.Pagto.FormaPagto.Permuta) { CaixaGeralDAO.Instance.MovCxCreditoFornecedor(transaction, idCreditoFornecedor, cred.IdFornecedor, UtilsPlanoConta.GetPlanoContaEstornoCreditoFornec((uint)Glass.Data.Model.Pagto.FormaPagto.Permuta), 1, p.ValorPagto, 0, false, null, null); } #endregion } CaixaGeralDAO.Instance.MovCxCreditoFornecedor(transaction, idCreditoFornecedor, cred.IdFornecedor, cred.IdConta, 1, valor, 0, false, null, null); FornecedorDAO.Instance.DebitaCredito(transaction, cred.IdFornecedor, valor); LogCancelamentoDAO.Instance.LogCreditoFornecedor(cred, motivo, true); transaction.Commit(); transaction.Close(); } catch { transaction.Rollback(); transaction.Close(); throw; } } } }
/// <summary> /// Cancela antecipação /// </summary> public void Cancelar(uint idAntecipContaRec, bool gerarEstorno, string motivo, DateTime?dataEstorno) { using (var transaction = new GDATransaction()) { try { transaction.BeginTransaction(); AntecipContaRec antecip = GetElement(transaction, idAntecipContaRec); if (antecip.Situacao == (uint)AntecipContaRec.SituacaoEnum.Cancelada) { throw new Exception("Esta antecipação já foi cancelada."); } // Se as contas a receber tiverem ter sido recebidas não permite cancelar a antecipação if (objPersistence.ExecuteSqlQueryCount(transaction, "Select Count(*) From contas_receber Where recebida=1 And idAntecipContaRec=" + idAntecipContaRec, null) > 0) { throw new Exception("Algumas contas antecipadas já foram recebidas, cancele o recebimento das mesmas antes de cancelar esta antecipação."); } // Desassocia contas a receber com essa antecipação objPersistence.ExecuteCommand(transaction, "Update contas_receber Set idAntecipContaRec=null Where idAntecipContaRec=" + idAntecipContaRec); // Estorna a antecipação if (!gerarEstorno) // Exclui movimentações que esta antecipação gerou { // Pega a primeira movimentação da conta bancária que esta antecipação foi feita apenas para alterar o saldo string sql = "Select idMovBanco from mov_banco Where idContaBanco=" + antecip.IdContaBanco + " And idAntecipContaRec=" + idAntecipContaRec + " order by idMovBanco asc limit 1"; uint idMovBanco = ExecuteScalar <uint>(transaction, sql); // Verifica a conciliação bancária ConciliacaoBancariaDAO.Instance.VerificaDataConciliacao(transaction, idMovBanco); MovBanco movAnterior = MovBancoDAO.Instance.ObtemMovAnterior(transaction, idMovBanco); // Corrige saldo objPersistence.ExecuteCommand(transaction, "Update mov_banco Set valorMov=0 Where idAntecipContaRec=" + idAntecipContaRec); if (movAnterior != null) { MovBancoDAO.Instance.CorrigeSaldo(transaction, movAnterior.IdMovBanco, idMovBanco); } // Exclui movimentações que esta antecipação gerou objPersistence.ExecuteCommand(transaction, "Delete From mov_banco Where idAntecipContaRec=" + idAntecipContaRec); } else // Estorna valores { // Verifica a conciliação bancária ConciliacaoBancariaDAO.Instance.VerificaDataConciliacao(transaction, antecip.IdContaBanco, dataEstorno.Value); ContaBancoDAO.Instance.MovContaAntecip(transaction, antecip.IdContaBanco, UtilsPlanoConta.GetPlanoConta( UtilsPlanoConta.PlanoContas.EstornoAntecipBoleto), (int)UserInfo.GetUserInfo.IdLoja, antecip.IdAntecipContaRec, 2, antecip.Valor - antecip.Taxa - antecip.Juros - antecip.Iof, dataEstorno.Value, motivo); } // Cancela a antecipação objPersistence.ExecuteCommand(transaction, "Update antecip_conta_rec Set situacao=" + (int)AntecipContaRec.SituacaoEnum.Cancelada + ", obs=?obs Where idAntecipContaRec=" + idAntecipContaRec, new GDAParameter("?obs", "Motivo do Cancelamento: " + motivo)); transaction.Commit(); transaction.Close(); } catch { transaction.Rollback(); transaction.Close(); throw; } } }