Passed
Push — master ( 404d2e...7c59da )
by Dieter
04:40
created

makeSegmentNameForRequestElement()   B

Complexity

Conditions 8
Paths 13

Size

Total Lines 53

Duplication

Lines 0
Ratio 0 %

Code Coverage

Tests 10
CRAP Score 8

Importance

Changes 0
Metric Value
dl 0
loc 53
ccs 10
cts 10
cp 1
rs 7.781
c 0
b 0
f 0
cc 8
nc 13
nop 2
crap 8

How to fix   Long Method   

Long Method

Small methods make your code easier to understand, in particular if combined with a good name. Besides, if your method is small, finding a good name is usually much easier.

For example, if you find yourself adding comments to a method's body, this is usually a good sign to extract the commented part to a new method, and use the comment as a starting point when coming up with a good name for this new method.

Commonly applied refactorings include:

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\Pnr\AddMultiElements;
24
25
use Amadeus\Client\RequestOptions\Pnr\Element;
26
use Amadeus\Client\Struct\InvalidArgumentException;
27
use Amadeus\Client\Struct\WsMessageUtility;
28
29
/**
30
 * DataElementsIndiv
31
 *
32
 * all the others segments
33
 *
34
 * @package Amadeus\Client\Struct\Pnr\AddMultiElements
35
 * @author Dieter Devlieghere <[email protected]>
36
 */
