Esempio n. 1
0
        private EstruturaCancelamento CarregarEstruturaCancelamento(CancelamentoLoteModel cancelLoteModel, DbTransaction dbtrans, CTLib.BD bd)
        {
            CancelamentoLoteDadosCancelamento cancelLoteDados = ado.CarregarDadosVendaCancelamento(cancelLoteModel.IngressosID, dbtrans);
            CancelamentoLoteValoresPendentes  cancelValores;
            Troca troca = new Troca();

            //Pendentes
            if (cancelLoteModel.TemDevolucao)
            {
                cancelValores = ado.CarregarValoresDadosPendentes(cancelLoteModel.IngressosID, dbtrans);

                if (!cancelLoteModel.EstornarEntrega)
                {
                    cancelValores.EntregaValor = 0;
                }
                if (!cancelLoteModel.EstornarSeguro)
                {
                    cancelValores.SeguroValor = 0;
                }
                if (!cancelLoteModel.EstornarConveniencia)
                {
                    cancelValores.ConvenienciaValor = 0;
                }
            }
            else
            {
                var dados = troca.CalculaValoresTrocaIngresso(cancelLoteModel.IngressosID, cancelLoteDados.VendaBilheteriaIDVenda, bd).AsEnumerable();
                cancelValores = new CancelamentoLoteValoresPendentes();
                cancelValores.EntregaValor      = dados.Select(x => x.Field <decimal>("ValorEntrega")).FirstOrDefault();
                cancelValores.SeguroValor       = dados.Select(x => x.Field <decimal>("ValorSeguro")).FirstOrDefault();
                cancelValores.ConvenienciaValor = dados.Sum(x => x.Field <decimal>("ValorConveniencia"));
                cancelValores.IngressoValor     = dados.Sum(x => x.Field <decimal>("ValorIngressos"));
            }
            DataSet dadosItensEIngressosVendidos = troca.MontaDadosItensEIngressosVendidosTrocaCredito(cancelLoteModel.IngressosID, bd);

            EstruturaCancelamento estruturaCancelamento = new EstruturaCancelamento
            {
                CaixaID                    = cancelLoteModel.CaixaID,
                LojaID                     = cancelLoteModel.LojaID,
                CanalID                    = cancelLoteModel.CanalID,
                UsuarioID                  = cancelLoteModel.UsuarioID,
                EmpresaID                  = cancelLoteModel.EmpresaID,
                ClienteID                  = cancelLoteDados.ClienteID,
                ValorEntregaEstornado      = cancelValores.EntregaValor,
                EntregaControleID          = cancelLoteModel.EstornarEntrega ? cancelLoteDados.EntregaControleID : 0,
                EntregaAgendaID            = cancelLoteModel.EstornarEntrega ? cancelLoteDados.EntregaAgendaID : 0,
                SenhaVenda                 = cancelLoteDados.SenhaVenda,
                ValorConvenienciaEstornada = cancelValores.ConvenienciaValor,
                ValorIngressosEstornado    = cancelValores.IngressoValor,
                ValorSeguroEstornado       = cancelValores.SeguroValor,

                ValorConvenienciaTotal = cancelLoteDados.ValorConvenienciaTotal,
                ValorEntregaTotal      = cancelLoteDados.ValorEntregaTotal,
                ValorIngressosTotal    = cancelLoteDados.ValorIngressosTotal,
                ValorSeguroTotal       = cancelLoteDados.ValorSeguroTotal,

                TipoCancelamento       = cancelLoteModel.TipoCancelamento,
                CancelamentoFraude     = cancelLoteDados.Fraude,
                VendaBilheteriaIDVenda = cancelLoteDados.VendaBilheteriaIDVenda,
                TemDevolucao           = cancelLoteModel.TemDevolucao,
                EhCanalPresente        = !(cancelLoteModel.TemDevolucao),
                SupervisorID           = cancelLoteModel.SupervisorID,
                LocalID                = cancelLoteModel.LocalID,
                MotivoCancelamento     = cancelLoteModel.MotivoCancelamento,
                SubMotivoCancelamento  = cancelLoteModel.SubMotivoCancelamento,
                DadosItensVendidos     = dadosItensEIngressosVendidos.Tables["Grid"],
                DadosIngressosVendidos = dadosItensEIngressosVendidos.Tables["Reserva"],
                FormaDevolucao         = cancelLoteModel.FormaDevolucao,
                DadosEstornoCC         = cancelLoteModel.dadosCartaoCredito,
                DadosDeposito          = cancelLoteModel.dadosBancarios
            };

            return(estruturaCancelamento);
        }
