#129 consuming donations on expenses

This commit is contained in:
Hamid Reza Mohammadi 2021-06-05 16:10:30 +04:30
parent e4773fe310
commit d3be3bb933
4 changed files with 147 additions and 4 deletions

View File

@ -1,5 +1,6 @@
using Microsoft.AspNetCore.Authorization;
using Microsoft.AspNetCore.Mvc;
using RMuseum.Models.Accounting;
using RMuseum.Models.Accounting.ViewModels;
using RMuseum.Models.Auth.Memory;
using RMuseum.Services;
@ -41,6 +42,34 @@ namespace RMuseum.Controllers
}
}
/// <summary>
/// add expense + regenerate donations page
/// </summary>
/// <param name="expense"></param>
/// <returns></returns>
[HttpPost("expense")]
[Authorize(Policy = RMuseumSecurableItem.GanjoorEntityShortName + ":" + RMuseumSecurableItem.Donations)]
[ProducesResponseType((int)HttpStatusCode.OK, Type = typeof(GanjoorDonationViewModel))]
[ProducesResponseType((int)HttpStatusCode.BadRequest, Type = typeof(string))]
[ProducesResponseType((int)HttpStatusCode.Unauthorized)]
public async Task<IActionResult> AddExpense([FromBody] GanjoorExpense expense)
{
try
{
Guid userId = new Guid(User.Claims.FirstOrDefault(c => c.Type == "UserId").Value);
var res = await _donationService.AddExpense(userId, expense);
if (!string.IsNullOrEmpty(res.ExceptionString))
return BadRequest(res.ExceptionString);
return Ok(res.Result);
}
catch (Exception exp)
{
return BadRequest(exp.ToString());
}
}
/// <summary>
/// one time import
/// </summary>

View File

@ -591,6 +591,13 @@
<param name="donation"></param>
<returns></returns>
</member>
<member name="M:RMuseum.Controllers.DonationAccountingController.AddExpense(RMuseum.Models.Accounting.GanjoorExpense)">
<summary>
add expense + regenerate donations page
</summary>
<param name="expense"></param>
<returns></returns>
</member>
<member name="M:RMuseum.Controllers.DonationAccountingController.Import">
<summary>
one time import
@ -6831,6 +6838,14 @@
<param name="donation"></param>
<returns></returns>
</member>
<member name="M:RMuseum.Services.IDonationService.AddExpense(System.Guid,RMuseum.Models.Accounting.GanjoorExpense)">
<summary>
new expense
</summary>
<param name="editingUserId"></param>
<param name="expense"></param>
<returns></returns>
</member>
<member name="M:RMuseum.Services.IDonationService.InitializeRecords">
<summary>
parse html of https://ganjoor.net/donate/ and fill the records
@ -7914,6 +7929,14 @@
<param name="donation"></param>
<returns></returns>
</member>
<member name="M:RMuseum.Services.Implementation.DonationService.AddExpense(System.Guid,RMuseum.Models.Accounting.GanjoorExpense)">
<summary>
new expense
</summary>
<param name="editingUserId"></param>
<param name="expense"></param>
<returns></returns>
</member>
<member name="T:RMuseum.Services.Implementation.DonationService.DonationPageRow">
<summary>
donation page row

View File

@ -1,4 +1,5 @@
using RMuseum.Models.Accounting.ViewModels;
using RMuseum.Models.Accounting;
using RMuseum.Models.Accounting.ViewModels;
using RSecurityBackend.Models.Generic;
using System;
using System.Threading.Tasks;
@ -18,6 +19,14 @@ namespace RMuseum.Services
/// <returns></returns>
Task<RServiceResult<GanjoorDonationViewModel>> AddDonation(Guid editingUserId, GanjoorDonationViewModel donation);
/// <summary>
/// new expense
/// </summary>
/// <param name="editingUserId"></param>
/// <param name="expense"></param>
/// <returns></returns>
Task<RServiceResult<GanjoorExpense>> AddExpense(Guid editingUserId, GanjoorExpense expense);
/// <summary>
/// parse html of https://ganjoor.net/donate/ and fill the records
/// </summary>

View File

