public void Apply(Int32 calculationId, Changeset changeset, IDataManager manager)
        {
            var latestChangeSet = manager.GetLatestPortfolioSecurityTargetChangeSet();

            if (changeset.LatestChangeset.Id < latestChangeSet.Id)
            {
                throw new ValidationException(
                          new ErrorIssue("User \"" + latestChangeSet.Username + "\" modified the P-S-T composition on " + latestChangeSet.Timestamp + ".")
                          );
            }

            var changesetIdRange = manager.ReservePortfolioSecurityTargetChangesetIds(1);

            if (!changesetIdRange.MoveNext())
            {
                throw new ApplicationException("There is no ID reserved for the P-S-T changeset.");
            }
            var changesetId = changesetIdRange.Current;


            var changesetInfo = new BuPortfolioSecurityTargetChangesetInfo(
                changesetId,
                changeset.Username,
                DateTime.Now, /* is going to be ignored */
                calculationId
                );

            manager.InsertPortfolioSecurityTargetChangeset(changesetInfo);

            var changes       = changeset.Changes;
            var changeIdRange = manager.ReservePortfolioSecurityTargetChangeIds(changes.Count());

            foreach (var change in changes)
            {
                if (!changeIdRange.MoveNext())
                {
                    throw new ApplicationException("There is no ID reserved for the P-S-T change.");
                }
                var changeId = changeIdRange.Current;

                var resolver = new Apply_IPstChangeResolver(this, manager, changesetId, changeId);
                change.Accept(resolver);
            }
        }
        public MailMessage PrepareToSend(Changeset changeset, IDataManager manager, SecurityRepository securityRepository)
        {
            var result = new MailMessage();

            result.IsBodyHtml = false;

            var date = DateTime.Now;

            foreach (var change in changeset.Changes)
            {
                var resolver = new Mail_IPSTChangeResolver(this, manager, securityRepository, result, changeset.Username, date);
                change.Accept(resolver);
            }

            result.Body = "The following changes were made to " + this.PortfolioName + "\n\n" + result.Body;

            result.Subject = "Targeting: Stock Selection changes in " + this.PortfolioName;
            return(result);
        }
        public Changeset TryTransformToChangeset(String username, RootModel root)
        {
            var items   = root.Items;
            var changes = this.TransformItems(root.PortfolioId, items);


            Changeset result;

            if (changes.Any())
            {
                result = new Changeset(
                    root.LatestChangeset,
                    username,
                    changes
                    );
            }
            else
            {
                result = null;
            }

            return(result);
        }