Guest User

Untitled

a guest
Jul 15th, 2018
81
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 3.33 KB | None | 0 0
  1. use strict;
  2. use warnings;
  3.  
  4. package TFX::Flight::Conex;
  5.  
  6. use Moose;
  7. use MooseX::HasDefaults::RO;
  8.  
  9. use List::Util qw( min reduce );
  10.  
  11. use lib '../..';
  12. use TFX::Flight::Conex::LegAccessors;
  13. use TFX::Flight::Conex::Leg;
  14.  
  15.  
  16. extends 'TFX::Flight';
  17.  
  18. has [qw( itinerary half_return )] => ( isa => 'HashRef', required => 1 );
  19.  
  20. has [qw(
  21. operator flight_type flight_sequence min_advance_days flight_tariff flight_kind seat_count special_code
  22. price_two_way direction rate1_type rate1_min_age rate1_max_age rate1_price rate2_type rate2_min_age
  23. rate2_max_age rate2_price rate3_type rate3_min_age rate3_max_age rate3_price
  24. )] => ( isa => 'Any' );
  25.  
  26. has legs => ( isa => 'ArrayRef', lazy_build => 1 );
  27.  
  28. sub _build_table_name { "OWF" }
  29. sub _build_data_type { "F" }
  30. sub _build_version { "3.0" }
  31.  
  32. sub _build_via_codes {
  33. my ( $self ) = @_;
  34.  
  35. my ( undef, @additional_legs ) = @{$self->legs};
  36. return if !@additional_legs;
  37.  
  38. my @via_codes = map { $_->depart_code } @additional_legs;
  39. return join ',', @via_codes;
  40. }
  41.  
  42. sub _build_currency { $_[0]->price->{currencyIsoCode} }
  43. sub _build_price_one_way { $_[0]->price->{value} }
  44. sub _build_combination_id { $_[0]->air_rule_set->{openJawCombinationGroup}{name} }
  45.  
  46. sub _build_season_surcharge {
  47. my ( $self ) = @_;
  48.  
  49. my $tax_list = $self->half_return->{taxQuoteList}[0]{taxList};
  50. my @taxes = values %{$tax_list};
  51.  
  52. no warnings 'once';
  53. return reduce { $a + $b->{price}{value} } 0, @taxes;
  54. }
  55.  
  56. sub _build_duration_rules {
  57. my ( $self ) = @_;
  58.  
  59. my @rules = map $self->convert_duration( $_ ), qw( minimumStay maximumStay );
  60.  
  61. my $sunday_rule = $self->air_rule_set->{minimumStay}{sundayRule};
  62. push @rules, 'SUN' if $sunday_rule and $sunday_rule eq 'true';
  63.  
  64. return join ',', @rules;
  65. }
  66.  
  67. sub _build_flight_class {
  68. my ( $self ) = @_;
  69.  
  70. my $class_id = $self->air_rule_set->{cabinClass}{id};
  71.  
  72. my %classes = (
  73. CAB_ECONOMY => 'Y',
  74. CAB_BUSINESS => 'C',
  75. );
  76.  
  77. return $classes{$class_id} || die "Unknown class id: $class_id";
  78. }
  79.  
  80. # helpers
  81.  
  82. sub _build_legs {
  83. my ( $self ) = @_;
  84. my @legs = @{ $self->itinerary->{segmentList} };
  85. @legs = map TFX::Flight::Conex::Leg->new( raw => $_ ), @legs;
  86. return \@legs;
  87. }
  88.  
  89. sub leg { $_[0]->legs->[$_[1]] || TFX::Flight::Conex::Leg->new( raw => {} ) }
  90.  
  91. sub air_rule_set { $_[0]->half_return->{airRuleSet} }
  92.  
  93. sub price { $_[0]->half_return->{farePassengerTypePriceList}[0]{purchasePrice} }
  94.  
  95. sub convert_duration {
  96. my ( $self, $type ) = @_;
  97.  
  98. my $duration = $self->air_rule_set->{$type};
  99. die "duration type missing: '$type'" if !$duration;
  100.  
  101. my $prefix = $self->get_duration_rule_prefix( $type );
  102. $duration->{value} = min( $duration->{value}, 99 );
  103.  
  104. return $prefix . "99" if $duration->{value} > 3 and $duration->{unit}{id} eq 'STU_MONTHS';
  105. return $prefix . "99" if $duration->{value} >= 1 and $duration->{unit}{id} eq 'STU_YEARS';
  106.  
  107. return sprintf( "%s%02d", $prefix, $duration->{value} ) if $duration->{unit}{id} eq 'STU_DAYS';
  108. return sprintf( "%s%02d", $prefix, $duration->{value} * 30 ) if $duration->{unit}{id} eq 'STU_MONTHS';
  109.  
  110. die "unknown duration unit id '$duration->{unit}{id}' with value '$duration->{value}'";
  111. }
  112.  
  113. sub get_duration_rule_prefix {
  114. my ( $self, $type ) = @_;
  115. return 'A' if $type eq 'minimumStay';
  116. return 'B' if $type eq 'maximumStay';
  117. die "unknown duration type";
  118. }
  119.  
  120. 1;
Add Comment
Please, Sign In to add comment