Busca de vôos

Conceitos do TripApi relacionados a busca de vôos

Uma busca de vôos no TripApi é iniciada chamando o método Search.

Todos os métodos no TripApi obedecem o padrão de envelopes para envio de informações e recebimento de resultados, portanto, tanto no método de busca, como em todos os outros você notará o padrão "Action"RQ e "Action"RS. No exemplo temos na busca de vôo como único paramêtro de entrada o SearchRQ e como resultado o SearchRS.



SearchRQ

É o objeto passado como parâmetro da chamada Rest e contém todas os parâmetros possíveis de busca. Para fins da chamada , analisamos somente o AirParameters.

PropriedadeDescrição
AirParameters
TravellersLista do objeto TravelBasicInfo, que contém informações dos passageiros a serem pesquisados (cada item da lista representa um tipo de passageiro a ser considerado na busca)

AirSearchParameters

Representa os parâmetros para uma busca de aéreo como um todo, não especificamente para um CityPair

PropriedadeDescrição
CityPairRequestsContém uma lista de objetos do tipo CityPairRequest
BaggageAlowanceEnum do tipo BaggageAllowance Enumerations. Tipos possíveis: Indifferent, WithBaggage, WithoutBaggage.
Informa se a busca deve filtrar apenas opções de voos com tarifas que ofereçam ao menos uma bagagem despachada, somente opções de voos sem bagagem ou se não é necessário aplicar o filtro.
OnlyDirectFlightsBooleano indicando se para a busca como um todo devemos buscar somente voos diretos
SearchTypeDefine o tipo do retorna da busca. Consultar mais em Entidades comuns

CityPairRequest

Um CityPair representa um par de cidades, um city pair denota um ponto de saída e chegada final, representando exatamente o que foi buscado pelo usuário. A classe CityPairRequest é apenas um CityPair especializado e resumido para o envio de parâmetros de busca.

Para indicar as origens e destinos de pesquisa, assim como no retorno do resultado de busca são utilizados os códigos IATA de aeroporto, veja mais em Codigo IATA

Note que como filtro de busca o usuário final envia uma lista de CityPairsRequest, que pode representar uma busca somente ida(somente um CPR), uma ida e volta(dois CPRs) ou uma busca multi-trecho (diversos CPRs).

Temos então que em uma busca somente ida, o código de chamada do serviço deve enviar um array, com somente 1 elemento, que representa o trecho(CityPair) que o usuário quer buscar, por exemplo: Quero um voo de São Paulo para Brasilia, no dia 10/05/2024, neste caso teríamos um array de CPR como esse:

var cprs = new List<CityPairRequest> {
	new CityPairRequest()
	{
		OriginIata = "SAO",
		DestinationIata = "BSB",
		DepartureDate = "2024-05-10"
	}
}

Já em uma pesquisa IDA e VOLTA onde o usuário queira representar uma viagem São Paulo para Brasilia, indo dia 10/05/2024 e voltando 15/05/2024, teríamos que:

var cprs = new List<CityPairRequest> {
	new CityPairRequest()
	{
		OriginIata = "SAO",
		DestinationIata = "BSB",
		DepartureDate = "2024-05-10"
	},
	new CityPairRequest()
	{
		OriginIata = "BSB",
		DestinationIata = "SAO",
		DepartureDate = "2024-05-15"
	}
}

Temos então que não existe um tipo específico de busca(somente ida, ida e volta, e multi-trechos), todas as informações necessárias para inferir o tipo de busca esta nos dados do próprio array. No caso acima, podemos concluir que a busca é ida e volta pois o destino do CPR-1 é igual a origem do CPR - 0, ou seja CPR[1].DestinationIata == CPR[0].OriginIata. (SideNote: Na verdade a lógica não é tão simples quanto comparar uma string, dentro das rotinas de tratamento do TripApi, uma vez que a viagem pode partir do aeroporto de congonhas(CHG) e na volta, voltar para o aeroporto de guarulhos(GRU), mas no final das contas é quase igual a isso, mas no nível da cidade)

A distinção do tipo específico de busca é importante pois dentro do core e para alguns SupplierSystems conectados a ferramenta, existem tarifas promocionais ida e volta, e o conceito também é importante assimilar pois os termos “viagens OneWay/Somente Ida/OW” e “RoundTrip/Ida e Volta/RT” são muito usado nos sistemas de turismo.

Finalmente temos uma busca MultiTrecho, que não necessariamente é somente uma busca com mais de 2 CityPairs, mas também pode ser uma busca com 2(dois) CPRs onde o destino do segundo não é igual a origem do primeiro. Por exemplo: Tenho uma reunião em Brasilia no dia 10/05/2024 e na sequência outra em Goiania no dia 11/05/2024 e depois volto para São Paulo:

