Esempio n. 1
0
        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());
        }