diff --git a/Controllers/APIController.cs b/Controllers/APIController.cs index 85a02d8..0062f44 100644 --- a/Controllers/APIController.cs +++ b/Controllers/APIController.cs @@ -98,7 +98,7 @@ namespace CarCareTracker.Controllers { var currentMileage = GetMaxMileage(vehicleId); var reminders = _reminderRecordDataAccess.GetReminderRecordsByVehicleId(vehicleId); - var results = _reminderHelper.GetReminderRecordViewModels(reminders, currentMileage).Select(x=> new ReminderExportModel { Description = x.Description, Urgency = x.Urgency.ToString(), Metric = x.Metric.ToString(), Notes = x.Notes}); + var results = _reminderHelper.GetReminderRecordViewModels(reminders, currentMileage, DateTime.Now).Select(x=> new ReminderExportModel { Description = x.Description, Urgency = x.Urgency.ToString(), Metric = x.Metric.ToString(), Notes = x.Notes}); return Json(results); } private int GetMaxMileage(int vehicleId) diff --git a/Controllers/VehicleController.cs b/Controllers/VehicleController.cs index fb7ce1b..d1606cd 100644 --- a/Controllers/VehicleController.cs +++ b/Controllers/VehicleController.cs @@ -6,7 +6,6 @@ using CarCareTracker.Helper; using CsvHelper; using System.Globalization; using Microsoft.AspNetCore.Authorization; -using CarCareTracker.External.Implementations; using CarCareTracker.MapProfile; namespace CarCareTracker.Controllers @@ -29,11 +28,13 @@ namespace CarCareTracker.Controllers private readonly IFileHelper _fileHelper; private readonly IGasHelper _gasHelper; private readonly IReminderHelper _reminderHelper; + private readonly IReportHelper _reportHelper; public VehicleController(ILogger logger, IFileHelper fileHelper, IGasHelper gasHelper, IReminderHelper reminderHelper, + IReportHelper reportHelper, IVehicleDataAccess dataAccess, INoteDataAccess noteDataAccess, IServiceRecordDataAccess serviceRecordDataAccess, @@ -51,6 +52,7 @@ namespace CarCareTracker.Controllers _fileHelper = fileHelper; _gasHelper = gasHelper; _reminderHelper = reminderHelper; + _reportHelper = reportHelper; _serviceRecordDataAccess = serviceRecordDataAccess; _gasRecordDataAccess = gasRecordDataAccess; _collisionRecordDataAccess = collisionRecordDataAccess; @@ -571,9 +573,71 @@ namespace CarCareTracker.Controllers #endregion #region "Reports" [HttpGet] - public IActionResult GetReportPartialView() + public IActionResult GetReportPartialView(int vehicleId) { - return PartialView("_Report"); + //get records + var serviceRecords = _serviceRecordDataAccess.GetServiceRecordsByVehicleId(vehicleId); + var gasRecords = _gasRecordDataAccess.GetGasRecordsByVehicleId(vehicleId); + var collisionRecords = _collisionRecordDataAccess.GetCollisionRecordsByVehicleId(vehicleId); + var taxRecords = _taxRecordDataAccess.GetTaxRecordsByVehicleId(vehicleId); + var upgradeRecords = _upgradeRecordDataAccess.GetUpgradeRecordsByVehicleId(vehicleId); + var viewModel = new ReportViewModel(); + //get totalCostMakeUp + viewModel.CostMakeUpForVehicle = new CostMakeUpForVehicle + { + ServiceRecordSum = serviceRecords.Sum(x => x.Cost), + GasRecordSum = gasRecords.Sum(x => x.Cost), + CollisionRecordSum = collisionRecords.Sum(x => x.Cost), + TaxRecordSum = taxRecords.Sum(x => x.Cost), + UpgradeRecordSum = upgradeRecords.Sum(x => x.Cost) + }; + //get costbymonth + List allCosts = new List(); + allCosts.AddRange(_reportHelper.GetServiceRecordSum(serviceRecords, 0)); + allCosts.AddRange(_reportHelper.GetRepairRecordSum(collisionRecords, 0)); + allCosts.AddRange(_reportHelper.GetUpgradeRecordSum(upgradeRecords, 0)); + allCosts.AddRange(_reportHelper.GetUpgradeRecordSum(upgradeRecords, 0)); + allCosts.AddRange(_reportHelper.GetGasRecordSum(gasRecords, 0)); + allCosts.AddRange(_reportHelper.GetTaxRecordSum(taxRecords, 0)); + viewModel.CostForVehicleByMonth = allCosts.GroupBy(x => x.MonthName).OrderBy(x => x.Key).Select(x => new CostForVehicleByMonth + { + MonthName = x.Key, + Cost = x.Sum(y => y.Cost) + }).ToList(); + //get reminders + var reminders = GetRemindersAndUrgency(vehicleId, DateTime.Now); + viewModel.ReminderMakeUpForVehicle = new ReminderMakeUpForVehicle + { + NotUrgentCount = reminders.Where(x => x.Urgency == ReminderUrgency.NotUrgent).Count(), + UrgentCount = reminders.Where(x => x.Urgency == ReminderUrgency.Urgent).Count(), + VeryUrgentCount = reminders.Where(x => x.Urgency == ReminderUrgency.VeryUrgent).Count(), + PastDueCount = reminders.Where(x => x.Urgency == ReminderUrgency.PastDue).Count() + }; + //populate year dropdown. + var numbersArray = new List(); + if (serviceRecords.Any()) + { + numbersArray.Add(serviceRecords.Min(x => x.Date.Year)); + } + if (collisionRecords.Any()) + { + numbersArray.Add(collisionRecords.Min(x => x.Date.Year)); + } + if (gasRecords.Any()) + { + numbersArray.Add(gasRecords.Min(x => x.Date.Year)); + } + if (upgradeRecords.Any()) + { + numbersArray.Add(upgradeRecords.Min(x => x.Date.Year)); + } + var minYear = numbersArray.Any() ? numbersArray.Min() : DateTime.Now.AddYears(-5).Year; + var yearDifference = DateTime.Now.Year - minYear + 1; + for(int i = 0; i < yearDifference; i++) + { + viewModel.Years.Add(DateTime.Now.AddYears(i * -1).Year); + } + return PartialView("_Report", viewModel); } [HttpGet] public IActionResult GetCostMakeUpForVehicle(int vehicleId, int year = 0) @@ -601,19 +665,53 @@ namespace CarCareTracker.Controllers }; return PartialView("_CostMakeUpReport", viewModel); } - public IActionResult GetFuelCostByMonthByVehicle(int vehicleId, int year = 0) + public IActionResult GetReminderMakeUpByVehicle(int vehicleId, int daysToAdd) { - var gasRecords = _gasRecordDataAccess.GetGasRecordsByVehicleId(vehicleId); - if (year != default) + var reminders = GetRemindersAndUrgency(vehicleId, DateTime.Now.AddDays(daysToAdd)); + var viewModel = new ReminderMakeUpForVehicle { - gasRecords.RemoveAll(x => x.Date.Year != year); + NotUrgentCount = reminders.Where(x => x.Urgency == ReminderUrgency.NotUrgent).Count(), + UrgentCount = reminders.Where(x => x.Urgency == ReminderUrgency.Urgent).Count(), + VeryUrgentCount = reminders.Where(x => x.Urgency == ReminderUrgency.VeryUrgent).Count(), + PastDueCount = reminders.Where(x => x.Urgency == ReminderUrgency.PastDue).Count() + }; + return PartialView("_ReminderMakeUpReport", viewModel); + } + [HttpPost] + public IActionResult GetCostByMonthByVehicle(int vehicleId, List selectedMetrics, int year = 0) + { + List allCosts = new List(); + if (selectedMetrics.Contains(ImportMode.ServiceRecord) || selectedMetrics.Contains(ImportMode.All)) + { + var serviceRecords = _serviceRecordDataAccess.GetServiceRecordsByVehicleId(vehicleId); + allCosts.AddRange(_reportHelper.GetServiceRecordSum(serviceRecords, year)); } - var groupedGasRecord = gasRecords.GroupBy(x => x.Date.Month).OrderBy(x => x.Key).Select(x => new GasCostForVehicleByMonth + if (selectedMetrics.Contains(ImportMode.RepairRecord) || selectedMetrics.Contains(ImportMode.All)) { - MonthName = CultureInfo.CurrentCulture.DateTimeFormat.GetMonthName(x.Key), + var repairRecords = _collisionRecordDataAccess.GetCollisionRecordsByVehicleId(vehicleId); + allCosts.AddRange(_reportHelper.GetRepairRecordSum(repairRecords, year)); + } + if (selectedMetrics.Contains(ImportMode.UpgradeRecord) || selectedMetrics.Contains(ImportMode.All)) + { + var upgradeRecords = _upgradeRecordDataAccess.GetUpgradeRecordsByVehicleId(vehicleId); + allCosts.AddRange(_reportHelper.GetUpgradeRecordSum(upgradeRecords, year)); + } + if (selectedMetrics.Contains(ImportMode.GasRecord) || selectedMetrics.Contains(ImportMode.All)) + { + var gasRecords = _gasRecordDataAccess.GetGasRecordsByVehicleId(vehicleId); + allCosts.AddRange(_reportHelper.GetGasRecordSum(gasRecords, year)); + } + if (selectedMetrics.Contains(ImportMode.TaxRecord) || selectedMetrics.Contains(ImportMode.All)) + { + var taxRecords = _taxRecordDataAccess.GetTaxRecordsByVehicleId(vehicleId); + allCosts.AddRange(_reportHelper.GetTaxRecordSum(taxRecords, year)); + } + var groupedRecord = allCosts.GroupBy(x => x.MonthName).OrderBy(x => x.Key).Select(x => new CostForVehicleByMonth + { + MonthName = x.Key, Cost = x.Sum(y => y.Cost) }).ToList(); - return PartialView("_GasCostByMonthReport", groupedGasRecord); + return PartialView("_GasCostByMonthReport", groupedRecord); } #endregion #region "Reminders" @@ -642,17 +740,17 @@ namespace CarCareTracker.Controllers } return numbersArray.Any() ? numbersArray.Max() : 0; } - private List GetRemindersAndUrgency(int vehicleId) + private List GetRemindersAndUrgency(int vehicleId, DateTime dateCompare) { var currentMileage = GetMaxMileage(vehicleId); var reminders = _reminderRecordDataAccess.GetReminderRecordsByVehicleId(vehicleId); - List results = _reminderHelper.GetReminderRecordViewModels(reminders, currentMileage); + List results = _reminderHelper.GetReminderRecordViewModels(reminders, currentMileage, dateCompare); return results; } [HttpGet] public IActionResult GetVehicleHaveUrgentOrPastDueReminders(int vehicleId) { - var result = GetRemindersAndUrgency(vehicleId); + var result = GetRemindersAndUrgency(vehicleId, DateTime.Now); if (result.Where(x => x.Urgency == ReminderUrgency.VeryUrgent || x.Urgency == ReminderUrgency.PastDue).Any()) { return Json(true); @@ -662,7 +760,7 @@ namespace CarCareTracker.Controllers [HttpGet] public IActionResult GetReminderRecordsByVehicleId(int vehicleId) { - var result = GetRemindersAndUrgency(vehicleId); + var result = GetRemindersAndUrgency(vehicleId, DateTime.Now); result = result.OrderByDescending(x => x.Urgency).ToList(); return PartialView("_ReminderRecords", result); } diff --git a/Enum/ImportMode.cs b/Enum/ImportMode.cs index feee263..574f01f 100644 --- a/Enum/ImportMode.cs +++ b/Enum/ImportMode.cs @@ -6,6 +6,7 @@ RepairRecord = 1, GasRecord = 2, TaxRecord = 3, - UpgradeRecord = 4 + UpgradeRecord = 4, + All = 5 } } diff --git a/Helper/ReminderHelper.cs b/Helper/ReminderHelper.cs index a773725..7e9ff6e 100644 --- a/Helper/ReminderHelper.cs +++ b/Helper/ReminderHelper.cs @@ -4,11 +4,11 @@ namespace CarCareTracker.Helper { public interface IReminderHelper { - List GetReminderRecordViewModels(List reminders, int currentMileage); + List GetReminderRecordViewModels(List reminders, int currentMileage, DateTime dateCompare); } public class ReminderHelper: IReminderHelper { - public List GetReminderRecordViewModels(List reminders, int currentMileage) + public List GetReminderRecordViewModels(List reminders, int currentMileage, DateTime dateCompare) { List reminderViewModels = new List(); foreach (var reminder in reminders) @@ -25,7 +25,7 @@ namespace CarCareTracker.Helper }; if (reminder.Metric == ReminderMetric.Both) { - if (reminder.Date < DateTime.Now) + if (reminder.Date < dateCompare) { reminderViewModel.Urgency = ReminderUrgency.PastDue; reminderViewModel.Metric = ReminderMetric.Date; @@ -35,7 +35,7 @@ namespace CarCareTracker.Helper reminderViewModel.Urgency = ReminderUrgency.PastDue; reminderViewModel.Metric = ReminderMetric.Odometer; } - else if (reminder.Date < DateTime.Now.AddDays(7)) + else if (reminder.Date < dateCompare.AddDays(7)) { //if less than a week from today or less than 50 miles from current mileage then very urgent. reminderViewModel.Urgency = ReminderUrgency.VeryUrgent; @@ -47,7 +47,7 @@ namespace CarCareTracker.Helper reminderViewModel.Urgency = ReminderUrgency.VeryUrgent; reminderViewModel.Metric = ReminderMetric.Odometer; } - else if (reminder.Date < DateTime.Now.AddDays(30)) + else if (reminder.Date < dateCompare.AddDays(30)) { reminderViewModel.Urgency = ReminderUrgency.Urgent; reminderViewModel.Metric = ReminderMetric.Date; @@ -60,15 +60,15 @@ namespace CarCareTracker.Helper } else if (reminder.Metric == ReminderMetric.Date) { - if (reminder.Date < DateTime.Now) + if (reminder.Date < dateCompare) { reminderViewModel.Urgency = ReminderUrgency.PastDue; } - else if (reminder.Date < DateTime.Now.AddDays(7)) + else if (reminder.Date < dateCompare.AddDays(7)) { reminderViewModel.Urgency = ReminderUrgency.VeryUrgent; } - else if (reminder.Date < DateTime.Now.AddDays(30)) + else if (reminder.Date < dateCompare.AddDays(30)) { reminderViewModel.Urgency = ReminderUrgency.Urgent; } diff --git a/Helper/ReportHelper.cs b/Helper/ReportHelper.cs new file mode 100644 index 0000000..b34b382 --- /dev/null +++ b/Helper/ReportHelper.cs @@ -0,0 +1,77 @@ +using CarCareTracker.Models; +using System.Globalization; + +namespace CarCareTracker.Helper +{ + public interface IReportHelper + { + IEnumerable GetServiceRecordSum(List serviceRecords, int year = 0); + IEnumerable GetRepairRecordSum(List repairRecords, int year = 0); + IEnumerable GetUpgradeRecordSum(List upgradeRecords, int year = 0); + IEnumerable GetGasRecordSum(List gasRecords, int year = 0); + IEnumerable GetTaxRecordSum(List taxRecords, int year = 0); + } + public class ReportHelper: IReportHelper + { + public IEnumerable GetServiceRecordSum(List serviceRecords, int year = 0) + { + if (year != default) + { + serviceRecords.RemoveAll(x => x.Date.Year != year); + } + return serviceRecords.GroupBy(x => x.Date.Month).OrderBy(x => x.Key).Select(x => new CostForVehicleByMonth + { + MonthName = CultureInfo.CurrentCulture.DateTimeFormat.GetMonthName(x.Key), + Cost = x.Sum(y => y.Cost) + }); + } + public IEnumerable GetRepairRecordSum(List repairRecords, int year = 0) + { + if (year != default) + { + repairRecords.RemoveAll(x => x.Date.Year != year); + } + return repairRecords.GroupBy(x => x.Date.Month).OrderBy(x => x.Key).Select(x => new CostForVehicleByMonth + { + MonthName = CultureInfo.CurrentCulture.DateTimeFormat.GetMonthName(x.Key), + Cost = x.Sum(y => y.Cost) + }); + } + public IEnumerable GetUpgradeRecordSum(List upgradeRecords, int year = 0) + { + if (year != default) + { + upgradeRecords.RemoveAll(x => x.Date.Year != year); + } + return upgradeRecords.GroupBy(x => x.Date.Month).OrderBy(x => x.Key).Select(x => new CostForVehicleByMonth + { + MonthName = CultureInfo.CurrentCulture.DateTimeFormat.GetMonthName(x.Key), + Cost = x.Sum(y => y.Cost) + }); + } + public IEnumerable GetGasRecordSum(List gasRecords, int year = 0) + { + if (year != default) + { + gasRecords.RemoveAll(x => x.Date.Year != year); + } + return gasRecords.GroupBy(x => x.Date.Month).OrderBy(x => x.Key).Select(x => new CostForVehicleByMonth + { + MonthName = CultureInfo.CurrentCulture.DateTimeFormat.GetMonthName(x.Key), + Cost = x.Sum(y => y.Cost) + }); + } + public IEnumerable GetTaxRecordSum(List taxRecords, int year = 0) + { + if (year != default) + { + taxRecords.RemoveAll(x => x.Date.Year != year); + } + return taxRecords.GroupBy(x => x.Date.Month).OrderBy(x => x.Key).Select(x => new CostForVehicleByMonth + { + MonthName = CultureInfo.CurrentCulture.DateTimeFormat.GetMonthName(x.Key), + Cost = x.Sum(y => y.Cost) + }); + } + } +} diff --git a/Models/Report/GasCostForVehicleByMonth.cs b/Models/Report/CostForVehicleByMonth.cs similarity index 76% rename from Models/Report/GasCostForVehicleByMonth.cs rename to Models/Report/CostForVehicleByMonth.cs index fd93ece..d73616d 100644 --- a/Models/Report/GasCostForVehicleByMonth.cs +++ b/Models/Report/CostForVehicleByMonth.cs @@ -1,6 +1,6 @@ namespace CarCareTracker.Models { - public class GasCostForVehicleByMonth + public class CostForVehicleByMonth { public string MonthName { get; set; } public decimal Cost { get; set; } diff --git a/Models/Report/ReminderMakeUpForVehicle.cs b/Models/Report/ReminderMakeUpForVehicle.cs new file mode 100644 index 0000000..be6b6ce --- /dev/null +++ b/Models/Report/ReminderMakeUpForVehicle.cs @@ -0,0 +1,10 @@ +namespace CarCareTracker.Models +{ + public class ReminderMakeUpForVehicle + { + public int NotUrgentCount { get; set; } + public int UrgentCount { get; set; } + public int VeryUrgentCount { get; set; } + public int PastDueCount { get; set; } + } +} diff --git a/Models/Report/ReportViewModel.cs b/Models/Report/ReportViewModel.cs new file mode 100644 index 0000000..77d4be2 --- /dev/null +++ b/Models/Report/ReportViewModel.cs @@ -0,0 +1,10 @@ +namespace CarCareTracker.Models +{ + public class ReportViewModel + { + public List CostForVehicleByMonth { get; set; } = new List(); + public CostMakeUpForVehicle CostMakeUpForVehicle { get; set; } = new CostMakeUpForVehicle(); + public ReminderMakeUpForVehicle ReminderMakeUpForVehicle { get; set; } = new ReminderMakeUpForVehicle(); + public List Years { get; set; } = new List(); + } +} diff --git a/Program.cs b/Program.cs index 2695ae8..e729b1c 100644 --- a/Program.cs +++ b/Program.cs @@ -23,6 +23,7 @@ builder.Services.AddSingleton(); builder.Services.AddSingleton(); builder.Services.AddSingleton(); builder.Services.AddSingleton(); +builder.Services.AddSingleton(); if (!Directory.Exists("data")) { diff --git a/Views/Vehicle/_CostMakeUpReport.cshtml b/Views/Vehicle/_CostMakeUpReport.cshtml index 807ffc8..051be18 100644 --- a/Views/Vehicle/_CostMakeUpReport.cshtml +++ b/Views/Vehicle/_CostMakeUpReport.cshtml @@ -45,5 +45,5 @@ } else { -

No data found or all records have zero sums, insert records with non-zero sums to see visualizations here.

+

No data found or all records have zero sums, insert records with non-zero sums to see visualizations here.

} diff --git a/Views/Vehicle/_GasCostByMonthReport.cshtml b/Views/Vehicle/_GasCostByMonthReport.cshtml index ce2f4f8..bcca022 100644 --- a/Views/Vehicle/_GasCostByMonthReport.cshtml +++ b/Views/Vehicle/_GasCostByMonthReport.cshtml @@ -1,4 +1,4 @@ -@model List +@model List @if (Model.Any()) { @@ -8,7 +8,7 @@ var barGraphLabels = []; var barGraphData = []; var useDarkMode = getGlobalConfig().useDarkMode; - @foreach (GasCostForVehicleByMonth gasCost in Model) + @foreach (CostForVehicleByMonth gasCost in Model) { @:barGraphLabels.push("@gasCost.MonthName"); @:barGraphData.push(@gasCost.Cost); @@ -19,7 +19,7 @@ labels: barGraphLabels, datasets: [ { - label: "Gas Expenses by Month", + label: "Expenses by Month", backgroundColor: ["#00876c", "#43956e", "#67a371", "#89b177", "#a9be80", "#c8cb8b", "#e6d79b", "#e4c281", "#e3ab6b", "#e2925b", "#e07952", "#db5d4f"], data: barGraphData } @@ -52,5 +52,5 @@ } else { -

No data found, insert some gas data to see visualizations here.

+

No data found, insert/select some data to see visualizations here.

} \ No newline at end of file diff --git a/Views/Vehicle/_ReminderMakeUpReport.cshtml b/Views/Vehicle/_ReminderMakeUpReport.cshtml new file mode 100644 index 0000000..00100bf --- /dev/null +++ b/Views/Vehicle/_ReminderMakeUpReport.cshtml @@ -0,0 +1,48 @@ +@model ReminderMakeUpForVehicle +@if (Model.UrgentCount + Model.VeryUrgentCount + Model.NotUrgentCount + Model.PastDueCount > 0) +{ + + +} +else +{ +

No data found, create reminders to see visualizations here.

+} diff --git a/Views/Vehicle/_Report.cshtml b/Views/Vehicle/_Report.cshtml index 434582b..4714338 100644 --- a/Views/Vehicle/_Report.cshtml +++ b/Views/Vehicle/_Report.cshtml @@ -1,36 +1,148 @@ -
-
+@model ReportViewModel +
+
- +
+ @await Html.PartialAsync("_CostMakeUpReport", Model.CostMakeUpForVehicle)
-
+
-
- +
+
+ + +
+
+ + +
+
+ + +
+
+ + +
+
+ + +
+
+ + +
+ @await Html.PartialAsync("_GasCostByMonthReport", Model.CostForVehicleByMonth) +
+
+
+
+
+
+ +
+
+
+
+ @await Html.PartialAsync("_ReminderMakeUpReport", Model.ReminderMakeUpForVehicle)
+
+
+
\ No newline at end of file diff --git a/wwwroot/css/site.css b/wwwroot/css/site.css index 2be350c..1d00d53 100644 --- a/wwwroot/css/site.css +++ b/wwwroot/css/site.css @@ -36,8 +36,30 @@ html { overflow-x:auto; } +@media print { + .vehicleDetailTabContainer { + background-color: #fff; + height: 100%; + width: 100%; + position: absolute; + top: 0; + left: 0; + margin: 0; + font-size: 14px; + line-height: 18px; + color: #000 !important; + overflow: visible; + } + td { + color: #000 !important; + } + th { + color: #000 !important; + } +} + .chartContainer{ - height:65vh; + height:30vh; overflow:auto; } @@ -57,6 +79,10 @@ html { } } +.reportsCheckBoxContainer { + padding: 0.375rem 2.25rem 0.375rem 0.75rem; +} + .bell-shake { animation: bellshake .5s; backface-visibility: hidden; @@ -99,4 +125,5 @@ html { 100% { transform: rotate(0); } -} \ No newline at end of file +} + diff --git a/wwwroot/js/vehicle.js b/wwwroot/js/vehicle.js index ff641cc..b4c76dd 100644 --- a/wwwroot/js/vehicle.js +++ b/wwwroot/js/vehicle.js @@ -22,7 +22,7 @@ $(document).ready(function () { getVehicleTaxRecords(vehicleId); break; case "report-tab": - getVehicleReport(); + getVehicleReport(vehicleId); break; case "reminder-tab": getVehicleReminders(vehicleId); @@ -115,8 +115,8 @@ function getVehicleReminders(vehicleId) { } }); } -function getVehicleReport() { - $.get(`/Vehicle/GetReportPartialView`, function (data) { +function getVehicleReport(vehicleId) { + $.get(`/Vehicle/GetReportPartialView?vehicleId=${vehicleId}`, function (data) { if (data) { $("#report-tab-pane").html(data); }