diff --git a/API/ROLAC.API/Data/AppDbContext.cs b/API/ROLAC.API/Data/AppDbContext.cs index b4efd40..7360594 100644 --- a/API/ROLAC.API/Data/AppDbContext.cs +++ b/API/ROLAC.API/Data/AppDbContext.cs @@ -20,6 +20,7 @@ public class AppDbContext : IdentityDbContext public DbSet Ministries => Set(); public DbSet ExpenseCategoryGroups => Set(); public DbSet ExpenseSubCategories => Set(); + public DbSet Form990ExpenseLines => Set(); public DbSet Expenses => Set(); public DbSet MonthlyStatements => Set(); public DbSet ChurchProfiles => Set(); @@ -202,6 +203,17 @@ public class AppDbContext : IdentityDbContext entity.Property(e => e.Name_zh).HasMaxLength(200); }); + // ── Form990ExpenseLine (Part IX natural-expense line catalog) ───────── + builder.Entity(entity => + { + entity.Property(e => e.LineCode).HasMaxLength(10).IsRequired(); + entity.Property(e => e.Name_en).HasMaxLength(200).IsRequired(); + entity.Property(e => e.Name_zh).HasMaxLength(200); + entity.Property(e => e.CreatedBy).HasMaxLength(450); + entity.Property(e => e.UpdatedBy).HasMaxLength(450); + entity.HasIndex(e => e.LineCode).IsUnique(); + }); + // ── ExpenseCategoryGroup ───────────────────────────────────────────── builder.Entity(entity => { diff --git a/API/ROLAC.API/Entities/Form990ExpenseLine.cs b/API/ROLAC.API/Entities/Form990ExpenseLine.cs new file mode 100644 index 0000000..d8e5781 --- /dev/null +++ b/API/ROLAC.API/Entities/Form990ExpenseLine.cs @@ -0,0 +1,13 @@ +using ROLAC.API.Entities.Base; +namespace ROLAC.API.Entities; + +/// A row of IRS Form 990 Part IX (natural expense line), e.g. "7 — Other salaries and wages". +public class Form990ExpenseLine : AuditableEntity, IAuditable +{ + public int Id { get; set; } + public string LineCode { get; set; } = null!; // "7", "11b", "16", "24" + public string Name_en { get; set; } = null!; + public string? Name_zh { get; set; } + public int SortOrder { get; set; } + public bool IsActive { get; set; } = true; +} diff --git a/API/ROLAC.API/Entities/FunctionalClasses.cs b/API/ROLAC.API/Entities/FunctionalClasses.cs new file mode 100644 index 0000000..45d8b85 --- /dev/null +++ b/API/ROLAC.API/Entities/FunctionalClasses.cs @@ -0,0 +1,18 @@ +namespace ROLAC.API.Entities; + +/// +/// The three IRS Form 990 Part IX functional-expense columns. Stored verbatim in +/// Ministry.DefaultFunctionalClass and Expense.FunctionalClass. +/// +public static class FunctionalClasses +{ + public const string Program = "Program"; + public const string ManagementGeneral = "ManagementGeneral"; + public const string Fundraising = "Fundraising"; + + public static readonly IReadOnlyList All = [Program, ManagementGeneral, Fundraising]; + + /// Returns the value if valid, otherwise Program (the safe default). + public static string Normalize(string? value) => + value is not null && All.Contains(value) ? value : Program; +}