} // RiskAssessment

    public RiskAssessment(RiskAssessmentData rad, RiskMap riskMap) {
      dateStamp_ = rad.Timestamp.Date;
      name_ = riskMap.Name;

      var resolved = rad.ResolvedRisks();
      var managed = rad.ManagedRisks();
      var risks = rad.Risks();
      foreach (Guid id in riskMap.Risks.Select(r => r.Id)) {
        if (resolved.Contains(id))
          resolved_.Add(id);
        else if (managed.Contains(id))
          managed_.Add(id);
        else if (risks.Contains(id))
          risks_.Add(id);
        else
          notRisks_.Add(id);
      } // foreach ...

      var themes = riskMap.AllThemes();

      foreach (var theme in themes) {
        var categoryAssessments = buildThemeCategories(theme, riskMap);
        themeAssessments_.Add(new ThemeAssessment(theme, categoryAssessments, risks_, managed_));
      } // foreach
    } // RiskAssessment
    public Client(
      ClientData client, 
      RiskMap riskMap, 
      IList<ProjectQuestionData> projectQuestions,
      IList<ReferralAgency> referralAgencies) :
        base(client) {

      client.RiskAssessments.Sort(RiskSort);
      riskAssessment_ = new RiskAssessment(client.RiskAssessments, riskMap);

      questions_ = prepareQuestionAnswers(client, projectQuestions);
      referrals_ = prepareReferrals(client, referralAgencies);

      if (client_.Notes == null)
        return;

      generalNote_ = client_.Notes.
        Where(n => n.Type == NoteType.General).
        OrderByDescending(n => n.Timestamp).
        Select(n => n.Text).
        FirstOrDefault();

      timeLine_ = buildTimeLine(client.Notes, client.RiskAssessments, riskMap);
      files_ = client.Notes.
        Where(n => n.Type == NoteType.File).
        OrderByDescending(n => n.Timestamp).
        ToList();
    } // Client
    public RiskAssessment(IList<RiskAssessmentData> rads, RiskMap riskMap) :
        this(rads.Count != 0 ? rads.First() : new RiskAssessmentData(), riskMap) {

      if (rads.Count != 0) {
        var allRiskAssessments = rads.Select(r => new RiskAssessment(r, riskMap)).ToList();
        setInitialScores(allRiskAssessments.Last());
        setHighScores(allRiskAssessments);
      } // if ...
    } // RiskAssessment
    } // RiskSort

    private static List<TimelineEntry> buildTimeLine(List<NoteData> notes,
                                                     List<RiskAssessmentData> riskAssessments,
                                                     RiskMap riskMap) {
                                                     Dictionary<DateTime, TimelineEntry> timeLineEntries = new Dictionary<DateTime, TimelineEntry>();

      foreach (var nd in notes.OrderByDescending(n => n.Timestamp)) {
        DateTime date = nd.Timestamp.Date;
        if (!timeLineEntries.Keys.Contains(date))
          timeLineEntries.Add(date, new TimelineEntry(date));
        TimelineEntry tle = timeLineEntries[date];

        if (nd.Type == NoteType.Narrative)
          tle.addNote(nd);
        if ((nd.Type == NoteType.Registered) ||
            (nd.Type == NoteType.Reopen) ||
            (nd.Type == NoteType.DidNotAttend) ||
            (nd.Type == NoteType.Discharged))
          tle.addNote(nd.Text);
        if (nd.Type == NoteType.File)
          tle.addNote("Uploaded " + nd.Text);
        if ((nd.Type == NoteType.Event) ||
            (nd.Type == NoteType.Referral))
          tle.addAction(nd.Text);
      } // foreach note

      foreach (var rad in riskAssessments.OrderByDescending(rad => rad.Timestamp)) {
        DateTime date = rad.Timestamp.Date;
        if (!timeLineEntries.Keys.Contains(date))
          timeLineEntries.Add(date, new TimelineEntry(date));
        TimelineEntry tle = timeLineEntries[date];

        RiskAssessment ra = new RiskAssessment(rad, riskMap);
        tle.addRiskAssessment(ra);
      } // foreach riskassessment

      List<TimelineEntry> timeLine = timeLineEntries.Values.OrderByDescending(tle => tle.Datestamp).ToList();
      if (timeLine.Count > 0) {
        TimelineEntry last = timeLine.Last();
        if (last.RiskScores == null)
          last.defaultRiskScores(riskMap);
        List<TimelineEntry.RiskScore> riskScore = last.RiskScores;
        for (int i = timeLine.Count - 1; i >= 0; --i) {
          TimelineEntry tle = timeLine[i];
          if (tle.RiskScores == null)
            tle.RiskScores = riskScore;
          else
            riskScore = tle.RiskScores;
        } // foreach
      } // if ...
      return timeLine;        
    } // 
    } // setHighScores

    private IList<CategoryAssessment> buildThemeCategories(string themeName, RiskMap riskMap) {
      var themeCategories = new List<CategoryAssessment>();
      foreach (var category in riskMap.AllCategories()) {
        var catRisks = riskMap.Risks.
          Where(r => r.Theme == themeName).
          Where(r => r.Category == category);

        if (catRisks.Count() == 0)
          continue;

        var risks = catRisks.
          OrderBy(r => r.Grouping).
          ThenBy(r => riskScoreSort(r)).
          Select(r => new CategoryRisk(r, riskStatus(r))).
          ToList();
        themeCategories.Add(
          new CategoryAssessment(
            category,
            risks)
        );
      } // foreach
      return themeCategories;
    } // buildThemeCategories
 public Client(ClientData client, RiskMap riskMap) : this(client, riskMap, null, null) { }
 } // addRiskAssessment
 public void defaultRiskScores(RiskMap riskMap) {
   riskScores_ = riskMap.AllThemes().
                    Select(t => new RiskScore { Title = t, Score = "0" }).
                    ToList();
 } // defaultRiskScores