/// <summary> /// new expense /// </summary> /// <param name="editingUserId"></param> /// <param name="expense"></param> /// <returns></returns> public async Task <RServiceResult <GanjoorExpense> > AddExpense(Guid editingUserId, GanjoorExpense expense) { expense.DonationExpenditures = new List <DonationExpenditure>();//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 <GanjoorExpense>(expense)); }
/// <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)); }