-
Notifications
You must be signed in to change notification settings - Fork 0
/
SummaryReport.cs
133 lines (114 loc) · 5.38 KB
/
SummaryReport.cs
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
using Sitecore.Data.Items;
using Sitecore.Diagnostics;
using Sitecore.Modules.EmailCampaign;
using Sitecore.Modules.EmailCampaign.Core;
using Sitecore.Modules.EmailCampaign.Core.Analytics;
using Sitecore.Modules.EmailCampaign.Messages;
using Sitecore.Modules.EmailCampaign.Speak.Web.Core;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using Sitecore.StringExtensions;
using Sitecore.Data;
using Sitecore.ContentSearch;
using Sitecore.ContentSearch.SearchTypes;
namespace Sitecore.Support.ECMReports
{
public class SummaryReport
{
// Fields
private readonly AnalyticsFactory analyticsFactory = AnalyticsFactory.Instance;
private readonly ID rootID;
// Methods
public SummaryReport()
{
if (ID.IsNullOrEmpty(rootID))
{
rootID = UIFactory.Instance.GetSpeakContext().ManagerRoot.InnerItem.ID;
}
}
public SummaryReport(string managerRootID)
{
if (!String.IsNullOrEmpty(managerRootID))
{
rootID = ID.Parse(managerRootID);
}
}
private SummaryReportMessageInfo GetSummaryInfo(MessageItem message, PlanData planData)
{
MessageStateInfo messageStateInfo = this.GetMessageStateInfo(message);
SummaryReportMessageInfo info = new SummaryReportMessageInfo
{
ID = messageStateInfo.ID,
Name = messageStateInfo.Name,
Sent = messageStateInfo.Total, //returns GetAutomationStatesCount
Delivered = messageStateInfo.Sent, //return (this.Processed - this.Failed); Processed means all that are not in RecipientsQueued or Send In Progress state
Date = messageStateInfo.Updated,
};
//int emailCount = -1;
if (planData != null)
{
PlanStatistics planStatistics = this.analyticsFactory.GetPlanStatistics(planData);
info.Opens = planStatistics.GetOpened();
info.Clicks = planStatistics.GetClicked();
//emailCount = planStatistics.GetActual(); // return (((this.GetTotal() - this.Data.InvalidAddress) - this.Data.MailBounced) - this.Data.Unsent);
}
return info;
}
protected virtual MessageStateInfo GetMessageStateInfo(MessageItem message)
{
return new MessageStateInfo(message);
}
public MessageItem GetMessage(SearchResultItem i)
{
return Factory.GetMessage(i.ItemId);
}
public List<SummaryReportMessageInfo> GetRecentlyDispatched(string query, string sortArgument, int startIndex, int pageSize)
{
Assert.ArgumentNotNullOrEmpty(query, "query");
Assert.ArgumentNotNullOrEmpty(sortArgument, "sortArgument");
List<MessageItem> messages = (from m in Enumerable.Select<SearchResultItem, MessageItem>(this.GetSortedItems(query, sortArgument).Skip<SearchResultItem>(startIndex).Take<SearchResultItem>(pageSize),
this.GetMessage)
where m != null
select m).ToList<MessageItem>();
if (messages.Count == 0)
{
return new List<SummaryReportMessageInfo>();
}
List<PlanData> planDataList = this.analyticsFactory.GetAnalyticsDataGateway().GetPlanData(messages);
return (from m in messages select this.GetSummaryInfo(m, Enumerable.FirstOrDefault<PlanData>(planDataList, (Func<PlanData, bool>)(item => (item.PlanId == m.PlanId.ToGuid()))))).ToList<SummaryReportMessageInfo>();
}
protected virtual IEnumerable<SearchResultItem> GetSortedItems(string query, string sortArgument)
{
Assert.ArgumentNotNullOrEmpty(query, "query");
Assert.ArgumentNotNullOrEmpty(sortArgument, "sortArgument");
Func<SearchResultItem, object> func;
if (sortArgument.StartsWith("Name "))
{
func = i => i.DisplayName;
}
else
{
func = i => i.Updated;
}
List<SearchResultItem> items;
using (var searchContext = ContentSearchManager.GetIndex("sitecore_master_index").CreateSearchContext())
{
IQueryable<SearchResultItem> queryable = searchContext.GetQueryable<SearchResultItem>();
IOrderedEnumerable<SearchResultItem> results;
if (!sortArgument.EndsWith(" ASC", StringComparison.OrdinalIgnoreCase))
{
results = queryable.Where(x => x.Paths.Contains(rootID) && ((x["state"] == "Sent") || (x["state"] == "Sending"))).OrderByDescending(func);
}
else
{
results = queryable.Where(x => x.Paths.Contains(rootID) && ((x["state"] == "Sent") || (x["state"] == "Sending"))).OrderBy(func);
}
items = results.ToList();
}
return items;
}
}
}