#162 generating stats page (incomplete)

This commit is contained in:
Hamid Reza Mohammadi 2021-06-25 18:52:56 +04:30
parent c443628ca1
commit 2b09dbd523
7 changed files with 205 additions and 55 deletions

View File

@ -73,8 +73,8 @@
@foreach (var expense in Model.Expenses)
{
<tr id="tr-@expense.Id">
<td>@RMuseum.Services.Implementation.DonationService.FormatDate(expense.ExpenseDate)</td>
<td>@RMuseum.Services.Implementation.DonationService.FormatMoney(expense.Amount)</td>
<td>@RMuseum.Services.Implementation.LanguageUtils.FormatDate(expense.ExpenseDate)</td>
<td>@RMuseum.Services.Implementation.LanguageUtils.FormatMoney(expense.Amount)</td>
<td>@expense.Description</td>
<td>
<a role="button" href="/Admin/ExpenseEdit/?id=@expense.Id" class="actionlink" title="ویرایش">✎</a>

View File

@ -1464,6 +1464,32 @@ namespace RMuseum.Controllers
return Ok();
}
/// <summary>
/// regenerate stats page
/// </summary>
/// <returns></returns>
[HttpPut("regen/statspage")]
[Authorize(Policy = RMuseumSecurableItem.GanjoorEntityShortName + ":" + RMuseumSecurableItem.ModifyOperationShortName)]
[ProducesResponseType((int)HttpStatusCode.OK)]
[ProducesResponseType((int)HttpStatusCode.BadRequest, Type = typeof(string))]
[ProducesResponseType((int)HttpStatusCode.Unauthorized)]
public async Task<IActionResult> UpdateStatsPage()
{
try
{
Guid userId = new Guid(User.Claims.FirstOrDefault(c => c.Type == "UserId").Value);
var res = await _ganjoorService.UpdateStatsPage(userId);
if (!string.IsNullOrEmpty(res.ExceptionString))
return BadRequest(res.ExceptionString);
return Ok();
}
catch (Exception exp)
{
return BadRequest(exp.ToString());
}
}
/// <summary>
/// Ganjoor Service
/// </summary>

View File

@ -1095,6 +1095,12 @@
</summary>
<returns></returns>
</member>
<member name="M:RMuseum.Controllers.GanjoorController.UpdateStatsPage">
<summary>
regenerate stats page
</summary>
<returns></returns>
</member>
<member name="F:RMuseum.Controllers.GanjoorController._ganjoorService">
<summary>
Ganjoor Service
@ -7600,6 +7606,12 @@
</summary>
<returns></returns>
</member>
<member name="M:RMuseum.Services.IGanjoorService.UpdateStatsPage(System.Guid)">
<summary>
build sitemap
</summary>
<returns></returns>
</member>
<member name="T:RMuseum.Services.Implementation.ArtifactService">
<summary>
IArtifactService implementation
@ -8445,20 +8457,6 @@
Show Donating Information (temporary switch off/on)
</summary>
</member>
<member name="M:RMuseum.Services.Implementation.DonationService.FormatMoney(System.Decimal)">
<summary>
format money
</summary>
<param name="amount"></param>
<returns></returns>
</member>
<member name="M:RMuseum.Services.Implementation.DonationService.FormatDate(System.DateTime)">
<summary>
format datetime
</summary>
<param name="dateTime"></param>
<returns></returns>
</member>
<member name="F:RMuseum.Services.Implementation.DonationService._context">
<summary>
Database Context
@ -8564,6 +8562,9 @@
<summary>
IGanjoorService implementation
</summary>
<summary>
IGanjoorService implementation
</summary>
</member>
<member name="M:RMuseum.Services.Implementation.GanjoorService.ImportFromMySql">
<summary>
@ -8608,6 +8609,12 @@
<param name="verses"></param>
<returns></returns>
</member>
<member name="M:RMuseum.Services.Implementation.GanjoorService.UpdateStatsPage(System.Guid)">
<summary>
build sitemap
</summary>
<returns></returns>
</member>
<member name="M:RMuseum.Services.Implementation.GanjoorService.GetPoets(System.Boolean,System.Boolean)">
<summary>
Get List of poets
@ -9140,6 +9147,20 @@
<param name="secondPhase"></param>
<returns></returns>
</member>
<member name="M:RMuseum.Services.Implementation.LanguageUtils.FormatMoney(System.Decimal)">
<summary>
format money
</summary>
<param name="amount"></param>
<returns></returns>
</member>
<member name="M:RMuseum.Services.Implementation.LanguageUtils.FormatDate(System.DateTime)">
<summary>
format datetime
</summary>
<param name="dateTime"></param>
<returns></returns>
</member>
<member name="T:RMuseum.Services.Implementation.MusicCatalogueService">
<summary>
Music Catalgue Service Implementation

