Ejemplo n.º 1
0
        /// <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());
            }
        }
Ejemplo n.º 2
0
        /// <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));
        }
Ejemplo n.º 3
0
 /// <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);
 }
Ejemplo n.º 4
0
        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;
                    }
                }
            }
        }
Ejemplo n.º 5
0
        /// <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;
                }
            }
        }