Completed
Push — master ( dcb951...0b0e41 )
by Dieter
07:13
created

PricePNRWithBookingClass13::loadPointOverrides()   B

Complexity

Conditions 3
Paths 4

Size

Total Lines 28
Code Lines 15

Duplication

Lines 20
Ratio 71.43 %

Importance

Changes 1
Bugs 0 Features 0
Metric Value
dl 20
loc 28
rs 8.8571
c 1
b 0
f 0
cc 3
eloc 15
nc 4
nop 2
1
<?php
2
/**
3
 * amadeus-ws-client
4
 *
5
 * Copyright 2015 Amadeus Benelux NV
6
 *
7
 * Licensed under the Apache License, Version 2.0 (the "License");
8
 * you may not use this file except in compliance with the License.
9
 * You may obtain a copy of the License at
10
 *
11
 * http://www.apache.org/licenses/LICENSE-2.0
12
 *
13
 * Unless required by applicable law or agreed to in writing, software
14
 * distributed under the License is distributed on an "AS IS" BASIS,
15
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
16
 * See the License for the specific language governing permissions and
17
 * limitations under the License.
18
 *
19
 * @package Amadeus
20
 * @license https://opensource.org/licenses/Apache-2.0 Apache 2.0
21
 */
22
23
namespace Amadeus\Client\Struct\Fare;
24
25
use Amadeus\Client\RequestCreator\MessageVersionUnsupportedException;
26
use Amadeus\Client\RequestOptions\Fare\PricePnr\AwardPricing;
27
use Amadeus\Client\RequestOptions\Fare\PricePnr\ExemptTax;
28
use Amadeus\Client\RequestOptions\Fare\PricePnr\FareBasis;
29
use Amadeus\Client\RequestOptions\Fare\PricePnr\ObFee;
30
use Amadeus\Client\RequestOptions\Fare\PricePnr\PaxSegRef;
31
use Amadeus\Client\RequestOptions\Fare\PricePnr\Tax;
32
use Amadeus\Client\RequestOptions\FarePricePnrWithBookingClassOptions;
33
use Amadeus\Client\RequestOptions\FarePricePnrWithLowerFaresOptions as LowerFareOpt;
34
use Amadeus\Client\RequestOptions\FarePricePnrWithLowestFareOptions as LowestFareOpt;
35
use Amadeus\Client\Struct\BaseWsMessage;
36
use Amadeus\Client\Struct\Fare\PricePnr13\CarrierInformation;
37
use Amadeus\Client\Struct\Fare\PricePnr13\Currency;
38
use Amadeus\Client\Struct\Fare\PricePnr13\DateInformation;
39
use Amadeus\Client\Struct\Fare\PricePnr13\FirstCurrencyDetails;
40
use Amadeus\Client\Struct\Fare\PricePnr13\FrequentFlyerInformation;
41
use Amadeus\Client\Struct\Fare\PricePnr13\FrequentTravellerDetails;
42
use Amadeus\Client\Struct\Fare\PricePnr13\LocationInformation;
43
use Amadeus\Client\Struct\Fare\PricePnr13\OptionDetail;
44
use Amadeus\Client\Struct\Fare\PricePnr13\PaxSegTstReference;
45
use Amadeus\Client\Struct\Fare\PricePnr13\PenDisInformation;
46
use Amadeus\Client\Struct\Fare\PricePnr13\PricingOptionGroup;
47
use Amadeus\Client\Struct\Fare\PricePnr13\PricingOptionKey;
48
use Amadeus\Client\Struct\Fare\PricePnr13\TaxData;
49
use Amadeus\Client\Struct\Fare\PricePnr13\TaxInformation;
50
51
/**
52
 * Fare_PricePNRWithBookingClass v 13 and higher structure
53
 *
54
 * @package Amadeus\Client\Struct\Fare
55
 * @author dieter <[email protected]>
56
 */
