using Domain.Entities.Store; using Microsoft.EntityFrameworkCore; using Microsoft.EntityFrameworkCore.Metadata.Builders; namespace Infrastructure.Persistence.Configurations.Store; public sealed class OrderRefundItemConfiguration : IEntityTypeConfiguration { public void Configure(EntityTypeBuilder builder) { builder.ToTable(nameof(OrderRefundItem), t => t.HasComment("환불 단위 — 쿠폰 별 후처리(회수/만료) 정책. OrderRefund 1:N")); builder.HasKey(x => x.ID); builder.Property(x => x.OrderRefundID).IsRequired(); builder.Property(x => x.OrderItemID).IsRequired(); builder.Property(x => x.CouponCodeID).IsRequired(); builder.Property(x => x.UnitAmount).IsRequired().HasComment("환불 단가 스냅샷"); builder.Property(x => x.PostRefundAction).HasConversion().IsRequired().HasComment("쿠폰 후처리 (1=Restore 회수, 2=Expire 만료)"); builder.Property(x => x.CreatedAt).IsRequired(); builder.HasOne(x => x.OrderRefund) .WithMany(r => r.Items) .HasForeignKey(x => x.OrderRefundID) .OnDelete(DeleteBehavior.Cascade); builder.HasOne(x => x.OrderItem) .WithMany() .HasForeignKey(x => x.OrderItemID) .OnDelete(DeleteBehavior.Restrict); builder.HasOne(x => x.CouponCode) .WithMany() .HasForeignKey(x => x.CouponCodeID) .OnDelete(DeleteBehavior.Restrict); // CouponCode 단위 중복 환불 방지: 동일 CouponCodeID 가 두 개 이상의 환불 행에 존재하지 않도록. // (Completed/Rejected 만 unique 로 제한하기 어려운 SQL Server unique index 한계로 단순 unique 사용) builder.HasIndex(x => x.CouponCodeID).IsUnique(); builder.HasIndex(x => x.OrderRefundID); builder.HasIndex(x => x.OrderItemID); } }