using Prorigo.Protrak.API.Contracts;
using Prorigo.Protrak.API.Contracts.Enum;
using Prorigo.Protrak.API.Contracts.Filters;
using Prorigo.Protrak.API.Contracts.Layout;
using Prorigo.Protrak.API.Services;
using Prorigo.Protrak.Programs;
using System;
using System.Collections.Generic;
using System.Data;
using System.Linq;
namespace Protrak.Customization.Programs
{
public class CustomEventsReport : IReportProgram
{
public IProgramService ProgramService { get; set; }
public IInstanceService InstanceService { get; set; }
public IRelationService RelationService { get; set; }
public ITypeService TypeService { get; set; }
public IUserService UserService { get; set; }
public IFileService FileService { get; set; }
public INotificationService NotificationService { get; set; }
public ILifecycleService LifecycleService { get; set; }
public ILoggingService LoggingService { get; set; }
public IEventService EventService { get; set; }
// Data Table Columns
private readonly string COLUMN_INSTANCE_ID = "InstanceId";
private readonly string COLUMN_INSTANCE_TYPE_NAME = "InstanceTypeName";
private readonly string COLUMN_EVENT_TYPE = "EventType";
private readonly string COLUMN_EVENT_CREATED = "EventCreated";
private readonly string COLUMN_CREATOR = "EventCreator";
private readonly string COLUMN_MODIFIER = "EventModifier";
public ReportData GetReportData(ReportQuery reportQuery)
{
DataTable dataTable = null;
dataTable = GetDrillDownReportTableForAll();
GetReportDataForDrillDownForAll(ref dataTable, reportQuery);
return new ReportData() { Data = dataTable };
}
public ReportConfig GetReportConfig()
{
return new ReportConfig()
{
Group = new ReportGroup()
{
Attribute = new LayoutField() { AttributeName = COLUMN_EVENT_TYPE },
DisplayName = "Event",
DateSubGroup = DateSubGroup.None
},
Columns = (new List<ReportColumn>()
{
new ReportColumn()
{
DisplayName = "Instance Id",
FirstAttribute = new LayoutField() { AttributeName = COLUMN_INSTANCE_ID},
AggregateType = AggregateType.Count,
ShowInDrillDown = true
},
new ReportColumn()
{
DisplayName = "Instance Type",
FirstAttribute = new LayoutField() { AttributeName = COLUMN_INSTANCE_TYPE_NAME},
AggregateType = AggregateType.None,
ShowInDrillDown = true
},
new ReportColumn()
{
DisplayName = "Event Type",
FirstAttribute = new LayoutField() { AttributeName = COLUMN_EVENT_TYPE},
AggregateType = AggregateType.None,
ShowInDrillDown = true
},
new ReportColumn()
{
DisplayName = "Event Cerated Date",
FirstAttribute = new LayoutField() { AttributeName = COLUMN_EVENT_CREATED},
AggregateType = AggregateType.None,
ShowInDrillDown = true
},
new ReportColumn()
{
DisplayName = "Event Creator",
FirstAttribute = new LayoutField() { AttributeName = COLUMN_CREATOR},
AggregateType = AggregateType.None,
ShowInDrillDown = true
},
new ReportColumn()
{
DisplayName = "Event Modifier",
FirstAttribute = new LayoutField() { AttributeName = COLUMN_MODIFIER},
AggregateType = AggregateType.None,
ShowInDrillDown = true
}
}).ToArray()
};
}
private DataTable GetDrillDownReportTableForAll()
{
DataTable dt = new DataTable();
dt.Columns.Add(new DataColumn() { DataType = typeof(Guid), ColumnName = COLUMN_INSTANCE_ID });
dt.Columns.Add(new DataColumn() { DataType = typeof(string), ColumnName = COLUMN_INSTANCE_TYPE_NAME });
dt.Columns.Add(new DataColumn() { DataType = typeof(string), ColumnName = COLUMN_EVENT_TYPE });
dt.Columns.Add(new DataColumn() { DataType = typeof(DateTime), ColumnName = COLUMN_EVENT_CREATED });
dt.Columns.Add(new DataColumn() { DataType = typeof(string), ColumnName = COLUMN_CREATOR });
dt.Columns.Add(new DataColumn() { DataType = typeof(string), ColumnName = COLUMN_MODIFIER });
return dt;
}
private void GetReportDataForDrillDownForAll(ref DataTable dataTable, ReportQuery reportQuery)
{
var eventFilter = GetEventFilter(reportQuery);
var events = GetEvents(eventFilter);
AddDataIntoDataTable(events, ref dataTable);
}
private Prorigo.Protrak.API.Contracts.Filters.EventFilter GetEventFilter(ReportQuery reportQuery)
{
return new Prorigo.Protrak.API.Contracts.Filters.EventFilter()
{
Skip = 0,
Take = int.MaxValue,
StartDate = DateTime.MinValue,
EndDate = DateTime.MaxValue,
InstanceTypeNames = new string[] { "<InstanceTypeNames>" },
EventTypes = new string[] { "<EventTypes>" },
SortBy = "<SortBy>",
IsSortByDescending = true,
AttributeFilter = new AttributeFilterCondition[]
{
new AttributeFilterCondition()
{
AttributeName = "<AttributeName>",
Condition = AttributeFilterOperator.None,
FirstValue = "<FirstValue>",
SecondValue = "<SecondValue>",
Operator = LogicalOperator.None
}
}
};
}
private List<Prorigo.Protrak.API.Contracts.Event> GetEvents(Prorigo.Protrak.API.Contracts.Filters.EventFilter eventFilter)
{
List<Prorigo.Protrak.API.Contracts.Event> events = new List<Prorigo.Protrak.API.Contracts.Event> ();
if (eventFilter != null)
{
var pagedData = EventService.GetEvents(eventFilter);
if (pagedData != null && pagedData.Items != null)
{
events = pagedData.Items.ToList();
}
}
return events;
}
private void AddDataIntoDataTable(List<Prorigo.Protrak.API.Contracts.Event> events, ref DataTable dataTable)
{
foreach (var eventData in events)
{
var dataRow = dataTable.NewRow();
dataRow[COLUMN_INSTANCE_ID] = eventData.Id;
dataRow[COLUMN_INSTANCE_TYPE_NAME] = eventData.InstanceTypeName;
dataRow[COLUMN_EVENT_TYPE] = eventData.EventType;
dataRow[COLUMN_EVENT_CREATED] = eventData.EventCreated;
dataRow[COLUMN_CREATOR] = eventData.Creator.UserName;
dataRow[COLUMN_MODIFIER] = eventData.Modifier.UserName;
dataTable.Rows.Add(dataRow);
}
}
}
}