using Microsoft.EntityFrameworkCore; using RMuseum.DbContext; using RMuseum.Models.Accounting; using RSecurityBackend.Models.Generic; using System; using System.Collections.Generic; using System.Linq; using System.Threading.Tasks; using DNTPersianUtils.Core; using RSecurityBackend.Services.Implementation; using RSecurityBackend.Services; using Microsoft.Extensions.Configuration; using RMuseum.Models.Ganjoor.ViewModels; using RMuseum.Models.Accounting.ViewModels; namespace RMuseum.Services.Implementation { /// /// donation service /// public class DonationService : IDonationService { /// /// new donation /// /// /// /// public async Task> 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(donation); } /// /// update donation /// /// /// /// /// public async Task> UpdateDonation(Guid editingUserId, int id, UpdateDateDescriptionViewModel updateModel) { var donation = await _context.GanjoorDonations.Where(d => d.Id == id).SingleAsync(); donation.RecordDate = updateModel.Date; donation.DateString = LanguageUtils.FormatDate(donation.RecordDate); donation.DonorName = updateModel.Description; _context.GanjoorDonations.Update(donation); await _context.SaveChangesAsync(); await RegenerateDonationsPage(editingUserId, $"ویرایش کمک مالی از {donation.DonorName} به مبلغ {donation.AmountString}");//ignore possible errors here! return new RServiceResult(true); } /// /// delete donation /// /// /// /// public async Task> DeleteDonation(Guid editingUserId, int id) { var donation = await _context.GanjoorDonations.Where(d => d.Id == id).SingleAsync(); if (donation.ImportedRecord) { var sumExpenditures = await _context.DonationExpenditure.AsNoTracking().Where(x => x.GanjoorDonationId == id).SumAsync(x => x.Amount); if (sumExpenditures != (donation.Amount - donation.Remaining)) { return new RServiceResult(false, "حذف این ردیف از طریق API امکان ندارد."); } } string note = $"حذف کمک مالی از {donation.DonorName} به مبلغ {donation.AmountString}"; _context.GanjoorDonations.Remove(donation); await _context.SaveChangesAsync(); await RegenerateDonationsPage(editingUserId, note);//ignore possible errors here! return new RServiceResult(true); } /// /// new expense /// /// /// /// public async Task> AddExpense(Guid editingUserId, GanjoorExpense expense) { expense.DonationExpenditures = new List();//fix swagger posting a list which causes a donation to be added _context.GanjoorExpenses.Add(expense); await _context.SaveChangesAsync(); if (!string.IsNullOrEmpty(expense.Unit) && expense.Amount > 0) { var expenseRemaining = expense.Amount; var donations = await _context.GanjoorDonations.Where(d => d.Unit == expense.Unit && d.Remaining > 0).OrderBy(d => d.Id).ToListAsync(); foreach (var d in donations) { if (expenseRemaining <= 0) break; var remaining = expenseRemaining; 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 == 1 && remaining == expenseRemaining ? "" : "بخشی از "; 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(); expenseRemaining -= remaining; } } await RegenerateDonationsPage(editingUserId, $"ثبت هزینهٔ {expense.Description} به مبلغ {LanguageUtils.FormatMoney(expense.Amount)} {expense.Unit}");//ignore possible errors here! return new RServiceResult(expense); } /// /// update expense /// /// /// /// /// public async Task> UpdateExpense(Guid editingUserId, int id, UpdateDateDescriptionViewModel updateModel) { var expense = await _context.GanjoorExpenses.Include(e => e.DonationExpenditures).Where(d => d.Id == id).SingleAsync(); List donations = new List(); foreach (var expenditure in expense.DonationExpenditures) { if (!donations.Where(d => d.Id == expenditure.GanjoorDonationId).Any()) { donations.Add(await _context.GanjoorDonations.Where(d => d.Id == expenditure.GanjoorDonationId).SingleAsync()); } } expense.ExpenseDate = updateModel.Date; expense.Description = updateModel.Description; _context.GanjoorExpenses.Update(expense); await _context.SaveChangesAsync(); await RegenerateDonationsExpenditureDesc(donations); await RegenerateDonationsPage(editingUserId, $"ویرایش هزینهٔ {expense.Description} به مبلغ {LanguageUtils.FormatMoney(expense.Amount)} {expense.Unit}");//ignore possible errors here! return new RServiceResult(true); } private async Task RegenerateDonationsExpenditureDesc(List donations) { if (donations.Count > 0) { foreach (var donation in donations) { donation.Remaining = donation.Amount; donation.ExpenditureDesc = ""; var donationExpenses = await _context.GanjoorExpenses.AsNoTracking() .Include(e => e.DonationExpenditures) .Where(e => e.DonationExpenditures .Any(x => x.GanjoorDonationId == donation.Id)) .ToListAsync(); foreach (var donationExpense in donationExpenses) 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 ? "باقیماندهٔ آن " : $"مبلغ {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} به مبلغ {LanguageUtils.FormatMoney(donationExpense.Amount)} {donation.Unit} صرف شد ({LanguageUtils.FormatDate(donationExpense.ExpenseDate)})."; donation.Remaining -= donationExpenditure.Amount; } _context.GanjoorDonations.Update(donation); } await _context.SaveChangesAsync(); } } /// /// delete expense /// /// /// /// public async Task> DeleteExpense(Guid editingUserId, int id) { var expense = await _context.GanjoorExpenses.Include(e => e.DonationExpenditures).Where(e => e.Id == id).SingleAsync(); string note = $"حذف هزینهٔ {expense.Description} به مبلغ {LanguageUtils.FormatMoney(expense.Amount)} {expense.Unit}"; List donations = new List(); foreach (var expenditure in expense.DonationExpenditures) { if (!donations.Where(d => d.Id == expenditure.GanjoorDonationId).Any()) { donations.Add(await _context.GanjoorDonations.Where(d => d.Id == expenditure.GanjoorDonationId).SingleAsync()); } _context.DonationExpenditure.Remove(expenditure); } await _context.SaveChangesAsync(); _context.GanjoorExpenses.Remove(expense); await _context.SaveChangesAsync(); await RegenerateDonationsExpenditureDesc(donations); await RegenerateDonationsPage(editingUserId, note);//ignore possible errors here! return new RServiceResult(true); } /// /// returns all donations /// /// public async Task> GetDonations() { return new RServiceResult ( await _context.GanjoorDonations .AsNoTracking() .OrderByDescending(d => d.Id) .Select ( d => new GanjoorDonationViewModel() { Id = d.Id, Amount = d.Amount, AmountString = d.AmountString, DateString = d.DateString, DonorName = d.DonorName, ExpenditureDesc = d.ExpenditureDesc, ImportedRecord = d.ImportedRecord, RecordDate = d.RecordDate, Remaining = d.Remaining, Unit = d.Unit } ).ToArrayAsync() ); } /// /// get donation by id /// /// /// public async Task> GetDonation(int id) { return new RServiceResult ( await _context.GanjoorDonations .AsNoTracking() .Where(d => d.Id == id) .Select ( d => new GanjoorDonationViewModel() { Id = d.Id, Amount = d.Amount, AmountString = d.AmountString, DateString = d.DateString, DonorName = d.DonorName, ExpenditureDesc = d.ExpenditureDesc, ImportedRecord = d.ImportedRecord, RecordDate = d.RecordDate, Remaining = d.Remaining, Unit = d.Unit } ).SingleOrDefaultAsync() ); } /// /// returns all expenses /// /// public async Task> GetExpenses() { return new RServiceResult ( await _context.GanjoorExpenses.Include(x => x.DonationExpenditures) .AsNoTracking() .OrderByDescending(x => x.Id) .ToArrayAsync() ); } /// /// get expense by id /// /// /// public async Task> GetExpense(int id) { return new RServiceResult ( await _context.GanjoorExpenses.Include(x => x.DonationExpenditures) .AsNoTracking() .Where(e => e.Id == id) .SingleOrDefaultAsync() ); } /// /// donation page row /// private class DonationPageRow { /// /// date /// public string Date { get; set; } /// /// amount /// public string Amount { get; set; } /// /// donor /// public string Donor { get; set; } /// /// usage /// public string Usage { get; set; } /// /// remaining /// public string Remaining { get; set; } } 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 rows = new List(); 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 += $"{Environment.NewLine}"; htmlText += $"{Environment.NewLine}"; htmlText += $"{Environment.NewLine}"; htmlText += $"{Environment.NewLine}"; htmlText += $"{Environment.NewLine}"; htmlText += $"{Environment.NewLine}"; } htmlText += $"
ردیفتاریخمبلغعنوانمانده
{(i + 1).ToPersianNumbers()}{LanguageUtils.FormatDate(expense.ExpenseDate)}{LanguageUtils.FormatMoney(expense.Amount)} {expense.Unit}{expense.Description}{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}"; for (int i = 0; i < donations.Length; i++) { var donation = donations[i]; string cssClass = i % 2 == 0 ? " class=\"e\"" : ""; 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 += $"
ردیفتاریخمبلغاهدا کنندهمحل هزینهمانده
{(donations.Length - i).ToPersianNumbers()}{donation.DateString}{donation.AmountString}{donation.DonorName}{(string.IsNullOrEmpty(donation.ExpenditureDesc) ? "هنوز هزینه نشده." : donation.ExpenditureDesc)}{(donation.Remaining == 0 || string.IsNullOrEmpty(donation.Unit) ? LanguageUtils.FormatMoney(donation.Remaining) : $"{LanguageUtils.FormatMoney(donation.Remaining)} {donation.Unit}")}
{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; } } }