using line_gestao_api.Data; using line_gestao_api.Dtos; using Microsoft.AspNetCore.Mvc; using Microsoft.EntityFrameworkCore; namespace line_gestao_api.Controllers { [ApiController] [Route("api/[controller]")] public class BillingController : ControllerBase { private readonly AppDbContext _db; public BillingController(AppDbContext db) => _db = db; [HttpGet] public async Task>> GetAll( [FromQuery] string? tipo = null, // PF / PJ / ALL / "" [FromQuery] string? search = null, [FromQuery] string? client = null, [FromQuery] int page = 1, [FromQuery] int pageSize = 20, [FromQuery] string? sortBy = "cliente", [FromQuery] string? sortDir = "asc") { page = page < 1 ? 1 : page; pageSize = pageSize < 1 ? 20 : pageSize; var tipoNorm = (tipo ?? "").Trim().ToUpperInvariant(); var q = _db.BillingClients.AsNoTracking().AsQueryable(); if (tipoNorm == "PF" || tipoNorm == "PJ") { q = q.Where(x => x.Tipo == tipoNorm); } if (!string.IsNullOrWhiteSpace(search)) { var s = search.Trim(); q = q.Where(x => EF.Functions.ILike(x.Cliente ?? "", $"%{s}%") || EF.Functions.ILike(x.Aparelho ?? "", $"%{s}%") || EF.Functions.ILike(x.FormaPagamento ?? "", $"%{s}%")); } if (!string.IsNullOrWhiteSpace(client)) { var c = client.Trim(); q = q.Where(x => EF.Functions.ILike(x.Cliente ?? "", c)); } var total = await q.CountAsync(); var sb = (sortBy ?? "cliente").Trim().ToLowerInvariant(); var desc = string.Equals((sortDir ?? "asc").Trim(), "desc", StringComparison.OrdinalIgnoreCase); q = sb switch { "tipo" => desc ? q.OrderByDescending(x => x.Tipo).ThenBy(x => x.Cliente) : q.OrderBy(x => x.Tipo).ThenBy(x => x.Cliente), "item" => desc ? q.OrderByDescending(x => x.Item) : q.OrderBy(x => x.Item), "qtdlinhas" => desc ? q.OrderByDescending(x => x.QtdLinhas ?? 0).ThenBy(x => x.Cliente) : q.OrderBy(x => x.QtdLinhas ?? 0).ThenBy(x => x.Cliente), "franquiavivo" => desc ? q.OrderByDescending(x => x.FranquiaVivo ?? 0).ThenBy(x => x.Cliente) : q.OrderBy(x => x.FranquiaVivo ?? 0).ThenBy(x => x.Cliente), "valorcontratovivo" => desc ? q.OrderByDescending(x => x.ValorContratoVivo ?? 0).ThenBy(x => x.Cliente) : q.OrderBy(x => x.ValorContratoVivo ?? 0).ThenBy(x => x.Cliente), "franquialine" => desc ? q.OrderByDescending(x => x.FranquiaLine ?? 0).ThenBy(x => x.Cliente) : q.OrderBy(x => x.FranquiaLine ?? 0).ThenBy(x => x.Cliente), "valorcontratoline" => desc ? q.OrderByDescending(x => x.ValorContratoLine ?? 0).ThenBy(x => x.Cliente) : q.OrderBy(x => x.ValorContratoLine ?? 0).ThenBy(x => x.Cliente), "lucro" => desc ? q.OrderByDescending(x => x.Lucro ?? 0).ThenBy(x => x.Cliente) : q.OrderBy(x => x.Lucro ?? 0).ThenBy(x => x.Cliente), "aparelho" => desc ? q.OrderByDescending(x => x.Aparelho).ThenBy(x => x.Cliente) : q.OrderBy(x => x.Aparelho).ThenBy(x => x.Cliente), "formapagamento" => desc ? q.OrderByDescending(x => x.FormaPagamento).ThenBy(x => x.Cliente) : q.OrderBy(x => x.FormaPagamento).ThenBy(x => x.Cliente), _ => desc ? q.OrderByDescending(x => x.Cliente).ThenBy(x => x.Item) : q.OrderBy(x => x.Cliente).ThenBy(x => x.Item) }; var items = await q .Skip((page - 1) * pageSize) .Take(pageSize) .Select(x => new BillingClientListDto { Id = x.Id, Tipo = x.Tipo, Item = x.Item, Cliente = x.Cliente, QtdLinhas = x.QtdLinhas, FranquiaVivo = x.FranquiaVivo, ValorContratoVivo = x.ValorContratoVivo, FranquiaLine = x.FranquiaLine, ValorContratoLine = x.ValorContratoLine, Lucro = x.Lucro, Aparelho = x.Aparelho, FormaPagamento = x.FormaPagamento }) .ToListAsync(); return Ok(new PagedResult { Page = page, PageSize = pageSize, Total = total, Items = items }); } [HttpGet("clients")] public async Task>> GetClients([FromQuery] string? tipo = null) { var tipoNorm = (tipo ?? "").Trim().ToUpperInvariant(); var q = _db.BillingClients.AsNoTracking().AsQueryable(); if (tipoNorm == "PF" || tipoNorm == "PJ") { q = q.Where(x => x.Tipo == tipoNorm); } var clients = await q .Where(x => !string.IsNullOrEmpty(x.Cliente)) .Select(x => x.Cliente!) .Distinct() .OrderBy(x => x) .ToListAsync(); return Ok(clients); } } }