public DataTable listaLotePorApresentacaoSetor(int apresentacaoSetorID, string registroZero, Lote lote = null, bool desvinculados = false) { try { DataTable tabela = new DataTable("Lote"); tabela.Columns.Add("ID", typeof(int)); tabela.Columns.Add("Nome", typeof(string)); tabela.Columns.Add("Status", typeof(string)); using (CTLib.BD bd = new CTLib.BD()) { string sql = String.Format(@"SELECT ID, Nome, Status FROM tLote l1 (NOLOCK) WHERE l1.ApresentacaoSetorID = {0} AND STATUS <> 'E'", apresentacaoSetorID); if (lote != null && lote.Control.ID > 0) { sql += String.Format(" OR l1.ID = {0}", lote.Control.ID); } if (desvinculados) { if (lote != null && lote.Control.ID > 0) { sql += String.Format(" AND l1.ID NOT IN (SELECT l2.LoteAnterior FROM tLote l2 WHERE l2.LoteAnterior IS NOT NULL AND l1.LoteAnterior = {0})", lote.Control.ID); } else { sql += " AND l1.ID NOT IN (SELECT l2.LoteAnterior FROM tLote l2 WHERE l2.LoteAnterior IS NOT NULL)"; } } bd.Consulta(sql); if (registroZero != null) { tabela.Rows.Add(new Object[] { 0, registroZero }); } while (bd.Consulta().Read()) { DataRow linha = tabela.NewRow(); linha["ID"] = bd.LerInt("ID"); linha["Nome"] = bd.LerString("Nome"); linha["Status"] = bd.LerString("Status"); tabela.Rows.Add(linha); } } return(tabela); } catch (Exception ex) { throw ex; } }
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); }
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); } }