var cprs = new List<CityPairRequest> {
	new CityPairRequest()
	{
		OriginIata = "SAO",
		DestinationIata = "BSB",
		DepartureDate = "2024-05-10"
	},
  new CityPairRequest()
	{
		OriginIata = "BSB",
		DestinationIata = "GYN",
		DepartureDate = "2024-05-11"
	},
	new CityPairRequest()
	{
		OriginIata = "GYN",
		DestinationIata = "SAO",
		DepartureDate = "2024-05-11"
	}
}
PropriedadeDescrição
OriginIATACódigo IATA do aeroporto ou cidade de origem. Ex: GRU, MIA, POA
DestinationIATACódigo IATA do aeroporto ou cidade de destino.
DepartureDateData de saída desejado para este CityPair
AirCompanyCodesOpcional: Filtro com as cias aéreas para este CityPair: ex: new string[] { “JJ, “G3” }
TimeWindowOpcional: Range de horários para filtrar somente os voos contidos neste Range: ex: new Range(7,10). Buscando vôos somente das 7 as 10 horas da manhã.
Cabinenum Cabin

SearchRs

É o objeto root que representa um retorno de busca.

PropriedadeDescrição
AirResponseDataObjeto que contém todos dados de retorno de busca
SearchExecutionInformationsLista de objetos SearchExecutionInformations que contém os tempos de execução de cada source.
TravellersLista dos passageiros buscados (retorna a mesma lista enviada no request)

AirResponseData

PropriedadeDescrição
AirResponseDataObjeto que contém todos dados de retorno de busca

SearchExecutionInformations

PropriedadeDescrição
SupplierSystemstring: Nome do SupplierSystem
TotalSupplierSearchTimedouble: Tempo total da busca contanto o tempo de chamada e processamento e parse do resultado no servidor do TripApi
WaitingSupplierTimedouble: Tempo decorrido da chamada da busca para o fornecedor até o recebimento do pacote completo.

AirSearchResponseData

O objeto AirSearchResponseData contém propriedades para representar um resultado de busca de voos. O preenchimento das propriedades pode variar de acordo com o tipo de busca sendo efetuado.

Com o objetivo de comprimir logicamente os dados da resposta e tornar o resultado menor, antes da compressão algorítmica, dicionários de objetos FlightGroups e AirCompanies são retornados no root do objeto. Desta forma, outros objetos que fazem referencia a objetos FlightGroups e AirCompanies no resultado, são representados apenas pelo número da referência.

Note que, por exemplo, a definição do objeto FlightOption contém uma lista FlightGroupIndex. Na verdade um FlightOption tem uma lista de FlightGroups, no entanto, na preparação do resultado os FlightGroups são convertidos unicamente em um dicionário e as referencias para cada uma das instancias deles são trocadas para um número da lista de FlightGroupIndex.

PropriedadeDisponibilidadeDescrição
PriceMatrixEm todos os tipos de buscasObjeto que contém em propriedades as informações suficientes para representar a matriz de informações da imagem “PriceMatrix” abaixo.
CityPairsSomente em buscas "ByCityPairs" ver mais em EnumerationsLista de CityPairs representando o resultado de cada CityPairRequest buscado. Cada CityPair terá uma lista de FlightOptions parciais
FlightsOptionsSomente em buscas "ByRecommendations" ou "ByFlightGroup" ver mais em EnumerationsLista de objetos FlightOptions(Full) com todas as opções de viagens, já combinadas com todos os trechos buscados.
FlightGroupsObrigatórioDicionário indexado por um ID crescente de FlightGroups que é referenciado em outros objetos

PriceMatrix


//Código inicializando somente a coluna da Gol
var priceMatrix = new PriceMatrix() {
	AirCompanies = new List<PriceMatrixAirCompany>()
	{
		new PriceMatrixCompany() {
			AirCompanyCode = "G3",
			Cells = new List<PriceMatrixCell>()
			{
				new PriceMatrixcell()
				{
					Price = 618,
					NumberOfStops = NumberOfStops.NonStop
				},
				new PriceMatrixcell()
				{
					Price = 853,
					NumberOfStops = NumberOfStops.TwoOrMore
				}
			}
		}
	}
}

CityPair

Assim como o CityPairRequest enviado no request da busca, o CityPair da resposta representa cada trecho buscado e contém informações dos FlightOptions relacionados com a busca de cada trecho.

Nos objetos CityPair do resultado de busca, a propriedade mais importante preenchida é a lista de FlightOptions.

PropriedadeDescrição
FlightOptionsLista de FlightOptions contendo as opções de viagem para este CityPair.
OriginIATAIata de origem deste CityPair, deve ser igual ao iata de origem do CityPairRequest de mesmo índice buscado.
DestinationIATAIata de destino deste CityPair, deve ser igual ao iata de destino do CityPairRequest de mesmo índice buscado.

FlightOption

O FlightOption é talvez a classe mais importante a ser compreendida no modelo de objetos de um resultado de busca, ele representa uma opção de escolha de viagem e pode ser implicitamente “Partial” ou “Full” (Não é necessário ter uma propriedade explicita informando esta característica já que o contexto de onde o objeto esta sendo lido infere esta informação).

FlightOption Partial

