Handler.cs 1.6 KB

123456789101112131415161718192021222324252627282930313233343536373839
  1. using Application.Abstractions.Data;
  2. using Application.Abstractions.Messaging;
  3. using Domain.Entities.Donations.ValueObject;
  4. using Microsoft.EntityFrameworkCore;
  5. using SharedKernel.Results;
  6. namespace Application.Features.Api.Studio.Settlement.GetTax;
  7. internal sealed class Handler(IAppDbContext db) : IQueryHandler<Query, Result<Response>>
  8. {
  9. public async Task<Result<Response>> Handle(Query request, CancellationToken ct)
  10. {
  11. var monthlyRaw = await db.WithdrawalRequest.AsNoTracking()
  12. .Where(w => w.MemberID == request.MemberID && w.Status == WithdrawalStatus.Completed && w.RequestedAt.Year == request.Year)
  13. .GroupBy(w => w.RequestedAt.Month)
  14. .Select(g => new
  15. {
  16. Month = g.Key,
  17. GrossAmount = g.Sum(w => w.RequestedAmount),
  18. IncomeTax = g.Sum(w => w.IncomeTax),
  19. LocalTax = g.Sum(w => w.LocalTax),
  20. NetAmount = g.Sum(w => w.NetAmount),
  21. PaymentCount = g.Count()
  22. })
  23. .OrderByDescending(x => x.Month)
  24. .ToListAsync(ct);
  25. var monthlyList = monthlyRaw.Select(m => new MonthItem(m.Month, m.GrossAmount, m.IncomeTax, m.LocalTax, m.NetAmount, m.PaymentCount)).ToList();
  26. var annualSummary = new AnnualSummary(
  27. monthlyList.Sum(m => m.GrossAmount),
  28. monthlyList.Sum(m => m.IncomeTax),
  29. monthlyList.Sum(m => m.LocalTax),
  30. monthlyList.Sum(m => m.NetAmount)
  31. );
  32. return Result.Success(new Response(request.Year, annualSummary, monthlyList));
  33. }
  34. }