private async Task DoInitializeRecords(RMuseumDbContext context) { LongRunningJobProgressServiceEF jobProgressServiceEF = new LongRunningJobProgressServiceEF(context); var job = (await jobProgressServiceEF.NewJob("DonationService::DoInitializeRecords", "Processing")).Result; try { string htmlText = await context.GanjoorPages.Where(p => p.UrlSlug == "donate").Select(p => p.HtmlText).AsNoTracking().SingleAsync(); List <DonationPageRow> rows = new List <DonationPageRow>(); int nStartIndex = htmlText.IndexOf("<td class=\"ddate\">"); int rowNumber = 0; while (nStartIndex != -1) { rowNumber++; DonationPageRow row = new DonationPageRow(); nStartIndex += "<td class=\"ddate\">".Length; row.Date = htmlText.Substring(nStartIndex, htmlText.IndexOf("</td>", nStartIndex) - nStartIndex); nStartIndex = htmlText.IndexOf("<td class=\"damount\">", nStartIndex); if (nStartIndex == -1) { await jobProgressServiceEF.UpdateJob(job.Id, 100, "", false, $"{rowNumber} : damount"); return; } nStartIndex += "<td class=\"damount\">".Length; row.Amount = htmlText.Substring(nStartIndex, htmlText.IndexOf("</td>", nStartIndex) - nStartIndex); nStartIndex = htmlText.IndexOf("<td class=\"ddonator\">", nStartIndex); if (nStartIndex == -1) { await jobProgressServiceEF.UpdateJob(job.Id, 100, "", false, $"{rowNumber} : ddonator"); return; } nStartIndex += "<td class=\"ddonator\">".Length; row.Donor = htmlText.Substring(nStartIndex, htmlText.IndexOf("</td>", nStartIndex) - nStartIndex); nStartIndex = htmlText.IndexOf("<td class=\"dusage\">", nStartIndex); if (nStartIndex == -1) { await jobProgressServiceEF.UpdateJob(job.Id, 100, "", false, $"{rowNumber} : dusage"); return; } nStartIndex += "<td class=\"dusage\">".Length; row.Usage = htmlText.Substring(nStartIndex, htmlText.IndexOf("</td>", nStartIndex) - nStartIndex); nStartIndex = htmlText.IndexOf("<td class=\"drem\">", nStartIndex); if (nStartIndex == -1) { await jobProgressServiceEF.UpdateJob(job.Id, 100, "", false, $"{rowNumber} : drem"); return; } nStartIndex += "<td class=\"drem\">".Length; row.Remaining = htmlText.Substring(nStartIndex, htmlText.IndexOf("</td>", nStartIndex) - nStartIndex); rows.Add(row); nStartIndex = htmlText.IndexOf("<td class=\"ddate\">", 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()); } }
/// <summary> /// new donation /// </summary> /// <param name="editingUserId"></param> /// <param name="donation"></param> /// <returns></returns> public async Task <RServiceResult <GanjoorDonationViewModel> > AddDonation(Guid editingUserId, GanjoorDonationViewModel donation) { var d = new GanjoorDonation() { DateString = LanguageUtils.FormatDate(donation.RecordDate), RecordDate = donation.RecordDate, Amount = donation.Amount, Unit = donation.Unit, AmountString = LanguageUtils.FormatMoney(donation.Amount), DonorName = donation.DonorName, Remaining = donation.Amount, ExpenditureDesc = "", ImportedRecord = false }; if (!string.IsNullOrEmpty(donation.Unit)) { d.AmountString = $"{d.AmountString} {d.Unit}"; } _context.GanjoorDonations.Add(d); await _context.SaveChangesAsync(); if (!string.IsNullOrEmpty(d.Unit) && d.Amount > 0) { var expenses = await _context.GanjoorExpenses .Include(e => e.DonationExpenditures) .Where(e => e.Unit == d.Unit && (e.Amount - e.DonationExpenditures.Sum(x => x.Amount)) > 0) .OrderBy(e => e.Id) .ToListAsync(); foreach (var expense in expenses) { if (d.Remaining <= 0) { break; } var remaining = expense.Amount - expense.DonationExpenditures.Sum(x => x.Amount); if (remaining > d.Remaining) { remaining = d.Remaining; } DonationExpenditure n = new DonationExpenditure() { Amount = remaining, GanjoorDonationId = d.Id }; expense.DonationExpenditures.Add(n); _context.GanjoorExpenses.Update(expense); 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} به مبلغ {LanguageUtils.FormatMoney(expense.Amount)} {d.Unit} صرف شد ({LanguageUtils.FormatDate(expense.ExpenseDate)})."; d.Remaining -= remaining; _context.GanjoorDonations.Update(d); await _context.SaveChangesAsync(); } } await RegenerateDonationsPage(editingUserId, $"ثبت کمک مالی از {d.DonorName} به مبلغ {d.AmountString}");//ignore possible errors here! donation.Id = d.Id; donation.DateString = d.DateString; donation.AmountString = d.AmountString; donation.Remaining = d.Remaining; donation.ExpenditureDesc = d.ExpenditureDesc; donation.ImportedRecord = d.ImportedRecord; return(new RServiceResult <GanjoorDonationViewModel>(donation)); }