public ConsultaAdiantamentoResponse ConsultarAdiantamento(ConsultaAdiantamentoRequest request) { string debug = "001"; Logger.LogDetail("Método ConsultarAdiantamento() - In"); try { ConsultaAdiantamentoResponse response = new ConsultaAdiantamentoResponse(); debug = "002"; #region [ Validação dos filtros ] Logger.LogDetail(string.Format("Request: {0}", CBUtils.ToXml(request))); debug = "003"; response.Excecoes = new List <string>(); if ((request.DataInicial == null) || (request.DataInicial == DateTime.MinValue)) { response.Excecoes.Add("Data inicial é obrigatório!"); } if ((request.DataFinal == null) || (request.DataFinal == DateTime.MinValue)) { response.Excecoes.Add("Data final é obrigatório!"); } if ((request.DataInicial != null) && (request.DataFinal != null)) { if (request.DataInicial > request.DataFinal) { response.Excecoes.Add("Data inicial não pode ser maior que data final!"); } TimeSpan ts = request.DataFinal.Subtract(request.DataInicial); if (ts.Days > 180) { response.Excecoes.Add("Período máximo de pesquisa permitido é de 180 dias!"); } } Logger.LogDetail(string.Format("Exceções request: {0}", response.Excecoes.toString2())); #endregion [ Validação dos filtros ] debug = "004"; if (response.Excecoes.Count == 0) { // LER HOTEIS E AEREOS // MONTAR A BASE DE VIAGENS // LER VIAGEM A VIAGEM // LER INFORMAÇÕES QUE ENTREM NAS MESMAS DATAS PARA OS MESMOS VIAJEIROS // MONTAR O WEBSERVICE Query query = new Query(@" DECLARE @DATAINICIO AS DATE SET @DATAINICIO = :PDATAINICIAL DECLARE @DATAFINAL AS DATE SET @DATAFINAL = :PDATAFINAL DECLARE @SITUACOES TABLE(HANDLE int, SITUACAO varchar(15)) INSERT INTO @SITUACOES (HANDLE, SITUACAO) values (1, 'Ativo'), (2, 'Cancelado') DECLARE @PRODUTOS TABLE(HANDLE int, PRODUTO varchar(15)) INSERT INTO @PRODUTOS (HANDLE, PRODUTO) values (1, 'Aéreo'), (2, 'Hotel'), (3, 'Carro'), (4, 'Miscelaneo'), (5, 'Aéreo'), (6, 'Aéreo'), (7, 'Aéreo'), (8, 'Rodoviário') DECLARE @TIPOSEMISSAO TABLE(HANDLE varchar(1), TIPOEMISSAO varchar(15)) INSERT INTO @TIPOSEMISSAO (HANDLE, TIPOEMISSAO) values ('A', 'Ativo'), ('E', 'Externa'), ('M', 'Manual') DECLARE @TIPOSVOO TABLE(HANDLE varchar(1), TIPOVOO varchar(15)) INSERT INTO @TIPOSVOO (HANDLE, TIPOVOO) values ('D', 'Doméstico'), ('F', 'Internacional'), ('T', 'Regional') DECLARE @FORMASPAGAMENTO TABLE(HANDLE int, FORMAPAGAMENTO varchar(20)) INSERT INTO @FORMASPAGAMENTO (HANDLE, FORMAPAGAMENTO) values (1, 'Cartão'), (2, 'Invoice'), (3, 'Outras'), (4, 'GR'), (5, 'Múltiplos pagamentos') DECLARE @FORMASRECEBIMENTO TABLE(HANDLE int, FORMARECEBIMENTO varchar(30)) INSERT INTO @FORMASRECEBIMENTO (HANDLE, FORMARECEBIMENTO) values (1, 'Cash'), (3, 'Faturado'), (5, 'Cheque'), (6, 'Pagamento direto'), (7, 'Cartão'), (9, 'Cartão convênio'), (10, 'Sem adicional'), (11, 'Cartão AMEX'), (12, 'Governo'), (13, 'Cheque pré-datado'), (14, 'As financiadas por terceiros'), (15, 'Múltiplos recebimentos'), (16, 'Despesas internas'), (17, 'TKT'), (18, 'MCO') USE TURISMOPRD SELECT -- CENTRO DE CUSTO CLI_CC.CENTROCUSTO AS CC_CLIENTE, CONVERT(VARCHAR(50), CLI.NOME) AS CLIENTE, -- VIAJANTES -- VIAJANTE CASE A.TIPOPASSAGEIRO WHEN 1 THEN CONVERT(VARCHAR(50), A.PASSAGEIRONAOCAD) WHEN 2 THEN CONVERT(VARCHAR(50), PAX.NOME) END AS PASSAGEIRO, ISNULL(PAX.CGCCPF, 'Não cadastrado') AS CPF, -- VIAGENS -- VIAGEM ISNULL(A.TRECHOS, ISNULL(ISNULL(TRE.BB_AEREO_DESTINO, DES_MUN.SIGLA), '')) AS TRECHOS, -- ORIGEM CONVERT(DATETIME, ISNULL(TRE.BB_AEREO_DATA_VOO, ISNULL(A.BB_MISC_ENTRADA, ISNULL(A.BB_CARRO_RETIRADA, A.BB_HOTEL_ENTRADA))) + ' ' + ISNULL(TRE.BB_AEREO_HRSAIDA, '00:00:00')) AS DATA_ORIGEM, ISNULL(TRE.BB_AEREO_ORIGEM, '') AS AEREO_ORIGEM, ISNULL(ORI_MUN.NOME, '') AS MUNICIPIO_ORIGEM, ISNULL(CASE ORI_PAIS.NOME WHEN 'Brasil' THEN ORI_EST.NOME ELSE NULL END, '') AS ESTADO_ORIGEM, ISNULL(CASE ORI_PAIS.NOME WHEN 'Brasil' THEN ORI_REG.NOME ELSE NULL END, '') AS REGIAO_ORIGEM, ISNULL(ORI_PAIS.NOME, '') AS PAIS_ORIGEM, ISNULL(CASE ORI_PAIS.NOME WHEN 'Brasil' THEN 'América Do Sul' ELSE ORI_REG.NOME END, '') AS CONTINENTE_ORIGEM, -- DESTINO CONVERT(DATETIME, ISNULL((CASE WHEN CONVERT(DATETIME, TRE.BB_AEREO_DATA_VOO + TRE.BB_AEREO_HRSAIDA) > CONVERT(DATETIME, TRE.BB_AEREO_DATA_VOO + TRE.BB_AEREO_HRCHEGADA) THEN DATEADD(DAY, 1, TRE.BB_AEREO_DATA_VOO) ELSE TRE.BB_AEREO_DATA_VOO END), ISNULL(A.BB_MISC_SAIDA, ISNULL(A.BB_CARRO_ENTREGA, A.BB_HOTEL_SAIDA))) + ' ' + ISNULL(TRE.BB_AEREO_HRSAIDA, '')) AS DATA_DESTINO, ISNULL(ISNULL(TRE.BB_AEREO_DESTINO, DES_MUN.SIGLA), '') AS AEREO_DESTINO, ISNULL(DES_MUN.NOME, '') AS MUNICIPIO_DESTINO, ISNULL(CASE DES_PAIS.NOME WHEN 'Brasil' THEN DES_EST.NOME ELSE NULL END, '') AS ESTADO_DESTINO, ISNULL(CASE DES_PAIS.NOME WHEN 'Brasil' THEN DES_REG.NOME ELSE NULL END, '') AS REGIAO_DESTINO, ISNULL(DES_PAIS.NOME, '') AS PAIS_DESTINO, ISNULL(CASE DES_PAIS.NOME WHEN 'Brasil' THEN 'América Do Sul' ELSE DES_REG.NOME END, '') AS CONTINENTE_DESTINO, -- RESERVAS -- RESERVA CASE A.PRODUTO WHEN 4 THEN TIPMIS.NOME ELSE PRO.PRODUTO END AS PRODUTO, ISNULL(TVOO.TIPOVOO, '') AS TIPO, PNR.BB_RLOC AS RLOC, PNR.LOCALIZADORACIA AS LOC, ISNULL(A.BILHETE, '') AS BILHETE, ISNULL(A.CONFIRMACAO, '') AS CONFIRMACAO, CONVERT(DATE, A.DATAEMISSAO) AS DATAEMISSAO, AGE.NOME AS EMISSOR_NOME, A.INFAPROVADOR AS APROVADOR, ISNULL(CONS.NOME, '') AS CONSOLIDADORA, CONVERT(VARCHAR(50), FORN.NOME) AS FORNECEDOR FROM BB_PNRACCOUNTINGS A INNER JOIN BB_PNRS PNR ON PNR.HANDLE = A.RLOC INNER JOIN GN_PESSOAS CLI ON CLI.HANDLE = A.BB_CLIENTE LEFT JOIN BB_CLIENTECC AS CLI_CC ON A.CENTRODECUSTO = CLI_CC.HANDLE LEFT OUTER JOIN GN_GRUPOSEMPRESARIAIS GP ON GP.HANDLE = CLI.GRUPOEMPRESARIAL LEFT OUTER JOIN GN_PESSOAS GPP ON GPP.HANDLE = GP.PESSOA INNER JOIN GN_PESSOAS FORN ON FORN.HANDLE = A.FORNECEDOR LEFT JOIN GN_PESSOAS AS CONS ON A.CONSOLIDADOR = CONS.HANDLE LEFT JOIN @SITUACOES AS SIT ON SIT.HANDLE = A.SITUACAO LEFT JOIN BB_AGENTES AS AGE ON A.AGENTE_EMISSAO = AGE.HANDLE LEFT JOIN @PRODUTOS AS PRO ON PRO.HANDLE = A.PRODUTO LEFT JOIN BB_TIPOMISCELANIO AS TIPMIS ON A.TIPOMISCELANIO = TIPMIS.HANDLE LEFT JOIN @TIPOSEMISSAO AS TEMI ON TEMI.HANDLE = A.TIPODEEMISSAO LEFT JOIN @TIPOSVOO AS TVOO ON TVOO.HANDLE = A.TIPOVOO LEFT JOIN GN_PESSOAS AS PAX ON A.VIAJANTE = PAX.HANDLE LEFT JOIN BB_TRECHOACCOUNTING TRE_A ON A.HANDLE = TRE_A.ACCOUNTING LEFT JOIN BB_PNRTRECHOS AS TRE ON TRE.HANDLE = TRE_A.TRECHO LEFT JOIN BB_AEROPORTOS AS DES_AERO ON DES_AERO.AEROPORTO = TRE.BB_AEREO_DESTINO LEFT JOIN MUNICIPIOS AS DES_MUN ON (PRO.PRODUTO = 'Aéreo' AND DES_MUN.HANDLE = DES_AERO.CIDADE) OR (PRO.PRODUTO <> 'Aéreo' AND DES_MUN.HANDLE = FORN.MUNICIPIO) LEFT JOIN ESTADOS DES_EST ON DES_EST.HANDLE = DES_MUN.ESTADO LEFT JOIN PAISES DES_PAIS ON DES_PAIS.HANDLE = DES_MUN.PAIS LEFT JOIN K_REGIOES DES_REG ON DES_REG.HANDLE = DES_PAIS.K_CONTINENTE OR DES_REG.HANDLE = DES_EST.K_REGIAO LEFT JOIN BB_AEROPORTOS AS ORI_AERO ON ORI_AERO.AEROPORTO = TRE.BB_AEREO_ORIGEM LEFT JOIN MUNICIPIOS AS ORI_MUN ON ORI_MUN.HANDLE = ORI_AERO.CIDADE LEFT JOIN ESTADOS ORI_EST ON ORI_EST.HANDLE = ORI_MUN.ESTADO LEFT JOIN PAISES ORI_PAIS ON ORI_PAIS.HANDLE = ORI_MUN.PAIS LEFT JOIN K_REGIOES ORI_REG ON ORI_REG.HANDLE = ORI_PAIS.K_CONTINENTE OR ORI_REG.HANDLE = ORI_EST.K_REGIAO LEFT JOIN @FORMASPAGAMENTO AS FPAG ON FPAG.HANDLE = A.FORMADEPAGAMENTO LEFT JOIN @FORMASRECEBIMENTO AS FREC ON FREC.HANDLE = A.FORMARECEBIMENTO LEFT JOIN BB_MAQUINAS AS PCCAGE ON A.PCC_EMISSAO = PCCAGE.HANDLE LEFT JOIN BB_CCPROJETOACC AS CCPROJ ON A.HANDLE = CCPROJ.ACCOUNTING LEFT JOIN CT_CC AS CC ON CCPROJ.CCSUGERIDO = CC.HANDLE WHERE CONVERT(DATETIME, ISNULL(TRE.BB_AEREO_DATA_VOO, ISNULL(A.BB_MISC_ENTRADA, ISNULL(A.BB_CARRO_RETIRADA, A.BB_HOTEL_ENTRADA))) + ' ' + ISNULL(TRE.BB_AEREO_HRSAIDA, '00:00:00')) <= @DATAFINAL AND CONVERT(DATETIME, ISNULL((CASE WHEN CONVERT(DATETIME, TRE.BB_AEREO_DATA_VOO + TRE.BB_AEREO_HRSAIDA) > CONVERT(DATETIME, TRE.BB_AEREO_DATA_VOO + TRE.BB_AEREO_HRCHEGADA) THEN DATEADD(DAY, 1, TRE.BB_AEREO_DATA_VOO) ELSE TRE.BB_AEREO_DATA_VOO END), ISNULL(A.BB_MISC_SAIDA, ISNULL(A.BB_CARRO_ENTREGA, A.BB_HOTEL_SAIDA))) + ' ' + ISNULL(TRE.BB_AEREO_HRSAIDA, '')) >= @DATAINICIO AND ((A.BB_CLIENTE IN ( SELECT PES.HANDLE FROM GN_PESSOAS PES WHERE PES.GRUPOEMPRESARIAL IN ( SELECT PESSOA FROM BB_USUARIOPESSOAS WHERE USUARIO = @USUARIO AND GRUPOEMPRESARIAL = 'S')) OR A.BB_CLIENTE IN ( SELECT PESSOA FROM BB_USUARIOPESSOAS WHERE USUARIO = @USUARIO))) AND A.SITUACAO = 1 AND PNR.REEMISSAO = 'N' AND PRO.PRODUTO IN ('Aéreo', 'Hotel') ORDER BY CC_CLIENTE, PASSAGEIRO, DATA_ORIGEM" ); query.Parameters.Add(new Parameter("PDATAINICIAL", DataType.DateTime, request.DataInicial)); query.Parameters.Add(new Parameter("PDATAFINAL", DataType.DateTime, request.DataFinal)); debug = "005"; Logger.LogDetail(string.Format("Comando utilizado para consulta de viagens: {0}", query.CommandText)); Entities <EntityBase> dados = query.Execute(); if (dados.Count == 0) { response.Excecoes.Add("Nenhuma viagem encontrada com o filtro informado!"); } else { debug = "006"; Reserva Reserva; Viagem Viagem; Viajante Viajante; CentroCusto CentroCusto; Reserva = new Reserva(); Viagem = new Viagem(); Viajante = new Viajante(); Viajante.Viagens = new List <Viagem>(); CentroCusto = new CentroCusto(); CentroCusto.Viajantes = new List <Viajante>(); response.CentrosCusto = new List <CentroCusto>(); Viagem.Origem = new Local(); Viagem.Destino = new Local(); Viagem.Reservas = new List <Reserva>(); Reserva.Origem = new Local(); Reserva.Destino = new Local(); debug = "006-3"; foreach (EntityBase item in dados) { Reserva.Produto = item["PRODUTO"].Value.toString2(); Reserva.Tipo = item["TIPO"].Value.toString2(); Reserva.CodigoCasablanca = item["RLOC"].Value.toString2().ToUpper(); Reserva.Loc = item["LOC"].Value.toString2().ToUpper(); Reserva.Bilhete = item["BILHETE"].Value.toString2(); Reserva.Confirmacao = item["CONFIRMACAO"].Value.toString2(); Reserva.DataEmissao = item["DATAEMISSAO"].Value.toDataTime(); Reserva.Emissor = item["EMISSOR_NOME"].Value.toString2(); Reserva.Aprovador = item["APROVADOR"].Value.toString2(); Reserva.Consolidador = item["CONSOLIDADORA"].Value.toString2(); Reserva.Fornecedor = item["FORNECEDOR"].Value.toString2(); Reserva.Origem.DataHora = item["DATA_ORIGEM"].Value.toDataTime(); Reserva.Origem.Aeroporto = item["AEREO_ORIGEM"].Value.toString2(); Reserva.Origem.Municipio = item["MUNICIPIO_ORIGEM"].Value.toString2(); Reserva.Origem.Estado = item["ESTADO_ORIGEM"].Value.toString2(); Reserva.Origem.Regiao = item["REGIAO_ORIGEM"].Value.toString2(); Reserva.Origem.Pais = item["PAIS_ORIGEM"].Value.toString2(); Reserva.Origem.Continente = item["CONTINENTE_ORIGEM"].Value.toString2(); Reserva.Destino.DataHora = item["DATA_DESTINO"].Value.toDataTime(); Reserva.Destino.Aeroporto = item["AEREO_DESTINO"].Value.toString2(); Reserva.Destino.Municipio = item["MUNICIPIO_DESTINO"].Value.toString2(); Reserva.Destino.Estado = item["ESTADO_DESTINO"].Value.toString2(); Reserva.Destino.Regiao = item["REGIAO_DESTINO"].Value.toString2(); Reserva.Destino.Pais = item["PAIS_DESTINO"].Value.toString2(); Reserva.Destino.Continente = item["CONTINENTE_DESTINO"].Value.toString2(); debug = "006-3c"; Viagem.Reservas.Add(Reserva); debug = "006-3d"; Viajante.Viagens.Add(Viagem); debug = "006-3e"; CentroCusto.Viajantes.Add(Viajante); debug = "006-3f"; response.CentrosCusto.Add(CentroCusto); debug = "009b"; } } } /* * // VARIAVES DE COMPARAÇÃO * // string last_rloc = null; * // int last_rloc_pos = 0; * string last_CC = null; * string last_viajante = null; // No futuro será o CPF - * // string last_origem = null; * // bool tem_hotel = false; * DateTime null_data = new System.DateTime(2000, 1, 1, 0, 0, 0); // Isto vai ser equivalente a datetime nula * DateTime first_data = null_data; // Aquí é para gerar uma variavel datetime nula * DateTime last_data = null_data; // Aquí é para gerar uma variavel datetime nula * * // CONFERIR SE É HOTEL. * // SE É, MARCAR O DESTINO CONFERIR AS RESERVAS ANTERIORES * // ONDE ENCONTRAR O MESMO DESTINO ADICIONAR NAS RESERVAS. * // ONDE FOR AVIÃO, PEGAR O RLOC * // ONDE FOR AVIÃO OU COM O MESMO RLOC, ADICIONAR NAS RESERVAS * // COLOCAR INICIO DA VIAGEM NO PRIMEIRO ORIGEM * // COLOCAR AS DIARIAS A DIFERENCIA ENTRE O PRIMEIRO ORIGEM E O ÚLTIMO DESTINO * // Tem que ser tempo tudo o mesmo viajante e o mesmo centro de custo * //------------------------------------------------------------------------------ * debug = "007"; * * response.CentrosCusto = new List<CentroCusto>(); * Adiantamento = new ConsultaAdiantamentoResponse(); * * CentroCusto = new CentroCusto(); * CentroCusto.Viajantes = new List<Viajante>(); * * Viajante = new Viajante(); * Viajante.Viagens = new List<Viagem>(); * * Viagem = new Viagem(); * Viagem.Origem = new Endereco(); * Viagem.Destino = new Endereco(); * Viagem.Reservas = new List<Reserva>(); * * Reserva = new Reserva(); * Reserva.Origem = new Endereco(); * Reserva.Destino = new Endereco(); * * foreach (EntityBase item in dados) * { * debug = "008"; * Reserva.CodigoCasablanca = item["RLOC"].Value.toString2().ToUpper(); * Reserva.Loc = item["LOC"].Value.toString2().ToUpper(); * Reserva.Bilhete = item["BILHETE"].Value.toString2(); * Reserva.Confirmacao = item["CONFIRMACAO"].Value.toString2(); * Reserva.Situacao = item["SITUACAO"].Value.toString2(); * Reserva.Reemisao = item["REEMISSAO"].Value.toString2(); * Reserva.Aprovador = item["APROVADOR"].Value.toString2(); * Reserva.Produto = item["PRODUTO"].Value.toString2(); * Reserva.Fornecedor = item["FORNECEDOR"].Value.toString2(); * Reserva.TipoVoo = item["TIPO"].Value.toString2(); * Reserva.Origem.DataHora = item["DATA_ORIGEM"].Value.toDataTime(); * Reserva.Destino.DataHora = item["DATA_DESTINO"].Value.toDataTime(); * * Reserva.Origem.Aeroporto = item["AEREO_ORIGEM"].Value.toString2(); * Reserva.Origem.Municipio = item["MUNICIPIO_ORIGEM"].Value.toString2(); * Reserva.Origem.Estado = item["ESTADO_ORIGEM"].Value.toString2(); * Reserva.Origem.Regiao = item["REGIAO_ORIGEM"].Value.toString2(); * Reserva.Origem.Pais = item["PAIS_ORIGEM"].Value.toString2(); * Reserva.Origem.Continente = item["CONTINENTE_ORIGEM"].Value.toString2(); * Reserva.Destino.Aeroporto = item["AEREO_DESTINO"].Value.toString2(); * Reserva.Destino.Municipio = item["MUNICIPIO_DESTINO"].Value.toString2(); * Reserva.Destino.Estado = item["ESTADO_DESTINO"].Value.toString2(); * Reserva.Destino.Regiao = item["REGIAO_DESTINO"].Value.toString2(); * Reserva.Destino.Pais = item["PAIS_DESTINO"].Value.toString2(); * Reserva.Destino.Continente = item["CONTINENTE_DESTINO"].Value.toString2(); * * // Decissão para colocar a reserva numa viagem específica ou avulsa * debug = "009"; * Viagem.Reservas.Add(Reserva); * debug = "009b"; * * if(Reserva.Produto == "Hotel") Viagem.Destino = Reserva.Destino; * else * { * Viagem.Origem = Reserva.Origem; * Viagem.Destino = Reserva.Destino; * } * * Reserva = new Reserva(); * Reserva.Origem = new Endereco(); * Reserva.Destino = new Endereco(); * * if (last_viajante == null) * { * last_viajante = item["PASSAGEIRO"].Value.toString2(); * Viajante.Passageiro = last_viajante; * Viajante.CPF = item["CPF"].Value.toString2(); * } * * if (last_CC == null) * { * last_CC = item["CC_CLIENTE"].Value.toString2(); * CentroCusto.Nome = last_CC; * CentroCusto.Cliente = item["CLIENTE"].Value.toString2(); * } * * if (last_viajante != item["PASSAGEIRO"].Value.toString2()) * { * Viajante.Viagens.Add(Viagem); * CentroCusto.Viajantes.Add(Viajante); * Viagem = new Viagem(); * Viajante = new Viajante(); * Viajante.Viagens = new List<Viagem>(); * // Viagem.Reservas = new List<Reserva>(); * last_viajante = item["PASSAGEIRO"].Value.toString2(); * Viajante.Passageiro = last_viajante; * Viajante.CPF = item["CPF"].Value.toString2(); * } * * if (last_CC != item["CC_CLIENTE"].Value.toString2()) * { * response.CentrosCusto.Add(CentroCusto); * CentroCusto = new CentroCusto(); * CentroCusto.Viajantes = new List<Viajante>(); * last_CC = item["CC_CLIENTE"].Value.toString2(); * CentroCusto.Nome = last_CC; * CentroCusto.Cliente = item["CLIENTE"].Value.toString2(); * } * * * if (first_data == null_data) first_data = item["DATA_ORIGEM"].Value.toDataTime(); * * if (Viagem.Origem.Aeroporto == null) Viagem.Origem = Reserva.Origem; * * if(Reserva.Produto == "Hotel") Viagem.Destino = Reserva.Destino; * * last_data = item["DATA_DESTINO"].Value.toDataTime(); * * // CentroCusto.Viajantes.Add(Viajante); * } * } * } * debug = "010"; */ return(response); } catch (Exception ex) { Logger.LogDetail(string.Format("Erro ao consultar adiantamento. Erro: {0}", ex.Message)); throw new Exception(string.Format("Erro ao consultar adiantamento. Erro: {0} (Linha:{1})", ex.Message, debug)); } finally { Logger.LogDetail("Método ConsultarAdiantamento() - Out"); } }
public ConsultaAdiantamentoResponse ConsultarAdiantamento(ConsultaAdiantamentoRequest request) { string debug = "001"; Logger.LogDetail("Método ConsultarAdiantamento() - In"); try { ConsultaAdiantamentoResponse response = new ConsultaAdiantamentoResponse(); debug = "002"; #region [ Validação dos filtros ] Logger.LogDetail(string.Format("Request: {0}", CBUtils.ToXml(request))); debug = "003"; response.Excecoes = new List <string>(); if ((request.DataInicial == null) || (request.DataInicial == DateTime.MinValue)) { response.Excecoes.Add("Data inicial é obrigatório!"); } if ((request.DataFinal == null) || (request.DataFinal == DateTime.MinValue)) { response.Excecoes.Add("Data final é obrigatório!"); } if ((request.DataInicial != null) && (request.DataFinal != null)) { if (request.DataInicial > request.DataFinal) { response.Excecoes.Add("Data inicial não pode ser maior que data final!"); } TimeSpan ts = request.DataFinal.Subtract(request.DataInicial); if (ts.Days > 180) { response.Excecoes.Add("Período máximo de pesquisa permitido é de 180 dias!"); } } Logger.LogDetail(string.Format("Exceções request: {0}", response.Excecoes.toString2())); #endregion [ Validação dos filtros ] debug = "004"; if (response.Excecoes.Count == 0) { Query query = new Query(@" DECLARE @DATAINICIO DATETIME SET @DATAINICIO = :PDATAINICIAL DECLARE @DATAFINAL DATETIME SET @DATAFINAL = :PDATAFINAL DECLARE @SITUACOES TABLE(HANDLE int, SITUACAO varchar(15)) INSERT INTO @SITUACOES (HANDLE, SITUACAO) values (1, 'Ativo'), (2, 'Cancelado') DECLARE @PRODUTOS TABLE(HANDLE int, PRODUTO varchar(15), PESO int) INSERT INTO @PRODUTOS (HANDLE, PRODUTO, PESO) values (1, 'Aéreo', 2), (2, 'Hotel', 3), (3, 'Carro', 4), (4, 'Miscelaneo', 1), (5, 'Aéreo', 2), (6, 'Aéreo', 2), (7, 'Aéreo', 2), (8, 'Rodoviário', 2) DECLARE @TIPOSEMISSAO TABLE(HANDLE varchar(1), TIPOEMISSAO varchar(15)) INSERT INTO @TIPOSEMISSAO (HANDLE, TIPOEMISSAO) values ('A', 'Ativo'), ('E', 'Externa'), ('M', 'Manual') DECLARE @TIPOSVOO TABLE(HANDLE varchar(1), TIPOVOO varchar(15)) INSERT INTO @TIPOSVOO (HANDLE, TIPOVOO) values ('D', 'Doméstico'), ('F', 'Internacional'), ('T', 'Regional') DECLARE @FORMASPAGAMENTO TABLE(HANDLE int, FORMAPAGAMENTO varchar(20)) INSERT INTO @FORMASPAGAMENTO (HANDLE, FORMAPAGAMENTO) values (1, 'Cartão'), (2, 'Invoice'), (3, 'Outras'), (4, 'GR'), (5, 'Múltiplos pagamentos') DECLARE @FORMASRECEBIMENTO TABLE(HANDLE int, FORMARECEBIMENTO varchar(30)) INSERT INTO @FORMASRECEBIMENTO (HANDLE, FORMARECEBIMENTO) values (1, 'Cash'), (3, 'Faturado'), (5, 'Cheque'), (6, 'Pagamento direto'), (7, 'Cartão'), (9, 'Cartão convênio'), (10, 'Sem adicional'), (11, 'Cartão AMEX'), (12, 'Governo'), (13, 'Cheque pré-datado'), (14, 'As financiadas por terceiros'), (15, 'Múltiplos recebimentos'), (16, 'Despesas internas'), (17, 'TKT'), (18, 'MCO') SELECT DISTINCT A.HANDLE, SIT.SITUACAO, PNR.REEMISSAO, CONVERT(DATE, A.DATAEMISSAO) AS DATAEMISSAO, A.AGENTE_EMISSAO AS EMISSOR_ID, AGE.NOME AS EMISSOR_NOME, PNR.BB_RLOC AS RLOC, PNR.LOCALIZADORACIA AS LOC, A.INFAPROVADOR AS APROVADOR, ISNULL(CONS.NOME, '') AS CONSOLIDADORA, CONVERT(VARCHAR(50), FORN.NOME) AS FORNECEDOR, ISNULL(A.BILHETE, '') AS BILHETE, ISNULL(A.CONFIRMACAO, '') AS CONFIRMACAO, -- ISNULL(TEMI.TIPOEMISSAO, '') AS TIPODEEMISSAO, CONVERT(VARCHAR(50), CLI.NOME) AS CLIENTE, ISNULL(TVOO.TIPOVOO, '') AS TIPOVOO, ISNULL(PASS.NOME, A.PASSAGEIRONAOCAD) AS PASSAGEIRO, ISNULL(PASS.CPF, 'Não cadastrado') AS CPF, CASE A.PRODUTO WHEN 4 THEN CASE TIPMIS.HANDLE WHEN 1 THEN 'Seguro' ELSE 'Miscelanio' END ELSE PRO.PRODUTO END AS PRODUTO, TIPMIS.NOME AS MISCELANIO, ISNULL(A.TRECHOS, '') AS TRECHOS, CONVERT(DATETIME, ISNULL(TRE.BB_AEREO_DATA_VOO, ISNULL(A.BB_MISC_ENTRADA, ISNULL(A.BB_CARRO_RETIRADA, A.BB_HOTEL_ENTRADA))) + ' ' + ISNULL(TRE.BB_AEREO_HRSAIDA, '00:00:00')) AS DATA_ORIGEM, ISNULL(TRE.BB_AEREO_ORIGEM, '') AS AEREO_ORIGEM, ISNULL(ORI_MUN.NOME, '') AS MUNICIPIO_ORIGEM, ISNULL(CASE ORI_PAIS.NOME WHEN 'Brasil' THEN ORI_EST.NOME ELSE NULL END, '') AS ESTADO_ORIGEM, ISNULL(CASE ORI_PAIS.NOME WHEN 'Brasil' THEN ORI_REG.NOME ELSE NULL END, '') AS REGIAO_ORIGEM, ISNULL(ORI_PAIS.NOME, '') AS PAIS_ORIGEM, ISNULL(CASE ORI_PAIS.NOME WHEN 'Brasil' THEN 'América Do Sul' ELSE ORI_REG.NOME END, '') AS CONTINENTE_ORIGEM, CONVERT(DATETIME, ISNULL((CASE WHEN CONVERT(DATETIME, TRE.BB_AEREO_DATA_VOO + TRE.BB_AEREO_HRSAIDA) > CONVERT(DATETIME, TRE.BB_AEREO_DATA_VOO + TRE.BB_AEREO_HRCHEGADA) THEN DATEADD(DAY, 1, TRE.BB_AEREO_DATA_VOO) ELSE TRE.BB_AEREO_DATA_VOO END), ISNULL(A.BB_MISC_SAIDA, ISNULL(A.BB_CARRO_ENTREGA, A.BB_HOTEL_SAIDA))) + ' ' + ISNULL(TRE.BB_AEREO_HRSAIDA, '')) AS DATA_DESTINO, ISNULL(ISNULL(TRE.BB_AEREO_DESTINO, DES_MUN.SIGLA), '') AS AEREO_DESTINO, ISNULL(DES_MUN.NOME, '') AS MUNICIPIO_DESTINO, ISNULL(CASE DES_PAIS.NOME WHEN 'Brasil' THEN DES_EST.NOME ELSE NULL END, '') AS ESTADO_DESTINO, ISNULL(CASE DES_PAIS.NOME WHEN 'Brasil' THEN DES_REG.NOME ELSE NULL END, '') AS REGIAO_DESTINO, ISNULL(DES_PAIS.NOME, '') AS PAIS_DESTINO, ISNULL(CASE DES_PAIS.NOME WHEN 'Brasil' THEN 'América Do Sul' ELSE DES_REG.NOME END, '') AS CONTINENTE_DESTINO, FPAG.FORMAPAGAMENTO AS FORMADEPAGAMENTO, FREC.FORMARECEBIMENTO AS FORMARECEBIMENTO, PCCAGE.PCC AS PCC_EMISSAO, CC.NOME AS CC_CASABLANCA, CLI_CC.CENTROCUSTO AS CC_CLIENTE, CASE WHEN A.PRODUTO <> 4 OR TIPMIS.HANDLE = 1 THEN PRO.PESO ELSE 5 END AS PESO, CONVERT(DATE, ISNULL(TRE.BB_AEREO_DATA_VOO, ISNULL(A.BB_MISC_ENTRADA, ISNULL(A.BB_CARRO_RETIRADA, A.BB_HOTEL_ENTRADA))) + ' ' + ISNULL(TRE.BB_AEREO_HRSAIDA, '00:00:00')) AS DT_ORIGEM FROM BB_PNRACCOUNTINGS A INNER JOIN BB_PNRS PNR ON PNR.HANDLE = A.RLOC INNER JOIN GN_PESSOAS CLI ON CLI.HANDLE = A.BB_CLIENTE LEFT JOIN BB_CLIENTECC AS CLI_CC ON A.CENTRODECUSTO = CLI_CC.HANDLE LEFT OUTER JOIN GN_GRUPOSEMPRESARIAIS GP ON GP.HANDLE = CLI.GRUPOEMPRESARIAL LEFT OUTER JOIN GN_PESSOAS GPP ON GPP.HANDLE = GP.PESSOA INNER JOIN GN_PESSOAS FORN ON FORN.HANDLE = A.FORNECEDOR LEFT JOIN GN_PESSOAS AS CONS ON A.CONSOLIDADOR = CONS.HANDLE LEFT JOIN @SITUACOES AS SIT ON SIT.HANDLE = A.SITUACAO LEFT JOIN BB_AGENTES AS AGE ON A.AGENTE_EMISSAO = AGE.HANDLE LEFT JOIN @PRODUTOS AS PRO ON PRO.HANDLE = A.PRODUTO LEFT JOIN BB_TIPOMISCELANIO AS TIPMIS ON A.TIPOMISCELANIO = TIPMIS.HANDLE LEFT JOIN @TIPOSEMISSAO AS TEMI ON TEMI.HANDLE = A.TIPODEEMISSAO LEFT JOIN @TIPOSVOO AS TVOO ON TVOO.HANDLE = A.TIPOVOO LEFT JOIN (SELECT MAX(NOME) AS NOME, PESSOA, CPF FROM GN_PESSOACONTATOS GROUP BY CPF, PESSOA) PASS ON PASS.PESSOA = CLI.HANDLE AND PASS.NOME LIKE REPLACE(CASE WHEN CHARINDEX('/', A.PASSAGEIRONAOCAD) = 0 THEN A.PASSAGEIRONAOCAD ELSE RIGHT(A.PASSAGEIRONAOCAD, LEN(A.PASSAGEIRONAOCAD) - CHARINDEX('/', A.PASSAGEIRONAOCAD)) + ' ' + LEFT(A.PASSAGEIRONAOCAD, CHARINDEX('/', A.PASSAGEIRONAOCAD) - 1) END, ' ', '%') -- LEFT JOIN BB_PNRPASSAGEIROS AS PASS ON A.PASSAGEIROCAD = PASS.HANDLE LEFT JOIN BB_TRECHOACCOUNTING TRE_A ON A.HANDLE = TRE_A.ACCOUNTING LEFT JOIN BB_PNRTRECHOS AS TRE ON TRE.HANDLE = TRE_A.TRECHO LEFT JOIN BB_AEROPORTOS AS DES_AERO ON DES_AERO.AEROPORTO = TRE.BB_AEREO_DESTINO LEFT JOIN MUNICIPIOS AS DES_MUN ON (PRO.PRODUTO = 'Aéreo' AND DES_MUN.HANDLE = DES_AERO.CIDADE) OR (PRO.PRODUTO <> 'Aéreo' AND DES_MUN.HANDLE = FORN.MUNICIPIO) LEFT JOIN ESTADOS DES_EST ON DES_EST.HANDLE = DES_MUN.ESTADO LEFT JOIN PAISES DES_PAIS ON DES_PAIS.HANDLE = DES_MUN.PAIS LEFT JOIN K_REGIOES DES_REG ON DES_REG.HANDLE = DES_PAIS.K_CONTINENTE OR DES_REG.HANDLE = DES_EST.K_REGIAO LEFT JOIN BB_AEROPORTOS AS ORI_AERO ON ORI_AERO.AEROPORTO = TRE.BB_AEREO_ORIGEM LEFT JOIN MUNICIPIOS AS ORI_MUN ON ORI_MUN.HANDLE = ORI_AERO.CIDADE LEFT JOIN ESTADOS ORI_EST ON ORI_EST.HANDLE = ORI_MUN.ESTADO LEFT JOIN PAISES ORI_PAIS ON ORI_PAIS.HANDLE = ORI_MUN.PAIS LEFT JOIN K_REGIOES ORI_REG ON ORI_REG.HANDLE = ORI_PAIS.K_CONTINENTE OR ORI_REG.HANDLE = ORI_EST.K_REGIAO LEFT JOIN @FORMASPAGAMENTO AS FPAG ON FPAG.HANDLE = A.FORMADEPAGAMENTO LEFT JOIN @FORMASRECEBIMENTO AS FREC ON FREC.HANDLE = A.FORMARECEBIMENTO LEFT JOIN BB_MAQUINAS AS PCCAGE ON A.PCC_EMISSAO = PCCAGE.HANDLE LEFT JOIN BB_CCPROJETOACC AS CCPROJ ON A.HANDLE = CCPROJ.ACCOUNTING LEFT JOIN CT_CC AS CC ON CCPROJ.CCSUGERIDO = CC.HANDLE WHERE CONVERT(DATETIME, ISNULL(TRE.BB_AEREO_DATA_VOO, ISNULL(A.BB_MISC_ENTRADA, ISNULL(A.BB_CARRO_RETIRADA, A.BB_HOTEL_ENTRADA))) + ' ' + ISNULL(TRE.BB_AEREO_HRSAIDA, '00:00:00')) <= @DATAFINAL AND CONVERT(DATETIME, ISNULL((CASE WHEN CONVERT(DATETIME, TRE.BB_AEREO_DATA_VOO + TRE.BB_AEREO_HRSAIDA) > CONVERT(DATETIME, TRE.BB_AEREO_DATA_VOO + TRE.BB_AEREO_HRCHEGADA) THEN DATEADD(DAY, 1, TRE.BB_AEREO_DATA_VOO) ELSE TRE.BB_AEREO_DATA_VOO END), ISNULL(A.BB_MISC_SAIDA, ISNULL(A.BB_CARRO_ENTREGA, A.BB_HOTEL_SAIDA))) + ' ' + ISNULL(TRE.BB_AEREO_HRSAIDA, '')) >= @DATAINICIO AND ((A.BB_CLIENTE IN ( SELECT PES.HANDLE FROM GN_PESSOAS PES WHERE PES.GRUPOEMPRESARIAL IN ( SELECT PESSOA FROM BB_USUARIOPESSOAS WHERE USUARIO = @USUARIO AND GRUPOEMPRESARIAL = 'S')) OR A.BB_CLIENTE IN ( SELECT PESSOA FROM BB_USUARIOPESSOAS WHERE USUARIO = @USUARIO))) AND A.SITUACAO = 1 AND PNR.REEMISSAO = 'N' ORDER BY CC_CLIENTE, PASSAGEIRO, DT_ORIGEM, PESO, RLOC, DATA_ORIGEM" ); query.Parameters.Add(new Parameter("PDATAINICIAL", DataType.DateTime, request.DataInicial)); query.Parameters.Add(new Parameter("PDATAFINAL", DataType.DateTime, request.DataFinal)); Logger.LogDetail(string.Format("Comando utilizado para consulta de viagens: {0}", query.CommandText)); Entities <EntityBase> dados = query.Execute(); if (dados.Count == 0) { response.Excecoes.Add("Nenhuma viagem encontrada com o filtro informado!"); } else { debug = "Leiu os dados"; // COMO LER OS VOOS: // OS TRECHOS PODEM APARECER ASSIM: // FLN/GRU/DFW/SFO/DFW/GRU/REC ONDE SFO É O DESTINO // REC/GRU/IAH/SFO/EWR/GRU/REC ONDE EWR É O DESTINO // REC/GIG/ATL/SFO-YYZ/JFK/GRU/REC ONDE SFO É O DESTINO // REC/BEL e BEL/BSB/REC ONDE BEL É O DESTINO // PRIMEIRA ENTRADA ABRE A VIAGEM // COM A VIAGEM AINDA FECHADA: // PRODUTO = SEGURO -> VIAGEM É A ABRANGENCIA DO SEGURO -> DURAÇÃO DA VIAGEM -> DATA INICIO -> DATA CHEGADA // PRODUTO = AÉREO -> CONFIRMAR SE É A PRIMEIRA VIAGEM OU A ÚLTIMA E PEGAR OS TRECHOS COMO COLEÇÃO DE STRING PARA COMPARAR -> PRIMEIRO O ULTIMO VIAGEM, PEGAR AS DATAS LIMITE DA VIAGEM E SOBREPOR AO SEGURO -> RECALCULAR AS DIARIAS // PRODUTO = HOTEL -> SE NÃO TEM AEREO E NEM SEGURO PEGAR AS DIARIAS E AS DATAS DE INICIO E FIM DA VIAGEM E COMPARAR COM OS TRECHOS PARA DEFINIR O PRIMEIRO DESTINO // // VIAGEM ─────────────────────────────────────┐ DATA DE INICIO DA VIAGEM - Ainda não tem viagem, ou mudaram os trechos, ou foi feito o último trecho, ou apareceu outro seguro, ou apareceu um hotel fora da rota // │┌─ SEGURO ─┐ │ Abre viagem - Data Origem - Diarias - HaSeguro // ││┌─ VOO IDA │ │ Trechos - Trecho coincide com o inicio dos trechos // │││ └─ TRECHOS [FOR-CGH-MIA] │ │ Abre viagem - Data Origem - HaAereo = PRECISSA DOS TRECHOS OU DE SEGURO OU DE HOTEL PARA SER LOCALIZADO // │││┌─ HOTEL [MIA] │ DIARIAS │ Abre viagem - Data Origem - Data Destino - Diarias - HaHotel // ││││ -> PASSEIOS │ EM MIA │ // ││││ -> INGRESSOS │ │ // ││││ -> CARRO, ETC... │ │ // │││└─ ─┘ │ // │││ LOOP MULTIPLES DESTINOS │ // ││├─ DESLOCAMENTO ─┐ │ Tem um hotel na cidade do trecho ou a diferência com o voo anterior é superior a 6 horas // │││ └─ TRECHOS [MIA-ORL] │ │ Data Destino - Diarias - Fecha destino - Abre destino novo - Data Origem - HaAereo = PRECISSA DOS TRECHOS OU DE SEGURO OU DE HOTEL PARA SER LOCALIZADO // │││┌─ HOTEL [ORL] │ DIARIAS │ Abre destino novo - Data Origem - Data Destino - Diarias - HaHotel // ││││ -> PASSEIOS │ EM ORL │ // ││││ -> INGRESSOS │ │ // ││││ -> CARRO, ETC... │ │ // │││└─ │ │ // │││ FIM DO LOOP MULTIPLES DESTINOS │ // ││└─ VOO RETORNO │ │ Trecho coincide com o final dos trechos // ││ └─ TRECHOS [ORL-MEX-REC] │ │ Data Destino - Fecha destino - Diarias = PRECISSA DOS TRECHOS OU DE SEGURO OU DE HOTEL PARA SER LOCALIZADO // │└─ ─┘ │ // └───────────────────────────────────────────┘ DATA DE FIM DA VIAGEM // primeiro ler as vendas feitas para o cliente // identificar o tipo de produto // se o produto for aéreo, pegar as datas e horas das viagens para saber nos trechos qual foi o destino // INFORMAÇÕES DO CENTRO DE CUSTO: // - NOME // INFORMAÇÕES DO PAX: // - NOME COMPLETO // - NOME PAX // - CPF // - ENDERECO // - TELEFONE // - EMAIL // INFORMAÇÕES DA VIAGEM: // - DATA INICIO // - DATA FIM // - DIARIAS // - DESTINOS // - DATA CHEGADA // - DATA RETORNO // - LUGAR // - RESERVAS // - DADOS DE CADA RESERVA - VOOS APENAS OS DE IDA ATÉ O ÚLTIMO VIAGEM // // VARIAVES DE COMPARAÇÃO // string last_rloc = null; // int last_rloc_pos = 0; // string last_origem = null; // bool tem_hotel = false; // CONFERIR SE É HOTEL. // SE É, MARCAR O DESTINO CONFERIR AS RESERVAS ANTERIORES // ONDE ENCONTRAR O MESMO DESTINO ADICIONAR NAS RESERVAS. // ONDE FOR AVIÃO, PEGAR O RLOC // ONDE FOR AVIÃO OU COM O MESMO RLOC, ADICIONAR NAS RESERVAS // COLOCAR INICIO DA VIAGEM NO PRIMEIRO ORIGEM // COLOCAR AS DIARIAS A DIFERENCIA ENTRE O PRIMEIRO ORIGEM E O ÚLTIMO DESTINO // Tem que ser tempo tudo o mesmo viajante e o mesmo centro de custo //------------------------------------------------------------------------------ response.CentrosCusto = new List <CentroCusto>(); ConsultaAdiantamentoResponse Adiantamento; CentroCusto CentroCusto; Viajante Viajante; Viagem Viagem; Destino Destino; Reserva Reserva; ItemProduto NovoItem; ItemProduto LastItem; // INICIALIZAÇÕES Adiantamento = new ConsultaAdiantamentoResponse(); Adiantamento.CentrosCusto = new List <DataContracts.Adiantamento.CentroCusto>(); CentroCusto = new CentroCusto(); CentroCusto.Viajantes = new List <DataContracts.Adiantamento.Viajante>(); Viajante = new Viajante(); Viajante.Viagens = new List <DataContracts.Adiantamento.Viagem>(); Viagem = new Viagem(); Viagem.Destinos = new List <DataContracts.Adiantamento.Destino>(); Destino = new Destino(); Destino.Reservas = new List <DataContracts.Adiantamento.Reserva>(); Reserva = new Reserva(); // Reserva.Seguro = new ItemProduto(); Reserva.AéreoIda = new List <ItemProduto>(); // Reserva.Hotel = new ItemProduto(); // Reserva.Carro = new ItemProduto(); Reserva.Miscelanio = new List <ItemProduto>(); Reserva.AéreoVolta = new List <ItemProduto>(); // TESTEMUNHAS bool novoReserva = true; bool novoDestino = true; bool novoViagem = true; bool novoViajante = true; bool novoCentroCusto = true; bool inicio = true; bool ida = true; DateTime null_data = new System.DateTime(2000, 1, 1, 0, 0, 0); // Isto vai ser equivalente a datetime nula DateTime first_data = null_data; // Aquí é para gerar uma variavel datetime nula DateTime last_data = null_data; // Aquí é para gerar uma variavel datetime nula foreach (EntityBase item in dados) { debug = "LÉ O ITEM"; NovoItem = new ItemProduto(); NovoItem.TrOrigem = new Endereco(); NovoItem.TrDestino = new Endereco(); NovoItem.TipoProduto = item["PRODUTO"].Value.toString2(); NovoItem.CodigoCasablanca = item["HANDLE"].Value.toString2(); NovoItem.Loc = item["LOC"].Value.toString2(); NovoItem.Aprovador = item["APROVADOR"].Value.toString2(); NovoItem.Fornecedor = item["FORNECEDOR"].Value.toString2(); NovoItem.Inicio = item["DATA_ORIGEM"].Value.toDataTime(); NovoItem.Final = item["DATA_DESTINO"].Value.toDataTime(); NovoItem.Diarias = NovoItem.Final.Subtract(NovoItem.Inicio).Days + 1; switch (NovoItem.TipoProduto) { case "Seguro": NovoItem.Confirmacao = item["CONFIRMACAO"].Value.toString2(); NovoItem.TrOrigem = null; NovoItem.TrDestino = new Endereco(); NovoItem.TrDestino.Municipio = item["MUNICIPIO_DESTINO"].Value.toString2(); NovoItem.TrDestino.Estado = item["ESTADO_DESTINO"].Value.toString2(); NovoItem.TrDestino.Regiao = item["REGIAO_DESTINO"].Value.toString2(); NovoItem.TrDestino.Pais = item["PAIS_DESTINO"].Value.toString2(); NovoItem.TrDestino.Continente = item["CONTINENTE_DESTINO"].Value.toString2(); if (Viagem.Seguro != null) { novoViagem = true; // Seguro repetido = novo viagem } break; case "Aéreo": NovoItem.Bilhete = item["BILHETE"].Value.toString2(); NovoItem.TrOrigem = new Endereco(); NovoItem.TrOrigem.Aeroporto = item["AEREO_ORIGEM"].Value.toString2(); NovoItem.TrOrigem.Municipio = item["MUNICIPIO_ORIGEM"].Value.toString2(); NovoItem.TrOrigem.Estado = item["ESTADO_ORIGEM"].Value.toString2(); NovoItem.TrOrigem.Regiao = item["REGIAO_ORIGEM"].Value.toString2(); NovoItem.TrOrigem.Pais = item["PAIS_ORIGEM"].Value.toString2(); NovoItem.TrOrigem.Continente = item["CONTINENTE_ORIGEM"].Value.toString2(); NovoItem.TrDestino = new Endereco(); NovoItem.TrDestino.Aeroporto = item["AEREO_DESTINO"].Value.toString2(); NovoItem.TrDestino.Municipio = item["MUNICIPIO_DESTINO"].Value.toString2(); NovoItem.TrDestino.Estado = item["ESTADO_DESTINO"].Value.toString2(); NovoItem.TrDestino.Regiao = item["REGIAO_DESTINO"].Value.toString2(); NovoItem.TrDestino.Pais = item["PAIS_DESTINO"].Value.toString2(); NovoItem.TrDestino.Continente = item["CONTINENTE_DESTINO"].Value.toString2(); break; case "Hotel": NovoItem.Confirmacao = item["CONFIRMACAO"].Value.toString2(); NovoItem.TrOrigem = null; NovoItem.TrDestino = new Endereco(); NovoItem.TrDestino.Municipio = item["MUNICIPIO_DESTINO"].Value.toString2(); NovoItem.TrDestino.Estado = item["ESTADO_DESTINO"].Value.toString2(); NovoItem.TrDestino.Regiao = item["REGIAO_DESTINO"].Value.toString2(); NovoItem.TrDestino.Pais = item["PAIS_DESTINO"].Value.toString2(); NovoItem.TrDestino.Continente = item["CONTINENTE_DESTINO"].Value.toString2(); break; if (Reserva.Hotel != null) { if (Reserva.Hotel.Final.Subtract(NovoItem.Inicio).Days > 1) { novoViagem = true; } else { novoDestino = true; } } case "Carro": NovoItem.Confirmacao = item["CONFIRMACAO"].Value.toString2(); NovoItem.TrOrigem = null; NovoItem.TrDestino = new Endereco(); NovoItem.TrDestino.Municipio = item["MUNICIPIO_DESTINO"].Value.toString2(); NovoItem.TrDestino.Estado = item["ESTADO_DESTINO"].Value.toString2(); NovoItem.TrDestino.Regiao = item["REGIAO_DESTINO"].Value.toString2(); NovoItem.TrDestino.Pais = item["PAIS_DESTINO"].Value.toString2(); NovoItem.TrDestino.Continente = item["CONTINENTE_DESTINO"].Value.toString2(); break; case "Miscelanio": // Reserva.Miscelanio.Add(NovoItem); break; // Miscelanio morre aqui. } debug = "DECIDE SE VAI MUDAR O DESTINO OU VIAGEM OU VIAJANTE OU CENTRO DE CUSTO"; // primeira comporbação: if (Viajante.CPF != item["CPF"].Value.toString2() || Viajante.Nome != item["PASSAGEIRO"].Value.toString2()) { novoViajante = true; } if (CentroCusto.Nome != item["CC_CLIENTE"].Value.toString2()) { novoCentroCusto = true; } debug = "FECHA E ABRE O QUE SEJA NECESSARIO"; if (novoReserva || novoDestino || novoViagem || novoViajante || novoCentroCusto) { // NOVA RESERVA debug = "NOVA RESERVA"; if (!inicio) { Destino.Reservas.Add(Reserva); Reserva = new Reserva(); // Reserva.Seguro = new ItemProduto(); Reserva.AéreoIda = new List <ItemProduto>(); // Reserva.Hotel = new ItemProduto(); // Reserva.Carro = new ItemProduto(); Reserva.Miscelanio = new List <ItemProduto>(); Reserva.AéreoVolta = new List <ItemProduto>(); } } // DECISSÕES PARA NOVO DESTINO if (novoDestino || novoViagem || novoViajante || novoCentroCusto) { // NOVO DESTINO debug = "NOVO DESTINO"; if (!inicio) { Viagem.Destinos.Add(Destino); Destino = new Destino(); Destino.Reservas = new List <DataContracts.Adiantamento.Reserva>(); ida = true; } } // DECISSÕES PARA NOVA VIAGEM if (novoViagem || novoViajante || novoCentroCusto) { // NOVO VIAGEM debug = "NOVO VIAGEM"; if (!inicio) { Viajante.Viagens.Add(Viagem); Viagem = new Viagem(); Viagem.Destinos = new List <DataContracts.Adiantamento.Destino>(); } } if (novoViajante || novoCentroCusto) { // NOVO VIAJANTE debug = "NOVO VIAJANTE"; if (!inicio) { CentroCusto.Viajantes.Add(Viajante); Viajante = new Viajante(); Viajante.Viagens = new List <DataContracts.Adiantamento.Viagem>(); } Viajante.Nome = item["PASSAGEIRO"].Value.toString2(); Viajante.CPF = item["CPF"].Value.toString2(); } if (novoCentroCusto) { // NOVO CENTRO DE CUSTO debug = "NOVO CENTRO DE CUSTO"; if (!inicio) { response.CentrosCusto.Add(CentroCusto); CentroCusto = new CentroCusto(); CentroCusto.Viajantes = new List <DataContracts.Adiantamento.Viajante>(); } CentroCusto.Nome = item["CC_CLIENTE"].Value.toString2(); CentroCusto.Cliente = item["CLIENTE"].Value.toString2(); } inicio = false; novoReserva = false; novoDestino = false; novoViagem = false; novoViajante = false; novoCentroCusto = false; debug = "COLOCA O ITEM"; if (Viagem.Trechos == null) { Viagem.Trechos = item["TRECHOS"].Value.toString2(); } else { if (Viagem.Trechos != item["TRECHOS"].Value.toString2()) { Viagem.Trechos += item["TRECHOS"].Value.toString2(); } } if (Destino.Diarias < NovoItem.Diarias) { Viagem.Diarias += NovoItem.Diarias - Destino.Diarias; Destino.Diarias = NovoItem.Diarias; } switch (NovoItem.TipoProduto) { case "Seguro": Viagem.Seguro = NovoItem; Viagem.Inicio = NovoItem.Inicio; Viagem.Final = NovoItem.Final; break; case "Aéreo": //Decidir se é ida ou volta debug = "AEREO " + Reserva.AéreoIda.Count(); if (ida && Reserva.AéreoIda.Count() > 0) { if (NovoItem.Inicio.Subtract(Reserva.AéreoIda.Last().Final).Days > 1 && NovoItem.TrOrigem.Municipio == Reserva.AéreoIda.Last().TrDestino.Municipio) { Destino.TrDestino = NovoItem.TrOrigem; ida = false; } } if (ida) //integerList[integerList.Count - 1] { if (Destino.TrOrigem == null) { Destino.TrOrigem = NovoItem.TrOrigem; } Reserva.AéreoIda.Add(NovoItem); } else { Reserva.AéreoVolta.Add(NovoItem); } break; case "Hotel": Reserva.Hotel = NovoItem; Destino.TrDestino = NovoItem.TrDestino; ida = false; break; case "Carro": Reserva.Carro = NovoItem; if (Destino.TrDestino == null) { Destino.TrDestino = NovoItem.TrDestino; } ida = false; break; case "Miscelanio": Reserva.Miscelanio.Add(NovoItem); break; } debug = "LINHA 02"; LastItem = NovoItem; } Destino.Reservas.Add(Reserva); Viagem.Destinos.Add(Destino); Viajante.Viagens.Add(Viagem); CentroCusto.Viajantes.Add(Viajante); response.CentrosCusto.Add(CentroCusto); } } debug = "Acabou a revissão"; return(response); } catch (Exception ex) { Logger.LogDetail(string.Format("Erro ao consultar adiantamento. Erro: {0}", ex.Message)); throw new Exception(string.Format("Erro ao consultar adiantamento. Erro: {0} (Linha:{1})", ex.Message, debug)); } finally { Logger.LogDetail("Método ConsultarAdiantamento() - Out"); } }
public ConsultaReservasResponse ConsultarReservas(ConsultaReservasRequest request) { Logger.LogDetail("Método ConsultarReservas() - In"); try { ConsultaReservasResponse response = new ConsultaReservasResponse(); #region [ Validação dos filtros ] Logger.LogDetail(string.Format("Request: {0}", CBUtils.ToXml(request))); response.Excecoes = new List <string>(); if ((request.DataInicial == null) || (request.DataInicial == DateTime.MinValue)) { response.Excecoes.Add("Data inicial é obrigatório!"); } if ((request.DataFinal == null) || (request.DataFinal == DateTime.MinValue)) { response.Excecoes.Add("Data final é obrigatório!"); } if ((request.DataInicial != null) && (request.DataFinal != null)) { if (request.DataInicial > request.DataFinal) { response.Excecoes.Add("Data inicial não pode ser maior que data final!"); } TimeSpan ts = request.DataFinal.Subtract(request.DataInicial); if (ts.Days > 180) { response.Excecoes.Add("Período máximo de pesquisa permitido é de 180 dias!"); } } Logger.LogDetail(string.Format("Exceções request: {0}", response.Excecoes.toString2())); #endregion [ Validação dos filtros ] if (response.Excecoes.Count == 0) { Query query = new Query(@" SELECT ACC.DATAEMISSAO, PNR.BB_RLOC NUMERORESERVA, GPP.NOME GRUPOEMPRESARIAL, CLI.NOME CLIENTE, ACC.PASSAGEIRONAOCAD PASSAGEIRO, ACC.PRODUTO, CASE WHEN ACC.PRODUTO IN (1,5,6,7) THEN (SELECT MIN(B.BB_AEREO_DATA_VOO) FROM BB_TRECHOACCOUNTING A INNER JOIN BB_PNRTRECHOS B ON (B.HANDLE = A.TRECHO) WHERE A.ACCOUNTING = ACC.HANDLE) WHEN ACC.PRODUTO = 2 THEN (ACC.BB_HOTEL_ENTRADA) WHEN ACC.PRODUTO = 3 THEN (ACC.BB_CARRO_RETIRADA) WHEN ACC.PRODUTO = 4 THEN (ACC.BB_MISC_ENTRADA) END DATAINICIAL, CASE WHEN ACC.PRODUTO IN (1,5,6,7) THEN (SELECT MAX(B.BB_AEREO_DATA_VOO) FROM BB_TRECHOACCOUNTING A INNER JOIN BB_PNRTRECHOS B ON (B.HANDLE = A.TRECHO) WHERE A.ACCOUNTING = ACC.HANDLE) WHEN ACC.PRODUTO = 2 THEN (ACC.BB_HOTEL_SAIDA) WHEN ACC.PRODUTO = 3 THEN (ACC.BB_CARRO_ENTREGA) WHEN ACC.PRODUTO = 4 THEN (ACC.BB_MISC_SAIDA) END DATAFINAL, MUNFOR.NOME MUNICIPIO, ESTFOR.NOME ESTADO, REGEST.NOME REGIAO, PAISFOR.NOME PAIS, REGPAIS.NOME CONTINENTE FROM BB_PNRACCOUNTINGS ACC INNER JOIN BB_PNRS PNR ON (PNR.HANDLE = ACC.RLOC) INNER JOIN GN_PESSOAS CLI ON (CLI.HANDLE = ACC.BB_CLIENTE) LEFT OUTER JOIN GN_GRUPOSEMPRESARIAIS GP ON (GP.HANDLE = CLI.GRUPOEMPRESARIAL) LEFT OUTER JOIN GN_PESSOAS GPP ON (GPP.HANDLE = GP.PESSOA) INNER JOIN GN_PESSOAS FORN ON (FORN.HANDLE = ACC.FORNECEDOR) LEFT OUTER JOIN MUNICIPIOS MUNFOR ON (MUNFOR.HANDLE = FORN.MUNICIPIO) LEFT OUTER JOIN ESTADOS ESTFOR ON (ESTFOR.HANDLE = FORN.ESTADO) LEFT OUTER JOIN PAISES PAISFOR ON (PAISFOR.HANDLE = FORN.PAIS) LEFT OUTER JOIN K_REGIOES REGEST ON (REGEST.HANDLE = ESTFOR.K_REGIAO) LEFT OUTER JOIN K_REGIOES REGPAIS ON (REGPAIS.HANDLE = PAISFOR.K_CONTINENTE) WHERE ACC.DATAEMISSAO BETWEEN :PDATAINICIAL AND :PDATAFINAL AND ((ACC.BB_CLIENTE IN (SELECT PES.HANDLE FROM GN_PESSOAS PES WHERE PES.GRUPOEMPRESARIAL IN (SELECT PESSOA FROM BB_USUARIOPESSOAS WHERE USUARIO = @USUARIO AND GRUPOEMPRESARIAL = 'S')) OR ACC.BB_CLIENTE IN (SELECT PESSOA FROM BB_USUARIOPESSOAS WHERE USUARIO = @USUARIO))) "); query.Parameters.Add(new Parameter("PDATAINICIAL", DataType.DateTime, request.DataInicial)); query.Parameters.Add(new Parameter("PDATAFINAL", DataType.DateTime, request.DataFinal)); Logger.LogDetail(string.Format("Comando utilizado para consulta de reservas: {0}", query.CommandText)); Entities <EntityBase> reservas = query.Execute(); if (reservas.Count == 0) { response.Excecoes.Add("Nenhuma reserva encontrada com o filtro informado!"); } else { Reserva reserva; response.Reservas = new List <Reserva>(); foreach (EntityBase itemReserva in reservas) { reserva = new Reserva(); reserva.DataEmissao = itemReserva["DATAEMISSAO"].Value.toDataTime(); reserva.NumeroReserva = itemReserva["NUMERORESERVA"].Value.toString2(); reserva.GrupoEmpresarial = itemReserva["GRUPOEMPRESARIAL"].Value.toString2(); reserva.Cliente = itemReserva["CLIENTE"].Value.toString2(); reserva.Passageiro = itemReserva["PASSAGEIRO"].Value.toString2(); reserva.Produto = GetProduto(itemReserva["PRODUTO"].Value.toInt()); reserva.DataInicial = itemReserva["DATAINICIAL"].Value.toDataTime(); reserva.DataFinal = itemReserva["DATAFINAL"].Value.toDataTime(); if ((reserva.DataInicial != null && reserva.DataInicial > DateTime.MinValue) && (reserva.DataFinal != null && reserva.DataFinal > DateTime.MinValue)) { TimeSpan ts = reserva.DataFinal.Subtract(reserva.DataInicial); reserva.QuantidadeDiarias = ts.Days; } reserva.Municipio = itemReserva["MUNICIPIO"].Value.toString2(); reserva.Estado = itemReserva["ESTADO"].Value.toString2(); reserva.Regiao = itemReserva["REGIAO"].Value.toString2(); reserva.Pais = itemReserva["PAIS"].Value.toString2(); reserva.Continente = itemReserva["CONTINENTE"].Value.toString2(); response.Reservas.Add(reserva); } } } return(response); } catch (Exception ex) { Logger.LogDetail(string.Format("Erro ao consultar reservas. Erro: {0}", ex.Message)); throw new Exception(string.Format("Erro ao consultar reservas. Erro: {0}", ex.Message)); } finally { Logger.LogDetail("Método ConsultarReservas() - Out"); } }
public ConsultaFaturasResponse ConsultarFaturas(ConsultaFaturasRequest request) { Logger.LogDetail("Método ConsultarFaturas() - In"); try { ConsultaFaturasResponse response = new ConsultaFaturasResponse(); #region [ Validação select faturas ] Logger.LogDetail("Consultando comando select da query K_WS_FATURAMENTOFATURAS."); Query query = new Query("SELECT COMANDO FROM Z_TABELAS WHERE NOME = :PNOME"); query.Parameters.Add(new Parameter("PNOME", DataType.String, "K_WS_FATURAMENTOFATURAS")); Entities <EntityBase> selectFaturas = query.Execute(); if (selectFaturas.Count == 0) { Logger.LogDetail("Query K_WS_FATURAMENTOFATURAS não encontrada na base de dados."); throw new Exception("Comando para consulta de faturas não encontrado. (Query K_WS_FATURAMENTOFATURAS)"); } #endregion [ Validação select faturas ] #region [ Validação select reservas ] Logger.LogDetail("Consultando comando select da query K_WS_FATURAMENTOFATURARESERVAS."); query.Parameters.Clear(); query.Parameters.Add(new Parameter("PNOME", DataType.String, "K_WS_FATURAMENTOFATURARESERVAS")); Entities <EntityBase> selectFaturaReservas = query.Execute(); if (selectFaturaReservas.Count == 0) { Logger.LogDetail("Query K_WS_FATURAMENTOFATURARESERVAS não encontrada na base de dados."); throw new Exception("Comando para consulta de reservas da fatura não encontrado. (Query K_WS_FATURAMENTOFATURARESERVAS)"); } #endregion [ Validação select reservas ] #region [ Validação select fees ] Logger.LogDetail("Consultando comando select da query K_WS_FATURAMENTOFATURAFEES."); query.Parameters.Clear(); query.Parameters.Add(new Parameter("PNOME", DataType.String, "K_WS_FATURAMENTOFATURAFEES")); Entities <EntityBase> selectFaturaFEEs = query.Execute(); if (selectFaturaFEEs.Count == 0) { Logger.LogDetail("Query K_WS_FATURAMENTOFATURAFEES não encontrada na base de dados."); throw new Exception("Comando para consulta fees da fatura não encontrado. (Query K_WS_FATURAMENTOFATURAFEES)"); } #endregion [ Validação select fees ] #region [ Validação select reembolsos ] Logger.LogDetail("Consultando comando select da query K_WS_FATURAMENTOFATURAREEMBOLS."); query.Parameters.Clear(); query.Parameters.Add(new Parameter("PNOME", DataType.String, "K_WS_FATURAMENTOFATURAREEMBOLS")); Entities <EntityBase> selectFaturaReembolsos = query.Execute(); if (selectFaturaReembolsos.Count == 0) { Logger.LogDetail("Query K_WS_FATURAMENTOFATURAREEMBOLS não encontrada na base de dados."); throw new Exception("Comando para consulta reembolsos da fatura não encontrado. (Query K_WS_FATURAMENTOFATURAREEMBOLS)"); } #endregion [ Validação select reembolsos ] #region [ Validação dos filtros ] Logger.LogDetail(string.Format("Request.: {0}", CBUtils.ToXml(request))); response.Excecoes = new List <string>(); if ((request.DataInicial == null) || (request.DataInicial == DateTime.MinValue)) { response.Excecoes.Add("Data inicial é obrigatório!"); } if ((request.DataFinal == null) || (request.DataFinal == DateTime.MinValue)) { response.Excecoes.Add("Data final é obrigatório!"); } if ((request.DataInicial != null) && (request.DataFinal != null)) { if (request.DataInicial > request.DataFinal) { response.Excecoes.Add("Data inicial não pode ser maior que data final!"); } TimeSpan ts = request.DataFinal.Subtract(request.DataInicial); if (ts.Days > 180) { response.Excecoes.Add("Período máximo de pesquisa permitido é de 180 dias!"); } } Logger.LogDetail(string.Format("Exceções request.: {0}", response.Excecoes.toString2())); #endregion [ Validação dos filtros ] if (response.Excecoes.Count == 0) { query = new Query(selectFaturas.FirstOrDefault()["COMANDO"].Value.ToString()); #region [ Filtro data ] string campoData = string.Empty; switch (request.TipoData) { case TipoData.DataConfirmacao: campoData = "FAT.DATACONFIRMACAO"; break; case TipoData.DataVencimento: campoData = "FAT.DATAVENCIMENTO"; break; default: campoData = "FAT.DATA"; break; } query.CommandText.AppendFormat(" AND ({0} BETWEEN :PDATAINICIAL AND :PDATAFINAL) ", campoData); query.Parameters.Add(new Parameter("PDATAINICIAL", DataType.DateTime, request.DataInicial)); query.Parameters.Add(new Parameter("PDATAFINAL", DataType.DateTime, request.DataFinal)); #endregion [ Filtro data ] #region [ Filtro status ] if (request.Status != StatusFatura.Indefinido) { query.CommandText.Append(" AND (FAT.STATUS = :PSTATUS) "); query.Parameters.Add(new Parameter("PSTATUS", DataType.String, (int)request.Status)); } #endregion [ Filtro status] Logger.LogDetail(string.Format("Comando utilizado para consulta de faturas.: {0}", query.CommandText)); Entities <EntityBase> faturas = query.Execute(); if (faturas.Count == 0) { response.Excecoes.Add("Nenhuma fatura encontrada com o filtro informado!"); } else { #region [ Prepara consulta de reservas da fatura ] Query qReservas = new Query(selectFaturaReservas.FirstOrDefault()["COMANDO"].Value.ToString()); Entities <EntityBase> faturaReservas; #endregion [ Prepara consulta de reservas da fatura ] #region [ Prepara consulta de fees da fatura ] Query qFEEs = new Query(selectFaturaFEEs.FirstOrDefault()["COMANDO"].Value.ToString()); Entities <EntityBase> faturaFEEs; #endregion [ Prepara consulta de fees da fatura ] #region [ Prepara consulta de reembolsos da fatura ] Query qReembolsos = new Query(selectFaturaReembolsos.FirstOrDefault()["COMANDO"].Value.ToString()); Entities <EntityBase> faturaReembolsos; #endregion [ Prepara consulta de reembolsos da fatura ] Fatura fatura; response.Faturas = new List <Fatura>(); foreach (EntityBase itemFatura in faturas) { fatura = new Fatura(); fatura.CNPJCliente = itemFatura["CNPJCLIENTE"].Value.toString2(); fatura.NomeCliente = itemFatura["NOMECLIENTE"].Value.toString2(); fatura.CodigoCasablanca = itemFatura["HANDLE"].Value.toInt(); fatura.Numero = itemFatura["NUMERO"].Value.toString2(); fatura.Status = GetStatusFatura(itemFatura["STATUS"].Value.toInt()); fatura.DataCriacao = itemFatura["DATACRIACAO"].Value.toDataTime(); fatura.DataConfirmacao = itemFatura["DATAEMISSAO"].Value.toDataTime(); fatura.DataVencimento = itemFatura["DATAVENCIMENTO"].Value.toDataTime(); //Links Fatura e Boleto if (!string.IsNullOrEmpty(itemFatura["ARQUIVOFATURA"].toString2())) { fatura.LinkPDFFatura = CBUtils.MontarLinkDownload("BB_FATURAS", "ARQUIVOFATURA", itemFatura["HANDLE"].Value.toLong()); } if (!string.IsNullOrEmpty(itemFatura["ARQUIVOBOLETO"].toString2())) { fatura.LinkPDFBoleto = CBUtils.MontarLinkDownload("BB_FATURAS", "ARQUIVOBOLETO", itemFatura["HANDLE"].Value.toLong()); } #region [ Preenche reservas ] qReservas.Parameters.Clear(); qReservas.Parameters.Add(new Parameter("PFATURA", DataType.Integer, itemFatura["HANDLE"].Value.toInt())); faturaReservas = qReservas.Execute(); fatura.Reservas = new List <ItemReserva>(); fatura.Reservas.AddRange(PreencherReservasFatura(faturaReservas)); #endregion [ Preenche reservas ] #region [ Preenche fees ] qFEEs.Parameters.Clear(); qFEEs.Parameters.Add(new Parameter("PFATURA", DataType.Integer, itemFatura["HANDLE"].Value.toInt())); faturaFEEs = qFEEs.Execute(); fatura.FEEs = new List <ItemFEE>(); fatura.FEEs.AddRange(PreencherFEEsFatura(faturaFEEs)); #endregion [ Preenche fees ] #region [ Preenche reembolsos ] qReembolsos.Parameters.Clear(); qReembolsos.Parameters.Add(new Parameter("PFATURA", DataType.Integer, itemFatura["HANDLE"].Value.toInt())); faturaReembolsos = qReembolsos.Execute(); fatura.Reembolsos = new List <ItemReembolso>(); fatura.Reembolsos.AddRange(PreencherReembolsosFatura(faturaReembolsos)); #endregion [ Preenche reservas ] response.Faturas.Add(fatura); } } } return(response); } catch (Exception ex) { Logger.LogDetail(string.Format("Erro ao consultar faturas. Erro.: {0}", ex.Message)); throw new Exception(string.Format("Erro ao consultar faturas. Erro.: {0}", ex.Message)); } finally { Logger.LogDetail("Método ConsultarFaturas() - Out"); } }