# Add New Report - DataPRO Prompt Template ## Context DataPRO reports are implemented as Prism modules in two locations: - `DataPRO/Modules/Reports/` - Full DataPRO reports - `DTS Viewer/DTS.Viewer.Reports/` - Viewer-specific reports Reports follow MVVM with separate Input and Output views for parameter collection and results display. ## System Architecture ``` DataPRO/Modules/Reports/PedestrianAndHeadReports/ ├── Classes/ # Report generation logic │ ├── ReportBase.cs # Base class for reports │ ├── ExportBase.cs # Export functionality │ └── {ReportName}Export.cs # Specific export logic ├── View/ │ ├── {ReportName}InputView.xaml # Parameter input UI │ └── {ReportName}OutputView.xaml # Results display UI ├── ViewModel/ │ └── {ReportName}ViewModel.cs ├── Resources/ # Localization └── {ReportName}Module.cs # Module registration ``` ## Step-by-Step Instructions ### 1. Create the Report Module Class **File:** `DataPRO/Modules/Reports/{ReportName}/{ReportName}Module.cs` ```csharp using System; using System.ComponentModel.Composition; using System.Windows.Media.Imaging; using DTS.Common; using DTS.Common.Interface; using Microsoft.Practices.Prism.Modularity; using Microsoft.Practices.Unity; namespace {REPORT_NAME} { [Export(typeof(IModule))] [Module(ModuleName = "{REPORT_NAME}Module")] public class {REPORT_NAME}Module : IModule { private readonly IUnityContainer _unityContainer; public {REPORT_NAME}Module(IUnityContainer unityContainer) { _unityContainer = unityContainer; } public void Initialize() { _unityContainer.RegisterType(); _unityContainer.RegisterType(); _unityContainer.RegisterType(); } } [AttributeUsage(AttributeTargets.Assembly, AllowMultiple = false)] public class {REPORT_NAME}ImageAttribute : ImageAttribute { private BitmapImage _img; public {REPORT_NAME}ImageAttribute() : this(null) { } public override BitmapImage AssemblyImage { get { _img = AssemblyInfo.GetImage(AssemblyNames.DB.ToString()); return _img; } } public {REPORT_NAME}ImageAttribute(string s) { _img = AssemblyInfo.GetImage(AssemblyNames.DB.ToString()); } public override Type GetAttributeType() => typeof(ImageAttribute); public override BitmapImage GetAssemblyImage() => AssemblyImage; private string _name; public override string AssemblyName { get { _name = AssemblyNames.{REPORT_GROUP}.ToString(); return _name; } } public override string GetAssemblyName() => AssemblyName; private string _group; public override string AssemblyGroup { get { _group = eAssemblyGroups.Administrative.ToString(); return _group; } } public override string GetAssemblyGroup() => AssemblyGroup; public override eAssemblyRegion GetAssemblyRegion() { throw new NotImplementedException(); } public override eAssemblyRegion AssemblyRegion => throw new NotImplementedException(); } } ``` ### 2. Create the Report Base Class **File:** `DataPRO/Modules/Reports/{ReportName}/Classes/{ReportName}.cs` ```csharp using System; using System.Collections.Generic; using DTS.Common.Storage; namespace {REPORT_NAME} { public class {REPORT_NAME}Report { public string ReportTitle { get; set; } public DateTime GeneratedDate { get; set; } public List Channels { get; set; } public {REPORT_NAME}Report() { Channels = new List(); GeneratedDate = DateTime.Now; } public void Generate(TestSetup testSetup, ReportParameters parameters) { // Validate inputs if (testSetup == null) throw new ArgumentNullException(nameof(testSetup)); // Generate report data ProcessData(testSetup, parameters); } private void ProcessData(TestSetup testSetup, ReportParameters parameters) { // Implementation specific to report type } } public class ReportChannel { public string ChannelName { get; set; } public double PeakValue { get; set; } public double Duration { get; set; } } public class ReportParameters { public DateTime StartTime { get; set; } public DateTime EndTime { get; set; } public double Threshold { get; set; } } } ``` ### 3. Create the Export Class **File:** `DataPRO/Modules/Reports/{ReportName}/Classes/{ReportName}Export.cs` ```csharp using System; using System.Data; using System.IO; using DTS.Common.Storage; namespace {REPORT_NAME} { public class {REPORT_NAME}Export : ExportBase { public {REPORT_NAME}Report Report { get; set; } public void ExportToCSV(string filePath) { if (Report == null) throw new InvalidOperationException("Report not generated"); using (var writer = new StreamWriter(filePath)) { WriteHeader(writer); WriteData(writer); } } public void ExportToExcel(string filePath) { // Excel export implementation } private void WriteHeader(StreamWriter writer) { writer.WriteLine($"Report,{Report.ReportTitle}"); writer.WriteLine($"Generated,{Report.GeneratedDate:yyyy-MM-dd HH:mm:ss}"); writer.WriteLine(); writer.WriteLine("Channel,Peak Value,Duration"); } private void WriteData(StreamWriter writer) { foreach (var channel in Report.Channels) { writer.WriteLine($"{channel.ChannelName},{channel.PeakValue},{channel.Duration}"); } } } } ``` ### 4. Create Input View (XAML) **File:** `DataPRO/Modules/Reports/{ReportName}/View/{ReportName}InputView.xaml` ```xml