/// <summary>
        /// Scrapes a changeset with portfolio adjustments.
        /// Changeset isn't guaranteed because changeset may not have any changes at all.
        /// </summary>
        public Changeset TryTransformToChangeset(RootModel model, String username)
        {
            var models = this.traverser.TraverseGlobe(model.Globe);

            IEnumerable <IChange> changes = models
                                            .Select(x => this.TryTransformToChangeOnceResolved(x))
                                            .Where(x => x != null);

            Changeset result;

            if (changes.Any())
            {
                result = new Changeset(model.LatestTtbptChangeset, model.TargetingType.Id, model.Portfolio.Id, username, changes);
            }
            else
            {
                result = null;
            }
            return(result);
        }
        private void SendNotification(String ttName, String portfolioName, ChangingPsto.Changeset pstoChangeset, ChangingTtbbv.Changeset ttbbvChangeset, ChangingTtbpt.Changeset ttbptChangeset, IDataManager manager, SecurityRepository securityRepository, BasketRepository basketRepository, PortfolioRepository portfolioRepository, string userEmail)
        {
            try
            {
                MailMessage mail = new MailMessage();
                mail.IsBodyHtml = false;

                var pstoChanges  = this.pstoChangesetApplier.PrepareToSend(pstoChangeset, manager, securityRepository, portfolioRepository, portfolioName);
                var ttbbvChanges = this.ttbbvChangesetApplier.PrepareToSend(ttbbvChangeset, manager, securityRepository, basketRepository, ttName);
                var ttbptChanges = this.ttbptChangesetApplier.PrepareToSend(ttbptChangeset, manager, securityRepository, basketRepository, ttName, portfolioName);


                mail.Body    = "The following Asset Allocation changes were made to the Global Active Accounts:\n" + (ttbbvChangeset != null ? String.Join("\n", ttbbvChanges) : "\n") + (ttbptChangeset != null ? String.Join("\n", ttbptChanges) : "\n") + (pstoChangeset != null ? String.Join("\n", pstoChanges) : "");
                mail.Subject = "Targeting: Asset Allocation Changes";
                MailSender.SendTargetingAlert(mail, userEmail);
            }
            catch (Exception e)
            {
                throw new EmailNotificationException("See inner exception for details.", e);
            }
        }