View File

@ -446,5 +446,11 @@ namespace RMuseum.Services
/// </summary>
/// <returns></returns>
RServiceResult<bool> StartBuildingSitemap();
/// <summary>
/// build sitemap
/// </summary>
/// <returns></returns>
Task<RServiceResult<bool>> UpdateStatsPage(Guid editingUserId);
}
}

View File

@ -34,11 +34,11 @@ namespace RMuseum.Services.Implementation
{
var d = new GanjoorDonation()
{
DateString = FormatDate(donation.RecordDate),
DateString = LanguageUtils.FormatDate(donation.RecordDate),
RecordDate = donation.RecordDate,
Amount = donation.Amount,
Unit = donation.Unit,
AmountString = FormatMoney(donation.Amount),
AmountString = LanguageUtils.FormatMoney(donation.Amount),
DonorName = donation.DonorName,
Remaining = donation.Amount,
ExpenditureDesc = "",
@ -78,11 +78,11 @@ namespace RMuseum.Services.Implementation
expense.DonationExpenditures.Add(n);
_context.GanjoorExpenses.Update(expense);
var amount = d.Remaining == d.Amount && remaining == d.Remaining ? "" : d.Remaining == remaining ? "" : $"مبلغ {FormatMoney(remaining)} {d.Unit} آن ";
var amount = d.Remaining == d.Amount && remaining == d.Remaining ? "" : d.Remaining == remaining ? "" : $"مبلغ {LanguageUtils.FormatMoney(remaining)} {d.Unit} آن ";
var part = expense.DonationExpenditures.Count == 0 && remaining == expense.Amount ? "" : "بخشی از ";
if (!string.IsNullOrEmpty(d.ExpenditureDesc))
d.ExpenditureDesc += " ";
d.ExpenditureDesc += $"{amount}جهت تأمین {part}هزینهٔ {expense.Description} به مبلغ {FormatMoney(expense.Amount)} {d.Unit} صرف شد ({FormatDate(expense.ExpenseDate)}).";
d.ExpenditureDesc += $"{amount}جهت تأمین {part}هزینهٔ {expense.Description} به مبلغ {LanguageUtils.FormatMoney(expense.Amount)} {d.Unit} صرف شد ({LanguageUtils.FormatDate(expense.ExpenseDate)}).";
d.Remaining -= remaining;
_context.GanjoorDonations.Update(d);
await _context.SaveChangesAsync();
@ -122,7 +122,7 @@ namespace RMuseum.Services.Implementation
{
var donation = await _context.GanjoorDonations.Where(d => d.Id == id).SingleAsync();
donation.RecordDate = updateModel.Date;
donation.DateString = FormatDate(donation.RecordDate);
donation.DateString = LanguageUtils.FormatDate(donation.RecordDate);
donation.DonorName = updateModel.Description;
_context.GanjoorDonations.Update(donation);
await _context.SaveChangesAsync();
@ -212,11 +212,11 @@ namespace RMuseum.Services.Implementation
expense.DonationExpenditures.Add(n);
_context.GanjoorExpenses.Update(expense);
var amount = d.Remaining == d.Amount && remaining == d.Remaining ? "" : d.Remaining == remaining ? "باقیماندهٔ آن " : $"مبلغ {FormatMoney(remaining)} {d.Unit} آن ";
var amount = d.Remaining == d.Amount && remaining == d.Remaining ? "" : d.Remaining == remaining ? "باقیماندهٔ آن " : $"مبلغ {LanguageUtils.FormatMoney(remaining)} {d.Unit} آن ";
var part = expense.DonationExpenditures.Count == 1 && remaining == expenseRemaining ? "" : "بخشی از ";
if (!string.IsNullOrEmpty(d.ExpenditureDesc))
d.ExpenditureDesc += " ";
d.ExpenditureDesc += $"{amount}جهت تأمین {part}هزینهٔ {expense.Description} به مبلغ {FormatMoney(expense.Amount)} {d.Unit} صرف شد ({FormatDate(expense.ExpenseDate)}).";
d.ExpenditureDesc += $"{amount}جهت تأمین {part}هزینهٔ {expense.Description} به مبلغ {LanguageUtils.FormatMoney(expense.Amount)} {d.Unit} صرف شد ({LanguageUtils.FormatDate(expense.ExpenseDate)}).";
d.Remaining -= remaining;
_context.GanjoorDonations.Update(d);
@ -227,7 +227,7 @@ namespace RMuseum.Services.Implementation
}
}
await RegenerateDonationsPage(editingUserId, $"ثبت هزینهٔ {expense.Description} به مبلغ {FormatMoney(expense.Amount)} {expense.Unit}");//ignore possible errors here!
await RegenerateDonationsPage(editingUserId, $"ثبت هزینهٔ {expense.Description} به مبلغ {LanguageUtils.FormatMoney(expense.Amount)} {expense.Unit}");//ignore possible errors here!
return new RServiceResult<GanjoorExpense>(expense);
}
@ -265,7 +265,7 @@ namespace RMuseum.Services.Implementation
await RegenerateDonationsExpenditureDesc(donations);
await RegenerateDonationsPage(editingUserId, $"ویرایش هزینهٔ {expense.Description} به مبلغ {FormatMoney(expense.Amount)} {expense.Unit}");//ignore possible errors here!
await RegenerateDonationsPage(editingUserId, $"ویرایش هزینهٔ {expense.Description} به مبلغ {LanguageUtils.FormatMoney(expense.Amount)} {expense.Unit}");//ignore possible errors here!
return new RServiceResult<bool>(true);
@ -295,11 +295,11 @@ namespace RMuseum.Services.Implementation
foreach (var donationExpenditure in donationExpense.DonationExpenditures)
if (donationExpenditure.GanjoorDonationId == donation.Id)
{
var amount = donation.Remaining == donation.Amount && donationExpenditure.Amount == donation.Remaining ? "" : donation.Remaining == donationExpenditure.Amount ? "باقیماندهٔ آن " : $"مبلغ {FormatMoney(donationExpenditure.Amount)} {donation.Unit} آن ";
var amount = donation.Remaining == donation.Amount && donationExpenditure.Amount == donation.Remaining ? "" : donation.Remaining == donationExpenditure.Amount ? "باقیماندهٔ آن " : $"مبلغ {LanguageUtils.FormatMoney(donationExpenditure.Amount)} {donation.Unit} آن ";
var part = donationExpense.DonationExpenditures.Count == 1 && donationExpenditure.Amount == donationExpense.Amount ? "" : "بخشی از ";
if (!string.IsNullOrEmpty(donation.ExpenditureDesc))
donation.ExpenditureDesc += " ";
donation.ExpenditureDesc += $"{amount}جهت تأمین {part}هزینهٔ {donationExpense.Description} به مبلغ {FormatMoney(donationExpense.Amount)} {donation.Unit} صرف شد ({FormatDate(donationExpense.ExpenseDate)}).";
donation.ExpenditureDesc += $"{amount}جهت تأمین {part}هزینهٔ {donationExpense.Description} به مبلغ {LanguageUtils.FormatMoney(donationExpense.Amount)} {donation.Unit} صرف شد ({LanguageUtils.FormatDate(donationExpense.ExpenseDate)}).";
donation.Remaining -= donationExpenditure.Amount;
}
@ -321,7 +321,7 @@ namespace RMuseum.Services.Implementation
try
{
var expense = await _context.GanjoorExpenses.Include(e => e.DonationExpenditures).Where(e => e.Id == id).SingleAsync();
string note = $"حذف هزینهٔ {expense.Description} به مبلغ {FormatMoney(expense.Amount)} {expense.Unit}";
string note = $"حذف هزینهٔ {expense.Description} به مبلغ {LanguageUtils.FormatMoney(expense.Amount)} {expense.Unit}";
List<GanjoorDonation> donations = new List<GanjoorDonation>();
foreach(var expenditure in expense.DonationExpenditures)
@ -711,8 +711,8 @@ namespace RMuseum.Services.Implementation
DateTime last = dateLastDonation > dateLastExpense ? dateLastDonation : dateLastExpense;
var dateString = FormatDate(last);
htmlText += $"باقیماندهٔ قابل هزینهٔ کمکهای دریافتی تا {dateString} برابر {FormatMoney(remSum)} تومان است.{Environment.NewLine}";
var dateString = LanguageUtils.FormatDate(last);
htmlText += $"باقیماندهٔ قابل هزینهٔ کمکهای دریافتی تا {dateString} برابر {LanguageUtils.FormatMoney(remSum)} تومان است.{Environment.NewLine}";
htmlText += $"</p>{Environment.NewLine}";
var expenses =
@ -750,10 +750,10 @@ namespace RMuseum.Services.Implementation
htmlText += $"<tr{cssClass}>{Environment.NewLine}";
htmlText += $"<td class=\"drow\">{(i + 1).ToPersianNumbers()}</td>{Environment.NewLine}";
htmlText += $"<td class=\"ddate\">{FormatDate(expense.ExpenseDate)}</td>{Environment.NewLine}";
htmlText += $"<td class=\"damount\">{FormatMoney(expense.Amount)} {expense.Unit}</td>{Environment.NewLine}";
htmlText += $"<td class=\"ddate\">{LanguageUtils.FormatDate(expense.ExpenseDate)}</td>{Environment.NewLine}";
htmlText += $"<td class=\"damount\">{LanguageUtils.FormatMoney(expense.Amount)} {expense.Unit}</td>{Environment.NewLine}";
htmlText += $"<td class=\"ddonator\">{expense.Description}</td>{Environment.NewLine}";
htmlText += $"<td class=\"drem\">{FormatMoney(expenseRem)} {expense.Unit}</td>{Environment.NewLine}";
htmlText += $"<td class=\"drem\">{LanguageUtils.FormatMoney(expenseRem)} {expense.Unit}</td>{Environment.NewLine}";
htmlText += $"</tr>{Environment.NewLine}";
}
@ -788,7 +788,7 @@ namespace RMuseum.Services.Implementation
htmlText += $"<td class=\"damount\">{donation.AmountString}</td>{Environment.NewLine}";
htmlText += $"<td class=\"ddonator\">{donation.DonorName}</td>{Environment.NewLine}";
htmlText += $"<td class=\"dusage\">{(string.IsNullOrEmpty(donation.ExpenditureDesc) ? "هنوز هزینه نشده." : donation.ExpenditureDesc)}</td>{Environment.NewLine}";
htmlText += $"<td class=\"drem\">{(donation.Remaining == 0 || string.IsNullOrEmpty(donation.Unit) ? FormatMoney(donation.Remaining) : $"{FormatMoney(donation.Remaining)} {donation.Unit}")}</td>{Environment.NewLine}";
htmlText += $"<td class=\"drem\">{(donation.Remaining == 0 || string.IsNullOrEmpty(donation.Unit) ? LanguageUtils.FormatMoney(donation.Remaining) : $"{LanguageUtils.FormatMoney(donation.Remaining)} {donation.Unit}")}</td>{Environment.NewLine}";
htmlText += $"</tr>{Environment.NewLine}";
}
@ -831,26 +831,7 @@ namespace RMuseum.Services.Implementation
}
}
/// <summary>
/// format money
/// </summary>
/// <param name="amount"></param>
/// <returns></returns>
public static string FormatMoney(decimal amount)
{
return amount.ToString("N0", new CultureInfo("fa-IR")).ToPersianNumbers();
}
/// <summary>
/// format datetime
/// </summary>
/// <param name="dateTime"></param>
/// <returns></returns>
public static string FormatDate(DateTime dateTime)
{
return $"{dateTime.ToPersianYearMonthDay().Day.ToPersianNumbers()}م {PersianCulture.GetPersianMonthName(dateTime.ToPersianYearMonthDay().Month)} {dateTime.ToPersianYearMonthDay().Year.ToPersianNumbers()}";
}
/// <summary>