@ -51,7 +51,7 @@ namespace RMuseum.Services.Implementation
_context.GanjoorDonations.Add(d);
await _context.SaveChangesAsync();
if(!string.IsNullOrEmpty(d.Unit))
if(!string.IsNullOrEmpty(d.Unit) && d.Amount > 0)
{
var expenses =
await _context.GanjoorExpenses
@ -78,10 +78,13 @@ namespace RMuseum.Services.Implementation
expense.DonationExpenditures.Add(n);
_context.GanjoorExpenses.Update(expense);
var part = expense.DonationExpenditures.Count == 0 && remaining == d.Amount ? "" : "بخشی از ";
var amount = d.Remaining == d.Amount && remaining == d.Remaining ? "" : d.Remaining == remaining ? "" : $"مبلغ {remaining.ToString("N0", new CultureInfo("fa-IR")).ToPersianNumbers()} {d.Unit} آن ";
var part = expense.DonationExpenditures.Count == 0 && remaining == expense.Amount ? "" : "بخشی از ";
if (!string.IsNullOrEmpty(d.ExpenditureDesc))
d.ExpenditureDesc += " ";
d.ExpenditureDesc += $"جهت تأمین {part}هزینهٔ {expense.Description} به مبلغ {expense.Amount.ToString("N0", new CultureInfo("fa-IR")).ToPersianNumbers()} {d.Unit} صرف شد.";
DateTime expenseDate = expense.ExpenseDate;
var dateString = $"{expenseDate.ToPersianYearMonthDay().Day.ToPersianNumbers()}م {PersianCulture.GetPersianMonthName(expenseDate.ToPersianYearMonthDay().Month)} {expenseDate.ToPersianYearMonthDay().Year.ToPersianNumbers()}";
d.ExpenditureDesc += $"{amount}جهت تأمین {part}هزینهٔ {expense.Description} به مبلغ {expense.Amount.ToString("N0", new CultureInfo("fa-IR")).ToPersianNumbers()} {d.Unit} صرف شد ({dateString}).";
d.Remaining -= remaining;
_context.GanjoorDonations.Update(d);
await _context.SaveChangesAsync();
@ -108,6 +111,73 @@ namespace RMuseum.Services.Implementation
}
}
/// <summary>
/// new expense
/// </summary>
/// <param name="editingUserId"></param>
/// <param name="expense"></param>
/// <returns></returns>
public async Task<RServiceResult<GanjoorExpense>> AddExpense(Guid editingUserId, GanjoorExpense expense)
{
try
{
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 ? "باقیماندهٔ آن " : $"مبلغ {remaining.ToString("N0", new CultureInfo("fa-IR")).ToPersianNumbers()} {d.Unit} آن ";
var part = expense.DonationExpenditures.Count == 1 && remaining == expenseRemaining ? "" : "بخشی از ";
if (!string.IsNullOrEmpty(d.ExpenditureDesc))
d.ExpenditureDesc += " ";
DateTime expenseDate = expense.ExpenseDate;
var dateString = $"{expenseDate.ToPersianYearMonthDay().Day.ToPersianNumbers()}م {PersianCulture.GetPersianMonthName(expenseDate.ToPersianYearMonthDay().Month)} {expenseDate.ToPersianYearMonthDay().Year.ToPersianNumbers()}";
d.ExpenditureDesc += $"{amount}جهت تأمین {part}هزینهٔ {expense.Description} به مبلغ {expense.Amount.ToString("N0", new CultureInfo("fa-IR")).ToPersianNumbers()} {d.Unit} صرف شد ({dateString}).";
d.Remaining -= remaining;
_context.GanjoorDonations.Update(d);
await _context.SaveChangesAsync();
expenseRemaining -= remaining;
}
}
await RegenerateDonationsPage(editingUserId);//ignore possible errors here!
return new RServiceResult<GanjoorExpense>(expense);
}
catch(Exception exp)
{
return new RServiceResult<GanjoorExpense>(null, exp.ToString());
}
}
/// <summary>
/// donation page row
/// </summary>
@ -311,6 +381,18 @@ namespace RMuseum.Services.Implementation
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;
}
DateTime last = dateLastDonation > dateLastExpense ? dateLastDonation : dateLastExpense;
var dateString = $"{last.ToPersianYearMonthDay().Day.ToPersianNumbers()}م {PersianCulture.GetPersianMonthName(last.ToPersianYearMonthDay().Month)} {last.ToPersianYearMonthDay().Year.ToPersianNumbers()}";
htmlText += $"<p>{Environment.NewLine}";
htmlText += $"در صورت تمایل به کمک مالی به گنجور از طریق کارت عابربانک؛ لطفاً کمکهای خود را به کارت شمارهٔ <span class=\"lft\">6219-8610-2780-4979</span> (بانک سامان) به نام حمیدرضا محمدی واریز نمایید. علاوه بر آن از طریق اینترنت‌بانک سامان می‌توانید کمکهای خود را به شماره حساب <span class=\"lft\">۸۲۸-۸۰۰-۸۷۳۳۳۰-۱</span> (شمارهٔ شبا: <span class=\"lft\">IR03-0560-0828-8000-0873-3300-01</span>) واریز نمایید. لطفاً از طریق تماس با نشانی ganjoor@ganjoor.net مشخصات خودتان و مبلغ واریزی را اطلاع دهید (نام کمک دهندگان و نوع استفاده‌ای که از کمک آنها شده به مرور در همین صفحه به اطلاع خواهد رسید).{Environment.NewLine}";
htmlText += $"</p>{Environment.NewLine}";