public override async Task <AggregateOverallResponse> AggregateOverall(AggregateOverallRequest request, ServerCallContext context) { var headers = context.RequestHeaders.SelectCustom(); Transaction[] transactions; switch (request.Subject) { case ReportSubject.Cards: transactions = await dataFetcher.GetCardsTransactions(headers, request.TimestampFrom, request.TimestampTo); break; case ReportSubject.Loans: transactions = await dataFetcher.GetLoansTransactions(headers, request.TimestampFrom, request.TimestampTo); break; case ReportSubject.Payments: transactions = await dataFetcher.GetPaymentsTransactions(headers, request.TimestampFrom, request.TimestampTo); break; case ReportSubject.Transactions: transactions = await dataFetcher.GetTransactions(headers, request.TimestampFrom, request.TimestampTo); break; default: throw new InvalidOperationException("Unknown subject of report."); } var data = new OverallReportData { From = request.TimestampFrom.ToDateTime(), To = request.TimestampTo.ToDateTime(), Granularity = request.Granularity, Subject = request.Subject, Aggregations = request.Aggregations.ToArray(), Transactions = transactions }; var report = ReportGenerator.AggregateOverall(data); return(new AggregateOverallResponse { Report = report }); }
public static string AggregateOverall(OverallReportData data) { var withTimestamps = data.Transactions.Select(t => new TransactionWithTimestamp { Timestamp = t.Timestamp.ToDateTime(), Transaction = t }); var periods = GroupByPeriods(data.Granularity, withTimestamps); var portions = new List <OverallReportPortion>(); foreach (var period in periods) { foreach (var aggregation in data.Aggregations) { var value = Aggregate(period, aggregation); portions.Add(new OverallReportPortion { Period = period.Key, Value = value, Aggregation = aggregation }); } } return(ReportCsvSerializer.SerializerOverallReport(data, portions.ToArray())); }
public static string SerializerOverallReport(OverallReportData data, OverallReportPortion[] portions) { var sb = new StringBuilder(); sb.AppendLine($"Raport całościowy dla; {data.Subject}"); sb.AppendLine($"Zakres od; {data.From?.ToString() ?? "-"}"); sb.AppendLine($"Zakres do; {data.To?.ToString() ?? "-"}"); sb.AppendLine($"Granularność; {data.Granularity}"); var groupedPortions = portions.GroupBy(p => p.Period); var ordered = groupedPortions.OrderBy(p => p.Key); foreach (var portion in ordered) { sb.AppendLine(portion.Key); foreach (var aggregation in portion) { sb.WriteAggragation(portion.Key, aggregation.Value, aggregation.Aggregation); } } return(sb.ToString()); }