using BMA.EHR.Application.Common.Interfaces; using BMA.EHR.Domain.Models.Leave.Commons; using BMA.EHR.Domain.Models.Leave.Requests; using BMA.EHR.Domain.Models.Leave.TimeAttendants; using Microsoft.EntityFrameworkCore; namespace BMA.EHR.Infrastructure.Persistence { public class LeaveDbContext : DbContext, ILeaveDbContext { #region " Check-In " public DbSet DutyTimes { get; set; } public DbSet UserTimeStamps { get; set; } public DbSet ProcessUserTimeStamps { get; set; } public DbSet UserDutyTimes { get; set; } public DbSet AdditionalCheckRequests { get; set; } public DbSet UserCalendars { get; set; } public DbSet CheckInJobStatuses { get; set; } #endregion #region " Leave System " public DbSet LeaveTypes { get; set; } public DbSet LeaveRequests { get; set; } public DbSet LeaveDocuments { get; set; } public DbSet LeaveBeginnings { get; set; } public DbSet LeaveRequestApprovers { get; set; } #endregion public DbSet LeaveProcessJobStatuses { get; set; } public LeaveDbContext(DbContextOptions options) : base(options) { } public Task SaveChangesAsync() { return base.SaveChangesAsync(); } public void Attatch(T entity) where T : class { Attach(entity); } public void Detach(T entity) where T : class { base.Entry(entity).State = EntityState.Detached; } protected override void OnModelCreating(ModelBuilder modelBuilder) { base.OnModelCreating(modelBuilder); // Composite unique index on the natural key for LeaveBeginning. // Prevents duplicate rows when concurrent requests (e.g. UI calling /user/check twice) // race through the get-or-create flow in LeaveBeginningRepository. modelBuilder.Entity() .HasIndex(b => new { b.ProfileId, b.LeaveYear, b.LeaveTypeId }) .HasDatabaseName("IX_LeaveBeginnings_ProfileId_LeaveYear_LeaveTypeId") .IsUnique(); } } }