Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- use strict;
- use warnings;
- package TFX::Flight::Conex;
- use Moose;
- use MooseX::HasDefaults::RO;
- use List::Util qw( min reduce );
- use lib '../..';
- use TFX::Flight::Conex::LegAccessors;
- use TFX::Flight::Conex::Leg;
- extends 'TFX::Flight';
- has [qw( itinerary half_return )] => ( isa => 'HashRef', required => 1 );
- has [qw(
- operator flight_type flight_sequence min_advance_days flight_tariff flight_kind seat_count special_code
- price_two_way direction rate1_type rate1_min_age rate1_max_age rate1_price rate2_type rate2_min_age
- rate2_max_age rate2_price rate3_type rate3_min_age rate3_max_age rate3_price
- )] => ( isa => 'Any' );
- has legs => ( isa => 'ArrayRef', lazy_build => 1 );
- sub _build_table_name { "OWF" }
- sub _build_data_type { "F" }
- sub _build_version { "3.0" }
- sub _build_via_codes {
- my ( $self ) = @_;
- my ( undef, @additional_legs ) = @{$self->legs};
- return if !@additional_legs;
- my @via_codes = map { $_->depart_code } @additional_legs;
- return join ',', @via_codes;
- }
- sub _build_currency { $_[0]->price->{currencyIsoCode} }
- sub _build_price_one_way { $_[0]->price->{value} }
- sub _build_combination_id { $_[0]->air_rule_set->{openJawCombinationGroup}{name} }
- sub _build_season_surcharge {
- my ( $self ) = @_;
- my $tax_list = $self->half_return->{taxQuoteList}[0]{taxList};
- my @taxes = values %{$tax_list};
- no warnings 'once';
- return reduce { $a + $b->{price}{value} } 0, @taxes;
- }
- sub _build_duration_rules {
- my ( $self ) = @_;
- my @rules = map $self->convert_duration( $_ ), qw( minimumStay maximumStay );
- my $sunday_rule = $self->air_rule_set->{minimumStay}{sundayRule};
- push @rules, 'SUN' if $sunday_rule and $sunday_rule eq 'true';
- return join ',', @rules;
- }
- sub _build_flight_class {
- my ( $self ) = @_;
- my $class_id = $self->air_rule_set->{cabinClass}{id};
- my %classes = (
- CAB_ECONOMY => 'Y',
- CAB_BUSINESS => 'C',
- );
- return $classes{$class_id} || die "Unknown class id: $class_id";
- }
- # helpers
- sub _build_legs {
- my ( $self ) = @_;
- my @legs = @{ $self->itinerary->{segmentList} };
- @legs = map TFX::Flight::Conex::Leg->new( raw => $_ ), @legs;
- return \@legs;
- }
- sub leg { $_[0]->legs->[$_[1]] || TFX::Flight::Conex::Leg->new( raw => {} ) }
- sub air_rule_set { $_[0]->half_return->{airRuleSet} }
- sub price { $_[0]->half_return->{farePassengerTypePriceList}[0]{purchasePrice} }
- sub convert_duration {
- my ( $self, $type ) = @_;
- my $duration = $self->air_rule_set->{$type};
- die "duration type missing: '$type'" if !$duration;
- my $prefix = $self->get_duration_rule_prefix( $type );
- $duration->{value} = min( $duration->{value}, 99 );
- return $prefix . "99" if $duration->{value} > 3 and $duration->{unit}{id} eq 'STU_MONTHS';
- return $prefix . "99" if $duration->{value} >= 1 and $duration->{unit}{id} eq 'STU_YEARS';
- return sprintf( "%s%02d", $prefix, $duration->{value} ) if $duration->{unit}{id} eq 'STU_DAYS';
- return sprintf( "%s%02d", $prefix, $duration->{value} * 30 ) if $duration->{unit}{id} eq 'STU_MONTHS';
- die "unknown duration unit id '$duration->{unit}{id}' with value '$duration->{value}'";
- }
- sub get_duration_rule_prefix {
- my ( $self, $type ) = @_;
- return 'A' if $type eq 'minimumStay';
- return 'B' if $type eq 'maximumStay';
- die "unknown duration type";
- }
- 1;
Add Comment
Please, Sign In to add comment