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