();
int nStartIndex = htmlText.IndexOf("| ");
int rowNumber = 0;
while (nStartIndex != -1)
{
rowNumber++;
DonationPageRow row = new DonationPageRow();
nStartIndex += " | ".Length;
row.Date = htmlText.Substring(nStartIndex, htmlText.IndexOf(" | ", nStartIndex) - nStartIndex);
nStartIndex = htmlText.IndexOf("", nStartIndex);
if (nStartIndex == -1)
{
await jobProgressServiceEF.UpdateJob(job.Id, 100, "", false, $"{rowNumber} : damount");
return;
}
nStartIndex += " | ".Length;
row.Amount = htmlText.Substring(nStartIndex, htmlText.IndexOf(" | ", nStartIndex) - nStartIndex);
nStartIndex = htmlText.IndexOf("", nStartIndex);
if (nStartIndex == -1)
{
await jobProgressServiceEF.UpdateJob(job.Id, 100, "", false, $"{rowNumber} : ddonator");
return;
}
nStartIndex += " | ".Length;
row.Donor = htmlText.Substring(nStartIndex, htmlText.IndexOf(" | ", nStartIndex) - nStartIndex);
nStartIndex = htmlText.IndexOf("", nStartIndex);
if (nStartIndex == -1)
{
await jobProgressServiceEF.UpdateJob(job.Id, 100, "", false, $"{rowNumber} : dusage");
return;
}
nStartIndex += " | ".Length;
row.Usage = htmlText.Substring(nStartIndex, htmlText.IndexOf(" | ", nStartIndex) - nStartIndex);
nStartIndex = htmlText.IndexOf("", nStartIndex);
if (nStartIndex == -1)
{
await jobProgressServiceEF.UpdateJob(job.Id, 100, "", false, $"{rowNumber} : drem");
return;
}
nStartIndex += " | ".Length;
row.Remaining = htmlText.Substring(nStartIndex, htmlText.IndexOf(" | ", nStartIndex) - nStartIndex);
rows.Add(row);
nStartIndex = htmlText.IndexOf("", nStartIndex);
}
DateTime recordDate = DateTime.Now.AddDays(-2);
for (int i = rows.Count - 1; i >= 0; i--)
{
GanjoorDonation donation = new GanjoorDonation()
{
ImportedRecord = true,
DateString = rows[i].Date,
RecordDate = recordDate,
AmountString = rows[i].Amount,
DonorName = rows[i].Donor, //needs to be cleaned from href values
ExpenditureDesc = rows[i].Usage,
Remaining = 0
};
if (
rows[i].Remaining != "۲۰ دلار" //one record
&&
rows[i].Remaining.ToEnglishNumbers() != "0"
)
{
donation.Remaining = decimal.Parse(rows[i].Remaining.Replace("٬", "").Replace("تومان", "").Trim().ToEnglishNumbers());
}
if (donation.AmountString.Contains("تومان"))
{
donation.Amount = decimal.Parse(donation.AmountString.Replace("٬", "").Replace("تومان", "").Trim().ToEnglishNumbers());
donation.Unit = "تومان";
}
if (donation.AmountString.Contains("دلار"))
{
donation.Amount = decimal.Parse(donation.AmountString.Replace("٬", "").Replace("دلار", "").Trim().ToEnglishNumbers());
donation.Unit = "دلار";
}
if (donation.ExpenditureDesc == "هنوز هزینه نشده.")
{
donation.ExpenditureDesc = "";
}
context.GanjoorDonations.Add(donation);
await context.SaveChangesAsync(); //in order to make Id columns filled in desired order
}
await jobProgressServiceEF.UpdateJob(job.Id, 100, "", true);
}
catch (Exception exp)
{
await jobProgressServiceEF.UpdateJob(job.Id, 100, "", false, exp.ToString());
}
}
///
/// parse html of https://ganjoor.net/donate/ and fill the records
///
///
public async Task> InitializeRecords()
{
if (await _context.GanjoorDonations.AnyAsync())
return new RServiceResult(true);
try
{
_backgroundTaskQueue.QueueBackgroundWorkItem
(
async token =>
{
using (RMuseumDbContext context = new RMuseumDbContext(new DbContextOptions())) //this is long running job, so _context might be already been freed/collected by GC
{
await DoInitializeRecords(context);
}
}
);
}
catch (Exception exp)
{
return new RServiceResult(false, exp.ToString());
}
return new RServiceResult(true);
}
///
/// regenerate donations page
///
///
///
///
public async Task> RegenerateDonationsPage(Guid editingUserId, string note)
{
var dbPage = await _context.GanjoorPages.Where(p => p.FullUrl == "/donate").SingleAsync();
var donations = await _context.GanjoorDonations.OrderByDescending(d => d.Id).ToArrayAsync();
var remSum = await _context.GanjoorDonations.Where(d => d.Unit == "تومان").SumAsync(d => d.Remaining);
string htmlText = "";
DateTime dateLastDonation = donations.Length > 0 ? donations[0].RecordDate : DateTime.MinValue;
DateTime dateLastExpense = DateTime.MinValue;
var lastExpense = await _context.GanjoorExpenses.OrderByDescending(e => e.ExpenseDate).FirstOrDefaultAsync();
if (lastExpense != null)
{
dateLastExpense = lastExpense.ExpenseDate;
}
if (ShowAccountInfo)
{
htmlText += $"{Environment.NewLine}";
htmlText += $" {Environment.NewLine}";
htmlText += $"در صورت تمایل به حمایت مالی از گنجور از طریق کارت عابربانک؛ لطفاً کمکهای خود را به کارت شمارهٔ 6219-8610-2780-4979 (بانک سامان) به نام حمیدرضا محمدی واریز نمایید. علاوه بر آن از طریق اینترنتبانک سامان میتوانید کمکهای خود را به شماره حساب ۸۲۸-۸۰۰-۸۷۳۳۳۰-۱ (شمارهٔ شبا: IR03-0560-0828-8000-0873-3300-01) واریز نمایید. لطفاً از طریق تماس با نشانی ganjoor@ganjoor.net مشخصات خودتان و مبلغ واریزی را اطلاع دهید (نام کمک دهندگان و نوع استفادهای که از کمک آنها شده به مرور در همین صفحه به اطلاع خواهد رسید).{Environment.NewLine}";
htmlText += $" {Environment.NewLine}";
htmlText += $" {Environment.NewLine}";
htmlText += $"مبالغ واریزی جهت پرداخت هزینههای جاری (میزبانی وب و ...)، گسترش امکانات و همینطور پایگاه دادههای سایت مورد استفاده قرار خواهد گرفت.{Environment.NewLine}";
htmlText += $" {Environment.NewLine}";
htmlText += $" {Environment.NewLine}";
htmlText += $"ضمناً دوستانی که از خارج از ایران تمایل به ارسال کمک مالی دارند توجه فرمایند که به لحاظ محدودیتها و مشکلاتی که ممکن است برای این عزیزان ایجاد شود نیاز نیست به زحمت بیفتند. عموماً هزینههای جاری گنجور با کمکهای بزرگواران داخل ایران تأمین میشود و از این جهت راهی برای ارسال کمک از خارج از ایران در نظر گرفته نشده.\r\n{Environment.NewLine}";
htmlText += $" {Environment.NewLine}";
htmlText += $" {Environment.NewLine}";
}
else
{
htmlText += $"با سپاس از بزرگواری همهٔ دوستان، در حال حاضر هزینههای جاری گنجور تا چند ماه آینده تأمین شده است و جهت جلوگیری از ایجاد بدهی انباشته برای دریافتیهای فاقد محل هزینه کمک جدید نمیپذیریم. خواهشمندیم در صورت امکان کمکهای خود را به ماههای آینده محول فرمایید. اطلاعات واریز در مقطعی که نیاز باشد مجدداً در دسترس قرار خواهد گرفت. {Environment.NewLine}";
}
htmlText += $"{Environment.NewLine}";
DateTime last = dateLastDonation > dateLastExpense ? dateLastDonation : dateLastExpense;
var dateString = LanguageUtils.FormatDate(last);
htmlText += $"باقیماندهٔ قابل هزینهٔ کمکهای دریافتی تا {dateString} برابر {LanguageUtils.FormatMoney(remSum)} تومان است.{Environment.NewLine}";
htmlText += $" {Environment.NewLine}";
var expenses =
await _context.GanjoorExpenses
.Include(e => e.DonationExpenditures)
.Where(e => !string.IsNullOrEmpty(e.Unit) && (e.Amount - e.DonationExpenditures.Sum(x => x.Amount)) > 0)
.OrderBy(e => e.Id)
.ToListAsync();
if (expenses.Count > 0)
{
htmlText += $"هزینههای پوشش داده نشده{Environment.NewLine}";
htmlText += $"کمکهای آتی دریافتی صرف پوشش هزینههای زیر خواهد شد: {Environment.NewLine}";
htmlText += $"{Environment.NewLine}";
htmlText += $"{Environment.NewLine}";
htmlText += $"| ردیف | {Environment.NewLine}";
htmlText += $"تاریخ | {Environment.NewLine}";
htmlText += $"مبلغ | {Environment.NewLine}";
htmlText += $"عنوان | {Environment.NewLine}";
htmlText += $"مانده | {Environment.NewLine}";
htmlText += $" {Environment.NewLine}";
for (int i = 0; i < expenses.Count; i++)
{
var expense = expenses[i];
string cssClass = i % 2 == 0 ? " class=\"e\"" : "";
var expenseRem = expense.Amount;
if (expense.DonationExpenditures.Count > 0)
expenseRem -= expense.DonationExpenditures.Sum(x => x.Amount);
htmlText += $"{Environment.NewLine}";
htmlText += $"| {(i + 1).ToPersianNumbers()} | {Environment.NewLine}";
htmlText += $"{LanguageUtils.FormatDate(expense.ExpenseDate)} | {Environment.NewLine}";
htmlText += $"{LanguageUtils.FormatMoney(expense.Amount)} {expense.Unit} | {Environment.NewLine}";
htmlText += $"{expense.Description} | {Environment.NewLine}";
htmlText += $"{LanguageUtils.FormatMoney(expenseRem)} {expense.Unit} | {Environment.NewLine}";
htmlText += $" {Environment.NewLine}";
}
htmlText += $" {Environment.NewLine}";
}
htmlText += $"کمکهای دریافت شده تا به حال{Environment.NewLine}";
htmlText += $"{Environment.NewLine}";
htmlText += $"{Environment.NewLine}";
htmlText += $"| ردیف | {Environment.NewLine}";
htmlText += $"تاریخ | {Environment.NewLine}";
htmlText += $"مبلغ | {Environment.NewLine}";
htmlText += $"اهدا کننده | {Environment.NewLine}";
htmlText += $"محل هزینه | {Environment.NewLine}";
htmlText += $"مانده | {Environment.NewLine}";
htmlText += $" {Environment.NewLine}";
for (int i = 0; i < donations.Length; i++)
{
var donation = donations[i];
string cssClass = i % 2 == 0 ? " class=\"e\"" : "";
htmlText += $"{Environment.NewLine}";
htmlText += $"| {(donations.Length - i).ToPersianNumbers()} | {Environment.NewLine}";
htmlText += $"{donation.DateString} | {Environment.NewLine}";
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) ? LanguageUtils.FormatMoney(donation.Remaining) : $"{LanguageUtils.FormatMoney(donation.Remaining)} {donation.Unit}")} | {Environment.NewLine}";
htmlText += $" {Environment.NewLine}";
}
htmlText += $" {Environment.NewLine}";
await _ganjoorService.UpdatePageAsync(dbPage.Id, editingUserId,
new GanjoorModifyPageViewModel()
{
Title = dbPage.Title,
HtmlText = htmlText,
Note = note,
UrlSlug = dbPage.UrlSlug,
NoIndex = dbPage.NoIndex,
}
);
return new RServiceResult(true);
}
///
/// Show Donating Information (temporary switch off/on)
///
public bool ShowAccountInfo
{
get
{
try
{
return bool.Parse(_configuration.GetSection("Donations")["ShowAccountInfo"]);
}
catch
{
return true;
}
}
}
///
/// Database Context
///
private readonly RMuseumDbContext _context;
///
/// Background Task Queue Instance
///
private readonly IBackgroundTaskQueue _backgroundTaskQueue;
///
/// Ganjoor Service
///
private readonly IGanjoorService _ganjoorService;
///
/// configuration
///
private readonly IConfiguration _configuration;
///
/// constructor
///
///
///
///
///
public DonationService(RMuseumDbContext context, IBackgroundTaskQueue backgroundTaskQueue, IGanjoorService ganjoorService, IConfiguration configuration)
{
_context = context;
_backgroundTaskQueue = backgroundTaskQueue;
_ganjoorService = ganjoorService;
_configuration = configuration;
}
}
}
|