diff --git a/GanjooRazor/Areas/Admin/Pages/Expenses.cshtml b/GanjooRazor/Areas/Admin/Pages/Expenses.cshtml index 7d632576..e2182b15 100644 --- a/GanjooRazor/Areas/Admin/Pages/Expenses.cshtml +++ b/GanjooRazor/Areas/Admin/Pages/Expenses.cshtml @@ -73,8 +73,8 @@ @foreach (var expense in Model.Expenses) { - @RMuseum.Services.Implementation.DonationService.FormatDate(expense.ExpenseDate) - @RMuseum.Services.Implementation.DonationService.FormatMoney(expense.Amount) + @RMuseum.Services.Implementation.LanguageUtils.FormatDate(expense.ExpenseDate) + @RMuseum.Services.Implementation.LanguageUtils.FormatMoney(expense.Amount) @expense.Description ✎ diff --git a/RMuseum/Controllers/GanjoorController.cs b/RMuseum/Controllers/GanjoorController.cs index 39365544..90c5d20f 100644 --- a/RMuseum/Controllers/GanjoorController.cs +++ b/RMuseum/Controllers/GanjoorController.cs @@ -1464,6 +1464,32 @@ namespace RMuseum.Controllers return Ok(); } + /// + /// regenerate stats page + /// + /// + [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 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()); + } + } + /// /// Ganjoor Service /// diff --git a/RMuseum/RMuseum.xml b/RMuseum/RMuseum.xml index 8c2b7345..669cf14b 100644 --- a/RMuseum/RMuseum.xml +++ b/RMuseum/RMuseum.xml @@ -1095,6 +1095,12 @@ + + + regenerate stats page + + + Ganjoor Service @@ -7600,6 +7606,12 @@ + + + build sitemap + + + IArtifactService implementation @@ -8445,20 +8457,6 @@ Show Donating Information (temporary switch off/on) - - - format money - - - - - - - format datetime - - - - Database Context @@ -8564,6 +8562,9 @@ IGanjoorService implementation + + IGanjoorService implementation + @@ -8608,6 +8609,12 @@ + + + build sitemap + + + Get List of poets @@ -9140,6 +9147,20 @@ + + + format money + + + + + + + format datetime + + + + Music Catalgue Service Implementation diff --git a/RMuseum/Services/IGanjoorService.cs b/RMuseum/Services/IGanjoorService.cs index a2ea7407..bc1c2e00 100644 --- a/RMuseum/Services/IGanjoorService.cs +++ b/RMuseum/Services/IGanjoorService.cs @@ -446,5 +446,11 @@ namespace RMuseum.Services /// /// RServiceResult StartBuildingSitemap(); + + /// + /// build sitemap + /// + /// + Task> UpdateStatsPage(Guid editingUserId); } } diff --git a/RMuseum/Services/Implementation/DonationService.cs b/RMuseum/Services/Implementation/DonationService.cs index 6513a5ab..9700ed6a 100644 --- a/RMuseum/Services/Implementation/DonationService.cs +++ b/RMuseum/Services/Implementation/DonationService.cs @@ -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(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(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 donations = new List(); 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 += $"

