using line_gestao_api.Data; using line_gestao_api.Dtos; using Microsoft.AspNetCore.Authorization; using Microsoft.AspNetCore.Mvc; using Microsoft.EntityFrameworkCore; namespace line_gestao_api.Controllers; [ApiController] [Route("api/resumo")] [Authorize] public class ResumoController : ControllerBase { private readonly AppDbContext _db; public ResumoController(AppDbContext db) { _db = db; } [HttpGet] public async Task> GetResumo() { var reservaLines = await _db.ResumoReservaLines.AsNoTracking() .OrderBy(x => x.Ddd) .ToListAsync(); var reservaPorDdd = reservaLines .Where(x => !string.IsNullOrWhiteSpace(x.Ddd)) .GroupBy(x => x.Ddd!.Trim()) .Select(g => new ResumoReservaPorDddDto { Ddd = g.Key, TotalLinhas = g.Sum(x => x.QtdLinhas ?? 0), PorFranquia = g.GroupBy(x => x.FranquiaGb) .Select(fg => new ResumoReservaPorFranquiaDto { FranquiaGb = fg.Key, TotalLinhas = fg.Sum(x => x.QtdLinhas ?? 0) }) .OrderBy(x => x.FranquiaGb) .ToList() }) .OrderBy(x => x.Ddd) .ToList(); var reservaTotalEntity = await _db.ResumoReservaTotals.AsNoTracking() .FirstOrDefaultAsync(); var response = new ResumoResponseDto { MacrophonyPlans = await _db.ResumoMacrophonyPlans.AsNoTracking() .OrderBy(x => x.PlanoContrato) .Select(x => new ResumoMacrophonyPlanDto { PlanoContrato = x.PlanoContrato, Gb = x.Gb, ValorIndividualComSvas = x.ValorIndividualComSvas, FranquiaGb = x.FranquiaGb, TotalLinhas = x.TotalLinhas, ValorTotal = x.ValorTotal, VivoTravel = x.VivoTravel }) .ToListAsync(), MacrophonyTotals = await _db.ResumoMacrophonyTotals.AsNoTracking() .Select(x => new ResumoMacrophonyTotalDto { FranquiaGbTotal = x.FranquiaGbTotal, TotalLinhasTotal = x.TotalLinhasTotal, ValorTotal = x.ValorTotal }) .FirstOrDefaultAsync(), VivoLineResumos = await _db.ResumoVivoLineResumos.AsNoTracking() .OrderBy(x => x.Cliente) .Select(x => new ResumoVivoLineResumoDto { Skil = x.Skil, Cliente = x.Cliente, QtdLinhas = x.QtdLinhas, FranquiaTotal = x.FranquiaTotal, ValorContratoVivo = x.ValorContratoVivo, FranquiaLine = x.FranquiaLine, ValorContratoLine = x.ValorContratoLine, Lucro = x.Lucro }) .ToListAsync(), VivoLineTotals = await _db.ResumoVivoLineTotals.AsNoTracking() .Select(x => new ResumoVivoLineTotalDto { QtdLinhasTotal = x.QtdLinhasTotal, FranquiaTotal = x.FranquiaTotal, ValorContratoVivo = x.ValorContratoVivo, FranquiaLine = x.FranquiaLine, ValorContratoLine = x.ValorContratoLine, Lucro = x.Lucro }) .FirstOrDefaultAsync(), ClienteEspeciais = await _db.ResumoClienteEspeciais.AsNoTracking() .OrderBy(x => x.Nome) .Select(x => new ResumoClienteEspecialDto { Nome = x.Nome, Valor = x.Valor }) .ToListAsync(), PlanoContratoResumos = await _db.ResumoPlanoContratoResumos.AsNoTracking() .OrderBy(x => x.PlanoContrato) .Select(x => new ResumoPlanoContratoResumoDto { PlanoContrato = x.PlanoContrato, Gb = x.Gb, ValorIndividualComSvas = x.ValorIndividualComSvas, FranquiaGb = x.FranquiaGb, TotalLinhas = x.TotalLinhas, ValorTotal = x.ValorTotal }) .ToListAsync(), PlanoContratoTotal = await _db.ResumoPlanoContratoTotals.AsNoTracking() .Select(x => new ResumoPlanoContratoTotalDto { ValorTotal = x.ValorTotal }) .FirstOrDefaultAsync(), LineTotais = await _db.ResumoLineTotais.AsNoTracking() .OrderBy(x => x.Tipo) .Select(x => new ResumoLineTotaisDto { Tipo = x.Tipo, ValorTotalLine = x.ValorTotalLine, LucroTotalLine = x.LucroTotalLine, QtdLinhas = x.QtdLinhas }) .ToListAsync(), ReservaLines = reservaLines .Select(x => new ResumoReservaLineDto { Ddd = x.Ddd, FranquiaGb = x.FranquiaGb, QtdLinhas = x.QtdLinhas, Total = x.Total }) .ToList(), ReservaPorDdd = reservaPorDdd, TotalGeralLinhasReserva = reservaTotalEntity?.TotalGeralLinhasReserva ?? reservaTotalEntity?.QtdLinhasTotal ?? reservaPorDdd.Sum(x => x.TotalLinhas), ReservaTotal = reservaTotalEntity == null ? null : new ResumoReservaTotalDto { QtdLinhasTotal = reservaTotalEntity.QtdLinhasTotal, Total = reservaTotalEntity.Total } }; return Ok(response); } }