From 78b03b69965ac03ed827e4685f7ac1ba88c05ed6 Mon Sep 17 00:00:00 2001 From: Hermes Agent Date: Mon, 21 Sep 2026 09:34:49 +0200 Subject: [PATCH] Colocated entity type configurations with entities Added tenant entities and models Modified db context --- .../Configuration/Entities/Activity.cs | 57 ----------------- .../Configuration/Entities/AuditLog.cs | 25 -------- .../Configuration/Entities/Award.cs | 58 ----------------- .../Configuration/Entities/Beneficiary.cs | 40 ------------ .../Configuration/Entities/Budget.cs | 38 ------------ .../Configuration/Entities/ChangeRequest.cs | 42 ------------- .../Configuration/Entities/ComplianceItem.cs | 40 ------------ .../Configuration/Entities/Contract.cs | 35 ----------- .../Configuration/Entities/Disbursement.cs | 44 ------------- .../Configuration/Entities/Evidence.cs | 61 ------------------ .../Configuration/Entities/Indicator.cs | 33 ---------- .../Configuration/Entities/Instrument.cs | 33 ---------- .../Configuration/Entities/Invite.cs | 51 --------------- .../Configuration/Entities/Issue.cs | 43 ------------- .../Configuration/Entities/Milestone.cs | 42 ------------- .../Configuration/Entities/Notification.cs | 38 ------------ .../Configuration/Entities/Organisation.cs | 28 --------- .../Configuration/Entities/Outcome.cs | 30 --------- .../Configuration/Entities/Portfolio.cs | 37 ----------- .../Configuration/Entities/Programme.cs | 40 ------------ .../Configuration/Entities/Project.cs | 46 -------------- .../Configuration/Entities/Risk.cs | 34 ---------- .../Configuration/Entities/Rule.cs | 40 ------------ .../Configuration/Entities/SiteVisit.cs | 33 ---------- .../Configuration/Entities/User.cs | 17 ----- .../Entities/Activity.cs | 58 ++++++++++++++++- .../Entities/AuditLog.cs | 26 +++++++- PostFundManagement.Domain/Entities/Award.cs | 59 +++++++++++++++++- .../Entities/Beneficiary.cs | 41 +++++++++++- PostFundManagement.Domain/Entities/Budget.cs | 39 +++++++++++- .../Entities/ChangeRequest.cs | 43 ++++++++++++- .../Entities/ComplianceItem.cs | 41 +++++++++++- .../Entities/Contract.cs | 36 ++++++++++- .../Entities/Disbursement.cs | 45 +++++++++++++- .../Entities/Evidence.cs | 62 ++++++++++++++++++- .../Entities/Indicator.cs | 34 +++++++++- .../Entities/Instrument.cs | 36 ++++++++++- PostFundManagement.Domain/Entities/Invite.cs | 51 ++++++++++++++- PostFundManagement.Domain/Entities/Issue.cs | 44 ++++++++++++- .../Entities/Milestone.cs | 43 ++++++++++++- .../Entities/Notification.cs | 39 +++++++++++- .../Entities/Organisation.cs | 29 ++++++++- PostFundManagement.Domain/Entities/Outcome.cs | 31 +++++++++- .../Entities/Portfolio.cs | 38 +++++++++++- .../Entities/Programme.cs | 41 +++++++++++- PostFundManagement.Domain/Entities/Project.cs | 47 +++++++++++++- PostFundManagement.Domain/Entities/Risk.cs | 35 ++++++++++- PostFundManagement.Domain/Entities/Rule.cs | 41 +++++++++++- .../Entities/SiteVisit.cs | 34 +++++++++- PostFundManagement.Domain/Entities/Tenant.cs | 40 ++++++++++++ .../Entities/TenantOrganisation.cs | 45 ++++++++++++++ .../Entities/TenantUser.cs | 39 ++++++++++++ PostFundManagement.Domain/Entities/User.cs | 20 +++++- PostFundManagement.Domain/Models/Tenant.cs | 18 ++++++ .../Models/TenantOrganisation.cs | 16 +++++ .../Models/TenantUser.cs | 16 +++++ .../PostFundManagement.Domain.csproj | 8 +++ .../Database/ApplicationDbContext.cs | 6 ++ 58 files changed, 1174 insertions(+), 1012 deletions(-) delete mode 100644 PostFundManagement.Domain/Configuration/Entities/Activity.cs delete mode 100644 PostFundManagement.Domain/Configuration/Entities/AuditLog.cs delete mode 100644 PostFundManagement.Domain/Configuration/Entities/Award.cs delete mode 100644 PostFundManagement.Domain/Configuration/Entities/Beneficiary.cs delete mode 100644 PostFundManagement.Domain/Configuration/Entities/Budget.cs delete mode 100644 PostFundManagement.Domain/Configuration/Entities/ChangeRequest.cs delete mode 100644 PostFundManagement.Domain/Configuration/Entities/ComplianceItem.cs delete mode 100644 PostFundManagement.Domain/Configuration/Entities/Contract.cs delete mode 100644 PostFundManagement.Domain/Configuration/Entities/Disbursement.cs delete mode 100644 PostFundManagement.Domain/Configuration/Entities/Evidence.cs delete mode 100644 PostFundManagement.Domain/Configuration/Entities/Indicator.cs delete mode 100644 PostFundManagement.Domain/Configuration/Entities/Instrument.cs delete mode 100644 PostFundManagement.Domain/Configuration/Entities/Invite.cs delete mode 100644 PostFundManagement.Domain/Configuration/Entities/Issue.cs delete mode 100644 PostFundManagement.Domain/Configuration/Entities/Milestone.cs delete mode 100644 PostFundManagement.Domain/Configuration/Entities/Notification.cs delete mode 100644 PostFundManagement.Domain/Configuration/Entities/Organisation.cs delete mode 100644 PostFundManagement.Domain/Configuration/Entities/Outcome.cs delete mode 100644 PostFundManagement.Domain/Configuration/Entities/Portfolio.cs delete mode 100644 PostFundManagement.Domain/Configuration/Entities/Programme.cs delete mode 100644 PostFundManagement.Domain/Configuration/Entities/Project.cs delete mode 100644 PostFundManagement.Domain/Configuration/Entities/Risk.cs delete mode 100644 PostFundManagement.Domain/Configuration/Entities/Rule.cs delete mode 100644 PostFundManagement.Domain/Configuration/Entities/SiteVisit.cs delete mode 100644 PostFundManagement.Domain/Configuration/Entities/User.cs create mode 100644 PostFundManagement.Domain/Entities/Tenant.cs create mode 100644 PostFundManagement.Domain/Entities/TenantOrganisation.cs create mode 100644 PostFundManagement.Domain/Entities/TenantUser.cs create mode 100644 PostFundManagement.Domain/Models/Tenant.cs create mode 100644 PostFundManagement.Domain/Models/TenantOrganisation.cs create mode 100644 PostFundManagement.Domain/Models/TenantUser.cs diff --git a/PostFundManagement.Domain/Configuration/Entities/Activity.cs b/PostFundManagement.Domain/Configuration/Entities/Activity.cs deleted file mode 100644 index 040c9eb..0000000 --- a/PostFundManagement.Domain/Configuration/Entities/Activity.cs +++ /dev/null @@ -1,57 +0,0 @@ -using static PostFundManagement.Domain.Extensions.Constants; - -namespace PostFundManagement.Domain.Configuration.Entities; - -public sealed class Activity : IEntityTypeConfiguration -{ - public void Configure(EntityTypeBuilder builder) - { - builder.ToTable(nameof(Domain.Entities.Activity).Pluralize()); - - builder.HasKey(pk => pk.Id); - builder.Property(f => f.ProjectId).IsRequired(); - builder.Property(f => f.MilestoneId).IsRequired(); - builder.Property(f => f.CreatedBy).IsRequired(); - builder.Property(f => f.UpdatedBy).IsRequired(false); - builder.Property(f => f.ApprovedBy).IsRequired(false); - builder.Property(f => f.CreatedAt).IsRequired().HasDefaultValueSql("now()"); - builder.Property(f => f.UpdatedAt).IsRequired(false); - builder.Property(f => f.PerformedAt).IsRequired(false); - builder.Property(f => f.Category).IsRequired().HasMaxLength(LabelLength); - builder.Property(f => f.Status).IsRequired().HasDefaultValueSql("1") - .HasSentinel(ApprovalStatus.Pending); - builder.Property(f => f.Amount).IsRequired().HasPrecision(18, 2); - builder.Property(f => f.Title).IsRequired().HasMaxLength(LabelLength); - builder.Property(f => f.Description).IsRequired().HasMaxLength(TextLength); - - builder.HasOne(f => f.Project) - .WithMany() - .HasForeignKey(fk => fk.ProjectId) - .IsRequired() - .OnDelete(DeleteBehavior.Restrict); - - builder.HasOne(f => f.Milestone) - .WithMany() - .HasForeignKey(fk => fk.MilestoneId) - .IsRequired() - .OnDelete(DeleteBehavior.Restrict); - - builder.HasOne(f => f.Creator) - .WithMany() - .HasForeignKey(fk => fk.CreatedBy) - .IsRequired() - .OnDelete(DeleteBehavior.NoAction); - - builder.HasOne(f => f.Updator) - .WithMany() - .HasForeignKey(fk => fk.UpdatedBy) - .IsRequired(false) - .OnDelete(DeleteBehavior.NoAction); - - builder.HasOne(f => f.Approver) - .WithMany() - .HasForeignKey(fk => fk.ApprovedBy) - .IsRequired(false) - .OnDelete(DeleteBehavior.NoAction); - } -} \ No newline at end of file diff --git a/PostFundManagement.Domain/Configuration/Entities/AuditLog.cs b/PostFundManagement.Domain/Configuration/Entities/AuditLog.cs deleted file mode 100644 index f99df02..0000000 --- a/PostFundManagement.Domain/Configuration/Entities/AuditLog.cs +++ /dev/null @@ -1,25 +0,0 @@ -using static PostFundManagement.Domain.Extensions.Constants; - -namespace PostFundManagement.Domain.Configuration.Entities; - -public sealed class AuditLog : IEntityTypeConfiguration -{ - public void Configure(EntityTypeBuilder builder) - { - builder.ToTable(nameof(Domain.Entities.AuditLog).Pluralize()); - - builder.HasKey(pk => pk.Id); - builder.Property(f => f.EntityName).IsRequired().HasMaxLength(LabelLength); - builder.Property(f => f.EntityId).IsRequired(); - builder.Property(f => f.Action).IsRequired().HasMaxLength(ShortLabelLength); - builder.Property(f => f.Changes).IsRequired(false).HasColumnType("jsonb"); - builder.Property(f => f.PerformedBy).IsRequired(); - builder.Property(f => f.Timestamp).IsRequired().HasDefaultValueSql("now()"); - - builder.HasOne(f => f.Performer) - .WithMany() - .HasForeignKey(fk => fk.PerformedBy) - .IsRequired() - .OnDelete(DeleteBehavior.Restrict); - } -} \ No newline at end of file diff --git a/PostFundManagement.Domain/Configuration/Entities/Award.cs b/PostFundManagement.Domain/Configuration/Entities/Award.cs deleted file mode 100644 index c6d2dbb..0000000 --- a/PostFundManagement.Domain/Configuration/Entities/Award.cs +++ /dev/null @@ -1,58 +0,0 @@ -namespace PostFundManagement.Domain.Configuration.Entities; - -public sealed class Award : IEntityTypeConfiguration -{ - public void Configure(EntityTypeBuilder builder) - { - builder.ToTable(nameof(Domain.Entities.Award).Pluralize()); - - builder.HasKey(pk => pk.Id); - builder.Property(f => f.OrganisationId).IsRequired(); - builder.Property(f => f.ProgrammeId).IsRequired(); - builder.Property(f => f.ProjectId).IsRequired(false); - builder.Property(f => f.CreatedBy).IsRequired(); - builder.Property(f => f.UpdatedBy).IsRequired(false); - builder.Property(f => f.ApprovedBy).IsRequired(false); - builder.Property(f => f.CreatedAt).IsRequired().HasDefaultValueSql("now()"); - builder.Property(f => f.UpdatedAt).IsRequired(false); - builder.Property(f => f.Status).IsRequired().HasConversion().HasDefaultValueSql("1") - .HasSentinel(ApprovalStatus.Pending); - builder.Property(f => f.Amount).IsRequired().HasPrecision(18, 2); - - builder.HasOne(f => f.Organisation) - .WithMany() - .HasForeignKey(fk => fk.OrganisationId) - .IsRequired() - .OnDelete(DeleteBehavior.Restrict); - - builder.HasOne(f => f.Programme) - .WithMany(f => f.Awards) - .HasForeignKey(fk => fk.ProgrammeId) - .IsRequired() - .OnDelete(DeleteBehavior.Restrict); - - builder.HasOne(f => f.Project) - .WithMany(f => f.Awards) - .HasForeignKey(fk => fk.ProjectId) - .IsRequired(false) - .OnDelete(DeleteBehavior.SetNull); - - builder.HasOne(f => f.Creator) - .WithMany() - .HasForeignKey(fk => fk.CreatedBy) - .IsRequired() - .OnDelete(DeleteBehavior.NoAction); - - builder.HasOne(f => f.Updator) - .WithMany() - .HasForeignKey(fk => fk.UpdatedBy) - .IsRequired(false) - .OnDelete(DeleteBehavior.NoAction); - - builder.HasOne(f => f.Approver) - .WithMany() - .HasForeignKey(fk => fk.ApprovedBy) - .IsRequired(false) - .OnDelete(DeleteBehavior.NoAction); - } -} \ No newline at end of file diff --git a/PostFundManagement.Domain/Configuration/Entities/Beneficiary.cs b/PostFundManagement.Domain/Configuration/Entities/Beneficiary.cs deleted file mode 100644 index d9762a5..0000000 --- a/PostFundManagement.Domain/Configuration/Entities/Beneficiary.cs +++ /dev/null @@ -1,40 +0,0 @@ -using static PostFundManagement.Domain.Extensions.Constants; - -namespace PostFundManagement.Domain.Configuration.Entities; - -public sealed class Beneficiary : IEntityTypeConfiguration -{ - public void Configure(EntityTypeBuilder builder) - { - builder.ToTable(nameof(Domain.Entities.Beneficiary).Pluralize()); - - builder.HasKey(pk => pk.Id); - builder.Property(f => f.ProjectId).IsRequired(); - builder.Property(f => f.CreatedBy).IsRequired(); - builder.Property(f => f.UserId).IsRequired(); - builder.Property(f => f.CreatedAt).IsRequired().HasDefaultValueSql("now()"); - builder.Property(f => f.Name).IsRequired().HasMaxLength(LabelLength); - builder.Property(f => f.Category).IsRequired().HasMaxLength(ShortLabelLength); - builder.Property(f => f.TargetCount).IsRequired(); - builder.Property(f => f.ReachedCount).IsRequired(); - builder.Property(f => f.Location).IsRequired(); - - builder.HasOne(f => f.Project) - .WithMany() - .HasForeignKey(fk => fk.ProjectId) - .IsRequired() - .OnDelete(DeleteBehavior.Restrict); - - builder.HasOne(f => f.Creator) - .WithMany() - .HasForeignKey(fk => fk.CreatedBy) - .IsRequired() - .OnDelete(DeleteBehavior.NoAction); - - builder.HasOne(f => f.User) - .WithMany() - .HasForeignKey(fk => fk.UserId) - .IsRequired() - .OnDelete(DeleteBehavior.NoAction); - } -} \ No newline at end of file diff --git a/PostFundManagement.Domain/Configuration/Entities/Budget.cs b/PostFundManagement.Domain/Configuration/Entities/Budget.cs deleted file mode 100644 index 6fde58a..0000000 --- a/PostFundManagement.Domain/Configuration/Entities/Budget.cs +++ /dev/null @@ -1,38 +0,0 @@ -using static PostFundManagement.Domain.Extensions.Constants; - -namespace PostFundManagement.Domain.Configuration.Entities; - -public sealed class Budget : IEntityTypeConfiguration -{ - public void Configure(EntityTypeBuilder builder) - { - builder.ToTable(nameof(Domain.Entities.Budget).Pluralize()); - - builder.HasKey(pk => pk.Id); - builder.Property(f => f.ProjectId).IsRequired(); - builder.Property(f => f.CreatedBy).IsRequired(); - builder.Property(f => f.ApprovedBy).IsRequired(false); - builder.Property(f => f.CreatedAt).IsRequired().HasDefaultValueSql("now()"); - builder.Property(f => f.UpdatedAt).IsRequired(false); - builder.Property(f => f.Name).IsRequired().HasMaxLength(LabelLength); - builder.Property(f => f.Amount).IsRequired().HasPrecision(18, 2); - - builder.HasOne(f => f.Project) - .WithMany() - .HasForeignKey(fk => fk.ProjectId) - .IsRequired() - .OnDelete(DeleteBehavior.Restrict); - - builder.HasOne(f => f.Creator) - .WithMany() - .HasForeignKey(fk => fk.CreatedBy) - .IsRequired() - .OnDelete(DeleteBehavior.NoAction); - - builder.HasOne(f => f.Approver) - .WithMany() - .HasForeignKey(fk => fk.ApprovedBy) - .IsRequired(false) - .OnDelete(DeleteBehavior.NoAction); - } -} \ No newline at end of file diff --git a/PostFundManagement.Domain/Configuration/Entities/ChangeRequest.cs b/PostFundManagement.Domain/Configuration/Entities/ChangeRequest.cs deleted file mode 100644 index 433a7c8..0000000 --- a/PostFundManagement.Domain/Configuration/Entities/ChangeRequest.cs +++ /dev/null @@ -1,42 +0,0 @@ -using static PostFundManagement.Domain.Extensions.Constants; - -namespace PostFundManagement.Domain.Configuration.Entities; - -public sealed class ChangeRequest : IEntityTypeConfiguration -{ - public void Configure(EntityTypeBuilder builder) - { - builder.ToTable(nameof(Domain.Entities.ChangeRequest).Pluralize()); - - builder.HasKey(pk => pk.Id); - builder.Property(f => f.ProjectId).IsRequired(); - builder.Property(f => f.CreatedBy).IsRequired(); - builder.Property(f => f.ApprovedBy).IsRequired(false); - builder.Property(f => f.CreatedAt).IsRequired().HasDefaultValueSql("now()"); - builder.Property(f => f.UpdatedAt).IsRequired(false); - builder.Property(f => f.Title).IsRequired().HasMaxLength(LabelLength); - builder.Property(f => f.Justification).IsRequired().HasMaxLength(TextLength); - builder.Property(f => f.RevisedBudget).IsRequired(false).HasPrecision(18, 2); - builder.Property(f => f.RevisedEndedAt).IsRequired(false); - builder.Property(f => f.Status).IsRequired().HasConversion().HasDefaultValueSql("1") - .HasSentinel(ApprovalStatus.Pending); - - builder.HasOne(f => f.Project) - .WithMany() - .HasForeignKey(fk => fk.ProjectId) - .IsRequired() - .OnDelete(DeleteBehavior.Restrict); - - builder.HasOne(f => f.Creator) - .WithMany() - .HasForeignKey(fk => fk.CreatedBy) - .IsRequired() - .OnDelete(DeleteBehavior.NoAction); - - builder.HasOne(f => f.Approver) - .WithMany() - .HasForeignKey(fk => fk.ApprovedBy) - .IsRequired(false) - .OnDelete(DeleteBehavior.NoAction); - } -} \ No newline at end of file diff --git a/PostFundManagement.Domain/Configuration/Entities/ComplianceItem.cs b/PostFundManagement.Domain/Configuration/Entities/ComplianceItem.cs deleted file mode 100644 index dff70db..0000000 --- a/PostFundManagement.Domain/Configuration/Entities/ComplianceItem.cs +++ /dev/null @@ -1,40 +0,0 @@ -using static PostFundManagement.Domain.Extensions.Constants; - -namespace PostFundManagement.Domain.Configuration.Entities; - -public sealed class ComplianceItem : IEntityTypeConfiguration -{ - public void Configure(EntityTypeBuilder builder) - { - builder.ToTable(nameof(Domain.Entities.ComplianceItem).Pluralize()); - - builder.HasKey(pk => pk.Id); - builder.Property(f => f.ProjectId).IsRequired(); - builder.Property(f => f.CreatedBy).IsRequired(); - builder.Property(f => f.VerifiedBy).IsRequired(false); - builder.Property(f => f.CreatedAt).IsRequired().HasDefaultValueSql("now()"); - builder.Property(f => f.UpdatedAt).IsRequired(false); - builder.Property(f => f.Title).IsRequired().HasMaxLength(LabelLength); - builder.Property(f => f.Requirements).IsRequired().HasMaxLength(MediumTextLength); - builder.Property(f => f.Status).IsRequired().HasConversion().HasDefaultValueSql("1") - .HasSentinel(ApprovalStatus.Pending); - - builder.HasOne(f => f.Project) - .WithMany() - .HasForeignKey(fk => fk.ProjectId) - .IsRequired() - .OnDelete(DeleteBehavior.Restrict); - - builder.HasOne(f => f.Creator) - .WithMany() - .HasForeignKey(fk => fk.CreatedBy) - .IsRequired() - .OnDelete(DeleteBehavior.NoAction); - - builder.HasOne(f => f.Verifier) - .WithMany() - .HasForeignKey(fk => fk.VerifiedBy) - .IsRequired(false) - .OnDelete(DeleteBehavior.NoAction); - } -} \ No newline at end of file diff --git a/PostFundManagement.Domain/Configuration/Entities/Contract.cs b/PostFundManagement.Domain/Configuration/Entities/Contract.cs deleted file mode 100644 index 60c4eca..0000000 --- a/PostFundManagement.Domain/Configuration/Entities/Contract.cs +++ /dev/null @@ -1,35 +0,0 @@ -namespace PostFundManagement.Domain.Configuration.Entities; - -public sealed class Contract : IEntityTypeConfiguration -{ - public void Configure(EntityTypeBuilder builder) - { - builder.ToTable(nameof(Domain.Entities.Contract).Pluralize()); - - builder.HasKey(pk => pk.Id); - builder.HasIndex(f => f.AwardId).IsUnique(); - - builder.Property(f => f.AwardId).IsRequired(); - builder.Property(f => f.CreatedBy).IsRequired(); - builder.Property(f => f.CreatedAt).IsRequired().HasDefaultValueSql("now()"); - builder.Property(f => f.ExternalSignatureId).IsRequired(false); - builder.Property(f => f.SignedDocumentUrl).IsRequired(false); - builder.Property(f => f.EffectiveAt).IsRequired(false); - builder.Property(f => f.ExpiresAt).IsRequired(false); - builder.Property(f => f.TotalValue).IsRequired().HasPrecision(18, 2); - builder.Property(f => f.Status).IsRequired().HasConversion().HasDefaultValueSql("1") - .HasSentinel(ContractStatus.Draft); - - builder.HasOne(f => f.Award) - .WithOne(f => f.Contract) - .HasForeignKey(fk => fk.AwardId) - .IsRequired() - .OnDelete(DeleteBehavior.Restrict); - - builder.HasOne(f => f.Creator) - .WithMany() - .HasForeignKey(fk => fk.CreatedBy) - .IsRequired() - .OnDelete(DeleteBehavior.NoAction); - } -} \ No newline at end of file diff --git a/PostFundManagement.Domain/Configuration/Entities/Disbursement.cs b/PostFundManagement.Domain/Configuration/Entities/Disbursement.cs deleted file mode 100644 index b95016c..0000000 --- a/PostFundManagement.Domain/Configuration/Entities/Disbursement.cs +++ /dev/null @@ -1,44 +0,0 @@ -namespace PostFundManagement.Domain.Configuration.Entities; - -public sealed class Disbursement : IEntityTypeConfiguration -{ - public void Configure(EntityTypeBuilder builder) - { - builder.ToTable(nameof(Domain.Entities.Disbursement).Pluralize()); - - builder.HasKey(pk => pk.Id); - builder.Property(f => f.ProjectId).IsRequired(); - builder.Property(f => f.MilestoneId).IsRequired(false); - builder.Property(f => f.CreatedBy).IsRequired(); - builder.Property(f => f.UpdatedBy).IsRequired(false); - builder.Property(f => f.CreatedAt).IsRequired().HasDefaultValueSql("now()"); - builder.Property(f => f.UpdatedAt).IsRequired(false); - builder.Property(f => f.Amount).IsRequired().HasPrecision(18, 2); - builder.Property(f => f.Status).IsRequired().HasConversion().HasDefaultValueSql("1") - .HasSentinel(ApprovalStatus.Pending); - - builder.HasOne(f => f.Project) - .WithMany() - .HasForeignKey(fk => fk.ProjectId) - .IsRequired() - .OnDelete(DeleteBehavior.Restrict); - - builder.HasOne(f => f.Milestone) - .WithMany() - .HasForeignKey(fk => fk.MilestoneId) - .IsRequired(false) - .OnDelete(DeleteBehavior.Restrict); - - builder.HasOne(f => f.Creator) - .WithMany() - .HasForeignKey(fk => fk.CreatedBy) - .IsRequired() - .OnDelete(DeleteBehavior.NoAction); - - builder.HasOne(f => f.Updator) - .WithMany() - .HasForeignKey(fk => fk.UpdatedBy) - .IsRequired(false) - .OnDelete(DeleteBehavior.NoAction); - } -} \ No newline at end of file diff --git a/PostFundManagement.Domain/Configuration/Entities/Evidence.cs b/PostFundManagement.Domain/Configuration/Entities/Evidence.cs deleted file mode 100644 index 998b1b5..0000000 --- a/PostFundManagement.Domain/Configuration/Entities/Evidence.cs +++ /dev/null @@ -1,61 +0,0 @@ -namespace PostFundManagement.Domain.Configuration.Entities; - -public sealed class Evidence : IEntityTypeConfiguration -{ - public void Configure(EntityTypeBuilder builder) - { - builder.ToTable(nameof(Domain.Entities.Evidence).Pluralize()); - - builder.HasKey(f => f.Id); - builder.Property(f => f.ProjectId).IsRequired(); - builder.Property(f => f.MilestoneId).IsRequired(); - builder.Property(f => f.IndicatorId).IsRequired(); - builder.Property(f => f.ActivityId).IsRequired(); - builder.Property(f => f.CreatedBy).IsRequired(); - builder.Property(f => f.UpdatedBy).IsRequired(); - builder.Property(f => f.CreatedAt).IsRequired().HasDefaultValueSql("now()"); - builder.Property(f => f.UpdatedAt).IsRequired(false); - builder.Property(f => f.Version).IsRequired().HasDefaultValue(1); - builder.Property(f => f.DocumentUrl).IsRequired(); - builder.Property(f => f.Status).IsRequired().HasConversion().HasDefaultValueSql("1") - .HasSentinel(ApprovalStatus.Pending); - builder.Property(f => f.Type).IsRequired().HasConversion().HasDefaultValueSql("9") - .HasSentinel(EvidenceType.ProcurementDocument); - - builder.HasOne(f => f.Project) - .WithMany() - .HasForeignKey(fk => fk.ProjectId) - .IsRequired() - .OnDelete(DeleteBehavior.Restrict); - - builder.HasOne(f => f.Milestone) - .WithMany() - .HasForeignKey(fk => fk.MilestoneId) - .IsRequired() - .OnDelete(DeleteBehavior.Restrict); - - builder.HasOne(f => f.Indicator) - .WithMany() - .HasForeignKey(fk => fk.IndicatorId) - .IsRequired() - .OnDelete(DeleteBehavior.Restrict); - - builder.HasOne(f => f.Activity) - .WithMany(f => f.Evidences) - .HasForeignKey(fk => fk.ActivityId) - .IsRequired() - .OnDelete(DeleteBehavior.Restrict); - - builder.HasOne(f => f.Creator) - .WithMany() - .HasForeignKey(fk => fk.CreatedBy) - .IsRequired() - .OnDelete(DeleteBehavior.NoAction); - - builder.HasOne(f => f.Updator) - .WithMany() - .HasForeignKey(fk => fk.UpdatedBy) - .IsRequired(false) - .OnDelete(DeleteBehavior.NoAction); - } -} \ No newline at end of file diff --git a/PostFundManagement.Domain/Configuration/Entities/Indicator.cs b/PostFundManagement.Domain/Configuration/Entities/Indicator.cs deleted file mode 100644 index eefce24..0000000 --- a/PostFundManagement.Domain/Configuration/Entities/Indicator.cs +++ /dev/null @@ -1,33 +0,0 @@ -using static PostFundManagement.Domain.Extensions.Constants; - -namespace PostFundManagement.Domain.Configuration.Entities; - -public sealed class Indicator : IEntityTypeConfiguration -{ - public void Configure(EntityTypeBuilder builder) - { - builder.ToTable(nameof(Domain.Entities.Indicator).Pluralize()); - - builder.HasKey(pk => pk.Id); - builder.Property(f => f.ProjectId).IsRequired(); - builder.Property(f => f.CreatedBy).IsRequired(); - builder.Property(f => f.CreatedAt).IsRequired().HasDefaultValueSql("now()"); - builder.Property(f => f.Name).IsRequired().HasMaxLength(LabelLength); - builder.Property(f => f.UnitOfMeasure).IsRequired().HasConversion().HasDefaultValueSql("2"); - builder.Property(f => f.BaselineAmount).IsRequired().HasPrecision(18, 2); - builder.Property(f => f.TargetAmount).IsRequired().HasPrecision(18, 2); - builder.Property(f => f.ActualAmount).IsRequired().HasPrecision(18, 2); - - builder.HasOne(f => f.Project) - .WithMany() - .HasForeignKey(fk => fk.ProjectId) - .IsRequired() - .OnDelete(DeleteBehavior.Restrict); - - builder.HasOne(f => f.Creator) - .WithMany() - .HasForeignKey(fk => fk.CreatedBy) - .IsRequired() - .OnDelete(DeleteBehavior.NoAction); - } -} \ No newline at end of file diff --git a/PostFundManagement.Domain/Configuration/Entities/Instrument.cs b/PostFundManagement.Domain/Configuration/Entities/Instrument.cs deleted file mode 100644 index 789594e..0000000 --- a/PostFundManagement.Domain/Configuration/Entities/Instrument.cs +++ /dev/null @@ -1,33 +0,0 @@ -using static PostFundManagement.Domain.Extensions.Constants; - -namespace PostFundManagement.Domain.Configuration.Entities; - -public sealed class Instrument : IEntityTypeConfiguration -{ - public void Configure(EntityTypeBuilder builder) - { - builder.ToTable(nameof(Domain.Entities.Instrument).Pluralize()); - - builder.HasKey(pk => pk.Id); - builder.Property(f => f.ProgrammeId).IsRequired(); - builder.Property(f => f.Code).IsRequired().HasMaxLength(ShortLabelLength); - builder.Property(f => f.Name).IsRequired().HasMaxLength(LabelLength); - builder.Property(f => f.Description).IsRequired(false).HasMaxLength(TextLength); - builder.Property(f => f.Status).IsRequired().HasConversion().HasDefaultValueSql("2") - .HasSentinel(ActivityStatus.Inactive); - builder.Property(f => f.CreatedBy).IsRequired(); - builder.Property(f => f.CreatedAt).IsRequired().HasDefaultValueSql("now()"); - - builder.HasOne(f => f.Programme) - .WithMany(f => f.Instruments) - .HasForeignKey(fk => fk.ProgrammeId) - .IsRequired() - .OnDelete(DeleteBehavior.Restrict); - - builder.HasOne(f => f.Creator) - .WithMany() - .HasForeignKey(fk => fk.CreatedBy) - .IsRequired() - .OnDelete(DeleteBehavior.NoAction); - } -} diff --git a/PostFundManagement.Domain/Configuration/Entities/Invite.cs b/PostFundManagement.Domain/Configuration/Entities/Invite.cs deleted file mode 100644 index 631fada..0000000 --- a/PostFundManagement.Domain/Configuration/Entities/Invite.cs +++ /dev/null @@ -1,51 +0,0 @@ - -namespace PostFundManagement.Domain.Configuration.Entities; - -public sealed class Invite : IEntityTypeConfiguration -{ - public void Configure(EntityTypeBuilder builder) - { - builder.ToTable(nameof(Domain.Entities.Invite).Pluralize()); - - builder.HasKey(pk => pk.Id); - builder.Property(f => f.OrganisationId).IsRequired(); - builder.Property(f => f.InvitedOrganisationId).IsRequired(); - builder.Property(f => f.AwardId).IsRequired(); - builder.Property(f => f.ContractId).IsRequired(); - builder.Property(f => f.Recipient).IsRequired(); - builder.Property(f => f.CreatedBy).IsRequired(); - builder.Property(f => f.UpdatedBy).IsRequired(false); - builder.Property(f => f.CreatedAt).IsRequired().HasDefaultValueSql("now()"); - builder.Property(f => f.UpdatedAt).IsRequired(false); - - builder.HasOne(f => f.Organisation) - .WithMany() - .HasForeignKey(fk => fk.OrganisationId) - .IsRequired() - .OnDelete(DeleteBehavior.Restrict); - - builder.HasOne(f => f.InvitedOrganisation) - .WithMany() - .HasForeignKey(fk => fk.InvitedOrganisationId) - .IsRequired() - .OnDelete(DeleteBehavior.Restrict); - - builder.HasOne(f => f.Award) - .WithMany() - .HasForeignKey(fk => fk.AwardId) - .IsRequired() - .OnDelete(DeleteBehavior.Restrict); - - builder.HasOne(f => f.Contract) - .WithMany() - .HasForeignKey(fk => fk.ContractId) - .IsRequired() - .OnDelete(DeleteBehavior.Restrict); - - builder.HasOne(f => f.RecipientUser) - .WithMany() - .HasForeignKey(fk => fk.Recipient) - .IsRequired() - .OnDelete(DeleteBehavior.Restrict); - } -} \ No newline at end of file diff --git a/PostFundManagement.Domain/Configuration/Entities/Issue.cs b/PostFundManagement.Domain/Configuration/Entities/Issue.cs deleted file mode 100644 index 49c7d33..0000000 --- a/PostFundManagement.Domain/Configuration/Entities/Issue.cs +++ /dev/null @@ -1,43 +0,0 @@ -using static PostFundManagement.Domain.Extensions.Constants; - -namespace PostFundManagement.Domain.Configuration.Entities; - -public sealed class Issue : IEntityTypeConfiguration -{ - public void Configure(EntityTypeBuilder builder) - { - builder.ToTable(nameof(Domain.Entities.Issue).Pluralize()); - - builder.HasKey(pk => pk.Id); - builder.Property(f => f.ProjectId).IsRequired(); - builder.Property(f => f.CreatedBy).IsRequired(); - builder.Property(f => f.CreatedAt).IsRequired().HasDefaultValueSql("now()"); - builder.Property(f => f.ResolvedAt).IsRequired(false); - builder.Property(f => f.AssignedTo).IsRequired(false); - builder.Property(f => f.Title).IsRequired().HasMaxLength(LabelLength); - builder.Property(f => f.Description).IsRequired().HasMaxLength(TextLength); - builder.Property(f => f.Priority).IsRequired().HasConversion().HasDefaultValueSql("1") - .HasSentinel(Priority.Low); - builder.Property(f => f.Status).IsRequired().HasConversion().HasDefaultValueSql("1") - .HasSentinel(ActivityStatus.Active); - builder.Property(f => f.Resolution).IsRequired(); - - builder.HasOne(f => f.Project) - .WithMany() - .HasForeignKey(fk => fk.ProjectId) - .IsRequired() - .OnDelete(DeleteBehavior.Restrict); - - builder.HasOne(f => f.Creator) - .WithMany() - .HasForeignKey(fk => fk.CreatedBy) - .IsRequired() - .OnDelete(DeleteBehavior.NoAction); - - builder.HasOne(f => f.Assignee) - .WithMany() - .HasForeignKey(fk => fk.AssignedTo) - .IsRequired() - .OnDelete(DeleteBehavior.SetNull); - } -} \ No newline at end of file diff --git a/PostFundManagement.Domain/Configuration/Entities/Milestone.cs b/PostFundManagement.Domain/Configuration/Entities/Milestone.cs deleted file mode 100644 index 513731b..0000000 --- a/PostFundManagement.Domain/Configuration/Entities/Milestone.cs +++ /dev/null @@ -1,42 +0,0 @@ -using static PostFundManagement.Domain.Extensions.Constants; - -namespace PostFundManagement.Domain.Configuration.Entities; - -public sealed class Milestone : IEntityTypeConfiguration -{ - public void Configure(EntityTypeBuilder builder) - { - builder.ToTable(nameof(Domain.Entities.Milestone).Pluralize()); - - builder.HasKey(pk => pk.Id); - builder.Property(f => f.ProjectId).IsRequired(); - builder.Property(f => f.CreatedBy).IsRequired(); - builder.Property(f => f.UpdatedBy).IsRequired(false); - builder.Property(f => f.CreatedAt).IsRequired().HasDefaultValueSql("now()"); - builder.Property(f => f.UpdatedAt).IsRequired(false); - builder.Property(f => f.DueAt).IsRequired(); - builder.Property(f => f.Name).IsRequired().HasMaxLength(LabelLength); - builder.Property(f => f.Status).IsRequired().HasConversion().HasDefaultValueSql("1") - .HasSentinel(ApprovalStatus.Pending); - builder.Property(f => f.Priority).IsRequired().HasConversion().HasDefaultValueSql("1") - .HasSentinel(Priority.Low); - - builder.HasOne(f => f.Project) - .WithMany() - .HasForeignKey(fk => fk.ProjectId) - .IsRequired() - .OnDelete(DeleteBehavior.Restrict); - - builder.HasOne(f => f.Creator) - .WithMany() - .HasForeignKey(fk => fk.CreatedBy) - .IsRequired() - .OnDelete(DeleteBehavior.NoAction); - - builder.HasOne(f => f.Updator) - .WithMany() - .HasForeignKey(fk => fk.UpdatedBy) - .IsRequired(false) - .OnDelete(DeleteBehavior.NoAction); - } -} \ No newline at end of file diff --git a/PostFundManagement.Domain/Configuration/Entities/Notification.cs b/PostFundManagement.Domain/Configuration/Entities/Notification.cs deleted file mode 100644 index 563b988..0000000 --- a/PostFundManagement.Domain/Configuration/Entities/Notification.cs +++ /dev/null @@ -1,38 +0,0 @@ -using static PostFundManagement.Domain.Extensions.Constants; - -namespace PostFundManagement.Domain.Configuration.Entities; - -public sealed class Notification : IEntityTypeConfiguration -{ - public void Configure(EntityTypeBuilder builder) - { - builder.ToTable(nameof(Domain.Entities.Notification).Pluralize()); - - builder.HasKey(pk => pk.Id); - builder.Property(f => f.CreatedAt).IsRequired().HasDefaultValueSql("now()"); - builder.Property(f => f.UpdatedAt).IsRequired(false); - builder.Property(f => f.SentAt).IsRequired(false); - builder.Property(f => f.Recipient).IsRequired(); - builder.Property(f => f.OrganisationId).IsRequired(); - builder.Property(f => f.Platform).IsRequired().HasConversion().HasDefaultValueSql("1") - .HasSentinel(NotificationPlatform.Email); - builder.Property(f => f.Status).IsRequired().HasConversion().HasDefaultValueSql("1") - .HasSentinel(NotificationStatus.Pending); - builder.Property(f => f.Subject).IsRequired(false).HasMaxLength(LabelLength); - builder.Property(f => f.Message).IsRequired().HasMaxLength(LargeTextLength); - builder.Property(f => f.Destination).IsRequired().HasMaxLength(LabelLength); - builder.Property(f => f.Error).IsRequired(false); - - builder.HasOne(f => f.Organisation) - .WithMany() - .HasForeignKey(fk => fk.OrganisationId) - .IsRequired() - .OnDelete(DeleteBehavior.Restrict); - - builder.HasOne(f => f.RecipientUser) - .WithMany() - .HasForeignKey(fk => fk.Recipient) - .IsRequired() - .OnDelete(DeleteBehavior.Restrict); - } -} \ No newline at end of file diff --git a/PostFundManagement.Domain/Configuration/Entities/Organisation.cs b/PostFundManagement.Domain/Configuration/Entities/Organisation.cs deleted file mode 100644 index ddacef1..0000000 --- a/PostFundManagement.Domain/Configuration/Entities/Organisation.cs +++ /dev/null @@ -1,28 +0,0 @@ -using static PostFundManagement.Domain.Extensions.Constants; - -namespace PostFundManagement.Domain.Configuration.Entities; - -public sealed class Organisation : IEntityTypeConfiguration -{ - public void Configure(EntityTypeBuilder builder) - { - builder.ToTable(nameof(Domain.Entities.Organisation).Pluralize()); - - builder.HasKey(pk => pk.Id); - builder.Property(f => f.CreatedBy).IsRequired(); - builder.Property(f => f.CreatedAt).IsRequired().HasDefaultValueSql("now()"); - builder.Property(f => f.RegistrationNo).IsRequired().HasMaxLength(LabelLength); - builder.Property(f => f.Name).IsRequired().HasMaxLength(LabelLength); - builder.Property(f => f.Email).IsRequired().HasMaxLength(LabelLength); - builder.Property(f => f.Type).IsRequired().HasConversion().HasDefaultValueSql("5") - .HasSentinel(OrganisationType.PrivateLimitedCompany); - builder.Property(f => f.Status).IsRequired().HasConversion().HasDefaultValueSql("1") - .HasSentinel(ActivityStatus.Active); - - builder.HasOne(f => f.Creator) - .WithMany() - .HasForeignKey(fk => fk.CreatedBy) - .IsRequired() - .OnDelete(DeleteBehavior.NoAction); - } -} \ No newline at end of file diff --git a/PostFundManagement.Domain/Configuration/Entities/Outcome.cs b/PostFundManagement.Domain/Configuration/Entities/Outcome.cs deleted file mode 100644 index 28a7dfa..0000000 --- a/PostFundManagement.Domain/Configuration/Entities/Outcome.cs +++ /dev/null @@ -1,30 +0,0 @@ -using static PostFundManagement.Domain.Extensions.Constants; - -namespace PostFundManagement.Domain.Configuration.Entities; - -public sealed class Outcome : IEntityTypeConfiguration -{ - public void Configure(EntityTypeBuilder builder) - { - builder.ToTable(nameof(Domain.Entities.Outcome).Pluralize()); - - builder.HasKey(pk => pk.Id); - builder.Property(f => f.BeneficiaryId).IsRequired(); - builder.Property(f => f.CreatedBy).IsRequired(); - builder.Property(f => f.CreatedAt).IsRequired().HasDefaultValueSql("now()"); - builder.Property(f => f.Name).IsRequired().HasMaxLength(LabelLength); - builder.Property(f => f.Description).IsRequired().HasMaxLength(TextLength); - - builder.HasOne(f => f.Beneficiary) - .WithMany() - .HasForeignKey(fk => fk.BeneficiaryId) - .IsRequired() - .OnDelete(DeleteBehavior.Restrict); - - builder.HasOne(f => f.Creator) - .WithMany() - .HasForeignKey(fk => fk.CreatedBy) - .IsRequired() - .OnDelete(DeleteBehavior.NoAction); - } -} \ No newline at end of file diff --git a/PostFundManagement.Domain/Configuration/Entities/Portfolio.cs b/PostFundManagement.Domain/Configuration/Entities/Portfolio.cs deleted file mode 100644 index 8ffc3ee..0000000 --- a/PostFundManagement.Domain/Configuration/Entities/Portfolio.cs +++ /dev/null @@ -1,37 +0,0 @@ -using static PostFundManagement.Domain.Extensions.Constants; - -namespace PostFundManagement.Domain.Configuration.Entities; - -public sealed class Portfolio : IEntityTypeConfiguration -{ - public void Configure(EntityTypeBuilder builder) - { - builder.ToTable(nameof(Domain.Entities.Portfolio).Pluralize()); - - builder.HasKey(pk => pk.Id); - builder.Property(f => f.OrganisationId).IsRequired(); - builder.Property(f => f.CreatedBy).IsRequired(); - builder.Property(f => f.OwnedBy).IsRequired(); - builder.Property(f => f.CreatedAt).IsRequired().HasDefaultValueSql("now()"); - builder.Property(f => f.Name).IsRequired().HasMaxLength(LabelLength); - builder.Property(f => f.Description).IsRequired(false).HasMaxLength(TextLength); - - builder.HasOne(f => f.Organisation) - .WithMany() - .HasForeignKey(fk => fk.OrganisationId) - .IsRequired() - .OnDelete(DeleteBehavior.Restrict); - - builder.HasOne(f => f.Creator) - .WithMany() - .HasForeignKey(fk => fk.CreatedBy) - .IsRequired() - .OnDelete(DeleteBehavior.NoAction); - - builder.HasOne(f => f.Owner) - .WithMany() - .HasForeignKey(fk => fk.OwnedBy) - .IsRequired() - .OnDelete(DeleteBehavior.NoAction); - } -} \ No newline at end of file diff --git a/PostFundManagement.Domain/Configuration/Entities/Programme.cs b/PostFundManagement.Domain/Configuration/Entities/Programme.cs deleted file mode 100644 index d5180c4..0000000 --- a/PostFundManagement.Domain/Configuration/Entities/Programme.cs +++ /dev/null @@ -1,40 +0,0 @@ -using static PostFundManagement.Domain.Extensions.Constants; - -namespace PostFundManagement.Domain.Configuration.Entities; - -public sealed class Programme : IEntityTypeConfiguration -{ - public void Configure(EntityTypeBuilder builder) - { - builder.ToTable(nameof(Domain.Entities.Programme).Pluralize()); - - builder.HasKey(pk => pk.Id); - builder.Property(f => f.PortfolioId).IsRequired(); - builder.Property(f => f.OwnedBy).IsRequired(); - builder.Property(f => f.CreatedBy).IsRequired(); - builder.Property(f => f.UpdatedBy).IsRequired(false); - builder.Property(f => f.CreatedAt).IsRequired().HasDefaultValueSql("now()"); - builder.Property(f => f.UpdatedAt).IsRequired(false); - builder.Property(f => f.Name).IsRequired().HasMaxLength(LabelLength); - builder.Property(f => f.Status).IsRequired().HasConversion().HasDefaultValueSql("1") - .HasSentinel(ApprovalStatus.Pending); - - builder.HasOne(f => f.Portfolio) - .WithMany(f => f.Programmes) - .HasForeignKey(fk => fk.PortfolioId) - .IsRequired() - .OnDelete(DeleteBehavior.NoAction); - - builder.HasOne(f => f.Creator) - .WithMany() - .HasForeignKey(fk => fk.CreatedBy) - .IsRequired() - .OnDelete(DeleteBehavior.NoAction); - - builder.HasOne(f => f.Owner) - .WithMany() - .IsRequired() - .HasForeignKey(fk => fk.OwnedBy) - .OnDelete(DeleteBehavior.NoAction); - } -} \ No newline at end of file diff --git a/PostFundManagement.Domain/Configuration/Entities/Project.cs b/PostFundManagement.Domain/Configuration/Entities/Project.cs deleted file mode 100644 index 4f55526..0000000 --- a/PostFundManagement.Domain/Configuration/Entities/Project.cs +++ /dev/null @@ -1,46 +0,0 @@ -using static PostFundManagement.Domain.Extensions.Constants; - -namespace PostFundManagement.Domain.Configuration.Entities; - -public sealed class Project : IEntityTypeConfiguration -{ - public void Configure(EntityTypeBuilder builder) - { - builder.ToTable(nameof(Domain.Entities.Project).Pluralize()); - - builder.HasKey(pk => pk.Id); - builder.Property(f => f.ProgrammeId).IsRequired(); - builder.Property(f => f.CreatedBy).IsRequired(); - builder.Property(f => f.UpdatedBy).IsRequired(false); - builder.Property(f => f.CreatedAt).IsRequired().HasDefaultValueSql("now()"); - builder.Property(f => f.UpdatedAt).IsRequired(false); - builder.Property(f => f.StartedAt).IsRequired(false); - builder.Property(f => f.EndedAt).IsRequired(false); - builder.Property(f => f.Name).IsRequired().HasMaxLength(LabelLength); - builder.Property(f => f.Description).IsRequired().HasMaxLength(TextLength); - builder.Property(f => f.Sector).IsRequired().HasConversion().HasDefaultValueSql("11") - .HasSentinel(IndustrySector.InformationCommunicationTechnology); - builder.Property(f => f.ProjectType).IsRequired().HasConversion().HasDefaultValueSql("10") - .HasSentinel(ProjectType.Innovation); - builder.Property(f => f.Status).IsRequired().HasConversion().HasDefaultValueSql("1") - .HasSentinel(ApprovalStatus.Pending); - - builder.HasOne(f => f.Programme) - .WithMany(f => f.Projects) - .HasForeignKey(fk => fk.ProgrammeId) - .IsRequired() - .OnDelete(DeleteBehavior.Restrict); - - builder.HasOne(f => f.Creator) - .WithMany() - .HasForeignKey(fk => fk.CreatedBy) - .IsRequired() - .OnDelete(DeleteBehavior.NoAction); - - builder.HasOne(f => f.Updator) - .WithMany() - .HasForeignKey(fk => fk.UpdatedBy) - .IsRequired(false) - .OnDelete(DeleteBehavior.NoAction); - } -} \ No newline at end of file diff --git a/PostFundManagement.Domain/Configuration/Entities/Risk.cs b/PostFundManagement.Domain/Configuration/Entities/Risk.cs deleted file mode 100644 index 3c731b0..0000000 --- a/PostFundManagement.Domain/Configuration/Entities/Risk.cs +++ /dev/null @@ -1,34 +0,0 @@ -using static PostFundManagement.Domain.Extensions.Constants; - -namespace PostFundManagement.Domain.Configuration.Entities; - -public sealed class Risk : IEntityTypeConfiguration -{ - public void Configure(EntityTypeBuilder builder) - { - builder.ToTable(nameof(Domain.Entities.Risk).Pluralize()); - - builder.HasKey(pk => pk.Id); - builder.Property(f => f.ProjectId).IsRequired(); - builder.Property(f => f.CreatedBy).IsRequired(); - builder.Property(f => f.CreatedAt).IsRequired().HasDefaultValueSql("now()"); - builder.Property(f => f.Likelihood).IsRequired().HasConversion().HasDefaultValueSql("3") - .HasSentinel(RiskLikelihood.Possible); - builder.Property(f => f.Impact).IsRequired().HasConversion().HasDefaultValueSql("1") - .HasSentinel(RiskImpact.Negligible); - builder.Property(f => f.Name).IsRequired().HasMaxLength(LabelLength); - builder.Property(f => f.Description).IsRequired().HasMaxLength(TextLength); - - builder.HasOne(f => f.Project) - .WithMany() - .HasForeignKey(fk => fk.ProjectId) - .IsRequired() - .OnDelete(DeleteBehavior.Restrict); - - builder.HasOne(f => f.Creator) - .WithMany() - .HasForeignKey(fk => fk.CreatedBy) - .IsRequired() - .OnDelete(DeleteBehavior.NoAction); - } -} \ No newline at end of file diff --git a/PostFundManagement.Domain/Configuration/Entities/Rule.cs b/PostFundManagement.Domain/Configuration/Entities/Rule.cs deleted file mode 100644 index 0160edb..0000000 --- a/PostFundManagement.Domain/Configuration/Entities/Rule.cs +++ /dev/null @@ -1,40 +0,0 @@ -using static PostFundManagement.Domain.Extensions.Constants; - -namespace PostFundManagement.Domain.Configuration.Entities; - -public sealed class Rule : IEntityTypeConfiguration -{ - public void Configure(EntityTypeBuilder builder) - { - builder.ToTable(nameof(Domain.Entities.Rule).Pluralize()); - - builder.HasKey(fk => fk.Id); - builder.Property(f => f.ProgrammeId).IsRequired(); - builder.Property(f => f.CreatedBy).IsRequired(); - builder.Property(f => f.UpdatedBy).IsRequired(false); - builder.Property(f => f.CreatedAt).IsRequired().HasDefaultValueSql("now()"); - builder.Property(f => f.UpdatedAt).IsRequired(false); - builder.Property(f => f.Name).IsRequired().HasMaxLength(LabelLength); - builder.Property(f => f.Version).IsRequired().HasDefaultValue(1); - builder.Property(f => f.Status).IsRequired().HasConversion().HasDefaultValueSql("2") - .HasSentinel(ActivityStatus.Inactive); - - builder.HasOne(f => f.Programme) - .WithMany(f => f.Rules) - .HasForeignKey(fk => fk.ProgrammeId) - .IsRequired() - .OnDelete(DeleteBehavior.NoAction); - - builder.HasOne(f => f.Creator) - .WithMany() - .HasForeignKey(fk => fk.CreatedBy) - .IsRequired() - .OnDelete(DeleteBehavior.NoAction); - - builder.HasOne(f => f.Updator) - .WithMany() - .HasForeignKey(fk => fk.UpdatedBy) - .IsRequired(false) - .OnDelete(DeleteBehavior.NoAction); - } -} \ No newline at end of file diff --git a/PostFundManagement.Domain/Configuration/Entities/SiteVisit.cs b/PostFundManagement.Domain/Configuration/Entities/SiteVisit.cs deleted file mode 100644 index 116348e..0000000 --- a/PostFundManagement.Domain/Configuration/Entities/SiteVisit.cs +++ /dev/null @@ -1,33 +0,0 @@ -using static PostFundManagement.Domain.Extensions.Constants; - -namespace PostFundManagement.Domain.Configuration.Entities; - -public sealed class SiteVisit : IEntityTypeConfiguration -{ - public void Configure(EntityTypeBuilder builder) - { - builder.ToTable(nameof(Domain.Entities.SiteVisit).Pluralize()); - - builder.HasKey(pk => pk.Id); - builder.Property(f => f.ProjectId).IsRequired(); - builder.Property(f => f.CreatedBy).IsRequired(); - builder.Property(f => f.CreatedAt).IsRequired().HasDefaultValueSql("now()"); - builder.Property(f => f.VisitedAt).IsRequired(); - builder.Property(f => f.InspectorName).IsRequired(); - builder.Property(f => f.Findings).IsRequired(false).HasMaxLength(LargeTextLength); - builder.Property(f => f.Status).IsRequired().HasConversion().HasDefaultValueSql("1") - .HasSentinel(ApprovalStatus.Pending); - - builder.HasOne(f => f.Project) - .WithMany() - .HasForeignKey(fk => fk.ProjectId) - .IsRequired() - .OnDelete(DeleteBehavior.Restrict); - - builder.HasOne(f => f.Creator) - .WithMany() - .HasForeignKey(fk => fk.CreatedBy) - .IsRequired() - .OnDelete(DeleteBehavior.NoAction); - } -} \ No newline at end of file diff --git a/PostFundManagement.Domain/Configuration/Entities/User.cs b/PostFundManagement.Domain/Configuration/Entities/User.cs deleted file mode 100644 index 183e4f7..0000000 --- a/PostFundManagement.Domain/Configuration/Entities/User.cs +++ /dev/null @@ -1,17 +0,0 @@ -using static PostFundManagement.Domain.Extensions.Constants; - -namespace PostFundManagement.Domain.Configuration.Entities; - -public sealed class User : IEntityTypeConfiguration -{ - public void Configure(EntityTypeBuilder builder) - { - builder.ToTable(nameof(Domain.Entities.User).Pluralize()); - - builder.HasKey(pk => pk.Id); - builder.Property(f => f.Email).IsRequired().HasMaxLength(LabelLength); - builder.Property(f => f.Status).IsRequired().HasConversion().HasDefaultValueSql("2") - .HasSentinel(ActivityStatus.Inactive); - builder.Property(f => f.LastLoginAt).IsRequired(false); - } -} \ No newline at end of file diff --git a/PostFundManagement.Domain/Entities/Activity.cs b/PostFundManagement.Domain/Entities/Activity.cs index 24ed074..5f2f657 100644 --- a/PostFundManagement.Domain/Entities/Activity.cs +++ b/PostFundManagement.Domain/Entities/Activity.cs @@ -1,6 +1,8 @@ +using static PostFundManagement.Domain.Extensions.Constants; + namespace PostFundManagement.Domain.Entities; -[EntityTypeConfiguration] +[EntityTypeConfiguration] public class Activity : Models.Activity { public virtual User? Creator { get; set; } @@ -14,4 +16,58 @@ public class Activity : Models.Activity public virtual Milestone? Milestone { get; set; } public virtual ICollection Evidences { get; set; } = []; +} + +public sealed class ActivityConfiguration : IEntityTypeConfiguration +{ + public void Configure(EntityTypeBuilder builder) + { + builder.ToTable(nameof(Activity).Pluralize()); + + builder.HasKey(pk => pk.Id); + builder.Property(f => f.ProjectId).IsRequired(); + builder.Property(f => f.MilestoneId).IsRequired(); + builder.Property(f => f.CreatedBy).IsRequired(); + builder.Property(f => f.UpdatedBy).IsRequired(false); + builder.Property(f => f.ApprovedBy).IsRequired(false); + builder.Property(f => f.CreatedAt).IsRequired().HasDefaultValueSql("now()"); + builder.Property(f => f.UpdatedAt).IsRequired(false); + builder.Property(f => f.PerformedAt).IsRequired(false); + builder.Property(f => f.Category).IsRequired().HasMaxLength(LabelLength); + builder.Property(f => f.Status).IsRequired().HasDefaultValueSql("1") + .HasSentinel(ApprovalStatus.Pending); + builder.Property(f => f.Amount).IsRequired().HasPrecision(18, 2); + builder.Property(f => f.Title).IsRequired().HasMaxLength(LabelLength); + builder.Property(f => f.Description).IsRequired().HasMaxLength(TextLength); + + builder.HasOne(f => f.Project) + .WithMany() + .HasForeignKey(fk => fk.ProjectId) + .IsRequired() + .OnDelete(DeleteBehavior.Restrict); + + builder.HasOne(f => f.Milestone) + .WithMany() + .HasForeignKey(fk => fk.MilestoneId) + .IsRequired() + .OnDelete(DeleteBehavior.Restrict); + + builder.HasOne(f => f.Creator) + .WithMany() + .HasForeignKey(fk => fk.CreatedBy) + .IsRequired() + .OnDelete(DeleteBehavior.NoAction); + + builder.HasOne(f => f.Updator) + .WithMany() + .HasForeignKey(fk => fk.UpdatedBy) + .IsRequired(false) + .OnDelete(DeleteBehavior.NoAction); + + builder.HasOne(f => f.Approver) + .WithMany() + .HasForeignKey(fk => fk.ApprovedBy) + .IsRequired(false) + .OnDelete(DeleteBehavior.NoAction); + } } \ No newline at end of file diff --git a/PostFundManagement.Domain/Entities/AuditLog.cs b/PostFundManagement.Domain/Entities/AuditLog.cs index 34b32b5..53cf177 100644 --- a/PostFundManagement.Domain/Entities/AuditLog.cs +++ b/PostFundManagement.Domain/Entities/AuditLog.cs @@ -1,7 +1,31 @@ +using static PostFundManagement.Domain.Extensions.Constants; + namespace PostFundManagement.Domain.Entities; -[EntityTypeConfiguration] +[EntityTypeConfiguration] public class AuditLog : Models.AuditLog { public virtual User? Performer { get; set; } +} + +public sealed class AuditLogConfiguration : IEntityTypeConfiguration +{ + public void Configure(EntityTypeBuilder builder) + { + builder.ToTable(nameof(Domain.Entities.AuditLog).Pluralize()); + + builder.HasKey(pk => pk.Id); + builder.Property(f => f.EntityName).IsRequired().HasMaxLength(LabelLength); + builder.Property(f => f.EntityId).IsRequired(); + builder.Property(f => f.Action).IsRequired().HasMaxLength(ShortLabelLength); + builder.Property(f => f.Changes).IsRequired(false).HasColumnType("jsonb"); + builder.Property(f => f.PerformedBy).IsRequired(); + builder.Property(f => f.Timestamp).IsRequired().HasDefaultValueSql("now()"); + + builder.HasOne(f => f.Performer) + .WithMany() + .HasForeignKey(fk => fk.PerformedBy) + .IsRequired() + .OnDelete(DeleteBehavior.Restrict); + } } \ No newline at end of file diff --git a/PostFundManagement.Domain/Entities/Award.cs b/PostFundManagement.Domain/Entities/Award.cs index 4877d52..488d234 100644 --- a/PostFundManagement.Domain/Entities/Award.cs +++ b/PostFundManagement.Domain/Entities/Award.cs @@ -1,6 +1,6 @@ namespace PostFundManagement.Domain.Entities; -[EntityTypeConfiguration] +[EntityTypeConfiguration] public class Award : Models.Award { public virtual User? Creator { get; set; } @@ -16,4 +16,61 @@ public class Award : Models.Award public virtual Project? Project { get; set; } public virtual Contract? Contract { get; set; } +} + +public sealed class AwardConfiguration : IEntityTypeConfiguration +{ + public void Configure(EntityTypeBuilder builder) + { + builder.ToTable(nameof(Award).Pluralize()); + + builder.HasKey(pk => pk.Id); + builder.Property(f => f.OrganisationId).IsRequired(); + builder.Property(f => f.ProgrammeId).IsRequired(); + builder.Property(f => f.ProjectId).IsRequired(false); + builder.Property(f => f.CreatedBy).IsRequired(); + builder.Property(f => f.UpdatedBy).IsRequired(false); + builder.Property(f => f.ApprovedBy).IsRequired(false); + builder.Property(f => f.CreatedAt).IsRequired().HasDefaultValueSql("now()"); + builder.Property(f => f.UpdatedAt).IsRequired(false); + builder.Property(f => f.Status).IsRequired().HasConversion().HasDefaultValueSql("1") + .HasSentinel(ApprovalStatus.Pending); + builder.Property(f => f.Amount).IsRequired().HasPrecision(18, 2); + + builder.HasOne(f => f.Organisation) + .WithMany() + .HasForeignKey(fk => fk.OrganisationId) + .IsRequired() + .OnDelete(DeleteBehavior.Restrict); + + builder.HasOne(f => f.Programme) + .WithMany(f => f.Awards) + .HasForeignKey(fk => fk.ProgrammeId) + .IsRequired() + .OnDelete(DeleteBehavior.Restrict); + + builder.HasOne(f => f.Project) + .WithMany(f => f.Awards) + .HasForeignKey(fk => fk.ProjectId) + .IsRequired(false) + .OnDelete(DeleteBehavior.SetNull); + + builder.HasOne(f => f.Creator) + .WithMany() + .HasForeignKey(fk => fk.CreatedBy) + .IsRequired() + .OnDelete(DeleteBehavior.NoAction); + + builder.HasOne(f => f.Updator) + .WithMany() + .HasForeignKey(fk => fk.UpdatedBy) + .IsRequired(false) + .OnDelete(DeleteBehavior.NoAction); + + builder.HasOne(f => f.Approver) + .WithMany() + .HasForeignKey(fk => fk.ApprovedBy) + .IsRequired(false) + .OnDelete(DeleteBehavior.NoAction); + } } \ No newline at end of file diff --git a/PostFundManagement.Domain/Entities/Beneficiary.cs b/PostFundManagement.Domain/Entities/Beneficiary.cs index d7a1c81..24f246a 100644 --- a/PostFundManagement.Domain/Entities/Beneficiary.cs +++ b/PostFundManagement.Domain/Entities/Beneficiary.cs @@ -1,6 +1,8 @@ +using static PostFundManagement.Domain.Extensions.Constants; + namespace PostFundManagement.Domain.Entities; -[EntityTypeConfiguration] +[EntityTypeConfiguration] public class Beneficiary : Models.Beneficiary { public virtual Project? Project { get; set; } @@ -8,4 +10,41 @@ public class Beneficiary : Models.Beneficiary public virtual User? Creator { get; set; } public virtual User? User { get; set; } +} + +public sealed class BeneficiaryConfiguration : IEntityTypeConfiguration +{ + public void Configure(EntityTypeBuilder builder) + { + builder.ToTable(nameof(Beneficiary).Pluralize()); + + builder.HasKey(pk => pk.Id); + builder.Property(f => f.ProjectId).IsRequired(); + builder.Property(f => f.CreatedBy).IsRequired(); + builder.Property(f => f.UserId).IsRequired(); + builder.Property(f => f.CreatedAt).IsRequired().HasDefaultValueSql("now()"); + builder.Property(f => f.Name).IsRequired().HasMaxLength(LabelLength); + builder.Property(f => f.Category).IsRequired().HasMaxLength(ShortLabelLength); + builder.Property(f => f.TargetCount).IsRequired(); + builder.Property(f => f.ReachedCount).IsRequired(); + builder.Property(f => f.Location).IsRequired(); + + builder.HasOne(f => f.Project) + .WithMany() + .HasForeignKey(fk => fk.ProjectId) + .IsRequired() + .OnDelete(DeleteBehavior.Restrict); + + builder.HasOne(f => f.Creator) + .WithMany() + .HasForeignKey(fk => fk.CreatedBy) + .IsRequired() + .OnDelete(DeleteBehavior.NoAction); + + builder.HasOne(f => f.User) + .WithMany() + .HasForeignKey(fk => fk.UserId) + .IsRequired() + .OnDelete(DeleteBehavior.NoAction); + } } \ No newline at end of file diff --git a/PostFundManagement.Domain/Entities/Budget.cs b/PostFundManagement.Domain/Entities/Budget.cs index 9dcdf0d..497d2b3 100644 --- a/PostFundManagement.Domain/Entities/Budget.cs +++ b/PostFundManagement.Domain/Entities/Budget.cs @@ -1,6 +1,8 @@ +using static PostFundManagement.Domain.Extensions.Constants; + namespace PostFundManagement.Domain.Entities; -[EntityTypeConfiguration] +[EntityTypeConfiguration] public class Budget : Models.Budget { public virtual Project? Project { get; set; } @@ -8,4 +10,39 @@ public class Budget : Models.Budget public virtual User? Creator { get; set; } public virtual User? Approver { get; set; } +} + +public sealed class BudgetConfiguration : IEntityTypeConfiguration +{ + public void Configure(EntityTypeBuilder builder) + { + builder.ToTable(nameof(Budget).Pluralize()); + + builder.HasKey(pk => pk.Id); + builder.Property(f => f.ProjectId).IsRequired(); + builder.Property(f => f.CreatedBy).IsRequired(); + builder.Property(f => f.ApprovedBy).IsRequired(false); + builder.Property(f => f.CreatedAt).IsRequired().HasDefaultValueSql("now()"); + builder.Property(f => f.UpdatedAt).IsRequired(false); + builder.Property(f => f.Name).IsRequired().HasMaxLength(LabelLength); + builder.Property(f => f.Amount).IsRequired().HasPrecision(18, 2); + + builder.HasOne(f => f.Project) + .WithMany() + .HasForeignKey(fk => fk.ProjectId) + .IsRequired() + .OnDelete(DeleteBehavior.Restrict); + + builder.HasOne(f => f.Creator) + .WithMany() + .HasForeignKey(fk => fk.CreatedBy) + .IsRequired() + .OnDelete(DeleteBehavior.NoAction); + + builder.HasOne(f => f.Approver) + .WithMany() + .HasForeignKey(fk => fk.ApprovedBy) + .IsRequired(false) + .OnDelete(DeleteBehavior.NoAction); + } } \ No newline at end of file diff --git a/PostFundManagement.Domain/Entities/ChangeRequest.cs b/PostFundManagement.Domain/Entities/ChangeRequest.cs index 542b6cd..e4b4f11 100644 --- a/PostFundManagement.Domain/Entities/ChangeRequest.cs +++ b/PostFundManagement.Domain/Entities/ChangeRequest.cs @@ -1,6 +1,8 @@ +using static PostFundManagement.Domain.Extensions.Constants; + namespace PostFundManagement.Domain.Entities; -[EntityTypeConfiguration] +[EntityTypeConfiguration] public class ChangeRequest : Models.ChangeRequest { public virtual Project? Project { get; set; } @@ -8,4 +10,43 @@ public class ChangeRequest : Models.ChangeRequest public virtual User? Creator { get; set; } public virtual User? Approver { get; set; } +} + +public sealed class ChangeRequestConfiguration : IEntityTypeConfiguration +{ + public void Configure(EntityTypeBuilder builder) + { + builder.ToTable(nameof(ChangeRequest).Pluralize()); + + builder.HasKey(pk => pk.Id); + builder.Property(f => f.ProjectId).IsRequired(); + builder.Property(f => f.CreatedBy).IsRequired(); + builder.Property(f => f.ApprovedBy).IsRequired(false); + builder.Property(f => f.CreatedAt).IsRequired().HasDefaultValueSql("now()"); + builder.Property(f => f.UpdatedAt).IsRequired(false); + builder.Property(f => f.Title).IsRequired().HasMaxLength(LabelLength); + builder.Property(f => f.Justification).IsRequired().HasMaxLength(TextLength); + builder.Property(f => f.RevisedBudget).IsRequired(false).HasPrecision(18, 2); + builder.Property(f => f.RevisedEndedAt).IsRequired(false); + builder.Property(f => f.Status).IsRequired().HasConversion().HasDefaultValueSql("1") + .HasSentinel(ApprovalStatus.Pending); + + builder.HasOne(f => f.Project) + .WithMany() + .HasForeignKey(fk => fk.ProjectId) + .IsRequired() + .OnDelete(DeleteBehavior.Restrict); + + builder.HasOne(f => f.Creator) + .WithMany() + .HasForeignKey(fk => fk.CreatedBy) + .IsRequired() + .OnDelete(DeleteBehavior.NoAction); + + builder.HasOne(f => f.Approver) + .WithMany() + .HasForeignKey(fk => fk.ApprovedBy) + .IsRequired(false) + .OnDelete(DeleteBehavior.NoAction); + } } \ No newline at end of file diff --git a/PostFundManagement.Domain/Entities/ComplianceItem.cs b/PostFundManagement.Domain/Entities/ComplianceItem.cs index a74e6fa..3ecf34a 100644 --- a/PostFundManagement.Domain/Entities/ComplianceItem.cs +++ b/PostFundManagement.Domain/Entities/ComplianceItem.cs @@ -1,6 +1,8 @@ +using static PostFundManagement.Domain.Extensions.Constants; + namespace PostFundManagement.Domain.Entities; -[EntityTypeConfiguration] +[EntityTypeConfiguration] public class ComplianceItem : Models.ComplianceItem { public virtual Project? Project { get; set; } @@ -8,4 +10,41 @@ public class ComplianceItem : Models.ComplianceItem public virtual User? Creator { get; set; } public virtual User? Verifier { get; set; } +} + +public sealed class ComplianceItemConfiguration : IEntityTypeConfiguration +{ + public void Configure(EntityTypeBuilder builder) + { + builder.ToTable(nameof(ComplianceItem).Pluralize()); + + builder.HasKey(pk => pk.Id); + builder.Property(f => f.ProjectId).IsRequired(); + builder.Property(f => f.CreatedBy).IsRequired(); + builder.Property(f => f.VerifiedBy).IsRequired(false); + builder.Property(f => f.CreatedAt).IsRequired().HasDefaultValueSql("now()"); + builder.Property(f => f.UpdatedAt).IsRequired(false); + builder.Property(f => f.Title).IsRequired().HasMaxLength(LabelLength); + builder.Property(f => f.Requirements).IsRequired().HasMaxLength(MediumTextLength); + builder.Property(f => f.Status).IsRequired().HasConversion().HasDefaultValueSql("1") + .HasSentinel(ApprovalStatus.Pending); + + builder.HasOne(f => f.Project) + .WithMany() + .HasForeignKey(fk => fk.ProjectId) + .IsRequired() + .OnDelete(DeleteBehavior.Restrict); + + builder.HasOne(f => f.Creator) + .WithMany() + .HasForeignKey(fk => fk.CreatedBy) + .IsRequired() + .OnDelete(DeleteBehavior.NoAction); + + builder.HasOne(f => f.Verifier) + .WithMany() + .HasForeignKey(fk => fk.VerifiedBy) + .IsRequired(false) + .OnDelete(DeleteBehavior.NoAction); + } } \ No newline at end of file diff --git a/PostFundManagement.Domain/Entities/Contract.cs b/PostFundManagement.Domain/Entities/Contract.cs index 4715b68..320c9d9 100644 --- a/PostFundManagement.Domain/Entities/Contract.cs +++ b/PostFundManagement.Domain/Entities/Contract.cs @@ -1,9 +1,43 @@ namespace PostFundManagement.Domain.Entities; -[EntityTypeConfiguration] +[EntityTypeConfiguration] public class Contract : Models.Contract { public virtual Award? Award { get; set; } public virtual User? Creator { get; set; } +} + +public sealed class ContractConfiguration : IEntityTypeConfiguration +{ + public void Configure(EntityTypeBuilder builder) + { + builder.ToTable(nameof(Contract).Pluralize()); + + builder.HasKey(pk => pk.Id); + builder.HasIndex(f => f.AwardId).IsUnique(); + + builder.Property(f => f.AwardId).IsRequired(); + builder.Property(f => f.CreatedBy).IsRequired(); + builder.Property(f => f.CreatedAt).IsRequired().HasDefaultValueSql("now()"); + builder.Property(f => f.ExternalSignatureId).IsRequired(false); + builder.Property(f => f.SignedDocumentUrl).IsRequired(false); + builder.Property(f => f.EffectiveAt).IsRequired(false); + builder.Property(f => f.ExpiresAt).IsRequired(false); + builder.Property(f => f.TotalValue).IsRequired().HasPrecision(18, 2); + builder.Property(f => f.Status).IsRequired().HasConversion().HasDefaultValueSql("1") + .HasSentinel(ContractStatus.Draft); + + builder.HasOne(f => f.Award) + .WithOne(f => f.Contract) + .HasForeignKey(fk => fk.AwardId) + .IsRequired() + .OnDelete(DeleteBehavior.Restrict); + + builder.HasOne(f => f.Creator) + .WithMany() + .HasForeignKey(fk => fk.CreatedBy) + .IsRequired() + .OnDelete(DeleteBehavior.NoAction); + } } \ No newline at end of file diff --git a/PostFundManagement.Domain/Entities/Disbursement.cs b/PostFundManagement.Domain/Entities/Disbursement.cs index 185cdc9..e59dd54 100644 --- a/PostFundManagement.Domain/Entities/Disbursement.cs +++ b/PostFundManagement.Domain/Entities/Disbursement.cs @@ -1,6 +1,6 @@ namespace PostFundManagement.Domain.Entities; -[EntityTypeConfiguration] +[EntityTypeConfiguration] public class Disbursement : Models.Disbursement { public virtual Project? Project { get; set; } @@ -10,4 +10,47 @@ public class Disbursement : Models.Disbursement public virtual User? Creator { get; set; } public virtual User? Updator { get; set; } +} + +public sealed class DisbursementConfiguration : IEntityTypeConfiguration +{ + public void Configure(EntityTypeBuilder builder) + { + builder.ToTable(nameof(Disbursement).Pluralize()); + + builder.HasKey(pk => pk.Id); + builder.Property(f => f.ProjectId).IsRequired(); + builder.Property(f => f.MilestoneId).IsRequired(false); + builder.Property(f => f.CreatedBy).IsRequired(); + builder.Property(f => f.UpdatedBy).IsRequired(false); + builder.Property(f => f.CreatedAt).IsRequired().HasDefaultValueSql("now()"); + builder.Property(f => f.UpdatedAt).IsRequired(false); + builder.Property(f => f.Amount).IsRequired().HasPrecision(18, 2); + builder.Property(f => f.Status).IsRequired().HasConversion().HasDefaultValueSql("1") + .HasSentinel(ApprovalStatus.Pending); + + builder.HasOne(f => f.Project) + .WithMany() + .HasForeignKey(fk => fk.ProjectId) + .IsRequired() + .OnDelete(DeleteBehavior.Restrict); + + builder.HasOne(f => f.Milestone) + .WithMany() + .HasForeignKey(fk => fk.MilestoneId) + .IsRequired(false) + .OnDelete(DeleteBehavior.Restrict); + + builder.HasOne(f => f.Creator) + .WithMany() + .HasForeignKey(fk => fk.CreatedBy) + .IsRequired() + .OnDelete(DeleteBehavior.NoAction); + + builder.HasOne(f => f.Updator) + .WithMany() + .HasForeignKey(fk => fk.UpdatedBy) + .IsRequired(false) + .OnDelete(DeleteBehavior.NoAction); + } } \ No newline at end of file diff --git a/PostFundManagement.Domain/Entities/Evidence.cs b/PostFundManagement.Domain/Entities/Evidence.cs index 4f5cc62..2fdb509 100644 --- a/PostFundManagement.Domain/Entities/Evidence.cs +++ b/PostFundManagement.Domain/Entities/Evidence.cs @@ -1,6 +1,6 @@ namespace PostFundManagement.Domain.Entities; -[EntityTypeConfiguration] +[EntityTypeConfiguration] public class Evidence : Models.Evidence { public virtual Project? Project { get; set; } @@ -14,4 +14,64 @@ public class Evidence : Models.Evidence public virtual User? Creator { get; set; } public virtual User? Updator { get; set; } +} + +public sealed class EvidenceConfiguration : IEntityTypeConfiguration +{ + public void Configure(EntityTypeBuilder builder) + { + builder.ToTable(nameof(Evidence).Pluralize()); + + builder.HasKey(f => f.Id); + builder.Property(f => f.ProjectId).IsRequired(); + builder.Property(f => f.MilestoneId).IsRequired(); + builder.Property(f => f.IndicatorId).IsRequired(); + builder.Property(f => f.ActivityId).IsRequired(); + builder.Property(f => f.CreatedBy).IsRequired(); + builder.Property(f => f.UpdatedBy).IsRequired(); + builder.Property(f => f.CreatedAt).IsRequired().HasDefaultValueSql("now()"); + builder.Property(f => f.UpdatedAt).IsRequired(false); + builder.Property(f => f.Version).IsRequired().HasDefaultValue(1); + builder.Property(f => f.DocumentUrl).IsRequired(); + builder.Property(f => f.Status).IsRequired().HasConversion().HasDefaultValueSql("1") + .HasSentinel(ApprovalStatus.Pending); + builder.Property(f => f.Type).IsRequired().HasConversion().HasDefaultValueSql("9") + .HasSentinel(EvidenceType.ProcurementDocument); + + builder.HasOne(f => f.Project) + .WithMany() + .HasForeignKey(fk => fk.ProjectId) + .IsRequired() + .OnDelete(DeleteBehavior.Restrict); + + builder.HasOne(f => f.Milestone) + .WithMany() + .HasForeignKey(fk => fk.MilestoneId) + .IsRequired() + .OnDelete(DeleteBehavior.Restrict); + + builder.HasOne(f => f.Indicator) + .WithMany() + .HasForeignKey(fk => fk.IndicatorId) + .IsRequired() + .OnDelete(DeleteBehavior.Restrict); + + builder.HasOne(f => f.Activity) + .WithMany(f => f.Evidences) + .HasForeignKey(fk => fk.ActivityId) + .IsRequired() + .OnDelete(DeleteBehavior.Restrict); + + builder.HasOne(f => f.Creator) + .WithMany() + .HasForeignKey(fk => fk.CreatedBy) + .IsRequired() + .OnDelete(DeleteBehavior.NoAction); + + builder.HasOne(f => f.Updator) + .WithMany() + .HasForeignKey(fk => fk.UpdatedBy) + .IsRequired(false) + .OnDelete(DeleteBehavior.NoAction); + } } \ No newline at end of file diff --git a/PostFundManagement.Domain/Entities/Indicator.cs b/PostFundManagement.Domain/Entities/Indicator.cs index 24283af..7fbdbde 100644 --- a/PostFundManagement.Domain/Entities/Indicator.cs +++ b/PostFundManagement.Domain/Entities/Indicator.cs @@ -1,9 +1,41 @@ +using static PostFundManagement.Domain.Extensions.Constants; + namespace PostFundManagement.Domain.Entities; -[EntityTypeConfiguration] +[EntityTypeConfiguration] public class Indicator : Models.Indicator { public virtual Project? Project { get; set; } public virtual User? Creator { get; set; } +} + +public sealed class IndicatorConfiguration : IEntityTypeConfiguration +{ + public void Configure(EntityTypeBuilder builder) + { + builder.ToTable(nameof(Indicator).Pluralize()); + + builder.HasKey(pk => pk.Id); + builder.Property(f => f.ProjectId).IsRequired(); + builder.Property(f => f.CreatedBy).IsRequired(); + builder.Property(f => f.CreatedAt).IsRequired().HasDefaultValueSql("now()"); + builder.Property(f => f.Name).IsRequired().HasMaxLength(LabelLength); + builder.Property(f => f.UnitOfMeasure).IsRequired().HasConversion().HasDefaultValueSql("2"); + builder.Property(f => f.BaselineAmount).IsRequired().HasPrecision(18, 2); + builder.Property(f => f.TargetAmount).IsRequired().HasPrecision(18, 2); + builder.Property(f => f.ActualAmount).IsRequired().HasPrecision(18, 2); + + builder.HasOne(f => f.Project) + .WithMany() + .HasForeignKey(fk => fk.ProjectId) + .IsRequired() + .OnDelete(DeleteBehavior.Restrict); + + builder.HasOne(f => f.Creator) + .WithMany() + .HasForeignKey(fk => fk.CreatedBy) + .IsRequired() + .OnDelete(DeleteBehavior.NoAction); + } } \ No newline at end of file diff --git a/PostFundManagement.Domain/Entities/Instrument.cs b/PostFundManagement.Domain/Entities/Instrument.cs index fcda49e..d4bd7ae 100644 --- a/PostFundManagement.Domain/Entities/Instrument.cs +++ b/PostFundManagement.Domain/Entities/Instrument.cs @@ -1,9 +1,41 @@ +using static PostFundManagement.Domain.Extensions.Constants; + namespace PostFundManagement.Domain.Entities; -[EntityTypeConfiguration] +[EntityTypeConfiguration] public class Instrument : Models.Instrument { public virtual User? Creator { get; set; } public virtual Programme? Programme { get; set; } -} \ No newline at end of file +} + +public sealed class InstrumentConfiguration : IEntityTypeConfiguration +{ + public void Configure(EntityTypeBuilder builder) + { + builder.ToTable(nameof(Instrument).Pluralize()); + + builder.HasKey(pk => pk.Id); + builder.Property(f => f.ProgrammeId).IsRequired(); + builder.Property(f => f.Code).IsRequired().HasMaxLength(ShortLabelLength); + builder.Property(f => f.Name).IsRequired().HasMaxLength(LabelLength); + builder.Property(f => f.Description).IsRequired(false).HasMaxLength(TextLength); + builder.Property(f => f.Status).IsRequired().HasConversion().HasDefaultValueSql("2") + .HasSentinel(ActivityStatus.Inactive); + builder.Property(f => f.CreatedBy).IsRequired(); + builder.Property(f => f.CreatedAt).IsRequired().HasDefaultValueSql("now()"); + + builder.HasOne(f => f.Programme) + .WithMany(f => f.Instruments) + .HasForeignKey(fk => fk.ProgrammeId) + .IsRequired() + .OnDelete(DeleteBehavior.Restrict); + + builder.HasOne(f => f.Creator) + .WithMany() + .HasForeignKey(fk => fk.CreatedBy) + .IsRequired() + .OnDelete(DeleteBehavior.NoAction); + } +} diff --git a/PostFundManagement.Domain/Entities/Invite.cs b/PostFundManagement.Domain/Entities/Invite.cs index 298290f..07e3cba 100644 --- a/PostFundManagement.Domain/Entities/Invite.cs +++ b/PostFundManagement.Domain/Entities/Invite.cs @@ -1,6 +1,6 @@ namespace PostFundManagement.Domain.Entities; -[EntityTypeConfiguration] +[EntityTypeConfiguration] public class Invite : Models.Invite { public virtual Organisation? Organisation { get; set; } @@ -12,4 +12,53 @@ public class Invite : Models.Invite public virtual Contract? Contract { get; set; } public virtual User? RecipientUser { get; set; } +} + +public sealed class InviteConfiguration : IEntityTypeConfiguration +{ + public void Configure(EntityTypeBuilder builder) + { + builder.ToTable(nameof(Invite).Pluralize()); + + builder.HasKey(pk => pk.Id); + builder.Property(f => f.OrganisationId).IsRequired(); + builder.Property(f => f.InvitedOrganisationId).IsRequired(); + builder.Property(f => f.AwardId).IsRequired(); + builder.Property(f => f.ContractId).IsRequired(); + builder.Property(f => f.Recipient).IsRequired(); + builder.Property(f => f.CreatedBy).IsRequired(); + builder.Property(f => f.UpdatedBy).IsRequired(false); + builder.Property(f => f.CreatedAt).IsRequired().HasDefaultValueSql("now()"); + builder.Property(f => f.UpdatedAt).IsRequired(false); + + builder.HasOne(f => f.Organisation) + .WithMany() + .HasForeignKey(fk => fk.OrganisationId) + .IsRequired() + .OnDelete(DeleteBehavior.Restrict); + + builder.HasOne(f => f.InvitedOrganisation) + .WithMany() + .HasForeignKey(fk => fk.InvitedOrganisationId) + .IsRequired() + .OnDelete(DeleteBehavior.Restrict); + + builder.HasOne(f => f.Award) + .WithMany() + .HasForeignKey(fk => fk.AwardId) + .IsRequired() + .OnDelete(DeleteBehavior.Restrict); + + builder.HasOne(f => f.Contract) + .WithMany() + .HasForeignKey(fk => fk.ContractId) + .IsRequired() + .OnDelete(DeleteBehavior.Restrict); + + builder.HasOne(f => f.RecipientUser) + .WithMany() + .HasForeignKey(fk => fk.Recipient) + .IsRequired() + .OnDelete(DeleteBehavior.Restrict); + } } \ No newline at end of file diff --git a/PostFundManagement.Domain/Entities/Issue.cs b/PostFundManagement.Domain/Entities/Issue.cs index dac7511..b4e8642 100644 --- a/PostFundManagement.Domain/Entities/Issue.cs +++ b/PostFundManagement.Domain/Entities/Issue.cs @@ -1,6 +1,8 @@ +using static PostFundManagement.Domain.Extensions.Constants; + namespace PostFundManagement.Domain.Entities; -[EntityTypeConfiguration] +[EntityTypeConfiguration] public class Issue : Models.Issue { public virtual Project? Project { get; set; } @@ -8,4 +10,44 @@ public class Issue : Models.Issue public virtual User? Creator { get; set; } public virtual User? Assignee { get; set; } +} + +public sealed class IssueConfiguration : IEntityTypeConfiguration +{ + public void Configure(EntityTypeBuilder builder) + { + builder.ToTable(nameof(Issue).Pluralize()); + + builder.HasKey(pk => pk.Id); + builder.Property(f => f.ProjectId).IsRequired(); + builder.Property(f => f.CreatedBy).IsRequired(); + builder.Property(f => f.CreatedAt).IsRequired().HasDefaultValueSql("now()"); + builder.Property(f => f.ResolvedAt).IsRequired(false); + builder.Property(f => f.AssignedTo).IsRequired(false); + builder.Property(f => f.Title).IsRequired().HasMaxLength(LabelLength); + builder.Property(f => f.Description).IsRequired().HasMaxLength(TextLength); + builder.Property(f => f.Priority).IsRequired().HasConversion().HasDefaultValueSql("1") + .HasSentinel(Priority.Low); + builder.Property(f => f.Status).IsRequired().HasConversion().HasDefaultValueSql("1") + .HasSentinel(ActivityStatus.Active); + builder.Property(f => f.Resolution).IsRequired(); + + builder.HasOne(f => f.Project) + .WithMany() + .HasForeignKey(fk => fk.ProjectId) + .IsRequired() + .OnDelete(DeleteBehavior.Restrict); + + builder.HasOne(f => f.Creator) + .WithMany() + .HasForeignKey(fk => fk.CreatedBy) + .IsRequired() + .OnDelete(DeleteBehavior.NoAction); + + builder.HasOne(f => f.Assignee) + .WithMany() + .HasForeignKey(fk => fk.AssignedTo) + .IsRequired() + .OnDelete(DeleteBehavior.SetNull); + } } \ No newline at end of file diff --git a/PostFundManagement.Domain/Entities/Milestone.cs b/PostFundManagement.Domain/Entities/Milestone.cs index bffad70..693f342 100644 --- a/PostFundManagement.Domain/Entities/Milestone.cs +++ b/PostFundManagement.Domain/Entities/Milestone.cs @@ -1,6 +1,8 @@ +using static PostFundManagement.Domain.Extensions.Constants; + namespace PostFundManagement.Domain.Entities; -[EntityTypeConfiguration] +[EntityTypeConfiguration] public class Milestone : Models.Milestone { public virtual Project? Project { get; set; } @@ -8,4 +10,43 @@ public class Milestone : Models.Milestone public virtual User? Creator { get; set; } public virtual User? Updator { get; set; } +} + +public sealed class MilestoneConfiguration : IEntityTypeConfiguration +{ + public void Configure(EntityTypeBuilder builder) + { + builder.ToTable(nameof(Milestone).Pluralize()); + + builder.HasKey(pk => pk.Id); + builder.Property(f => f.ProjectId).IsRequired(); + builder.Property(f => f.CreatedBy).IsRequired(); + builder.Property(f => f.UpdatedBy).IsRequired(false); + builder.Property(f => f.CreatedAt).IsRequired().HasDefaultValueSql("now()"); + builder.Property(f => f.UpdatedAt).IsRequired(false); + builder.Property(f => f.DueAt).IsRequired(); + builder.Property(f => f.Name).IsRequired().HasMaxLength(LabelLength); + builder.Property(f => f.Status).IsRequired().HasConversion().HasDefaultValueSql("1") + .HasSentinel(ApprovalStatus.Pending); + builder.Property(f => f.Priority).IsRequired().HasConversion().HasDefaultValueSql("1") + .HasSentinel(Priority.Low); + + builder.HasOne(f => f.Project) + .WithMany() + .HasForeignKey(fk => fk.ProjectId) + .IsRequired() + .OnDelete(DeleteBehavior.Restrict); + + builder.HasOne(f => f.Creator) + .WithMany() + .HasForeignKey(fk => fk.CreatedBy) + .IsRequired() + .OnDelete(DeleteBehavior.NoAction); + + builder.HasOne(f => f.Updator) + .WithMany() + .HasForeignKey(fk => fk.UpdatedBy) + .IsRequired(false) + .OnDelete(DeleteBehavior.NoAction); + } } \ No newline at end of file diff --git a/PostFundManagement.Domain/Entities/Notification.cs b/PostFundManagement.Domain/Entities/Notification.cs index d85b6b8..ce256f9 100644 --- a/PostFundManagement.Domain/Entities/Notification.cs +++ b/PostFundManagement.Domain/Entities/Notification.cs @@ -1,9 +1,46 @@ +using static PostFundManagement.Domain.Extensions.Constants; + namespace PostFundManagement.Domain.Entities; -[EntityTypeConfiguration] +[EntityTypeConfiguration] public class Notification : Models.Notification { public virtual Organisation? Organisation { get; set; } public virtual User? RecipientUser { get; set; } +} + +public sealed class NotificationConfiguration : IEntityTypeConfiguration +{ + public void Configure(EntityTypeBuilder builder) + { + builder.ToTable(nameof(Notification).Pluralize()); + + builder.HasKey(pk => pk.Id); + builder.Property(f => f.CreatedAt).IsRequired().HasDefaultValueSql("now()"); + builder.Property(f => f.UpdatedAt).IsRequired(false); + builder.Property(f => f.SentAt).IsRequired(false); + builder.Property(f => f.Recipient).IsRequired(); + builder.Property(f => f.OrganisationId).IsRequired(); + builder.Property(f => f.Platform).IsRequired().HasConversion().HasDefaultValueSql("1") + .HasSentinel(NotificationPlatform.Email); + builder.Property(f => f.Status).IsRequired().HasConversion().HasDefaultValueSql("1") + .HasSentinel(NotificationStatus.Pending); + builder.Property(f => f.Subject).IsRequired(false).HasMaxLength(LabelLength); + builder.Property(f => f.Message).IsRequired().HasMaxLength(LargeTextLength); + builder.Property(f => f.Destination).IsRequired().HasMaxLength(LabelLength); + builder.Property(f => f.Error).IsRequired(false); + + builder.HasOne(f => f.Organisation) + .WithMany() + .HasForeignKey(fk => fk.OrganisationId) + .IsRequired() + .OnDelete(DeleteBehavior.Restrict); + + builder.HasOne(f => f.RecipientUser) + .WithMany() + .HasForeignKey(fk => fk.Recipient) + .IsRequired() + .OnDelete(DeleteBehavior.Restrict); + } } \ No newline at end of file diff --git a/PostFundManagement.Domain/Entities/Organisation.cs b/PostFundManagement.Domain/Entities/Organisation.cs index 3c0ffbc..eb8a2ef 100644 --- a/PostFundManagement.Domain/Entities/Organisation.cs +++ b/PostFundManagement.Domain/Entities/Organisation.cs @@ -1,7 +1,34 @@ +using static PostFundManagement.Domain.Extensions.Constants; + namespace PostFundManagement.Domain.Entities; -[EntityTypeConfiguration] +[EntityTypeConfiguration] public class Organisation : Models.Organisation { public virtual User? Creator { get; set; } +} + +public sealed class OrganisationConfiguration : IEntityTypeConfiguration +{ + public void Configure(EntityTypeBuilder builder) + { + builder.ToTable(nameof(Organisation).Pluralize()); + + builder.HasKey(pk => pk.Id); + builder.Property(f => f.CreatedBy).IsRequired(); + builder.Property(f => f.CreatedAt).IsRequired().HasDefaultValueSql("now()"); + builder.Property(f => f.RegistrationNo).IsRequired().HasMaxLength(LabelLength); + builder.Property(f => f.Name).IsRequired().HasMaxLength(LabelLength); + builder.Property(f => f.Email).IsRequired().HasMaxLength(LabelLength); + builder.Property(f => f.Type).IsRequired().HasConversion().HasDefaultValueSql("5") + .HasSentinel(OrganisationType.PrivateLimitedCompany); + builder.Property(f => f.Status).IsRequired().HasConversion().HasDefaultValueSql("1") + .HasSentinel(ActivityStatus.Active); + + builder.HasOne(f => f.Creator) + .WithMany() + .HasForeignKey(fk => fk.CreatedBy) + .IsRequired() + .OnDelete(DeleteBehavior.NoAction); + } } \ No newline at end of file diff --git a/PostFundManagement.Domain/Entities/Outcome.cs b/PostFundManagement.Domain/Entities/Outcome.cs index 7e29e82..dc6f43b 100644 --- a/PostFundManagement.Domain/Entities/Outcome.cs +++ b/PostFundManagement.Domain/Entities/Outcome.cs @@ -1,9 +1,38 @@ +using static PostFundManagement.Domain.Extensions.Constants; + namespace PostFundManagement.Domain.Entities; -[EntityTypeConfiguration] +[EntityTypeConfiguration] public class Outcome : Models.Outcome { public virtual Beneficiary? Beneficiary { get; set; } public virtual User? Creator { get; set; } +} + +public sealed class OutcomeConfiguration : IEntityTypeConfiguration +{ + public void Configure(EntityTypeBuilder builder) + { + builder.ToTable(nameof(Outcome).Pluralize()); + + builder.HasKey(pk => pk.Id); + builder.Property(f => f.BeneficiaryId).IsRequired(); + builder.Property(f => f.CreatedBy).IsRequired(); + builder.Property(f => f.CreatedAt).IsRequired().HasDefaultValueSql("now()"); + builder.Property(f => f.Name).IsRequired().HasMaxLength(LabelLength); + builder.Property(f => f.Description).IsRequired().HasMaxLength(TextLength); + + builder.HasOne(f => f.Beneficiary) + .WithMany() + .HasForeignKey(fk => fk.BeneficiaryId) + .IsRequired() + .OnDelete(DeleteBehavior.Restrict); + + builder.HasOne(f => f.Creator) + .WithMany() + .HasForeignKey(fk => fk.CreatedBy) + .IsRequired() + .OnDelete(DeleteBehavior.NoAction); + } } \ No newline at end of file diff --git a/PostFundManagement.Domain/Entities/Portfolio.cs b/PostFundManagement.Domain/Entities/Portfolio.cs index 9117a5c..9b48583 100644 --- a/PostFundManagement.Domain/Entities/Portfolio.cs +++ b/PostFundManagement.Domain/Entities/Portfolio.cs @@ -1,6 +1,8 @@ +using static PostFundManagement.Domain.Extensions.Constants; + namespace PostFundManagement.Domain.Entities; -[EntityTypeConfiguration] +[EntityTypeConfiguration] public class Portfolio : Models.Portfolio { public virtual User? Creator { get; set; } @@ -11,3 +13,37 @@ public class Portfolio : Models.Portfolio public virtual ICollection Programmes { get; set; } = []; } + +public sealed class PortfolioConfiguration : IEntityTypeConfiguration +{ + public void Configure(EntityTypeBuilder builder) + { + builder.ToTable(nameof(Portfolio).Pluralize()); + + builder.HasKey(pk => pk.Id); + builder.Property(f => f.OrganisationId).IsRequired(); + builder.Property(f => f.CreatedBy).IsRequired(); + builder.Property(f => f.OwnedBy).IsRequired(); + builder.Property(f => f.CreatedAt).IsRequired().HasDefaultValueSql("now()"); + builder.Property(f => f.Name).IsRequired().HasMaxLength(LabelLength); + builder.Property(f => f.Description).IsRequired(false).HasMaxLength(TextLength); + + builder.HasOne(f => f.Organisation) + .WithMany() + .HasForeignKey(fk => fk.OrganisationId) + .IsRequired() + .OnDelete(DeleteBehavior.Restrict); + + builder.HasOne(f => f.Creator) + .WithMany() + .HasForeignKey(fk => fk.CreatedBy) + .IsRequired() + .OnDelete(DeleteBehavior.NoAction); + + builder.HasOne(f => f.Owner) + .WithMany() + .HasForeignKey(fk => fk.OwnedBy) + .IsRequired() + .OnDelete(DeleteBehavior.NoAction); + } +} \ No newline at end of file diff --git a/PostFundManagement.Domain/Entities/Programme.cs b/PostFundManagement.Domain/Entities/Programme.cs index aa199db..052a261 100644 --- a/PostFundManagement.Domain/Entities/Programme.cs +++ b/PostFundManagement.Domain/Entities/Programme.cs @@ -1,6 +1,8 @@ +using static PostFundManagement.Domain.Extensions.Constants; + namespace PostFundManagement.Domain.Entities; -[EntityTypeConfiguration] +[EntityTypeConfiguration] public class Programme : Models.Programme { public virtual User? Creator { get; set; } @@ -16,4 +18,41 @@ public class Programme : Models.Programme public virtual ICollection Projects { get; set; } = []; public virtual ICollection Awards { get; set; } = []; +} + +public sealed class ProgrammeConfiguration : IEntityTypeConfiguration +{ + public void Configure(EntityTypeBuilder builder) + { + builder.ToTable(nameof(Programme).Pluralize()); + + builder.HasKey(pk => pk.Id); + builder.Property(f => f.PortfolioId).IsRequired(); + builder.Property(f => f.OwnedBy).IsRequired(); + builder.Property(f => f.CreatedBy).IsRequired(); + builder.Property(f => f.UpdatedBy).IsRequired(false); + builder.Property(f => f.CreatedAt).IsRequired().HasDefaultValueSql("now()"); + builder.Property(f => f.UpdatedAt).IsRequired(false); + builder.Property(f => f.Name).IsRequired().HasMaxLength(LabelLength); + builder.Property(f => f.Status).IsRequired().HasConversion().HasDefaultValueSql("1") + .HasSentinel(ApprovalStatus.Pending); + + builder.HasOne(f => f.Portfolio) + .WithMany(f => f.Programmes) + .HasForeignKey(fk => fk.PortfolioId) + .IsRequired() + .OnDelete(DeleteBehavior.NoAction); + + builder.HasOne(f => f.Creator) + .WithMany() + .HasForeignKey(fk => fk.CreatedBy) + .IsRequired() + .OnDelete(DeleteBehavior.NoAction); + + builder.HasOne(f => f.Owner) + .WithMany() + .IsRequired() + .HasForeignKey(fk => fk.OwnedBy) + .OnDelete(DeleteBehavior.NoAction); + } } \ No newline at end of file diff --git a/PostFundManagement.Domain/Entities/Project.cs b/PostFundManagement.Domain/Entities/Project.cs index 5840cf0..3bbfa25 100644 --- a/PostFundManagement.Domain/Entities/Project.cs +++ b/PostFundManagement.Domain/Entities/Project.cs @@ -1,6 +1,8 @@ +using static PostFundManagement.Domain.Extensions.Constants; + namespace PostFundManagement.Domain.Entities; -[EntityTypeConfiguration] +[EntityTypeConfiguration] public class Project : Models.Project { public virtual User? Creator { get; set; } @@ -10,4 +12,47 @@ public class Project : Models.Project public virtual Programme? Programme { get; set; } public virtual ICollection Awards { get; set; } = []; +} + +public sealed class ProjectConfiguration : IEntityTypeConfiguration +{ + public void Configure(EntityTypeBuilder builder) + { + builder.ToTable(nameof(Project).Pluralize()); + + builder.HasKey(pk => pk.Id); + builder.Property(f => f.ProgrammeId).IsRequired(); + builder.Property(f => f.CreatedBy).IsRequired(); + builder.Property(f => f.UpdatedBy).IsRequired(false); + builder.Property(f => f.CreatedAt).IsRequired().HasDefaultValueSql("now()"); + builder.Property(f => f.UpdatedAt).IsRequired(false); + builder.Property(f => f.StartedAt).IsRequired(false); + builder.Property(f => f.EndedAt).IsRequired(false); + builder.Property(f => f.Name).IsRequired().HasMaxLength(LabelLength); + builder.Property(f => f.Description).IsRequired().HasMaxLength(TextLength); + builder.Property(f => f.Sector).IsRequired().HasConversion().HasDefaultValueSql("11") + .HasSentinel(IndustrySector.InformationCommunicationTechnology); + builder.Property(f => f.ProjectType).IsRequired().HasConversion().HasDefaultValueSql("10") + .HasSentinel(ProjectType.Innovation); + builder.Property(f => f.Status).IsRequired().HasConversion().HasDefaultValueSql("1") + .HasSentinel(ApprovalStatus.Pending); + + builder.HasOne(f => f.Programme) + .WithMany(f => f.Projects) + .HasForeignKey(fk => fk.ProgrammeId) + .IsRequired() + .OnDelete(DeleteBehavior.Restrict); + + builder.HasOne(f => f.Creator) + .WithMany() + .HasForeignKey(fk => fk.CreatedBy) + .IsRequired() + .OnDelete(DeleteBehavior.NoAction); + + builder.HasOne(f => f.Updator) + .WithMany() + .HasForeignKey(fk => fk.UpdatedBy) + .IsRequired(false) + .OnDelete(DeleteBehavior.NoAction); + } } \ No newline at end of file diff --git a/PostFundManagement.Domain/Entities/Risk.cs b/PostFundManagement.Domain/Entities/Risk.cs index 0750956..9686fa9 100644 --- a/PostFundManagement.Domain/Entities/Risk.cs +++ b/PostFundManagement.Domain/Entities/Risk.cs @@ -1,9 +1,42 @@ +using static PostFundManagement.Domain.Extensions.Constants; + namespace PostFundManagement.Domain.Entities; -[EntityTypeConfiguration] +[EntityTypeConfiguration] public class Risk : Models.Risk { public virtual Project? Project { get; set; } public virtual User? Creator { get; set; } +} + +public sealed class RiskConfiguration : IEntityTypeConfiguration +{ + public void Configure(EntityTypeBuilder builder) + { + builder.ToTable(nameof(Risk).Pluralize()); + + builder.HasKey(pk => pk.Id); + builder.Property(f => f.ProjectId).IsRequired(); + builder.Property(f => f.CreatedBy).IsRequired(); + builder.Property(f => f.CreatedAt).IsRequired().HasDefaultValueSql("now()"); + builder.Property(f => f.Likelihood).IsRequired().HasConversion().HasDefaultValueSql("3") + .HasSentinel(RiskLikelihood.Possible); + builder.Property(f => f.Impact).IsRequired().HasConversion().HasDefaultValueSql("1") + .HasSentinel(RiskImpact.Negligible); + builder.Property(f => f.Name).IsRequired().HasMaxLength(LabelLength); + builder.Property(f => f.Description).IsRequired().HasMaxLength(TextLength); + + builder.HasOne(f => f.Project) + .WithMany() + .HasForeignKey(fk => fk.ProjectId) + .IsRequired() + .OnDelete(DeleteBehavior.Restrict); + + builder.HasOne(f => f.Creator) + .WithMany() + .HasForeignKey(fk => fk.CreatedBy) + .IsRequired() + .OnDelete(DeleteBehavior.NoAction); + } } \ No newline at end of file diff --git a/PostFundManagement.Domain/Entities/Rule.cs b/PostFundManagement.Domain/Entities/Rule.cs index ed1c9e6..cac2969 100644 --- a/PostFundManagement.Domain/Entities/Rule.cs +++ b/PostFundManagement.Domain/Entities/Rule.cs @@ -1,6 +1,8 @@ +using static PostFundManagement.Domain.Extensions.Constants; + namespace PostFundManagement.Domain.Entities; -[EntityTypeConfiguration] +[EntityTypeConfiguration] public class Rule : Models.Rule { public virtual User? Creator { get; set; } @@ -8,4 +10,41 @@ public class Rule : Models.Rule public virtual User? Updator { get; set; } public virtual Programme? Programme { get; set; } +} + +public sealed class RuleConfiguration : IEntityTypeConfiguration +{ + public void Configure(EntityTypeBuilder builder) + { + builder.ToTable(nameof(Rule).Pluralize()); + + builder.HasKey(fk => fk.Id); + builder.Property(f => f.ProgrammeId).IsRequired(); + builder.Property(f => f.CreatedBy).IsRequired(); + builder.Property(f => f.UpdatedBy).IsRequired(false); + builder.Property(f => f.CreatedAt).IsRequired().HasDefaultValueSql("now()"); + builder.Property(f => f.UpdatedAt).IsRequired(false); + builder.Property(f => f.Name).IsRequired().HasMaxLength(LabelLength); + builder.Property(f => f.Version).IsRequired().HasDefaultValue(1); + builder.Property(f => f.Status).IsRequired().HasConversion().HasDefaultValueSql("2") + .HasSentinel(ActivityStatus.Inactive); + + builder.HasOne(f => f.Programme) + .WithMany(f => f.Rules) + .HasForeignKey(fk => fk.ProgrammeId) + .IsRequired() + .OnDelete(DeleteBehavior.NoAction); + + builder.HasOne(f => f.Creator) + .WithMany() + .HasForeignKey(fk => fk.CreatedBy) + .IsRequired() + .OnDelete(DeleteBehavior.NoAction); + + builder.HasOne(f => f.Updator) + .WithMany() + .HasForeignKey(fk => fk.UpdatedBy) + .IsRequired(false) + .OnDelete(DeleteBehavior.NoAction); + } } \ No newline at end of file diff --git a/PostFundManagement.Domain/Entities/SiteVisit.cs b/PostFundManagement.Domain/Entities/SiteVisit.cs index 3efab66..9d46ce9 100644 --- a/PostFundManagement.Domain/Entities/SiteVisit.cs +++ b/PostFundManagement.Domain/Entities/SiteVisit.cs @@ -1,9 +1,41 @@ +using static PostFundManagement.Domain.Extensions.Constants; + namespace PostFundManagement.Domain.Entities; -[EntityTypeConfiguration] +[EntityTypeConfiguration] public class SiteVisit : Models.SiteVisit { public virtual Project? Project { get; set; } public virtual User? Creator { get; set; } +} + +public sealed class SiteVisitConfiguration : IEntityTypeConfiguration +{ + public void Configure(EntityTypeBuilder builder) + { + builder.ToTable(nameof(SiteVisit).Pluralize()); + + builder.HasKey(pk => pk.Id); + builder.Property(f => f.ProjectId).IsRequired(); + builder.Property(f => f.CreatedBy).IsRequired(); + builder.Property(f => f.CreatedAt).IsRequired().HasDefaultValueSql("now()"); + builder.Property(f => f.VisitedAt).IsRequired(); + builder.Property(f => f.InspectorName).IsRequired(); + builder.Property(f => f.Findings).IsRequired(false).HasMaxLength(LargeTextLength); + builder.Property(f => f.Status).IsRequired().HasConversion().HasDefaultValueSql("1") + .HasSentinel(ApprovalStatus.Pending); + + builder.HasOne(f => f.Project) + .WithMany() + .HasForeignKey(fk => fk.ProjectId) + .IsRequired() + .OnDelete(DeleteBehavior.Restrict); + + builder.HasOne(f => f.Creator) + .WithMany() + .HasForeignKey(fk => fk.CreatedBy) + .IsRequired() + .OnDelete(DeleteBehavior.NoAction); + } } \ No newline at end of file diff --git a/PostFundManagement.Domain/Entities/Tenant.cs b/PostFundManagement.Domain/Entities/Tenant.cs new file mode 100644 index 0000000..6bab5aa --- /dev/null +++ b/PostFundManagement.Domain/Entities/Tenant.cs @@ -0,0 +1,40 @@ +using static PostFundManagement.Domain.Extensions.Constants; + +namespace PostFundManagement.Domain.Entities; + +[EntityTypeConfiguration] +public class Tenant : Models.Tenant +{ + public virtual User? Creator { get; set; } + + public virtual User? Updator { get; set; } +} + +public sealed class TenantConfiguration : IEntityTypeConfiguration +{ + public void Configure(EntityTypeBuilder builder) + { + builder.ToTable(nameof(Tenant).Pluralize()); + + builder.HasKey(pk => pk.Id); + builder.Property(f => f.CreatedAt).IsRequired().HasDefaultValueSql("now()"); + builder.Property(f => f.CreatedBy).IsRequired(); + builder.Property(f => f.UpdatedBy).IsRequired(false); + builder.Property(f => f.UpdatedAt).IsRequired(false); + builder.Property(f => f.Name).IsRequired().HasMaxLength(LabelLength); + builder.Property(f => f.Status).IsRequired().HasConversion().HasDefaultValueSql("1") + .HasSentinel(ActivityStatus.Active); + + builder.HasOne(f => f.Creator) + .WithMany() + .HasForeignKey(fk => fk.CreatedBy) + .IsRequired() + .OnDelete(DeleteBehavior.Restrict); + + builder.HasOne(f => f.Updator) + .WithMany() + .HasForeignKey(fk => fk.UpdatedBy) + .IsRequired(false) + .OnDelete(DeleteBehavior.Restrict); + } +} \ No newline at end of file diff --git a/PostFundManagement.Domain/Entities/TenantOrganisation.cs b/PostFundManagement.Domain/Entities/TenantOrganisation.cs new file mode 100644 index 0000000..bf3cc15 --- /dev/null +++ b/PostFundManagement.Domain/Entities/TenantOrganisation.cs @@ -0,0 +1,45 @@ +namespace PostFundManagement.Domain.Entities; + +[EntityTypeConfiguration] +public class TenantOrganisation : Models.TenantOrganisation +{ + public virtual Tenant? Tenant { get; set; } + + public virtual Organisation? Organisation { get; set; } + + public virtual User? Creator { get; set; } +} + +public sealed class TenantOrganisationConfiguration : IEntityTypeConfiguration +{ + public void Configure(EntityTypeBuilder builder) + { + builder.ToTable(nameof(TenantOrganisation).Pluralize()); + + builder.HasKey(pk => pk.Id); + builder.Property(f => f.CreatedAt).IsRequired().HasDefaultValueSql("now()"); + builder.Property(f => f.CreatedBy).IsRequired(); + builder.Property(f => f.TenantId).IsRequired(); + builder.Property(f => f.OrganisationId).IsRequired(); + builder.Property(f => f.Status).IsRequired().HasConversion().HasDefaultValueSql("1") + .HasSentinel(ActivityStatus.Active); + + builder.HasOne(f => f.Tenant) + .WithMany() + .HasForeignKey(fk => fk.TenantId) + .IsRequired() + .OnDelete(DeleteBehavior.Restrict); + + builder.HasOne(f => f.Organisation) + .WithMany() + .HasForeignKey(fk => fk.OrganisationId) + .IsRequired() + .OnDelete(DeleteBehavior.Restrict); + + builder.HasOne(f => f.Creator) + .WithMany() + .HasForeignKey(fk => fk.CreatedBy) + .IsRequired() + .OnDelete(DeleteBehavior.Restrict); + } +} diff --git a/PostFundManagement.Domain/Entities/TenantUser.cs b/PostFundManagement.Domain/Entities/TenantUser.cs new file mode 100644 index 0000000..cca0418 --- /dev/null +++ b/PostFundManagement.Domain/Entities/TenantUser.cs @@ -0,0 +1,39 @@ +namespace PostFundManagement.Domain.Entities; + +[EntityTypeConfiguration] +public class TenantUser : Models.TenantUser +{ + public virtual Tenant? Tenant { get; set; } + + public virtual User? Creator { get; set; } + + public virtual User? User { get; set; } +} + +public sealed class TenantUserConfiguration : IEntityTypeConfiguration +{ + public void Configure(EntityTypeBuilder builder) + { + builder.ToTable(nameof(TenantUser).Pluralize()); + + builder.HasKey(pk => pk.Id); + builder.Property(f => f.CreatedAt).IsRequired().HasDefaultValueSql("now()"); + builder.Property(f => f.CreatedBy).IsRequired(); + builder.Property(f => f.UserId).IsRequired(); + builder.Property(f => f.TenantId).IsRequired(); + builder.Property(f => f.Status).IsRequired().HasConversion().HasDefaultValueSql("1") + .HasSentinel(ActivityStatus.Active); + + builder.HasOne(f => f.Tenant) + .WithMany() + .HasForeignKey(fk => fk.TenantId) + .IsRequired() + .OnDelete(DeleteBehavior.Restrict); + + builder.HasOne(f => f.Creator) + .WithMany() + .HasForeignKey(fk => fk.CreatedBy) + .IsRequired() + .OnDelete(DeleteBehavior.Restrict); + } +} diff --git a/PostFundManagement.Domain/Entities/User.cs b/PostFundManagement.Domain/Entities/User.cs index 19633b8..da7a74e 100644 --- a/PostFundManagement.Domain/Entities/User.cs +++ b/PostFundManagement.Domain/Entities/User.cs @@ -1,4 +1,20 @@ +using static PostFundManagement.Domain.Extensions.Constants; + namespace PostFundManagement.Domain.Entities; -[EntityTypeConfiguration] -public sealed class User : Models.User; \ No newline at end of file +[EntityTypeConfiguration] +public sealed class User : Models.User; + +public sealed class UserConfiguration : IEntityTypeConfiguration +{ + public void Configure(EntityTypeBuilder builder) + { + builder.ToTable(nameof(User).Pluralize()); + + builder.HasKey(pk => pk.Id); + builder.Property(f => f.Email).IsRequired().HasMaxLength(LabelLength); + builder.Property(f => f.Status).IsRequired().HasConversion().HasDefaultValueSql("2") + .HasSentinel(ActivityStatus.Inactive); + builder.Property(f => f.LastLoginAt).IsRequired(false); + } +} \ No newline at end of file diff --git a/PostFundManagement.Domain/Models/Tenant.cs b/PostFundManagement.Domain/Models/Tenant.cs new file mode 100644 index 0000000..d46ad75 --- /dev/null +++ b/PostFundManagement.Domain/Models/Tenant.cs @@ -0,0 +1,18 @@ +namespace PostFundManagement.Domain.Models; + +public class Tenant +{ + public long Id { get; set; } + + public DateTime CreatedAt { get; set; } + + public Guid CreatedBy { get; set; } + + public DateTime UpdatedAt { get; set; } + + public Guid UpdatedBy { get; set; } + + public string? Name { get; set; } + + public ActivityStatus Status { get; set; } +} diff --git a/PostFundManagement.Domain/Models/TenantOrganisation.cs b/PostFundManagement.Domain/Models/TenantOrganisation.cs new file mode 100644 index 0000000..5e1e17f --- /dev/null +++ b/PostFundManagement.Domain/Models/TenantOrganisation.cs @@ -0,0 +1,16 @@ +namespace PostFundManagement.Domain.Models; + +public class TenantOrganisation +{ + public long Id { get; set; } + + public DateTime CreatedAt { get; set; } + + public Guid CreatedBy { get; set; } + + public long TenantId { get; set; } + + public long OrganisationId { get; set; } + + public ActivityStatus Status { get; set; } +} diff --git a/PostFundManagement.Domain/Models/TenantUser.cs b/PostFundManagement.Domain/Models/TenantUser.cs new file mode 100644 index 0000000..c9d5911 --- /dev/null +++ b/PostFundManagement.Domain/Models/TenantUser.cs @@ -0,0 +1,16 @@ +namespace PostFundManagement.Domain.Models; + +public class TenantUser +{ + public long Id { get; set; } + + public DateTime CreatedAt { get; set; } + + public Guid CreatedBy { get; set; } + + public long TenantId { get; set; } + + public Guid UserId { get; set; } + + public ActivityStatus Status { get; set; } +} diff --git a/PostFundManagement.Domain/PostFundManagement.Domain.csproj b/PostFundManagement.Domain/PostFundManagement.Domain.csproj index b176c43..52e4769 100644 --- a/PostFundManagement.Domain/PostFundManagement.Domain.csproj +++ b/PostFundManagement.Domain/PostFundManagement.Domain.csproj @@ -9,6 +9,14 @@ ..\LICENSE + + 1701;1702;MA0048 + + + + 1701;1702;MA0048 + + diff --git a/PostFundManagement.Infrastructure/Database/ApplicationDbContext.cs b/PostFundManagement.Infrastructure/Database/ApplicationDbContext.cs index 0f4a87b..27b8776 100644 --- a/PostFundManagement.Infrastructure/Database/ApplicationDbContext.cs +++ b/PostFundManagement.Infrastructure/Database/ApplicationDbContext.cs @@ -4,6 +4,12 @@ namespace PostFundManagement.Infrastructure.Database; public sealed class ApplicationDbContext(DbContextOptions options) : DbContext(options) { + public DbSet TenantUsers => Set(); + + public DbSet TenantOrganisations => Set(); + + public DbSet Tenants => Set(); + public DbSet Notifications => Set(); public DbSet Invites => Set();