Example #1
0
 /// <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));
 }
Example #2
0
        /// <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();
                }
            }
        }
Example #3
0
        /// <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));
                    }
                }
            }
        }
Example #4
0
        /// <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);
                }
            }
        }
Example #5
0
        /// <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));
            }
        }
Example #6
0
        /// <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();
                }
            }
        }