line-gestao-api/Data/AppDbContext.cs

121 lines
4.2 KiB
C#

using Microsoft.EntityFrameworkCore;
using line_gestao_api.Models;
namespace line_gestao_api.Data;
public class AppDbContext : DbContext
{
public AppDbContext(DbContextOptions<AppDbContext> options) : base(options) { }
public DbSet<User> Users => Set<User>();
// ✅ tabela para espelhar a planilha (GERAL)
public DbSet<MobileLine> MobileLines => Set<MobileLine>();
// ✅ tabela para espelhar a aba MUREG
public DbSet<MuregLine> MuregLines => Set<MuregLine>();
// ✅ tabela para espelhar o FATURAMENTO (PF/PJ)
public DbSet<BillingClient> BillingClients => Set<BillingClient>();
public DbSet<UserData> UserDatas => Set<UserData>();
public DbSet<VigenciaLine> VigenciaLines { get; set; } = default!;
public DbSet<TrocaNumeroLine> TrocaNumeroLines => Set<TrocaNumeroLine>();
// ✅ PARCELAMENTO
public DbSet<ParcelamentoLine> ParcelamentoLines => Set<ParcelamentoLine>();
public DbSet<ParcelamentoMonthValue> ParcelamentoMonthValues => Set<ParcelamentoMonthValue>();
protected override void OnModelCreating(ModelBuilder modelBuilder)
{
base.OnModelCreating(modelBuilder);
// =========================
// ✅ USER
// =========================
modelBuilder.Entity<User>()
.HasIndex(u => u.Email)
.IsUnique();
// =========================
// ✅ GERAL (MobileLine)
// =========================
modelBuilder.Entity<MobileLine>()
.HasIndex(x => x.Linha)
.IsUnique();
// =========================
// ✅ MUREG
// =========================
modelBuilder.Entity<MuregLine>().HasIndex(x => x.Item);
modelBuilder.Entity<MuregLine>().HasIndex(x => x.Cliente);
modelBuilder.Entity<MuregLine>().HasIndex(x => x.ICCID);
modelBuilder.Entity<MuregLine>().HasIndex(x => x.LinhaNova);
// ==========================================================
// ✅ FATURAMENTO (BillingClient) - mantém seu mapeamento
// ==========================================================
modelBuilder.Entity<BillingClient>(e =>
{
e.ToTable("billing_clients");
e.HasKey(x => x.Id);
e.Property(x => x.Tipo).HasMaxLength(2);
e.Property(x => x.Cliente).HasMaxLength(255);
e.HasIndex(x => x.Tipo);
e.HasIndex(x => x.Cliente);
e.HasIndex(x => new { x.Tipo, x.Cliente });
e.HasIndex(x => x.Item);
});
// ==========================================================
// ✅ PARCELAMENTO - MAPEAMENTO COMPLETO
// ==========================================================
modelBuilder.Entity<ParcelamentoLine>(e =>
{
// Nome físico fixo no Postgres
e.ToTable("parcelamento_lines");
e.HasKey(x => x.Id);
e.Property(x => x.Linha).HasMaxLength(32);
e.Property(x => x.Cliente).HasMaxLength(120);
e.Property(x => x.QtParcelas).HasMaxLength(32);
// índices úteis para filtro e performance
e.HasIndex(x => x.Cliente);
e.HasIndex(x => x.Linha);
e.HasIndex(x => x.AnoRef);
// se você quiser evitar duplicar importação da mesma linha/cliente/item:
// (deixa comentado pra não quebrar caso existam repetições legítimas)
// e.HasIndex(x => new { x.AnoRef, x.Item, x.Linha, x.Cliente }).IsUnique();
});
modelBuilder.Entity<ParcelamentoMonthValue>(e =>
{
e.ToTable("parcelamento_month_values");
e.HasKey(x => x.Id);
// relação 1:N (ParcelamentoLine -> Meses)
e.HasOne(x => x.ParcelamentoLine)
.WithMany(x => x.Meses)
.HasForeignKey(x => x.ParcelamentoLineId)
.OnDelete(DeleteBehavior.Cascade);
// índices para gráfico e consultas por mês
e.HasIndex(x => x.Competencia);
e.HasIndex(x => x.ParcelamentoLineId);
// garante 1 valor por mês por linha (evita duplicar mês)
e.HasIndex(x => new { x.ParcelamentoLineId, x.Competencia })
.IsUnique();
});
}
}