feat(ministry): add DefaultFunctionalClass for Form 990 functional split
This commit is contained in:
@@ -4,6 +4,7 @@ using Microsoft.AspNetCore.Http;
|
|||||||
using Moq;
|
using Moq;
|
||||||
using ROLAC.API.Data;
|
using ROLAC.API.Data;
|
||||||
using ROLAC.API.Data.Interceptors;
|
using ROLAC.API.Data.Interceptors;
|
||||||
|
using ROLAC.API.DTOs.Ministry;
|
||||||
using ROLAC.API.Entities;
|
using ROLAC.API.Entities;
|
||||||
using ROLAC.API.Services;
|
using ROLAC.API.Services;
|
||||||
using Xunit;
|
using Xunit;
|
||||||
@@ -41,4 +42,19 @@ public class MinistryServiceTests
|
|||||||
Assert.Equal("A", active[0].Name_en);
|
Assert.Equal("A", active[0].Name_en);
|
||||||
Assert.Equal(3, all.Count);
|
Assert.Equal(3, all.Count);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
[Fact]
|
||||||
|
public async Task Create_DefaultsFunctionalClassToProgram_AndUpdateChangesIt()
|
||||||
|
{
|
||||||
|
using var db = BuildDb();
|
||||||
|
var svc = new MinistryService(db);
|
||||||
|
var id = await svc.CreateAsync(new CreateMinistryRequest { Name_en = "Worship" });
|
||||||
|
|
||||||
|
var afterCreate = (await svc.GetAllAsync(true)).Single(m => m.Id == id);
|
||||||
|
Assert.Equal("Program", afterCreate.DefaultFunctionalClass);
|
||||||
|
|
||||||
|
await svc.UpdateAsync(id, new UpdateMinistryRequest { Name_en = "Worship", DefaultFunctionalClass = "ManagementGeneral" });
|
||||||
|
var afterUpdate = (await svc.GetAllAsync(true)).Single(m => m.Id == id);
|
||||||
|
Assert.Equal("ManagementGeneral", afterUpdate.DefaultFunctionalClass);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -8,4 +8,5 @@ public class CreateMinistryRequest
|
|||||||
[MaxLength(500)] public string? Description_en { get; set; }
|
[MaxLength(500)] public string? Description_en { get; set; }
|
||||||
[MaxLength(500)] public string? Description_zh { get; set; }
|
[MaxLength(500)] public string? Description_zh { get; set; }
|
||||||
public int SortOrder { get; set; }
|
public int SortOrder { get; set; }
|
||||||
|
[MaxLength(20)] public string? DefaultFunctionalClass { get; set; }
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -9,4 +9,5 @@ public class MinistryDto
|
|||||||
public string? Description_zh { get; set; }
|
public string? Description_zh { get; set; }
|
||||||
public int SortOrder { get; set; }
|
public int SortOrder { get; set; }
|
||||||
public bool IsActive { get; set; }
|
public bool IsActive { get; set; }
|
||||||
|
public string DefaultFunctionalClass { get; set; } = "Program";
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -9,4 +9,5 @@ public class UpdateMinistryRequest
|
|||||||
[MaxLength(500)] public string? Description_zh { get; set; }
|
[MaxLength(500)] public string? Description_zh { get; set; }
|
||||||
public bool IsActive { get; set; } = true;
|
public bool IsActive { get; set; } = true;
|
||||||
public int SortOrder { get; set; }
|
public int SortOrder { get; set; }
|
||||||
|
[MaxLength(20)] public string? DefaultFunctionalClass { get; set; }
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -201,6 +201,7 @@ public class AppDbContext : IdentityDbContext<AppUser, AppRole, string>
|
|||||||
{
|
{
|
||||||
entity.Property(e => e.Name_en).HasMaxLength(200).IsRequired();
|
entity.Property(e => e.Name_en).HasMaxLength(200).IsRequired();
|
||||||
entity.Property(e => e.Name_zh).HasMaxLength(200);
|
entity.Property(e => e.Name_zh).HasMaxLength(200);
|
||||||
|
entity.Property(e => e.DefaultFunctionalClass).HasMaxLength(20).HasDefaultValue("Program");
|
||||||
});
|
});
|
||||||
|
|
||||||
// ── Form990ExpenseLine (Part IX natural-expense line catalog) ─────────
|
// ── Form990ExpenseLine (Part IX natural-expense line catalog) ─────────
|
||||||
|
|||||||
@@ -11,4 +11,5 @@ public class Ministry : IAuditable
|
|||||||
public string? Description_zh { get; set; }
|
public string? Description_zh { get; set; }
|
||||||
public int SortOrder { get; set; }
|
public int SortOrder { get; set; }
|
||||||
public bool IsActive { get; set; } = true;
|
public bool IsActive { get; set; } = true;
|
||||||
|
public string DefaultFunctionalClass { get; set; } = "Program";
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -21,6 +21,7 @@ public class MinistryService : IMinistryService
|
|||||||
Id = m.Id, Name_en = m.Name_en, Name_zh = m.Name_zh,
|
Id = m.Id, Name_en = m.Name_en, Name_zh = m.Name_zh,
|
||||||
Description_en = m.Description_en, Description_zh = m.Description_zh,
|
Description_en = m.Description_en, Description_zh = m.Description_zh,
|
||||||
SortOrder = m.SortOrder, IsActive = m.IsActive,
|
SortOrder = m.SortOrder, IsActive = m.IsActive,
|
||||||
|
DefaultFunctionalClass = m.DefaultFunctionalClass,
|
||||||
})
|
})
|
||||||
.ToListAsync();
|
.ToListAsync();
|
||||||
}
|
}
|
||||||
@@ -32,6 +33,7 @@ public class MinistryService : IMinistryService
|
|||||||
Name_en = r.Name_en, Name_zh = r.Name_zh,
|
Name_en = r.Name_en, Name_zh = r.Name_zh,
|
||||||
Description_en = r.Description_en, Description_zh = r.Description_zh,
|
Description_en = r.Description_en, Description_zh = r.Description_zh,
|
||||||
SortOrder = r.SortOrder, IsActive = true,
|
SortOrder = r.SortOrder, IsActive = true,
|
||||||
|
DefaultFunctionalClass = ROLAC.API.Entities.FunctionalClasses.Normalize(r.DefaultFunctionalClass),
|
||||||
};
|
};
|
||||||
_db.Ministries.Add(entity);
|
_db.Ministries.Add(entity);
|
||||||
await _db.SaveChangesAsync();
|
await _db.SaveChangesAsync();
|
||||||
@@ -45,6 +47,7 @@ public class MinistryService : IMinistryService
|
|||||||
m.Name_en = r.Name_en; m.Name_zh = r.Name_zh;
|
m.Name_en = r.Name_en; m.Name_zh = r.Name_zh;
|
||||||
m.Description_en = r.Description_en; m.Description_zh = r.Description_zh;
|
m.Description_en = r.Description_en; m.Description_zh = r.Description_zh;
|
||||||
m.IsActive = r.IsActive; m.SortOrder = r.SortOrder;
|
m.IsActive = r.IsActive; m.SortOrder = r.SortOrder;
|
||||||
|
m.DefaultFunctionalClass = ROLAC.API.Entities.FunctionalClasses.Normalize(r.DefaultFunctionalClass);
|
||||||
await _db.SaveChangesAsync();
|
await _db.SaveChangesAsync();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user