/// <summary>
        /// A <b>Alias</b> transaction is used to manage an account number alias, such as a phone number,
        /// for a stored value account. The transaction can be used to Add an alias to an existing account,
        /// Delete an alias from an existing account or Create a new stored value account and add an alias
        /// to the new account.
        /// </summary>
        /// <param name="action">Type of Alias action requested.</param>
        /// <param name="giftCard">The gift card information (leave null for CREATE action).</param>
        /// <param name="alias">Alternate identifier used to reference a stored value account.</param>
        /// <returns>The <see cref="HpsGiftCardAlias"/>.</returns>
        public HpsGiftCardAlias Alias(HpsGiftCardAliasAction action, HpsGiftCard giftCard, string alias)
        {
            var gatewayAction = GiftCardAliasReqBlock1TypeAction.ADD;

            switch (action)
            {
            case HpsGiftCardAliasAction.Create: gatewayAction = GiftCardAliasReqBlock1TypeAction.CREATE; break;

            case HpsGiftCardAliasAction.Delete: gatewayAction = GiftCardAliasReqBlock1TypeAction.DELETE; break;
            }

            /* Build the transaction request. */
            var transaction = new PosRequestVer10Transaction
            {
                Item = new PosGiftCardAliasReqType
                {
                    Block1 = new GiftCardAliasReqBlock1Type
                    {
                        Action   = gatewayAction,
                        Alias    = alias,
                        CardData = HydrateGiftCardData(giftCard)
                    }
                },
                ItemElementName = ItemChoiceType1.GiftCardAlias
            };

            /* Submit the transaction. */
            var rsp = DoTransaction(transaction).Ver10;

            HpsGatewayResponseValidation.CheckResponse(rsp, ItemChoiceType2.GiftCardAlias);

            var aliasRsp = (PosGiftCardAliasRspType)rsp.Transaction.Item;

            HpsIssuerResponseValidation.CheckResponse(rsp.Header.GatewayTxnId,
                                                      aliasRsp.RspCode.ToString(CultureInfo.InvariantCulture), aliasRsp.RspText, HpsCardType.Gift);

            /* Start to fill out a new transaction response (HpsGiftCardAddValue). */
            var response = new HpsGiftCardAlias
            {
                Header        = HydrateTransactionHeader(rsp.Header),
                TransactionId = rsp.Header.GatewayTxnId,
                GiftCard      = new HpsGiftCard
                {
                    Value = aliasRsp.CardData.CardNbr
                },
                ResponseCode = aliasRsp.RspCode.ToString(CultureInfo.InvariantCulture),
                ResponseText = aliasRsp.RspText
            };

            return(response);
        }
        /// <summary>
        /// A <b>Alias</b> transaction is used to manage an account number alias, such as a phone number,
        /// for a stored value account. The transaction can be used to Add an alias to an existing account,
        /// Delete an alias from an existing account or Create a new stored value account and add an alias
        /// to the new account.
        /// </summary>
        /// <param name="action">Type of Alias action requested.</param>
        /// <param name="giftCard">The gift card information (leave null for CREATE action).</param>
        /// <param name="alias">Alternate identifier used to reference a stored value account.</param>
        /// <returns>The <see cref="HpsGiftCardAlias"/>.</returns>
        public HpsGiftCardAlias Alias(HpsGiftCardAliasAction action, HpsGiftCard giftCard, string alias)
        {
            var gatewayAction = GiftCardAliasReqBlock1TypeAction.ADD;
            switch (action)
            {
                case HpsGiftCardAliasAction.Create: gatewayAction = GiftCardAliasReqBlock1TypeAction.CREATE; break;
                case HpsGiftCardAliasAction.Delete: gatewayAction = GiftCardAliasReqBlock1TypeAction.DELETE; break;
            }

            /* Build the transaction request. */
            var transaction = new PosRequestVer10Transaction
            {
                Item = new PosGiftCardAliasReqType
                {
                    Block1 = new GiftCardAliasReqBlock1Type
                    {
                        Action = gatewayAction,
                        Alias = alias,
                        CardData = HydrateGiftCardData(giftCard)
                    }
                },
                ItemElementName = ItemChoiceType1.GiftCardAlias
            };

            /* Submit the transaction. */
            var rsp = DoTransaction(transaction).Ver10;
            HpsGatewayResponseValidation.CheckResponse(rsp, ItemChoiceType2.GiftCardAlias);

            var aliasRsp = (PosGiftCardAliasRspType)rsp.Transaction.Item;
            HpsIssuerResponseValidation.CheckResponse(rsp.Header.GatewayTxnId,
                aliasRsp.RspCode.ToString(CultureInfo.InvariantCulture), aliasRsp.RspText);

            /* Start to fill out a new transaction response (HpsGiftCardAddValue). */
            var response = new HpsGiftCardAlias
            {
                Header = HydrateTransactionHeader(rsp.Header),
                TransactionId = rsp.Header.GatewayTxnId,
                GiftCard = new HpsGiftCard
                {
                    Value = aliasRsp.CardData.CardNbr
                },
                ResponseCode = aliasRsp.RspCode.ToString(CultureInfo.InvariantCulture),
                ResponseText = aliasRsp.RspText
            };

            return response;
        }