{Environment.NewLine}"; var expenses = @@ -750,10 +750,10 @@ namespace RMuseum.Services.Implementation htmlText += $"{Environment.NewLine}"; htmlText += $"{(i + 1).ToPersianNumbers()}{Environment.NewLine}"; - htmlText += $"{FormatDate(expense.ExpenseDate)}{Environment.NewLine}"; - htmlText += $"{FormatMoney(expense.Amount)} {expense.Unit}{Environment.NewLine}"; + htmlText += $"{LanguageUtils.FormatDate(expense.ExpenseDate)}{Environment.NewLine}"; + htmlText += $"{LanguageUtils.FormatMoney(expense.Amount)} {expense.Unit}{Environment.NewLine}"; htmlText += $"{expense.Description}{Environment.NewLine}"; - htmlText += $"{FormatMoney(expenseRem)} {expense.Unit}{Environment.NewLine}"; + htmlText += $"{LanguageUtils.FormatMoney(expenseRem)} {expense.Unit}{Environment.NewLine}"; htmlText += $"{Environment.NewLine}"; } @@ -788,7 +788,7 @@ namespace RMuseum.Services.Implementation htmlText += $"{donation.AmountString}{Environment.NewLine}"; htmlText += $"{donation.DonorName}{Environment.NewLine}"; htmlText += $"{(string.IsNullOrEmpty(donation.ExpenditureDesc) ? "هنوز هزینه نشده." : donation.ExpenditureDesc)}{Environment.NewLine}"; - htmlText += $"{(donation.Remaining == 0 || string.IsNullOrEmpty(donation.Unit) ? FormatMoney(donation.Remaining) : $"{FormatMoney(donation.Remaining)} {donation.Unit}")}{Environment.NewLine}"; + htmlText += $"{(donation.Remaining == 0 || string.IsNullOrEmpty(donation.Unit) ? LanguageUtils.FormatMoney(donation.Remaining) : $"{LanguageUtils.FormatMoney(donation.Remaining)} {donation.Unit}")}{Environment.NewLine}"; htmlText += $"{Environment.NewLine}"; } @@ -831,26 +831,7 @@ namespace RMuseum.Services.Implementation } } - /// - /// format money - /// - /// - /// - - public static string FormatMoney(decimal amount) - { - return amount.ToString("N0", new CultureInfo("fa-IR")).ToPersianNumbers(); - } - - /// - /// format datetime - /// - /// - /// - public static string FormatDate(DateTime dateTime) - { - return $"{dateTime.ToPersianYearMonthDay().Day.ToPersianNumbers()}م {PersianCulture.GetPersianMonthName(dateTime.ToPersianYearMonthDay().Month)} {dateTime.ToPersianYearMonthDay().Year.ToPersianNumbers()}"; - } + /// diff --git a/RMuseum/Services/Implementation/GanjoorService-Partials/GanjoorService-Stats.cs b/RMuseum/Services/Implementation/GanjoorService-Partials/GanjoorService-Stats.cs new file mode 100644 index 00000000..c1f36a2a --- /dev/null +++ b/RMuseum/Services/Implementation/GanjoorService-Partials/GanjoorService-Stats.cs @@ -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 +{ + /// + /// IGanjoorService implementation + /// + public partial class GanjoorService : IGanjoorService + { + + /// + /// build sitemap + /// + /// + public async Task> 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 = $"

تا تاریخ {LanguageUtils.FormatDate(DateTime.Now)} مجموعاً {LanguageUtils.FormatMoney(sum)} بیت شعر از طریق سایت گنجور در دسترس قرار گرفته است. در جدول زیر با کلیک بر روی نام شاعران -که بر اساس تعداد ابیات اشعار آنها به صورت نزولی مرتب شده- می‌توانید آمار اوزان دیوان آنها را مشاهده کنید.

{Environment.NewLine}"; + + htmlText += $"{Environment.NewLine}" + + $"{Environment.NewLine}" + + $"{Environment.NewLine}" + + $"{Environment.NewLine}" + + $"{Environment.NewLine}" + + $"{Environment.NewLine}" + + $"{Environment.NewLine}"; + + for (int i = 0; i < poetsCoupletCounts.Count; i++) + { + if(i%2 == 0) + htmlText += $"{Environment.NewLine}"; + else + htmlText += $"{Environment.NewLine}"; + + htmlText += $"{Environment.NewLine}"; + htmlText += $"{Environment.NewLine}"; + htmlText += $"{Environment.NewLine}"; + htmlText += $"{Environment.NewLine}"; + + htmlText += $"{Environment.NewLine}"; + } + htmlText += $"
ردیفشاعرتعداد ابیاتدرصد از کل
{(i + 1).ToPersianNumbers()}{poets.Where(p => p.Id == poetsCoupletCounts[i].PoetId).Single().Nickname}{LanguageUtils.FormatMoney(poetsCoupletCounts[i].Count)}{LanguageUtils.FormatMoney(poetsCoupletCounts[i].Count * 100 / sum)}
{Environment.NewLine}"; + + await UpdatePageAsync(dbPage.Id, editingUserId, + new GanjoorModifyPageViewModel() + { + Title = dbPage.Title, + HtmlText = htmlText, + Note = "به روزرسانی خودکار صفحهٔ آمار وزنها", + UrlSlug = dbPage.UrlSlug, + } + ); + return new RServiceResult(true); + } + catch (Exception exp) + { + return new RServiceResult(false, exp.ToString()); + } + } + } +} \ No newline at end of file diff --git a/RMuseum/Services/Implementation/LanguageUtils.cs b/RMuseum/Services/Implementation/LanguageUtils.cs index 9ccdb856..add8b8ca 100644 --- a/RMuseum/Services/Implementation/LanguageUtils.cs +++ b/RMuseum/Services/Implementation/LanguageUtils.cs @@ -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 = "" }; } + + + /// + /// format money + /// + /// + /// + + public static string FormatMoney(decimal amount) + { + return amount.ToString("N0", new CultureInfo("fa-IR")).ToPersianNumbers(); + } + + /// + /// format datetime + /// + /// + /// + public static string FormatDate(DateTime dateTime) + { + return $"{dateTime.ToPersianYearMonthDay().Day.ToPersianNumbers()}م {PersianCulture.GetPersianMonthName(dateTime.ToPersianYearMonthDay().Month)} {dateTime.ToPersianYearMonthDay().Year.ToPersianNumbers()}"; + } } }