37
class DataElementsIndiv extends WsMessageUtility
38
{
39
    /**
40
     * To specify the PNR segments/elements references and action to apply
41
     *
42
     * @var ElementManagementData
43
     */
44
    public $elementManagementData;
45
    public $pnrSecurity;
46
    /**
47
     * @var Accounting
48
     */
49
    public $accounting;
50
    /**
51
     * To specify different kinds of remarks
52
     *
53
     * @var MiscellaneousRemark
54
     */
55
    public $miscellaneousRemark;
56
    /**
57
     * @var ServiceRequest
58
     */
59
    public $serviceRequest;
60
    public $dateAndTimeInformation;
61
    /**
62
     * @var TourCode
63
     */
64
    public $tourCode;
65
    /**
66
     * To specify an Amadeus PNR Ticket element
67
     *
68
     * @var TicketElement
69
     */
70
    public $ticketElement;
71
    /**
72
     * To provide free form or coded long text information.
73
     *
74
     * @var FreetextData
75
     */
76
    public $freetextData;
77
    /**
78
     * @var StructuredAddress
79
     */
80
    public $structuredAddress;
81
    public $optionElement;
82
    public $printer;
83
    /**
84
     * This group handles Seat Request with possibly rail preferences
85
     *
86
     * @var SeatGroup
87
     */
88
    public $seatGroup;
89
    public $entity;
90
    public $fareElement;
91
    public $fareDiscount;
92
    public $manualFareDocument;
93
    /**
94
     * @var Commission
95
     */
96
    public $commission;
97
    public $originalIssue;
98
    /**
99
     * To convey details describing the form of payment
100
     *
101
     * @var FormOfPayment
102
     */
103
    public $formOfPayment;
104
    /**
105
     * To convey additional details of the form of payment
106
     *
107
     * @var FopExtension[]
108
     */
109
    public $fopExtension = [];
110
    /**
111
     * To convey:
112
     * - The FOP service details
113
     * - The Corporate Security option for Remarks
114
     * - The Timestamp indicator for Remarks
115
     *
116
     * @var ServiceDetails[]
117
     */
118
    public $serviceDetails = [];
119
    public $frequentTravellerVerification;
120
    public $ticketingCarrier;
121
    public $farePrintOverride;
122
    /**
123
     * Frequent Flyer info
124
     *
125
     * @var FrequentTravellerData
126
     */
127
    public $frequentTravellerData;
128
    public $accessLevel;
129
    /**
130
     * To provide specific reference identification
131
     *
132
     * @var ReferenceForDataElement
133
     */
134
    public $referenceForDataElement;
135
136
    /**
137
     * @param Element|string $element Either an element or an element name
138
     * @param int $tattoo Unique tattoo number for this element
139
     * @throws \ReflectionException
140
     */
141 200
    public function __construct($element, $tattoo)
142
    {
143 200
        if ($element instanceof Element) {
144 200
            $reflect = new \ReflectionClass($element);
145 200
            $elementType = $reflect->getShortName();
146
147 200
            $this->elementManagementData = new ElementManagementData(
148 200
                $this->makeSegmentNameForRequestElement($elementType, $element),
149 80
                $tattoo
150 80
            );
151
152 200
            $this->loadElement($element, $elementType);
153 79
        } elseif (is_string($element)) {
154 5
            $this->elementManagementData = new ElementManagementData(
155 5
                $element,
156 2
                $tattoo
157 2
            );
158 2
        }
159 190
    }
160
161
    /**
162
     * @param Element $element
163
     * @param string $elementType
164
     */
165 200
    protected function loadElement($element, $elementType)
166
    {
167 80
        switch ($elementType) {
168 200
            case 'Contact':
169
                /** @var Element\Contact $element */
170 30
                $this->freetextData = new FreetextData(
171 30
                    $element->value,
172 30
                    $element->type
173 12
                );
174 30
                break;
175 200
            case 'FormOfPayment':
176
                /** @var Element\FormOfPayment $element */
177 30
                $this->formOfPayment = new FormOfPayment($element->type);
178 30
                if ($element->type === Fop::IDENT_CREDITCARD) {
179 10
                    $this->formOfPayment->fop->creditCardCode = $element->creditCardType;
180 10
                    $this->formOfPayment->fop->accountNumber = $element->creditCardNumber;
181 10
                    $this->formOfPayment->fop->expiryDate = $element->creditCardExpiry;
182 10
                    if ($element->freeText && $element->freeText != "") {
183 10
                        $this->formOfPayment->fop->freetext = $element->freeText;
184 10
                    }
185 10
                    if ($this->checkAnyNotEmpty($element->creditCardCvcCode, $element->creditCardHolder)) {
186 10
                        $this->fopExtension[] = new FopExtension(
187 4
                            1,
188 4
                            $element->creditCardCvcCode,
189 24
                            $element->creditCardHolder
190 5
                        );
191 17
                    }
192 5
                } elseif ($element->type === Fop::IDENT_CASH && $element->freeText != "") {
193 12
                    $this->formOfPayment->fop->freetext = $element->freeText;
194 5
                } elseif ($element->type === Fop::IDENT_MISC && $element->freeText != "NONREF") {
195
                    $this->formOfPayment->fop->freetext = $element->freeText;
196
                } elseif ($element->type === Fop::IDENT_MISC && $element->freeText === "NONREF") {
197 25
                    $this->fopExtension[] = new FopExtension(1);
198 5
                } elseif ($element->type === Fop::IDENT_CHECK) {
199 3
                    throw new \RuntimeException("FOP CHECK NOT YET IMPLEMENTED");
200 2
                }
201 2
202 25
                if ($element->isServiceFee) {
203 195
                    $this->serviceDetails[] = new ServiceDetails(
204
                        StatusDetails::IND_SERVICEFEE
205 5
                    );
206 5
                }
207 5
                break;
208 5
            case 'MiscellaneousRemark':
209 2
                /** @var Element\MiscellaneousRemark $element */
210 5
                $this->miscellaneousRemark = new MiscellaneousRemark(
211 195
                    $element->text,
212
                    $element->type,
213 165
                    $element->category
214 165
                );
215 99
                break;
216 66
            case 'ReceivedFrom':
217 165
                /** @var Element\ReceivedFrom $element */
218 95
                $this->freetextData = new FreetextData(
219
                    $element->receivedFrom,
220 5
                    FreetextDetail::TYPE_RECEIVE_FROM
221 5
                );
222 95
                break;
223
            case 'ServiceRequest':
224 30
                /** @var Element\ServiceRequest $element */
225 30
                $this->serviceRequest = new ServiceRequest($element);
226 65
                break;
227
            case 'Ticketing':
228 5
                /** @var Element\Ticketing $element */
229 5
                $this->ticketElement = new TicketElement($element);
230 60
                break;
231
            case 'AccountingInfo':
232 15
                /** @var Element\AccountingInfo $element */
233 11
                $this->accounting = new Accounting($element);
234 6
                break;
235 10
            case 'Address':
236 10
                /** @var Element\Address $element */
237 6
                if ($element->type === ElementManagementData::SEGNAME_ADDRESS_BILLING_UNSTRUCTURED ||
238 4
                    $element->type === ElementManagementData::SEGNAME_ADDRESS_MAILING_UNSTRUCTURED
239 4
                ) {
240 5
                    $this->freetextData = new FreetextData(
241
                        $element->freeText,
242 15
                        FreetextDetail::TYPE_MAILING_ADDRESS
243 45
                    );
244
                } else {
245 5
                    $this->structuredAddress = new StructuredAddress($element);
246 5
                }
247 5
                break;
248 5
            case 'FrequentFlyer':
249 5
                /** @var Element\FrequentFlyer $element */
250 40
                $this->serviceRequest = new ServiceRequest();
251
                $this->serviceRequest->ssr->type = 'FQTV';
252 5
                $this->serviceRequest->ssr->companyId = $element->airline;
253 5
                $this->frequentTravellerData = new FrequentTravellerData($element);
254 3
                break;
255 2
            case 'OtherServiceInfo':
256 5
                /** @var Element\OtherServiceInfo $element */
257 5
                $this->freetextData = new FreetextData(
258 5
                    $element->freeText,
259 35
                    FreetextDetail::TYPE_OSI_ELEMENT
260
                );
261 5
                $this->freetextData->freetextDetail->companyId = $element->airline;
262 5
                $this->freetextData->freetextDetail->subjectQualifier = FreetextDetail::QUALIFIER_LITERALTEXT;
263 30
                break;
264
            case 'ManualCommission':
265 15
                /** @var Element\ManualCommission $element */
266 15
                $this->commission = new Commission($element);
267 15
                break;
268
            case 'SeatRequest':
269 5
                /** @var Element\SeatRequest $element */
270 5
                $this->seatGroup = new SeatGroup($element);
271 10
                break;
272
            case 'TourCode':
273 5
                /** @var Element\TourCode $element */
274 5
                $this->tourCode = new TourCode($element);
275 5
                break;
276 5
            case 'ManualIssuedTicket':
277 2
                /** @var Element\ManualIssuedTicket $element */
278 5
                $this->manualFareDocument = new ManualDocumentRegistration(
279 2
                    $element->passengerType,
280 5
                    $element->companyId,
281 2
                    $element->ticketNumber
282 190
                );
283
                break;
284
            case 'ScheduleChange':
285
                /** @var Element\ScheduleChange $element */
286
                $this->freetextData = new FreetextData(
287
                    'SCHGTOOL',
288
                    FreetextDetail::TYPE_RECEIVE_FROM
289
                );
290
                break;
291 200
            case 'FareMiscellaneousInformation':
292
                /** @var Element\FareMiscellaneousInformation $element */
293 200
                $this->fareElement = new FareElement($element->indicator, $element->passengerType, $element->freeText, $element->officeId);
294
                break;
295
            default:
296 200
                throw new InvalidArgumentException('Element type '.$elementType.' is not supported');
297 80
        }
298 80
    }
299 80
300 80
    /**
301 80
     * Create the correct element identifier for a given element
302 80
     *
303 80
     * @param string $elementType
304 80
     * @param Element $element
305 80
     * @return string
306 80
     */
307 80
    protected function makeSegmentNameForRequestElement($elementType, $element)
308 80
    {
309
        $elementName = '';
310 80
311
        $sourceArray = [
312 200
            'Contact' => ElementManagementData::SEGNAME_CONTACT_ELEMENT,
313 195
            'FormOfPayment' => ElementManagementData::SEGNAME_FORM_OF_PAYMENT,
314
            'MiscellaneousRemark' => ElementManagementData::SEGNAME_GENERAL_REMARK,
315 195
            'ReceivedFrom' => ElementManagementData::SEGNAME_RECEIVE_FROM,
316
            'ServiceRequest' => ElementManagementData::SEGNAME_SPECIAL_SERVICE_REQUEST,
317 15
            'Ticketing' => ElementManagementData::SEGNAME_TICKETING_ELEMENT,
318 6
            'AccountingInfo' => ElementManagementData::SEGNAME_ACCOUNTING_INFORMATION,
319 78
            'Address' => null, // Special case - the type is a parameter.
320
            'FrequentFlyer' => ElementManagementData::SEGNAME_SPECIAL_SERVICE_REQUEST,
321 200
            'OtherServiceInfo' => ElementManagementData::SEGNAME_OTHER_SERVICE_INFORMATION,
322
            'ManualCommission' => ElementManagementData::SEGNAME_COMMISSION,
323
            'SeatRequest' => ElementManagementData::SEGNAME_SEAT_REQUEST,
324
            'TourCode' => ElementManagementData::SEGNAME_TOUR_CODE,
325
            'ManualIssuedTicket' => ElementManagementData::SEGNAME_MANUAL_DOCUMENT_REGISTRATION_WITH_ET_NUMBER,
326
            'ScheduleChange' => ElementManagementData::SEGNAME_RECEIVE_FROM,
327
            'FareMiscellaneousInformation' => null, // Special case - the type is a parameter.
328
        ];
329
330
        if (array_key_exists($elementType, $sourceArray)) {
331
            $elementName = $sourceArray[$elementType];
332
333
            if ($elementType === 'Address') {
334
                /** @var Element\Address $element */
335
                $elementName = $element->type;
336
            }
337
338
            if ($elementType === 'FareMiscellaneousInformation') {
339
                /** @var Element\FareMiscellaneousInformation $element */
340
341
                switch ($element->indicator) {
342
                    case Element\FareMiscellaneousInformation::GENERAL_INDICATOR_FS:
343
                        $elementName = ElementManagementData::SEGNAME_MISC_TICKET_INFO;
344
                        break;
345
                    case Element\FareMiscellaneousInformation::GENERAL_INDICATOR_FE:
346
                        $elementName = ElementManagementData::SEGNAME_ENDORSEMENT;
347
                        break;
348
                    case Element\FareMiscellaneousInformation::GENERAL_INDICATOR_FK:
349
                        $elementName = ElementManagementData::SEGNAME_AIR_OFFICE_ID;
350
                        break;
351
                    case Element\FareMiscellaneousInformation::GENERAL_INDICATOR_FZ:
352
                        $elementName = ElementManagementData::SEGNAME_MISC_INFO;
353
                        break;
354
                }
355
            }
356
        }
357
358
        return $elementName;
359
    }
360
}
361