View File

@ -0,0 +1,91 @@
using DNTPersianUtils.Core;
using Microsoft.EntityFrameworkCore;
using RMuseum.DbContext;
using RMuseum.Models.Ganjoor;
using RMuseum.Models.Ganjoor.ViewModels;
using RSecurityBackend.Models.Generic;
using RSecurityBackend.Services.Implementation;
using System;
using System.Collections.Generic;
using System.Data;
using System.IO;
using System.Linq;
using System.Threading.Tasks;
using System.Xml.Linq;
namespace RMuseum.Services.Implementation
{
/// <summary>
/// IGanjoorService implementation
/// </summary>
public partial class GanjoorService : IGanjoorService
{
/// <summary>
/// build sitemap
/// </summary>
/// <returns></returns>
public async Task<RServiceResult<bool>> UpdateStatsPage(Guid editingUserId)
{
try
{
var poetsCoupletCounts =
await _context.GanjoorVerses.Include(v => v.Poem).ThenInclude(p => p.Cat).AsNoTracking()
.Where(v => v.VersePosition == VersePosition.Right || v.VersePosition == VersePosition.CenteredVerse1)
.GroupBy(v => new { v.Poem.Cat.PoetId })
.Select(g => new { PoetId = g.Key.PoetId, Count = g.Count() })
.ToListAsync();
poetsCoupletCounts.Sort((a, b) => b.Count - a.Count);
var dbPage = await _context.GanjoorPages.Where(p => p.FullUrl == "/vazn").SingleAsync();
var poets = await _context.GanjoorPoets.ToListAsync();
var sum = poetsCoupletCounts.Sum(c => c.Count);
string htmlText = $"<p>تا تاریخ {LanguageUtils.FormatDate(DateTime.Now)} مجموعاً {LanguageUtils.FormatMoney(sum)} بیت شعر از طریق سایت گنجور در دسترس قرار گرفته است. در جدول زیر با کلیک بر روی نام شاعران -که بر اساس تعداد ابیات اشعار آنها به صورت نزولی مرتب شده- می‌توانید آمار اوزان دیوان آنها را مشاهده کنید.</p>{Environment.NewLine}";
htmlText += $"<table>{Environment.NewLine}" +
$"<tr class=\"h\">{Environment.NewLine}" +
$"<td class=\"c1\">ردیف</td>{Environment.NewLine}" +
$"<td class=\"c2\">شاعر</td>{Environment.NewLine}" +
$"<td class=\"c3\">تعداد ابیات</td>{Environment.NewLine}" +
$"<td class=\"c4\">درصد از کل</td>{Environment.NewLine}" +
$"</tr>{Environment.NewLine}";
for (int i = 0; i < poetsCoupletCounts.Count; i++)
{
if(i%2 == 0)
htmlText += $"<tr class=\"e\">{Environment.NewLine}";
else
htmlText += $"<tr>{Environment.NewLine}";
htmlText += $"<td class=\"c1\">{(i + 1).ToPersianNumbers()}</td>{Environment.NewLine}";
htmlText += $"<td class=\"c2\">{poets.Where(p => p.Id == poetsCoupletCounts[i].PoetId).Single().Nickname}</td>{Environment.NewLine}";
htmlText += $"<td class=\"c3\">{LanguageUtils.FormatMoney(poetsCoupletCounts[i].Count)}</td>{Environment.NewLine}";
htmlText += $"<td class=\"c4\">{LanguageUtils.FormatMoney(poetsCoupletCounts[i].Count * 100 / sum)}</td>{Environment.NewLine}";
htmlText += $"</tr>{Environment.NewLine}";
}
htmlText += $"</table>{Environment.NewLine}";
await UpdatePageAsync(dbPage.Id, editingUserId,
new GanjoorModifyPageViewModel()
{
Title = dbPage.Title,
HtmlText = htmlText,
Note = "به روزرسانی خودکار صفحهٔ آمار وزنها",
UrlSlug = dbPage.UrlSlug,
}
);
return new RServiceResult<bool>(true);
}
catch (Exception exp)
{
return new RServiceResult<bool>(false, exp.ToString());
}
}
}
}

View File

@ -1,6 +1,9 @@
using RMuseum.Models.Ganjoor;
using DNTPersianUtils.Core;
using RMuseum.Models.Ganjoor;
using RMuseum.Models.Ganjoor.ViewModels;
using System;
using System.Collections.Generic;
using System.Globalization;
using System.Linq;
namespace RMuseum.Services.Implementation
@ -218,5 +221,27 @@ namespace RMuseum.Services.Implementation
return new GanjooRhymeAnalysisResult() { Rhyme = "", FailVerse = "" };
}
/// <summary>
/// format money
/// </summary>
/// <param name="amount"></param>
/// <returns></returns>
public static string FormatMoney(decimal amount)
{
return amount.ToString("N0", new CultureInfo("fa-IR")).ToPersianNumbers();
}
/// <summary>
/// format datetime
/// </summary>
/// <param name="dateTime"></param>
/// <returns></returns>
public static string FormatDate(DateTime dateTime)
{
return $"{dateTime.ToPersianYearMonthDay().Day.ToPersianNumbers()}م {PersianCulture.GetPersianMonthName(dateTime.ToPersianYearMonthDay().Month)} {dateTime.ToPersianYearMonthDay().Year.ToPersianNumbers()}";
}
}
}