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));
        }