From c4035358cbe11f5a2526fb9ce122cceffe8485f1 Mon Sep 17 00:00:00 2001 From: dieter Date: Mon, 20 Jun 2016 18:04:34 +0200 Subject: [PATCH] Implemented DocIssuance_IssueTicket, Offer_ConfirmCarOffer, Info_EncodeDecodeCity. Implemented response checking for all supported messages, updated documentation to reflect all changes & provided samples for all new messages. --- CHANGELOG.md | 21 + composer.lock | 242 +++++++++-- docs/about-get-started.rst | 23 +- docs/samples.rst | 171 +++++++- src/Amadeus/Client.php | 50 ++- src/Amadeus/Client/RequestCreator/Base.php | 18 +- src/Amadeus/Client/RequestCreator/Factory.php | 6 +- .../AirSellFromRecommendationOptions.php | 2 +- .../RequestOptions/CommandCrypticOptions.php | 2 +- .../DocIssuanceIssueTicketOptions.php | 169 ++++++++ .../RequestOptions/FareCheckRulesOptions.php | 1 + .../FarePricePnrWithBookingClassOptions.php | 2 +- .../InfoEncodeDecodeCityOptions.php | 72 ++++ .../RequestOptions/Offer/CarLocationInfo.php | 59 +++ .../RequestOptions/OfferConfirmCarOptions.php | 25 +- .../RequestOptions/PnrCancelOptions.php | 1 + .../TicketCreateTstFromPricingOptions.php | 1 + src/Amadeus/Client/ResponseHandler/Base.php | 366 +++++++++++++++- .../Client/Session/Handler/SoapHeader4.php | 8 +- .../Handler/UnsupportedOperationException.php | 4 + .../Client/Struct/DocIssuance/AgentInfo.php | 47 ++ .../DocIssuance/DocIssuanceDateTime.php | 61 +++ .../DocIssuance/InfantOrAdultAssociation.php | 47 ++ .../Struct/DocIssuance/InternalIdDetails.php | 56 +++ .../Client/Struct/DocIssuance/IssueTicket.php | 146 +++++++ .../Client/Struct/DocIssuance/OptionGroup.php | 47 ++ .../DocIssuance/OtherCompoundOptions.php | 34 ++ .../Struct/DocIssuance/OverrideDate.php | 62 +++ .../Struct/DocIssuance/PassengerReference.php | 61 +++ .../Client/Struct/DocIssuance/PaxDetails.php | 53 +++ .../Struct/DocIssuance/PaxSelection.php | 42 ++ .../Struct/DocIssuance/ReferenceDetails.php | 78 ++++ .../Client/Struct/DocIssuance/Selection.php | 37 ++ .../Struct/DocIssuance/StatusDetails.php | 47 ++ .../Client/Struct/DocIssuance/Stock.php | 34 ++ .../Client/Struct/DocIssuance/Switches.php | 47 ++ .../Struct/Info/CountryIdentification.php | 44 ++ .../Struct/Info/CountryStateRestriction.php | 33 ++ .../Client/Struct/Info/EncodeDecodeCity.php | 75 +++- src/Amadeus/Client/Struct/Info/Language.php | 47 ++ .../Client/Struct/Info/LanguageDetails.php | 32 ++ .../Struct/Info/LocationDescription.php | 344 +++++++++++++++ .../Struct/Info/LocationInformation.php | 59 +++ .../Client/Struct/Info/RequestOption.php | 40 ++ .../Client/Struct/Info/SelectionDetails.php | 71 +++ .../Client/Struct/Offer/ConfirmAir.php | 2 +- .../Client/Struct/Offer/ConfirmCar.php | 79 +++- .../ConfirmCar/AddressDeliveryCollection.php | 74 ++++ .../Offer/ConfirmCar/AddressDetails.php | 54 +++ .../Offer/ConfirmCar/AddressUsageDetails.php | 51 +++ .../ConfirmCar/DeliveryAndCollection.php | 55 +++ .../Struct/Offer/ConfirmCar/PaxTattooNbr.php | 47 ++ .../Struct/Offer/ConfirmCar/PhoneNumber.php | 59 +++ .../Struct/Offer/ConfirmCar/PnrInfo.php | 49 +++ .../Offer/ConfirmCar/ReferenceDetails.php | 58 +++ .../Offer/ConfirmCar/TattooReference.php | 62 +++ .../ConfirmCar/TelephoneNumberDetails.php | 47 ++ .../Client/Struct/Offer/ConfirmHotel.php | 2 +- src/Amadeus/Client/Struct/Offer/Verify.php | 2 +- .../Client/ResponseHandler/BaseTest.php | 403 +++++++++++++++++- ...nse.txt => dummyAirFlightInfoResponse.txt} | 0 ...AirSellFromRecommendationErrorResponse.txt | 21 + ...mRecommendationPartialSuccessCancelled.txt | 175 ++++++++ .../testfiles/dummyCommandCrypticResponse.txt | 1 + .../dummyDocIssuanceIssueTicketReplyError.txt | 20 + .../dummyDocIssuanceIssueTicketReplyOk.txt | 20 + .../testfiles/dummyFareCheckRulesReplyErr.txt | 18 + .../dummyFareConvertCurrencyErrResponse.txt | 13 + .../dummyFareDisplayFaresForCityPairReply.txt | 2 +- ...erPricerTravelBoardSearchErrorResponse.txt | 15 + ...dummyInfoEncodeDecodeCityErrorResponse.txt | 14 + .../testfiles/dummyInvalidXmlDocument.txt | 1 + ...MiniRuleGetFromPricingRecErrorResponse.txt | 22 + .../dummyOfferConfirmAirOfferErrResponse.txt | 1 + .../dummyOfferConfirmAirOfferOkResponse.txt | 1 + .../dummyOfferConfirmCarOfferErrResponse.txt | 39 ++ .../dummyOfferConfirmCarOfferOkResponse.txt | 167 ++++++++ ...dummyOfferConfirmHotelOfferErrResponse.txt | 2 + .../dummyOfferConfirmHotelOfferOkResponse.txt | 1 + .../dummyOfferVerifyOfferErrResponse.txt | 1 + .../dummyOfferVerifyOfferOkResponse.txt | 1 + ...myPriceXplorerExtremeSearchErrResponse.txt | 19 + .../dummyQueueMoveItemErrResponse.txt | 9 + .../dummyQueueMoveItemOkResponse.txt | 6 + .../dummyQueuePlacePNROkResponse.txt | 1 + .../dummyQueueRemoveItemOkResponse.txt | 1 + .../testfiles/dummySecuritySignoutReplyOk.txt | 5 + ...myTicketCreateTSTFromPricingReplyError.txt | 13 + .../Struct/DocIssuance/IssueTicketTest.php | 144 +++++++ .../Struct/Info/EncodeDecodeCityTest.php | 121 ++++++ .../Client/Struct/Info/LanguageTest.php | 31 ++ .../Struct/Offer/ConfirmCarOfferTest.php | 80 ++++ tests/Amadeus/ClientTest.php | 132 ++++-- 93 files changed, 4869 insertions(+), 159 deletions(-) create mode 100644 src/Amadeus/Client/RequestOptions/DocIssuanceIssueTicketOptions.php create mode 100644 src/Amadeus/Client/RequestOptions/Offer/CarLocationInfo.php create mode 100644 src/Amadeus/Client/Struct/DocIssuance/AgentInfo.php create mode 100644 src/Amadeus/Client/Struct/DocIssuance/DocIssuanceDateTime.php create mode 100644 src/Amadeus/Client/Struct/DocIssuance/InfantOrAdultAssociation.php create mode 100644 src/Amadeus/Client/Struct/DocIssuance/InternalIdDetails.php create mode 100644 src/Amadeus/Client/Struct/DocIssuance/IssueTicket.php create mode 100644 src/Amadeus/Client/Struct/DocIssuance/OptionGroup.php create mode 100644 src/Amadeus/Client/Struct/DocIssuance/OtherCompoundOptions.php create mode 100644 src/Amadeus/Client/Struct/DocIssuance/OverrideDate.php create mode 100644 src/Amadeus/Client/Struct/DocIssuance/PassengerReference.php create mode 100644 src/Amadeus/Client/Struct/DocIssuance/PaxDetails.php create mode 100644 src/Amadeus/Client/Struct/DocIssuance/PaxSelection.php create mode 100644 src/Amadeus/Client/Struct/DocIssuance/ReferenceDetails.php create mode 100644 src/Amadeus/Client/Struct/DocIssuance/Selection.php create mode 100644 src/Amadeus/Client/Struct/DocIssuance/StatusDetails.php create mode 100644 src/Amadeus/Client/Struct/DocIssuance/Stock.php create mode 100644 src/Amadeus/Client/Struct/DocIssuance/Switches.php create mode 100644 src/Amadeus/Client/Struct/Info/CountryIdentification.php create mode 100644 src/Amadeus/Client/Struct/Info/CountryStateRestriction.php create mode 100644 src/Amadeus/Client/Struct/Info/Language.php create mode 100644 src/Amadeus/Client/Struct/Info/LanguageDetails.php create mode 100644 src/Amadeus/Client/Struct/Info/LocationDescription.php create mode 100644 src/Amadeus/Client/Struct/Info/LocationInformation.php create mode 100644 src/Amadeus/Client/Struct/Info/RequestOption.php create mode 100644 src/Amadeus/Client/Struct/Info/SelectionDetails.php create mode 100644 src/Amadeus/Client/Struct/Offer/ConfirmCar/AddressDeliveryCollection.php create mode 100644 src/Amadeus/Client/Struct/Offer/ConfirmCar/AddressDetails.php create mode 100644 src/Amadeus/Client/Struct/Offer/ConfirmCar/AddressUsageDetails.php create mode 100644 src/Amadeus/Client/Struct/Offer/ConfirmCar/DeliveryAndCollection.php create mode 100644 src/Amadeus/Client/Struct/Offer/ConfirmCar/PaxTattooNbr.php create mode 100644 src/Amadeus/Client/Struct/Offer/ConfirmCar/PhoneNumber.php create mode 100644 src/Amadeus/Client/Struct/Offer/ConfirmCar/PnrInfo.php create mode 100644 src/Amadeus/Client/Struct/Offer/ConfirmCar/ReferenceDetails.php create mode 100644 src/Amadeus/Client/Struct/Offer/ConfirmCar/TattooReference.php create mode 100644 src/Amadeus/Client/Struct/Offer/ConfirmCar/TelephoneNumberDetails.php rename tests/Amadeus/Client/ResponseHandler/testfiles/{dummyAirFlightInoResponse.txt => dummyAirFlightInfoResponse.txt} (100%) create mode 100644 tests/Amadeus/Client/ResponseHandler/testfiles/dummyAirSellFromRecommendationErrorResponse.txt create mode 100644 tests/Amadeus/Client/ResponseHandler/testfiles/dummyAirSellFromRecommendationPartialSuccessCancelled.txt create mode 100644 tests/Amadeus/Client/ResponseHandler/testfiles/dummyCommandCrypticResponse.txt create mode 100644 tests/Amadeus/Client/ResponseHandler/testfiles/dummyDocIssuanceIssueTicketReplyError.txt create mode 100644 tests/Amadeus/Client/ResponseHandler/testfiles/dummyDocIssuanceIssueTicketReplyOk.txt create mode 100644 tests/Amadeus/Client/ResponseHandler/testfiles/dummyFareCheckRulesReplyErr.txt create mode 100644 tests/Amadeus/Client/ResponseHandler/testfiles/dummyFareConvertCurrencyErrResponse.txt create mode 100644 tests/Amadeus/Client/ResponseHandler/testfiles/dummyFareMasterPricerTravelBoardSearchErrorResponse.txt create mode 100644 tests/Amadeus/Client/ResponseHandler/testfiles/dummyInfoEncodeDecodeCityErrorResponse.txt create mode 100644 tests/Amadeus/Client/ResponseHandler/testfiles/dummyInvalidXmlDocument.txt create mode 100644 tests/Amadeus/Client/ResponseHandler/testfiles/dummyMiniRuleGetFromPricingRecErrorResponse.txt create mode 100644 tests/Amadeus/Client/ResponseHandler/testfiles/dummyOfferConfirmAirOfferErrResponse.txt create mode 100644 tests/Amadeus/Client/ResponseHandler/testfiles/dummyOfferConfirmAirOfferOkResponse.txt create mode 100644 tests/Amadeus/Client/ResponseHandler/testfiles/dummyOfferConfirmCarOfferErrResponse.txt create mode 100644 tests/Amadeus/Client/ResponseHandler/testfiles/dummyOfferConfirmCarOfferOkResponse.txt create mode 100644 tests/Amadeus/Client/ResponseHandler/testfiles/dummyOfferConfirmHotelOfferErrResponse.txt create mode 100644 tests/Amadeus/Client/ResponseHandler/testfiles/dummyOfferConfirmHotelOfferOkResponse.txt create mode 100644 tests/Amadeus/Client/ResponseHandler/testfiles/dummyOfferVerifyOfferErrResponse.txt create mode 100644 tests/Amadeus/Client/ResponseHandler/testfiles/dummyOfferVerifyOfferOkResponse.txt create mode 100644 tests/Amadeus/Client/ResponseHandler/testfiles/dummyPriceXplorerExtremeSearchErrResponse.txt create mode 100644 tests/Amadeus/Client/ResponseHandler/testfiles/dummyQueueMoveItemErrResponse.txt create mode 100644 tests/Amadeus/Client/ResponseHandler/testfiles/dummyQueueMoveItemOkResponse.txt create mode 100644 tests/Amadeus/Client/ResponseHandler/testfiles/dummyQueuePlacePNROkResponse.txt create mode 100644 tests/Amadeus/Client/ResponseHandler/testfiles/dummyQueueRemoveItemOkResponse.txt create mode 100644 tests/Amadeus/Client/ResponseHandler/testfiles/dummySecuritySignoutReplyOk.txt create mode 100644 tests/Amadeus/Client/ResponseHandler/testfiles/dummyTicketCreateTSTFromPricingReplyError.txt create mode 100644 tests/Amadeus/Client/Struct/DocIssuance/IssueTicketTest.php create mode 100644 tests/Amadeus/Client/Struct/Info/EncodeDecodeCityTest.php create mode 100644 tests/Amadeus/Client/Struct/Info/LanguageTest.php create mode 100644 tests/Amadeus/Client/Struct/Offer/ConfirmCarOfferTest.php diff --git a/CHANGELOG.md b/CHANGELOG.md index 00047359d..451f7778c 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,3 +1,24 @@ +# 2016-06 + +* Implemented Fare_PricePNRWithBookingClass version 13 and up (https://github.com/amabnl/amadeus-ws-client/issues/6) +* Implemented DocIssuance_IssueTicket (https://github.com/amabnl/amadeus-ws-client/issues/7) +* Implemented Info_EncodeDecodeCity +* Implemented Offer_ConfirmCarOffer +* Implemented checking for response errors for all supported messages _except Command_Cryptic_. For Command_Cryptic, you need to parse the response yourself to check for errors. +* Removed the 'asString' request option - the `Amadeus\Client\Result` object now always contains the result XML in the `responseXml` property. + +# 2016-05 + +Completely re-worked the Result being returned by Web Service calls: the XML or PHP object is now encapsulated in an `Amadeus\Client\Result` object which makes checking for errors or warnings much easier. + +The library now always returns both the PHP object generated by `\SoapClient` as well as the result string. + +The Result object also has a `status` property which contains the status of the message performed: FATAL, OK, WARN or INFO. + +The library will now also convert `\SoapFault` exceptions to a FATAL result status. + +(https://github.com/amabnl/amadeus-ws-client/issues/2) + # 2016-04 * Added support for providing custom `\SoapClient` options (https://github.com/amabnl/amadeus-ws-client/issues/4) diff --git a/composer.lock b/composer.lock index 9b7a6bffa..de0030b39 100644 --- a/composer.lock +++ b/composer.lock @@ -101,39 +101,136 @@ ], "time": "2015-06-14 21:17:01" }, + { + "name": "phpdocumentor/reflection-common", + "version": "1.0", + "source": { + "type": "git", + "url": "https://github.com/phpDocumentor/ReflectionCommon.git", + "reference": "144c307535e82c8fdcaacbcfc1d6d8eeb896687c" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/phpDocumentor/ReflectionCommon/zipball/144c307535e82c8fdcaacbcfc1d6d8eeb896687c", + "reference": "144c307535e82c8fdcaacbcfc1d6d8eeb896687c", + "shasum": "" + }, + "require": { + "php": ">=5.5" + }, + "require-dev": { + "phpunit/phpunit": "^4.6" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.0.x-dev" + } + }, + "autoload": { + "psr-4": { + "phpDocumentor\\Reflection\\": [ + "src" + ] + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Jaap van Otterdijk", + "email": "opensource@ijaap.nl" + } + ], + "description": "Common reflection classes used by phpdocumentor to reflect the code structure", + "homepage": "http://www.phpdoc.org", + "keywords": [ + "FQSEN", + "phpDocumentor", + "phpdoc", + "reflection", + "static analysis" + ], + "time": "2015-12-27 11:43:31" + }, { "name": "phpdocumentor/reflection-docblock", - "version": "2.0.4", + "version": "3.1.0", "source": { "type": "git", "url": "https://github.com/phpDocumentor/ReflectionDocBlock.git", - "reference": "d68dbdc53dc358a816f00b300704702b2eaff7b8" + "reference": "9270140b940ff02e58ec577c237274e92cd40cdd" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/phpDocumentor/ReflectionDocBlock/zipball/d68dbdc53dc358a816f00b300704702b2eaff7b8", - "reference": "d68dbdc53dc358a816f00b300704702b2eaff7b8", + "url": "https://api.github.com/repos/phpDocumentor/ReflectionDocBlock/zipball/9270140b940ff02e58ec577c237274e92cd40cdd", + "reference": "9270140b940ff02e58ec577c237274e92cd40cdd", "shasum": "" }, "require": { - "php": ">=5.3.3" + "php": ">=5.5", + "phpdocumentor/reflection-common": "^1.0@dev", + "phpdocumentor/type-resolver": "^0.2.0", + "webmozart/assert": "^1.0" }, "require-dev": { - "phpunit/phpunit": "~4.0" + "mockery/mockery": "^0.9.4", + "phpunit/phpunit": "^4.4" }, - "suggest": { - "dflydev/markdown": "~1.0", - "erusev/parsedown": "~1.0" + "type": "library", + "autoload": { + "psr-4": { + "phpDocumentor\\Reflection\\": [ + "src/" + ] + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Mike van Riel", + "email": "me@mikevanriel.com" + } + ], + "description": "With this component, a library can provide support for annotations via DocBlocks or otherwise retrieve information that is embedded in a DocBlock.", + "time": "2016-06-10 09:48:41" + }, + { + "name": "phpdocumentor/type-resolver", + "version": "0.2", + "source": { + "type": "git", + "url": "https://github.com/phpDocumentor/TypeResolver.git", + "reference": "b39c7a5b194f9ed7bd0dd345c751007a41862443" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/phpDocumentor/TypeResolver/zipball/b39c7a5b194f9ed7bd0dd345c751007a41862443", + "reference": "b39c7a5b194f9ed7bd0dd345c751007a41862443", + "shasum": "" + }, + "require": { + "php": ">=5.5", + "phpdocumentor/reflection-common": "^1.0" + }, + "require-dev": { + "mockery/mockery": "^0.9.4", + "phpunit/phpunit": "^5.2||^4.8.24" }, "type": "library", "extra": { "branch-alias": { - "dev-master": "2.0.x-dev" + "dev-master": "1.0.x-dev" } }, "autoload": { - "psr-0": { - "phpDocumentor": [ + "psr-4": { + "phpDocumentor\\Reflection\\": [ "src/" ] } @@ -145,39 +242,39 @@ "authors": [ { "name": "Mike van Riel", - "email": "mike.vanriel@naenius.com" + "email": "me@mikevanriel.com" } ], - "time": "2015-02-03 12:10:50" + "time": "2016-06-10 07:14:17" }, { "name": "phpspec/prophecy", - "version": "v1.6.0", + "version": "v1.6.1", "source": { "type": "git", "url": "https://github.com/phpspec/prophecy.git", - "reference": "3c91bdf81797d725b14cb62906f9a4ce44235972" + "reference": "58a8137754bc24b25740d4281399a4a3596058e0" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/phpspec/prophecy/zipball/3c91bdf81797d725b14cb62906f9a4ce44235972", - "reference": "3c91bdf81797d725b14cb62906f9a4ce44235972", + "url": "https://api.github.com/repos/phpspec/prophecy/zipball/58a8137754bc24b25740d4281399a4a3596058e0", + "reference": "58a8137754bc24b25740d4281399a4a3596058e0", "shasum": "" }, "require": { "doctrine/instantiator": "^1.0.2", "php": "^5.3|^7.0", - "phpdocumentor/reflection-docblock": "~2.0", - "sebastian/comparator": "~1.1", - "sebastian/recursion-context": "~1.0" + "phpdocumentor/reflection-docblock": "^2.0|^3.0.2", + "sebastian/comparator": "^1.1", + "sebastian/recursion-context": "^1.0" }, "require-dev": { - "phpspec/phpspec": "~2.0" + "phpspec/phpspec": "^2.0" }, "type": "library", "extra": { "branch-alias": { - "dev-master": "1.5.x-dev" + "dev-master": "1.6.x-dev" } }, "autoload": { @@ -210,7 +307,7 @@ "spy", "stub" ], - "time": "2016-02-15 07:46:21" + "time": "2016-06-07 08:13:47" }, { "name": "phpunit/php-code-coverage", @@ -364,21 +461,24 @@ }, { "name": "phpunit/php-timer", - "version": "1.0.7", + "version": "1.0.8", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/php-timer.git", - "reference": "3e82f4e9fc92665fafd9157568e4dcb01d014e5b" + "reference": "38e9124049cf1a164f1e4537caf19c99bf1eb260" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/php-timer/zipball/3e82f4e9fc92665fafd9157568e4dcb01d014e5b", - "reference": "3e82f4e9fc92665fafd9157568e4dcb01d014e5b", + "url": "https://api.github.com/repos/sebastianbergmann/php-timer/zipball/38e9124049cf1a164f1e4537caf19c99bf1eb260", + "reference": "38e9124049cf1a164f1e4537caf19c99bf1eb260", "shasum": "" }, "require": { "php": ">=5.3.3" }, + "require-dev": { + "phpunit/phpunit": "~4|~5" + }, "type": "library", "autoload": { "classmap": [ @@ -401,7 +501,7 @@ "keywords": [ "timer" ], - "time": "2015-06-21 08:01:12" + "time": "2016-05-12 18:03:57" }, { "name": "phpunit/php-token-stream", @@ -454,16 +554,16 @@ }, { "name": "phpunit/phpunit", - "version": "4.8.24", + "version": "4.8.26", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/phpunit.git", - "reference": "a1066c562c52900a142a0e2bbf0582994671385e" + "reference": "fc1d8cd5b5de11625979125c5639347896ac2c74" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/phpunit/zipball/a1066c562c52900a142a0e2bbf0582994671385e", - "reference": "a1066c562c52900a142a0e2bbf0582994671385e", + "url": "https://api.github.com/repos/sebastianbergmann/phpunit/zipball/fc1d8cd5b5de11625979125c5639347896ac2c74", + "reference": "fc1d8cd5b5de11625979125c5639347896ac2c74", "shasum": "" }, "require": { @@ -477,7 +577,7 @@ "phpunit/php-code-coverage": "~2.1", "phpunit/php-file-iterator": "~1.4", "phpunit/php-text-template": "~1.2", - "phpunit/php-timer": ">=1.0.6", + "phpunit/php-timer": "^1.0.6", "phpunit/phpunit-mock-objects": "~2.3", "sebastian/comparator": "~1.1", "sebastian/diff": "~1.2", @@ -522,7 +622,7 @@ "testing", "xunit" ], - "time": "2016-03-14 06:16:08" + "time": "2016-05-17 03:09:28" }, { "name": "phpunit/phpunit-mock-objects", @@ -698,16 +798,16 @@ }, { "name": "sebastian/environment", - "version": "1.3.5", + "version": "1.3.7", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/environment.git", - "reference": "dc7a29032cf72b54f36dac15a1ca5b3a1b6029bf" + "reference": "4e8f0da10ac5802913afc151413bc8c53b6c2716" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/environment/zipball/dc7a29032cf72b54f36dac15a1ca5b3a1b6029bf", - "reference": "dc7a29032cf72b54f36dac15a1ca5b3a1b6029bf", + "url": "https://api.github.com/repos/sebastianbergmann/environment/zipball/4e8f0da10ac5802913afc151413bc8c53b6c2716", + "reference": "4e8f0da10ac5802913afc151413bc8c53b6c2716", "shasum": "" }, "require": { @@ -744,20 +844,20 @@ "environment", "hhvm" ], - "time": "2016-02-26 18:40:46" + "time": "2016-05-17 03:18:57" }, { "name": "sebastian/exporter", - "version": "1.2.1", + "version": "1.2.2", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/exporter.git", - "reference": "7ae5513327cb536431847bcc0c10edba2701064e" + "reference": "42c4c2eec485ee3e159ec9884f95b431287edde4" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/exporter/zipball/7ae5513327cb536431847bcc0c10edba2701064e", - "reference": "7ae5513327cb536431847bcc0c10edba2701064e", + "url": "https://api.github.com/repos/sebastianbergmann/exporter/zipball/42c4c2eec485ee3e159ec9884f95b431287edde4", + "reference": "42c4c2eec485ee3e159ec9884f95b431287edde4", "shasum": "" }, "require": { @@ -765,12 +865,13 @@ "sebastian/recursion-context": "~1.0" }, "require-dev": { + "ext-mbstring": "*", "phpunit/phpunit": "~4.4" }, "type": "library", "extra": { "branch-alias": { - "dev-master": "1.2.x-dev" + "dev-master": "1.3.x-dev" } }, "autoload": { @@ -810,7 +911,7 @@ "export", "exporter" ], - "time": "2015-06-21 07:55:53" + "time": "2016-06-17 09:04:28" }, { "name": "sebastian/global-state", @@ -999,6 +1100,55 @@ "description": "Symfony Yaml Component", "homepage": "https://symfony.com", "time": "2015-11-30 12:35:10" + }, + { + "name": "webmozart/assert", + "version": "1.0.2", + "source": { + "type": "git", + "url": "https://github.com/webmozart/assert.git", + "reference": "30eed06dd6bc88410a4ff7f77b6d22f3ce13dbde" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/webmozart/assert/zipball/30eed06dd6bc88410a4ff7f77b6d22f3ce13dbde", + "reference": "30eed06dd6bc88410a4ff7f77b6d22f3ce13dbde", + "shasum": "" + }, + "require": { + "php": ">=5.3.3" + }, + "require-dev": { + "phpunit/phpunit": "^4.6" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.0-dev" + } + }, + "autoload": { + "psr-4": { + "Webmozart\\Assert\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Bernhard Schussek", + "email": "bschussek@gmail.com" + } + ], + "description": "Assertions to validate method input/output with nice error messages.", + "keywords": [ + "assert", + "check", + "validate" + ], + "time": "2015-08-24 13:29:44" } ], "aliases": [], diff --git a/docs/about-get-started.rst b/docs/about-get-started.rst index 5717d6771..18b35518c 100644 --- a/docs/about-get-started.rst +++ b/docs/about-get-started.rst @@ -63,6 +63,7 @@ Soap Header 4 example: use Amadeus\Client; use Amadeus\Client\Params; + use Amadeus\Client\Result; use Amadeus\Client\RequestOptions\PnrRetrieveOptions; //Set up the client with necessary parameters: @@ -86,10 +87,14 @@ Soap Header 4 example: $client = new Client($params); - $pnrContent = $client->pnrRetrieve( + $pnrResult = $client->pnrRetrieve( new PnrRetrieveOptions(['recordLocator' => 'ABC123']) ); + if ($pnrResult->status === Result::STATUS_OK) { + echo "Successfully retrieved PNR, no errors in PNR found!"; + } + Soap Header 2 example: .. code-block:: php @@ -98,6 +103,7 @@ Soap Header 2 example: use Amadeus\Client; use Amadeus\Client\Params; + use Amadeus\Client\Result; use Amadeus\Client\RequestOptions\PnrRetrieveOptions; //Set up the client with necessary parameters: @@ -125,9 +131,9 @@ Soap Header 2 example: $authResult = $client->securityAuthenticate(); - if (isset($authResult->processStatus->statusCode) && $authResult->processStatus->statusCode === 'P') { + if ($authResult->status === Result::STATUS_OK) { //We are authenticated! - $pnrContent = $client->pnrRetrieve( + $pnrResult = $client->pnrRetrieve( new PnrRetrieveOptions(['recordLocator' => 'ABC123']) ); } @@ -156,11 +162,14 @@ This is the list of messages that are at least partially supported at this time: - Fare_CheckRules - Air_SellFromRecommendation - Air_FlightInfo +- DocIssuance_IssueTicket +- Ticket_CreateTSTFromPricing - Offer_VerifyOffer - Offer_ConfirmAirOffer - Offer_ConfirmHotelOffer +- Offer_ConfirmCarOffer - MiniRule_GetFromPricingRec -- Ticket_CreateTSTFromPricing +- Info_EncodeDecodeCity - Command_Cryptic - PriceXplorer_ExtremeSearch @@ -168,16 +177,16 @@ On the to-do list / work in progress: - Air_RetrieveSeatMap - Air_MultiAvailability -- DocIssuance_IssueTicket - Fare_InformativePricingWithoutPNR - Fare_InformativeBestPricingWithoutPNR - Fare_PricePNRWithLowerFares +- Fare_PricePNRWithLowestFare - Fare_MasterPricerCalendar - Fare_DisplayFaresForCityPair - Fare_DisplayBookingCodeInformation - Fare_CalculateMileage -- Info_EncodeDecodeCity -- Offer_ConfirmCarOffer +- PNR_TransferOwnership +- PNR_NameChange - PointOfRef_Search - PointOfRef_CategoryList - Ticket_DisplayTST diff --git a/docs/samples.rst b/docs/samples.rst index 46127f6df..7ff566347 100644 --- a/docs/samples.rst +++ b/docs/samples.rst @@ -87,31 +87,23 @@ You can restore a previous current session after you retrieved it from your sess Handling the response ********************* +The response from a Web Service call made through this library will be an instance of the ``Amadeus\Client\Result`` class: +this object contains: + +* A status to indicate if the message was successful (FATAL, ERROR, WARN, INFO, OK) (property ``status``) +* Any error or other messages that provide more information about the status (property ``messages``) +* The response object as generated by the ``\SoapClient`` (property ``response``) +* The message XML string (property ``responseXml``) + +When processing a response from the Amadeus Web Services, the library will check for any error or other status messages in the response and set the status accordingly. + Sometimes it's useful if the result from the SOAP call gets returned as a PHP object, sometimes a string containing the XML document of the SOAP-BODY is more useful. For example, when trying to extract specific information from a PNR, it can be useful to load the PNR_Reply as a ``\DOMDocument`` and query it using a ``\DOMXPath`` object. -The library supports this through the message option 'asString': - -- Retrieving a PNR's contents and requesting the result as a string: - -.. code-block:: php - - $client->pnrRetrieve( - new PnrRetrieveOptions(['recordLocator' => 'ABC123']), - ['asString' => true] //This is the default setting for the pnrRetrieve() method - ); - -- Retrieving a PNR's contents and requesting the result as a PHP Object: - -.. code-block:: php - - $client->pnrRetrieve( - new PnrRetrieveOptions(['recordLocator' => 'ABC123']), - ['asString' => false] - ); +For this, you can use the ``Amadeus\Client\Result::responseXml`` from the result. ****** Errors @@ -119,7 +111,7 @@ Errors The Amadeus web services can be tricky with regards to error detection. In most verbs, you have to look for the presence of error nodes in the response to see if everything went allright. -We try to ease your pain a little by analyzing the messages we support and look for error nodes. If any are found, we throw them as exceptions. +We try to ease your pain a little by analyzing the messages we support and look for error nodes. If any are found, we will put any error messages in the ``Amadeus\Client\Result::messages`` property of the result and set the result status accordingly. To override this behaviour, look at the ``Amadeus\Client\ResponseHandler\ResponseHandlerInterface``. @@ -609,6 +601,89 @@ Ticket_DisplayTST View the TST's of a PNR: +*********** +DocIssuance +*********** + +----------------------- +DocIssuance_IssueTicket +----------------------- + +Issue ticket for an entire PNR as e-Ticket (TTP/ET): + +.. code-block:: php + + use Amadeus\Client\RequestOptions\DocIssuanceIssueTicketOptions; + + $issueTicketResponse = $client->docIssuanceIssueTicket( + new DocIssuanceIssueTicketOptions([ + 'options' => [ + DocIssuanceIssueTicketOptions::OPTION_ETICKET + ] + ]) + ); + +Issue ticket for one single TST PNR as e-Ticket and retrieve PNR (TTP/T1/ET/RT): + +.. code-block:: php + + use Amadeus\Client\RequestOptions\DocIssuanceIssueTicketOptions; + + $issueTicketResponse = $client->docIssuanceIssueTicket( + new DocIssuanceIssueTicketOptions([ + 'options' => [ + DocIssuanceIssueTicketOptions::OPTION_ETICKET, + DocIssuanceIssueTicketOptions::OPTION_RETRIEVE_PNR + ], + 'tsts' => [1] + ]) + ); + +**** +Info +**** +--------------------- +Info_EncodeDecodeCity +--------------------- + +Get information about IATA code 'OPO': + +.. code-block:: php + + use Amadeus\Client\RequestOptions\InfoEncodeDecodeCityOptions; + + $infoResponse = $client->infoEncodeDecodeCity( + new InfoEncodeDecodeCityOptions([ + 'locationCode' => 'OPO' + ]) + ); + +Do a phonetic search for locations sounding like "Brussels": + +.. code-block:: php + + use Amadeus\Client\RequestOptions\InfoEncodeDecodeCityOptions; + + $infoResponse = $client->infoEncodeDecodeCity( + new InfoEncodeDecodeCityOptions([ + 'locationName' => 'brussels', + 'searchMode' => InfoEncodeDecodeCityOptions::SEARCHMODE_PHONETIC + ]) + ); + +Find all train stations in New York: + +.. code-block:: php + + use Amadeus\Client\RequestOptions\InfoEncodeDecodeCityOptions; + + $infoResponse = $client->infoEncodeDecodeCity( + new InfoEncodeDecodeCityOptions([ + 'locationCode' => 'NYC', + 'selectResult' => InfoEncodeDecodeCityOptions::SELECT_TRAIN_STATIONS + ]) + ); + ***** Offer ***** @@ -648,6 +723,60 @@ Offer_ConfirmHotelOffer ----------------------- Confirm a given HOTEL offer: +.. code-block:: php + + use Amadeus\Client\RequestOptions\OfferConfirmHotelOptions; + use Amadeus\Client\RequestOptions\Offer\PaymentDetails; + + $opt = new OfferConfirmHotelOptions([ + 'recordLocator' => 'ABC123', + 'offerReference' => 2, + 'passengers' => [1], + 'originatorId' => '123456', + 'paymentType' => OfferConfirmHotelOptions::PAYMENT_GUARANTEED, + 'formOfPayment' => OfferConfirmHotelOptions::FOP_CREDIT_CARD, + 'paymentDetails' => new PaymentDetails([ + 'ccCardNumber' => '4444333322221111', + 'ccCardHolder' => 'David Bowie', + 'ccExpiry' => '1117', + 'ccVendor' => 'AX', + ]) + ]); + + $response = $client->offerConfirmHotel($opt); + +--------------------- +Offer_ConfirmCarOffer +--------------------- +Confirm a given CAR offer: + +.. code-block:: php + + use Amadeus\Client\RequestOptions\OfferConfirmCarOptions; + use Amadeus\Client\RequestOptions\Offer\CarLocationInfo; + + $opt = new OfferConfirmCarOptions([ + 'passengerTattoo' => 1, + 'offerTattoo' => 2, + 'recordLocator' => 'ABC123', + 'pickUpInfo' => new CarLocationInfo([ + 'address' => 'RUE DE LA LIBERATION', + 'city' => 'NICE', + 'zipCode' => '06000', + 'countryCode' => 'FR', + 'phoneNumber' => '1234567890' + ]), + 'dropOffInfo' => new CarLocationInfo([ + 'address' => 'ROUTE DE VALBONNE', + 'city' => 'BIOT', + 'zipCode' => '06410', + 'countryCode' => 'FR', + 'phoneNumber' => '0123456789' + ]), + ]); + + $response = $client->offerConfirmCar($opt); + ******** MiniRule ******** @@ -662,7 +791,7 @@ Get MiniRules for a pricing in context (either a TST pricing, Offers or a pricin use Amadeus\Client\RequestOptions\MiniRuleGetFromPricingRecOptions; use Amadeus\Client\RequestOptions\MiniRule\Pricing; - $miniRules = $client->miniRuleGetFromPricingRec( + $miniRulesResponse = $client->miniRuleGetFromPricingRec( new MiniRuleGetFromPricingRecOptions([ 'pricings' => [ new Pricing([ diff --git a/src/Amadeus/Client.php b/src/Amadeus/Client.php index 09357ba62..3dd9a2ce9 100644 --- a/src/Amadeus/Client.php +++ b/src/Amadeus/Client.php @@ -212,7 +212,7 @@ public function __construct($params) public function securityAuthenticate() { $msgName = 'Security_Authenticate'; - $messageOptions = $this->makeMessageOptions([], false, false); + $messageOptions = $this->makeMessageOptions([], false); $sendResult = $this->sessionHandler->sendMessage( $msgName, @@ -240,7 +240,7 @@ public function securityAuthenticate() public function securitySignOut() { $msgName = 'Security_SignOut'; - $messageOptions = $this->makeMessageOptions([], false, true); + $messageOptions = $this->makeMessageOptions([], true); $sendResult = $this->sessionHandler->sendMessage( $msgName, @@ -263,8 +263,6 @@ public function securitySignOut() * By default, the result will be the PNR_Reply XML as string. * That way you can easily parse the PNR's contents with XPath. * - * Set $responseAsString FALSE to get the response as a PHP object. - * * https://webservices.amadeus.com/extranet/viewService.do?id=27&flavourId=1&menuId=functional * * @param RequestOptions\PnrRetrieveOptions $options @@ -275,7 +273,7 @@ public function securitySignOut() public function pnrRetrieve(RequestOptions\PnrRetrieveOptions $options, $messageOptions = []) { $msgName = 'PNR_Retrieve'; - $messageOptions = $this->makeMessageOptions($messageOptions, true); + $messageOptions = $this->makeMessageOptions($messageOptions); $sendResult = $this->sessionHandler->sendMessage( $msgName, @@ -302,7 +300,7 @@ public function pnrRetrieve(RequestOptions\PnrRetrieveOptions $options, $message public function pnrCreatePnr(RequestOptions\PnrCreatePnrOptions $options, $messageOptions = []) { $msgName = 'PNR_AddMultiElements'; - $messageOptions = $this->makeMessageOptions($messageOptions, true); + $messageOptions = $this->makeMessageOptions($messageOptions); $sendResult = $this->sessionHandler->sendMessage( $msgName, @@ -332,7 +330,7 @@ public function pnrCreatePnr(RequestOptions\PnrCreatePnrOptions $options, $messa public function pnrAddMultiElements(RequestOptions\PnrAddMultiElementsOptions $options, $messageOptions = []) { $msgName = 'PNR_AddMultiElements'; - $messageOptions = $this->makeMessageOptions($messageOptions, true); + $messageOptions = $this->makeMessageOptions($messageOptions); $sendResult = $this->sessionHandler->sendMessage( $msgName, @@ -369,7 +367,7 @@ public function pnrAddMultiElements(RequestOptions\PnrAddMultiElementsOptions $o public function pnrRetrieveAndDisplay(RequestOptions\PnrRetrieveAndDisplayOptions $options, $messageOptions = []) { $msgName = 'PNR_RetrieveAndDisplay'; - $messageOptions = $this->makeMessageOptions($messageOptions, true); + $messageOptions = $this->makeMessageOptions($messageOptions); $sendResult = $this->sessionHandler->sendMessage( $msgName, @@ -396,7 +394,7 @@ public function pnrRetrieveAndDisplay(RequestOptions\PnrRetrieveAndDisplayOption public function pnrCancel(RequestOptions\PnrCancelOptions $options, $messageOptions = []) { $msgName = 'PNR_Cancel'; - $messageOptions = $this->makeMessageOptions($messageOptions, true); + $messageOptions = $this->makeMessageOptions($messageOptions); $sendResult = $this->sessionHandler->sendMessage( $msgName, @@ -904,6 +902,33 @@ public function ticketCreateTSTFromPricing(RequestOptions\TicketCreateTstFromPri ); } + /** + * DocIssuance_IssueTicket + * + * @param RequestOptions\DocIssuanceIssueTicketOptions $options + * @param array $messageOptions + * @return Result + */ + public function docIssuanceIssueTicket(RequestOptions\DocIssuanceIssueTicketOptions $options, $messageOptions = []) + { + $msgName = 'DocIssuance_IssueTicket'; + $messageOptions = $this->makeMessageOptions($messageOptions); + + $sendResult = $this->sessionHandler->sendMessage( + $msgName, + $this->requestCreator->createRequest( + $msgName, + $options + ), + $messageOptions + ); + + return $this->responseHandler->analyzeResponse( + $sendResult, + $msgName + ); + } + /** * PriceXplorer_ExtremeSearch * @@ -944,17 +969,12 @@ public function priceXplorerExtremeSearch(RequestOptions\PriceXplorerExtremeSear * @param bool $endSession Switch if you want to terminate the current session after making the call. * @return array */ - protected function makeMessageOptions(array $incoming, $asString = false, $endSession = false) + protected function makeMessageOptions(array $incoming, $endSession = false) { $options = [ - 'asString' => $asString, 'endSession' => $endSession ]; - if (array_key_exists('asString', $incoming)) { - $options['asString'] = $incoming['asString']; - } - if (array_key_exists('endSession', $incoming)) { $options['endSession'] = $incoming['endSession']; } diff --git a/src/Amadeus/Client/RequestCreator/Base.php b/src/Amadeus/Client/RequestCreator/Base.php index f7a8cb714..9a34af706 100644 --- a/src/Amadeus/Client/RequestCreator/Base.php +++ b/src/Amadeus/Client/RequestCreator/Base.php @@ -27,6 +27,7 @@ use Amadeus\Client\RequestOptions\AirFlightInfoOptions; use Amadeus\Client\RequestOptions\AirSellFromRecommendationOptions; use Amadeus\Client\RequestOptions\CommandCrypticOptions; +use Amadeus\Client\RequestOptions\DocIssuanceIssueTicketOptions; use Amadeus\Client\RequestOptions\FareCheckRulesOptions; use Amadeus\Client\RequestOptions\FareConvertCurrencyOptions; use Amadeus\Client\RequestOptions\FareMasterPricerTbSearch; @@ -385,8 +386,9 @@ protected function createFarePricePnrWithBookingClass(FarePricePnrWithBookingCla } /** - * @param TicketCreateTstFromPricingOptions $params + * Ticket_CreateTstFromPricing * + * @param TicketCreateTstFromPricingOptions $params * @return Struct\Ticket\CreateTSTFromPricing */ protected function createTicketCreateTSTFromPricing(TicketCreateTstFromPricingOptions $params) @@ -395,8 +397,20 @@ protected function createTicketCreateTSTFromPricing(TicketCreateTstFromPricingOp } /** - * @param PriceXplorerExtremeSearchOptions $params + * DocIssuance_IssueTicket + * + * @param DocIssuanceIssueTicketOptions $params + * @return Struct\DocIssuance\IssueTicket + */ + protected function createDocIssuanceIssueTicket(DocIssuanceIssueTicketOptions $params) + { + return new Struct\DocIssuance\IssueTicket($params); + } + + /** + * PriceXplorer_ExtremeSearch * + * @param PriceXplorerExtremeSearchOptions $params * @return Struct\PriceXplorer\ExtremeSearch */ protected function createPriceXplorerExtremeSearch(PriceXplorerExtremeSearchOptions $params) diff --git a/src/Amadeus/Client/RequestCreator/Factory.php b/src/Amadeus/Client/RequestCreator/Factory.php index 26e2a94a2..6c7da1375 100644 --- a/src/Amadeus/Client/RequestCreator/Factory.php +++ b/src/Amadeus/Client/RequestCreator/Factory.php @@ -25,7 +25,7 @@ use Amadeus\Client\Params\RequestCreatorParams; /** - * Factory + * Request Creator Factory * * @package Amadeus\Client\RequestCreator * @author Dieter Devlieghere @@ -33,6 +33,8 @@ class Factory { /** + * Create a Request Creator + * * @param RequestCreatorParams $params * @param string $libIdentifier * @return RequestCreatorInterface @@ -40,8 +42,6 @@ class Factory */ public static function createRequestCreator($params, $libIdentifier) { - $theRequestCreator = null; - $params->receivedFrom = self::makeReceivedFrom( $params->receivedFrom, $libIdentifier diff --git a/src/Amadeus/Client/RequestOptions/AirSellFromRecommendationOptions.php b/src/Amadeus/Client/RequestOptions/AirSellFromRecommendationOptions.php index 83f11d1ef..489d50baf 100644 --- a/src/Amadeus/Client/RequestOptions/AirSellFromRecommendationOptions.php +++ b/src/Amadeus/Client/RequestOptions/AirSellFromRecommendationOptions.php @@ -26,7 +26,7 @@ * AirSellFromRecommendation * * @package Amadeus\Client\RequestOptions - * @author dieter + * @author Dieter Devlieghere */ class AirSellFromRecommendationOptions extends Base { diff --git a/src/Amadeus/Client/RequestOptions/CommandCrypticOptions.php b/src/Amadeus/Client/RequestOptions/CommandCrypticOptions.php index 20ef26a7e..a2e0b7bc2 100644 --- a/src/Amadeus/Client/RequestOptions/CommandCrypticOptions.php +++ b/src/Amadeus/Client/RequestOptions/CommandCrypticOptions.php @@ -26,7 +26,7 @@ * CommandCrypticOptions * * @package Amadeus\Client\RequestOptions - * @author dieter + * @author Dieter Devlieghere */ class CommandCrypticOptions extends Base { diff --git a/src/Amadeus/Client/RequestOptions/DocIssuanceIssueTicketOptions.php b/src/Amadeus/Client/RequestOptions/DocIssuanceIssueTicketOptions.php new file mode 100644 index 000000000..20c18471a --- /dev/null +++ b/src/Amadeus/Client/RequestOptions/DocIssuanceIssueTicketOptions.php @@ -0,0 +1,169 @@ + + */ +class DocIssuanceIssueTicketOptions extends Base +{ + const PAX_TYPE_ADULT = "A"; + + const PAX_TYPE_INFANT = "IN"; + + + const OPTION_ETICKET = "ET"; + + const OPTION_RETRIEVE_PNR = "RT"; + + const OPTION_ITINERARY_RECEIPT = "ITR"; + + const OPTION_PRE_ISSUE_VALIDATION = "TKT"; + + const OPTION_PRINT_ITIN = "IBP"; + + const OPTION_PRINT_JOINT_ITIN = "IBJ"; + + const OPTION_PRINT_EXTENDED_ITIN = "IEP"; + + const OPTION_PRINT_EXTENDED_JOINT_ITIN = "IEJ"; + + const OPTION_TICKET_ONLY = "TKA"; + + /** + * The Ticket Issuance options to be triggered + * + * self::OPTION::* + * + * CCC Concealed Credit Card + * CCO Credit Card Override + * ET Electronic Override + * ETR ET Revalidation + * EXC Exchange ticketing + * GRP Group Identifier + * HT Hotel Terms + * IBJ Print Basic Joint Itinerary + * IBP Print Basic Itinerary + * ICP Inhibit Credit Card Charge Form Coupon Print + * IEJ Print Extended Joint Itinerary + * IEP Print Extended Itinerary + * IMP Mini-Itinerary generation + * INE Individual Extended Invoice for each passenger + * INF Infant select + * INJ Print a single Extended Invoice for all passengers + * INV Print individual basic Invoice for each passenger + * IPE PNR Invoice + * IPG GAC Invoice + * IRI Involuntary Rerouting Indicator + * ISH Inhibit shift + * ITR Itinerary Receipt + * IVJ Print a single basic invoice for all passengers + * IWP Itinerary Wallet print generation + * NCC NO CREDIT + * OET Force electronic + * ONC Override Name Check + * OPT Force Paper + * OVR Revalidation Override + * PCC Present Credit Card + * POD Payment On Demand + * PT Paper override + * RT Retrieve PNR + * TKA Ticket Only + * TKP Electronic ticketing via TCH + * TKT Pre-issue validation + * TMD Template display + * TMO Template Override + * ZAA Send Accounting AIR + * + * TTP/