É um FlightOption que não contém todos os FlightGroups correspondentes a todos os CityPairRequests buscados. Isso porque, seja pela seleção do usuário(na busca ByCityPair) ou pelo blender(internamente no TripApi), ele será combinado para formar uma viagem completa. Por exemplo: Na busca ByCityPair, cada CityPair de resultado contém uma lista de FlightOptions parciais, somente com um FlightGroup cada um pois será na interface que o usuário selecionará a ida e volta que deseja.

Pode-se dizer que um FlightOption partial sempre deseja se tornar um FlightOption full, em algum ponto da jornada de combinação de FlightOptions ou na jornada de seleção de um usuário.

FlightOption Full

É um FlightOption cujo o número de FlightGroups é igual ao número de CityPairsRequest buscado. Exemplo: A lista de FlightOptions retornada no objeto AirResponseData na propriedade FlightOptions quando uma busca ByFlightOptions é efetuada.

Preço de um FlightOption

Você vai reparar que não existe uma propriedade preço no objeto FlightOption, isso acontece porque um FlightOption, desde o momento da busca tem vários preços possíveis, em classes tarifárias diferentes, preços mais baratos são mais baixos mas por outro lado oferecem tarifas com muita restrição e multas para reembolso e remarcação, preços mais caros são maiores mas são mais atrativos do ponto de vista de flexibilidade e multas menores ou nenhuma para reembolso e remarcação.

O preço padrão de um FlightOption é o BrandedFare com o preço ADT mais baixo.

PropriedadeDescrição
FlightGroupsLista de objetos do tipo FlightGroups que representam todos os trechos deste FlightOption
BrandedFaresLista de objetos do tipo BrandedFare que representam todos preços possíveis de um FlightOption
FlightGroupIndexesLista de inteiros contendo os indices dos FlightGroups deste FlightOption. Esta propriedade é de certa forma uma duplicação da propriedade FlightGroups, mas tem o objetivo de comprimir logicamente o resultado.

O core do TripApi antes de retornar uma busca, passa por todas as referências de FlightGroups nos FlightOptions e seta elas para null e preenche esta lista de indices apontando para o dicionário global de FlightGroups que pertence ao escopo do resultado de busca.

BrandedFare

Representa uma tarifa nomeada disponibilizada para um FlightOption. Como citado um FlightOption pode possuir uma lista de BrandedFares, de acordo com a disponibilidade das tarifas do vôo.

Exemplo de BrandedFare:

Na imagem acima do site da Latam, temos um FlightOption(parcial) com um FlightGroup com somente um voo direto entre Gru e Poa. Na imagem vemos 4 BrandedFares: Light, Plus, Top e Plus (Premium Economy).

PropriedadeDescrição
ADTAmountObjeto que representa um total com taxas, com o valor deste BrandedFare para um Adulto, somente aplicável quando a busca foi feita considerando pelo menos um Adulto.
CHDAmountObjeto que representa um total com taxas, com o valor deste BrandedFare para uma Criança, somente aplicável quando a busca foi feita considerando pelo menos um Criança.
INFAmountObjeto que representa um total com taxas, com o valor deste BrandedFare para um Infant, somente aplicável quando a busca foi feita considerando pelo menos um Infant.
BrandedFareNameNome das famílias tarifárias . No caso do exemplo acima: Light, Plus, Top, etc…
Pode conter mais de um nome quando temos combinações de tarifas entre os voos, por exemplo, o voo de ida pode ser na Light e o da volta na Plus.
FaresByFlightGroupÉ um array paralelo com array de FlightGroups. Ou seja, dentro de um FlightOption, o Fare[i] está relacionado com o FlightGroup[i]. Este array contém informações específicas da tarifa de cada FlightGroup. Se fazendo necessário pois é possível combinar diferentes tarifas para diferentes voos. Por exemplo, o voo de ida pode ser na Light e o da volta na Plus.

Fare

PropriedadeDescrição
FlightClassesUm array que corre em paralelo com os Flights do FlightGroup relacionado ao BrandedFare.Armazena quais são os códigos de classe para cada voo, que é necessário enviar para a reserva para conseguir a tarifa especificada no BrandedFare aponta para este Fare
BrandedFareNameInforma o nome da família tarifária da cia aérea correspondente ao flight group.
BaggagesIncludedInforma o nome da família tarifária da cia aérea correspondente ao flight group.
CabinTypesInforma qual a quantidade de bagagens despachadas contempladas por essa tarifa. Quando esse campo for null, significa que a cia aérea não retornou esse informação.
SupplierSystemNome do SupplierSystem que originou este Fare.
AggreementCode

BrandedFareAmount

Representa basicamente um valor. No entanto, como quase todos os valores no turismo são acompanhados com taxas, esta classe encapsula todos os campos padrões.

PropriedadeDescrição
OriginalFarePreço da tarifa sem taxas e na moeda original
FarePreço da tarifa sem taxas, convertido para a moeda padrão configurada para o SystemAccount.
TaxesTotal de taxas na moeda do SystemAccount.
DuTaxesTotal de taxas DU na moeda do SystemAccount.