This commit is contained in:
Chris Chen
2026-06-20 17:51:33 -07:00
parent f55807fa7d
commit 3558c67fd7
55 changed files with 3140 additions and 85 deletions
+10 -6
View File
@@ -76,9 +76,9 @@ public class ExpenseService : IExpenseService
.OrderByDescending(e => e.ExpenseDate).ThenByDescending(e => e.Id)
.Skip((page - 1) * pageSize).Take(pageSize).ToListAsync();
var minNames = await _db.Ministries.AsNoTracking().ToDictionaryAsync(m => m.Id, m => m.Name_en);
var grpNames = await _db.ExpenseCategoryGroups.AsNoTracking().ToDictionaryAsync(g => g.Id, g => g.Name_en);
var subNames = await _db.ExpenseSubCategories.AsNoTracking().ToDictionaryAsync(s => s.Id, s => s.Name_en);
var minNames = await _db.Ministries.AsNoTracking().ToDictionaryAsync(m => m.Id, m => $"{m.Name_en} / {m.Name_zh}");
var grpNames = await _db.ExpenseCategoryGroups.AsNoTracking().ToDictionaryAsync(g => g.Id, g => $"{g.Name_en} / {g.Name_zh}");
var subNames = await _db.ExpenseSubCategories.AsNoTracking().ToDictionaryAsync(s => s.Id, s => $"{s.Name_en} / {s.Name_zh}");
var memberIds = rows.Where(r => r.MemberId != null).Select(r => r.MemberId!.Value).ToHashSet();
var memNames = await _db.Members.AsNoTracking().Where(m => memberIds.Contains(m.Id))
.ToDictionaryAsync(m => m.Id, m => $"{m.FirstName_en} {m.LastName_en}");
@@ -134,14 +134,18 @@ public class ExpenseService : IExpenseService
if (r.Type == "VendorPayment")
{
if (!isFinance) throw new InvalidOperationException("Only finance can create vendor payments.");
e.Status = "Paid";
e.PaidAt = DateTimeOffset.UtcNow; e.PaidBy = CurrentUserId;
// Enters the approval queue: PendingApproval -> Approve -> Pay (issue check).
e.Status = "PendingApproval";
e.SubmittedBy = CurrentUserId; e.SubmittedAt = DateTimeOffset.UtcNow;
e.MemberId = null;
}
else // StaffReimbursement
{
e.Status = "Draft";
// Finance entering on behalf of a member goes straight to the approval queue;
// a member's own self-service entry stays a Draft until they explicitly Submit it.
e.Status = isFinance ? "PendingApproval" : "Draft";
e.SubmittedBy = CurrentUserId;
if (isFinance) e.SubmittedAt = DateTimeOffset.UtcNow;
e.MemberId = isFinance ? r.MemberId : await CallerMemberIdAsync();
e.VendorName = null;
}