/// <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; }
/// <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; }