Esempio n. 2
0
        public void ExecutaCancelamentoAutomatico(enumOperacoesCancelamento Operacao, tCancelamentoLoteFila item, int caixaID, int empresaID, int localID, int usuarioID)
        {
            IngressoBO iBO = new IngressoBO();

            CTLib.BD              db                    = new CTLib.BD();
            DbTransaction         dbtrans               = null;
            List <int>            lstIngressosIDs       = null;
            List <tIngresso>      lstIngressos          = null;
            CancelamentoIngressos cancelamento          = new CancelamentoIngressos();
            EstruturaCancelamento dadosCancelamento     = null;
            CancelamentoLoteModel cancelamentoLoteModel = new CancelamentoLoteModel();

            try
            {
                #region Inicia Transação DB
                db.Cnn  = ado.con.conIngresso;
                dbtrans = ado.con.conIngresso.BeginTransaction();
                db.DefinnirEmTransacao(true, dbtrans);

                #endregion

                lstIngressosIDs = item.Ingressos.Select(x => x.IngressoID).ToList();
                lstIngressos    = iBO.Listar(lstIngressosIDs);

                #region Resolução de pendencias
                if (ado.TemCancelamentoPendente(dbtrans, item.VendaBilheteriaID, lstIngressos))
                {
                    List <int> cancelados = new List <int>();
                    List <CancelamentoLoteIngressoPendenteDados> lstIngressosParaPendencia = new List <CancelamentoLoteIngressoPendenteDados>();

                    //Pegar lista de Ingresso pendentes
                    List <CancelamentoLoteIngressoPendente> lstIngressosPendentes = ado.ListarIngressosCancelamentoPendente(dbtrans, item.VendaBilheteriaID, lstIngressos);

                    //Executa cancelamento das pendencias
                    foreach (CancelamentoLoteIngressoPendente pendente in lstIngressosPendentes)
                    {
                        if (!cancelados.Contains(pendente.PendenciaID))
                        {
                            dadosCancelamento = cancelamento.CarregaDadosCancelamento(pendente.PendenciaID);
                            cancelados.Add(pendente.PendenciaID);

                            //TODO: validar dados da Devolucao
                            dadosCancelamento.CaixaIDDevolucao   = caixaID;
                            dadosCancelamento.CanalIDDevolucao   = item.CanalID;
                            dadosCancelamento.EmpresaIDDevolucao = empresaID;
                            dadosCancelamento.LocalIDDevolucao   = localID;
                            dadosCancelamento.LojaIDDevolucao    = item.LojaID;
                            dadosCancelamento.UsuarioIDDevolucao = usuarioID;

                            //Cancela a solicitação pendente
                            cancelamento.CancelarSolicitacao(dadosCancelamento, pendente.PendenciaID, db);
                        }

                        //Se o ingresso pendente nao esta na lista de ingressos para cancelar,
                        //este deve ser colocado em pendente novamente
                        if (!lstIngressosIDs.Contains(pendente.IngressoID))
                        {
                            lstIngressosParaPendencia.Add(new CancelamentoLoteIngressoPendenteDados()
                            {
                                IngressoID        = pendente.IngressoID,
                                PendenciaID       = pendente.PendenciaID,
                                DadosCancelamento = dadosCancelamento
                            });
                        }
                    }

                    //percorre lista de ingressos que devem ficar com cancelamento pendente
                    foreach (int pendeteID in lstIngressosParaPendencia.Select(p => p.PendenciaID).Distinct().ToList())
                    {
                        CancelamentoLoteIngressoPendenteDados pend = lstIngressosParaPendencia.Where(p => p.PendenciaID == pendeteID).FirstOrDefault();

                        #region Carrega a estrutura de cancelamento dos ingressos
                        //TODO: validar dados da Devolucao
                        cancelamentoLoteModel.CaixaID   = caixaID;
                        cancelamentoLoteModel.LojaID    = item.LojaID;
                        cancelamentoLoteModel.LocalID   = localID;
                        cancelamentoLoteModel.CanalID   = item.CanalID;
                        cancelamentoLoteModel.EmpresaID = empresaID;

                        cancelamentoLoteModel.EstornarConveniencia = pend.DadosCancelamento.ValorConvenienciaEstornada > 0;
                        cancelamentoLoteModel.EstornarEntrega      = pend.DadosCancelamento.ValorEntregaEstornado > 0;
                        cancelamentoLoteModel.EstornarSeguro       = pend.DadosCancelamento.ValorSeguroEstornado > 0;

                        cancelamentoLoteModel.TemDevolucao = true;

                        cancelamentoLoteModel.MotivoCancelamento    = pend.DadosCancelamento.MotivoCancelamento;
                        cancelamentoLoteModel.SubMotivoCancelamento = pend.DadosCancelamento.SubMotivoCancelamento;

                        cancelamentoLoteModel.UsuarioID    = usuarioID;
                        cancelamentoLoteModel.SupervisorID = usuarioID;

                        cancelamentoLoteModel.TipoCancelamento = pend.DadosCancelamento.TipoCancelamento;
                        cancelamentoLoteModel.FormaDevolucao   = pend.DadosCancelamento.FormaDevolucao;

                        cancelamentoLoteModel.dadosBancarios     = pend.DadosCancelamento.DadosDeposito;
                        cancelamentoLoteModel.dadosCartaoCredito = pend.DadosCancelamento.DadosEstornoCC;

                        cancelamentoLoteModel.IngressosID = lstIngressosParaPendencia.Where(p => p.PendenciaID == pendeteID).Select(p => p.IngressoID).ToList();
                        #endregion

                        //Carrega a estrutura de cancelamento dos ingressos
                        pend.DadosCancelamento = CarregarEstruturaCancelamento(cancelamentoLoteModel, dbtrans, db);

                        //Efetua a solicitação do Cancelamento
                        cancelamento.SolicitarCancelamento(pend.DadosCancelamento, db);
                    }
                }
                #endregion

                #region Carrega a estrutura de cancelamento dos ingressos
                //TODO: validar dados da Devolucao
                cancelamentoLoteModel.CaixaID   = caixaID;
                cancelamentoLoteModel.LojaID    = item.LojaID;
                cancelamentoLoteModel.LocalID   = localID;
                cancelamentoLoteModel.CanalID   = item.CanalID;
                cancelamentoLoteModel.EmpresaID = empresaID;

                cancelamentoLoteModel.EstornarConveniencia = true;
                cancelamentoLoteModel.EstornarEntrega      = ado.EstornarEntrega(dbtrans, item.VendaBilheteriaID, item.Ingressos.Count);
                cancelamentoLoteModel.EstornarSeguro       = true;

                cancelamentoLoteModel.TemDevolucao = false;

                cancelamentoLoteModel.MotivoCancelamento    = CancelEventoCancelado;
                cancelamentoLoteModel.SubMotivoCancelamento = 0;

                cancelamentoLoteModel.UsuarioID    = usuarioID;
                cancelamentoLoteModel.SupervisorID = usuarioID;

                cancelamentoLoteModel.TipoCancelamento = EstruturaCancelamento.enuTipoCancelamento.Normal;
                cancelamentoLoteModel.FormaDevolucao   = Operacao == enumOperacoesCancelamento.OperacaoE ?
                                                         EstruturaCancelamento.enuFormaDevolucao.PayPal :
                                                         EstruturaCancelamento.enuFormaDevolucao.EstornoCC;

                cancelamentoLoteModel.dadosBancarios = null;

                CancelamentoLoteDadosCliente cliente = ado.CarregarDadosCliente(dbtrans, item.VendaBilheteriaID);
                if (Operacao == enumOperacoesCancelamento.OperacaoE)
                {
                    cancelamentoLoteModel.dadosCartaoCredito = new EstruturaCancelamento.EstruturaDevolucaoEstornoCC()
                    {
                        Bandeira      = "Paypal",
                        Email         = cliente.Email,
                        NumeroCartao  = "Paypal",
                        TitularCartao = cliente.Nome,
                        TitularCPF    = cliente.CPF
                    };
                }
                else
                {
                    cancelamentoLoteModel.dadosCartaoCredito = new EstruturaCancelamento.EstruturaDevolucaoEstornoCC()
                    {
                        Bandeira      = cliente.Bandeira,
                        Email         = cliente.Email,
                        NumeroCartao  = cliente.Cartao,
                        TitularCartao = cliente.Nome,
                        TitularCPF    = cliente.CPF
                    };
                }

                cancelamentoLoteModel.IngressosID = lstIngressosIDs;
                #endregion

                //Carrega a estrutura de cancelamento dos ingressos
                dadosCancelamento = CarregarEstruturaCancelamento(cancelamentoLoteModel, dbtrans, db);

                if (Operacao == enumOperacoesCancelamento.OperacaoE)
                {
                    #region Executa estorno Paypal
                    IRLib.PayPal.CancelaPayPal          paypal = new IRLib.PayPal.CancelaPayPal();
                    IRLib.VendaBilheteriaFormaPagamento vbfp   = new IRLib.VendaBilheteriaFormaPagamento();

                    vbfp.LerPorVendaBilheteriaID(db, item.VendaBilheteriaID);
                    if (vbfp.Valor.Valor == dadosCancelamento.ValorEstornoTotal)
                    {
                        if (paypal.RefundPayPal(vbfp.TransactionID.Valor))
                        {
                            dadosCancelamento.EstornoEfetuado = true;
                        }
                        else
                        {
                            throw new Exception("Falha ao executar estorno com PayPal.");
                        }
                    }
                    else
                    {
                        if (paypal.RefundPartial(vbfp.TransactionID.Valor, dadosCancelamento.ValorEstornoTotal))
                        {
                            dadosCancelamento.EstornoEfetuado = true;
                        }
                        else
                        {
                            throw new Exception("Falha ao executar estorno parcial com PayPal.");
                        }
                    }
                    #endregion
                }

                //Efetua a solicitação do Cancelamento
                cancelamento.SolicitarCancelamento(dadosCancelamento, db);

                dbtrans.Commit();
            }
            catch (Exception ex)
            {
                if (dbtrans != null)
                {
                    dbtrans.Rollback();
                }

                throw ex;
            }
            finally
            {
                db.DefinnirEmTransacao(false);
            }
        }