/// <summary> /// Insere as parcelas do cartão /// </summary> private UtilsFinanceiro.DadosRecebimento InserirParcelas(GDASession transaction, Negocios.Entidades.CartaoNaoIdentificado cni) { return(UtilsFinanceiro.Receber(transaction, UserInfo.GetUserInfo.IdLoja, null, null, null, null, null, null, null, null, null, null, null, 0, 0, (uint)cni.IdCartaoNaoIdentificado, cni.DataVenda.ToString(), cni.Valor, cni.Valor, new[] { cni.Valor }, new[] { (uint)Data.Model.Pagto.FormaPagto.Cartao }, new[] { (uint)cni.IdContaBanco }, null, null, new[] { (uint)cni.TipoCartao }, null, null, 0, false, false, 0, null, cni.CxDiario, new[] { (uint)cni.NumeroParcelas }, null, false, UtilsFinanceiro.TipoReceb.CartaoNaoIdentificado)); }
/// <summary> /// Cancela uma devolução de pagamento. /// </summary> public void Cancelar(uint idDevolucaoPagto, string motivo, DateTime dataEstornoBanco) { Glass.FilaOperacoes.CancelarDevolucaoPagto.AguardarVez(); using (var transaction = new GDATransaction()) { try { transaction.BeginTransaction(); DevolucaoPagto dev = null; var idsCheques = string.Empty; dev = GetElementByPrimaryKey(transaction, idDevolucaoPagto); if (dev.Situacao == (int)DevolucaoPagto.SituacaoDevolucao.Cancelada) { throw new Exception("Esta devolução de pagamento já foi cancelada."); } if (ExecuteScalar <bool>(transaction, "Select Count(*)>0 From cheques c Where c.IdDevolucaoPagto=" + idDevolucaoPagto + " And Situacao > 1")) { throw new Exception(@"Um ou mais cheques recebidos já foram utilizados em outras transações, cancele ou retifique as transações dos cheques antes de cancelar esta devolução de pagamento."); } idsCheques = ChequesDAO.Instance.GetIdsByDevolucaoPagto(transaction, idDevolucaoPagto); UtilsFinanceiro.CancelaRecebimento(transaction, UtilsFinanceiro.TipoReceb.DevolucaoPagto, null, null, null, null, null, 0, null, null, dev, null, dataEstornoBanco, false, false); // Marca a devolução como cancelada dev.Situacao = (int)DevolucaoPagto.SituacaoDevolucao.Cancelada; Update(transaction, dev); LogCancelamentoDAO.Instance.LogDevolucaoPagamento(transaction, dev, motivo, true); transaction.Commit(); transaction.Close(); } catch (Exception ex) { transaction.Rollback(); transaction.Close(); throw new Exception(Glass.MensagemAlerta.FormatErrorMsg("Falha ao cancelar devolução de pagamento.", ex)); } finally { Glass.FilaOperacoes.CancelarDevolucaoPagto.ProximoFila(); } } }
/// <summary> /// Cancela o acerto de cheques. /// </summary> public void CancelarAcertoCheque(uint idAcertoCheque, string motivo, DateTime dataEstornoBanco, bool cancelamentoErroTef, bool gerarCredito) { lock (_cancelarAcertoChequeLock) { using (var transaction = new GDATransaction()) { try { transaction.BeginTransaction(); AcertoCheque acertoCheque = null; acertoCheque = GetElement(transaction, idAcertoCheque); if (ExecuteScalar <bool>(transaction, "Select Count(*)>0 From cheques c Where c.IdAcertoCheque=" + idAcertoCheque + " And ((Tipo = 1 AND situacao > 1) OR (Tipo = 2 AND situacao > 2))")) { throw new Exception(@"Um ou mais cheques recebidos já foram utilizados em outras transações, cancele ou retifique as transações dos cheques antes de cancelar este acerto de cheque."); } UtilsFinanceiro.CancelaRecebimento(transaction, !acertoCheque.ChequesProprios ? UtilsFinanceiro.TipoReceb.ChequeDevolvido : UtilsFinanceiro.TipoReceb.ChequeProprioDevolvido, null, null, null, null, null, idAcertoCheque, null, null, null, null, dataEstornoBanco, cancelamentoErroTef, gerarCredito); // Altera a situação do acerto objPersistence.ExecuteCommand(transaction, "update acerto_cheque set situacao=" + (int)AcertoCheque.SituacaoEnum.Cancelado + " where idAcertoCheque=" + idAcertoCheque); LogCancelamentoDAO.Instance.LogAcertoCheque(acertoCheque, motivo, true); transaction.Commit(); transaction.Close(); } catch (Exception ex) { transaction.Rollback(); transaction.Close(); throw new Exception(MensagemAlerta.FormatErrorMsg("Falha ao cancelar acerto de cheques.", ex)); } } } }
/// <summary> /// Cancela pagamento /// </summary> public void CancelarPagto(GDASession session, uint idPagto, string motivoCanc, bool estornarMovimentacaoBancaria, DateTime?dataEstornoBanco) { List <uint> lstCaixaGeral = new List <uint>(), lstMovBanco = new List <uint>(); decimal credito = 0; ContasPagar[] pagas = null, geradas = null; Pagto pagto = new Pagto(); MovBanco[] movs = MovBancoDAO.Instance.GetByPagto(session, idPagto, 0).ToArray(); List <AntecipacaoFornecedor> lstAntecipFornec = new List <AntecipacaoFornecedor>(); var lstCheques = ChequesDAO.Instance.GetByPagto(session, idPagto).ToArray(); var contadorDataUnica = 0; pagto = GetElementByPrimaryKey(session, idPagto); if (pagto.Situacao == (int)Pagto.SituacaoPagto.Cancelado) { throw new Exception("Este pagamento já foi cancelado."); } // Verifica se este pagto possui boletos gerados e pagos if (objPersistence.ExecuteSqlQueryCount(session, "Select Count(*) From contas_pagar Where idConta=" + UtilsPlanoConta.GetPlanoConta( UtilsPlanoConta.PlanoContas.PagtoRenegociacao) + " And idPagtoRestante=" + idPagto + " And paga=true") > 0) { throw new Exception( "Este pagamento gerou outras contas a pagar e as mesmas estão pagas, cancele o pagamento destas contas geradas antes de cancelar este pagamento"); } // Verifica se este pagto possui valores restante já pagos if ( objPersistence.ExecuteSqlQueryCount(session, "Select Count(*) From contas_pagar Where idPagtoRestante=" + idPagto + " And paga=true") > 0) { throw new Exception( "Este pagamento gerou um valor restante e o mesmo foi pago, cancele o pagamento deste valor restante antes de cancelar este pagamento"); } // Verifica se este pagto gerou juros e ou multa e se os planos de conta dos mesmos estão associados if (ContasPagarDAO.Instance.PossuiJurosMulta(session, idPagto) && (FinanceiroConfig.PlanoContaEstornoJurosPagto == 0 || FinanceiroConfig.PlanoContaEstornoMultaPagto == 0)) { throw new Exception("Associe os planos de conta de estorno de juros e multa de pagamentos."); } // 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 (lstCheques.Count(f => f.Tipo == 1 && (f.ValorReceb > 0 || f.IdDeposito > 0)) > 0) { var idsAcertoCheques = new List <int>(); if (lstCheques.Count(f => f.Tipo == 1 && f.ValorReceb > 0) > 0) { foreach (var cheque in lstCheques.Where(f => f.Tipo == 1 && f.ValorReceb > 0).ToList()) { var idsAcertoCheque = ItemAcertoChequeDAO.Instance.GetIdsAcertoByCheque(session, cheque.IdCheque, true); if (!string.IsNullOrEmpty(idsAcertoCheque)) { idsAcertoCheques.AddRange(idsAcertoCheque.Split(',').Select(f => f.StrParaInt()).ToList()); } } } if (lstCheques.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\nCancele a quitação dos cheques e tente cancelar o pagamento novamente.", string.Join(", ", lstCheques.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, lstCheques.Count(f => f.Tipo == 1 && f.IdDeposito > 0) > 0 ? string.Format("{0}Depósito(s) {1}", idsAcertoCheques.Count > 0 ? "\n" : string.Empty, string.Join(", ", lstCheques.Where(f => f.Tipo == 1 && f.IdDeposito > 0).Select(f => f.IdDeposito).ToList())) : string.Empty)); } } /* Chamado 52690. */ if (lstCheques.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(", ", lstCheques.Where(f => f.Situacao == (int)Cheques.SituacaoCheque.Devolvido).Select(f => f.Num).ToList()))); } bool jurosMultaEstornado = false; var lstPagto = PagtoPagtoDAO.Instance.GetByPagto(session, idPagto).ToArray(); #region Estorna Crédito if (FinanceiroConfig.FormaPagamento.CreditoFornecedor) { List <CaixaGeral> lstCxGeral = new List <CaixaGeral>(CaixaGeralDAO.Instance.GetByPagto(session, idPagto)); lstCxGeral.Sort( delegate(CaixaGeral x, CaixaGeral y) { int comp = y.DataMov.CompareTo(x.DataMov); if (comp == 0) { comp = y.IdCaixaGeral.CompareTo(x.IdCaixaGeral); } return(comp); } ); if (pagto.IdFornec > 0) { UtilsFinanceiro.ValidaValorCreditoFornecedor(session, (uint)pagto.IdFornec, lstCxGeral); } foreach (CaixaGeral cx in lstCxGeral) { if ((cx.TipoMov == 1 && cx.IdConta != UtilsPlanoConta.GetPlanoConta(UtilsPlanoConta.PlanoContas.PagtoCreditoFornecedor)) || (cx.TipoMov == 2 && cx.IdConta == UtilsPlanoConta.GetPlanoConta( UtilsPlanoConta.PlanoContas.EstornoPagtoCreditoFornecedor))) { // Se for juros de venda cartão, continua if (cx.IdConta == FinanceiroConfig.PlanoContaJurosCartao) { continue; } else { break; } } // Se algum credito tiver sido utilizado, estorna no crédito do fornecedor if (cx.IdConta == UtilsPlanoConta.GetPlanoConta(UtilsPlanoConta.PlanoContas.PagtoCreditoFornecedor) && pagto.IdFornec != null) { FornecedorDAO.Instance.CreditaCredito(session, pagto.IdFornec.Value, cx.ValorMov); credito += cx.ValorMov; // Estorna crédito utilizado pelo fornecedor lstCaixaGeral.Add(CaixaGeralDAO.Instance.MovCxPagto(session, idPagto, null, pagto.IdFornec, UtilsPlanoConta.GetPlanoConta( UtilsPlanoConta.PlanoContas.EstornoPagtoCreditoFornecedor), 2, cx.ValorMov, 0, null, null, 0, false, null)); } //Se algum credito tiver sido gerado, estorna do crédito do fornecedor. if (cx.IdConta == UtilsPlanoConta.GetPlanoConta(UtilsPlanoConta.PlanoContas.CreditoCompraGerado) && pagto.IdFornec != null) { FornecedorDAO.Instance.DebitaCredito(session, pagto.IdFornec.Value, cx.ValorMov); credito -= cx.ValorMov; // Estorna crédito venda gerado lstCaixaGeral.Add(CaixaGeralDAO.Instance.MovCxPagto(session, idPagto, null, pagto.IdFornec, UtilsPlanoConta.GetPlanoConta( UtilsPlanoConta.PlanoContas.EstornoCreditoCompraGerado), 1, cx.ValorMov, 0, null, null, 0, false, null)); } } } #endregion // Estorna os pagamentos foreach (PagtoPagto p in lstPagto) { // Não estorna os cheques ou crédito no loop (crédito: idFormaPagto = 0); if (p.IdFormaPagto == 0 || /* Chamado 17551. */ p.IdFormaPagto == (uint)Glass.Data.Model.Pagto.FormaPagto.Credito || p.IdFormaPagto == (uint)Glass.Data.Model.Pagto.FormaPagto.ChequeProprio || p.IdFormaPagto == (uint)Glass.Data.Model.Pagto.FormaPagto.ChequeTerceiro) { continue; } #region Estorna juros // Calcula o total de juros e multa para esta forma de pagto decimal jurosMultaPagto = (pagto.Juros + pagto.Multa) / lstPagto.Length; // Estorna os juros if (p.IdContaBanco > 0) { // Gera movimentação de estorno na conta bancária referente aos juros if (pagto.Juros > 0) { lstMovBanco.AddRange(EstornoBancario(session, idPagto, p.IdContaBanco.Value, FinanceiroConfig.PlanoContaJurosPagto, FinanceiroConfig.PlanoContaEstornoJurosPagto, estornarMovimentacaoBancaria, dataEstornoBanco, contadorDataUnica)); } // Gera movimentação de estorno na conta bancária referente à multa if (pagto.Multa > 0) { lstMovBanco.AddRange(EstornoBancario(session, idPagto, p.IdContaBanco.Value, FinanceiroConfig.PlanoContaMultaPagto, FinanceiroConfig.PlanoContaEstornoMultaPagto, estornarMovimentacaoBancaria, dataEstornoBanco, contadorDataUnica)); } } else if (!jurosMultaEstornado) { // Gera uma movimentação de estorno para o juros if (pagto.Juros > 0) { lstCaixaGeral.Add(CaixaGeralDAO.Instance.MovCxPagto(session, idPagto, null, pagto.IdFornec, FinanceiroConfig.PlanoContaEstornoJurosPagto, 1, pagto.Juros, 0, null, null, 1, true, null)); } // Gera uma movimentação de estorno para o juros if ((pagto.Multa / lstPagto.Length) > 0) { lstCaixaGeral.Add(CaixaGeralDAO.Instance.MovCxPagto(session, idPagto, null, pagto.IdFornec, FinanceiroConfig.PlanoContaEstornoMultaPagto, 1, pagto.Multa, 0, null, null, 1, true, null)); } jurosMultaEstornado = true; } #endregion // Recupera o plano de contas uint idConta = UtilsPlanoConta.GetPlanoContaEstornoPagto(p.IdFormaPagto); // Gera uma movimentação de estorno para cada forma de pagto var idCaixaGeral = CaixaGeralDAO.Instance.MovCxPagto(session, idPagto, null, pagto.IdFornec, idConta, 1, p.ValorPagto - jurosMultaPagto, jurosMultaPagto, null, null, 0, p.IdFormaPagto != (uint)Glass.Data.Model.Pagto.FormaPagto.AntecipFornec && p.IdFormaPagto != (uint)Glass.Data.Model.Pagto.FormaPagto.Permuta && (p.IdContaBanco == null || p.IdContaBanco == 0), null); objPersistence.ExecuteCommand(session, string.Format("UPDATE caixa_geral SET DataUnica=CONCAT(DATAUNICA, '_{0}') WHERE IdCaixaGeral={1}", contadorDataUnica++, idCaixaGeral)); } if (lstPagto.Any(f => f.IdContaBanco > 0)) { var contasBanco = new List <int>(); /* Chamado 39565. */ foreach (var idContaBanco in lstPagto.Where(f => f.IdContaBanco > 0).Select(f => (int)f.IdContaBanco.Value)) { if (contasBanco.Contains(idContaBanco)) { continue; } else { contasBanco.Add(idContaBanco); } // Gera movimentação de estorno na conta bancária lstMovBanco.AddRange(EstornoBancario(session, idPagto, (uint)idContaBanco, UtilsPlanoConta.GetPlanoConta(UtilsPlanoConta.PlanoContas.PagtoTransfBanco), UtilsPlanoConta.GetPlanoConta(UtilsPlanoConta.PlanoContas.EstornoPagtoTransfBancaria), estornarMovimentacaoBancaria, dataEstornoBanco, contadorDataUnica)); lstMovBanco.AddRange(EstornoBancario(session, idPagto, (uint)idContaBanco, UtilsPlanoConta.GetPlanoConta(UtilsPlanoConta.PlanoContas.PagtoBoleto), UtilsPlanoConta.GetPlanoConta(UtilsPlanoConta.PlanoContas.EstornoPagtoBoleto), estornarMovimentacaoBancaria, dataEstornoBanco, contadorDataUnica)); } } #region Estorna Cheques // Gera movimentação no caixa geral de estorno de cada cheque de terceiro foreach (var c in lstCheques.Where(f => f.Tipo == 2)) { // Estorna valor gerado pelo cheque var idCaixaGeral = CaixaGeralDAO.Instance.MovCxPagto(session, idPagto, null, pagto.IdFornec, UtilsPlanoConta.GetPlanoConta(UtilsPlanoConta.PlanoContas.EstornoPagtoChequeTerceiros), 1, c.Valor - c.JurosPagto - c.MultaPagto, c.JurosPagto + c.MultaPagto, null, null, 2, true, null); lstCaixaGeral.Add(idCaixaGeral); objPersistence.ExecuteCommand(session, string.Format("UPDATE caixa_geral SET DataUnica=CONCAT(DATAUNICA, '_{0}') WHERE IdCaixaGeral={1}", contadorDataUnica++, idCaixaGeral)); // Estorna valor dos juros pagos pelo cheque if (c.JurosPagto > 0) { idCaixaGeral = CaixaGeralDAO.Instance.MovCxPagto(session, idPagto, null, pagto.IdFornec, FinanceiroConfig.PlanoContaEstornoJurosPagto, 1, c.JurosPagto, 0, null, null, 2, true, null); lstCaixaGeral.Add(idCaixaGeral); objPersistence.ExecuteCommand(session, string.Format("UPDATE caixa_geral SET DataUnica=CONCAT(DATAUNICA, '_{0}') WHERE IdCaixaGeral={1}", contadorDataUnica++, idCaixaGeral)); } // Estorna valor dos juros pagos pelo cheque if (c.MultaPagto > 0) { idCaixaGeral = CaixaGeralDAO.Instance.MovCxPagto(session, idPagto, null, pagto.IdFornec, FinanceiroConfig.PlanoContaEstornoMultaPagto, 1, c.MultaPagto, 0, null, null, 2, true, null); lstCaixaGeral.Add(idCaixaGeral); objPersistence.ExecuteCommand(session, string.Format("UPDATE caixa_geral SET DataUnica=CONCAT(DATAUNICA, '_{0}') WHERE IdCaixaGeral={1}", contadorDataUnica++, idCaixaGeral)); } } // Altera situação dos cheques de terceiros utilizados no pagto desta conta para em aberto var dados = ChequesDAO.Instance.CancelaChequesPagto(session, idPagto, 2, Cheques.SituacaoCheque.EmAberto); lstCaixaGeral.AddRange(dados.Key); lstMovBanco.AddRange(dados.Value); // Cancela cheques próprios utilizados no pagamento desta conta dados = ChequesDAO.Instance.CancelaChequesPagto(session, idPagto, 1, Cheques.SituacaoCheque.Cancelado); lstCaixaGeral.AddRange(dados.Key); lstMovBanco.AddRange(dados.Value); #endregion // Exclui contas a pagar geradas neste pagto geradas = ContasPagarDAO.Instance.GetRenegociadasPagto(session, idPagto); objPersistence.ExecuteCommand(session, "Delete from contas_pagar Where idConta=" + UtilsPlanoConta.GetPlanoConta( UtilsPlanoConta.PlanoContas.PagtoRenegociacao) + " And idPagtoRestante=" + idPagto); // Exclui conta a pagar restante gerada por este pagamento objPersistence.ExecuteCommand(session, "Delete from contas_pagar Where idPagtoRestante=" + idPagto); // Volta situação das contas a pagar para estado inicial pagas = ContasPagarDAO.Instance.GetByPagto(session, idPagto); objPersistence.ExecuteCommand(session, @"UPDATE contas_pagar SET Desconto=0, DataPagto=null, Paga=0, ValorPago=0, Juros=0, Multa=0, IdPagto=IF(IdCheque>0, IdPagtoRestante, NULL), IdChequePagto=null, DestinoPagto=null WHERE IdPagto=" + idPagto); string idsContasPg = "", valoresPg = "", idsChequesPg = ""; foreach (ContasPagar c in pagas) { idsContasPg += c.IdContaPg + ","; valoresPg += c.ValorPago.ToString().Replace(".", "").Replace(",", ".") + ","; } foreach (Cheques c in lstCheques) { idsChequesPg += c.IdCheque + ","; } // Atualiza situação e motivo do cancelamento do pagto objPersistence.ExecuteCommand(session, "Update pagto set situacao=" + (int)Pagto.SituacaoPagto.Cancelado + ", motivoCanc=?motivo, idsContasPg=?idsContasPg, valoresPg=?valoresPg, idsChequesPg=?idsChequesPg Where idPagto=" + idPagto, new GDAParameter("?motivo", motivoCanc.Length > 500 ? motivoCanc.Substring(0, 500) : motivoCanc), new GDAParameter("?idsContasPg", idsContasPg.TrimEnd(',')), new GDAParameter("?valoresPg", valoresPg.TrimEnd(',')), new GDAParameter("?idsChequesPg", idsChequesPg.TrimEnd(','))); var pagtoLog = GetElementByPrimaryKey(session, idPagto); LogCancelamentoDAO.Instance.LogPagto(session, pagto, pagtoLog.MotivoCanc, false); // Corrige o saldo das antecipações de fornecedor utilizadas foreach (var id in lstPagto.Where(x => x.IdAntecipFornec > 0).Select(x => x.IdAntecipFornec.Value)) { lstAntecipFornec.Add(AntecipacaoFornecedorDAO.Instance.GetElementByPrimaryKey(session, id)); decimal cred; var idMov = AntecipacaoFornecedorDAO.Instance.AtualizaSaldo(session, id, out cred).Key; credito += cred; if (idMov > 0) { lstCaixaGeral.Add(idMov.Value); } } }
/// <summary> /// Quita o débito de um funcionário. /// </summary> /// <param name="idFunc"></param> /// <returns></returns> public string Quitar(uint idFunc, decimal[] valores, uint[] formasPagto, uint[] tiposCartao, uint[] parcelasCartao, uint[] contasBanco, uint[] depositoNaoIdentificado, uint[] cartaoNaoIdentificado, uint[] tiposBoleto, decimal[] taxaAntecip, string numAutConstrucard, bool recebimentoParcial, bool gerarCredito, string chequesPagto, string obs) { UtilsFinanceiro.DadosRecebimento retorno = null; try { decimal totalASerPago = Math.Abs(GetSaldo(idFunc)); decimal totalPago = 0; foreach (decimal v in valores) { totalPago += v; } if (!recebimentoParcial && !gerarCredito && totalPago != totalASerPago) { throw new Exception("Total pago (" + totalPago.ToString("C") + ") não confere com o total a ser pago (" + totalASerPago.ToString("C") + ")."); } else if (!recebimentoParcial && gerarCredito && totalPago < totalASerPago) { throw new Exception("Total pago (" + totalPago.ToString("C") + ") não pode ser menor que o total a ser pago (" + totalASerPago.ToString("C") + ")."); } else if (recebimentoParcial && totalPago > totalASerPago) { throw new Exception("Total pago (" + totalPago.ToString("C") + ") não pode ser maior que o total a ser pago (" + totalASerPago.ToString("C") + ")."); } retorno = UtilsFinanceiro.Receber(null, UserInfo.GetUserInfo.IdLoja, null, null, null, null, null, null, null, null, null, null, null, 0, 0, null, null, totalASerPago, totalPago, valores, formasPagto, contasBanco, depositoNaoIdentificado, cartaoNaoIdentificado, tiposCartao, tiposBoleto, taxaAntecip, 0, recebimentoParcial, false, 0, numAutConstrucard, false, parcelasCartao, chequesPagto, false, UtilsFinanceiro.TipoReceb.CreditoValeFuncionario); if (retorno.ex != null) { throw retorno.ex; } // Faz as movimentações de saída do controle de vales for (int i = 0; i < valores.Length; i++) { if (valores[i] > 0 && formasPagto[i] > 0) { uint idConta = UtilsPlanoConta.GetPlanoContaVendaFunc(formasPagto[i], tiposCartao[i]); Movimentar(idFunc, null, null, idConta, 1, valores[i], obs); } } string textoRetorno = "Ok;Débito quitado"; if (totalPago < totalASerPago) { textoRetorno += " parcialmente. Ainda restam " + (totalASerPago - totalPago).ToString("C") + " a serem quitados."; } else { textoRetorno += "."; } return(textoRetorno); } catch (Exception ex) { if (retorno != null) { foreach (Cheques c in retorno.lstChequesInseridos) { ChequesDAO.Instance.Delete(c); } foreach (uint idCxDiario in retorno.idCxDiario) { CaixaDiarioDAO.Instance.DeleteByPrimaryKey(idCxDiario); } foreach (uint idCxGeral in retorno.idCxGeral) { CaixaGeralDAO.Instance.DeleteByPrimaryKey(idCxGeral); } foreach (uint idMovBanco in retorno.idMovBanco) { MovBancoDAO.Instance.DeleteByPrimaryKey(idMovBanco); } foreach (uint idParcCartao in retorno.idParcCartao) { ContasReceberDAO.Instance.DeleteByPrimaryKey(idParcCartao); } } return("Erro;" + Glass.MensagemAlerta.FormatErrorMsg("Falha ao quitar débito.", ex)); } }
/// <summary> /// Faz a devolução de um pagamento. /// </summary> public uint Devolver(uint idCliente, DateTime data, decimal[] valores, uint[] idFormaPagto, uint[] idContaBanco, uint[] depositoNaoIdentificado, uint[] idTipoCartao, uint[] numeroParcelas, uint[] idTipoBoleto, decimal[] taxaAntecip, string chequesPagto, string numAutConstrucard, decimal creditoUtilizado, string obs, bool caixaDiario) { Glass.FilaOperacoes.ReceberDevolucaoPagto.AguardarVez(); using (var transaction = new GDATransaction()) { try { transaction.BeginTransaction(); UtilsFinanceiro.DadosRecebimento retorno = null; decimal totalDevolucao = 0; foreach (decimal v in valores) { totalDevolucao += v; } // Insere o registro da devolução DevolucaoPagto dev = new DevolucaoPagto(); dev.IdCliente = idCliente; dev.Valor = totalDevolucao; dev.Situacao = (int)DevolucaoPagto.SituacaoDevolucao.Aberta; dev.Obs = obs; uint idDevolucaoPagto = Insert(transaction, dev); dev.IdDevolucaoPagto = idDevolucaoPagto; if (idDevolucaoPagto == 0) { throw new Exception("Falha ao inserir devolução de pagamento. Registro 0."); } #region Cheques // Cheques próprios List <Cheques> lstChequesInseridos = new List <Cheques>(); // Guarda os ids dos cheques de terceiros string idsChequeTerc = String.Empty; string idsChequeProp = String.Empty; for (int i = 0; i < idFormaPagto.Length; i++) { // Se a forma de pagamento for cheques próprios cadastra os cheques if ((idFormaPagto[i] == (uint)Glass.Data.Model.Pagto.FormaPagto.ChequeProprio || idFormaPagto[i] == (uint)Glass.Data.Model.Pagto.FormaPagto.ChequeTerceiro) && !String.IsNullOrEmpty(chequesPagto)) { Cheques cheque; // Separa os cheques guardando-os em um vetor string[] vetCheque = chequesPagto.TrimEnd(' ').TrimEnd('|').Split('|'); if (idFormaPagto[i] == (uint)Glass.Data.Model.Pagto.FormaPagto.ChequeProprio) { #region Cadastra os cheques próprios // Para cada cheque próprio informado, cadastra o mesmo, guardando os ids que cada um retorna foreach (string c in vetCheque) { // Divide o cheque para pegar suas propriedades string[] dadosCheque = c.Split('\t'); if (dadosCheque[0] == "proprio") // Se for cheque próprio { // Insere cheque no BD cheque = ChequesDAO.Instance.GetFromString(c); if (cheque.Situacao == (int)Cheques.SituacaoCheque.Compensado) { cheque.DataReceb = data; } cheque.IdDevolucaoPagto = idDevolucaoPagto; cheque.IdCheque = ChequesDAO.Instance.InsertBase(transaction, cheque); if (cheque.IdCheque < 1) { throw new Exception("retorno do insert do cheque=0"); } // Adiciona este cheque à lista de cheques inseridos lstChequesInseridos.Add(cheque); } } #endregion #region Gera Movimentação Bancária // Salva o id de cada cheque próprio utilizado na devolução de pagamento foreach (Cheques c in lstChequesInseridos) { idsChequeProp += c.IdCheque.ToString() + ","; } // Para cada cheque "Compensado" utilizado neste pagamento, debita o valor da conta bancária associada ao mesmo foreach (Cheques c in lstChequesInseridos) { if (c.Situacao == (int)Cheques.SituacaoCheque.Compensado) { ContaBancoDAO.Instance.MovContaDevolucaoPagto(transaction, c.IdContaBanco.Value, UtilsPlanoConta.GetPlanoContaDevolucaoPagto(idFormaPagto[i], 0, 0), (int)UserInfo.GetUserInfo.IdLoja, idDevolucaoPagto, idCliente, 2, c.Valor, data); } } #endregion } // Se a forma de pagamento for cheques de terceiros else if (idFormaPagto[i] == (uint)Glass.Data.Model.Pagto.FormaPagto.ChequeTerceiro) { // Verifica cheque por cheque foreach (string c in vetCheque) { // Divide o cheque para pegar suas propriedades string[] dadosCheque = c.Split('\t'); if (dadosCheque[0] == "terceiro") // Se for cheque de terceiro { // Salva o id do cheque idsChequeTerc += dadosCheque[18] + ","; } } } } } #endregion dev.ValorCreditoAoCriar = ClienteDAO.Instance.GetCredito(transaction, idCliente); dev.Cheques = idsChequeProp + idsChequeTerc.TrimEnd(','); retorno = UtilsFinanceiro.Receber(transaction, UserInfo.GetUserInfo.IdLoja, null, null, null, null, null, null, null, null, null, null, null, idCliente, idDevolucaoPagto, null, data.ToString(), totalDevolucao, totalDevolucao, valores, idFormaPagto, idContaBanco, depositoNaoIdentificado, new uint[] { }, idTipoCartao, idTipoCartao, taxaAntecip, 0, false, false, creditoUtilizado, numAutConstrucard, caixaDiario, numeroParcelas, String.Concat(idsChequeTerc.TrimEnd(',')), false, UtilsFinanceiro.TipoReceb.DevolucaoPagto); if (retorno.ex != null) { throw retorno.ex; } dev.CreditoGeradoCriar = retorno.creditoGerado; dev.CreditoUtilizadoCriar = creditoUtilizado; Update(transaction, dev); transaction.Commit(); transaction.Close(); return(idDevolucaoPagto); } catch (Exception ex) { transaction.Rollback(); transaction.Close(); throw new Exception(Glass.MensagemAlerta.FormatErrorMsg("Falha ao efetuar a devolução de pagamento.", ex)); } finally { Glass.FilaOperacoes.ReceberDevolucaoPagto.ProximoFila(); } } }