using Application.Abstractions.Data; using Application.Abstractions.Messaging; using Application.Helpers; using Microsoft.EntityFrameworkCore; namespace Application.Features.Api.Paper.GetAccount; internal sealed class Handler(IAppDbContext db) : IQueryHandler { public async Task Handle(Query request, CancellationToken ct) { var account = await db.PaperAccount.AsNoTracking().FirstOrDefaultAsync(c => c.MemberID == request.MemberID, ct); if (account is null) { return new Response(false, 0, 0, 0, 0, 0, 0); } var positions = await db.PaperPosition.AsNoTracking() .Where(c => c.AccountID == account.ID && c.Quantity > 0) .Select(c => new { c.StockCode, c.Quantity }) .ToListAsync(ct); var codes = positions.Select(c => c.StockCode).Distinct().ToList(); var latestCloses = await PaperValuation.GetLatestClosesAsync(db, codes, ct); var equity = PaperValuation.ComputeEquity( account.Token, account.ReservedToken, positions.Select(c => (c.StockCode, c.Quantity)), latestCloses); var nav = PaperValuation.ComputeNav(equity, account.Units); var cumReturnBp = (int)Math.Round((nav - 1m) * 10000m, MidpointRounding.AwayFromZero); return new Response( true, account.Token, account.ReservedToken, account.Units, equity, cumReturnBp, positions.Count); } }