57
class PricePNRWithBookingClass13 extends BaseWsMessage
58
{
59
    /**
60
     * @var PricePnr13\PricingOptionGroup[]
61
     */
62
    public $pricingOptionGroup = [];
63
64
    /**
65
     * PricePNRWithBookingClass13 constructor.
66
     *
67
     * @param FarePricePnrWithBookingClassOptions|LowerFareOpt|LowestFareOpt|null $options
68
     * @throws MessageVersionUnsupportedException
69
     */
70
    public function __construct($options)
71
    {
72
        if (!is_null($options)) {
73
            $this->pricingOptionGroup = $this->loadPricingOptionsFromRequestOptions($options);
74
        }
75
    }
76
77
    /**
78
     * Load an array of PricingOptionGroup objects from the Pricing request options.
79
     *
80
     * Extracted because this method is also used in the InformativePricingWithoutPnr messages.
81
     *
82
     * @param FarePricePnrWithBookingClassOptions|LowerFareOpt|LowestFareOpt $options
83
     * @return PricingOptionGroup[]
84
     */
85
    public static function loadPricingOptionsFromRequestOptions($options)
86
    {
87
        $priceOptions = [];
88
89
        $priceOptions = self::mergeOptions(
90
            $priceOptions,
91
            self::makePricingOptionForValidatingCarrier($options->validatingCarrier)
92
        );
93
94
        $priceOptions = self::mergeOptions(
95
            $priceOptions,
96
            self::makePricingOptionForCurrencyOverride($options->currencyOverride)
97
        );
98
99
        $priceOptions = self::mergeOptions(
100
            $priceOptions,
101
            self::makePricingOptionFareBasisOverride($options->pricingsFareBasis)
102
        );
103
104
        $priceOptions = self::mergeOptions(
105
            $priceOptions,
106
            self::makeOverrideOptions($options->overrideOptions, $priceOptions)
107
        );
108
109
        $priceOptions = self::mergeOptions(
110
            $priceOptions,
111
            self::loadCorpNegoFare($options->corporateNegoFare)
112
        );
113
114
        $priceOptions = self::mergeOptions(
115
            $priceOptions,
116
            self::loadCorpUniFares($options->corporateUniFares, $options->awardPricing)
117
        );
118
119
        $priceOptions = self::mergeOptions(
120
            $priceOptions,
121
            self::loadObFees($options->obFees, $options->obFeeRefs)
122
        );
123
124
        $priceOptions = self::mergeOptions(
125
            $priceOptions,
126
            self::loadPaxDiscount($options->paxDiscountCodes, $options->paxDiscountCodeRefs)
127
        );
128
129
        $priceOptions = self::mergeOptions(
130
            $priceOptions,
131
            self::loadPointOverrides(
132
                $options->pointOfSaleOverride,
133
                $options->pointOfTicketingOverride
134
            )
135
        );
136
137
        $priceOptions = self::mergeOptions(
138
            $priceOptions,
139
            self::loadPricingLogic($options->pricingLogic)
140
        );
141
142
        $priceOptions = self::mergeOptions(
143
            $priceOptions,
144
            self::loadTicketType($options->ticketType)
145
        );
146
147
        $priceOptions = self::mergeOptions(
148
            $priceOptions,
149
            self::loadTaxes($options->taxes)
150
        );
151
152
        $priceOptions = self::mergeOptions(
153
            $priceOptions,
154
            self::loadExemptTaxes($options->exemptTaxes)
155
        );
156
157
        $priceOptions = self::mergeOptions(
158
            $priceOptions,
159
            self::loadPastDate($options->pastDatePricing)
160
        );
161
162
        $priceOptions = self::mergeOptions(
163
            $priceOptions,
164
            self::loadReferences($options->references)
165
        );
166
167
        // All options processed, no options found:
168
        if (empty($priceOptions)) {
169
            $priceOptions[] = new PricingOptionGroup(PricingOptionKey::OPTION_NO_OPTION);
170
        }
171
172
        return $priceOptions;
173
    }
174
175
    /**
176
     * @param string[] $overrideOptions
177
     * @param PricingOptionGroup[] $priceOptions
178
     * @return PricingOptionGroup[]
179
     */
180
    protected static function makeOverrideOptions($overrideOptions, $priceOptions)
181
    {
182
        $opt = [];
183
184
        foreach ($overrideOptions as $overrideOption) {
185
            if (!self::hasPricingGroup($overrideOption, $priceOptions)) {
186
                $opt[] = new PricingOptionGroup($overrideOption);
187
            }
188
        }
189
190
        return $opt;
191
    }
192
193
    /**
194
     * @param string|null $validatingCarrier
195
     * @return PricePnr13\PricingOptionGroup[]
196
     */
197
    protected static function makePricingOptionForValidatingCarrier($validatingCarrier)
198
    {
199
        $opt = [];
200
201
        if ($validatingCarrier !== null) {
202
            $po = new PricingOptionGroup(PricingOptionKey::OPTION_VALIDATING_CARRIER);
203
204
            $po->carrierInformation = new CarrierInformation($validatingCarrier);
205
206
            $opt[] = $po;
207
        }
208
209
        return $opt;
210
    }
211
212
    /**
213
     * @param string|null $currency
214
     * @return PricePnr13\PricingOptionGroup[]
215
     */
216
    protected static function makePricingOptionForCurrencyOverride($currency)
217
    {
218
        $opt = [];
219
220
        if ($currency !== null) {
221
            $po = new PricingOptionGroup(PricingOptionKey::OPTION_FARE_CURRENCY_OVERRIDE);
222
223
            $po->currency = new Currency($currency, FirstCurrencyDetails::QUAL_CURRENCY_OVERRIDE);
224
225
            $opt[] = $po;
226
        }
227
228
        return $opt;
229
    }
230
231
    /**
232
     * @param FareBasis[] $pricingsFareBasis
233
     * @return PricePnr13\PricingOptionGroup[]
234
     */
235
    protected static function makePricingOptionFareBasisOverride($pricingsFareBasis)
236
    {
237
        $opt = [];
238
239
        if ($pricingsFareBasis !== null) {
240
            foreach ($pricingsFareBasis as $pricingFareBasis) {
241
                $po = new PricingOptionGroup(PricingOptionKey::OPTION_FARE_BASIS_SIMPLE_OVERRIDE);
242
243
                //Support for legacy fareBasisPrimaryCode to be removed when breaking BC:
244
                $po->optionDetail = new OptionDetail(
245
                    $pricingFareBasis->fareBasisPrimaryCode . $pricingFareBasis->fareBasisCode
0 ignored issues
show
Deprecated Code introduced by
The property Amadeus\Client\RequestOp...::$fareBasisPrimaryCode has been deprecated with message: put the full fare basis in $this->fareBasisCode

This property has been deprecated. The supplier of the class has supplied an explanatory message.

The explanatory message should give you some clue as to whether and when the property will be removed from the class and what other property to use instead.

Loading history...
246
                );
247
248
                //Support for legacy segmentReference to be removed when breaking BC:
249
                $po->paxSegTstReference = new PaxSegTstReference(
250
                    $pricingFareBasis->segmentReference,
0 ignored issues
show
Deprecated Code introduced by
The property Amadeus\Client\RequestOp...asis::$segmentReference has been deprecated with message: use $this->references instead

This property has been deprecated. The supplier of the class has supplied an explanatory message.

The explanatory message should give you some clue as to whether and when the property will be removed from the class and what other property to use instead.

Loading history...
251
                    $pricingFareBasis->references
252
                );
253
254
                $opt[] = $po;
255
            }
256
        }
257
258
        return $opt;
259
    }
260
261
    /**
262
     * Load corporate negofare
263
     *
264
     * @param string|null $corporateNegoFare
265
     * @return PricingOptionGroup[]
266
     */
267 View Code Duplication
    protected static function loadCorpNegoFare($corporateNegoFare)
0 ignored issues
show
Duplication introduced by
This method seems to be duplicated in your project.

Duplicated code is one of the most pungent code smells. If you need to duplicate the same code in three or more different places, we strongly encourage you to look into extracting the code into a single class or operation.

You can also find more detailed suggestions in the “Code” section of your repository.

Loading history...
268
    {
269
        $opt = [];
270
271
        if ($corporateNegoFare !== null) {
272
            $po = new PricingOptionGroup(PricingOptionKey::OPTION_CORPORATE_NEGOTIATED_FARES);
273
274
            $po->optionDetail = new OptionDetail($corporateNegoFare);
275
276
            $opt[] = $po;
277
        }
278
279
        return $opt;
280
    }
281
282
    /**
283
     * Load corporate unifares
284
     *
285
     * @param string[] $corporateUniFares
286
     * @param AwardPricing|null $awardPricing
287
     * @return PricingOptionGroup[]
288
     */
289
    protected static function loadCorpUniFares($corporateUniFares, $awardPricing)
290
    {
291
        $opt = [];
292
293
        if (!empty($corporateUniFares)) {
294
            $po = new PricingOptionGroup(PricingOptionKey::OPTION_CORPORATE_UNIFARES);
295
            $po->optionDetail = new OptionDetail($corporateUniFares);
296
            $opt[] = $po;
297
298
            if (!empty($awardPricing)) {
299
                $opt[] = self::loadAwardPricing($awardPricing);
300
            }
301
        }
302
303
        return $opt;
304
    }
305
306
    /**
307
     * @param AwardPricing $awardPricing
308
     * @return PricingOptionGroup
309
     */
310
    protected static function loadAwardPricing($awardPricing)
311
    {
312
        $po = new PricingOptionGroup(PricingOptionKey::OPTION_AWARD_PRICING);
313
314
        $po->carrierInformation = new CarrierInformation($awardPricing->carrier);
315
316
        $po->frequentFlyerInformation = new FrequentFlyerInformation();
317
        $po->frequentFlyerInformation->frequentTravellerDetails[] = new FrequentTravellerDetails(
318
            $awardPricing->tierLevel
319
        );
320
321
        return $po;
322
    }
323
324
    /**
325
     * Load OB Fees
326
     *
327
     * @param ObFee[] $obFees
328
     * @param PaxSegRef[] $obFeeRefs
329
     * @return PricingOptionGroup[]
330
     */
331 View Code Duplication
    protected static function loadObFees($obFees, $obFeeRefs)
0 ignored issues
show
Duplication introduced by
This method seems to be duplicated in your project.

Duplicated code is one of the most pungent code smells. If you need to duplicate the same code in three or more different places, we strongly encourage you to look into extracting the code into a single class or operation.

You can also find more detailed suggestions in the “Code” section of your repository.

Loading history...
332
    {
333
        $opt = [];
334
335
        if (!empty($obFees)) {
336
            $po = new PricingOptionGroup(PricingOptionKey::OPTION_OB_FEES);
337
338
            $po->penDisInformation = new PenDisInformation(
339
                PenDisInformation::QUAL_OB_FEES,
340
                $obFees
341
            );
342
343
            if (!empty($obFeeRefs)) {
344
                $po->paxSegTstReference = new PaxSegTstReference(null, $obFeeRefs);
345
            }
346
347
            $opt[] = $po;
348
        }
349
350
        return $opt;
351
    }
352
353
    /**
354
     * @param string[] $paxDiscount
355
     * @param PaxSegRef[] $paxDiscountCodeRefs
356
     * @return PricingOptionGroup[]
357
     */
358 View Code Duplication
    protected static function loadPaxDiscount($paxDiscount, $paxDiscountCodeRefs)
0 ignored issues
show
Duplication introduced by
This method seems to be duplicated in your project.

Duplicated code is one of the most pungent code smells. If you need to duplicate the same code in three or more different places, we strongly encourage you to look into extracting the code into a single class or operation.

You can also find more detailed suggestions in the “Code” section of your repository.

Loading history...
359
    {
360
        $opt = [];
361
362
        if (!empty($paxDiscount)) {
363
            $po = new PricingOptionGroup(PricingOptionKey::OPTION_PASSENGER_DISCOUNT_PTC);
364
365
            $po->penDisInformation = new PenDisInformation(
366
                PenDisInformation::QUAL_DISCOUNT,
367
                $paxDiscount
368
            );
369
370
            if (!empty($paxDiscountCodeRefs)) {
371
                $po->paxSegTstReference = new PaxSegTstReference(null, $paxDiscountCodeRefs);
372
            }
373
374
            $opt[] = $po;
375
        }
376
377
        return $opt;
378
    }
379
380
    /**
381
     * @param string|null $posOverride
382
     * @param string|null $potOverride
383
     * @return PricingOptionGroup[]
384
     */
385
    protected static function loadPointOverrides($posOverride, $potOverride)
386
    {
387
        $opt = [];
388
389 View Code Duplication
        if (!empty($posOverride)) {
0 ignored issues
show
Duplication introduced by
This code seems to be duplicated across your project.

Duplicated code is one of the most pungent code smells. If you need to duplicate the same code in three or more different places, we strongly encourage you to look into extracting the code into a single class or operation.

You can also find more detailed suggestions in the “Code” section of your repository.

Loading history...
390
            $po = new PricingOptionGroup(PricingOptionKey::OPTION_POINT_OF_SALE_OVERRIDE);
391
392
            $po->locationInformation = new LocationInformation(
393
                LocationInformation::TYPE_POINT_OF_SALE,
394
                $posOverride
395
            );
396
397
            $opt[] = $po;
398
        }
399
400 View Code Duplication
        if (!empty($potOverride)) {
0 ignored issues
show
Duplication introduced by
This code seems to be duplicated across your project.

Duplicated code is one of the most pungent code smells. If you need to duplicate the same code in three or more different places, we strongly encourage you to look into extracting the code into a single class or operation.

You can also find more detailed suggestions in the “Code” section of your repository.

Loading history...
401
            $po2 = new PricingOptionGroup(PricingOptionKey::OPTION_POINT_OF_TICKETING_OVERRIDE);
402
403
            $po2->locationInformation = new LocationInformation(
404
                LocationInformation::TYPE_POINT_OF_TICKETING,
405
                $potOverride
406
            );
407
408
            $opt[] = $po2;
409
        }
410
411
        return $opt;
412
    }
413
414
    /**
415
     * @param string|null $pricingLogic
416
     * @return PricingOptionGroup[]
417
     */
418 View Code Duplication
    protected static function loadPricingLogic($pricingLogic)
0 ignored issues
show
Duplication introduced by
This method seems to be duplicated in your project.

Duplicated code is one of the most pungent code smells. If you need to duplicate the same code in three or more different places, we strongly encourage you to look into extracting the code into a single class or operation.

You can also find more detailed suggestions in the “Code” section of your repository.

Loading history...
419
    {
420
        $opt = [];
421
422
        if (!empty($pricingLogic)) {
423
            $po = new PricingOptionGroup(PricingOptionKey::OPTION_PRICING_LOGIC);
424
            $po->optionDetail = new OptionDetail($pricingLogic);
425
            $opt[] = $po;
426
        }
427
428
        return $opt;
429
    }
430
431
    /**
432
     * @param string|null $ticketType
433
     * @return PricingOptionGroup[]
434
     */
435 View Code Duplication
    protected static function loadTicketType($ticketType)
0 ignored issues
show
Duplication introduced by
This method seems to be duplicated in your project.

Duplicated code is one of the most pungent code smells. If you need to duplicate the same code in three or more different places, we strongly encourage you to look into extracting the code into a single class or operation.

You can also find more detailed suggestions in the “Code” section of your repository.

Loading history...
436
    {
437
        $opt = [];
438
439
        if (!empty($ticketType)) {
440
            $po = new PricingOptionGroup(PricingOptionKey::OPTION_TICKET_TYPE);
441
442
            $po->optionDetail = new OptionDetail($ticketType);
443
444
            $opt[] = $po;
445
        }
446
447
        return $opt;
448
    }
449
450
    /**
451
     * @param Tax[] $taxes
452
     * @return PricingOptionGroup[]
453
     */
454
    protected static function loadTaxes($taxes)
455
    {
456
        $opt = [];
457
458
        if (!empty($taxes)) {
459
            $po = new PricingOptionGroup(PricingOptionKey::OPTION_ADD_TAX);
460
461
            foreach ($taxes as $tax) {
462
                $qualifier = (!empty($tax->amount)) ? TaxData::QUALIFIER_AMOUNT : TaxData::QUALIFIER_PERCENTAGE;
463
                $rate = (!empty($tax->amount)) ? $tax->amount : $tax->percentage;
464
465
                $po->taxInformation[] = new TaxInformation(
466
                    $tax->countryCode,
467
                    $tax->taxNature,
468
                    $qualifier,
469
                    $rate
470
                );
471
            }
472
            $opt[] = $po;
473
        }
474
475
        return $opt;
476
    }
477
478
    /**
479
     * @param ExemptTax[] $exemptTaxes
480
     * @return PricingOptionGroup[]
481
     */
482
    protected static function loadExemptTaxes($exemptTaxes)
483
    {
484
        $opt = [];
485
486
        if (!empty($exemptTaxes)) {
487
            $po = new PricingOptionGroup(PricingOptionKey::OPTION_EXEMPT_FROM_TAX);
488
489
            foreach ($exemptTaxes as $tax) {
490
                $po->taxInformation[] = new TaxInformation(
491
                    $tax->countryCode,
492
                    $tax->taxNature
493
                );
494
            }
495
496
            $opt[] = $po;
497
        }
498
499
        return $opt;
500
    }
501
502
    /**
503
     * @param \DateTime|null $pastDate
504
     * @return PricingOptionGroup[]
505
     */
506
    protected static function loadPastDate($pastDate)
507
    {
508
        $opt = [];
509
510
        if ($pastDate instanceof \DateTime) {
511
            $po = new PricingOptionGroup(PricingOptionKey::OPTION_PAST_DATE_PRICING);
512
513
            $po->dateInformation = new DateInformation(
514
                DateInformation::OPT_DATE_OVERRIDE,
515
                $pastDate
516
            );
517
518
            $opt[] = $po;
519
        }
520
521
        return $opt;
522
    }
523
524
    /**
525
     * @param PaxSegRef[] $references
526
     * @return PricingOptionGroup[]
527
     */
528
    protected static function loadReferences($references)
529
    {
530
        $opt = [];
531
532 View Code Duplication
        if (!empty($references)) {
0 ignored issues
show
Duplication introduced by
This code seems to be duplicated across your project.

Duplicated code is one of the most pungent code smells. If you need to duplicate the same code in three or more different places, we strongly encourage you to look into extracting the code into a single class or operation.

You can also find more detailed suggestions in the “Code” section of your repository.

Loading history...
533
            $po = new PricingOptionGroup(PricingOptionKey::OPTION_PAX_SEGMENT_TST_SELECTION);
534
535
            $po->paxSegTstReference = new PaxSegTstReference(null, $references);
536
537
            $opt[] = $po;
538
        }
539
540
        return $opt;
541
    }
542
543
    /**
544
     * Avoid double pricing groups when combining an explicitly provided override option with a specific parameter
545
     * that uses the same override option.
546
     *
547
     * Backwards compatibility with PricePnrWithBookingClass12
548
     *
549
     * @param string $optionKey
550
     * @param PricingOptionGroup[] $priceOptions
551
     * @return bool
552
     */
553
    protected static function hasPricingGroup($optionKey, $priceOptions)
554
    {
555
        $found = false;
556
557
        foreach ($priceOptions as $pog) {
558
            if ($pog->pricingOptionKey->pricingOptionKey === $optionKey) {
559
                $found = true;
560
            }
561
        }
562
563
        return $found;
564
    }
565
566
    /**
567
     * Merges Pricing options
568
     *
569
     * @param PricingOptionGroup[] $existingOptions
570
     * @param PricingOptionGroup[] $newOptions
571
     * @return PricingOptionGroup[] merged array
572
     */
573
    protected static function mergeOptions($existingOptions, $newOptions)
574
    {
575
        if (!empty($newOptions)) {
576
            $existingOptions = array_merge(
577
                $existingOptions,
578
                $newOptions
579
            );
580
        }
581
582
        return $existingOptions;
583
    }
584
}
585