/// <summary>
        /// Merges the specified subscriber triad.
        /// </summary>
        /// <param name="provisionedSubscriber">Subscriber object from provisioning</param>
        /// <param name="billedSubscriber">Subscriber object from billing.</param>
        /// <param name="provisionedSubscriberPhones">Phone object from provisioning.</param>
        /// <returns></returns>
        public static CompositeSubscriber Merge(SubscriberDto provisionedSubscriber, BillingandServiceAccountDto billedSubscriber, IEnumerable<PhoneDto> provisionedSubscriberPhones )
        {
            var compositeSubscriber = new CompositeSubscriber
            {
                SubscriberTriad = provisionedSubscriber ?? new SubscriberDto(),
                SubscriberDpi = (billedSubscriber != null && billedSubscriber.CustomerAccount != null)
                    ? billedSubscriber.CustomerAccount
                    : null
            };

            var billedServiceAccounts = (billedSubscriber != null && billedSubscriber.ServiceAccounts != null)
                                            ? billedSubscriber.ServiceAccounts : new List<ServiceAccountDto>();

            compositeSubscriber.DpiServices = MergePhonesAndServiceAccounts(billedServiceAccounts, provisionedSubscriberPhones.ToList(), compositeSubscriber.SubscriberTriad.ID);

            return compositeSubscriber;
        }
Exemple #2
0
        /// <summary>
        /// Loads the composite subscriber.
        /// </summary>
        /// <param name="usi">The usi.</param>
        /// <param name="dpiRegion"></param>
        /// <param name="userDto">The user dto.</param>
        /// <returns></returns>
        public CompositeSubscriber LoadCompositeSubscriber(string usi, string dpiRegion, UserDto userDto)
        {
            var compositeSubscriber = new CompositeSubscriber();
            var rosettianResults = new SubscriberDto();
            var provisionedPhonesResults = new List<PhoneDto>();
            BillingandServiceAccountDto esbResults;
            var esbResultsEnterpriseServiceExceptionFound = false;
            var headerArgs = new HeaderArgs(dpiRegion, userDto.Name, String.Empty, userDto.Name, userDto.Email, userDto.Role);
            Task<SubscriberDto> rosettianResponse = null;
            Task<BillingandServiceAccountDto> esbGetAccountResponse = null;
            Task<List<PhoneDto>> provisioningSubPhonesReponse = null;

            try
            {
                rosettianResponse = Task.Factory.StartNew(() => _rosettianService.LoadSubscriber(usi, userDto));
                esbGetAccountResponse = Task.Factory.StartNew(() => _enterpriseService.GetBillingServiceAccounts(usi, headerArgs));
                provisioningSubPhonesReponse = Task.Factory.StartNew(() => _rosettianService.LoadSubscriberPhones(usi, userDto));
                Task.WaitAll(rosettianResponse, esbGetAccountResponse, provisioningSubPhonesReponse);

            }
            catch (AggregateException ae)
            {
                foreach (var e in ae.InnerExceptions)
                {
                    var handled = false;
                    var isFaultException = (e is FaultException<ValidationFaultDto>);
                    var isServiceError = (e is MessageSecurityException || e is ServerTooBusyException || e is CommunicationException || e is TimeoutException);

                    // Note: if you reverse the order below, VS2013 warns you that isFaultException is always false.
                    if ((isFaultException) || (isServiceError))
                    {
                        // Throw exception if LoadSubscriber and not LoadSubscriberPhones
                        if ((e.StackTrace.Contains("LoadSubscriber")) && (!(e.StackTrace.Contains("LoadSubscriberPhones"))))
                        {
                            var myException = new Exception("Error retrieving Provisioning information for subscriber from Triad, unable to proceed.", e);
                            _errorLoggingService.LogErrorNoContext(myException);
                            throw myException;
                        }

                        // Do not throw exception if LoadSubscriberPhones
                        if (e.StackTrace.Contains("LoadSubscriberPhones"))
                        {
                            var myException = new Exception("Error retrieving Provisioning information for subscriber's phones from Triad, preceeding with loading the subscriber.", e);
                            _errorLoggingService.LogErrorNoContext(myException);
                            handled = true;
                        }
                    }

                    if (!handled)
                    {
                        const string baseErrorMessage = "Error retrieving DPI information for subscriber";
                        if (e is EnterpriseServiceException)
                        {
                            esbResultsEnterpriseServiceExceptionFound = true;
                            var myException = new Exception(String.Format("{0}, as error is an EnterpriseServiceException we are going to proceed", baseErrorMessage));
                            _errorLoggingService.LogErrorNoContext(myException);
                            handled = true;
                        }
                        else if (!isFaultException)
                        {
                            var myException = new Exception(String.Format("{0}, unable to proceed.", baseErrorMessage), e);
                            _errorLoggingService.LogErrorNoContext(myException);
                            throw myException;
                        }
                    }

                    if (!handled)
                    {
                        var myException = new Exception("Unknown error condition retrieving either Provisioning or DPI information for subscriber, unable to proceed.", e);
                        _errorLoggingService.LogErrorNoContext(myException);
                        throw myException;
                    }
                }
            }
            catch (Exception e)
            {
                var myException = new Exception("Unknown error condition retrieving either Provisioning or DPI information for subscriber, unable to proceed.", e);
                _errorLoggingService.LogErrorNoContext(myException);
                throw myException;
            }

            rosettianResults = ((rosettianResponse != null) && (!rosettianResponse.IsFaulted)) ? rosettianResponse.Result : null;
            provisionedPhonesResults = ((provisioningSubPhonesReponse != null) && (!provisioningSubPhonesReponse.IsFaulted)) ? provisioningSubPhonesReponse.Result : null;
            esbResults = ((esbGetAccountResponse != null) && (!esbGetAccountResponse.IsFaulted)) ? esbGetAccountResponse.Result : null;
            compositeSubscriber = FacadeExtensions.Merge(rosettianResults, esbResults, provisionedPhonesResults);
            compositeSubscriber.BillingRegion = dpiRegion;
            compositeSubscriber.ProvisionedUsi = usi;
            // User Story 11766 and Bug 11769 - Adding a new error message for the case where ESB errors out or times out and we don't get any response
            if ((esbResults == null) && (!esbResultsEnterpriseServiceExceptionFound))
            {
                compositeSubscriber.SubscriberErrorMessages = "DPI data request timed out";
            }

            return compositeSubscriber;
        }