using System; using System.Threading.Tasks; using LCU.API.Collections.RepoApi.Exceptions; using LCU.API.Collections.RepoApi.Factories; using LCU.Shared.Collections.RepoApiLib.Formatting; using LCU.Shared.Collections.RepoApiLib.Models.Reporting.Responses; using LCU.Shared.Collections.RepoApiLib.Repositories; using Serilog; namespace LCU.API.Collections.RepoApi.Services.Reporting { public class RepoCompanyReportingService : IRepoCompanyReportingService { private readonly IReportingRepository _reportingRepository; public RepoCompanyReportingService(IReportingRepository reportingRepository) { _reportingRepository = reportingRepository; } public async Task GetAssignedBalance(DateTime lowDateTime, DateTime highDateTime) { try { var reportData = await _reportingRepository.GetAccountsByDateAssigned(lowDateTime, highDateTime); return new ReportTableResponse() { ReportTable = ReportTableFactory.CreateHistoricalSummationTable( ReportSumType.Currency, reportData, "Repo Companies", lowDateTime, highDateTime, (reportEntry) => reportEntry.Balance, (reportEntry) => reportEntry.RepoCompany, (reportEntry) => reportEntry.RepoCompanyAssignmentDate, (reportEntry) => reportEntry.CollateralId), DataTable = DataTableFormatting.CreateDataTable( reportData, (entry) => entry.RepoId, StdReportEntryColumns.Member(), StdReportEntryColumns.AccountNo(), StdReportEntryColumns.Status(), StdReportEntryColumns.DaysInStatus(), StdReportEntryColumns.Balance(), StdReportEntryColumns.AccountCode(), StdReportEntryColumns.Bankruptcy(), StdReportEntryColumns.Collateral(), StdReportEntryColumns.RepoCompany(), StdReportEntryColumns.DateAssigned()) }; } catch (Exception ex) { Log.Error(ex, "Failure retrieving Repo Company Active Count Report"); throw new ServerErrorException(); } } public async Task GetAssignmentCountReport(DateTime lowDateTime, DateTime highDateTime) { try { var reportData = await _reportingRepository.GetAccountsByDateAssigned(lowDateTime, highDateTime); return new ReportTableResponse() { ReportTable = ReportTableFactory.CreateHistoricalSummationTable( ReportSumType.WholeNumber, reportData, "Repo Companies", lowDateTime, highDateTime, (reportEntry) => 1, (reportEntry) => reportEntry.RepoCompany, (reportEntry) => reportEntry.RepoCompanyAssignmentDate, (reportEntry) => reportEntry.CollateralId), DataTable = DataTableFormatting.CreateDataTable( reportData, (entry) => entry.RepoId, StdReportEntryColumns.Member(), StdReportEntryColumns.AccountNo(), StdReportEntryColumns.Status(), StdReportEntryColumns.DaysInStatus(), StdReportEntryColumns.RepoType(), StdReportEntryColumns.Balance(), StdReportEntryColumns.AccountCode(), StdReportEntryColumns.Bankruptcy(), StdReportEntryColumns.Collector(), StdReportEntryColumns.Collateral(), StdReportEntryColumns.RepoCompany(), StdReportEntryColumns.DateAssigned()) }; } catch (Exception ex) { Log.Error(ex, "Failure retrieving Repo Company Active Count Report"); throw new ServerErrorException(); } } public async Task GetAvgDaysAssignedToRepoed(DateTime lowDateTime, DateTime highDateTime) { try { var reportData = await _reportingRepository.GetAccountsByDateRepoed(lowDateTime, highDateTime); return new ReportTableResponse() { ReportTable = ReportTableFactory.CreateHistoricalSummationTable( ReportSumType.WholeNumberAvg, reportData, "Repo Companies", lowDateTime, highDateTime, (reportEntry) => reportEntry.RepoDuration, (reportEntry) => reportEntry.RepoCompany, (reportEntry) => reportEntry.DateRepoed, (reportEntry) => reportEntry.CollateralId, false), DataTable = DataTableFormatting.CreateDataTable( reportData, (reportRow) => reportRow.RepoId, StdReportEntryColumns.Member(), StdReportEntryColumns.AccountNo(), StdReportEntryColumns.Status(), StdReportEntryColumns.DaysInStatus(), StdReportEntryColumns.RepoType(), StdReportEntryColumns.Balance(), StdReportEntryColumns.AccountCode(), StdReportEntryColumns.Bankruptcy(), StdReportEntryColumns.Collateral(), StdReportEntryColumns.RepoCompany(), StdReportEntryColumns.RepoDuration(), StdReportEntryColumns.DateAssigned(), StdReportEntryColumns.DateRepoed()) }; } catch (Exception ex) { Log.Error(ex, "Failure retrieving Avg Days Assigned to Repoed Report"); throw new ServerErrorException(); } } public async Task GetRepoedCountReport(DateTime lowDateTime, DateTime highDateTime) { try { var reportData = await _reportingRepository.GetAccountsByDateRepoed(lowDateTime, highDateTime); return new ReportTableResponse() { ReportTable = ReportTableFactory.CreateHistoricalSummationTable( ReportSumType.WholeNumber, reportData, "Repo Companies", lowDateTime, highDateTime, (reportEntry) => 1, (reportEntry) => reportEntry.RepoCompany, (reportEntry) => reportEntry.DateRepoed, (reportEntry) => reportEntry.CollateralId), DataTable = DataTableFormatting.CreateDataTable( reportData, (entry) => entry.RepoId, StdReportEntryColumns.Member(), StdReportEntryColumns.AccountNo(), StdReportEntryColumns.Status(), StdReportEntryColumns.DaysInStatus(), StdReportEntryColumns.RepoType(), StdReportEntryColumns.Balance(), StdReportEntryColumns.AccountCode(), StdReportEntryColumns.Bankruptcy(), StdReportEntryColumns.Collateral(), StdReportEntryColumns.RepoCompany(), StdReportEntryColumns.RepoDuration()) }; } catch (Exception ex) { Log.Error(ex, "Failure retrieving Repo Company Active Count Report"); throw new ServerErrorException(); } } } }