/// <summary> /// Renders the specified report. /// </summary> /// <param name="report">The report.</param> /// <returns></returns> public string Render(VisitPerDateReport report) { StringBuilder builder = new StringBuilder(); RenderHeader(builder, report); RenderBody(builder, report); RenderFooter(builder, report); return(builder.ToString()); }
/// <summary> /// Renders the specified report. /// </summary> /// <param name="report">The report.</param> /// <returns></returns> public string Render(VisitPerDateReport report) { StringBuilder builder = new StringBuilder(); RenderHeader(builder, report); RenderBody(builder, report); RenderFooter(builder, report); return builder.ToString(); }
/// <summary> /// Builds the visit per date report. /// </summary> /// <param name="start">The start.</param> /// <param name="end">The end.</param> /// <returns></returns> public VisitPerDateReport BuildVisitPerDateReport(DateTime start, DateTime end) { DataFeed feed = GetVisitPerDateDataFeed(start, end); if (feed.Entries.Count == 0) { throw new Exception("No entries found"); } else { DataSource dataSource = feed.DataSource; VisitPerDateReport report = new VisitPerDateReport( dataSource.TableName.TrimEnd('/'), start, end); foreach (DataEntry entry in feed.Entries) { DateTime date = DateTime.MinValue; int visits = -1; int pageViews = -1; Dimension dateDimension = entry.Dimensions.FirstOrDefault( d => d.Name == Constants.Dimensions.Date); if (dateDimension != null) { date = DateTime.ParseExact(dateDimension.Value, "yyyyMMdd", CultureInfo.InvariantCulture); } Metric visitsMetric = entry.Metrics.FirstOrDefault( m => m.Name == Constants.Metrics.Visits); if (visitsMetric != null) { visits = Convert.ToInt32(visitsMetric.Value); } Metric pageViewsMetric = entry.Metrics.FirstOrDefault( m => m.Name == Constants.Metrics.Pageviews); if (pageViewsMetric != null) { pageViews = Convert.ToInt32(pageViewsMetric.Value); } report.AddRecord(date, visits, pageViews); } return(report); } }
/// <summary> /// Renders the body. /// </summary> /// <param name="builder">The builder.</param> /// <param name="report">The report.</param> private void RenderBody(StringBuilder builder, VisitPerDateReport report) { builder.Append( @"<table class='report'> <tr> <td>Date ▼</td> <td>Visits</td> <td>Pageviews</td> <td>% Pageviews</td> </tr>"); foreach (var record in report.Records) { builder.AppendFormat( @"<tr> <td class='leftJustify'>{0}</td> <td>{1}</td> <td>{2}</td> <td>{3:P}</td> </tr>", GetFormattedDate(record.Date), record.Visits, record.Pageviews, Convert.ToDecimal(record.Pageviews) / Convert.ToDecimal(report.TotalPageviews)); } builder.AppendFormat( @"<tr> <td></td> <td>{0}</td> <td>{1}</td> <td>{2:P}</td> </tr>", report.TotalVisits, report.TotalPageviews, 1); builder.Append(@"</table>"); }
/// <summary> /// Builds the visit per date report. /// </summary> /// <param name="start">The start.</param> /// <param name="end">The end.</param> /// <returns></returns> public VisitPerDateReport BuildVisitPerDateReport(DateTime start, DateTime end) { DataFeed feed = GetVisitPerDateDataFeed(start, end); if (feed.Entries.Count == 0) { throw new Exception("No entries found"); } else { DataSource dataSource = feed.DataSource; VisitPerDateReport report = new VisitPerDateReport( dataSource.TableName.TrimEnd('/'), start, end); foreach (DataEntry entry in feed.Entries) { DateTime date = DateTime.MinValue; int visits = -1; int pageViews = -1; Dimension dateDimension = entry.Dimensions.FirstOrDefault( d => d.Name == Constants.Dimensions.Date); if (dateDimension != null) { date = DateTime.ParseExact(dateDimension.Value, "yyyyMMdd", CultureInfo.InvariantCulture); } Metric visitsMetric = entry.Metrics.FirstOrDefault( m => m.Name == Constants.Metrics.Visits); if (visitsMetric != null) { visits = Convert.ToInt32(visitsMetric.Value); } Metric pageViewsMetric = entry.Metrics.FirstOrDefault( m => m.Name == Constants.Metrics.Pageviews); if (pageViewsMetric != null) { pageViews = Convert.ToInt32(pageViewsMetric.Value); } report.AddRecord(date, visits, pageViews); } return report; } }
/// <summary> /// Renders the header. /// </summary> /// <param name="builder">The builder.</param> /// <param name="report">The report.</param> private void RenderHeader(StringBuilder builder, VisitPerDateReport report) { builder.AppendFormat( "<span class='sectionHeader'>{0} (by visit date)</span><br /><br />", report.WebsiteName); }
/// <summary> /// Renders the footer. /// </summary> /// <param name="builder">The builder.</param> /// <param name="report">The report.</param> private void RenderFooter(StringBuilder builder, VisitPerDateReport report) { builder.Append("<br />"); }
public static void Main(String[] args) { try { DateTime start; if (string.IsNullOrEmpty(startDateString) || !DateTime.TryParse(startDateString, out start)) { start = DateTime.Now.AddDays(-7); // assuming this app runs on Mondays } DateTime end; if (string.IsNullOrEmpty(endDateString) || !DateTime.TryParse(endDateString, out end)) { end = DateTime.Now.AddDays(-1); // assuming this app runs on Mondays } string outputFileName = string.Format(@"{0}\VistorReport_{1:ddMMyyyy}.html", outputFolderPath, DateTime.Now); Trace.WriteLine(string.Format( "[{0}] Generating Site 1 & Site 2 visitor reports from {1:MM/dd/yyyy} to {2:MM/dd/yyyy}", DateTime.Now, start, end)); StringBuilder htmlBody = new StringBuilder(); VisitPerDateReportHtmlRenderer visitPerDateReportRenderer = new VisitPerDateReportHtmlRenderer(); VisitPerRegionHtmlReportRenderer visitPerRegionReportRenderer = new VisitPerRegionHtmlReportRenderer(); Trace.Indent(); // Site 1 visit by date report Trace.WriteLine("Creating Site 1 report builder..."); IReportBuilder site1ReportBuilder = new GoogleAnalyticsReportBuilder( userName, password, site1TableId); Trace.WriteLine("Generating Site 1 visit by date report..."); VisitPerDateReport site1VisitPerDateReport = site1ReportBuilder.BuildVisitPerDateReport( start, end); Trace.WriteLine("Rendering Site 1 visit by date report..."); htmlBody.Append(visitPerDateReportRenderer.Render(site1VisitPerDateReport)); // Site 1 visit by region report Trace.WriteLine("Generating Site 1 visit by region report..."); VisitPerRegionReport site1VisitPerRegionReport = site1ReportBuilder.BuildVisitPerRegionReport( start, end); Trace.WriteLine("Rendering Site 1 visit by region report..."); htmlBody.Append(visitPerRegionReportRenderer.Render(site1VisitPerRegionReport)); // Site 2 visit by date report Trace.WriteLine("Creating Site 2 report builder..."); IReportBuilder site2ReportBuilder = new GoogleAnalyticsReportBuilder( userName, password, site2TableId); Trace.WriteLine("Generating Site 2 visit by date report..."); VisitPerDateReport site2VisitPerDateReport = site2ReportBuilder.BuildVisitPerDateReport( start, end); Trace.WriteLine("Rendering Site 2 visit by date report..."); htmlBody.Append(visitPerDateReportRenderer.Render(site2VisitPerDateReport)); // Site 1 visit by region report Trace.WriteLine("Generating Site 2 visit by region report..."); VisitPerRegionReport site2VisitPerRegionReport = site2ReportBuilder.BuildVisitPerRegionReport( start, end); Trace.WriteLine("Rendering Site 2 visit by region report..."); htmlBody.Append(visitPerRegionReportRenderer.Render(site2VisitPerRegionReport)); Trace.WriteLine("Adding styles to final output..."); string html = HtmlReportsHelper.WrapStyles(htmlBody.ToString(), styleSheetPath); Trace.WriteLine(string.Format("Wrting output to file {0}", outputFileName)); File.WriteAllText(outputFileName, html); Trace.Unindent(); Trace.WriteLine(string.Format("[{0}] Report generation completed.", DateTime.Now)); Trace.WriteLine(string.Empty); } catch (Exception ex) { Trace.WriteLine("Exception Caught!"); Trace.WriteLine(string.Format("[{0}] {1}", DateTime.Now, ex.Message)); } }