public async Task <Stream> RenderBalancePdf(GetUserBalanceInputModel parameters, IReadOnlyCollection <BalanceItemModel> balanceItems) { HtmlToPdf renderer = new HtmlToPdf(); StringBuilder htmlContent = new StringBuilder(); htmlContent.Append($"<html><head><link rel=\"stylesheet\" href=\"https://stackpath.bootstrapcdn.com/bootstrap/4.3.1/css/bootstrap.min.css\" integrity=\"sha384-ggOyR0iXCbMQv3Xipma34MD+dH/1fQ784/j6cY/iJTQUOhcWr7x9JvoRxT2MZw1T\" crossorigin=\"anonymous\"><style>td {{text-align:center;}}</style></head><body>"); htmlContent.Append($"<h1 align=\"center\">{parameters.UserFullName} transaction's report</h1>"); var fromLocal = _timeZoneService.ToLocalDate(parameters.DateTimeFrom).ToString(_format); var toLocal = _timeZoneService.ToLocalDate(parameters.DateTimeTo).ToString(_format); htmlContent.Append($"<h2 align=\"center\">From: {fromLocal}</h2>"); htmlContent.Append($"<h2 align=\"center\">To: {toLocal}</h2>"); if (!balanceItems.Any()) { return(renderer.RenderHtmlAsPdf("<h2>No transaction data ...</h2>").Stream); } htmlContent.Append($"</br>"); htmlContent.Append($"<table width=\"100%\" class=\"table table-striped\">" + $"<thead class=\"thead-dark\">" + $"<tr>" + $"<th scope=\"col\">No.</th>" + $"<th scope=\"col\">Transaction date</th>" + $"<th scope=\"col\">Amount of monay</th>" + $"<th scope=\"col\">Source/Target</th>" + $"</tr>" + $"</thead>" + $"<tbody>"); int counter = 1; foreach (var balanceItem in balanceItems) { htmlContent.Append( $"<tr>" + $"<th scope=\"row\">{counter++}</th>" + $"<td width=\"30%\">{_timeZoneService.ToLocalDate(balanceItem.ChangeDateTime).ToString(_format)}</td>" + $"<td width=\"30%\">{balanceItem.ChangeValue.ToString("F")} $</td>" + $"<td width=\"30%\">{balanceItem.ChangeSourceOrTarget}</td>" + $"</tr>"); } htmlContent.Append($"</tbody>" + $"<tfoot class=\"table-info\">" + $"<td>-</td>" + $"<td>-</td>" + $"<td>{balanceItems.Sum(x=>x.ChangeValue).ToString("F")}</td>" + $"<td>-</td>" + $"</tfoot>" + $"</table></body></html>"); htmlContent.Append("</br>"); htmlContent.Append($"<strong>Microsoft timezone name: {_timeZoneService.RequestTimeZoneInfo.DisplayName}</strong>"); htmlContent.Append("</br>"); htmlContent.Append($"<strong>IANA timezone name: {_timeZoneService.IanaRequestTimeZoneName}</strong>"); return((await renderer.RenderHtmlAsPdfAsync(htmlContent.ToString())).Stream); }
public async Task <IActionResult> GetBalance([FromQuery] string userFullName, [FromQuery] DateTime dateTimeFrom, [FromQuery] DateTime dateTimeTo) { var parameters = new GetUserBalanceInputModel { UserFullName = userFullName, DateTimeFrom = dateTimeFrom, DateTimeTo = dateTimeTo, }; var balanceItems = await _userAccountReader.GetUserAccountBalance(parameters); return(File(await _balanceRenderer.RenderBalancePdf(parameters, balanceItems), MediaTypeNames.Application.Pdf, fileDownloadName: $"balanceReport_{Guid.NewGuid()}.pdf")); }
public async Task <IReadOnlyCollection <BalanceItemModel> > GetUserAccountBalance(GetUserBalanceInputModel parameters) { string content = await File.ReadAllTextAsync("transactions.json", Encoding.UTF8); var items = JsonConvert.DeserializeObject <BalanceItemModel[]>(content); return(items .Where(x => x.UserAccount == parameters.UserFullName) .Where(x => parameters.DateTimeFrom <= x.ChangeDateTime) .Where(x => x.ChangeDateTime < parameters.DateTimeTo) .ToArray()); }