line-gestao-api/Controllers/ResumoController.cs

183 lines
7.3 KiB
C#

using line_gestao_api.Data;
using line_gestao_api.Dtos;
using line_gestao_api.Services;
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;
private readonly SpreadsheetImportAuditService _spreadsheetImportAuditService;
public ResumoController(AppDbContext db, SpreadsheetImportAuditService spreadsheetImportAuditService)
{
_db = db;
_spreadsheetImportAuditService = spreadsheetImportAuditService;
}
[HttpGet]
public async Task<ActionResult<ResumoResponseDto>> 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 gbDistribuicaoTotalEntity = await _db.ResumoGbDistribuicaoTotais.AsNoTracking()
.FirstOrDefaultAsync();
var canonicalTotalLinhas = await _spreadsheetImportAuditService.GetCanonicalTotalLinhasForReadAsync();
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 = canonicalTotalLinhas,
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 = canonicalTotalLinhas,
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(),
GbDistribuicao = await _db.ResumoGbDistribuicoes.AsNoTracking()
.OrderBy(x => x.Gb)
.Select(x => new ResumoGbDistribuicaoDto
{
Gb = x.Gb,
Qtd = x.Qtd,
Soma = x.Soma
})
.ToListAsync(),
GbDistribuicaoTotal = gbDistribuicaoTotalEntity == null ? null : new ResumoGbDistribuicaoTotalDto
{
TotalLinhas = gbDistribuicaoTotalEntity.TotalLinhas,
SomaTotal = gbDistribuicaoTotalEntity.SomaTotal
},
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
}
};
response.MacrophonyTotals ??= new ResumoMacrophonyTotalDto();
response.MacrophonyTotals.TotalLinhasTotal = canonicalTotalLinhas;
response.VivoLineTotals ??= new ResumoVivoLineTotalDto();
response.VivoLineTotals.QtdLinhasTotal = canonicalTotalLinhas;
return Ok(response);
}
}