/// <summary>
        /// Build the ReferralType from the ReferralTypeDataContract.
        /// </summary>
        /// <returns>
        /// The result of the operation.
        /// </returns>
        protected virtual ResultCode BuildReferralType()
        {
            ResultCode result = ResultCode.Success;

            string passedRewardRecipient = ((int)Context[Key.RewardRecipient]).ToString();
            string rewardRecipient       = ((RewardRecipient)Context[Key.RewardRecipient]).ToString();

            if (passedRewardRecipient != rewardRecipient)
            {
                ReferralEventRewardDataContract signupReward = new ReferralEventRewardDataContract
                {
                    ReferralEvent = ReferralEvent.Signup.ToString(),
                    RewardId      = CommerceServiceConfig.Instance.UserSignupReferralRewardId,
                    PerUserLimit  = 0 // No limit
                };
                List <ReferralEventRewardDataContract> referalEventRewards = new List <ReferralEventRewardDataContract>
                {
                    signupReward
                };
                ReferralTypeDataContract referralTypeDataContract = new ReferralTypeDataContract
                {
                    ReferralVector       = ReferralVector.Unknown.ToString(),
                    RewardRecipient      = rewardRecipient,
                    ReferralEventRewards = referalEventRewards
                };
                ReferralType referralType = new ReferralType()
                {
                    ReferrerId   = (Guid)Context[Key.GlobalUserId],
                    ReferrerType = ReferrerType.User
                };

                result = BuildReferralType(referralTypeDataContract, referralType);
            }
            else
            {
                result = ResultCode.InvalidParameter;
            }

            return(result);
        }
        /// <summary>
        /// Populate the specified ReferralType from the specified ReferralTypeDataContract.
        /// </summary>
        /// <param name="referralTypeDataContract">
        /// The ReferralTypeDataContract to use to populate the ReferralType.
        /// </param>
        /// <param name="referralType">
        /// The ReferralType to populate.
        /// </param>
        /// <returns>
        /// The result of the operation.
        /// </returns>
        /// <exception cref="ArgumentNullException">
        /// * Parameter referralTypeDataContract cannot be null.
        /// -OR-
        /// * Parameter referralType cannot be null.
        /// </exception>
        protected internal ResultCode BuildReferralType(ReferralTypeDataContract referralTypeDataContract,
                                                        ReferralType referralType)
        {
            if (referralTypeDataContract == null)
            {
                throw new ArgumentNullException("referralTypeDataContract", "Parameter referralTypeDataContract cannot be null.");
            }

            if (referralType == null)
            {
                throw new ArgumentNullException("referralType", "Parameter referralType cannot be null.");
            }

            ResultCode result = ResultCode.Success;

            ReferralVector  referralVector  = ReferralVector.Twitter;
            RewardRecipient rewardRecipient = RewardRecipient.Referrer;
            ReferralEvent   referralEvent   = ReferralEvent.Signup;
            bool            stepResult      = true;

            stepResult = Enum.TryParse <ReferralVector>(referralTypeDataContract.ReferralVector, true, out referralVector);
            if (stepResult == true)
            {
                referralType.ReferralVector = referralVector;

                stepResult = Enum.TryParse <RewardRecipient>(referralTypeDataContract.RewardRecipient, true, out rewardRecipient);
            }
            if (stepResult == true)
            {
                referralType.RewardRecipient = rewardRecipient;

                stepResult = referralTypeDataContract.ReferralEventRewards != null;
            }
            if (stepResult == true)
            {
                Dictionary <ReferralEvent, bool> registeredEvents = new Dictionary <ReferralEvent, bool>();

                foreach (ReferralEventRewardDataContract referralEventRewardDataContract
                         in referralTypeDataContract.ReferralEventRewards)
                {
                    ReferralEventReward referralEventReward = new ReferralEventReward();

                    stepResult = Enum.TryParse <ReferralEvent>(referralEventRewardDataContract.ReferralEvent, true,
                                                               out referralEvent);
                    if (stepResult == true)
                    {
                        if (registeredEvents.ContainsKey(referralEvent) == false)
                        {
                            registeredEvents[referralEvent] = true;
                        }
                        else
                        {
                            stepResult = false;
                        }
                    }
                    if (stepResult == true)
                    {
                        referralEventReward.ReferralEvent = referralEvent;

                        stepResult = referralEventRewardDataContract.RewardId != Guid.Empty;
                    }
                    if (stepResult == true)
                    {
                        referralEventReward.RewardId = referralEventRewardDataContract.RewardId;

                        stepResult = referralEventRewardDataContract.PerUserLimit >= 0;
                    }
                    if (stepResult == true)
                    {
                        referralEventReward.PerUserLimit = referralEventRewardDataContract.PerUserLimit;

                        referralType.ReferralEventRewards.Add(referralEventReward);
                    }
                    else
                    {
                        break;
                    }
                }
            }
            if (stepResult == true)
            {
                stepResult = referralType.ReferralEventRewards.Count > 0;
            }
            if (stepResult == true)
            {
                Context[Key.ReferralType] = referralType;
                ReferralType = referralType;
            }
            else
            {
                result = ResultCode.InvalidParameter;
            }

            return(result);
        }