diff --git a/applications/Unity.GrantManager/modules/Unity.Flex/src/Unity.Flex.Application/Domain/Services/WorksheetsManager.cs b/applications/Unity.GrantManager/modules/Unity.Flex/src/Unity.Flex.Application/Domain/Services/WorksheetsManager.cs index d1eb4964b..a367feaa7 100644 --- a/applications/Unity.GrantManager/modules/Unity.Flex/src/Unity.Flex.Application/Domain/Services/WorksheetsManager.cs +++ b/applications/Unity.GrantManager/modules/Unity.Flex/src/Unity.Flex.Application/Domain/Services/WorksheetsManager.cs @@ -179,9 +179,13 @@ private async Task CreateNewWorksheetInstanceAsync(IWorksheet if (worksheet != null) { - var worksheetLink = await worksheetLinkRepository.GetExistingLinkAsync(worksheet.Id, eventData.SheetCorrelationId, eventData.SheetCorrelationProvider); + var worksheetLink = await worksheetLinkRepository.GetExistingLinkAsync(worksheet.Id, + eventData.SheetCorrelationId, + eventData.SheetCorrelationProvider); - if (worksheetLink != null) + // Make sure we do not create an instance if it already exists + if (worksheetLink != null + && !(await WorksheetInstanceAlreadyExists(worksheet.Id, eventData, worksheetLink.UiAnchor))) { var newInstance = new WorksheetInstance(Guid.NewGuid(), worksheet.Id, @@ -210,6 +214,18 @@ private async Task CreateNewWorksheetInstanceAsync(IWorksheet return newWorksheetInstances; } + private async Task WorksheetInstanceAlreadyExists(Guid worksheetId, + CreateWorksheetInstanceByFieldValuesEto eventData, + string uiAnchor) + { + return await worksheetInstanceRepository.ExistsAsync(worksheetId, + eventData.InstanceCorrelationId, + eventData.InstanceCorrelationProvider, + eventData.SheetCorrelationId, + eventData.SheetCorrelationProvider, + uiAnchor); + } + public async Task CloneWorksheetAsync(Guid id) { var worksheet = await worksheetRepository.GetAsync(id, true); diff --git a/applications/Unity.GrantManager/modules/Unity.Flex/src/Unity.Flex.Application/Domain/WorksheetInstances/IWorksheetInstanceRepository.cs b/applications/Unity.GrantManager/modules/Unity.Flex/src/Unity.Flex.Application/Domain/WorksheetInstances/IWorksheetInstanceRepository.cs index caf8ee5a4..54d1767d5 100644 --- a/applications/Unity.GrantManager/modules/Unity.Flex/src/Unity.Flex.Application/Domain/WorksheetInstances/IWorksheetInstanceRepository.cs +++ b/applications/Unity.GrantManager/modules/Unity.Flex/src/Unity.Flex.Application/Domain/WorksheetInstances/IWorksheetInstanceRepository.cs @@ -11,5 +11,6 @@ public interface IWorksheetInstanceRepository : IBasicRepository GetByCorrelationAnchorAsync(Guid correlationId, string correlationProvider, string uiAnchor, bool includeDetails); Task> GetByWorksheetCorrelationAsync(Guid worksheetId, string uiAnchor, Guid worksheetCorrelationId, string worksheetCorrelationProvider); Task GetWithValuesAsync(Guid worksheetInstanceId); + Task ExistsAsync(Guid worksheetId, Guid instanceCorrelationId, string instanceCorrelationProvider, Guid sheetCorrelationId, string sheetCorrelationProvider, string? uiAnchor); } } diff --git a/applications/Unity.GrantManager/modules/Unity.Flex/src/Unity.Flex.Application/EntityFrameworkCore/Repositories/WorksheetInstanceRepository.cs b/applications/Unity.GrantManager/modules/Unity.Flex/src/Unity.Flex.Application/EntityFrameworkCore/Repositories/WorksheetInstanceRepository.cs index b9436d2fe..e050aa414 100644 --- a/applications/Unity.GrantManager/modules/Unity.Flex/src/Unity.Flex.Application/EntityFrameworkCore/Repositories/WorksheetInstanceRepository.cs +++ b/applications/Unity.GrantManager/modules/Unity.Flex/src/Unity.Flex.Application/EntityFrameworkCore/Repositories/WorksheetInstanceRepository.cs @@ -62,5 +62,23 @@ public async Task> GetByWorksheetCorrelationAsync(Guid w .Include(wi => wi.Values) .FirstOrDefaultAsync(wi => wi.Id == worksheetInstanceId); } + + public async Task ExistsAsync(Guid worksheetId, + Guid instanceCorrelationId, + string instanceCorrelationProvider, + Guid sheetCorrelationId, + string sheetCorrelationProvider, + string? uiAnchor) + { + var dbSet = await GetDbSetAsync(); + + return await dbSet + .AnyAsync(s => s.WorksheetId == worksheetId + && s.CorrelationId == instanceCorrelationId + && s.CorrelationProvider == instanceCorrelationProvider + && s.WorksheetCorrelationId == sheetCorrelationId + && s.WorksheetCorrelationProvider == sheetCorrelationProvider + && s.UiAnchor == uiAnchor); + } } } diff --git a/applications/Unity.GrantManager/modules/Unity.Flex/src/Unity.Flex.Application/Handlers/CreateWorksheetInstanceByFieldValuesHandler.cs b/applications/Unity.GrantManager/modules/Unity.Flex/src/Unity.Flex.Application/Handlers/CreateWorksheetInstanceByFieldValuesHandler.cs index e8010b49e..2be466070 100644 --- a/applications/Unity.GrantManager/modules/Unity.Flex/src/Unity.Flex.Application/Handlers/CreateWorksheetInstanceByFieldValuesHandler.cs +++ b/applications/Unity.GrantManager/modules/Unity.Flex/src/Unity.Flex.Application/Handlers/CreateWorksheetInstanceByFieldValuesHandler.cs @@ -9,14 +9,44 @@ using Unity.Flex.Worksheets.Collectors; using Volo.Abp.DependencyInjection; using Volo.Abp.EventBus; +using Volo.Abp.MultiTenancy; namespace Unity.Flex.Handlers { - public class CreateWorksheetInstanceByFieldValuesHandler(WorksheetsManager worksheetsManager, IServiceProvider serviceProvider) : ILocalEventHandler, ITransientDependency + /// + /// Handles creating worksheet instances from field values. + /// + /// Tenant context handling: + /// - If the request comes through a route with {__tenant} parameter, ABP automatically sets the tenant context + /// - If the request is processed via an ABP background job, tenant context is preserved automatically + /// - If TenantId is explicitly set on the CreateWorksheetInstanceByFieldValuesEto, it will be used when current tenant is null + /// + public class CreateWorksheetInstanceByFieldValuesHandler(WorksheetsManager worksheetsManager, + IServiceProvider serviceProvider, + ICurrentTenant currentTenant) + : ILocalEventHandler, ITransientDependency { public async Task HandleEventAsync(CreateWorksheetInstanceByFieldValuesEto eventData) { - List<(Worksheet worksheet, WorksheetInstance worksheetIntance)> workSheetInstancePairs = await worksheetsManager.CreateWorksheetDataByFields(eventData); + // If current tenant is null but eventData provides a TenantId, use it + if (currentTenant.Id == null && eventData.TenantId.HasValue) + { + using (currentTenant.Change(eventData.TenantId)) + { + await ProcessWorksheetInstancesAsync(eventData); + } + } + else + { + // Continue with current tenant context (could be null/host or already set) + await ProcessWorksheetInstancesAsync(eventData); + } + } + + private async Task ProcessWorksheetInstancesAsync(CreateWorksheetInstanceByFieldValuesEto eventData) + { + List<(Worksheet worksheet, WorksheetInstance worksheetIntance)> workSheetInstancePairs = + await worksheetsManager.CreateWorksheetDataByFields(eventData); foreach (var (worksheet, worksheetIntance) in workSheetInstancePairs.Where(s => s.worksheet.RequiresCollection())) { diff --git a/applications/Unity.GrantManager/modules/Unity.Flex/src/Unity.Flex.Shared/Worksheets/Events/CreateWorksheetInstanceByFieldValuesEto.cs b/applications/Unity.GrantManager/modules/Unity.Flex/src/Unity.Flex.Shared/Worksheets/Events/CreateWorksheetInstanceByFieldValuesEto.cs index 707f9e14b..d5d8e10ba 100644 --- a/applications/Unity.GrantManager/modules/Unity.Flex/src/Unity.Flex.Shared/Worksheets/Events/CreateWorksheetInstanceByFieldValuesEto.cs +++ b/applications/Unity.GrantManager/modules/Unity.Flex/src/Unity.Flex.Shared/Worksheets/Events/CreateWorksheetInstanceByFieldValuesEto.cs @@ -13,5 +13,6 @@ public class CreateWorksheetInstanceByFieldValuesEto public List<(string fieldName, string chefsPropertyName, object? value)> CustomFields { get; set; } = []; public Guid? VersionId { get; set; } public string? VersionData { get; set; } + public Guid? TenantId { get; set; } } } diff --git a/applications/Unity.GrantManager/modules/Unity.Payments/src/Unity.Payments.Application.Contracts/Enums/PaymentGroup.cs b/applications/Unity.GrantManager/modules/Unity.Payments/src/Unity.Payments.Application.Contracts/Enums/PaymentGroup.cs index 8cd4c6418..794932186 100644 --- a/applications/Unity.GrantManager/modules/Unity.Payments/src/Unity.Payments.Application.Contracts/Enums/PaymentGroup.cs +++ b/applications/Unity.GrantManager/modules/Unity.Payments/src/Unity.Payments.Application.Contracts/Enums/PaymentGroup.cs @@ -3,7 +3,6 @@ public enum PaymentGroup { EFT = 1, - Cheque = 2, - GLP = 3 + Cheque = 2 } } diff --git a/applications/Unity.GrantManager/modules/Unity.Payments/src/Unity.Payments.Application.Contracts/PaymentTags/AssignPaymentTagDto.cs b/applications/Unity.GrantManager/modules/Unity.Payments/src/Unity.Payments.Application.Contracts/PaymentTags/AssignPaymentTagDto.cs new file mode 100644 index 000000000..32772a071 --- /dev/null +++ b/applications/Unity.GrantManager/modules/Unity.Payments/src/Unity.Payments.Application.Contracts/PaymentTags/AssignPaymentTagDto.cs @@ -0,0 +1,12 @@ +using System; +using System.Collections.Generic; +using Volo.Abp.Application.Dtos; + +namespace Unity.Payments.PaymentTags; + +[Serializable] +public class AssignPaymentTagDto : AuditedEntityDto +{ + public Guid PaymentRequestId { get; set; } + public List? Tags { get; set; } +} diff --git a/applications/Unity.GrantManager/modules/Unity.Payments/src/Unity.Payments.Application.Contracts/PaymentTags/GlobalTagDto.cs b/applications/Unity.GrantManager/modules/Unity.Payments/src/Unity.Payments.Application.Contracts/PaymentTags/GlobalTagDto.cs new file mode 100644 index 000000000..5ea0370a9 --- /dev/null +++ b/applications/Unity.GrantManager/modules/Unity.Payments/src/Unity.Payments.Application.Contracts/PaymentTags/GlobalTagDto.cs @@ -0,0 +1,12 @@ +using System; +using Volo.Abp.Application.Dtos; + +namespace Unity.Payments.PaymentTags +{ + [Serializable] + public class GlobalTagDto : EntityDto + { + public string Name { get; set; } = string.Empty; + } +} + diff --git a/applications/Unity.GrantManager/modules/Unity.Payments/src/Unity.Payments.Application.Contracts/PaymentTags/IPaymentTagAppService.cs b/applications/Unity.GrantManager/modules/Unity.Payments/src/Unity.Payments.Application.Contracts/PaymentTags/IPaymentTagAppService.cs index 3758a57ec..86f99e69b 100644 --- a/applications/Unity.GrantManager/modules/Unity.Payments/src/Unity.Payments.Application.Contracts/PaymentTags/IPaymentTagAppService.cs +++ b/applications/Unity.GrantManager/modules/Unity.Payments/src/Unity.Payments.Application.Contracts/PaymentTags/IPaymentTagAppService.cs @@ -10,12 +10,12 @@ public interface IPaymentTagAppService : IApplicationService { Task> GetListAsync(); Task> GetListWithPaymentRequestIdsAsync(List ids); - Task CreateorUpdateTagsAsync(Guid id, PaymentTagDto input); + Task> AssignTagsAsync(AssignPaymentTagDto input); Task GetPaymentTagsAsync(Guid id); Task> GetTagSummaryAsync(); - Task GetMaxRenameLengthAsync(string originalTag); Task> RenameTagAsync(string originalTag, string replacementTag); - Task DeleteTagAsync(string deleteTag); + Task DeleteTagAsync(Guid id); + Task DeleteTagWithTagIdAsync(Guid tagId); } } \ No newline at end of file diff --git a/applications/Unity.GrantManager/modules/Unity.Payments/src/Unity.Payments.Application.Contracts/PaymentTags/PaymentTagDto.cs b/applications/Unity.GrantManager/modules/Unity.Payments/src/Unity.Payments.Application.Contracts/PaymentTags/PaymentTagDto.cs index b3d80bf7d..9d3aa3c54 100644 --- a/applications/Unity.GrantManager/modules/Unity.Payments/src/Unity.Payments.Application.Contracts/PaymentTags/PaymentTagDto.cs +++ b/applications/Unity.GrantManager/modules/Unity.Payments/src/Unity.Payments.Application.Contracts/PaymentTags/PaymentTagDto.cs @@ -7,5 +7,5 @@ namespace Unity.Payments.PaymentTags; public class PaymentTagDto : AuditedEntityDto { public Guid PaymentRequestId { get; set; } - public string Text { get; set; } = string.Empty; + public GlobalTagDto? Tag { get; set; } } diff --git a/applications/Unity.GrantManager/modules/Unity.Payments/src/Unity.Payments.Application.Contracts/PaymentTags/TagSummaryCountDto.cs b/applications/Unity.GrantManager/modules/Unity.Payments/src/Unity.Payments.Application.Contracts/PaymentTags/TagSummaryCountDto.cs index a8d97e36d..22cfbd71c 100644 --- a/applications/Unity.GrantManager/modules/Unity.Payments/src/Unity.Payments.Application.Contracts/PaymentTags/TagSummaryCountDto.cs +++ b/applications/Unity.GrantManager/modules/Unity.Payments/src/Unity.Payments.Application.Contracts/PaymentTags/TagSummaryCountDto.cs @@ -1,6 +1,6 @@ namespace Unity.Payments.PaymentTags; public class TagSummaryCountDto { - public required string Text { get; set; } + public required GlobalTagDto Tag { get; set; } public required int Count { get; set; } } diff --git a/applications/Unity.GrantManager/modules/Unity.Payments/src/Unity.Payments.Application/Domain/PaymentRequests/PaymentRequest.cs b/applications/Unity.GrantManager/modules/Unity.Payments/src/Unity.Payments.Application/Domain/PaymentRequests/PaymentRequest.cs index 0b7f017f2..01a862678 100644 --- a/applications/Unity.GrantManager/modules/Unity.Payments/src/Unity.Payments.Application/Domain/PaymentRequests/PaymentRequest.cs +++ b/applications/Unity.GrantManager/modules/Unity.Payments/src/Unity.Payments.Application/Domain/PaymentRequests/PaymentRequest.cs @@ -52,7 +52,7 @@ public virtual Site Site public virtual string RequesterName { get; private set; } = string.Empty; public virtual string BatchName { get; private set; } = string.Empty; public virtual decimal BatchNumber { get; private set; } = 0; - public virtual Collection? PaymentTags { get; set; } + public virtual Collection? PaymentTags { get; set; } public virtual Collection ExpenseApprovals { get; private set; } public virtual bool IsApproved { get => ExpenseApprovals.All(s => s.Status == ExpenseApprovalStatus.Approved); } diff --git a/applications/Unity.GrantManager/modules/Unity.Payments/src/Unity.Payments.Application/Domain/PaymentTags/IPaymentTagRepository.cs b/applications/Unity.GrantManager/modules/Unity.Payments/src/Unity.Payments.Application/Domain/PaymentTags/IPaymentTagRepository.cs index b816b887c..cf2e8b9f2 100644 --- a/applications/Unity.GrantManager/modules/Unity.Payments/src/Unity.Payments.Application/Domain/PaymentTags/IPaymentTagRepository.cs +++ b/applications/Unity.GrantManager/modules/Unity.Payments/src/Unity.Payments.Application/Domain/PaymentTags/IPaymentTagRepository.cs @@ -8,7 +8,6 @@ namespace Unity.Payments.Domain.PaymentTags public interface IPaymentTagRepository : IRepository { Task> GetTagsByPaymentRequestIdAsync(Guid paymentRequestId); - Task> GetTagSummary(); - Task GetMaxRenameLengthAsync(string originalTag); + Task> GetTagSummary(); } } diff --git a/applications/Unity.GrantManager/modules/Unity.Payments/src/Unity.Payments.Application/Domain/PaymentTags/PaymentTag.cs b/applications/Unity.GrantManager/modules/Unity.Payments/src/Unity.Payments.Application/Domain/PaymentTags/PaymentTag.cs index 1fb6ab453..87408b7cc 100644 --- a/applications/Unity.GrantManager/modules/Unity.Payments/src/Unity.Payments.Application/Domain/PaymentTags/PaymentTag.cs +++ b/applications/Unity.GrantManager/modules/Unity.Payments/src/Unity.Payments.Application/Domain/PaymentTags/PaymentTag.cs @@ -1,4 +1,5 @@ using System; +using Unity.GrantManager.GlobalTag; using Volo.Abp.Domain.Entities.Auditing; using Volo.Abp.MultiTenancy; @@ -10,18 +11,28 @@ public class PaymentTag : AuditedAggregateRoot, IMultiTenant public Guid PaymentRequestId { get; set; } public string Text { get; set; } = string.Empty; - protected PaymentTag() + public Guid TagId { get; set; } + + public virtual Tag Tag + { + set => _tag = value; + get => _tag + ?? throw new InvalidOperationException("Uninitialized property: " + nameof(Tag)); + } + private Tag? _tag; + + public PaymentTag() { /* This constructor is for ORMs to be used while getting the entity from the database. */ } public PaymentTag(Guid id, Guid paymentRequestId, - string text) + Guid tagId) : base(id) { PaymentRequestId = paymentRequestId; - Text = text; + TagId = tagId; } } diff --git a/applications/Unity.GrantManager/modules/Unity.Payments/src/Unity.Payments.Application/Domain/PaymentTags/TagSummaryCount.cs b/applications/Unity.GrantManager/modules/Unity.Payments/src/Unity.Payments.Application/Domain/PaymentTags/TagSummaryCount.cs index 4421ed473..72f3ae86e 100644 --- a/applications/Unity.GrantManager/modules/Unity.Payments/src/Unity.Payments.Application/Domain/PaymentTags/TagSummaryCount.cs +++ b/applications/Unity.GrantManager/modules/Unity.Payments/src/Unity.Payments.Application/Domain/PaymentTags/TagSummaryCount.cs @@ -1,6 +1,8 @@ -namespace Unity.Payments.Domain.PaymentTags; -public class TagSummaryCount(string name, int count) +using Unity.GrantManager.GlobalTag; + +namespace Unity.Payments.Domain.PaymentTags; +public class PaymentTagSummaryCount(Tag tag, int count) { - public string Text { get; set; } = name; + public Tag Tag { get; set; } = tag; public int Count { get; set; } = count; } diff --git a/applications/Unity.GrantManager/modules/Unity.Payments/src/Unity.Payments.Application/EntityFrameworkCore/PaymentsDbContextModelCreatingExtensions.cs b/applications/Unity.GrantManager/modules/Unity.Payments/src/Unity.Payments.Application/EntityFrameworkCore/PaymentsDbContextModelCreatingExtensions.cs index f5778160e..4ed2f4fe0 100644 --- a/applications/Unity.GrantManager/modules/Unity.Payments/src/Unity.Payments.Application/EntityFrameworkCore/PaymentsDbContextModelCreatingExtensions.cs +++ b/applications/Unity.GrantManager/modules/Unity.Payments/src/Unity.Payments.Application/EntityFrameworkCore/PaymentsDbContextModelCreatingExtensions.cs @@ -6,7 +6,8 @@ using Unity.Payments.Domain.Suppliers; using Unity.Payments.Domain.PaymentConfigurations; using Unity.Payments.Domain.PaymentTags; - +using Unity.GrantManager; +using Unity.GrantManager.GlobalTag; namespace Unity.Payments.EntityFrameworkCore; public static class PaymentsDbContextModelCreatingExtensions @@ -79,9 +80,16 @@ public static void ConfigurePayments( PaymentsDbProperties.DbSchema); b.ConfigureByConvention(); - b.Property(x => x.Text) + b.HasOne(x => x.Tag) + .WithMany() + .HasForeignKey(x => x.TagId) .IsRequired() - .HasMaxLength(250); + .OnDelete(DeleteBehavior.NoAction); + }); + modelBuilder.Entity(b => + { + b.ToTable(GrantManagerConsts.TenantTablePrefix + "Tags", GrantManagerConsts.DbSchema); + b.ConfigureByConvention(); }); } } diff --git a/applications/Unity.GrantManager/modules/Unity.Payments/src/Unity.Payments.Application/EntityFrameworkCore/Repositories/PaymentTagRepository.cs b/applications/Unity.GrantManager/modules/Unity.Payments/src/Unity.Payments.Application/EntityFrameworkCore/Repositories/PaymentTagRepository.cs index cd8476016..ce57e8fde 100644 --- a/applications/Unity.GrantManager/modules/Unity.Payments/src/Unity.Payments.Application/EntityFrameworkCore/Repositories/PaymentTagRepository.cs +++ b/applications/Unity.GrantManager/modules/Unity.Payments/src/Unity.Payments.Application/EntityFrameworkCore/Repositories/PaymentTagRepository.cs @@ -21,50 +21,20 @@ public async Task> GetTagsByPaymentRequestIdAsync(Guid paymentR return await dbSet.Where(p => p.PaymentRequestId.Equals(paymentRequestId)).ToListAsync(); } - public virtual async Task> GetTagSummary() + public virtual async Task> GetTagSummary() { var dbSet = await GetDbSetAsync(); - var results = dbSet - .AsNoTracking() - .AsEnumerable() // Forces client-side evaluation - .SelectMany(tag => tag.Text.Split(',', StringSplitOptions.RemoveEmptyEntries) - .Select(t => t.Trim())) - .GroupBy(tag => tag) - .Select(group => new TagSummaryCount( - group.Key, - group.Count() - )).ToList(); + var results = await dbSet + .AsNoTracking() + .Include(x => x.Tag) // Ensure Tag is loaded + .GroupBy(x => x.Tag) + .Select(group => new PaymentTagSummaryCount( + group.Key, + group.Count() + )) + .ToListAsync(); return results; } - - /// - /// For a given Tag, finds the maximum length available for renaming. - /// - /// The tag to be replaced. - /// The maximum length available for renaming - public virtual async Task GetMaxRenameLengthAsync(string originalTag) - { - var dbContext = await GetDbContextAsync(); - var entityType = dbContext.Model.FindEntityType(typeof(PaymentTag)); - var property = entityType?.FindProperty(nameof(PaymentTag.Text)); - - int maxColumnLength = property?.GetMaxLength() ?? 0; - - var dbSet = await GetDbSetAsync(); - int? maxTagSetLength = await dbSet - .AsNoTracking() - .Where(t => t.Text.Contains(originalTag)) - .Select(t => t.Text.Length) - .OrderByDescending(len => len) - .FirstOrDefaultAsync(); - - if (maxTagSetLength == null || maxTagSetLength == 0) - { - return maxColumnLength; - } - - return maxColumnLength + originalTag.Length - maxTagSetLength.Value; - } } } diff --git a/applications/Unity.GrantManager/modules/Unity.Payments/src/Unity.Payments.Application/Events/DeleteTagEto.cs b/applications/Unity.GrantManager/modules/Unity.Payments/src/Unity.Payments.Application/Events/DeleteTagEto.cs index bba118980..0dee51d45 100644 --- a/applications/Unity.GrantManager/modules/Unity.Payments/src/Unity.Payments.Application/Events/DeleteTagEto.cs +++ b/applications/Unity.GrantManager/modules/Unity.Payments/src/Unity.Payments.Application/Events/DeleteTagEto.cs @@ -5,5 +5,5 @@ namespace Unity.Payments.Events; [Serializable] public class DeleteTagEto { - public required string TagName { get; set; } + public required Guid TagId { get; set; } } diff --git a/applications/Unity.GrantManager/modules/Unity.Payments/src/Unity.Payments.Application/Events/TagDeletedEto.cs b/applications/Unity.GrantManager/modules/Unity.Payments/src/Unity.Payments.Application/Events/TagDeletedEto.cs new file mode 100644 index 000000000..64eb4878d --- /dev/null +++ b/applications/Unity.GrantManager/modules/Unity.Payments/src/Unity.Payments.Application/Events/TagDeletedEto.cs @@ -0,0 +1,9 @@ +using System; + +namespace Unity.Payments.Events; + +[Serializable] +public class TagDeletedEto +{ + public required Guid TagId { get; set; } +} diff --git a/applications/Unity.GrantManager/modules/Unity.Payments/src/Unity.Payments.Application/Handlers/DeleteTagHandler.cs b/applications/Unity.GrantManager/modules/Unity.Payments/src/Unity.Payments.Application/Handlers/DeleteTagHandler.cs index 512341d83..c0df413e4 100644 --- a/applications/Unity.GrantManager/modules/Unity.Payments/src/Unity.Payments.Application/Handlers/DeleteTagHandler.cs +++ b/applications/Unity.GrantManager/modules/Unity.Payments/src/Unity.Payments.Application/Handlers/DeleteTagHandler.cs @@ -11,6 +11,7 @@ public class DeleteTagHandler(PaymentTagAppService paymentTagAppService) : { public async Task HandleEventAsync(DeleteTagEto eventData) { - await paymentTagAppService.DeleteTagAsync(eventData.TagName); + await paymentTagAppService.DeleteTagWithTagIdAsync(eventData.TagId); + } } diff --git a/applications/Unity.GrantManager/modules/Unity.Payments/src/Unity.Payments.Application/PaymentRequests/PaymentRequestAppService.cs b/applications/Unity.GrantManager/modules/Unity.Payments/src/Unity.Payments.Application/PaymentRequests/PaymentRequestAppService.cs index e9ff5a64e..64537771c 100644 --- a/applications/Unity.GrantManager/modules/Unity.Payments/src/Unity.Payments.Application/PaymentRequests/PaymentRequestAppService.cs +++ b/applications/Unity.GrantManager/modules/Unity.Payments/src/Unity.Payments.Application/PaymentRequests/PaymentRequestAppService.cs @@ -337,6 +337,7 @@ await _paymentRequestsRepository var paymentsQueryable = await _paymentRequestsRepository.GetQueryableAsync(); var paymentsWithTags = await paymentsQueryable .Include(pr => pr.PaymentTags) + .ThenInclude(pt => pt.Tag) .ToListAsync(); var mappedPayments = await MapToDtoAndLoadDetailsAsync(paymentsWithTags); diff --git a/applications/Unity.GrantManager/modules/Unity.Payments/src/Unity.Payments.Application/PaymentTags/PaymentTagAppService.cs b/applications/Unity.GrantManager/modules/Unity.Payments/src/Unity.Payments.Application/PaymentTags/PaymentTagAppService.cs index 0cf887143..2e0eb04c4 100644 --- a/applications/Unity.GrantManager/modules/Unity.Payments/src/Unity.Payments.Application/PaymentTags/PaymentTagAppService.cs +++ b/applications/Unity.GrantManager/modules/Unity.Payments/src/Unity.Payments.Application/PaymentTags/PaymentTagAppService.cs @@ -1,4 +1,5 @@ using Microsoft.AspNetCore.Authorization; +using Microsoft.EntityFrameworkCore; using System; using System.Collections.Generic; using System.Linq; @@ -9,6 +10,9 @@ using Volo.Abp.Application.Dtos; using Volo.Abp.Domain.Repositories; using Volo.Abp.Features; +using Volo.Abp.EventBus.Local; +using Unity.Payments.Events; + namespace Unity.Payments.PaymentTags { @@ -17,9 +21,11 @@ namespace Unity.Payments.PaymentTags public class PaymentTagAppService : PaymentsAppService, IPaymentTagAppService { private readonly IPaymentTagRepository _paymentTagRepository; - public PaymentTagAppService(IPaymentTagRepository paymentTagRepository) + private readonly ILocalEventBus _localEventBus; + public PaymentTagAppService(IPaymentTagRepository paymentTagRepository, ILocalEventBus localEventBus) { _paymentTagRepository = paymentTagRepository; + _localEventBus = localEventBus; } public async Task> GetListAsync() { @@ -28,9 +34,14 @@ public async Task> GetListAsync() } public async Task> GetListWithPaymentRequestIdsAsync(List ids) { - var tags = await _paymentTagRepository.GetListAsync(e => ids.Contains(e.PaymentRequestId)); + var tagsQuery = (await _paymentTagRepository.GetQueryableAsync()) + .Include(pt => pt.Tag) + .Where(e => ids.Contains(e.PaymentRequestId)) + .OrderBy(t => t.Id); + + var tags = await tagsQuery.ToListAsync(); - return ObjectMapper.Map, List>(tags.OrderBy(t => t.Id).ToList()); + return ObjectMapper.Map, List>(tags); } public async Task GetPaymentTagsAsync(Guid id) { @@ -40,39 +51,57 @@ public async Task> GetListWithPaymentRequestIdsAsync(List(paymentTags); } - public async Task CreateorUpdateTagsAsync(Guid id, PaymentTagDto input) + + + public async Task> AssignTagsAsync(AssignPaymentTagDto input) { - var paymentTag = await _paymentTagRepository.FirstOrDefaultAsync(e => e.PaymentRequestId == id); + var existingApplicationTags = await _paymentTagRepository.GetListAsync(e => e.PaymentRequestId == input.PaymentRequestId); + + + var existingTagIds = existingApplicationTags.Select(t => t.TagId).ToHashSet(); + var inputTagIds = input.Tags?.Select(t => t.Id).ToHashSet() ?? new HashSet(); + var newTagsToAdd = input.Tags? + .Where(tag => !existingTagIds.Contains(tag.Id)) + .Select(tag => new PaymentTag + { + PaymentRequestId = input.PaymentRequestId, + TagId = tag.Id + }) + .ToList(); + var tagsToRemove = existingApplicationTags + .Where(et => !inputTagIds.Contains(et.TagId)) + .ToList(); - // Sanitize input tag text string - var tagInput = input.Text.Split(',', StringSplitOptions.RemoveEmptyEntries | StringSplitOptions.TrimEntries).ToHashSet(); - input.Text = string.Join(',', tagInput.OrderBy(t => t, StringComparer.InvariantCultureIgnoreCase)); - if (paymentTag == null) + if (tagsToRemove.Count > 0) { - var newTag = await _paymentTagRepository.InsertAsync(new PaymentTag( - Guid.NewGuid(), // Generate a new ID for the PaymentTag - input.PaymentRequestId, - input.Text - ), - autoSave: true - ); - - return ObjectMapper.Map(newTag); + await _paymentTagRepository.DeleteManyAsync(tagsToRemove, autoSave: true); + } + + if (newTagsToAdd?.Count > 0) + { + await _paymentTagRepository.InsertManyAsync(newTagsToAdd, autoSave: true); + var tagIds = newTagsToAdd.Select(x => x.TagId).ToList(); + + var insertedTagsWithNavProps = await (await _paymentTagRepository.GetQueryableAsync()) + .Where(x => x.PaymentRequestId == input.PaymentRequestId && tagIds.Contains(x.TagId)) + .Include(x => x.Tag) + .ToListAsync(); + + return ObjectMapper.Map, List>(insertedTagsWithNavProps); } else { - paymentTag.Text = input.Text; - await _paymentTagRepository.UpdateAsync(paymentTag, autoSave: true); - return ObjectMapper.Map(paymentTag); + return new List(); } } [Authorize(UnitySelector.SettingManagement.Tags.Default)] public async Task> GetTagSummaryAsync() { - var tagSummary = ObjectMapper.Map, List>( - await _paymentTagRepository.GetTagSummary()); + var summary = await _paymentTagRepository.GetTagSummary(); + var tagSummary = ObjectMapper.Map, List>(summary + ); return new PagedResultDto( tagSummary.Count, @@ -80,18 +109,6 @@ public async Task> GetTagSummaryAsync() ); } - /// - /// For a given Tag, finds the maximum length available for renaming. - /// - /// The tag to be replaced. - /// The maximum length available for renaming - [Authorize(UnitySelector.SettingManagement.Tags.Update)] - public async Task GetMaxRenameLengthAsync(string originalTag) - { - Check.NotNullOrWhiteSpace(originalTag, nameof(originalTag)); - return await _paymentTagRepository.GetMaxRenameLengthAsync(originalTag); - } - [Authorize(UnitySelector.SettingManagement.Tags.Update)] public async Task> RenameTagAsync(string originalTag, string replacementTag) { @@ -113,15 +130,6 @@ public async Task> RenameTagAsync(string originalTag, string replacem if (paymentRequestTags.Count == 0) return []; - int maxRemainingLength = await GetMaxRenameLengthAsync(originalTag); - if (replacementTag.Length > maxRemainingLength) - { - throw new ArgumentOutOfRangeException( - nameof(replacementTag), - $"String length exceeds maximum allowed length of {maxRemainingLength}. Actual length: {replacementTag.Length}" - ); - } - var updatedTags = new List(paymentRequestTags.Count); foreach (var item in paymentRequestTags) @@ -153,48 +161,21 @@ public async Task> RenameTagAsync(string originalTag, string replacem /// /// String of tag to be deleted. [Authorize(UnitySelector.SettingManagement.Tags.Delete)] - public async Task DeleteTagAsync(string deleteTag) + public async Task DeleteTagAsync(Guid id ) { - Check.NotNullOrWhiteSpace(deleteTag, nameof(deleteTag)); - - // Remove commas from the originalTag and replacementTag - deleteTag = deleteTag.Replace(",", string.Empty).Trim(); - - var paymentRequestTags = await _paymentTagRepository.GetListAsync(e => e.Text.Contains(deleteTag)); - - var updatedTags = new List(); - var deletedTags = new List(); - - foreach (var item in paymentRequestTags) - { - var tagSet = new HashSet( - item.Text.Split(',', StringSplitOptions.RemoveEmptyEntries | StringSplitOptions.TrimEntries), - StringComparer.InvariantCultureIgnoreCase); - - // Only replace whole word tags - skip substring matches - if (tagSet.Remove(deleteTag)) - { - if (tagSet.Count > 0) - { - item.Text = string.Join(',', tagSet.OrderBy(t => t, StringComparer.InvariantCultureIgnoreCase)); - updatedTags.Add(item); - } - else - { - deletedTags.Add(item); - } - } - } + await _paymentTagRepository.DeleteAsync(id); + } + + + [Authorize(UnitySelector.SettingManagement.Tags.Delete)] + public async Task DeleteTagWithTagIdAsync(Guid tagId) + { + var existingApplicationTags = await _paymentTagRepository.GetListAsync(e => e.Tag.Id == tagId); + var idsToDelete = existingApplicationTags.Select(x => x.Id).ToList(); + await _paymentTagRepository.DeleteManyAsync(idsToDelete, autoSave: true); + await _localEventBus.PublishAsync(new TagDeletedEto { TagId = tagId }); + } - if (deletedTags.Count > 0) - { - await _paymentTagRepository.DeleteManyAsync(deletedTags, autoSave: true); - } - if (updatedTags.Count > 0) - { - await _paymentTagRepository.UpdateManyAsync(updatedTags, autoSave: true); - } - } } } diff --git a/applications/Unity.GrantManager/modules/Unity.Payments/src/Unity.Payments.Application/PaymentsApplicationAutoMapperProfile.cs b/applications/Unity.GrantManager/modules/Unity.Payments/src/Unity.Payments.Application/PaymentsApplicationAutoMapperProfile.cs index 114c6e93c..a2ccc203a 100644 --- a/applications/Unity.GrantManager/modules/Unity.Payments/src/Unity.Payments.Application/PaymentsApplicationAutoMapperProfile.cs +++ b/applications/Unity.GrantManager/modules/Unity.Payments/src/Unity.Payments.Application/PaymentsApplicationAutoMapperProfile.cs @@ -1,4 +1,6 @@ using AutoMapper; +using Unity.GrantManager.Applications; +using Unity.GrantManager.GlobalTag; using Unity.Payments.Domain.PaymentConfigurations; using Unity.Payments.Domain.PaymentRequests; using Unity.Payments.Domain.PaymentTags; @@ -30,6 +32,7 @@ public PaymentsApplicationAutoMapperProfile() CreateMap(); CreateMap(); CreateMap(); + CreateMap(); CreateMap(); CreateMap(); diff --git a/applications/Unity.GrantManager/modules/Unity.Payments/src/Unity.Payments.Application/Suppliers/ISiteAppService.cs b/applications/Unity.GrantManager/modules/Unity.Payments/src/Unity.Payments.Application/Suppliers/ISiteAppService.cs index 0086b1f96..536c60c0b 100644 --- a/applications/Unity.GrantManager/modules/Unity.Payments/src/Unity.Payments.Application/Suppliers/ISiteAppService.cs +++ b/applications/Unity.GrantManager/modules/Unity.Payments/src/Unity.Payments.Application/Suppliers/ISiteAppService.cs @@ -15,5 +15,6 @@ public interface ISiteAppService : IApplicationService Task DeleteBySupplierIdAsync(Guid supplierId); Task> GetSitesBySupplierIdAsync(Guid supplierId); Task MarkDeletedInUseAsync(Guid id); + Task UpdatePaygroupAsync(Enums.PaymentGroup paymentGroup, Guid siteId); } } diff --git a/applications/Unity.GrantManager/modules/Unity.Payments/src/Unity.Payments.Application/Suppliers/SiteAppService.cs b/applications/Unity.GrantManager/modules/Unity.Payments/src/Unity.Payments.Application/Suppliers/SiteAppService.cs index fe3b518b2..b9286fee5 100644 --- a/applications/Unity.GrantManager/modules/Unity.Payments/src/Unity.Payments.Application/Suppliers/SiteAppService.cs +++ b/applications/Unity.GrantManager/modules/Unity.Payments/src/Unity.Payments.Application/Suppliers/SiteAppService.cs @@ -67,6 +67,30 @@ public virtual async Task MarkDeletedInUseAsync(Guid id) } } + public virtual async Task UpdatePaygroupAsync(Enums.PaymentGroup paymentGroup, Guid siteId) + { + try{ + Site updateSite = await siteRepository.GetAsync(siteId); + updateSite.PaymentGroup = paymentGroup; + await siteRepository.UpdateAsync(updateSite, true); + return updateSite.Id; + } + catch (BusinessException ex) + { + // Log BusinessExceptions with context and rethrow with additional data + logger.LogWarning(ex, "Business exception occurred while updating site {SiteId}", siteId); + throw new BusinessException("Error updating site: " + ex.Message) + .WithData(SITE_ID_KEY, siteId) + .WithData("OriginalError", ex.Message); + } + catch (Exception ex) + { + // General exception logging + logger.LogError(ex, "Error updating site {SiteId}", siteId); + throw new BusinessException("Error updating site").WithData(SITE_ID_KEY, siteId); + } + } + public virtual async Task UpdateAsync(SiteDto siteDto) { try diff --git a/applications/Unity.GrantManager/modules/Unity.Payments/src/Unity.Payments.Web/Pages/PaymentRequests/Index.js b/applications/Unity.GrantManager/modules/Unity.Payments/src/Unity.Payments.Web/Pages/PaymentRequests/Index.js index 1f66e4ba2..234264942 100644 --- a/applications/Unity.GrantManager/modules/Unity.Payments/src/Unity.Payments.Web/Pages/PaymentRequests/Index.js +++ b/applications/Unity.GrantManager/modules/Unity.Payments/src/Unity.Payments.Web/Pages/PaymentRequests/Index.js @@ -600,11 +600,14 @@ $(function () { return { title: 'Tags', name: 'paymentTags', - data: 'paymentTags[0].text', + data: 'paymentTags', className: '', index: columnIndex, render: function (data) { - return data.replace(/,/g, ', ') ?? ''; + let tagNames = data + .filter(x =>x?.tag?.name) + .map(x => x.tag.name); + return tagNames.join(', ') ?? ''; } } } diff --git a/applications/Unity.GrantManager/modules/Unity.Payments/src/Unity.Payments.Web/Pages/PaymentTags/PaymentTags.js b/applications/Unity.GrantManager/modules/Unity.Payments/src/Unity.Payments.Web/Pages/PaymentTags/PaymentTags.js index 9dbbbfb6d..c5530e1f4 100644 --- a/applications/Unity.GrantManager/modules/Unity.Payments/src/Unity.Payments.Web/Pages/PaymentTags/PaymentTags.js +++ b/applications/Unity.GrantManager/modules/Unity.Payments/src/Unity.Payments.Web/Pages/PaymentTags/PaymentTags.js @@ -1,12 +1,13 @@ $(function () { + let suggestionsArray = []; - // Plugin Constructor + let TagsInput = function (opts) { this.options = Object.assign(TagsInput.defaults, opts); this.init(); } - // Initialize the plugin + TagsInput.prototype.init = function (opts) { this.options = opts ? Object.assign(this.options, opts) : this.options; @@ -31,25 +32,21 @@ $(function () { } - // Add Tags + TagsInput.prototype.addTag = function (tagData) { let defaultClass = 'tags-common'; - let tagText, tagClass; + let id, tagText, tagClass; - if (typeof tagData === 'string') { - tagText = tagData; - tagClass = defaultClass; + id = tagData.Id; + tagText = tagData.Name || ''; + tagClass = tagData.class || defaultClass; - } else { - tagText = tagData.text || ''; - tagClass = tagData.class || defaultClass; - } if (this.anyErrors(tagText)) return; - this.arr.push(tagText); + this.arr.push({ Id: id, Name: tagText }); let tagInput = this; @@ -60,7 +57,7 @@ $(function () { let closeIcon = document.createElement('a'); closeIcon.innerHTML = '×'; - // delete the tag when icon is clicked + closeIcon.addEventListener('click', function (e) { e.preventDefault(); let tag = this.parentNode; @@ -74,15 +71,16 @@ $(function () { tag.appendChild(closeIcon); this.wrapper.insertBefore(tag, this.input); this.orignal_input.value = JSON.stringify(this.arr); - + updateSelectedTagsInput(this.arr) return this; } - // Delete Tags + TagsInput.prototype.deleteTag = function (tag, i) { let self = this; - if (this.arr[i] == 'Uncommon Tags') { - abp.message.confirm('Are you sure to delete all the uncommon tags?') + + if (this.arr[i].Name === 'Uncommon Tags') { + abp.message.confirm('Are you sure you want to delete all the uncommon tags?') .then(function (confirmed) { if (confirmed) { tag.remove(); @@ -90,34 +88,34 @@ $(function () { self.orignal_input.value = JSON.stringify(self.arr); return self; } - }); - } - else { + } else { tag.remove(); this.arr.splice(i, 1); this.orignal_input.value = JSON.stringify(this.arr); return this; } - } - // Make sure input string have no error with the plugin + TagsInput.prototype.anyErrors = function (string) { if (this.options.max != null && this.arr.length >= this.options.max) { console.log('max tags limit reached'); return true; } - if (!this.options.duplicate && this.arr.indexOf(string) != -1) { - console.log('duplicate found " ' + string + ' " ') + if ( + !this.options.duplicate && + this.arr.some(tag => tag.Name === string) + ) { + console.log('duplicate found "' + string + '"'); return true; } return false; } - // Add tags programmatically + TagsInput.prototype.addData = function (array) { let plugin = this; @@ -127,7 +125,7 @@ $(function () { return this; } - // Get the Input String + TagsInput.prototype.getInputString = function () { return this.arr.join(','); } @@ -136,7 +134,7 @@ $(function () { } - // destroy the plugin + TagsInput.prototype.destroy = function () { this.orignal_input.removeAttribute('hidden'); @@ -154,7 +152,7 @@ $(function () { this.initialized = false; } - // Private function to initialize the tag input plugin + function init(tags) { tags.wrapper.append(tags.input); tags.wrapper.classList.add(tags.options.wrapperClass); @@ -163,11 +161,12 @@ $(function () { tags.input.addEventListener('input', function () { const inputValue = tags.input.value.trim().toLowerCase(); - // Show suggestions only after the first character entry + if (inputValue.length > 1) { - const suggestions = suggestionsArray.filter(tag => tag.toLowerCase().includes(inputValue)); + const suggestions = suggestionsArray.filter(tag => + (tag.Name.toLowerCase()).includes(inputValue)); - // Display suggestions below the input element + if (suggestions.length) { displaySuggestions(tags, suggestions); } else { @@ -175,18 +174,18 @@ $(function () { } } else { - // Remove suggestions if input is empty + removeSuggestions(tags); } }); } - // Function to display auto-completion suggestions + function displaySuggestions(tags, suggestions) { - // Remove previous suggestions + removeSuggestions(tags); - // Create suggestion container + const suggestionContainer = document.createElement('div'); suggestionContainer.classList.add('tags-suggestion-container'); const suggestionTitleElement = document.createElement('div'); @@ -194,13 +193,13 @@ $(function () { suggestionTitleElement.innerText = 'ALL TAGS'; suggestionContainer.appendChild(suggestionTitleElement); - // Add suggestions to the container + suggestions.forEach(suggestion => { const suggestionElement = document.createElement('div'); suggestionElement.className = 'tags-suggestion-element'; - suggestionElement.innerText = suggestion; + suggestionElement.innerText = typeof suggestion === 'string' ? suggestion : suggestion.Name; - // Add click event to add suggestion as a new tag + suggestionElement.addEventListener('click', function () { tags.addTag(suggestion); removeSuggestions(tags); @@ -210,11 +209,11 @@ $(function () { suggestionContainer.appendChild(suggestionElement); }); - // Append the suggestion container below the input + tags.wrapper.appendChild(suggestionContainer); } - // Function to remove auto-completion suggestions + function removeSuggestions(tags) { const suggestionContainer = tags.wrapper.querySelector('.tags-suggestion-container'); if (suggestionContainer) { @@ -228,9 +227,9 @@ $(function () { tags.input.focus(); }); - // for saving tags that are typed, but not added as a chip/pill + tags.input.addEventListener('focusout', function () { - $('#paymentTagsModelSaveBtn').click(function () { + $('#assignTagsModelSaveBtn').click(function () { trimAndAddTag(tags); }) }); @@ -248,19 +247,41 @@ $(function () { }); } + function trimAndAddTag(tags) { let str = tags.input.value.trim(); - if (str != "") { - tags.addTag(str); + if (!str) { + tags.input.value = ""; + return; + } + + + const matched = suggestionsArray.find(s => + + s.Name.toLowerCase() === str.toLowerCase() + ); + + if (matched) { + tags.addTag(typeof matched === 'string' ? { name: matched } : matched); + } else { + abp.message.warn('Please select a tag from the suggestions.'); } + tags.input.value = ""; } + function updateSelectedTagsInput(tagsArray) { + + let jsonValue = JSON.stringify(tagsArray); + $('#SelectedTagsJson').val(jsonValue); + + } + TagsInput.prototype.getTags = function () { return this.arr.slice(); // Return a copy of the array to prevent external modification } - // Set All the Default Values + TagsInput.defaults = { selector: '', wrapperClass: 'tags-input-wrapper', @@ -272,5 +293,3 @@ $(function () { window.TagsInput = TagsInput; }); - - diff --git a/applications/Unity.GrantManager/modules/Unity.Payments/src/Unity.Payments.Web/Pages/PaymentTags/PaymentTagsSelectionModal.cshtml b/applications/Unity.GrantManager/modules/Unity.Payments/src/Unity.Payments.Web/Pages/PaymentTags/PaymentTagsSelectionModal.cshtml index 81b74691f..4078c598a 100644 --- a/applications/Unity.GrantManager/modules/Unity.Payments/src/Unity.Payments.Web/Pages/PaymentTags/PaymentTagsSelectionModal.cshtml +++ b/applications/Unity.GrantManager/modules/Unity.Payments/src/Unity.Payments.Web/Pages/PaymentTags/PaymentTagsSelectionModal.cshtml @@ -4,6 +4,7 @@ @{ Layout = null; } +@using Newtonsoft.Json
@@ -11,12 +12,14 @@
+ - - - - + + + + +
diff --git a/applications/Unity.GrantManager/modules/Unity.Payments/src/Unity.Payments.Web/Pages/PaymentTags/PaymentTagsSelectionModal.cshtml.cs b/applications/Unity.GrantManager/modules/Unity.Payments/src/Unity.Payments.Web/Pages/PaymentTags/PaymentTagsSelectionModal.cshtml.cs index 917a7c389..e02989f0a 100644 --- a/applications/Unity.GrantManager/modules/Unity.Payments/src/Unity.Payments.Web/Pages/PaymentTags/PaymentTagsSelectionModal.cshtml.cs +++ b/applications/Unity.GrantManager/modules/Unity.Payments/src/Unity.Payments.Web/Pages/PaymentTags/PaymentTagsSelectionModal.cshtml.cs @@ -6,54 +6,71 @@ using Microsoft.AspNetCore.Mvc; using Microsoft.Extensions.Logging; using Newtonsoft.Json; +using Unity.GrantManager.GlobalTag; using Unity.Payments.PaymentTags; using Volo.Abp.AspNetCore.Mvc.UI.RazorPages; + namespace Unity.Payments.Web.Pages.PaymentTags { - class NewTagItem + public class NewTagItem { public string? PaymentRequestId { get; set; } - public string? CommonText { get; set; } - public string? UncommonText { get; set; } + public List CommonTags { get; set; } = new(); + public List UncommonTags { get; set; } = new(); } public class PaymentTagsSelectionModalModel : AbpPageModel { [BindProperty] - [DisplayName("")] + [DisplayName("Tags")] public string? SelectedTags { get; set; } = string.Empty; [BindProperty] - public string? AllTags { get; set; } = string.Empty; + [DisplayName("All Tags")] + public List AllTags { get; set; } = new(); [BindProperty] + [DisplayName("Selected Payments")] public string? SelectedPaymentRequestIds { get; set; } = string.Empty; [BindProperty] + [DisplayName("Action Type")] public string? ActionType { get; set; } = string.Empty; private readonly IPaymentTagAppService _paymentTagsService; + private readonly ITagsService _tagsService; + + + [BindProperty] + [DisplayName("Common Tags")] + public List CommonTags { get; set; } = new(); + [BindProperty] + [DisplayName("Uncommon Tags")] + public List UncommonTags { get; set; } = new(); [BindProperty] - public string? CommonTags { get; set; } = string.Empty; + [DisplayName("Tags")] + public List Tags { get; set; } = new(); [BindProperty] - public string? UncommonTags { get; set; } = string.Empty; + public string? SelectedTagsJson { get; set; } [BindProperty] - public string? Tags { get; set; } = string.Empty; + public string? TagsJson { get; set; } - public PaymentTagsSelectionModalModel(IPaymentTagAppService paymentTagAppService) + public PaymentTagsSelectionModalModel(IPaymentTagAppService paymentTagAppService, ITagsService tagsService) { _paymentTagsService = paymentTagAppService ?? throw new ArgumentNullException(nameof(paymentTagAppService)); + _tagsService = tagsService ?? throw new ArgumentNullException(nameof(tagsService)); } public async Task OnGetAsync(string paymentRequestIds, string actionType) { - + CommonTags = new List(); + UncommonTags = new List(); SelectedPaymentRequestIds = paymentRequestIds; ActionType = actionType; var paymentRequests = JsonConvert.DeserializeObject>(SelectedPaymentRequestIds); @@ -61,63 +78,75 @@ public async Task OnGetAsync(string paymentRequestIds, string actionType) { try { - var allTags = await _paymentTagsService.GetListAsync(); + var allTags = await _tagsService.GetListAsync(); + + var tags = await _paymentTagsService.GetListWithPaymentRequestIdsAsync(paymentRequests); + var groupedTags = tags + .Where(x => x.Tag != null) + .GroupBy(x => x.PaymentRequestId) + .ToDictionary( + g => g.Key, + g => g.Select(x => x.Tag!).DistinctBy(t => t.Id).ToList() + ); + foreach (var missingId in paymentRequests.Except(groupedTags.Keys)) + { + groupedTags[missingId] = new List(); + } - var tags = await _paymentTagsService.GetListWithPaymentRequestIdsAsync(paymentRequests); + + List commonTags = new(); - // Add default objects for missing paymentRequestIds - var missingPaymenRequestIds = paymentRequests.Except(tags.Select(tag => tag.PaymentRequestId)); - tags = tags.Concat(missingPaymenRequestIds.Select(paymentRequestId => new PaymentTagDto + if (groupedTags.Values.Count > 0) { - PaymentRequestId = paymentRequestId, - Text = "", // You can set default values here - Id = Guid.NewGuid() // Assuming Id is a Guid - })).ToList(); + commonTags = groupedTags.Values + .Aggregate((prev, next) => prev.IntersectBy(next.Select(t => t.Id), t => t.Id).ToList()); + } - var newArray = tags.Select(item => + + Tags = groupedTags.Select(kvp => { - var textValues = item.Text.Split(','); - var commonText = tags - .SelectMany(x => x.Text.Split(',')) - .GroupBy(text => text) - .Where(group => group.Count() == tags.Count) - .Select(group => group.Key); + var appId = kvp.Key; + var tagList = kvp.Value; - var uncommonText = textValues.Except(commonText); + var uncommonTags = tagList + .Where(tag => !commonTags.Any(ct => ct.Id == tag.Id)) + .ToList(); return new NewTagItem { - PaymentRequestId = item.PaymentRequestId.ToString(), - CommonText = string.Join(",", commonText), - UncommonText = string.Join(",", uncommonText) + PaymentRequestId = appId.ToString(), + CommonTags = commonTags.OrderBy(t => t.Name).ToList(), + UncommonTags = uncommonTags.OrderBy(t => t.Name).ToList() }; - }).ToArray(); - - var allUniqueCommonTexts = newArray - .SelectMany(item => (item.CommonText?.Split(',') ?? Array.Empty())) - .Where(text => !string.IsNullOrEmpty(text)) - .Distinct() - .OrderBy(text => text); - - var allUniqueUncommonTexts = newArray - .SelectMany(item => (item.UncommonText?.Split(',') ?? Array.Empty())) - .Where(text => !string.IsNullOrEmpty(text)) - .Distinct() - .OrderBy(text => text); - + }).ToList(); + if (Tags.Count > 0) + { - var allUniqueTexts = allTags - .SelectMany(obj => obj.Text.ToString().Split(',').Select(t => t.Trim())) - .Distinct(); - var uniqueCommonTextsString = string.Join(",", allUniqueCommonTexts); - var uniqueUncommonTextsString = string.Join(",", allUniqueUncommonTexts); - var allUniqueTextsString = string.Join(",", allUniqueTexts); + CommonTags = Tags + .SelectMany(item => item.CommonTags) + .GroupBy(tag => tag.Id) + .Select(group => group.First()) + .OrderBy(tag => tag.Name) + .ToList(); + + UncommonTags = Tags + .SelectMany(item => item.UncommonTags) + .GroupBy(tag => tag.Id) + .Select(group => group.First()) + .OrderBy(tag => tag.Name) + .ToList(); + } - AllTags = allUniqueTextsString; - CommonTags = uniqueCommonTextsString; - UncommonTags = uniqueUncommonTextsString; - Tags = JsonConvert.SerializeObject(newArray); + AllTags = allTags + .DistinctBy(tag => tag.Id) + .OrderBy(tag => tag.Name) + .Select(tag => new GlobalTagDto + { + Id = tag.Id, + Name = tag.Name + }) + .ToList(); } catch (Exception ex) { @@ -129,7 +158,7 @@ public async Task OnGetAsync(string paymentRequestIds, string actionType) public async Task OnPostAsync() { - const string uncommonTags = "Uncommon Tags"; // Move to constants? + const string uncommonTags = "Uncommon Tags"; if (SelectedPaymentRequestIds == null) return NoContent(); try @@ -137,17 +166,17 @@ public async Task OnPostAsync() var paymentRequestIds = JsonConvert.DeserializeObject>(SelectedPaymentRequestIds); if (SelectedTags != null) { - string[]? stringArray = JsonConvert.DeserializeObject(SelectedTags); - + + var selectedTagList = DeserializeJson>(SelectedTags) ?? []; if (null != paymentRequestIds) { var selectedPaymentRequestIds = paymentRequestIds.ToArray(); - if (Tags != null) + if (TagsJson != null) { - var tags = JsonConvert.DeserializeObject(Tags)?.ToList(); + var tags = JsonConvert.DeserializeObject(TagsJson)?.ToList(); - await ProcessTagsAsync(uncommonTags, stringArray, selectedPaymentRequestIds, tags); + await ProcessTagsAsync(uncommonTags, selectedTagList, selectedPaymentRequestIds, tags); } } @@ -162,44 +191,56 @@ public async Task OnPostAsync() return NoContent(); } - private async Task ProcessTagsAsync(string uncommonTags, string[]? stringArray, Guid[] selectedPaymentRequestIds, List? tags) + private async Task ProcessTagsAsync(string uncommonTagsLabel, List selectedTags, Guid[] selectedPaymentRequestIds, List? tags) { - foreach (var item in selectedPaymentRequestIds) + for (int i = 0; i < selectedPaymentRequestIds.Length; i++) { - var paymentTagString = ""; - + var item = selectedPaymentRequestIds[i]; + + var tagList = new List(); if (tags != null && tags.Count > 0 - && stringArray != null - && stringArray.Length > 0 - && stringArray.Contains(uncommonTags)) + && selectedTags != null + && selectedTags.Count > 0 + && selectedTags.Any(t => t.Name == uncommonTagsLabel)) { NewTagItem? paymentTag = tags.Find(tagItem => tagItem.PaymentRequestId == item.ToString()); - if (paymentTag != null) + if (paymentTag?.UncommonTags != null) { - paymentTagString += paymentTag.UncommonText; + + tagList.AddRange(paymentTag.UncommonTags); } } - if (stringArray != null && stringArray.Length > 0) + if (selectedTags != null && selectedTags.Count > 0) { - var paymentCommonTagArray = stringArray.Where(item => item != uncommonTags).ToArray(); - if (paymentCommonTagArray.Length > 0) - { - paymentTagString += (paymentTagString == "" ? string.Join(",", paymentCommonTagArray) : (',' + string.Join(",", paymentCommonTagArray))); - - } + var commonTagsOnly = selectedTags + .Where(tag => tag.Name != uncommonTagsLabel).Select(tag => new GlobalTagDto + { + Id = tag.Id, + Name = tag.Name + }).ToList(); + tagList.AddRange(commonTagsOnly); } + var distinctTags = tagList + .Where(tag => tag != null && tag.Id != Guid.Empty) + .GroupBy(tag => tag.Id) + .Select(group => group.First()) + .ToList(); - await _paymentTagsService.CreateorUpdateTagsAsync(item, new PaymentTagDto { PaymentRequestId = item, Text = RemoveDuplicates(paymentTagString) }); + await _paymentTagsService.AssignTagsAsync(new AssignPaymentTagDto + { + PaymentRequestId = item, + Tags = distinctTags + }); } } - private static string RemoveDuplicates(string paymentTagString) + + + private static T? DeserializeJson(string jsonString) where T : class { - var tagArray = paymentTagString.Split(","); - var noDuplicates = tagArray.Distinct().ToArray(); - return string.Join(",", noDuplicates); + return string.IsNullOrEmpty(jsonString) ? null : JsonConvert.DeserializeObject(jsonString); } } } diff --git a/applications/Unity.GrantManager/modules/Unity.Payments/src/Unity.Payments.Web/Views/Shared/Components/PaymentActionBar/Default.js b/applications/Unity.GrantManager/modules/Unity.Payments/src/Unity.Payments.Web/Views/Shared/Components/PaymentActionBar/Default.js index 688d66c1b..9ad9315b2 100644 --- a/applications/Unity.GrantManager/modules/Unity.Payments/src/Unity.Payments.Web/Views/Shared/Components/PaymentActionBar/Default.js +++ b/applications/Unity.GrantManager/modules/Unity.Payments/src/Unity.Payments.Web/Views/Shared/Components/PaymentActionBar/Default.js @@ -11,31 +11,25 @@ $(function () { max: 50 }); let suggestionsArray = []; - let uncommonTags = $('#UncommonTags').val(); - let commonTags = $('#CommonTags').val(); - let allTags = $('#AllTags').val(); + let uncommonTags = JSON.parse($('#UncommonTags').val()); + let commonTags = JSON.parse($('#CommonTags').val()); + let allTags = JSON.parse($('#AllTags').val()); if (allTags) { - suggestionsArray = allTags.split(','); + suggestionsArray = allTags; } tagInput.setSuggestions(suggestionsArray); let tagInputArray = []; - if (uncommonTags && uncommonTags != null) { - tagInputArray.push({ text: 'Uncommon Tags', class: 'tags-uncommon', id: 0 }) + if (uncommonTags && uncommonTags.length != 0) { + tagInputArray.push({ tagId: '00000000-0000-0000-0000-000000000000', Name: 'Uncommon Tags', class: 'tags-uncommon', Id: '00000000-0000-0000-0000-000000000000' }) } - const commonTagsArray = commonTags.split(','); - if (commonTags && commonTagsArray.length) { + if (commonTags?.length) { + commonTags.forEach(function (item, index) { - if (commonTagsArray.length) { - - commonTagsArray.forEach(function (item, index) { - - tagInputArray.push({ text: item, class: 'tags-common', id: index + 1 }) - }); - - } + tagInputArray.push({ tagId: item.Id, Name: item.Name, class: 'tags-common', Id: item.Id }) + }); } tagInput.addData(tagInputArray); }); diff --git a/applications/Unity.GrantManager/modules/Unity.Payments/src/Unity.Payments.Web/Views/Shared/Components/SupplierInfo/SupplierInfo.css b/applications/Unity.GrantManager/modules/Unity.Payments/src/Unity.Payments.Web/Views/Shared/Components/SupplierInfo/SupplierInfo.css index 893140a88..5a198a248 100644 --- a/applications/Unity.GrantManager/modules/Unity.Payments/src/Unity.Payments.Web/Views/Shared/Components/SupplierInfo/SupplierInfo.css +++ b/applications/Unity.GrantManager/modules/Unity.Payments/src/Unity.Payments.Web/Views/Shared/Components/SupplierInfo/SupplierInfo.css @@ -22,4 +22,13 @@ .hidden { display: none; +} + +input[readonly] { + color: var(--bc-colors-grey-text-200); + pointer-events: none; + background-color: var(--bc-colors-grey-hover) !important; + opacity: var(--bs-btn-disabled-opacity); + background-blend-mode: difference; + border: none !important; } \ No newline at end of file diff --git a/applications/Unity.GrantManager/modules/Unity.Payments/src/Unity.Payments.Web/Views/Shared/Components/SupplierInfo/SupplierInfo.js b/applications/Unity.GrantManager/modules/Unity.Payments/src/Unity.Payments.Web/Views/Shared/Components/SupplierInfo/SupplierInfo.js index 41706ec2e..a75de7599 100644 --- a/applications/Unity.GrantManager/modules/Unity.Payments/src/Unity.Payments.Web/Views/Shared/Components/SupplierInfo/SupplierInfo.js +++ b/applications/Unity.GrantManager/modules/Unity.Payments/src/Unity.Payments.Web/Views/Shared/Components/SupplierInfo/SupplierInfo.js @@ -1,6 +1,38 @@ $(function () { let dataTable; const l = abp.localization.getResource('Payments'); + let updateModal = new abp.ModalManager(abp.appPath + 'Sites/UpdateModal'); + + updateModal.onResult(function (data) { + dataTable.ajax.reload(); + abp.notify.success( + 'Site Updated successfully.', + 'Site Updated' + ); + }); + + updateModal.onOpen(function () { + const UIElements = { + payGroup: $('#Site_PaymentGroup'), + bankAccount: $('#Site_BankAccount'), + bankAccountWarningDiv: $('#bank-account-warning-div') + }; + + bindUIEvents(); + validateBankeAccount(); + + function bindUIEvents() { + UIElements.payGroup.on('change', validateBankeAccount); + } + + function validateBankeAccount() { + if (UIElements.payGroup.val() == 1 && UIElements.bankAccount.val() == '') { // EFT + UIElements.bankAccountWarningDiv.removeClass('hidden'); + } else { + UIElements.bankAccountWarningDiv.addClass('hidden'); + } + } + }); const UIElements = { navOrgInfoTab: $('#nav-organization-info-tab'), @@ -53,7 +85,6 @@ $(function () { .applicationApplicant .getSupplierNameMatchesCheck(applicantId, supplierName) .then((isMatch) => { - abp.notify.success(`Supplier info is now ${isMatch}`); $("#supplier-error-div").toggleClass('hidden', isMatch); }) .catch((error) => { @@ -159,7 +190,7 @@ $(function () { }; const listColumns = getColumns(); - const defaultVisibleColumns = ['number','paymentGroup','addressLine1','bankAccount','status','id']; + const defaultVisibleColumns = ['number','paymentGroup','addressLine1','bankAccount','status','id', 'rowActions']; let actionButtons = [ { @@ -187,6 +218,7 @@ $(function () { serverSideEnabled: false, pagingEnabled: false, reorderEnabled: false, + useNullPlaceholder: true, languageSetValues: {}, dataTableName: 'SiteInfoTable', externalSearchInputId: 'SiteInfoSearch', @@ -202,7 +234,8 @@ $(function () { getMailingAddress(columnIndex++), getBankAccount(columnIndex++), getStatus(columnIndex++), - getSiteDefaultRadio(columnIndex++) + getSiteDefaultRadio(columnIndex++), + getEditButtonColumn(columnIndex++) ].map((column) => ({ ...column, targets: [column.index], orderData: [column.index, 0] })); } } @@ -287,6 +320,31 @@ $(function () { index: columnIndex } } + + function getEditButtonColumn(columnIndex) { + return { + title: 'Actions', + data: 'id', + name: 'rowActions', + className: 'data-table-header', + orderable: false, + sortable: false, + index: columnIndex, + rowAction: { + items: + [ + { + text: 'Edit', + action: (data) => updateModal.open( + { id: data.record.id }, + + + ) + } + ] + } + } + } PubSub.subscribe( 'refresh_sites_list', diff --git a/applications/Unity.GrantManager/src/Unity.GrantManager.Application.Contracts/GrantApplications/ApplicationTagsDto.cs b/applications/Unity.GrantManager/src/Unity.GrantManager.Application.Contracts/GrantApplications/ApplicationTagsDto.cs index 4b0b4a570..8040ac459 100644 --- a/applications/Unity.GrantManager/src/Unity.GrantManager.Application.Contracts/GrantApplications/ApplicationTagsDto.cs +++ b/applications/Unity.GrantManager/src/Unity.GrantManager.Application.Contracts/GrantApplications/ApplicationTagsDto.cs @@ -1,4 +1,5 @@ using System; +using Unity.GrantManager.GlobalTag; using Volo.Abp.Application.Dtos; namespace Unity.GrantManager.GrantApplications; @@ -6,7 +7,9 @@ namespace Unity.GrantManager.GrantApplications; [Serializable] public class ApplicationTagsDto : EntityDto { + public Guid ApplicationId { get; set; } - public string Text { get; set; } = string.Empty; + + public TagDto? Tag { get; set; } } diff --git a/applications/Unity.GrantManager/src/Unity.GrantManager.Application.Contracts/GrantApplications/AssignApplicationTagsDto.cs b/applications/Unity.GrantManager/src/Unity.GrantManager.Application.Contracts/GrantApplications/AssignApplicationTagsDto.cs new file mode 100644 index 000000000..722140009 --- /dev/null +++ b/applications/Unity.GrantManager/src/Unity.GrantManager.Application.Contracts/GrantApplications/AssignApplicationTagsDto.cs @@ -0,0 +1,16 @@ +using System; +using System.Collections.Generic; +using Unity.GrantManager.GlobalTag; +using Volo.Abp.Application.Dtos; + +namespace Unity.GrantManager.GrantApplications; + +[Serializable] +public class AssignApplicationTagsDto : EntityDto +{ + + public Guid ApplicationId { get; set; } + + public List? Tags { get; set; } + +} diff --git a/applications/Unity.GrantManager/src/Unity.GrantManager.Application.Contracts/GrantApplications/GrantApplicationDto.cs b/applications/Unity.GrantManager/src/Unity.GrantManager.Application.Contracts/GrantApplications/GrantApplicationDto.cs index b9f0e0ae5..be0069adb 100644 --- a/applications/Unity.GrantManager/src/Unity.GrantManager.Application.Contracts/GrantApplications/GrantApplicationDto.cs +++ b/applications/Unity.GrantManager/src/Unity.GrantManager.Application.Contracts/GrantApplications/GrantApplicationDto.cs @@ -58,7 +58,7 @@ public class GrantApplicationDto : AuditedEntityDto public string? ContactEmail { get; set; } public string? ContactBusinessPhone { get; set; } public string? ContactCellPhone { get; set; } - public string? ApplicationTag { get; set; } + public List? ApplicationTag { get; set; } public Guid? OwnerId { get; set; } public string? OrganizationName { get; set; } public string? OrganizationType { get; set; } diff --git a/applications/Unity.GrantManager/src/Unity.GrantManager.Application.Contracts/GrantApplications/IApplicationTagsService.cs b/applications/Unity.GrantManager/src/Unity.GrantManager.Application.Contracts/GrantApplications/IApplicationTagsService.cs index ab7b02653..bced8f801 100644 --- a/applications/Unity.GrantManager/src/Unity.GrantManager.Application.Contracts/GrantApplications/IApplicationTagsService.cs +++ b/applications/Unity.GrantManager/src/Unity.GrantManager.Application.Contracts/GrantApplications/IApplicationTagsService.cs @@ -9,16 +9,16 @@ namespace Unity.GrantManager.GrantApplications; public interface IApplicationTagsService : IApplicationService { Task> GetListAsync(); - Task> GetListWithApplicationIdsAsync(List ids); + Task> GetListWithApplicationIdsAsync(List ids); - Task CreateorUpdateTagsAsync(Guid id, ApplicationTagsDto input); + Task> AssignTagsAsync(AssignApplicationTagsDto input); Task GetApplicationTagsAsync(Guid id); Task> GetTagSummaryAsync(); - Task GetMaxRenameLengthAsync(string originalTag); Task> RenameTagAsync(string originalTag, string replacementTag); Task RenameTagGlobalAsync(string originalTag, string replacementTag); - Task DeleteTagAsync(string deleteTag); - Task DeleteTagGlobalAsync(string deleteTag); + Task DeleteTagWithTagIdAsync(Guid id); + Task DeleteTagAsync(Guid id); + } diff --git a/applications/Unity.GrantManager/src/Unity.GrantManager.Application.Contracts/GrantApplications/TagSummaryCountDto.cs b/applications/Unity.GrantManager/src/Unity.GrantManager.Application.Contracts/GrantApplications/TagSummaryCountDto.cs index 8507c88c4..0dab1a217 100644 --- a/applications/Unity.GrantManager/src/Unity.GrantManager.Application.Contracts/GrantApplications/TagSummaryCountDto.cs +++ b/applications/Unity.GrantManager/src/Unity.GrantManager.Application.Contracts/GrantApplications/TagSummaryCountDto.cs @@ -1,6 +1,7 @@ -namespace Unity.GrantManager.GrantApplications; +using Unity.GrantManager.GlobalTag; +namespace Unity.GrantManager.GrantApplications; public class TagSummaryCountDto { - public required string Text { get; set; } + public required TagDto Tag { get; set; } public required int Count { get; set; } } diff --git a/applications/Unity.GrantManager/src/Unity.GrantManager.Application.Contracts/Permissions/GrantApplications/GrantApplicationPermissionDefinitionProvider.cs b/applications/Unity.GrantManager/src/Unity.GrantManager.Application.Contracts/Permissions/GrantApplications/GrantApplicationPermissionDefinitionProvider.cs index 41852b750..c85624249 100644 --- a/applications/Unity.GrantManager/src/Unity.GrantManager.Application.Contracts/Permissions/GrantApplications/GrantApplicationPermissionDefinitionProvider.cs +++ b/applications/Unity.GrantManager/src/Unity.GrantManager.Application.Contracts/Permissions/GrantApplications/GrantApplicationPermissionDefinitionProvider.cs @@ -81,6 +81,7 @@ public override void Define(IPermissionDefinitionContext context) // Settings - Tag Management var tagManagement = settingManagement.AddPermission(UnitySelector.SettingManagement.Tags.Default, L(UnitySelector.SettingManagement.Tags.Default)); + tagManagement.AddChild(UnitySelector.SettingManagement.Tags.Create, L(UnitySelector.SettingManagement.Tags.Create)); tagManagement.AddChild(UnitySelector.SettingManagement.Tags.Update, L(UnitySelector.SettingManagement.Tags.Update)); tagManagement.AddChild(UnitySelector.SettingManagement.Tags.Delete, L(UnitySelector.SettingManagement.Tags.Delete)); diff --git a/applications/Unity.GrantManager/src/Unity.GrantManager.Application.Contracts/Tags/ITagsService.cs b/applications/Unity.GrantManager/src/Unity.GrantManager.Application.Contracts/Tags/ITagsService.cs new file mode 100644 index 000000000..1495fb7f1 --- /dev/null +++ b/applications/Unity.GrantManager/src/Unity.GrantManager.Application.Contracts/Tags/ITagsService.cs @@ -0,0 +1,19 @@ +using System; +using System.Collections.Generic; +using System.Threading.Tasks; +using Volo.Abp.Application.Dtos; +using Volo.Abp.Application.Services; + +namespace Unity.GrantManager.GlobalTag; + +public interface ITagsService : IApplicationService +{ + Task> GetListAsync(); + Task CreateorUpdateTagsAsync(Guid id, TagDto input); + Task CreateTagsAsync (TagDto input); + Task> GetTagSummaryAsync(); + Task> RenameTagAsync(Guid id, string originalTag, string replacementTag); + Task RenameTagGlobalAsync(Guid id,string originalTag, string replacementTag); + Task DeleteTagAsync(Guid id); + Task DeleteTagGlobalAsync(Guid id); +} diff --git a/applications/Unity.GrantManager/src/Unity.GrantManager.Application.Contracts/Tags/TagDto.cs b/applications/Unity.GrantManager/src/Unity.GrantManager.Application.Contracts/Tags/TagDto.cs new file mode 100644 index 000000000..517ff9010 --- /dev/null +++ b/applications/Unity.GrantManager/src/Unity.GrantManager.Application.Contracts/Tags/TagDto.cs @@ -0,0 +1,10 @@ +using System; +using Volo.Abp.Application.Dtos; + +namespace Unity.GrantManager.GlobalTag; + +[Serializable] +public class TagDto : EntityDto +{ + public string Name { get; set; } = string.Empty; +} diff --git a/applications/Unity.GrantManager/src/Unity.GrantManager.Application.Contracts/Tags/TagUsageSummaryDto.cs b/applications/Unity.GrantManager/src/Unity.GrantManager.Application.Contracts/Tags/TagUsageSummaryDto.cs new file mode 100644 index 000000000..0c55a418c --- /dev/null +++ b/applications/Unity.GrantManager/src/Unity.GrantManager.Application.Contracts/Tags/TagUsageSummaryDto.cs @@ -0,0 +1,15 @@ +using System; +using Volo.Abp.Application.Dtos; + +namespace Unity.GrantManager.GlobalTag; + +[Serializable] +public class TagUsageSummaryDto : EntityDto +{ + public Guid TagId { get; set; } + public string TagName { get; set; } = string.Empty; + public int ApplicationTagCount { get; set; } + public int PaymentTagCount { get; set; } + public int TotalUsageCount => ApplicationTagCount + PaymentTagCount; + +} diff --git a/applications/Unity.GrantManager/src/Unity.GrantManager.Application.Contracts/Tags/TagsDto.cs b/applications/Unity.GrantManager/src/Unity.GrantManager.Application.Contracts/Tags/TagsDto.cs new file mode 100644 index 000000000..ae4d10fbd --- /dev/null +++ b/applications/Unity.GrantManager/src/Unity.GrantManager.Application.Contracts/Tags/TagsDto.cs @@ -0,0 +1,12 @@ +using System; +using Volo.Abp.Application.Dtos; + +namespace Unity.GrantManager.GlobalTag; + +[Serializable] +public class TagsDto : EntityDto +{ + + public string Name { get; set; } = string.Empty; + +} diff --git a/applications/Unity.GrantManager/src/Unity.GrantManager.Application/Dashboard/DashboardAppService.cs b/applications/Unity.GrantManager/src/Unity.GrantManager.Application/Dashboard/DashboardAppService.cs index eb3d2c9d7..ed12f9ca4 100644 --- a/applications/Unity.GrantManager/src/Unity.GrantManager.Application/Dashboard/DashboardAppService.cs +++ b/applications/Unity.GrantManager/src/Unity.GrantManager.Application/Dashboard/DashboardAppService.cs @@ -102,13 +102,16 @@ public virtual async Task> GetApplicationTagsCountAsy var applicationTagsDto = await ExecuteWithDisabledTracking(async () => { + var tagQueryable = (await _applicationTagsRepository.GetQueryableAsync()) + .Include(t => t.Tag); var query = from baseQuery in await GetBaseQueryAsync(parameters) - join tag in await _applicationTagsRepository.GetQueryableAsync() on baseQuery.Application.Id equals tag.ApplicationId + join tag in tagQueryable on baseQuery.Application.Id equals tag.ApplicationId select tag; + var applicationTags = await query.Distinct().ToListAsync(); - List concatenatedTags = applicationTags.Select(tags => tags.Text).ToList(); + List concatenatedTags = applicationTags.Select(tags => tags.Tag.Name).ToList(); List tags = []; concatenatedTags.ForEach(txt => tags.AddRange([.. txt.Split(',')])); tags = tags.Where(s => !string.IsNullOrWhiteSpace(s) && parameters.Tags.Contains(s)).ToList(); @@ -212,11 +215,11 @@ public virtual async Task> GetRequestApprovedCo private async Task> GetFilteredApplicationTags(IQueryable applications, DashboardParameters parameters) { - var tags = await _applicationTagsRepository.GetQueryableAsync(); + var tags = await _applicationTagsRepository.WithDetailsAsync(); var tagsResult = tags.Join(applications, tag => tag.ApplicationId, app => app.Id, (tag, app) => tag); var applicationIdsWithTags = tagsResult.AsEnumerable() - .SelectMany(tag => tag.Text.Split(','), (tagResult, tag) => new { tagResult.ApplicationId, Tag = tag }) + .SelectMany(tag => tag.Tag.Name.Split(','), (tagResult, tag) => new { tagResult.ApplicationId, Tag = tag }) .Where(tag => parameters.Tags.Contains(tag.Tag)) .Select(tag => tag.ApplicationId) .ToHashSet(); diff --git a/applications/Unity.GrantManager/src/Unity.GrantManager.Application/GrantApplications/ApplicationTagsAppService.cs b/applications/Unity.GrantManager/src/Unity.GrantManager.Application/GrantApplications/ApplicationTagsAppService.cs index e398922bf..56f2dd01c 100644 --- a/applications/Unity.GrantManager/src/Unity.GrantManager.Application/GrantApplications/ApplicationTagsAppService.cs +++ b/applications/Unity.GrantManager/src/Unity.GrantManager.Application/GrantApplications/ApplicationTagsAppService.cs @@ -1,4 +1,5 @@ using Microsoft.AspNetCore.Authorization; +using Microsoft.EntityFrameworkCore; using System; using System.Collections.Generic; using System.Linq; @@ -12,6 +13,7 @@ using Volo.Abp.DependencyInjection; using Volo.Abp.Domain.Repositories; using Volo.Abp.EventBus.Local; +using Volo.Abp.ObjectMapping; namespace Unity.GrantManager.GrantApplications; @@ -36,7 +38,7 @@ public async Task> GetListAsync() return ObjectMapper.Map, List>(tags.OrderBy(t => t.Id).ToList()); } - public async Task> GetListWithApplicationIdsAsync(List ids) + public async Task> GetListWithApplicationIdsAsync(List ids) { var tags = await _applicationTagsRepository.GetListAsync(e => ids.Contains(e.ApplicationId)); @@ -45,37 +47,53 @@ public async Task> GetListWithApplicationIdsAsync(List public async Task GetApplicationTagsAsync(Guid id) { - var applicationTags = await _applicationTagsRepository.FirstOrDefaultAsync(s => s.ApplicationId == id); + var applicationTags = await (await _applicationTagsRepository.GetQueryableAsync()) + .Include(x => x.Tag) + .FirstOrDefaultAsync(x => x.ApplicationId == id); if (applicationTags == null) return null; return ObjectMapper.Map(applicationTags); } - public async Task CreateorUpdateTagsAsync(Guid id, ApplicationTagsDto input) + public async Task> AssignTagsAsync(AssignApplicationTagsDto input) { - var applicationTag = await _applicationTagsRepository.FirstOrDefaultAsync(e => e.ApplicationId == id); + var existingApplicationTags = await _applicationTagsRepository.GetListAsync(e => e.ApplicationId == input.ApplicationId); + var existingTagIds = existingApplicationTags.Select(t => t.TagId).ToHashSet(); + var inputTagIds = input.Tags?.Select(t => t.Id).ToHashSet() ?? new HashSet(); + var newTagsToAdd = input.Tags? + .Where(tag => !existingTagIds.Contains(tag.Id)) + .Select(tag => new ApplicationTags + { + ApplicationId = input.ApplicationId, + TagId = tag.Id + }) + .ToList(); + var tagsToRemove = existingApplicationTags + .Where(et => !inputTagIds.Contains(et.TagId)) + .ToList(); - // Sanitize input tag text string - var tagInput = input.Text.Split(',', StringSplitOptions.RemoveEmptyEntries | StringSplitOptions.TrimEntries).ToHashSet(); - input.Text = string.Join(',', tagInput.OrderBy(t => t, StringComparer.InvariantCultureIgnoreCase)); - if (applicationTag == null) + if (tagsToRemove.Count > 0) { - var newTag = await _applicationTagsRepository.InsertAsync(new ApplicationTags - { - ApplicationId = input.ApplicationId, - Text = input.Text + await _applicationTagsRepository.DeleteManyAsync(tagsToRemove, autoSave: true); + } + if (newTagsToAdd?.Count > 0) + { + await _applicationTagsRepository.InsertManyAsync(newTagsToAdd, autoSave: true); - }, autoSave: true); + var tagIds = newTagsToAdd.Select(x => x.TagId).ToList(); - return ObjectMapper.Map(newTag); + var insertedTagsWithNavProps = await (await _applicationTagsRepository.GetQueryableAsync()) + .Where(x => x.ApplicationId == input.ApplicationId && tagIds.Contains(x.TagId)) + .Include(x => x.Tag) + .ToListAsync(); + + return ObjectMapper.Map, List>(insertedTagsWithNavProps); } else { - applicationTag.Text = input.Text; - await _applicationTagsRepository.UpdateAsync(applicationTag, autoSave: true); - return ObjectMapper.Map(applicationTag); + return new List(); } } @@ -91,18 +109,6 @@ public async Task> GetTagSummaryAsync() ); } - /// - /// For a given Tag, finds the maximum length available for renaming. - /// - /// The tag to be replaced. - /// The maximum length available for renaming - [Authorize(UnitySelector.SettingManagement.Tags.Update)] - public async Task GetMaxRenameLengthAsync(string originalTag) - { - Check.NotNullOrWhiteSpace(originalTag, nameof(originalTag)); - return await _applicationTagsRepository.GetMaxRenameLengthAsync(originalTag); - } - /// /// Renames a tag across all application tags, replacing the original tag with the replacement tag. /// Only whole-word tags are replaced; substring matches are ignored. @@ -128,34 +134,25 @@ public async Task> RenameTagAsync(string originalTag, string replacem } var applicationTags = await _applicationTagsRepository - .GetListAsync(e => e.Text.Contains(originalTag)); + .GetListAsync(e => e.Tag.Name.Contains(originalTag)); if (applicationTags.Count == 0) return []; - int maxRemainingLength = await GetMaxRenameLengthAsync(originalTag); - if (replacementTag.Length > maxRemainingLength) - { - throw new ArgumentOutOfRangeException( - nameof(replacementTag), - $"String length exceeds maximum allowed length of {maxRemainingLength}. Actual length: {replacementTag.Length}" - ); - } - var updatedTags = new List(applicationTags.Count); foreach (var item in applicationTags) { // Split and trim tags, use case-insensitive HashSet for matching var tagSet = new HashSet( - item.Text.Split(',', StringSplitOptions.RemoveEmptyEntries | StringSplitOptions.TrimEntries), + item.Tag.Name.Split(',', StringSplitOptions.RemoveEmptyEntries | StringSplitOptions.TrimEntries), StringComparer.InvariantCultureIgnoreCase); // Only replace if the original tag exists (case-insensitive) if (tagSet.Remove(originalTag)) { tagSet.Add(replacementTag); // No effect if replacement already exists - item.Text = string.Join(',', tagSet.OrderBy(t => t, StringComparer.InvariantCultureIgnoreCase)); + item.Tag.Name = string.Join(',', tagSet.OrderBy(t => t, StringComparer.InvariantCultureIgnoreCase)); updatedTags.Add(item); } } @@ -196,61 +193,22 @@ await _localEventBus.PublishAsync( /// /// String of tag to be deleted. [Authorize(UnitySelector.SettingManagement.Tags.Delete)] - public async Task DeleteTagAsync(string deleteTag) + public async Task DeleteTagWithTagIdAsync(Guid id) { - Check.NotNullOrWhiteSpace(deleteTag, nameof(deleteTag)); - - // Remove commas from the originalTag and replacementTag - deleteTag = deleteTag.Replace(",", string.Empty).Trim(); - - var applicationTags = await _applicationTagsRepository - .GetListAsync(e => e.Text.Contains(deleteTag)); - var updatedTags = new List(); - var deletedTags = new List(); + var existingApplicationTags = await _applicationTagsRepository.GetListAsync(e => e.Tag.Id == id); + var idsToDelete = existingApplicationTags.Select(x => x.Id).ToList(); + await _applicationTagsRepository.DeleteManyAsync(idsToDelete, autoSave: true); + - foreach (var item in applicationTags) - { - var tagSet = new HashSet( - item.Text.Split(',', StringSplitOptions.RemoveEmptyEntries | StringSplitOptions.TrimEntries), - StringComparer.InvariantCultureIgnoreCase); - - // Only replace whole word tags - skip substring matches - if (tagSet.Remove(deleteTag)) - { - if (tagSet.Count > 0) - { - item.Text = string.Join(',', tagSet.OrderBy(t => t, StringComparer.InvariantCultureIgnoreCase)); - updatedTags.Add(item); - } - else - { - deletedTags.Add(item); - } - } - } - - if (deletedTags.Count > 0) - { - await _applicationTagsRepository.DeleteManyAsync(deletedTags, autoSave: true); - } - - if (updatedTags.Count > 0) - { - await _applicationTagsRepository.UpdateManyAsync(updatedTags, autoSave: true); - } + } - /// - /// Deletes a tag from all applications and payment requests. - /// - /// String of tag to be deleted. [Authorize(UnitySelector.SettingManagement.Tags.Delete)] - public virtual async Task DeleteTagGlobalAsync(string deleteTag) + public async Task DeleteTagAsync(Guid id) { - Check.NotNullOrWhiteSpace(deleteTag, nameof(deleteTag)); - await DeleteTagAsync(deleteTag); - await _localEventBus.PublishAsync(new DeleteTagEto { TagName = deleteTag }); + await _applicationTagsRepository.DeleteAsync(id); } + } \ No newline at end of file diff --git a/applications/Unity.GrantManager/src/Unity.GrantManager.Application/GrantApplications/GrantApplicationAppService.cs b/applications/Unity.GrantManager/src/Unity.GrantManager.Application/GrantApplications/GrantApplicationAppService.cs index e7388a434..7804727c2 100644 --- a/applications/Unity.GrantManager/src/Unity.GrantManager.Application/GrantApplications/GrantApplicationAppService.cs +++ b/applications/Unity.GrantManager/src/Unity.GrantManager.Application/GrantApplications/GrantApplicationAppService.cs @@ -125,7 +125,7 @@ public async Task> GetListAsync(PagedAndSort appDto.Status = firstApplication.ApplicationStatus.InternalStatus; appDto.Applicant = ObjectMapper.Map(firstApplication.Applicant); appDto.Category = firstApplication.ApplicationForm.Category ?? string.Empty; - appDto.ApplicationTag = firstApplication.ApplicationTags?.FirstOrDefault()?.Text ?? string.Empty; + appDto.ApplicationTag = ObjectMapper.Map, List>(firstApplication.ApplicationTags?.ToList() ?? new List()); appDto.Owner = BuildApplicationOwner(firstApplication.Owner); appDto.OrganizationName = firstApplication.Applicant?.OrgName ?? string.Empty; appDto.OrganizationType = firstApplication.Applicant?.OrganizationType ?? string.Empty; diff --git a/applications/Unity.GrantManager/src/Unity.GrantManager.Application/GrantManagerApplicationAutoMapperProfile.cs b/applications/Unity.GrantManager/src/Unity.GrantManager.Application/GrantManagerApplicationAutoMapperProfile.cs index c97bfde6d..436c2efba 100644 --- a/applications/Unity.GrantManager/src/Unity.GrantManager.Application/GrantManagerApplicationAutoMapperProfile.cs +++ b/applications/Unity.GrantManager/src/Unity.GrantManager.Application/GrantManagerApplicationAutoMapperProfile.cs @@ -7,6 +7,7 @@ using Unity.GrantManager.Comments; using Unity.GrantManager.Events; using Unity.GrantManager.Forms; +using Unity.GrantManager.GlobalTag; using Unity.GrantManager.GrantApplications; using Unity.GrantManager.Identity; using Unity.GrantManager.Intakes; @@ -76,8 +77,12 @@ public GrantManagerApplicationAutoMapperProfile() CreateMap().ReverseMap(); CreateMap().ReverseMap(); CreateMap().ReverseMap(); - + CreateMap(); CreateMap(); + CreateMap(); + CreateMap(); + CreateMap() + .ForMember(dest => dest.Tag, opt => opt.MapFrom(src => src.Tag)); //-- PROJECT INFO CreateMap() diff --git a/applications/Unity.GrantManager/src/Unity.GrantManager.Application/Handlers/TagDeletedHandler.cs b/applications/Unity.GrantManager/src/Unity.GrantManager.Application/Handlers/TagDeletedHandler.cs new file mode 100644 index 000000000..2acaa09d5 --- /dev/null +++ b/applications/Unity.GrantManager/src/Unity.GrantManager.Application/Handlers/TagDeletedHandler.cs @@ -0,0 +1,26 @@ +using System.Threading.Tasks; +using Volo.Abp.EventBus; +using Unity.Payments.Events; +using Volo.Abp.DependencyInjection; +using Unity.GrantManager.GlobalTag; + +namespace Unity.GrantManager.Handlers +{ + public class TagDeletedHandler : ILocalEventHandler, + ITransientDependency + { + private readonly ITagsService _tagsService; + + public TagDeletedHandler(ITagsService tagsService) + { + + _tagsService = tagsService; + } + public async Task HandleEventAsync(TagDeletedEto eventData) + { + + await _tagsService.DeleteTagAsync(eventData.TagId); + + } + } +} diff --git a/applications/Unity.GrantManager/src/Unity.GrantManager.Application/Intakes/ApplicationIntakeAdminService.cs b/applications/Unity.GrantManager/src/Unity.GrantManager.Application/Intakes/ApplicationIntakeAdminService.cs new file mode 100644 index 000000000..4d820df70 --- /dev/null +++ b/applications/Unity.GrantManager/src/Unity.GrantManager.Application/Intakes/ApplicationIntakeAdminService.cs @@ -0,0 +1,66 @@ +using Microsoft.AspNetCore.Authorization; +using Newtonsoft.Json.Linq; +using System; +using System.Linq; +using System.Threading.Tasks; +using Unity.GrantManager.Applications; +using Unity.GrantManager.Integration.Chefs; +using Volo.Abp.Domain.Entities; + +namespace Unity.GrantManager.Intakes +{ + [Authorize] + public class ApplicationIntakeAdminService(CustomFieldsIntakeSubmissionMapper customFieldsIntakeSubmissionMapper, + IApplicationRepository applicationRepository, + IApplicationFormSubmissionRepository applicationFormSubmissionsRepository, + IApplicationFormVersionRepository applicationFormVersionRepository, + IApplicationFormRepository applicationFormRepository, + ISubmissionsApiService submissionsApiService) + : GrantManagerAppService + { + /// + /// Fix any missing worksheet instances that may have failed to create during intake + /// + /// + /// + /// + public async Task FixMissingWorksheetsAsync(string referenceNo, Guid tenantId) + { + using (CurrentTenant.Change(tenantId)) + { + var application = + (await applicationRepository.GetQueryableAsync()) + .FirstOrDefault(a => a.ReferenceNo == referenceNo) + ?? throw new EntityNotFoundException("Application not found"); + + var submission = + (await applicationFormSubmissionsRepository.GetQueryableAsync()) + .FirstOrDefault(s => s.ApplicationId == application.Id) + ?? throw new EntityNotFoundException("Application Form Submission not found"); + + var applicationForm = await applicationFormRepository.GetAsync(application.ApplicationFormId) + ?? throw new EntityNotFoundException("Application Form not found"); + + if (applicationForm.ChefsApplicationFormGuid == null) + { + throw new EntityNotFoundException("Chefs Application Form Guid not found for the form version"); + } + + var formVersionId = submission.ApplicationFormVersionId + ?? throw new EntityNotFoundException("Application Form Version not found for the submission"); + + var formVersion = await applicationFormVersionRepository.GetAsync(formVersionId); + + JObject? submissionData = await submissionsApiService + .GetSubmissionDataAsync(Guid.Parse(applicationForm.ChefsApplicationFormGuid), Guid.Parse(submission.ChefsSubmissionGuid)) + ?? throw new EntityNotFoundException("No Submission retrieved from CHEFS"); + + await customFieldsIntakeSubmissionMapper.MapAndPersistCustomFields( + application.Id, + formVersionId, + submissionData, + formVersion.SubmissionHeaderMapping); + } + } + } +} diff --git a/applications/Unity.GrantManager/src/Unity.GrantManager.Application/Tags/TagsAppService.cs b/applications/Unity.GrantManager/src/Unity.GrantManager.Application/Tags/TagsAppService.cs new file mode 100644 index 000000000..6425567b5 --- /dev/null +++ b/applications/Unity.GrantManager/src/Unity.GrantManager.Application/Tags/TagsAppService.cs @@ -0,0 +1,185 @@ +using Microsoft.AspNetCore.Authorization; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Threading.Tasks; +using Unity.GrantManager.GrantApplications; +using Unity.Modules.Shared; +using Unity.Payments.Events; +using Volo.Abp; +using Volo.Abp.Application.Dtos; +using Volo.Abp.Application.Services; +using Volo.Abp.DependencyInjection; +using Volo.Abp.Domain.Repositories; +using Volo.Abp.EventBus.Local; + +namespace Unity.GrantManager.GlobalTag; + +[System.Diagnostics.CodeAnalysis.SuppressMessage( + category: "Performance", + checkId:"CA1862:Use the 'StringComparison' method overloads to perform case-insensitive string comparisons", + Justification = "EF Core cannot translate StringComparison.OrdinalIgnoreCase, so use ToLower() for comparison")] +[Authorize] +[Dependency(ReplaceServices = true)] +[ExposeServices(typeof(TagsAppService), typeof(ITagsService))] +public class TagsAppService : ApplicationService, ITagsService +{ + private readonly ITagsRepository _tagsRepository; + private readonly IApplicationTagsService _applicationTagsService; + private readonly ILocalEventBus _localEventBus; + + public TagsAppService(ITagsRepository repository, ILocalEventBus localEventBus, IApplicationTagsService applicationTagsService) + { + _tagsRepository = repository; + _localEventBus = localEventBus; + _applicationTagsService = applicationTagsService; + } + + public async Task> GetListAsync() + { + var tags = await _tagsRepository.GetListAsync(); + return ObjectMapper.Map, List>(tags.OrderBy(t => t.Id).ToList()); + } + + [Authorize(UnitySelector.SettingManagement.Tags.Create)] + public async Task CreateTagsAsync(TagDto input) + { + var normalizedName = input.Name.ToLower(); + var tag = await _tagsRepository + .FirstOrDefaultAsync(e => e.Name.ToLower() == normalizedName); + + if (tag != null) + { + throw new BusinessException( + + "400", "Another tag with the same name already exists." + ); + } + var newTag = await _tagsRepository.InsertAsync(new Tag + { + Name = input.Name + }, autoSave: true); + + return ObjectMapper.Map(newTag); + } + + public async Task CreateorUpdateTagsAsync(Guid id, TagDto input) + { + var normalizedName = input.Name.ToLower(); + var tag = await _tagsRepository + .FirstOrDefaultAsync(e => e.Name.ToLower() == normalizedName); + + if (tag == null) + { + var newTag = await _tagsRepository.InsertAsync(new Tag + { + Name = input.Name + }, autoSave: true); + + return ObjectMapper.Map(newTag); + } + else + { + tag.Name = input.Name; + await _tagsRepository.UpdateAsync(tag, autoSave: true); + return ObjectMapper.Map(tag); + } + } + + /// + /// Renames a tag across all application tags, replacing the original tag with the replacement tag. + /// Only whole-word tags are replaced; substring matches are ignored. + /// Throws a BusinessException if the original and replacement tags are the same. + /// + /// The tag to be replaced. + /// The new tag to use as a replacement. + /// A list of IDs for the ApplicationTags entities that were updated. + /// Thrown if the original and replacement tags are the same. + [Authorize(UnitySelector.SettingManagement.Tags.Update)] + public async Task> RenameTagAsync(Guid id, string originalTag, string replacementTag) + { + Check.NotNullOrWhiteSpace(originalTag, nameof(originalTag)); + Check.NotNullOrWhiteSpace(replacementTag, nameof(replacementTag)); + + var duplicateTag = await _tagsRepository + .FirstOrDefaultAsync(e => e.Name.ToLower() == replacementTag.ToLower() && e.Id != id); + if (duplicateTag != null) + { + throw new BusinessException( + + "400", "Another tag with the same name already exists." + ); + } + + var tag = await _tagsRepository + .FindAsync(e => e.Id.Equals(id)); + + if (tag == null) + return []; + + tag.Name = replacementTag; + + await _tagsRepository.UpdateAsync(tag, autoSave: true); + + return [tag.Id]; + } + + /// + /// Deletes a tag from all applications and payment requests. + /// + /// String of tag to be deleted. + [Authorize(UnitySelector.SettingManagement.Tags.Update)] + public virtual async Task RenameTagGlobalAsync(Guid id, string originalTag, string replacementTag) + { + Check.NotNullOrWhiteSpace(originalTag, nameof(originalTag)); + Check.NotNullOrWhiteSpace(replacementTag, nameof(replacementTag)); + + // NOTE: Unable to get the MIN of the MaxRenameLength for both Application and Payments. Must get on front-end by 2 API calls. + // May result in one EntityType tag renaming with the other failing in rare cases. + + await RenameTagAsync(id, originalTag, replacementTag); + await _localEventBus.PublishAsync( + new RenameTagEto + { + originalTagName = originalTag, + replacementTagName = replacementTag + } + ); + } + + /// + /// Deletes a tag from all application tags. Only whole-word tags are removed; substring matches are ignored. + /// + /// String of tag to be deleted. + [Authorize(UnitySelector.SettingManagement.Tags.Delete)] + public async Task DeleteTagAsync(Guid id) + { + await _tagsRepository.DeleteAsync(id); + } + + /// + /// Deletes a tag from all applications and payment requests. + /// + /// String of tag to be deleted. + [Authorize(UnitySelector.SettingManagement.Tags.Delete)] + public virtual async Task DeleteTagGlobalAsync(Guid id) + { + + await _applicationTagsService.DeleteTagWithTagIdAsync(id); + await _localEventBus.PublishAsync(new DeleteTagEto { TagId = id }); + + } + + public async Task> GetTagSummaryAsync() + { + var summary = await _tagsRepository.GetTagUsageSummaryAsync(); + + // Correct the mapping by swapping the source and destination types + var tagSummary = ObjectMapper.Map, List>(summary); + + return new PagedResultDto( + tagSummary.Count, + tagSummary // Use the correctly mapped tagSummary here + ); + } +} \ No newline at end of file diff --git a/applications/Unity.GrantManager/src/Unity.GrantManager.Domain/Applications/ApplicationTags.cs b/applications/Unity.GrantManager/src/Unity.GrantManager.Domain/Applications/ApplicationTags.cs index 6aad554ee..52fd8c08e 100644 --- a/applications/Unity.GrantManager/src/Unity.GrantManager.Domain/Applications/ApplicationTags.cs +++ b/applications/Unity.GrantManager/src/Unity.GrantManager.Domain/Applications/ApplicationTags.cs @@ -1,6 +1,7 @@ using System; using Volo.Abp.Domain.Entities.Auditing; using Volo.Abp.MultiTenancy; +using Unity.GrantManager.GlobalTag; namespace Unity.GrantManager.Applications; @@ -16,5 +17,14 @@ public virtual Application Application private Application? _application; public string Text { get; set; } = string.Empty; + public Guid TagId { get; set; } + + public virtual Tag Tag + { + set => _tag = value; + get => _tag + ?? throw new InvalidOperationException("Uninitialized property: " + nameof(Tag )); + } + private Tag? _tag; public Guid? TenantId { get; set; } } \ No newline at end of file diff --git a/applications/Unity.GrantManager/src/Unity.GrantManager.Domain/Applications/IApplicationTagsRepository.cs b/applications/Unity.GrantManager/src/Unity.GrantManager.Domain/Applications/IApplicationTagsRepository.cs index 74eb5ebf3..7e7f7c870 100644 --- a/applications/Unity.GrantManager/src/Unity.GrantManager.Domain/Applications/IApplicationTagsRepository.cs +++ b/applications/Unity.GrantManager/src/Unity.GrantManager.Domain/Applications/IApplicationTagsRepository.cs @@ -8,5 +8,4 @@ namespace Unity.GrantManager.Applications; public interface IApplicationTagsRepository : IRepository { Task> GetTagSummary(); - Task GetMaxRenameLengthAsync(string originalTag); } diff --git a/applications/Unity.GrantManager/src/Unity.GrantManager.Domain/Applications/TagSummaryCount.cs b/applications/Unity.GrantManager/src/Unity.GrantManager.Domain/Applications/TagSummaryCount.cs index 66e88c481..4e93467ab 100644 --- a/applications/Unity.GrantManager/src/Unity.GrantManager.Domain/Applications/TagSummaryCount.cs +++ b/applications/Unity.GrantManager/src/Unity.GrantManager.Domain/Applications/TagSummaryCount.cs @@ -1,6 +1,9 @@ -namespace Unity.GrantManager.Applications; -public class TagSummaryCount(string name, int count) + +using Unity.GrantManager.GlobalTag; + +namespace Unity.GrantManager.Applications; +public class TagSummaryCount(Tag tag, int count) { - public string Text { get; set; } = name; + public Tag Tag { get; set; } = tag; public int Count { get; set; } = count; } diff --git a/applications/Unity.GrantManager/src/Unity.GrantManager.Domain/Intakes/CustomFieldsIntakeSubmissionMapper.cs b/applications/Unity.GrantManager/src/Unity.GrantManager.Domain/Intakes/CustomFieldsIntakeSubmissionMapper.cs index 9e982d789..ef8b898da 100644 --- a/applications/Unity.GrantManager/src/Unity.GrantManager.Domain/Intakes/CustomFieldsIntakeSubmissionMapper.cs +++ b/applications/Unity.GrantManager/src/Unity.GrantManager.Domain/Intakes/CustomFieldsIntakeSubmissionMapper.cs @@ -65,7 +65,8 @@ await localEventBus.PublishAsync(new CreateWorksheetInstanceByFieldValuesEto() InstanceCorrelationId = applicationId, InstanceCorrelationProvider = CorrelationConsts.Application, CustomFields = customIntakeValues, - VersionData = version?.ToString() + VersionData = version?.ToString(), + TenantId = CurrentTenant.Id }); } } diff --git a/applications/Unity.GrantManager/src/Unity.GrantManager.Domain/Permissions/PermissionGrantsDataSeeder.cs b/applications/Unity.GrantManager/src/Unity.GrantManager.Domain/Permissions/PermissionGrantsDataSeeder.cs index 856de9e42..2c7405890 100644 --- a/applications/Unity.GrantManager/src/Unity.GrantManager.Domain/Permissions/PermissionGrantsDataSeeder.cs +++ b/applications/Unity.GrantManager/src/Unity.GrantManager.Domain/Permissions/PermissionGrantsDataSeeder.cs @@ -83,6 +83,7 @@ public PermissionGrantsDataSeeder(IPermissionDataSeeder permissionDataSeeder) public readonly List SettingManagement_Tags_CommonPermissions = [ UnitySelector.SettingManagement.Tags.Default, + UnitySelector.SettingManagement.Tags.Create, UnitySelector.SettingManagement.Tags.Update, UnitySelector.SettingManagement.Tags.Delete ]; diff --git a/applications/Unity.GrantManager/src/Unity.GrantManager.Domain/Tags/ITagsRepository.cs b/applications/Unity.GrantManager/src/Unity.GrantManager.Domain/Tags/ITagsRepository.cs new file mode 100644 index 000000000..4de942cb1 --- /dev/null +++ b/applications/Unity.GrantManager/src/Unity.GrantManager.Domain/Tags/ITagsRepository.cs @@ -0,0 +1,11 @@ +using System; +using System.Collections.Generic; +using System.Threading.Tasks; +using Volo.Abp.Domain.Repositories; + +namespace Unity.GrantManager.GlobalTag; + +public interface ITagsRepository : IRepository +{ + Task> GetTagUsageSummaryAsync(); +} diff --git a/applications/Unity.GrantManager/src/Unity.GrantManager.Domain/Tags/Tag.cs b/applications/Unity.GrantManager/src/Unity.GrantManager.Domain/Tags/Tag.cs new file mode 100644 index 000000000..380daabd8 --- /dev/null +++ b/applications/Unity.GrantManager/src/Unity.GrantManager.Domain/Tags/Tag.cs @@ -0,0 +1,13 @@ +using System; +using Volo.Abp.Domain.Entities.Auditing; +using Volo.Abp.MultiTenancy; + +namespace Unity.GrantManager.GlobalTag; + +public class Tag : AuditedAggregateRoot, IMultiTenant +{ + + public virtual Guid? TenantId { get; protected set; } + public string Name { get; set; } = string.Empty; + +} \ No newline at end of file diff --git a/applications/Unity.GrantManager/src/Unity.GrantManager.Domain/Tags/TagUsageSummary.cs b/applications/Unity.GrantManager/src/Unity.GrantManager.Domain/Tags/TagUsageSummary.cs new file mode 100644 index 000000000..33d380d3a --- /dev/null +++ b/applications/Unity.GrantManager/src/Unity.GrantManager.Domain/Tags/TagUsageSummary.cs @@ -0,0 +1,17 @@ +using System; +using Volo.Abp.Application.Dtos; + +namespace Unity.GrantManager.GlobalTag; + +[Serializable] +public class TagUsageSummary : EntityDto +{ + + public Guid TagId { get; set; } + public string TagName { get; set; } = string.Empty; + public int ApplicationTagCount { get; set; } + public int PaymentTagCount { get; set; } + + public int TotalUsageCount => ApplicationTagCount + PaymentTagCount; + +} diff --git a/applications/Unity.GrantManager/src/Unity.GrantManager.Domain/Tags/Tags.cs b/applications/Unity.GrantManager/src/Unity.GrantManager.Domain/Tags/Tags.cs new file mode 100644 index 000000000..d302ac125 --- /dev/null +++ b/applications/Unity.GrantManager/src/Unity.GrantManager.Domain/Tags/Tags.cs @@ -0,0 +1,13 @@ +using System; +using Volo.Abp.Domain.Entities.Auditing; +using Volo.Abp.MultiTenancy; + +namespace Unity.GrantManager.GlobalTag; + +public class Tags : AuditedAggregateRoot, IMultiTenant +{ + + public virtual Guid? TenantId { get; protected set; } + public string Name { get; set; } = string.Empty; + +} \ No newline at end of file diff --git a/applications/Unity.GrantManager/src/Unity.GrantManager.EntityFrameworkCore/EntityFrameworkCore/GrantTenantDbContext.cs b/applications/Unity.GrantManager/src/Unity.GrantManager.EntityFrameworkCore/EntityFrameworkCore/GrantTenantDbContext.cs index a58d1a89d..87ad0c760 100644 --- a/applications/Unity.GrantManager/src/Unity.GrantManager.EntityFrameworkCore/EntityFrameworkCore/GrantTenantDbContext.cs +++ b/applications/Unity.GrantManager/src/Unity.GrantManager.EntityFrameworkCore/EntityFrameworkCore/GrantTenantDbContext.cs @@ -14,6 +14,7 @@ using Unity.Flex.EntityFrameworkCore; using Unity.Notifications.EntityFrameworkCore; using Unity.Reporting.EntityFrameworkCore; +using Unity.GrantManager.GlobalTag; namespace Unity.GrantManager.EntityFrameworkCore { @@ -41,6 +42,7 @@ public class GrantTenantDbContext : AbpDbContext public DbSet AssessmentAttachments { get; set; } public DbSet ApplicationContacts { get; set; } public DbSet ApplicationLinks { get; set; } + public DbSet Tags { get; set; } #endregion public GrantTenantDbContext(DbContextOptions options) : base(options) @@ -250,11 +252,14 @@ protected override void OnModelCreating(ModelBuilder modelBuilder) { b.ToTable(GrantManagerConsts.TenantTablePrefix + "ApplicationTags", GrantManagerConsts.DbSchema); - b.ConfigureByConvention(); - b.Property(x => x.Text) - .IsRequired() - .HasMaxLength(250); + b.HasOne(x => x.Tag) + .WithMany() + .HasForeignKey(x => x.TagId) + .IsRequired() + .OnDelete(DeleteBehavior.NoAction); + + }); modelBuilder.Entity(b => @@ -277,6 +282,15 @@ protected override void OnModelCreating(ModelBuilder modelBuilder) }); + modelBuilder.Entity(b => + { + b.ToTable(GrantManagerConsts.TenantTablePrefix + "Tags", GrantManagerConsts.DbSchema); + + b.ConfigureByConvention(); + + + }); + var allEntityTypes = modelBuilder.Model.GetEntityTypes(); foreach (var type in allEntityTypes.Where(t => t.ClrType != typeof(ExtraPropertyDictionary)).Select(t => t.ClrType)) { diff --git a/applications/Unity.GrantManager/src/Unity.GrantManager.EntityFrameworkCore/Migrations/TenantMigrations/20250709235558_Tag_Restructuring_and_Fix.Designer.cs b/applications/Unity.GrantManager/src/Unity.GrantManager.EntityFrameworkCore/Migrations/TenantMigrations/20250709235558_Tag_Restructuring_and_Fix.Designer.cs new file mode 100644 index 000000000..33a8f0454 --- /dev/null +++ b/applications/Unity.GrantManager/src/Unity.GrantManager.EntityFrameworkCore/Migrations/TenantMigrations/20250709235558_Tag_Restructuring_and_Fix.Designer.cs @@ -0,0 +1,3967 @@ +// +using System; +using Microsoft.EntityFrameworkCore; +using Microsoft.EntityFrameworkCore.Infrastructure; +using Microsoft.EntityFrameworkCore.Migrations; +using Microsoft.EntityFrameworkCore.Storage.ValueConversion; +using Npgsql.EntityFrameworkCore.PostgreSQL.Metadata; +using Unity.GrantManager.EntityFrameworkCore; +using Volo.Abp.EntityFrameworkCore; + +#nullable disable + +namespace Unity.GrantManager.Migrations.TenantMigrations +{ + [DbContext(typeof(GrantTenantDbContext))] + [Migration("20250709235558_Tag_Restructuring_and_Fix")] + partial class Tag_Restructuring_and_Fix + { + /// + protected override void BuildTargetModel(ModelBuilder modelBuilder) + { +#pragma warning disable 612, 618 + modelBuilder + .HasAnnotation("_Abp_DatabaseProvider", EfCoreDatabaseProvider.PostgreSql) + .HasAnnotation("ProductVersion", "9.0.5") + .HasAnnotation("Relational:MaxIdentifierLength", 63); + + NpgsqlModelBuilderExtensions.UseIdentityByDefaultColumns(modelBuilder); + + modelBuilder.Entity("Unity.Flex.Domain.ScoresheetInstances.ScoresheetInstance", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("uuid"); + + b.Property("ConcurrencyStamp") + .IsConcurrencyToken() + .IsRequired() + .HasMaxLength(40) + .HasColumnType("character varying(40)") + .HasColumnName("ConcurrencyStamp"); + + b.Property("CorrelationId") + .HasColumnType("uuid"); + + b.Property("CorrelationProvider") + .IsRequired() + .HasColumnType("text"); + + b.Property("CreationTime") + .HasColumnType("timestamp without time zone") + .HasColumnName("CreationTime"); + + b.Property("CreatorId") + .HasColumnType("uuid") + .HasColumnName("CreatorId"); + + b.Property("DeleterId") + .HasColumnType("uuid") + .HasColumnName("DeleterId"); + + b.Property("DeletionTime") + .HasColumnType("timestamp without time zone") + .HasColumnName("DeletionTime"); + + b.Property("ExtraProperties") + .IsRequired() + .HasColumnType("text") + .HasColumnName("ExtraProperties"); + + b.Property("IsDeleted") + .ValueGeneratedOnAdd() + .HasColumnType("boolean") + .HasDefaultValue(false) + .HasColumnName("IsDeleted"); + + b.Property("LastModificationTime") + .HasColumnType("timestamp without time zone") + .HasColumnName("LastModificationTime"); + + b.Property("LastModifierId") + .HasColumnType("uuid") + .HasColumnName("LastModifierId"); + + b.Property("ReportData") + .IsRequired() + .HasColumnType("jsonb"); + + b.Property("ScoresheetId") + .HasColumnType("uuid"); + + b.Property("TenantId") + .HasColumnType("uuid") + .HasColumnName("TenantId"); + + b.Property("Value") + .IsRequired() + .HasColumnType("text"); + + b.HasKey("Id"); + + b.HasIndex("ScoresheetId"); + + b.ToTable("ScoresheetInstances", "Flex"); + }); + + modelBuilder.Entity("Unity.Flex.Domain.Scoresheets.Answer", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("uuid"); + + b.Property("CreationTime") + .HasColumnType("timestamp without time zone") + .HasColumnName("CreationTime"); + + b.Property("CreatorId") + .HasColumnType("uuid") + .HasColumnName("CreatorId"); + + b.Property("CurrentValue") + .HasColumnType("jsonb"); + + b.Property("DeleterId") + .HasColumnType("uuid") + .HasColumnName("DeleterId"); + + b.Property("DeletionTime") + .HasColumnType("timestamp without time zone") + .HasColumnName("DeletionTime"); + + b.Property("IsDeleted") + .ValueGeneratedOnAdd() + .HasColumnType("boolean") + .HasDefaultValue(false) + .HasColumnName("IsDeleted"); + + b.Property("LastModificationTime") + .HasColumnType("timestamp without time zone") + .HasColumnName("LastModificationTime"); + + b.Property("LastModifierId") + .HasColumnType("uuid") + .HasColumnName("LastModifierId"); + + b.Property("QuestionId") + .HasColumnType("uuid"); + + b.Property("ScoresheetInstanceId") + .HasColumnType("uuid"); + + b.Property("TenantId") + .HasColumnType("uuid") + .HasColumnName("TenantId"); + + b.Property("Version") + .HasColumnType("bigint"); + + b.HasKey("Id"); + + b.HasIndex("QuestionId"); + + b.HasIndex("ScoresheetInstanceId"); + + b.ToTable("Answers", "Flex"); + }); + + modelBuilder.Entity("Unity.Flex.Domain.Scoresheets.Question", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("uuid"); + + b.Property("CreationTime") + .HasColumnType("timestamp without time zone") + .HasColumnName("CreationTime"); + + b.Property("CreatorId") + .HasColumnType("uuid") + .HasColumnName("CreatorId"); + + b.Property("Definition") + .IsRequired() + .HasColumnType("jsonb"); + + b.Property("DeleterId") + .HasColumnType("uuid") + .HasColumnName("DeleterId"); + + b.Property("DeletionTime") + .HasColumnType("timestamp without time zone") + .HasColumnName("DeletionTime"); + + b.Property("Description") + .HasColumnType("text"); + + b.Property("Enabled") + .HasColumnType("boolean"); + + b.Property("IsDeleted") + .ValueGeneratedOnAdd() + .HasColumnType("boolean") + .HasDefaultValue(false) + .HasColumnName("IsDeleted"); + + b.Property("Label") + .IsRequired() + .HasColumnType("text"); + + b.Property("LastModificationTime") + .HasColumnType("timestamp without time zone") + .HasColumnName("LastModificationTime"); + + b.Property("LastModifierId") + .HasColumnType("uuid") + .HasColumnName("LastModifierId"); + + b.Property("Name") + .IsRequired() + .HasColumnType("text"); + + b.Property("Order") + .HasColumnType("bigint"); + + b.Property("SectionId") + .HasColumnType("uuid"); + + b.Property("TenantId") + .HasColumnType("uuid") + .HasColumnName("TenantId"); + + b.Property("Type") + .HasColumnType("integer"); + + b.HasKey("Id"); + + b.HasIndex("SectionId"); + + b.ToTable("Questions", "Flex"); + }); + + modelBuilder.Entity("Unity.Flex.Domain.Scoresheets.Scoresheet", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("uuid"); + + b.Property("ConcurrencyStamp") + .IsConcurrencyToken() + .IsRequired() + .HasMaxLength(40) + .HasColumnType("character varying(40)") + .HasColumnName("ConcurrencyStamp"); + + b.Property("CreationTime") + .HasColumnType("timestamp without time zone") + .HasColumnName("CreationTime"); + + b.Property("CreatorId") + .HasColumnType("uuid") + .HasColumnName("CreatorId"); + + b.Property("DeleterId") + .HasColumnType("uuid") + .HasColumnName("DeleterId"); + + b.Property("DeletionTime") + .HasColumnType("timestamp without time zone") + .HasColumnName("DeletionTime"); + + b.Property("ExtraProperties") + .IsRequired() + .HasColumnType("text") + .HasColumnName("ExtraProperties"); + + b.Property("IsDeleted") + .ValueGeneratedOnAdd() + .HasColumnType("boolean") + .HasDefaultValue(false) + .HasColumnName("IsDeleted"); + + b.Property("LastModificationTime") + .HasColumnType("timestamp without time zone") + .HasColumnName("LastModificationTime"); + + b.Property("LastModifierId") + .HasColumnType("uuid") + .HasColumnName("LastModifierId"); + + b.Property("Name") + .IsRequired() + .HasColumnType("text"); + + b.Property("Order") + .HasColumnType("bigint"); + + b.Property("Published") + .HasColumnType("boolean"); + + b.Property("ReportColumns") + .IsRequired() + .HasColumnType("text"); + + b.Property("ReportKeys") + .IsRequired() + .HasColumnType("text"); + + b.Property("ReportViewName") + .IsRequired() + .HasColumnType("text"); + + b.Property("TenantId") + .HasColumnType("uuid") + .HasColumnName("TenantId"); + + b.Property("Title") + .IsRequired() + .HasColumnType("text"); + + b.Property("Version") + .HasColumnType("bigint"); + + b.HasKey("Id"); + + b.ToTable("Scoresheets", "Flex"); + }); + + modelBuilder.Entity("Unity.Flex.Domain.Scoresheets.ScoresheetSection", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("uuid"); + + b.Property("CreationTime") + .HasColumnType("timestamp without time zone") + .HasColumnName("CreationTime"); + + b.Property("CreatorId") + .HasColumnType("uuid") + .HasColumnName("CreatorId"); + + b.Property("DeleterId") + .HasColumnType("uuid") + .HasColumnName("DeleterId"); + + b.Property("DeletionTime") + .HasColumnType("timestamp without time zone") + .HasColumnName("DeletionTime"); + + b.Property("IsDeleted") + .ValueGeneratedOnAdd() + .HasColumnType("boolean") + .HasDefaultValue(false) + .HasColumnName("IsDeleted"); + + b.Property("LastModificationTime") + .HasColumnType("timestamp without time zone") + .HasColumnName("LastModificationTime"); + + b.Property("LastModifierId") + .HasColumnType("uuid") + .HasColumnName("LastModifierId"); + + b.Property("Name") + .IsRequired() + .HasColumnType("text"); + + b.Property("Order") + .HasColumnType("bigint"); + + b.Property("ScoresheetId") + .HasColumnType("uuid"); + + b.Property("TenantId") + .HasColumnType("uuid") + .HasColumnName("TenantId"); + + b.HasKey("Id"); + + b.HasIndex("ScoresheetId"); + + b.ToTable("ScoresheetSections", "Flex"); + }); + + modelBuilder.Entity("Unity.Flex.Domain.WorksheetInstances.CustomFieldValue", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("uuid"); + + b.Property("CreationTime") + .HasColumnType("timestamp without time zone") + .HasColumnName("CreationTime"); + + b.Property("CreatorId") + .HasColumnType("uuid") + .HasColumnName("CreatorId"); + + b.Property("CurrentValue") + .IsRequired() + .HasColumnType("jsonb"); + + b.Property("CustomFieldId") + .HasColumnType("uuid"); + + b.Property("LastModificationTime") + .HasColumnType("timestamp without time zone") + .HasColumnName("LastModificationTime"); + + b.Property("LastModifierId") + .HasColumnType("uuid") + .HasColumnName("LastModifierId"); + + b.Property("TenantId") + .HasColumnType("uuid") + .HasColumnName("TenantId"); + + b.Property("WorksheetInstanceId") + .HasColumnType("uuid"); + + b.HasKey("Id"); + + b.HasIndex("WorksheetInstanceId"); + + b.ToTable("CustomFieldValues", "Flex"); + }); + + modelBuilder.Entity("Unity.Flex.Domain.WorksheetInstances.WorksheetInstance", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("uuid"); + + b.Property("ConcurrencyStamp") + .IsConcurrencyToken() + .IsRequired() + .HasMaxLength(40) + .HasColumnType("character varying(40)") + .HasColumnName("ConcurrencyStamp"); + + b.Property("CorrelationId") + .HasColumnType("uuid"); + + b.Property("CorrelationProvider") + .IsRequired() + .HasColumnType("text"); + + b.Property("CreationTime") + .HasColumnType("timestamp without time zone") + .HasColumnName("CreationTime"); + + b.Property("CreatorId") + .HasColumnType("uuid") + .HasColumnName("CreatorId"); + + b.Property("CurrentValue") + .IsRequired() + .HasColumnType("jsonb"); + + b.Property("DeleterId") + .HasColumnType("uuid") + .HasColumnName("DeleterId"); + + b.Property("DeletionTime") + .HasColumnType("timestamp without time zone") + .HasColumnName("DeletionTime"); + + b.Property("ExtraProperties") + .IsRequired() + .HasColumnType("text") + .HasColumnName("ExtraProperties"); + + b.Property("IsDeleted") + .ValueGeneratedOnAdd() + .HasColumnType("boolean") + .HasDefaultValue(false) + .HasColumnName("IsDeleted"); + + b.Property("LastModificationTime") + .HasColumnType("timestamp without time zone") + .HasColumnName("LastModificationTime"); + + b.Property("LastModifierId") + .HasColumnType("uuid") + .HasColumnName("LastModifierId"); + + b.Property("ReportData") + .IsRequired() + .HasColumnType("jsonb"); + + b.Property("TenantId") + .HasColumnType("uuid") + .HasColumnName("TenantId"); + + b.Property("UiAnchor") + .IsRequired() + .HasColumnType("text"); + + b.Property("WorksheetCorrelationId") + .HasColumnType("uuid"); + + b.Property("WorksheetCorrelationProvider") + .IsRequired() + .HasColumnType("text"); + + b.Property("WorksheetId") + .HasColumnType("uuid"); + + b.HasKey("Id"); + + b.ToTable("WorksheetInstances", "Flex"); + }); + + modelBuilder.Entity("Unity.Flex.Domain.WorksheetLinks.WorksheetLink", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("uuid"); + + b.Property("ConcurrencyStamp") + .IsConcurrencyToken() + .IsRequired() + .HasMaxLength(40) + .HasColumnType("character varying(40)") + .HasColumnName("ConcurrencyStamp"); + + b.Property("CorrelationId") + .HasColumnType("uuid"); + + b.Property("CorrelationProvider") + .IsRequired() + .HasColumnType("text"); + + b.Property("CreationTime") + .HasColumnType("timestamp without time zone") + .HasColumnName("CreationTime"); + + b.Property("CreatorId") + .HasColumnType("uuid") + .HasColumnName("CreatorId"); + + b.Property("ExtraProperties") + .IsRequired() + .HasColumnType("text") + .HasColumnName("ExtraProperties"); + + b.Property("LastModificationTime") + .HasColumnType("timestamp without time zone") + .HasColumnName("LastModificationTime"); + + b.Property("LastModifierId") + .HasColumnType("uuid") + .HasColumnName("LastModifierId"); + + b.Property("Order") + .HasColumnType("bigint"); + + b.Property("TenantId") + .HasColumnType("uuid") + .HasColumnName("TenantId"); + + b.Property("UiAnchor") + .IsRequired() + .HasColumnType("text"); + + b.Property("WorksheetId") + .HasColumnType("uuid"); + + b.HasKey("Id"); + + b.HasIndex("WorksheetId"); + + b.ToTable("WorksheetLinks", "Flex"); + }); + + modelBuilder.Entity("Unity.Flex.Domain.Worksheets.CustomField", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("uuid"); + + b.Property("CreationTime") + .HasColumnType("timestamp without time zone") + .HasColumnName("CreationTime"); + + b.Property("CreatorId") + .HasColumnType("uuid") + .HasColumnName("CreatorId"); + + b.Property("Definition") + .IsRequired() + .HasColumnType("jsonb"); + + b.Property("DeleterId") + .HasColumnType("uuid") + .HasColumnName("DeleterId"); + + b.Property("DeletionTime") + .HasColumnType("timestamp without time zone") + .HasColumnName("DeletionTime"); + + b.Property("Enabled") + .HasColumnType("boolean"); + + b.Property("IsDeleted") + .ValueGeneratedOnAdd() + .HasColumnType("boolean") + .HasDefaultValue(false) + .HasColumnName("IsDeleted"); + + b.Property("Key") + .IsRequired() + .HasColumnType("text"); + + b.Property("Label") + .IsRequired() + .HasColumnType("text"); + + b.Property("LastModificationTime") + .HasColumnType("timestamp without time zone") + .HasColumnName("LastModificationTime"); + + b.Property("LastModifierId") + .HasColumnType("uuid") + .HasColumnName("LastModifierId"); + + b.Property("Name") + .IsRequired() + .HasColumnType("text"); + + b.Property("Order") + .HasColumnType("bigint"); + + b.Property("SectionId") + .HasColumnType("uuid"); + + b.Property("TenantId") + .HasColumnType("uuid") + .HasColumnName("TenantId"); + + b.Property("Type") + .HasColumnType("integer"); + + b.HasKey("Id"); + + b.HasIndex("SectionId"); + + b.ToTable("CustomFields", "Flex"); + }); + + modelBuilder.Entity("Unity.Flex.Domain.Worksheets.Worksheet", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("uuid"); + + b.Property("ConcurrencyStamp") + .IsConcurrencyToken() + .IsRequired() + .HasMaxLength(40) + .HasColumnType("character varying(40)") + .HasColumnName("ConcurrencyStamp"); + + b.Property("CreationTime") + .HasColumnType("timestamp without time zone") + .HasColumnName("CreationTime"); + + b.Property("CreatorId") + .HasColumnType("uuid") + .HasColumnName("CreatorId"); + + b.Property("DeleterId") + .HasColumnType("uuid") + .HasColumnName("DeleterId"); + + b.Property("DeletionTime") + .HasColumnType("timestamp without time zone") + .HasColumnName("DeletionTime"); + + b.Property("ExtraProperties") + .IsRequired() + .HasColumnType("text") + .HasColumnName("ExtraProperties"); + + b.Property("IsDeleted") + .ValueGeneratedOnAdd() + .HasColumnType("boolean") + .HasDefaultValue(false) + .HasColumnName("IsDeleted"); + + b.Property("LastModificationTime") + .HasColumnType("timestamp without time zone") + .HasColumnName("LastModificationTime"); + + b.Property("LastModifierId") + .HasColumnType("uuid") + .HasColumnName("LastModifierId"); + + b.Property("Name") + .IsRequired() + .HasColumnType("text"); + + b.Property("Published") + .HasColumnType("boolean"); + + b.Property("ReportColumns") + .IsRequired() + .HasColumnType("text"); + + b.Property("ReportKeys") + .IsRequired() + .HasColumnType("text"); + + b.Property("ReportViewName") + .IsRequired() + .HasColumnType("text"); + + b.Property("TenantId") + .HasColumnType("uuid") + .HasColumnName("TenantId"); + + b.Property("Title") + .IsRequired() + .HasColumnType("text"); + + b.Property("Version") + .HasColumnType("bigint"); + + b.HasKey("Id"); + + b.ToTable("Worksheets", "Flex"); + }); + + modelBuilder.Entity("Unity.Flex.Domain.Worksheets.WorksheetSection", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("uuid"); + + b.Property("CreationTime") + .HasColumnType("timestamp without time zone") + .HasColumnName("CreationTime"); + + b.Property("CreatorId") + .HasColumnType("uuid") + .HasColumnName("CreatorId"); + + b.Property("DeleterId") + .HasColumnType("uuid") + .HasColumnName("DeleterId"); + + b.Property("DeletionTime") + .HasColumnType("timestamp without time zone") + .HasColumnName("DeletionTime"); + + b.Property("IsDeleted") + .ValueGeneratedOnAdd() + .HasColumnType("boolean") + .HasDefaultValue(false) + .HasColumnName("IsDeleted"); + + b.Property("LastModificationTime") + .HasColumnType("timestamp without time zone") + .HasColumnName("LastModificationTime"); + + b.Property("LastModifierId") + .HasColumnType("uuid") + .HasColumnName("LastModifierId"); + + b.Property("Name") + .IsRequired() + .HasColumnType("text"); + + b.Property("Order") + .HasColumnType("bigint"); + + b.Property("TenantId") + .HasColumnType("uuid") + .HasColumnName("TenantId"); + + b.Property("WorksheetId") + .HasColumnType("uuid"); + + b.HasKey("Id"); + + b.HasIndex("WorksheetId"); + + b.ToTable("WorksheetSections", "Flex"); + }); + + modelBuilder.Entity("Unity.GrantManager.Applications.Applicant", b => + { + b.Property("Id") + .HasColumnType("uuid"); + + b.Property("ApplicantName") + .IsRequired() + .HasMaxLength(600) + .HasColumnType("character varying(600)"); + + b.Property("ApproxNumberOfEmployees") + .HasColumnType("text"); + + b.Property("BusinessNumber") + .HasColumnType("text"); + + b.Property("ConcurrencyStamp") + .IsConcurrencyToken() + .IsRequired() + .HasMaxLength(40) + .HasColumnType("character varying(40)") + .HasColumnName("ConcurrencyStamp"); + + b.Property("CreationTime") + .HasColumnType("timestamp without time zone") + .HasColumnName("CreationTime"); + + b.Property("CreatorId") + .HasColumnType("uuid") + .HasColumnName("CreatorId"); + + b.Property("ElectoralDistrict") + .HasColumnType("text"); + + b.Property("ExtraProperties") + .IsRequired() + .HasColumnType("text") + .HasColumnName("ExtraProperties"); + + b.Property("FiscalDay") + .HasColumnType("integer"); + + b.Property("FiscalMonth") + .HasColumnType("text"); + + b.Property("IndigenousOrgInd") + .HasColumnType("text"); + + b.Property("IsDuplicated") + .HasColumnType("boolean"); + + b.Property("LastModificationTime") + .HasColumnType("timestamp without time zone") + .HasColumnName("LastModificationTime"); + + b.Property("LastModifierId") + .HasColumnType("uuid") + .HasColumnName("LastModifierId"); + + b.Property("MatchPercentage") + .HasColumnType("numeric"); + + b.Property("NonRegOrgName") + .HasColumnType("text"); + + b.Property("NonRegisteredBusinessName") + .HasColumnType("text"); + + b.Property("OrgName") + .HasColumnType("text"); + + b.Property("OrgNumber") + .HasColumnType("text"); + + b.Property("OrgStatus") + .HasColumnType("text"); + + b.Property("OrganizationSize") + .HasColumnType("text"); + + b.Property("OrganizationType") + .HasColumnType("text"); + + b.Property("RedStop") + .HasColumnType("boolean"); + + b.Property("Sector") + .HasColumnType("text"); + + b.Property("SectorSubSectorIndustryDesc") + .HasColumnType("text"); + + b.Property("SiteId") + .HasColumnType("uuid"); + + b.Property("StartedOperatingDate") + .HasColumnType("date"); + + b.Property("Status") + .HasColumnType("text"); + + b.Property("SubSector") + .HasColumnType("text"); + + b.Property("SupplierId") + .HasColumnType("uuid"); + + b.Property("TenantId") + .HasColumnType("uuid") + .HasColumnName("TenantId"); + + b.Property("UnityApplicantId") + .HasColumnType("text"); + + b.HasKey("Id"); + + b.HasIndex("ApplicantName"); + + b.ToTable("Applicants", (string)null); + }); + + modelBuilder.Entity("Unity.GrantManager.Applications.ApplicantAddress", b => + { + b.Property("Id") + .HasColumnType("uuid"); + + b.Property("AddressType") + .HasColumnType("integer"); + + b.Property("ApplicantId") + .HasColumnType("uuid"); + + b.Property("City") + .HasColumnType("text"); + + b.Property("ConcurrencyStamp") + .IsConcurrencyToken() + .IsRequired() + .HasMaxLength(40) + .HasColumnType("character varying(40)") + .HasColumnName("ConcurrencyStamp"); + + b.Property("Country") + .HasColumnType("text"); + + b.Property("CreationTime") + .HasColumnType("timestamp without time zone") + .HasColumnName("CreationTime"); + + b.Property("CreatorId") + .HasColumnType("uuid") + .HasColumnName("CreatorId"); + + b.Property("ExtraProperties") + .IsRequired() + .HasColumnType("text") + .HasColumnName("ExtraProperties"); + + b.Property("LastModificationTime") + .HasColumnType("timestamp without time zone") + .HasColumnName("LastModificationTime"); + + b.Property("LastModifierId") + .HasColumnType("uuid") + .HasColumnName("LastModifierId"); + + b.Property("Postal") + .HasColumnType("text"); + + b.Property("Province") + .HasColumnType("text"); + + b.Property("Street") + .HasColumnType("text"); + + b.Property("Street2") + .HasColumnType("text"); + + b.Property("TenantId") + .HasColumnType("uuid") + .HasColumnName("TenantId"); + + b.Property("Unit") + .HasColumnType("text"); + + b.HasKey("Id"); + + b.HasIndex("ApplicantId"); + + b.ToTable("ApplicantAddresses", (string)null); + }); + + modelBuilder.Entity("Unity.GrantManager.Applications.ApplicantAgent", b => + { + b.Property("Id") + .HasColumnType("uuid"); + + b.Property("ApplicantId") + .HasColumnType("uuid"); + + b.Property("ApplicationId") + .HasColumnType("uuid"); + + b.Property("BceidBusinessGuid") + .HasColumnType("uuid"); + + b.Property("BceidBusinessName") + .HasColumnType("text"); + + b.Property("BceidUserGuid") + .HasColumnType("uuid"); + + b.Property("BceidUserName") + .HasColumnType("text"); + + b.Property("ConcurrencyStamp") + .IsConcurrencyToken() + .IsRequired() + .HasMaxLength(40) + .HasColumnType("character varying(40)") + .HasColumnName("ConcurrencyStamp"); + + b.Property("ContactOrder") + .HasColumnType("integer"); + + b.Property("CreationTime") + .HasColumnType("timestamp without time zone") + .HasColumnName("CreationTime"); + + b.Property("CreatorId") + .HasColumnType("uuid") + .HasColumnName("CreatorId"); + + b.Property("Email") + .HasColumnType("text"); + + b.Property("ExtraProperties") + .IsRequired() + .HasColumnType("text") + .HasColumnName("ExtraProperties"); + + b.Property("IdentityEmail") + .HasColumnType("text"); + + b.Property("IdentityName") + .HasColumnType("text"); + + b.Property("IdentityProvider") + .HasColumnType("text"); + + b.Property("IsActive") + .HasColumnType("boolean"); + + b.Property("IsConfirmed") + .HasColumnType("boolean"); + + b.Property("LastModificationTime") + .HasColumnType("timestamp without time zone") + .HasColumnName("LastModificationTime"); + + b.Property("LastModifierId") + .HasColumnType("uuid") + .HasColumnName("LastModifierId"); + + b.Property("Name") + .IsRequired() + .HasColumnType("text"); + + b.Property("OidcSubUser") + .HasColumnType("text"); + + b.Property("Phone") + .HasColumnType("text"); + + b.Property("Phone2") + .HasColumnType("text"); + + b.Property("Phone2Extension") + .HasColumnType("text"); + + b.Property("PhoneExtension") + .HasColumnType("text"); + + b.Property("RoleForApplicant") + .IsRequired() + .HasColumnType("text"); + + b.Property("TenantId") + .HasColumnType("uuid") + .HasColumnName("TenantId"); + + b.Property("Title") + .HasColumnType("text"); + + b.HasKey("Id"); + + b.HasIndex("ApplicantId"); + + b.HasIndex("ApplicationId") + .IsUnique(); + + b.HasIndex("OidcSubUser"); + + b.ToTable("ApplicantAgents", (string)null); + }); + + modelBuilder.Entity("Unity.GrantManager.Applications.Application", b => + { + b.Property("Id") + .HasColumnType("uuid"); + + b.Property("Acquisition") + .HasColumnType("text"); + + b.Property("ApplicantId") + .HasColumnType("uuid"); + + b.Property("ApplicationFormId") + .HasColumnType("uuid"); + + b.Property("ApplicationStatusId") + .HasColumnType("uuid"); + + b.Property("ApprovedAmount") + .HasColumnType("numeric"); + + b.Property("AssessmentResultDate") + .HasColumnType("timestamp without time zone"); + + b.Property("AssessmentResultStatus") + .HasColumnType("text"); + + b.Property("AssessmentStartDate") + .HasColumnType("timestamp without time zone"); + + b.Property("City") + .HasColumnType("text"); + + b.Property("Community") + .HasColumnType("text"); + + b.Property("CommunityPopulation") + .HasColumnType("integer"); + + b.Property("ConcurrencyStamp") + .IsConcurrencyToken() + .IsRequired() + .HasMaxLength(40) + .HasColumnType("character varying(40)") + .HasColumnName("ConcurrencyStamp"); + + b.Property("ContractExecutionDate") + .HasColumnType("timestamp without time zone"); + + b.Property("ContractNumber") + .HasColumnType("text"); + + b.Property("CreationTime") + .HasColumnType("timestamp without time zone") + .HasColumnName("CreationTime"); + + b.Property("CreatorId") + .HasColumnType("uuid") + .HasColumnName("CreatorId"); + + b.Property("DeclineRational") + .HasColumnType("text"); + + b.Property("DeleterId") + .HasColumnType("uuid") + .HasColumnName("DeleterId"); + + b.Property("DeletionTime") + .HasColumnType("timestamp without time zone") + .HasColumnName("DeletionTime"); + + b.Property("DueDate") + .HasColumnType("timestamp without time zone"); + + b.Property("DueDiligenceStatus") + .HasColumnType("text"); + + b.Property("EconomicRegion") + .HasColumnType("text"); + + b.Property("ElectoralDistrict") + .HasColumnType("text"); + + b.Property("ExtraProperties") + .IsRequired() + .HasColumnType("text") + .HasColumnName("ExtraProperties"); + + b.Property("FinalDecisionDate") + .HasColumnType("timestamp without time zone"); + + b.Property("Forestry") + .HasColumnType("text"); + + b.Property("ForestryFocus") + .HasColumnType("text"); + + b.Property("IsDeleted") + .ValueGeneratedOnAdd() + .HasColumnType("boolean") + .HasDefaultValue(false) + .HasColumnName("IsDeleted"); + + b.Property("LastModificationTime") + .HasColumnType("timestamp without time zone") + .HasColumnName("LastModificationTime"); + + b.Property("LastModifierId") + .HasColumnType("uuid") + .HasColumnName("LastModifierId"); + + b.Property("LikelihoodOfFunding") + .HasColumnType("text"); + + b.Property("Notes") + .HasColumnType("text"); + + b.Property("NotificationDate") + .HasColumnType("timestamp without time zone"); + + b.Property("OwnerId") + .HasColumnType("uuid"); + + b.Property("Payload") + .HasColumnType("jsonb"); + + b.Property("PercentageTotalProjectBudget") + .HasColumnType("double precision"); + + b.Property("Place") + .HasColumnType("text"); + + b.Property("ProjectEndDate") + .HasColumnType("timestamp without time zone"); + + b.Property("ProjectFundingTotal") + .HasColumnType("numeric"); + + b.Property("ProjectName") + .IsRequired() + .HasMaxLength(255) + .HasColumnType("character varying(255)"); + + b.Property("ProjectStartDate") + .HasColumnType("timestamp without time zone"); + + b.Property("ProjectSummary") + .HasColumnType("text"); + + b.Property("ProposalDate") + .HasColumnType("timestamp without time zone"); + + b.Property("RecommendedAmount") + .HasColumnType("numeric"); + + b.Property("ReferenceNo") + .IsRequired() + .HasColumnType("text"); + + b.Property("RegionalDistrict") + .HasColumnType("text"); + + b.Property("RequestedAmount") + .HasColumnType("numeric"); + + b.Property("RiskRanking") + .HasColumnType("text"); + + b.Property("SigningAuthorityBusinessPhone") + .HasColumnType("text"); + + b.Property("SigningAuthorityCellPhone") + .HasColumnType("text"); + + b.Property("SigningAuthorityEmail") + .HasColumnType("text"); + + b.Property("SigningAuthorityFullName") + .HasColumnType("text"); + + b.Property("SigningAuthorityTitle") + .HasColumnType("text"); + + b.Property("SubStatus") + .HasColumnType("text"); + + b.Property("SubmissionDate") + .HasColumnType("timestamp without time zone"); + + b.Property("TenantId") + .HasColumnType("uuid") + .HasColumnName("TenantId"); + + b.Property("TotalProjectBudget") + .HasColumnType("numeric"); + + b.Property("TotalScore") + .HasColumnType("integer"); + + b.HasKey("Id"); + + b.HasIndex("ApplicantId"); + + b.HasIndex("ApplicationFormId"); + + b.HasIndex("ApplicationStatusId"); + + b.HasIndex("OwnerId"); + + b.ToTable("Applications", (string)null); + }); + + modelBuilder.Entity("Unity.GrantManager.Applications.ApplicationAssignment", b => + { + b.Property("Id") + .HasColumnType("uuid"); + + b.Property("ApplicationId") + .HasColumnType("uuid"); + + b.Property("AssigneeId") + .HasColumnType("uuid"); + + b.Property("ConcurrencyStamp") + .IsConcurrencyToken() + .IsRequired() + .HasMaxLength(40) + .HasColumnType("character varying(40)") + .HasColumnName("ConcurrencyStamp"); + + b.Property("CreationTime") + .HasColumnType("timestamp without time zone") + .HasColumnName("CreationTime"); + + b.Property("CreatorId") + .HasColumnType("uuid") + .HasColumnName("CreatorId"); + + b.Property("Duty") + .HasColumnType("text"); + + b.Property("ExtraProperties") + .IsRequired() + .HasColumnType("text") + .HasColumnName("ExtraProperties"); + + b.Property("LastModificationTime") + .HasColumnType("timestamp without time zone") + .HasColumnName("LastModificationTime"); + + b.Property("LastModifierId") + .HasColumnType("uuid") + .HasColumnName("LastModifierId"); + + b.Property("TenantId") + .HasColumnType("uuid") + .HasColumnName("TenantId"); + + b.HasKey("Id"); + + b.HasIndex("ApplicationId"); + + b.HasIndex("AssigneeId"); + + b.ToTable("ApplicationAssignments", (string)null); + }); + + modelBuilder.Entity("Unity.GrantManager.Applications.ApplicationAttachment", b => + { + b.Property("Id") + .HasColumnType("uuid"); + + b.Property("ApplicationId") + .HasColumnType("uuid"); + + b.Property("ConcurrencyStamp") + .IsConcurrencyToken() + .IsRequired() + .HasMaxLength(40) + .HasColumnType("character varying(40)") + .HasColumnName("ConcurrencyStamp"); + + b.Property("CreationTime") + .HasColumnType("timestamp without time zone") + .HasColumnName("CreationTime"); + + b.Property("CreatorId") + .HasColumnType("uuid") + .HasColumnName("CreatorId"); + + b.Property("DisplayName") + .HasMaxLength(1024) + .HasColumnType("character varying(1024)"); + + b.Property("ExtraProperties") + .IsRequired() + .HasColumnType("text") + .HasColumnName("ExtraProperties"); + + b.Property("FileName") + .HasColumnType("text"); + + b.Property("LastModificationTime") + .HasColumnType("timestamp without time zone") + .HasColumnName("LastModificationTime"); + + b.Property("LastModifierId") + .HasColumnType("uuid") + .HasColumnName("LastModifierId"); + + b.Property("S3ObjectKey") + .IsRequired() + .HasColumnType("text"); + + b.Property("TenantId") + .HasColumnType("uuid") + .HasColumnName("TenantId"); + + b.Property("Time") + .HasColumnType("timestamp without time zone"); + + b.Property("UserId") + .HasColumnType("uuid"); + + b.HasKey("Id"); + + b.HasIndex("ApplicationId"); + + b.ToTable("ApplicationAttachments", (string)null); + }); + + modelBuilder.Entity("Unity.GrantManager.Applications.ApplicationChefsFileAttachment", b => + { + b.Property("Id") + .HasColumnType("uuid"); + + b.Property("ApplicationId") + .HasColumnType("uuid"); + + b.Property("ChefsFileId") + .HasColumnType("text"); + + b.Property("ChefsSumbissionId") + .HasColumnType("text"); + + b.Property("ConcurrencyStamp") + .IsConcurrencyToken() + .IsRequired() + .HasMaxLength(40) + .HasColumnType("character varying(40)") + .HasColumnName("ConcurrencyStamp"); + + b.Property("CreationTime") + .HasColumnType("timestamp without time zone") + .HasColumnName("CreationTime"); + + b.Property("CreatorId") + .HasColumnType("uuid") + .HasColumnName("CreatorId"); + + b.Property("DisplayName") + .HasMaxLength(1024) + .HasColumnType("character varying(1024)"); + + b.Property("ExtraProperties") + .IsRequired() + .HasColumnType("text") + .HasColumnName("ExtraProperties"); + + b.Property("FileName") + .HasColumnType("text"); + + b.Property("LastModificationTime") + .HasColumnType("timestamp without time zone") + .HasColumnName("LastModificationTime"); + + b.Property("LastModifierId") + .HasColumnType("uuid") + .HasColumnName("LastModifierId"); + + b.Property("TenantId") + .HasColumnType("uuid") + .HasColumnName("TenantId"); + + b.HasKey("Id"); + + b.HasIndex("ApplicationId"); + + b.ToTable("ApplicationChefsFileAttachments", (string)null); + }); + + modelBuilder.Entity("Unity.GrantManager.Applications.ApplicationContact", b => + { + b.Property("Id") + .HasColumnType("uuid"); + + b.Property("ApplicationId") + .HasColumnType("uuid"); + + b.Property("ConcurrencyStamp") + .IsConcurrencyToken() + .IsRequired() + .HasMaxLength(40) + .HasColumnType("character varying(40)") + .HasColumnName("ConcurrencyStamp"); + + b.Property("ContactEmail") + .HasColumnType("text"); + + b.Property("ContactFullName") + .IsRequired() + .HasColumnType("text"); + + b.Property("ContactMobilePhone") + .HasColumnType("text"); + + b.Property("ContactTitle") + .HasColumnType("text"); + + b.Property("ContactType") + .IsRequired() + .HasColumnType("text"); + + b.Property("ContactWorkPhone") + .HasColumnType("text"); + + b.Property("CreationTime") + .HasColumnType("timestamp without time zone") + .HasColumnName("CreationTime"); + + b.Property("CreatorId") + .HasColumnType("uuid") + .HasColumnName("CreatorId"); + + b.Property("ExtraProperties") + .IsRequired() + .HasColumnType("text") + .HasColumnName("ExtraProperties"); + + b.Property("LastModificationTime") + .HasColumnType("timestamp without time zone") + .HasColumnName("LastModificationTime"); + + b.Property("LastModifierId") + .HasColumnType("uuid") + .HasColumnName("LastModifierId"); + + b.Property("TenantId") + .HasColumnType("uuid") + .HasColumnName("TenantId"); + + b.HasKey("Id"); + + b.HasIndex("ApplicationId"); + + b.ToTable("ApplicationContact", (string)null); + }); + + modelBuilder.Entity("Unity.GrantManager.Applications.ApplicationForm", b => + { + b.Property("Id") + .HasColumnType("uuid"); + + b.Property("ApiKey") + .HasColumnType("text"); + + b.Property("ApplicationFormDescription") + .HasColumnType("text"); + + b.Property("ApplicationFormName") + .IsRequired() + .HasMaxLength(255) + .HasColumnType("character varying(255)"); + + b.Property("AttemptedConnectionDate") + .HasColumnType("timestamp without time zone"); + + b.Property("AvailableChefsFields") + .HasColumnType("text"); + + b.Property("Category") + .HasColumnType("text"); + + b.Property("ChefsApplicationFormGuid") + .HasColumnType("text"); + + b.Property("ChefsCriteriaFormGuid") + .HasColumnType("text"); + + b.Property("ConcurrencyStamp") + .IsConcurrencyToken() + .IsRequired() + .HasMaxLength(40) + .HasColumnType("character varying(40)") + .HasColumnName("ConcurrencyStamp"); + + b.Property("ConnectionHttpStatus") + .HasColumnType("text"); + + b.Property("CreationTime") + .HasColumnType("timestamp without time zone") + .HasColumnName("CreationTime"); + + b.Property("CreatorId") + .HasColumnType("uuid") + .HasColumnName("CreatorId"); + + b.Property("DeleterId") + .HasColumnType("uuid") + .HasColumnName("DeleterId"); + + b.Property("DeletionTime") + .HasColumnType("timestamp without time zone") + .HasColumnName("DeletionTime"); + + b.Property("ElectoralDistrictAddressType") + .HasColumnType("integer"); + + b.Property("ExtraProperties") + .IsRequired() + .HasColumnType("text") + .HasColumnName("ExtraProperties"); + + b.Property("IntakeId") + .HasColumnType("uuid"); + + b.Property("IsDeleted") + .ValueGeneratedOnAdd() + .HasColumnType("boolean") + .HasDefaultValue(false) + .HasColumnName("IsDeleted"); + + b.Property("IsDirectApproval") + .HasColumnType("boolean"); + + b.Property("LastModificationTime") + .HasColumnType("timestamp without time zone") + .HasColumnName("LastModificationTime"); + + b.Property("LastModifierId") + .HasColumnType("uuid") + .HasColumnName("LastModifierId"); + + b.Property("Payable") + .HasColumnType("boolean"); + + b.Property("RenderFormIoToHtml") + .HasColumnType("boolean"); + + b.Property("ScoresheetId") + .HasColumnType("uuid"); + + b.Property("TenantId") + .HasColumnType("uuid") + .HasColumnName("TenantId"); + + b.Property("Version") + .HasColumnType("integer"); + + b.HasKey("Id"); + + b.HasIndex("IntakeId"); + + b.ToTable("ApplicationForms", (string)null); + }); + + modelBuilder.Entity("Unity.GrantManager.Applications.ApplicationFormSubmission", b => + { + b.Property("Id") + .HasColumnType("uuid"); + + b.Property("ApplicantId") + .HasColumnType("uuid"); + + b.Property("ApplicationFormId") + .HasColumnType("uuid"); + + b.Property("ApplicationFormVersionId") + .HasColumnType("uuid"); + + b.Property("ApplicationId") + .HasColumnType("uuid"); + + b.Property("ChefsSubmissionGuid") + .IsRequired() + .HasColumnType("text"); + + b.Property("ConcurrencyStamp") + .IsConcurrencyToken() + .IsRequired() + .HasMaxLength(40) + .HasColumnType("character varying(40)") + .HasColumnName("ConcurrencyStamp"); + + b.Property("CreationTime") + .HasColumnType("timestamp without time zone") + .HasColumnName("CreationTime"); + + b.Property("CreatorId") + .HasColumnType("uuid") + .HasColumnName("CreatorId"); + + b.Property("ExtraProperties") + .IsRequired() + .HasColumnType("text") + .HasColumnName("ExtraProperties"); + + b.Property("FormVersionId") + .HasColumnType("uuid"); + + b.Property("LastModificationTime") + .HasColumnType("timestamp without time zone") + .HasColumnName("LastModificationTime"); + + b.Property("LastModifierId") + .HasColumnType("uuid") + .HasColumnName("LastModifierId"); + + b.Property("OidcSub") + .IsRequired() + .HasColumnType("text"); + + b.Property("RenderedHTML") + .HasColumnType("text"); + + b.Property("ReportData") + .IsRequired() + .HasColumnType("jsonb"); + + b.Property("Submission") + .IsRequired() + .HasColumnType("jsonb"); + + b.Property("TenantId") + .HasColumnType("uuid") + .HasColumnName("TenantId"); + + b.HasKey("Id"); + + b.HasIndex("ApplicantId"); + + b.HasIndex("ApplicationFormId"); + + b.ToTable("ApplicationFormSubmissions", (string)null); + }); + + modelBuilder.Entity("Unity.GrantManager.Applications.ApplicationFormVersion", b => + { + b.Property("Id") + .HasColumnType("uuid"); + + b.Property("ApplicationFormId") + .HasColumnType("uuid"); + + b.Property("AvailableChefsFields") + .HasColumnType("text"); + + b.Property("ChefsApplicationFormGuid") + .HasColumnType("text"); + + b.Property("ChefsFormVersionGuid") + .HasColumnType("text"); + + b.Property("ConcurrencyStamp") + .IsConcurrencyToken() + .IsRequired() + .HasMaxLength(40) + .HasColumnType("character varying(40)") + .HasColumnName("ConcurrencyStamp"); + + b.Property("CreationTime") + .HasColumnType("timestamp without time zone") + .HasColumnName("CreationTime"); + + b.Property("CreatorId") + .HasColumnType("uuid") + .HasColumnName("CreatorId"); + + b.Property("ExtraProperties") + .IsRequired() + .HasColumnType("text") + .HasColumnName("ExtraProperties"); + + b.Property("FormSchema") + .HasColumnType("jsonb"); + + b.Property("LastModificationTime") + .HasColumnType("timestamp without time zone") + .HasColumnName("LastModificationTime"); + + b.Property("LastModifierId") + .HasColumnType("uuid") + .HasColumnName("LastModifierId"); + + b.Property("Published") + .HasColumnType("boolean"); + + b.Property("ReportColumns") + .IsRequired() + .HasColumnType("text"); + + b.Property("ReportKeys") + .IsRequired() + .HasColumnType("text"); + + b.Property("ReportViewName") + .IsRequired() + .HasColumnType("text"); + + b.Property("SubmissionHeaderMapping") + .HasColumnType("text"); + + b.Property("TenantId") + .HasColumnType("uuid") + .HasColumnName("TenantId"); + + b.Property("Version") + .HasColumnType("integer"); + + b.HasKey("Id"); + + b.HasIndex("ApplicationFormId"); + + b.ToTable("ApplicationFormVersion", (string)null); + }); + + modelBuilder.Entity("Unity.GrantManager.Applications.ApplicationLink", b => + { + b.Property("Id") + .HasColumnType("uuid"); + + b.Property("ApplicationId") + .HasColumnType("uuid"); + + b.Property("ConcurrencyStamp") + .IsConcurrencyToken() + .IsRequired() + .HasMaxLength(40) + .HasColumnType("character varying(40)") + .HasColumnName("ConcurrencyStamp"); + + b.Property("CreationTime") + .HasColumnType("timestamp without time zone") + .HasColumnName("CreationTime"); + + b.Property("CreatorId") + .HasColumnType("uuid") + .HasColumnName("CreatorId"); + + b.Property("ExtraProperties") + .IsRequired() + .HasColumnType("text") + .HasColumnName("ExtraProperties"); + + b.Property("LastModificationTime") + .HasColumnType("timestamp without time zone") + .HasColumnName("LastModificationTime"); + + b.Property("LastModifierId") + .HasColumnType("uuid") + .HasColumnName("LastModifierId"); + + b.Property("LinkedApplicationId") + .HasColumnType("uuid"); + + b.Property("TenantId") + .HasColumnType("uuid") + .HasColumnName("TenantId"); + + b.HasKey("Id"); + + b.HasIndex("ApplicationId"); + + b.ToTable("ApplicationLinks", (string)null); + }); + + modelBuilder.Entity("Unity.GrantManager.Applications.ApplicationStatus", b => + { + b.Property("Id") + .HasColumnType("uuid"); + + b.Property("ConcurrencyStamp") + .IsConcurrencyToken() + .IsRequired() + .HasMaxLength(40) + .HasColumnType("character varying(40)") + .HasColumnName("ConcurrencyStamp"); + + b.Property("CreationTime") + .HasColumnType("timestamp without time zone") + .HasColumnName("CreationTime"); + + b.Property("CreatorId") + .HasColumnType("uuid") + .HasColumnName("CreatorId"); + + b.Property("ExternalStatus") + .IsRequired() + .HasColumnType("text"); + + b.Property("ExtraProperties") + .IsRequired() + .HasColumnType("text") + .HasColumnName("ExtraProperties"); + + b.Property("InternalStatus") + .IsRequired() + .HasColumnType("text"); + + b.Property("LastModificationTime") + .HasColumnType("timestamp without time zone") + .HasColumnName("LastModificationTime"); + + b.Property("LastModifierId") + .HasColumnType("uuid") + .HasColumnName("LastModifierId"); + + b.Property("StatusCode") + .IsRequired() + .HasMaxLength(250) + .HasColumnType("character varying(250)"); + + b.Property("TenantId") + .HasColumnType("uuid") + .HasColumnName("TenantId"); + + b.HasKey("Id"); + + b.HasIndex("StatusCode") + .IsUnique(); + + b.ToTable("ApplicationStatuses", (string)null); + }); + + modelBuilder.Entity("Unity.GrantManager.Applications.ApplicationTags", b => + { + b.Property("Id") + .HasColumnType("uuid"); + + b.Property("ApplicationId") + .HasColumnType("uuid"); + + b.Property("ConcurrencyStamp") + .IsConcurrencyToken() + .IsRequired() + .HasMaxLength(40) + .HasColumnType("character varying(40)") + .HasColumnName("ConcurrencyStamp"); + + b.Property("CreationTime") + .HasColumnType("timestamp without time zone") + .HasColumnName("CreationTime"); + + b.Property("CreatorId") + .HasColumnType("uuid") + .HasColumnName("CreatorId"); + + b.Property("ExtraProperties") + .IsRequired() + .HasColumnType("text") + .HasColumnName("ExtraProperties"); + + b.Property("LastModificationTime") + .HasColumnType("timestamp without time zone") + .HasColumnName("LastModificationTime"); + + b.Property("LastModifierId") + .HasColumnType("uuid") + .HasColumnName("LastModifierId"); + + b.Property("TagId") + .HasColumnType("uuid"); + + b.Property("TenantId") + .HasColumnType("uuid") + .HasColumnName("TenantId"); + + b.Property("Text") + .IsRequired() + .HasColumnType("text"); + + b.HasKey("Id"); + + b.HasIndex("ApplicationId"); + + b.HasIndex("TagId"); + + b.ToTable("ApplicationTags", (string)null); + }); + + modelBuilder.Entity("Unity.GrantManager.Applications.AssessmentAttachment", b => + { + b.Property("Id") + .HasColumnType("uuid"); + + b.Property("AssessmentId") + .HasColumnType("uuid"); + + b.Property("ConcurrencyStamp") + .IsConcurrencyToken() + .IsRequired() + .HasMaxLength(40) + .HasColumnType("character varying(40)") + .HasColumnName("ConcurrencyStamp"); + + b.Property("CreationTime") + .HasColumnType("timestamp without time zone") + .HasColumnName("CreationTime"); + + b.Property("CreatorId") + .HasColumnType("uuid") + .HasColumnName("CreatorId"); + + b.Property("DisplayName") + .HasMaxLength(1024) + .HasColumnType("character varying(1024)"); + + b.Property("ExtraProperties") + .IsRequired() + .HasColumnType("text") + .HasColumnName("ExtraProperties"); + + b.Property("FileName") + .HasColumnType("text"); + + b.Property("LastModificationTime") + .HasColumnType("timestamp without time zone") + .HasColumnName("LastModificationTime"); + + b.Property("LastModifierId") + .HasColumnType("uuid") + .HasColumnName("LastModifierId"); + + b.Property("S3ObjectKey") + .IsRequired() + .HasColumnType("text"); + + b.Property("TenantId") + .HasColumnType("uuid") + .HasColumnName("TenantId"); + + b.Property("Time") + .HasColumnType("timestamp without time zone"); + + b.Property("UserId") + .HasColumnType("uuid"); + + b.HasKey("Id"); + + b.HasIndex("AssessmentId"); + + b.ToTable("AssessmentAttachments", (string)null); + }); + + modelBuilder.Entity("Unity.GrantManager.Assessments.Assessment", b => + { + b.Property("Id") + .HasColumnType("uuid"); + + b.Property("ApplicationId") + .HasColumnType("uuid"); + + b.Property("ApprovalRecommended") + .HasColumnType("boolean"); + + b.Property("AssessorId") + .HasColumnType("uuid"); + + b.Property("CleanGrowth") + .HasColumnType("integer"); + + b.Property("ConcurrencyStamp") + .IsConcurrencyToken() + .IsRequired() + .HasMaxLength(40) + .HasColumnType("character varying(40)") + .HasColumnName("ConcurrencyStamp"); + + b.Property("CreationTime") + .HasColumnType("timestamp without time zone") + .HasColumnName("CreationTime"); + + b.Property("CreatorId") + .HasColumnType("uuid") + .HasColumnName("CreatorId"); + + b.Property("EconomicImpact") + .HasColumnType("integer"); + + b.Property("EndDate") + .HasColumnType("timestamp without time zone"); + + b.Property("ExtraProperties") + .IsRequired() + .HasColumnType("text") + .HasColumnName("ExtraProperties"); + + b.Property("FinancialAnalysis") + .HasColumnType("integer"); + + b.Property("InclusiveGrowth") + .HasColumnType("integer"); + + b.Property("IsComplete") + .HasColumnType("boolean"); + + b.Property("LastModificationTime") + .HasColumnType("timestamp without time zone") + .HasColumnName("LastModificationTime"); + + b.Property("LastModifierId") + .HasColumnType("uuid") + .HasColumnName("LastModifierId"); + + b.Property("Status") + .IsRequired() + .HasMaxLength(50) + .HasColumnType("character varying(50)"); + + b.Property("TenantId") + .HasColumnType("uuid") + .HasColumnName("TenantId"); + + b.HasKey("Id"); + + b.HasIndex("ApplicationId"); + + b.HasIndex("AssessorId"); + + b.ToTable("Assessments", (string)null); + }); + + modelBuilder.Entity("Unity.GrantManager.Comments.ApplicationComment", b => + { + b.Property("Id") + .HasColumnType("uuid"); + + b.Property("ApplicationId") + .HasColumnType("uuid"); + + b.Property("Comment") + .IsRequired() + .HasColumnType("text"); + + b.Property("CommenterId") + .HasColumnType("uuid"); + + b.Property("ConcurrencyStamp") + .IsConcurrencyToken() + .IsRequired() + .HasMaxLength(40) + .HasColumnType("character varying(40)") + .HasColumnName("ConcurrencyStamp"); + + b.Property("CreationTime") + .HasColumnType("timestamp without time zone") + .HasColumnName("CreationTime"); + + b.Property("CreatorId") + .HasColumnType("uuid") + .HasColumnName("CreatorId"); + + b.Property("ExtraProperties") + .IsRequired() + .HasColumnType("text") + .HasColumnName("ExtraProperties"); + + b.Property("LastModificationTime") + .HasColumnType("timestamp without time zone") + .HasColumnName("LastModificationTime"); + + b.Property("LastModifierId") + .HasColumnType("uuid") + .HasColumnName("LastModifierId"); + + b.Property("TenantId") + .HasColumnType("uuid") + .HasColumnName("TenantId"); + + b.HasKey("Id"); + + b.HasIndex("ApplicationId"); + + b.HasIndex("CommenterId"); + + b.ToTable("ApplicationComments", (string)null); + }); + + modelBuilder.Entity("Unity.GrantManager.Comments.AssessmentComment", b => + { + b.Property("Id") + .HasColumnType("uuid"); + + b.Property("AssessmentId") + .HasColumnType("uuid"); + + b.Property("Comment") + .IsRequired() + .HasColumnType("text"); + + b.Property("CommenterId") + .HasColumnType("uuid"); + + b.Property("ConcurrencyStamp") + .IsConcurrencyToken() + .IsRequired() + .HasMaxLength(40) + .HasColumnType("character varying(40)") + .HasColumnName("ConcurrencyStamp"); + + b.Property("CreationTime") + .HasColumnType("timestamp without time zone") + .HasColumnName("CreationTime"); + + b.Property("CreatorId") + .HasColumnType("uuid") + .HasColumnName("CreatorId"); + + b.Property("ExtraProperties") + .IsRequired() + .HasColumnType("text") + .HasColumnName("ExtraProperties"); + + b.Property("LastModificationTime") + .HasColumnType("timestamp without time zone") + .HasColumnName("LastModificationTime"); + + b.Property("LastModifierId") + .HasColumnType("uuid") + .HasColumnName("LastModifierId"); + + b.Property("TenantId") + .HasColumnType("uuid") + .HasColumnName("TenantId"); + + b.HasKey("Id"); + + b.HasIndex("AssessmentId"); + + b.HasIndex("CommenterId"); + + b.ToTable("AssessmentComments", (string)null); + }); + + modelBuilder.Entity("Unity.GrantManager.GlobalTag.Tag", b => + { + b.Property("Id") + .HasColumnType("uuid"); + + b.Property("ConcurrencyStamp") + .IsConcurrencyToken() + .IsRequired() + .HasMaxLength(40) + .HasColumnType("character varying(40)") + .HasColumnName("ConcurrencyStamp"); + + b.Property("CreationTime") + .HasColumnType("timestamp without time zone") + .HasColumnName("CreationTime"); + + b.Property("CreatorId") + .HasColumnType("uuid") + .HasColumnName("CreatorId"); + + b.Property("ExtraProperties") + .IsRequired() + .HasColumnType("text") + .HasColumnName("ExtraProperties"); + + b.Property("LastModificationTime") + .HasColumnType("timestamp without time zone") + .HasColumnName("LastModificationTime"); + + b.Property("LastModifierId") + .HasColumnType("uuid") + .HasColumnName("LastModifierId"); + + b.Property("Name") + .IsRequired() + .HasColumnType("text"); + + b.Property("TenantId") + .HasColumnType("uuid") + .HasColumnName("TenantId"); + + b.HasKey("Id"); + + b.ToTable("Tags", (string)null); + }); + + modelBuilder.Entity("Unity.GrantManager.Identity.Person", b => + { + b.Property("Id") + .HasColumnType("uuid"); + + b.Property("Badge") + .IsRequired() + .HasColumnType("text"); + + b.Property("ConcurrencyStamp") + .IsConcurrencyToken() + .IsRequired() + .HasMaxLength(40) + .HasColumnType("character varying(40)") + .HasColumnName("ConcurrencyStamp"); + + b.Property("CreationTime") + .HasColumnType("timestamp without time zone") + .HasColumnName("CreationTime"); + + b.Property("CreatorId") + .HasColumnType("uuid") + .HasColumnName("CreatorId"); + + b.Property("ExtraProperties") + .IsRequired() + .HasColumnType("text") + .HasColumnName("ExtraProperties"); + + b.Property("FullName") + .IsRequired() + .HasColumnType("text"); + + b.Property("LastModificationTime") + .HasColumnType("timestamp without time zone") + .HasColumnName("LastModificationTime"); + + b.Property("LastModifierId") + .HasColumnType("uuid") + .HasColumnName("LastModifierId"); + + b.Property("OidcDisplayName") + .IsRequired() + .HasColumnType("text"); + + b.Property("OidcSub") + .IsRequired() + .HasColumnType("text"); + + b.Property("TenantId") + .HasColumnType("uuid") + .HasColumnName("TenantId"); + + b.HasKey("Id"); + + b.HasIndex("OidcSub"); + + b.ToTable("Persons", (string)null); + }); + + modelBuilder.Entity("Unity.GrantManager.Intakes.Intake", b => + { + b.Property("Id") + .HasColumnType("uuid"); + + b.Property("Budget") + .HasColumnType("double precision"); + + b.Property("ConcurrencyStamp") + .IsConcurrencyToken() + .IsRequired() + .HasMaxLength(40) + .HasColumnType("character varying(40)") + .HasColumnName("ConcurrencyStamp"); + + b.Property("CreationTime") + .HasColumnType("timestamp without time zone") + .HasColumnName("CreationTime"); + + b.Property("CreatorId") + .HasColumnType("uuid") + .HasColumnName("CreatorId"); + + b.Property("DeleterId") + .HasColumnType("uuid") + .HasColumnName("DeleterId"); + + b.Property("DeletionTime") + .HasColumnType("timestamp without time zone") + .HasColumnName("DeletionTime"); + + b.Property("EndDate") + .HasColumnType("timestamp without time zone"); + + b.Property("ExtraProperties") + .IsRequired() + .HasColumnType("text") + .HasColumnName("ExtraProperties"); + + b.Property("IntakeName") + .IsRequired() + .HasMaxLength(255) + .HasColumnType("character varying(255)"); + + b.Property("IsDeleted") + .ValueGeneratedOnAdd() + .HasColumnType("boolean") + .HasDefaultValue(false) + .HasColumnName("IsDeleted"); + + b.Property("LastModificationTime") + .HasColumnType("timestamp without time zone") + .HasColumnName("LastModificationTime"); + + b.Property("LastModifierId") + .HasColumnType("uuid") + .HasColumnName("LastModifierId"); + + b.Property("StartDate") + .HasColumnType("timestamp without time zone"); + + b.Property("TenantId") + .HasColumnType("uuid") + .HasColumnName("TenantId"); + + b.HasKey("Id"); + + b.ToTable("Intakes", (string)null); + }); + + modelBuilder.Entity("Unity.Notifications.Emails.EmailLog", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("uuid"); + + b.Property("ApplicantId") + .HasColumnType("uuid"); + + b.Property("ApplicationId") + .HasColumnType("uuid"); + + b.Property("AssessmentId") + .HasColumnType("uuid"); + + b.Property("BCC") + .IsRequired() + .HasColumnType("text"); + + b.Property("Body") + .IsRequired() + .HasColumnType("text"); + + b.Property("BodyType") + .IsRequired() + .HasColumnType("text"); + + b.Property("CC") + .IsRequired() + .HasColumnType("text"); + + b.Property("ChesMsgId") + .HasColumnType("uuid"); + + b.Property("ChesResponse") + .IsRequired() + .HasColumnType("text"); + + b.Property("ChesStatus") + .IsRequired() + .HasColumnType("text"); + + b.Property("ConcurrencyStamp") + .IsConcurrencyToken() + .IsRequired() + .HasMaxLength(40) + .HasColumnType("character varying(40)") + .HasColumnName("ConcurrencyStamp"); + + b.Property("CreationTime") + .HasColumnType("timestamp without time zone") + .HasColumnName("CreationTime"); + + b.Property("CreatorId") + .HasColumnType("uuid") + .HasColumnName("CreatorId"); + + b.Property("ExtraProperties") + .IsRequired() + .HasColumnType("text") + .HasColumnName("ExtraProperties"); + + b.Property("FromAddress") + .IsRequired() + .HasColumnType("text"); + + b.Property("LastModificationTime") + .HasColumnType("timestamp without time zone") + .HasColumnName("LastModificationTime"); + + b.Property("LastModifierId") + .HasColumnType("uuid") + .HasColumnName("LastModifierId"); + + b.Property("Priority") + .IsRequired() + .HasColumnType("text"); + + b.Property("RetryAttempts") + .HasColumnType("integer"); + + b.Property("SendOnDateTime") + .HasColumnType("timestamp without time zone"); + + b.Property("SentDateTime") + .HasColumnType("timestamp without time zone"); + + b.Property("Status") + .IsRequired() + .HasColumnType("text"); + + b.Property("Subject") + .IsRequired() + .HasColumnType("text"); + + b.Property("Tag") + .IsRequired() + .HasColumnType("text"); + + b.Property("TemplateName") + .IsRequired() + .HasColumnType("text"); + + b.Property("TenantId") + .HasColumnType("uuid") + .HasColumnName("TenantId"); + + b.Property("ToAddress") + .IsRequired() + .HasColumnType("text"); + + b.HasKey("Id"); + + b.ToTable("EmailLogs", "Notifications"); + }); + + modelBuilder.Entity("Unity.Notifications.Templates.EmailTemplate", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("uuid"); + + b.Property("BodyHTML") + .IsRequired() + .HasColumnType("text"); + + b.Property("BodyText") + .IsRequired() + .HasColumnType("text"); + + b.Property("ConcurrencyStamp") + .IsConcurrencyToken() + .IsRequired() + .HasMaxLength(40) + .HasColumnType("character varying(40)") + .HasColumnName("ConcurrencyStamp"); + + b.Property("CreationTime") + .HasColumnType("timestamp without time zone") + .HasColumnName("CreationTime"); + + b.Property("CreatorId") + .HasColumnType("uuid") + .HasColumnName("CreatorId"); + + b.Property("DeleterId") + .HasColumnType("uuid") + .HasColumnName("DeleterId"); + + b.Property("DeletionTime") + .HasColumnType("timestamp without time zone") + .HasColumnName("DeletionTime"); + + b.Property("Description") + .IsRequired() + .HasColumnType("text"); + + b.Property("ExtraProperties") + .IsRequired() + .HasColumnType("text") + .HasColumnName("ExtraProperties"); + + b.Property("IsDeleted") + .ValueGeneratedOnAdd() + .HasColumnType("boolean") + .HasDefaultValue(false) + .HasColumnName("IsDeleted"); + + b.Property("LastModificationTime") + .HasColumnType("timestamp without time zone") + .HasColumnName("LastModificationTime"); + + b.Property("LastModifierId") + .HasColumnType("uuid") + .HasColumnName("LastModifierId"); + + b.Property("Name") + .IsRequired() + .HasColumnType("text"); + + b.Property("SendFrom") + .IsRequired() + .HasColumnType("text"); + + b.Property("Subject") + .IsRequired() + .HasColumnType("text"); + + b.Property("TenantId") + .HasColumnType("uuid") + .HasColumnName("TenantId"); + + b.HasKey("Id"); + + b.ToTable("EmailTemplates", "Notifications"); + }); + + modelBuilder.Entity("Unity.Notifications.Templates.Subscriber", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("uuid"); + + b.Property("ConcurrencyStamp") + .IsConcurrencyToken() + .IsRequired() + .HasMaxLength(40) + .HasColumnType("character varying(40)") + .HasColumnName("ConcurrencyStamp"); + + b.Property("CreationTime") + .HasColumnType("timestamp without time zone") + .HasColumnName("CreationTime"); + + b.Property("CreatorId") + .HasColumnType("uuid") + .HasColumnName("CreatorId"); + + b.Property("Email") + .IsRequired() + .HasColumnType("text"); + + b.Property("ExtraProperties") + .IsRequired() + .HasColumnType("text") + .HasColumnName("ExtraProperties"); + + b.Property("FirstName") + .IsRequired() + .HasColumnType("text"); + + b.Property("LastModificationTime") + .HasColumnType("timestamp without time zone") + .HasColumnName("LastModificationTime"); + + b.Property("LastModifierId") + .HasColumnType("uuid") + .HasColumnName("LastModifierId"); + + b.Property("LastName") + .IsRequired() + .HasColumnType("text"); + + b.Property("TenantId") + .HasColumnType("uuid") + .HasColumnName("TenantId"); + + b.HasKey("Id"); + + b.ToTable("Subscribers", "Notifications"); + }); + + modelBuilder.Entity("Unity.Notifications.Templates.SubscriptionGroup", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("uuid"); + + b.Property("ConcurrencyStamp") + .IsConcurrencyToken() + .IsRequired() + .HasMaxLength(40) + .HasColumnType("character varying(40)") + .HasColumnName("ConcurrencyStamp"); + + b.Property("CreationTime") + .HasColumnType("timestamp without time zone") + .HasColumnName("CreationTime"); + + b.Property("CreatorId") + .HasColumnType("uuid") + .HasColumnName("CreatorId"); + + b.Property("ExtraProperties") + .IsRequired() + .HasColumnType("text") + .HasColumnName("ExtraProperties"); + + b.Property("LastModificationTime") + .HasColumnType("timestamp without time zone") + .HasColumnName("LastModificationTime"); + + b.Property("LastModifierId") + .HasColumnType("uuid") + .HasColumnName("LastModifierId"); + + b.Property("Name") + .IsRequired() + .HasColumnType("text"); + + b.Property("TenantId") + .HasColumnType("uuid") + .HasColumnName("TenantId"); + + b.HasKey("Id"); + + b.ToTable("SubscriptionGroups", "Notifications"); + }); + + modelBuilder.Entity("Unity.Notifications.Templates.SubscriptionGroupSubscription", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("uuid"); + + b.Property("ConcurrencyStamp") + .IsConcurrencyToken() + .IsRequired() + .HasMaxLength(40) + .HasColumnType("character varying(40)") + .HasColumnName("ConcurrencyStamp"); + + b.Property("CreationTime") + .HasColumnType("timestamp without time zone") + .HasColumnName("CreationTime"); + + b.Property("CreatorId") + .HasColumnType("uuid") + .HasColumnName("CreatorId"); + + b.Property("ExtraProperties") + .IsRequired() + .HasColumnType("text") + .HasColumnName("ExtraProperties"); + + b.Property("GroupId") + .HasColumnType("uuid"); + + b.Property("LastModificationTime") + .HasColumnType("timestamp without time zone") + .HasColumnName("LastModificationTime"); + + b.Property("LastModifierId") + .HasColumnType("uuid") + .HasColumnName("LastModifierId"); + + b.Property("SubscriberId") + .HasColumnType("uuid"); + + b.Property("TenantId") + .HasColumnType("uuid") + .HasColumnName("TenantId"); + + b.HasKey("Id"); + + b.HasIndex("GroupId"); + + b.HasIndex("SubscriberId"); + + b.ToTable("SubscriptionGroupSubscribers", "Notifications"); + }); + + modelBuilder.Entity("Unity.Notifications.Templates.TemplateVariable", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("uuid"); + + b.Property("ConcurrencyStamp") + .IsConcurrencyToken() + .IsRequired() + .HasMaxLength(40) + .HasColumnType("character varying(40)") + .HasColumnName("ConcurrencyStamp"); + + b.Property("CreationTime") + .HasColumnType("timestamp without time zone") + .HasColumnName("CreationTime"); + + b.Property("CreatorId") + .HasColumnType("uuid") + .HasColumnName("CreatorId"); + + b.Property("ExtraProperties") + .IsRequired() + .HasColumnType("text") + .HasColumnName("ExtraProperties"); + + b.Property("LastModificationTime") + .HasColumnType("timestamp without time zone") + .HasColumnName("LastModificationTime"); + + b.Property("LastModifierId") + .HasColumnType("uuid") + .HasColumnName("LastModifierId"); + + b.Property("MapTo") + .IsRequired() + .HasColumnType("text"); + + b.Property("Name") + .IsRequired() + .HasColumnType("text"); + + b.Property("TenantId") + .HasColumnType("uuid") + .HasColumnName("TenantId"); + + b.Property("Token") + .IsRequired() + .HasColumnType("text"); + + b.HasKey("Id"); + + b.ToTable("TemplateVariables", "Notifications"); + }); + + modelBuilder.Entity("Unity.Notifications.Templates.Trigger", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("uuid"); + + b.Property("Active") + .HasColumnType("boolean"); + + b.Property("ConcurrencyStamp") + .IsConcurrencyToken() + .IsRequired() + .HasMaxLength(40) + .HasColumnType("character varying(40)") + .HasColumnName("ConcurrencyStamp"); + + b.Property("CreationTime") + .HasColumnType("timestamp without time zone") + .HasColumnName("CreationTime"); + + b.Property("CreatorId") + .HasColumnType("uuid") + .HasColumnName("CreatorId"); + + b.Property("ExtraProperties") + .IsRequired() + .HasColumnType("text") + .HasColumnName("ExtraProperties"); + + b.Property("InternalName") + .IsRequired() + .HasColumnType("text"); + + b.Property("LastModificationTime") + .HasColumnType("timestamp without time zone") + .HasColumnName("LastModificationTime"); + + b.Property("LastModifierId") + .HasColumnType("uuid") + .HasColumnName("LastModifierId"); + + b.Property("Name") + .IsRequired() + .HasColumnType("text"); + + b.Property("TenantId") + .HasColumnType("uuid") + .HasColumnName("TenantId"); + + b.HasKey("Id"); + + b.ToTable("Triggers", "Notifications"); + }); + + modelBuilder.Entity("Unity.Notifications.Templates.TriggerSubscription", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("uuid"); + + b.Property("ConcurrencyStamp") + .IsConcurrencyToken() + .IsRequired() + .HasMaxLength(40) + .HasColumnType("character varying(40)") + .HasColumnName("ConcurrencyStamp"); + + b.Property("CreationTime") + .HasColumnType("timestamp without time zone") + .HasColumnName("CreationTime"); + + b.Property("CreatorId") + .HasColumnType("uuid") + .HasColumnName("CreatorId"); + + b.Property("ExtraProperties") + .IsRequired() + .HasColumnType("text") + .HasColumnName("ExtraProperties"); + + b.Property("LastModificationTime") + .HasColumnType("timestamp without time zone") + .HasColumnName("LastModificationTime"); + + b.Property("LastModifierId") + .HasColumnType("uuid") + .HasColumnName("LastModifierId"); + + b.Property("SubscriptionGroupId") + .HasColumnType("uuid"); + + b.Property("TemplateId") + .HasColumnType("uuid"); + + b.Property("TenantId") + .HasColumnType("uuid") + .HasColumnName("TenantId"); + + b.Property("TriggerId") + .HasColumnType("uuid"); + + b.HasKey("Id"); + + b.HasIndex("SubscriptionGroupId"); + + b.HasIndex("TemplateId"); + + b.HasIndex("TriggerId"); + + b.ToTable("TriggerSubscriptions", "Notifications"); + }); + + modelBuilder.Entity("Unity.Payments.Domain.PaymentConfigurations.PaymentConfiguration", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("uuid"); + + b.Property("ConcurrencyStamp") + .IsConcurrencyToken() + .IsRequired() + .HasMaxLength(40) + .HasColumnType("character varying(40)") + .HasColumnName("ConcurrencyStamp"); + + b.Property("CreationTime") + .HasColumnType("timestamp without time zone") + .HasColumnName("CreationTime"); + + b.Property("CreatorId") + .HasColumnType("uuid") + .HasColumnName("CreatorId"); + + b.Property("DeleterId") + .HasColumnType("uuid") + .HasColumnName("DeleterId"); + + b.Property("DeletionTime") + .HasColumnType("timestamp without time zone") + .HasColumnName("DeletionTime"); + + b.Property("ExtraProperties") + .IsRequired() + .HasColumnType("text") + .HasColumnName("ExtraProperties"); + + b.Property("IsDeleted") + .ValueGeneratedOnAdd() + .HasColumnType("boolean") + .HasDefaultValue(false) + .HasColumnName("IsDeleted"); + + b.Property("LastModificationTime") + .HasColumnType("timestamp without time zone") + .HasColumnName("LastModificationTime"); + + b.Property("LastModifierId") + .HasColumnType("uuid") + .HasColumnName("LastModifierId"); + + b.Property("MinistryClient") + .HasColumnType("text"); + + b.Property("PaymentIdPrefix") + .IsRequired() + .HasColumnType("text"); + + b.Property("PaymentThreshold") + .HasColumnType("numeric"); + + b.Property("ProjectNumber") + .HasColumnType("text"); + + b.Property("Responsibility") + .HasColumnType("text"); + + b.Property("ServiceLine") + .HasColumnType("text"); + + b.Property("Stob") + .HasColumnType("text"); + + b.Property("TenantId") + .HasColumnType("uuid") + .HasColumnName("TenantId"); + + b.HasKey("Id"); + + b.ToTable("PaymentConfigurations", "Payments"); + }); + + modelBuilder.Entity("Unity.Payments.Domain.PaymentRequests.ExpenseApproval", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("uuid"); + + b.Property("CreationTime") + .HasColumnType("timestamp without time zone") + .HasColumnName("CreationTime"); + + b.Property("CreatorId") + .HasColumnType("uuid") + .HasColumnName("CreatorId"); + + b.Property("DecisionDate") + .HasColumnType("timestamp without time zone"); + + b.Property("DecisionUserId") + .HasColumnType("uuid"); + + b.Property("DeleterId") + .HasColumnType("uuid") + .HasColumnName("DeleterId"); + + b.Property("DeletionTime") + .HasColumnType("timestamp without time zone") + .HasColumnName("DeletionTime"); + + b.Property("IsDeleted") + .ValueGeneratedOnAdd() + .HasColumnType("boolean") + .HasDefaultValue(false) + .HasColumnName("IsDeleted"); + + b.Property("LastModificationTime") + .HasColumnType("timestamp without time zone") + .HasColumnName("LastModificationTime"); + + b.Property("LastModifierId") + .HasColumnType("uuid") + .HasColumnName("LastModifierId"); + + b.Property("PaymentRequestId") + .HasColumnType("uuid"); + + b.Property("Status") + .HasColumnType("integer"); + + b.Property("TenantId") + .HasColumnType("uuid") + .HasColumnName("TenantId"); + + b.Property("Type") + .HasColumnType("integer"); + + b.HasKey("Id"); + + b.HasIndex("PaymentRequestId"); + + b.ToTable("ExpenseApprovals", "Payments"); + }); + + modelBuilder.Entity("Unity.Payments.Domain.PaymentRequests.PaymentRequest", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("uuid"); + + b.Property("Amount") + .HasColumnType("numeric"); + + b.Property("BatchName") + .IsRequired() + .HasColumnType("text"); + + b.Property("BatchNumber") + .HasColumnType("numeric"); + + b.Property("CasHttpStatusCode") + .HasColumnType("integer"); + + b.Property("CasResponse") + .HasColumnType("text"); + + b.Property("ConcurrencyStamp") + .IsConcurrencyToken() + .IsRequired() + .HasMaxLength(40) + .HasColumnType("character varying(40)") + .HasColumnName("ConcurrencyStamp"); + + b.Property("ContractNumber") + .IsRequired() + .HasColumnType("text"); + + b.Property("CorrelationId") + .HasColumnType("uuid"); + + b.Property("CorrelationProvider") + .IsRequired() + .HasColumnType("text"); + + b.Property("CreationTime") + .HasColumnType("timestamp without time zone") + .HasColumnName("CreationTime"); + + b.Property("CreatorId") + .HasColumnType("uuid") + .HasColumnName("CreatorId"); + + b.Property("DeleterId") + .HasColumnType("uuid") + .HasColumnName("DeleterId"); + + b.Property("DeletionTime") + .HasColumnType("timestamp without time zone") + .HasColumnName("DeletionTime"); + + b.Property("Description") + .HasColumnType("text"); + + b.Property("ExtraProperties") + .IsRequired() + .HasColumnType("text") + .HasColumnName("ExtraProperties"); + + b.Property("InvoiceNumber") + .IsRequired() + .HasColumnType("text"); + + b.Property("InvoiceStatus") + .HasColumnType("text"); + + b.Property("IsDeleted") + .ValueGeneratedOnAdd() + .HasColumnType("boolean") + .HasDefaultValue(false) + .HasColumnName("IsDeleted"); + + b.Property("IsRecon") + .HasColumnType("boolean"); + + b.Property("LastModificationTime") + .HasColumnType("timestamp without time zone") + .HasColumnName("LastModificationTime"); + + b.Property("LastModifierId") + .HasColumnType("uuid") + .HasColumnName("LastModifierId"); + + b.Property("PayeeName") + .IsRequired() + .HasColumnType("text"); + + b.Property("PaymentDate") + .HasColumnType("text"); + + b.Property("PaymentNumber") + .HasColumnType("text"); + + b.Property("PaymentStatus") + .HasColumnType("text"); + + b.Property("ReferenceNumber") + .IsRequired() + .HasColumnType("text"); + + b.Property("RequesterName") + .IsRequired() + .HasColumnType("text"); + + b.Property("SiteId") + .HasColumnType("uuid"); + + b.Property("Status") + .HasColumnType("integer"); + + b.Property("SubmissionConfirmationCode") + .IsRequired() + .HasColumnType("text"); + + b.Property("SupplierName") + .HasColumnType("text"); + + b.Property("SupplierNumber") + .IsRequired() + .HasColumnType("text"); + + b.Property("TenantId") + .HasColumnType("uuid") + .HasColumnName("TenantId"); + + b.HasKey("Id"); + + b.HasIndex("ReferenceNumber") + .IsUnique(); + + b.HasIndex("SiteId"); + + b.ToTable("PaymentRequests", "Payments"); + }); + + modelBuilder.Entity("Unity.Payments.Domain.PaymentTags.PaymentTag", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("uuid"); + + b.Property("ConcurrencyStamp") + .IsConcurrencyToken() + .IsRequired() + .HasMaxLength(40) + .HasColumnType("character varying(40)") + .HasColumnName("ConcurrencyStamp"); + + b.Property("CreationTime") + .HasColumnType("timestamp without time zone") + .HasColumnName("CreationTime"); + + b.Property("CreatorId") + .HasColumnType("uuid") + .HasColumnName("CreatorId"); + + b.Property("ExtraProperties") + .IsRequired() + .HasColumnType("text") + .HasColumnName("ExtraProperties"); + + b.Property("LastModificationTime") + .HasColumnType("timestamp without time zone") + .HasColumnName("LastModificationTime"); + + b.Property("LastModifierId") + .HasColumnType("uuid") + .HasColumnName("LastModifierId"); + + b.Property("PaymentRequestId") + .HasColumnType("uuid"); + + b.Property("TagId") + .HasColumnType("uuid"); + + b.Property("TenantId") + .HasColumnType("uuid") + .HasColumnName("TenantId"); + + b.Property("Text") + .IsRequired() + .HasColumnType("text"); + + b.HasKey("Id"); + + b.HasIndex("PaymentRequestId"); + + b.HasIndex("TagId"); + + b.ToTable("PaymentTags", "Payments"); + }); + + modelBuilder.Entity("Unity.Payments.Domain.Suppliers.Site", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("uuid"); + + b.Property("AddressLine1") + .HasColumnType("text"); + + b.Property("AddressLine2") + .HasColumnType("text"); + + b.Property("AddressLine3") + .HasColumnType("text"); + + b.Property("BankAccount") + .HasColumnType("text"); + + b.Property("City") + .HasColumnType("text"); + + b.Property("Country") + .HasColumnType("text"); + + b.Property("CreationTime") + .HasColumnType("timestamp without time zone") + .HasColumnName("CreationTime"); + + b.Property("CreatorId") + .HasColumnType("uuid") + .HasColumnName("CreatorId"); + + b.Property("DeleterId") + .HasColumnType("uuid") + .HasColumnName("DeleterId"); + + b.Property("DeletionTime") + .HasColumnType("timestamp without time zone") + .HasColumnName("DeletionTime"); + + b.Property("EFTAdvicePref") + .HasColumnType("text"); + + b.Property("EmailAddress") + .HasColumnType("text"); + + b.Property("IsDeleted") + .ValueGeneratedOnAdd() + .HasColumnType("boolean") + .HasDefaultValue(false) + .HasColumnName("IsDeleted"); + + b.Property("LastModificationTime") + .HasColumnType("timestamp without time zone") + .HasColumnName("LastModificationTime"); + + b.Property("LastModifierId") + .HasColumnType("uuid") + .HasColumnName("LastModifierId"); + + b.Property("LastUpdatedInCas") + .HasColumnType("timestamp without time zone"); + + b.Property("MarkDeletedInUse") + .HasColumnType("boolean"); + + b.Property("Number") + .IsRequired() + .HasColumnType("text"); + + b.Property("PaymentGroup") + .HasColumnType("integer"); + + b.Property("PostalCode") + .HasColumnType("text"); + + b.Property("ProviderId") + .HasColumnType("text"); + + b.Property("Province") + .HasColumnType("text"); + + b.Property("SiteProtected") + .HasColumnType("text"); + + b.Property("Status") + .HasColumnType("text"); + + b.Property("SupplierId") + .HasColumnType("uuid"); + + b.Property("TenantId") + .HasColumnType("uuid") + .HasColumnName("TenantId"); + + b.HasKey("Id"); + + b.HasIndex("SupplierId"); + + b.ToTable("Sites", "Payments"); + }); + + modelBuilder.Entity("Unity.Payments.Domain.Suppliers.Supplier", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("uuid"); + + b.Property("BusinessNumber") + .HasColumnType("text"); + + b.Property("City") + .HasColumnType("text"); + + b.Property("ConcurrencyStamp") + .IsConcurrencyToken() + .IsRequired() + .HasMaxLength(40) + .HasColumnType("character varying(40)") + .HasColumnName("ConcurrencyStamp"); + + b.Property("CorrelationId") + .HasColumnType("uuid"); + + b.Property("CorrelationProvider") + .IsRequired() + .HasColumnType("text"); + + b.Property("CreationTime") + .HasColumnType("timestamp without time zone") + .HasColumnName("CreationTime"); + + b.Property("CreatorId") + .HasColumnType("uuid") + .HasColumnName("CreatorId"); + + b.Property("DeleterId") + .HasColumnType("uuid") + .HasColumnName("DeleterId"); + + b.Property("DeletionTime") + .HasColumnType("timestamp without time zone") + .HasColumnName("DeletionTime"); + + b.Property("ExtraProperties") + .IsRequired() + .HasColumnType("text") + .HasColumnName("ExtraProperties"); + + b.Property("IsDeleted") + .ValueGeneratedOnAdd() + .HasColumnType("boolean") + .HasDefaultValue(false) + .HasColumnName("IsDeleted"); + + b.Property("LastModificationTime") + .HasColumnType("timestamp without time zone") + .HasColumnName("LastModificationTime"); + + b.Property("LastModifierId") + .HasColumnType("uuid") + .HasColumnName("LastModifierId"); + + b.Property("LastUpdatedInCAS") + .HasColumnType("timestamp without time zone"); + + b.Property("MailingAddress") + .HasColumnType("text"); + + b.Property("Name") + .HasColumnType("text"); + + b.Property("Number") + .HasColumnType("text"); + + b.Property("PostalCode") + .HasColumnType("text"); + + b.Property("ProviderId") + .HasColumnType("text"); + + b.Property("Province") + .HasColumnType("text"); + + b.Property("SIN") + .HasColumnType("text"); + + b.Property("StandardIndustryClassification") + .HasColumnType("text"); + + b.Property("Status") + .HasColumnType("text"); + + b.Property("Subcategory") + .HasColumnType("text"); + + b.Property("SupplierProtected") + .HasColumnType("text"); + + b.Property("TenantId") + .HasColumnType("uuid") + .HasColumnName("TenantId"); + + b.HasKey("Id"); + + b.ToTable("Suppliers", "Payments"); + }); + + modelBuilder.Entity("Unity.Flex.Domain.ScoresheetInstances.ScoresheetInstance", b => + { + b.HasOne("Unity.Flex.Domain.Scoresheets.Scoresheet", "Scoresheet") + .WithMany("Instances") + .HasForeignKey("ScoresheetId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("Scoresheet"); + }); + + modelBuilder.Entity("Unity.Flex.Domain.Scoresheets.Answer", b => + { + b.HasOne("Unity.Flex.Domain.Scoresheets.Question", "Question") + .WithMany("Answers") + .HasForeignKey("QuestionId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("Unity.Flex.Domain.ScoresheetInstances.ScoresheetInstance", null) + .WithMany("Answers") + .HasForeignKey("ScoresheetInstanceId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("Question"); + }); + + modelBuilder.Entity("Unity.Flex.Domain.Scoresheets.Question", b => + { + b.HasOne("Unity.Flex.Domain.Scoresheets.ScoresheetSection", "Section") + .WithMany("Fields") + .HasForeignKey("SectionId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("Section"); + }); + + modelBuilder.Entity("Unity.Flex.Domain.Scoresheets.ScoresheetSection", b => + { + b.HasOne("Unity.Flex.Domain.Scoresheets.Scoresheet", "Scoresheet") + .WithMany("Sections") + .HasForeignKey("ScoresheetId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("Scoresheet"); + }); + + modelBuilder.Entity("Unity.Flex.Domain.WorksheetInstances.CustomFieldValue", b => + { + b.HasOne("Unity.Flex.Domain.WorksheetInstances.WorksheetInstance", null) + .WithMany("Values") + .HasForeignKey("WorksheetInstanceId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + }); + + modelBuilder.Entity("Unity.Flex.Domain.WorksheetLinks.WorksheetLink", b => + { + b.HasOne("Unity.Flex.Domain.Worksheets.Worksheet", "Worksheet") + .WithMany("Links") + .HasForeignKey("WorksheetId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("Worksheet"); + }); + + modelBuilder.Entity("Unity.Flex.Domain.Worksheets.CustomField", b => + { + b.HasOne("Unity.Flex.Domain.Worksheets.WorksheetSection", "Section") + .WithMany("Fields") + .HasForeignKey("SectionId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("Section"); + }); + + modelBuilder.Entity("Unity.Flex.Domain.Worksheets.WorksheetSection", b => + { + b.HasOne("Unity.Flex.Domain.Worksheets.Worksheet", "Worksheet") + .WithMany("Sections") + .HasForeignKey("WorksheetId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("Worksheet"); + }); + + modelBuilder.Entity("Unity.GrantManager.Applications.ApplicantAddress", b => + { + b.HasOne("Unity.GrantManager.Applications.Applicant", "Applicant") + .WithMany("ApplicantAddresses") + .HasForeignKey("ApplicantId") + .OnDelete(DeleteBehavior.NoAction) + .IsRequired(); + + b.Navigation("Applicant"); + }); + + modelBuilder.Entity("Unity.GrantManager.Applications.ApplicantAgent", b => + { + b.HasOne("Unity.GrantManager.Applications.Applicant", null) + .WithMany() + .HasForeignKey("ApplicantId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("Unity.GrantManager.Applications.Application", "Application") + .WithOne("ApplicantAgent") + .HasForeignKey("Unity.GrantManager.Applications.ApplicantAgent", "ApplicationId"); + + b.HasOne("Unity.GrantManager.Identity.Person", null) + .WithMany() + .HasForeignKey("OidcSubUser") + .HasPrincipalKey("OidcSub"); + + b.Navigation("Application"); + }); + + modelBuilder.Entity("Unity.GrantManager.Applications.Application", b => + { + b.HasOne("Unity.GrantManager.Applications.Applicant", "Applicant") + .WithMany() + .HasForeignKey("ApplicantId") + .OnDelete(DeleteBehavior.NoAction) + .IsRequired(); + + b.HasOne("Unity.GrantManager.Applications.ApplicationForm", "ApplicationForm") + .WithMany() + .HasForeignKey("ApplicationFormId") + .OnDelete(DeleteBehavior.NoAction) + .IsRequired(); + + b.HasOne("Unity.GrantManager.Applications.ApplicationStatus", "ApplicationStatus") + .WithMany("Applications") + .HasForeignKey("ApplicationStatusId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("Unity.GrantManager.Identity.Person", "Owner") + .WithMany() + .HasForeignKey("OwnerId") + .OnDelete(DeleteBehavior.NoAction); + + b.Navigation("Applicant"); + + b.Navigation("ApplicationForm"); + + b.Navigation("ApplicationStatus"); + + b.Navigation("Owner"); + }); + + modelBuilder.Entity("Unity.GrantManager.Applications.ApplicationAssignment", b => + { + b.HasOne("Unity.GrantManager.Applications.Application", "Application") + .WithMany("ApplicationAssignments") + .HasForeignKey("ApplicationId") + .OnDelete(DeleteBehavior.NoAction) + .IsRequired(); + + b.HasOne("Unity.GrantManager.Identity.Person", "Assignee") + .WithMany() + .HasForeignKey("AssigneeId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("Application"); + + b.Navigation("Assignee"); + }); + + modelBuilder.Entity("Unity.GrantManager.Applications.ApplicationAttachment", b => + { + b.HasOne("Unity.GrantManager.Applications.Application", null) + .WithMany() + .HasForeignKey("ApplicationId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + }); + + modelBuilder.Entity("Unity.GrantManager.Applications.ApplicationChefsFileAttachment", b => + { + b.HasOne("Unity.GrantManager.Applications.Application", null) + .WithMany() + .HasForeignKey("ApplicationId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + }); + + modelBuilder.Entity("Unity.GrantManager.Applications.ApplicationContact", b => + { + b.HasOne("Unity.GrantManager.Applications.Application", null) + .WithMany() + .HasForeignKey("ApplicationId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + }); + + modelBuilder.Entity("Unity.GrantManager.Applications.ApplicationForm", b => + { + b.HasOne("Unity.GrantManager.Intakes.Intake", null) + .WithMany() + .HasForeignKey("IntakeId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + }); + + modelBuilder.Entity("Unity.GrantManager.Applications.ApplicationFormSubmission", b => + { + b.HasOne("Unity.GrantManager.Applications.Applicant", null) + .WithMany() + .HasForeignKey("ApplicantId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("Unity.GrantManager.Applications.ApplicationForm", null) + .WithMany() + .HasForeignKey("ApplicationFormId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + }); + + modelBuilder.Entity("Unity.GrantManager.Applications.ApplicationFormVersion", b => + { + b.HasOne("Unity.GrantManager.Applications.ApplicationForm", null) + .WithMany() + .HasForeignKey("ApplicationFormId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + }); + + modelBuilder.Entity("Unity.GrantManager.Applications.ApplicationLink", b => + { + b.HasOne("Unity.GrantManager.Applications.Application", null) + .WithMany() + .HasForeignKey("ApplicationId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + }); + + modelBuilder.Entity("Unity.GrantManager.Applications.ApplicationTags", b => + { + b.HasOne("Unity.GrantManager.Applications.Application", "Application") + .WithMany("ApplicationTags") + .HasForeignKey("ApplicationId") + .OnDelete(DeleteBehavior.NoAction) + .IsRequired(); + + b.HasOne("Unity.GrantManager.GlobalTag.Tag", "Tag") + .WithMany() + .HasForeignKey("TagId") + .OnDelete(DeleteBehavior.NoAction) + .IsRequired(); + + b.Navigation("Application"); + + b.Navigation("Tag"); + }); + + modelBuilder.Entity("Unity.GrantManager.Applications.AssessmentAttachment", b => + { + b.HasOne("Unity.GrantManager.Assessments.Assessment", null) + .WithMany() + .HasForeignKey("AssessmentId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + }); + + modelBuilder.Entity("Unity.GrantManager.Assessments.Assessment", b => + { + b.HasOne("Unity.GrantManager.Applications.Application", "Application") + .WithMany("Assessments") + .HasForeignKey("ApplicationId") + .OnDelete(DeleteBehavior.NoAction) + .IsRequired(); + + b.HasOne("Unity.GrantManager.Identity.Person", null) + .WithMany() + .HasForeignKey("AssessorId") + .OnDelete(DeleteBehavior.NoAction) + .IsRequired(); + + b.Navigation("Application"); + }); + + modelBuilder.Entity("Unity.GrantManager.Comments.ApplicationComment", b => + { + b.HasOne("Unity.GrantManager.Applications.Application", null) + .WithMany() + .HasForeignKey("ApplicationId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("Unity.GrantManager.Identity.Person", null) + .WithMany() + .HasForeignKey("CommenterId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + }); + + modelBuilder.Entity("Unity.GrantManager.Comments.AssessmentComment", b => + { + b.HasOne("Unity.GrantManager.Assessments.Assessment", null) + .WithMany() + .HasForeignKey("AssessmentId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("Unity.GrantManager.Identity.Person", null) + .WithMany() + .HasForeignKey("CommenterId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + }); + + modelBuilder.Entity("Unity.Notifications.Templates.SubscriptionGroupSubscription", b => + { + b.HasOne("Unity.Notifications.Templates.SubscriptionGroup", "SubscriptionGroup") + .WithMany() + .HasForeignKey("GroupId"); + + b.HasOne("Unity.Notifications.Templates.Subscriber", "Subscriber") + .WithMany() + .HasForeignKey("SubscriberId"); + + b.Navigation("Subscriber"); + + b.Navigation("SubscriptionGroup"); + }); + + modelBuilder.Entity("Unity.Notifications.Templates.TriggerSubscription", b => + { + b.HasOne("Unity.Notifications.Templates.SubscriptionGroup", "SubscriptionGroup") + .WithMany() + .HasForeignKey("SubscriptionGroupId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("Unity.Notifications.Templates.EmailTemplate", "EmailTemplate") + .WithMany() + .HasForeignKey("TemplateId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("Unity.Notifications.Templates.Trigger", "Trigger") + .WithMany() + .HasForeignKey("TriggerId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("EmailTemplate"); + + b.Navigation("SubscriptionGroup"); + + b.Navigation("Trigger"); + }); + + modelBuilder.Entity("Unity.Payments.Domain.PaymentRequests.ExpenseApproval", b => + { + b.HasOne("Unity.Payments.Domain.PaymentRequests.PaymentRequest", "PaymentRequest") + .WithMany("ExpenseApprovals") + .HasForeignKey("PaymentRequestId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("PaymentRequest"); + }); + + modelBuilder.Entity("Unity.Payments.Domain.PaymentRequests.PaymentRequest", b => + { + b.HasOne("Unity.Payments.Domain.Suppliers.Site", "Site") + .WithMany() + .HasForeignKey("SiteId") + .OnDelete(DeleteBehavior.NoAction) + .IsRequired(); + + b.Navigation("Site"); + }); + + modelBuilder.Entity("Unity.Payments.Domain.PaymentTags.PaymentTag", b => + { + b.HasOne("Unity.Payments.Domain.PaymentRequests.PaymentRequest", null) + .WithMany("PaymentTags") + .HasForeignKey("PaymentRequestId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("Unity.GrantManager.GlobalTag.Tag", "Tag") + .WithMany() + .HasForeignKey("TagId") + .OnDelete(DeleteBehavior.NoAction) + .IsRequired(); + + b.Navigation("Tag"); + }); + + modelBuilder.Entity("Unity.Payments.Domain.Suppliers.Site", b => + { + b.HasOne("Unity.Payments.Domain.Suppliers.Supplier", "Supplier") + .WithMany("Sites") + .HasForeignKey("SupplierId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("Supplier"); + }); + + modelBuilder.Entity("Unity.Flex.Domain.ScoresheetInstances.ScoresheetInstance", b => + { + b.Navigation("Answers"); + }); + + modelBuilder.Entity("Unity.Flex.Domain.Scoresheets.Question", b => + { + b.Navigation("Answers"); + }); + + modelBuilder.Entity("Unity.Flex.Domain.Scoresheets.Scoresheet", b => + { + b.Navigation("Instances"); + + b.Navigation("Sections"); + }); + + modelBuilder.Entity("Unity.Flex.Domain.Scoresheets.ScoresheetSection", b => + { + b.Navigation("Fields"); + }); + + modelBuilder.Entity("Unity.Flex.Domain.WorksheetInstances.WorksheetInstance", b => + { + b.Navigation("Values"); + }); + + modelBuilder.Entity("Unity.Flex.Domain.Worksheets.Worksheet", b => + { + b.Navigation("Links"); + + b.Navigation("Sections"); + }); + + modelBuilder.Entity("Unity.Flex.Domain.Worksheets.WorksheetSection", b => + { + b.Navigation("Fields"); + }); + + modelBuilder.Entity("Unity.GrantManager.Applications.Applicant", b => + { + b.Navigation("ApplicantAddresses"); + }); + + modelBuilder.Entity("Unity.GrantManager.Applications.Application", b => + { + b.Navigation("ApplicantAgent"); + + b.Navigation("ApplicationAssignments"); + + b.Navigation("ApplicationTags"); + + b.Navigation("Assessments"); + }); + + modelBuilder.Entity("Unity.GrantManager.Applications.ApplicationStatus", b => + { + b.Navigation("Applications"); + }); + + modelBuilder.Entity("Unity.Payments.Domain.PaymentRequests.PaymentRequest", b => + { + b.Navigation("ExpenseApprovals"); + + b.Navigation("PaymentTags"); + }); + + modelBuilder.Entity("Unity.Payments.Domain.Suppliers.Supplier", b => + { + b.Navigation("Sites"); + }); +#pragma warning restore 612, 618 + } + } +} diff --git a/applications/Unity.GrantManager/src/Unity.GrantManager.EntityFrameworkCore/Migrations/TenantMigrations/20250709235558_Tag_Restructuring_and_Fix.cs b/applications/Unity.GrantManager/src/Unity.GrantManager.EntityFrameworkCore/Migrations/TenantMigrations/20250709235558_Tag_Restructuring_and_Fix.cs new file mode 100644 index 000000000..0fd71fbc6 --- /dev/null +++ b/applications/Unity.GrantManager/src/Unity.GrantManager.EntityFrameworkCore/Migrations/TenantMigrations/20250709235558_Tag_Restructuring_and_Fix.cs @@ -0,0 +1,257 @@ +using System; +using Microsoft.EntityFrameworkCore.Migrations; + +#nullable disable + +namespace Unity.GrantManager.Migrations.TenantMigrations +{ + /// + public partial class Tag_Restructuring_and_Fix : Migration + { + /// + protected override void Up(MigrationBuilder migrationBuilder) + { + migrationBuilder.AlterColumn( + name: "Text", + schema: "Payments", + table: "PaymentTags", + type: "text", + nullable: false, + oldClrType: typeof(string), + oldType: "character varying(250)", + oldMaxLength: 250); + + migrationBuilder.AddColumn( + name: "TagId", + schema: "Payments", + table: "PaymentTags", + type: "uuid", + nullable: false, + defaultValue: new Guid("00000000-0000-0000-0000-000000000000")); + + migrationBuilder.AlterColumn( + name: "Text", + table: "ApplicationTags", + type: "text", + nullable: false, + oldClrType: typeof(string), + oldType: "character varying(250)", + oldMaxLength: 250); + + migrationBuilder.AddColumn( + name: "TagId", + table: "ApplicationTags", + type: "uuid", + nullable: false, + defaultValue: new Guid("00000000-0000-0000-0000-000000000000")); + + migrationBuilder.CreateTable( + name: "Tags", + columns: table => new + { + Id = table.Column(type: "uuid", nullable: false), + TenantId = table.Column(type: "uuid", nullable: true), + Name = table.Column(type: "text", nullable: false), + ExtraProperties = table.Column(type: "text", nullable: false), + ConcurrencyStamp = table.Column(type: "character varying(40)", maxLength: 40, nullable: false), + CreationTime = table.Column(type: "timestamp without time zone", nullable: false), + CreatorId = table.Column(type: "uuid", nullable: true), + LastModificationTime = table.Column(type: "timestamp without time zone", nullable: true), + LastModifierId = table.Column(type: "uuid", nullable: true) + }, + constraints: table => + { + table.PrimaryKey("PK_Tags", x => x.Id); + }); + + // 1. Flatten and insert unique tags from PaymentTags.Text and ApplicationTags.Text + migrationBuilder.Sql(@" + INSERT INTO ""Tags"" (""Id"", ""TenantId"", ""Name"", ""ExtraProperties"", ""ConcurrencyStamp"", ""CreationTime"") + SELECT gen_random_uuid(), src.""TenantId"", src.""Name"", '', '', NOW() + FROM ( + SELECT DISTINCT ""TenantId"", TRIM(tag) AS ""Name"" + FROM ( + SELECT ""TenantId"", unnest(string_to_array(""Text"", ',')) AS tag + FROM ""Payments"".""PaymentTags"" + UNION ALL + SELECT ""TenantId"", unnest(string_to_array(""Text"", ',')) AS tag + FROM ""ApplicationTags"" + ) AS all_tags + WHERE TRIM(tag) <> '' + ) AS src + WHERE NOT EXISTS ( + SELECT 1 FROM ""Tags"" t + WHERE t.""TenantId"" IS NOT DISTINCT FROM src.""TenantId"" + AND t.""Name"" = src.""Name"" + ); + "); + + // 2. Normalize PaymentTags: create a new row for each tag in the Text column + migrationBuilder.Sql(@" + WITH flattened AS ( + SELECT + pt.""Id"" AS ""OldId"", + pt.""PaymentRequestId"", + pt.""TenantId"", + TRIM(tag) AS ""TagName"", + pt.""Text"", + pt.""ExtraProperties"", + pt.""ConcurrencyStamp"", + pt.""CreationTime"", + pt.""CreatorId"", + pt.""LastModificationTime"", + pt.""LastModifierId"" + FROM ""Payments"".""PaymentTags"" pt, + unnest(string_to_array(pt.""Text"", ',')) AS tag + WHERE TRIM(tag) <> '' + ) + INSERT INTO ""Payments"".""PaymentTags"" ( + ""Id"", ""PaymentRequestId"", ""TenantId"", ""TagId"", ""Text"", ""ExtraProperties"", ""ConcurrencyStamp"", ""CreationTime"", ""CreatorId"", ""LastModificationTime"", ""LastModifierId"" + ) + SELECT + gen_random_uuid(), + f.""PaymentRequestId"", + f.""TenantId"", + t.""Id"", + f.""TagName"", + f.""ExtraProperties"", + f.""ConcurrencyStamp"", + f.""CreationTime"", + f.""CreatorId"", + f.""LastModificationTime"", + f.""LastModifierId"" + FROM flattened f + JOIN ""Tags"" t + ON t.""TenantId"" IS NOT DISTINCT FROM f.""TenantId"" + AND t.""Name"" = f.""TagName""; + "); + + // 3. Normalize ApplicationTags: create a new row for each tag in the Text column + migrationBuilder.Sql(@" + WITH flattened AS ( + SELECT + at.""Id"" AS ""OldId"", + at.""ApplicationId"", + at.""TenantId"", + TRIM(tag) AS ""TagName"", + at.""Text"", + at.""ExtraProperties"", + at.""ConcurrencyStamp"", + at.""CreationTime"", + at.""CreatorId"", + at.""LastModificationTime"", + at.""LastModifierId"" + FROM ""ApplicationTags"" at, + unnest(string_to_array(at.""Text"", ',')) AS tag + WHERE TRIM(tag) <> '' + ) + INSERT INTO ""ApplicationTags"" ( + ""Id"", ""ApplicationId"", ""TenantId"", ""TagId"", ""Text"", ""ExtraProperties"", ""ConcurrencyStamp"", ""CreationTime"", ""CreatorId"", ""LastModificationTime"", ""LastModifierId"" + ) + SELECT + gen_random_uuid(), + f.""ApplicationId"", + f.""TenantId"", + t.""Id"", + f.""TagName"", + f.""ExtraProperties"", + f.""ConcurrencyStamp"", + f.""CreationTime"", + f.""CreatorId"", + f.""LastModificationTime"", + f.""LastModifierId"" + FROM flattened f + JOIN ""Tags"" t + ON t.""TenantId"" IS NOT DISTINCT FROM f.""TenantId"" + AND t.""Name"" = f.""TagName""; + "); + + // 4. Remove old (unnormalized) rows + migrationBuilder.Sql(@"DELETE FROM ""Payments"".""PaymentTags"" WHERE POSITION(',' IN ""Text"") > 0;"); + migrationBuilder.Sql(@"DELETE FROM ""ApplicationTags"" WHERE POSITION(',' IN ""Text"") > 0;"); + + // 5. After normalization, remove duplicate tag rows + migrationBuilder.Sql(@"DELETE FROM ""Payments"".""PaymentTags"" WHERE ""TagId"" = '00000000-0000-0000-0000-000000000000';"); + migrationBuilder.Sql(@"DELETE FROM ""ApplicationTags"" WHERE ""TagId"" = '00000000-0000-0000-0000-000000000000';"); + + migrationBuilder.CreateIndex( + name: "IX_PaymentTags_TagId", + schema: "Payments", + table: "PaymentTags", + column: "TagId"); + + migrationBuilder.CreateIndex( + name: "IX_ApplicationTags_TagId", + table: "ApplicationTags", + column: "TagId"); + + migrationBuilder.AddForeignKey( + name: "FK_ApplicationTags_Tags_TagId", + table: "ApplicationTags", + column: "TagId", + principalTable: "Tags", + principalColumn: "Id"); + + migrationBuilder.AddForeignKey( + name: "FK_PaymentTags_Tags_TagId", + schema: "Payments", + table: "PaymentTags", + column: "TagId", + principalTable: "Tags", + principalColumn: "Id"); + } + + /// + protected override void Down(MigrationBuilder migrationBuilder) + { + migrationBuilder.DropForeignKey( + name: "FK_ApplicationTags_Tags_TagId", + table: "ApplicationTags"); + + migrationBuilder.DropForeignKey( + name: "FK_PaymentTags_Tags_TagId", + schema: "Payments", + table: "PaymentTags"); + + migrationBuilder.DropTable( + name: "Tags"); + + migrationBuilder.DropIndex( + name: "IX_PaymentTags_TagId", + schema: "Payments", + table: "PaymentTags"); + + migrationBuilder.DropIndex( + name: "IX_ApplicationTags_TagId", + table: "ApplicationTags"); + + migrationBuilder.DropColumn( + name: "TagId", + schema: "Payments", + table: "PaymentTags"); + + migrationBuilder.DropColumn( + name: "TagId", + table: "ApplicationTags"); + + migrationBuilder.AlterColumn( + name: "Text", + schema: "Payments", + table: "PaymentTags", + type: "character varying(250)", + maxLength: 250, + nullable: false, + oldClrType: typeof(string), + oldType: "text"); + + migrationBuilder.AlterColumn( + name: "Text", + table: "ApplicationTags", + type: "character varying(250)", + maxLength: 250, + nullable: false, + oldClrType: typeof(string), + oldType: "text"); + } + } +} diff --git a/applications/Unity.GrantManager/src/Unity.GrantManager.EntityFrameworkCore/Migrations/TenantMigrations/GrantTenantDbContextModelSnapshot.cs b/applications/Unity.GrantManager/src/Unity.GrantManager.EntityFrameworkCore/Migrations/TenantMigrations/GrantTenantDbContextModelSnapshot.cs index 36a7df928..dd62f949a 100644 --- a/applications/Unity.GrantManager/src/Unity.GrantManager.EntityFrameworkCore/Migrations/TenantMigrations/GrantTenantDbContextModelSnapshot.cs +++ b/applications/Unity.GrantManager/src/Unity.GrantManager.EntityFrameworkCore/Migrations/TenantMigrations/GrantTenantDbContextModelSnapshot.cs @@ -1,3895 +1,3964 @@ -// -using System; -using Microsoft.EntityFrameworkCore; -using Microsoft.EntityFrameworkCore.Infrastructure; -using Microsoft.EntityFrameworkCore.Storage.ValueConversion; -using Npgsql.EntityFrameworkCore.PostgreSQL.Metadata; -using Unity.GrantManager.EntityFrameworkCore; -using Volo.Abp.EntityFrameworkCore; - -#nullable disable - -namespace Unity.GrantManager.Migrations.TenantMigrations -{ - [DbContext(typeof(GrantTenantDbContext))] - partial class GrantTenantDbContextModelSnapshot : ModelSnapshot - { - protected override void BuildModel(ModelBuilder modelBuilder) - { -#pragma warning disable 612, 618 - modelBuilder - .HasAnnotation("_Abp_DatabaseProvider", EfCoreDatabaseProvider.PostgreSql) - .HasAnnotation("ProductVersion", "8.0.8") - .HasAnnotation("Relational:MaxIdentifierLength", 63); - - NpgsqlModelBuilderExtensions.UseIdentityByDefaultColumns(modelBuilder); - - modelBuilder.Entity("Unity.Flex.Domain.ScoresheetInstances.ScoresheetInstance", b => - { - b.Property("Id") - .ValueGeneratedOnAdd() - .HasColumnType("uuid"); - - b.Property("ConcurrencyStamp") - .IsConcurrencyToken() - .IsRequired() - .HasMaxLength(40) - .HasColumnType("character varying(40)") - .HasColumnName("ConcurrencyStamp"); - - b.Property("CorrelationId") - .HasColumnType("uuid"); - - b.Property("CorrelationProvider") - .IsRequired() - .HasColumnType("text"); - - b.Property("CreationTime") - .HasColumnType("timestamp without time zone") - .HasColumnName("CreationTime"); - - b.Property("CreatorId") - .HasColumnType("uuid") - .HasColumnName("CreatorId"); - - b.Property("DeleterId") - .HasColumnType("uuid") - .HasColumnName("DeleterId"); - - b.Property("DeletionTime") - .HasColumnType("timestamp without time zone") - .HasColumnName("DeletionTime"); - - b.Property("ExtraProperties") - .IsRequired() - .HasColumnType("text") - .HasColumnName("ExtraProperties"); - - b.Property("IsDeleted") - .ValueGeneratedOnAdd() - .HasColumnType("boolean") - .HasDefaultValue(false) - .HasColumnName("IsDeleted"); - - b.Property("LastModificationTime") - .HasColumnType("timestamp without time zone") - .HasColumnName("LastModificationTime"); - - b.Property("LastModifierId") - .HasColumnType("uuid") - .HasColumnName("LastModifierId"); - - b.Property("ReportData") - .IsRequired() - .HasColumnType("jsonb"); - - b.Property("ScoresheetId") - .HasColumnType("uuid"); - - b.Property("TenantId") - .HasColumnType("uuid") - .HasColumnName("TenantId"); - - b.Property("Value") - .IsRequired() - .HasColumnType("text"); - - b.HasKey("Id"); - - b.HasIndex("ScoresheetId"); - - b.ToTable("ScoresheetInstances", "Flex"); - }); - - modelBuilder.Entity("Unity.Flex.Domain.Scoresheets.Answer", b => - { - b.Property("Id") - .ValueGeneratedOnAdd() - .HasColumnType("uuid"); - - b.Property("CreationTime") - .HasColumnType("timestamp without time zone") - .HasColumnName("CreationTime"); - - b.Property("CreatorId") - .HasColumnType("uuid") - .HasColumnName("CreatorId"); - - b.Property("CurrentValue") - .HasColumnType("jsonb"); - - b.Property("DeleterId") - .HasColumnType("uuid") - .HasColumnName("DeleterId"); - - b.Property("DeletionTime") - .HasColumnType("timestamp without time zone") - .HasColumnName("DeletionTime"); - - b.Property("IsDeleted") - .ValueGeneratedOnAdd() - .HasColumnType("boolean") - .HasDefaultValue(false) - .HasColumnName("IsDeleted"); - - b.Property("LastModificationTime") - .HasColumnType("timestamp without time zone") - .HasColumnName("LastModificationTime"); - - b.Property("LastModifierId") - .HasColumnType("uuid") - .HasColumnName("LastModifierId"); - - b.Property("QuestionId") - .HasColumnType("uuid"); - - b.Property("ScoresheetInstanceId") - .HasColumnType("uuid"); - - b.Property("TenantId") - .HasColumnType("uuid") - .HasColumnName("TenantId"); - - b.Property("Version") - .HasColumnType("bigint"); - - b.HasKey("Id"); - - b.HasIndex("QuestionId"); - - b.HasIndex("ScoresheetInstanceId"); - - b.ToTable("Answers", "Flex"); - }); - - modelBuilder.Entity("Unity.Flex.Domain.Scoresheets.Question", b => - { - b.Property("Id") - .ValueGeneratedOnAdd() - .HasColumnType("uuid"); - - b.Property("CreationTime") - .HasColumnType("timestamp without time zone") - .HasColumnName("CreationTime"); - - b.Property("CreatorId") - .HasColumnType("uuid") - .HasColumnName("CreatorId"); - - b.Property("Definition") - .IsRequired() - .HasColumnType("jsonb"); - - b.Property("DeleterId") - .HasColumnType("uuid") - .HasColumnName("DeleterId"); - - b.Property("DeletionTime") - .HasColumnType("timestamp without time zone") - .HasColumnName("DeletionTime"); - - b.Property("Description") - .HasColumnType("text"); - - b.Property("Enabled") - .HasColumnType("boolean"); - - b.Property("IsDeleted") - .ValueGeneratedOnAdd() - .HasColumnType("boolean") - .HasDefaultValue(false) - .HasColumnName("IsDeleted"); - - b.Property("Label") - .IsRequired() - .HasColumnType("text"); - - b.Property("LastModificationTime") - .HasColumnType("timestamp without time zone") - .HasColumnName("LastModificationTime"); - - b.Property("LastModifierId") - .HasColumnType("uuid") - .HasColumnName("LastModifierId"); - - b.Property("Name") - .IsRequired() - .HasColumnType("text"); - - b.Property("Order") - .HasColumnType("bigint"); - - b.Property("SectionId") - .HasColumnType("uuid"); - - b.Property("TenantId") - .HasColumnType("uuid") - .HasColumnName("TenantId"); - - b.Property("Type") - .HasColumnType("integer"); - - b.HasKey("Id"); - - b.HasIndex("SectionId"); - - b.ToTable("Questions", "Flex"); - }); - - modelBuilder.Entity("Unity.Flex.Domain.Scoresheets.Scoresheet", b => - { - b.Property("Id") - .ValueGeneratedOnAdd() - .HasColumnType("uuid"); - - b.Property("ConcurrencyStamp") - .IsConcurrencyToken() - .IsRequired() - .HasMaxLength(40) - .HasColumnType("character varying(40)") - .HasColumnName("ConcurrencyStamp"); - - b.Property("CreationTime") - .HasColumnType("timestamp without time zone") - .HasColumnName("CreationTime"); - - b.Property("CreatorId") - .HasColumnType("uuid") - .HasColumnName("CreatorId"); - - b.Property("DeleterId") - .HasColumnType("uuid") - .HasColumnName("DeleterId"); - - b.Property("DeletionTime") - .HasColumnType("timestamp without time zone") - .HasColumnName("DeletionTime"); - - b.Property("ExtraProperties") - .IsRequired() - .HasColumnType("text") - .HasColumnName("ExtraProperties"); - - b.Property("IsDeleted") - .ValueGeneratedOnAdd() - .HasColumnType("boolean") - .HasDefaultValue(false) - .HasColumnName("IsDeleted"); - - b.Property("LastModificationTime") - .HasColumnType("timestamp without time zone") - .HasColumnName("LastModificationTime"); - - b.Property("LastModifierId") - .HasColumnType("uuid") - .HasColumnName("LastModifierId"); - - b.Property("Name") - .IsRequired() - .HasColumnType("text"); - - b.Property("Order") - .HasColumnType("bigint"); - - b.Property("Published") - .HasColumnType("boolean"); - - b.Property("ReportColumns") - .IsRequired() - .HasColumnType("text"); - - b.Property("ReportKeys") - .IsRequired() - .HasColumnType("text"); - - b.Property("ReportViewName") - .IsRequired() - .HasColumnType("text"); - - b.Property("TenantId") - .HasColumnType("uuid") - .HasColumnName("TenantId"); - - b.Property("Title") - .IsRequired() - .HasColumnType("text"); - - b.Property("Version") - .HasColumnType("bigint"); - - b.HasKey("Id"); - - b.ToTable("Scoresheets", "Flex"); - }); - - modelBuilder.Entity("Unity.Flex.Domain.Scoresheets.ScoresheetSection", b => - { - b.Property("Id") - .ValueGeneratedOnAdd() - .HasColumnType("uuid"); - - b.Property("CreationTime") - .HasColumnType("timestamp without time zone") - .HasColumnName("CreationTime"); - - b.Property("CreatorId") - .HasColumnType("uuid") - .HasColumnName("CreatorId"); - - b.Property("DeleterId") - .HasColumnType("uuid") - .HasColumnName("DeleterId"); - - b.Property("DeletionTime") - .HasColumnType("timestamp without time zone") - .HasColumnName("DeletionTime"); - - b.Property("IsDeleted") - .ValueGeneratedOnAdd() - .HasColumnType("boolean") - .HasDefaultValue(false) - .HasColumnName("IsDeleted"); - - b.Property("LastModificationTime") - .HasColumnType("timestamp without time zone") - .HasColumnName("LastModificationTime"); - - b.Property("LastModifierId") - .HasColumnType("uuid") - .HasColumnName("LastModifierId"); - - b.Property("Name") - .IsRequired() - .HasColumnType("text"); - - b.Property("Order") - .HasColumnType("bigint"); - - b.Property("ScoresheetId") - .HasColumnType("uuid"); - - b.Property("TenantId") - .HasColumnType("uuid") - .HasColumnName("TenantId"); - - b.HasKey("Id"); - - b.HasIndex("ScoresheetId"); - - b.ToTable("ScoresheetSections", "Flex"); - }); - - modelBuilder.Entity("Unity.Flex.Domain.WorksheetInstances.CustomFieldValue", b => - { - b.Property("Id") - .ValueGeneratedOnAdd() - .HasColumnType("uuid"); - - b.Property("CreationTime") - .HasColumnType("timestamp without time zone") - .HasColumnName("CreationTime"); - - b.Property("CreatorId") - .HasColumnType("uuid") - .HasColumnName("CreatorId"); - - b.Property("CurrentValue") - .IsRequired() - .HasColumnType("jsonb"); - - b.Property("CustomFieldId") - .HasColumnType("uuid"); - - b.Property("LastModificationTime") - .HasColumnType("timestamp without time zone") - .HasColumnName("LastModificationTime"); - - b.Property("LastModifierId") - .HasColumnType("uuid") - .HasColumnName("LastModifierId"); - - b.Property("TenantId") - .HasColumnType("uuid") - .HasColumnName("TenantId"); - - b.Property("WorksheetInstanceId") - .HasColumnType("uuid"); - - b.HasKey("Id"); - - b.HasIndex("WorksheetInstanceId"); - - b.ToTable("CustomFieldValues", "Flex"); - }); - - modelBuilder.Entity("Unity.Flex.Domain.WorksheetInstances.WorksheetInstance", b => - { - b.Property("Id") - .ValueGeneratedOnAdd() - .HasColumnType("uuid"); - - b.Property("ConcurrencyStamp") - .IsConcurrencyToken() - .IsRequired() - .HasMaxLength(40) - .HasColumnType("character varying(40)") - .HasColumnName("ConcurrencyStamp"); - - b.Property("CorrelationId") - .HasColumnType("uuid"); - - b.Property("CorrelationProvider") - .IsRequired() - .HasColumnType("text"); - - b.Property("CreationTime") - .HasColumnType("timestamp without time zone") - .HasColumnName("CreationTime"); - - b.Property("CreatorId") - .HasColumnType("uuid") - .HasColumnName("CreatorId"); - - b.Property("CurrentValue") - .IsRequired() - .HasColumnType("jsonb"); - - b.Property("DeleterId") - .HasColumnType("uuid") - .HasColumnName("DeleterId"); - - b.Property("DeletionTime") - .HasColumnType("timestamp without time zone") - .HasColumnName("DeletionTime"); - - b.Property("ExtraProperties") - .IsRequired() - .HasColumnType("text") - .HasColumnName("ExtraProperties"); - - b.Property("IsDeleted") - .ValueGeneratedOnAdd() - .HasColumnType("boolean") - .HasDefaultValue(false) - .HasColumnName("IsDeleted"); - - b.Property("LastModificationTime") - .HasColumnType("timestamp without time zone") - .HasColumnName("LastModificationTime"); - - b.Property("LastModifierId") - .HasColumnType("uuid") - .HasColumnName("LastModifierId"); - - b.Property("ReportData") - .IsRequired() - .HasColumnType("jsonb"); - - b.Property("TenantId") - .HasColumnType("uuid") - .HasColumnName("TenantId"); - - b.Property("UiAnchor") - .IsRequired() - .HasColumnType("text"); - - b.Property("WorksheetCorrelationId") - .HasColumnType("uuid"); - - b.Property("WorksheetCorrelationProvider") - .IsRequired() - .HasColumnType("text"); - - b.Property("WorksheetId") - .HasColumnType("uuid"); - - b.HasKey("Id"); - - b.ToTable("WorksheetInstances", "Flex"); - }); - - modelBuilder.Entity("Unity.Flex.Domain.WorksheetLinks.WorksheetLink", b => - { - b.Property("Id") - .ValueGeneratedOnAdd() - .HasColumnType("uuid"); - - b.Property("ConcurrencyStamp") - .IsConcurrencyToken() - .IsRequired() - .HasMaxLength(40) - .HasColumnType("character varying(40)") - .HasColumnName("ConcurrencyStamp"); - - b.Property("CorrelationId") - .HasColumnType("uuid"); - - b.Property("CorrelationProvider") - .IsRequired() - .HasColumnType("text"); - - b.Property("CreationTime") - .HasColumnType("timestamp without time zone") - .HasColumnName("CreationTime"); - - b.Property("CreatorId") - .HasColumnType("uuid") - .HasColumnName("CreatorId"); - - b.Property("ExtraProperties") - .IsRequired() - .HasColumnType("text") - .HasColumnName("ExtraProperties"); - - b.Property("LastModificationTime") - .HasColumnType("timestamp without time zone") - .HasColumnName("LastModificationTime"); - - b.Property("LastModifierId") - .HasColumnType("uuid") - .HasColumnName("LastModifierId"); - - b.Property("Order") - .HasColumnType("bigint"); - - b.Property("TenantId") - .HasColumnType("uuid") - .HasColumnName("TenantId"); - - b.Property("UiAnchor") - .IsRequired() - .HasColumnType("text"); - - b.Property("WorksheetId") - .HasColumnType("uuid"); - - b.HasKey("Id"); - - b.HasIndex("WorksheetId"); - - b.ToTable("WorksheetLinks", "Flex"); - }); - - modelBuilder.Entity("Unity.Flex.Domain.Worksheets.CustomField", b => - { - b.Property("Id") - .ValueGeneratedOnAdd() - .HasColumnType("uuid"); - - b.Property("CreationTime") - .HasColumnType("timestamp without time zone") - .HasColumnName("CreationTime"); - - b.Property("CreatorId") - .HasColumnType("uuid") - .HasColumnName("CreatorId"); - - b.Property("Definition") - .IsRequired() - .HasColumnType("jsonb"); - - b.Property("DeleterId") - .HasColumnType("uuid") - .HasColumnName("DeleterId"); - - b.Property("DeletionTime") - .HasColumnType("timestamp without time zone") - .HasColumnName("DeletionTime"); - - b.Property("Enabled") - .HasColumnType("boolean"); - - b.Property("IsDeleted") - .ValueGeneratedOnAdd() - .HasColumnType("boolean") - .HasDefaultValue(false) - .HasColumnName("IsDeleted"); - - b.Property("Key") - .IsRequired() - .HasColumnType("text"); - - b.Property("Label") - .IsRequired() - .HasColumnType("text"); - - b.Property("LastModificationTime") - .HasColumnType("timestamp without time zone") - .HasColumnName("LastModificationTime"); - - b.Property("LastModifierId") - .HasColumnType("uuid") - .HasColumnName("LastModifierId"); - - b.Property("Name") - .IsRequired() - .HasColumnType("text"); - - b.Property("Order") - .HasColumnType("bigint"); - - b.Property("SectionId") - .HasColumnType("uuid"); - - b.Property("TenantId") - .HasColumnType("uuid") - .HasColumnName("TenantId"); - - b.Property("Type") - .HasColumnType("integer"); - - b.HasKey("Id"); - - b.HasIndex("SectionId"); - - b.ToTable("CustomFields", "Flex"); - }); - - modelBuilder.Entity("Unity.Flex.Domain.Worksheets.Worksheet", b => - { - b.Property("Id") - .ValueGeneratedOnAdd() - .HasColumnType("uuid"); - - b.Property("ConcurrencyStamp") - .IsConcurrencyToken() - .IsRequired() - .HasMaxLength(40) - .HasColumnType("character varying(40)") - .HasColumnName("ConcurrencyStamp"); - - b.Property("CreationTime") - .HasColumnType("timestamp without time zone") - .HasColumnName("CreationTime"); - - b.Property("CreatorId") - .HasColumnType("uuid") - .HasColumnName("CreatorId"); - - b.Property("DeleterId") - .HasColumnType("uuid") - .HasColumnName("DeleterId"); - - b.Property("DeletionTime") - .HasColumnType("timestamp without time zone") - .HasColumnName("DeletionTime"); - - b.Property("ExtraProperties") - .IsRequired() - .HasColumnType("text") - .HasColumnName("ExtraProperties"); - - b.Property("IsDeleted") - .ValueGeneratedOnAdd() - .HasColumnType("boolean") - .HasDefaultValue(false) - .HasColumnName("IsDeleted"); - - b.Property("LastModificationTime") - .HasColumnType("timestamp without time zone") - .HasColumnName("LastModificationTime"); - - b.Property("LastModifierId") - .HasColumnType("uuid") - .HasColumnName("LastModifierId"); - - b.Property("Name") - .IsRequired() - .HasColumnType("text"); - - b.Property("Published") - .HasColumnType("boolean"); - - b.Property("ReportColumns") - .IsRequired() - .HasColumnType("text"); - - b.Property("ReportKeys") - .IsRequired() - .HasColumnType("text"); - - b.Property("ReportViewName") - .IsRequired() - .HasColumnType("text"); - - b.Property("TenantId") - .HasColumnType("uuid") - .HasColumnName("TenantId"); - - b.Property("Title") - .IsRequired() - .HasColumnType("text"); - - b.Property("Version") - .HasColumnType("bigint"); - - b.HasKey("Id"); - - b.ToTable("Worksheets", "Flex"); - }); - - modelBuilder.Entity("Unity.Flex.Domain.Worksheets.WorksheetSection", b => - { - b.Property("Id") - .ValueGeneratedOnAdd() - .HasColumnType("uuid"); - - b.Property("CreationTime") - .HasColumnType("timestamp without time zone") - .HasColumnName("CreationTime"); - - b.Property("CreatorId") - .HasColumnType("uuid") - .HasColumnName("CreatorId"); - - b.Property("DeleterId") - .HasColumnType("uuid") - .HasColumnName("DeleterId"); - - b.Property("DeletionTime") - .HasColumnType("timestamp without time zone") - .HasColumnName("DeletionTime"); - - b.Property("IsDeleted") - .ValueGeneratedOnAdd() - .HasColumnType("boolean") - .HasDefaultValue(false) - .HasColumnName("IsDeleted"); - - b.Property("LastModificationTime") - .HasColumnType("timestamp without time zone") - .HasColumnName("LastModificationTime"); - - b.Property("LastModifierId") - .HasColumnType("uuid") - .HasColumnName("LastModifierId"); - - b.Property("Name") - .IsRequired() - .HasColumnType("text"); - - b.Property("Order") - .HasColumnType("bigint"); - - b.Property("TenantId") - .HasColumnType("uuid") - .HasColumnName("TenantId"); - - b.Property("WorksheetId") - .HasColumnType("uuid"); - - b.HasKey("Id"); - - b.HasIndex("WorksheetId"); - - b.ToTable("WorksheetSections", "Flex"); - }); - - modelBuilder.Entity("Unity.GrantManager.Applications.Applicant", b => - { - b.Property("Id") - .HasColumnType("uuid"); - - b.Property("ApplicantName") - .IsRequired() - .HasMaxLength(600) - .HasColumnType("character varying(600)"); - - b.Property("ApproxNumberOfEmployees") - .HasColumnType("text"); - - b.Property("BusinessNumber") - .HasColumnType("text"); - - b.Property("ConcurrencyStamp") - .IsConcurrencyToken() - .IsRequired() - .HasMaxLength(40) - .HasColumnType("character varying(40)") - .HasColumnName("ConcurrencyStamp"); - - b.Property("CreationTime") - .HasColumnType("timestamp without time zone") - .HasColumnName("CreationTime"); - - b.Property("CreatorId") - .HasColumnType("uuid") - .HasColumnName("CreatorId"); - - b.Property("ElectoralDistrict") - .HasColumnType("text"); - - b.Property("ExtraProperties") - .IsRequired() - .HasColumnType("text") - .HasColumnName("ExtraProperties"); - - b.Property("FiscalDay") - .HasColumnType("integer"); - - b.Property("FiscalMonth") - .HasColumnType("text"); - - b.Property("IndigenousOrgInd") - .HasColumnType("text"); - - b.Property("IsDuplicated") - .HasColumnType("boolean"); - - b.Property("LastModificationTime") - .HasColumnType("timestamp without time zone") - .HasColumnName("LastModificationTime"); - - b.Property("LastModifierId") - .HasColumnType("uuid") - .HasColumnName("LastModifierId"); - - b.Property("MatchPercentage") - .HasColumnType("numeric"); - - b.Property("NonRegOrgName") - .HasColumnType("text"); - - b.Property("NonRegisteredBusinessName") - .HasColumnType("text"); - - b.Property("OrgName") - .HasColumnType("text"); - - b.Property("OrgNumber") - .HasColumnType("text"); - - b.Property("OrgStatus") - .HasColumnType("text"); - - b.Property("OrganizationSize") - .HasColumnType("text"); - - b.Property("OrganizationType") - .HasColumnType("text"); - - b.Property("RedStop") - .HasColumnType("boolean"); - - b.Property("Sector") - .HasColumnType("text"); - - b.Property("SectorSubSectorIndustryDesc") - .HasColumnType("text"); - - b.Property("SiteId") - .HasColumnType("uuid"); - - b.Property("StartedOperatingDate") - .HasColumnType("date"); - - b.Property("Status") - .HasColumnType("text"); - - b.Property("SubSector") - .HasColumnType("text"); - - b.Property("SupplierId") - .HasColumnType("uuid"); - - b.Property("TenantId") - .HasColumnType("uuid") - .HasColumnName("TenantId"); - - b.Property("UnityApplicantId") - .HasColumnType("text"); - - b.HasKey("Id"); - - b.HasIndex("ApplicantName"); - - b.ToTable("Applicants", (string)null); - }); - - modelBuilder.Entity("Unity.GrantManager.Applications.ApplicantAddress", b => - { - b.Property("Id") - .HasColumnType("uuid"); - - b.Property("AddressType") - .HasColumnType("integer"); - - b.Property("ApplicantId") - .IsRequired() - .HasColumnType("uuid"); - - b.Property("City") - .HasColumnType("text"); - - b.Property("ConcurrencyStamp") - .IsConcurrencyToken() - .IsRequired() - .HasMaxLength(40) - .HasColumnType("character varying(40)") - .HasColumnName("ConcurrencyStamp"); - - b.Property("Country") - .HasColumnType("text"); - - b.Property("CreationTime") - .HasColumnType("timestamp without time zone") - .HasColumnName("CreationTime"); - - b.Property("CreatorId") - .HasColumnType("uuid") - .HasColumnName("CreatorId"); - - b.Property("ExtraProperties") - .IsRequired() - .HasColumnType("text") - .HasColumnName("ExtraProperties"); - - b.Property("LastModificationTime") - .HasColumnType("timestamp without time zone") - .HasColumnName("LastModificationTime"); - - b.Property("LastModifierId") - .HasColumnType("uuid") - .HasColumnName("LastModifierId"); - - b.Property("Postal") - .HasColumnType("text"); - - b.Property("Province") - .HasColumnType("text"); - - b.Property("Street") - .HasColumnType("text"); - - b.Property("Street2") - .HasColumnType("text"); - - b.Property("TenantId") - .HasColumnType("uuid") - .HasColumnName("TenantId"); - - b.Property("Unit") - .HasColumnType("text"); - - b.HasKey("Id"); - - b.HasIndex("ApplicantId"); - - b.ToTable("ApplicantAddresses", (string)null); - }); - - modelBuilder.Entity("Unity.GrantManager.Applications.ApplicantAgent", b => - { - b.Property("Id") - .HasColumnType("uuid"); - - b.Property("ApplicantId") - .HasColumnType("uuid"); - - b.Property("ApplicationId") - .HasColumnType("uuid"); - - b.Property("BceidBusinessGuid") - .HasColumnType("uuid"); - - b.Property("BceidBusinessName") - .HasColumnType("text"); - - b.Property("BceidUserGuid") - .HasColumnType("uuid"); - - b.Property("BceidUserName") - .HasColumnType("text"); - - b.Property("ConcurrencyStamp") - .IsConcurrencyToken() - .IsRequired() - .HasMaxLength(40) - .HasColumnType("character varying(40)") - .HasColumnName("ConcurrencyStamp"); - - b.Property("ContactOrder") - .HasColumnType("integer"); - - b.Property("CreationTime") - .HasColumnType("timestamp without time zone") - .HasColumnName("CreationTime"); - - b.Property("CreatorId") - .HasColumnType("uuid") - .HasColumnName("CreatorId"); - - b.Property("Email") - .HasColumnType("text"); - - b.Property("ExtraProperties") - .IsRequired() - .HasColumnType("text") - .HasColumnName("ExtraProperties"); - - b.Property("IdentityEmail") - .HasColumnType("text"); - - b.Property("IdentityName") - .HasColumnType("text"); - - b.Property("IdentityProvider") - .HasColumnType("text"); - - b.Property("IsActive") - .HasColumnType("boolean"); - - b.Property("IsConfirmed") - .HasColumnType("boolean"); - - b.Property("LastModificationTime") - .HasColumnType("timestamp without time zone") - .HasColumnName("LastModificationTime"); - - b.Property("LastModifierId") - .HasColumnType("uuid") - .HasColumnName("LastModifierId"); - - b.Property("Name") - .IsRequired() - .HasColumnType("text"); - - b.Property("OidcSubUser") - .HasColumnType("text"); - - b.Property("Phone") - .HasColumnType("text"); - - b.Property("Phone2") - .HasColumnType("text"); - - b.Property("Phone2Extension") - .HasColumnType("text"); - - b.Property("PhoneExtension") - .HasColumnType("text"); - - b.Property("RoleForApplicant") - .IsRequired() - .HasColumnType("text"); - - b.Property("TenantId") - .HasColumnType("uuid") - .HasColumnName("TenantId"); - - b.Property("Title") - .HasColumnType("text"); - - b.HasKey("Id"); - - b.HasIndex("ApplicantId"); - - b.HasIndex("ApplicationId") - .IsUnique(); - - b.HasIndex("OidcSubUser"); - - b.ToTable("ApplicantAgents", (string)null); - }); - - modelBuilder.Entity("Unity.GrantManager.Applications.Application", b => - { - b.Property("Id") - .HasColumnType("uuid"); - - b.Property("Acquisition") - .HasColumnType("text"); - - b.Property("ApplicantId") - .HasColumnType("uuid"); - - b.Property("ApplicationFormId") - .HasColumnType("uuid"); - - b.Property("ApplicationStatusId") - .HasColumnType("uuid"); - - b.Property("ApprovedAmount") - .HasColumnType("numeric"); - - b.Property("AssessmentResultDate") - .HasColumnType("timestamp without time zone"); - - b.Property("AssessmentResultStatus") - .HasColumnType("text"); - - b.Property("AssessmentStartDate") - .HasColumnType("timestamp without time zone"); - - b.Property("City") - .HasColumnType("text"); - - b.Property("Community") - .HasColumnType("text"); - - b.Property("CommunityPopulation") - .HasColumnType("integer"); - - b.Property("ConcurrencyStamp") - .IsConcurrencyToken() - .IsRequired() - .HasMaxLength(40) - .HasColumnType("character varying(40)") - .HasColumnName("ConcurrencyStamp"); - - b.Property("ContractExecutionDate") - .HasColumnType("timestamp without time zone"); - - b.Property("ContractNumber") - .HasColumnType("text"); - - b.Property("CreationTime") - .HasColumnType("timestamp without time zone") - .HasColumnName("CreationTime"); - - b.Property("CreatorId") - .HasColumnType("uuid") - .HasColumnName("CreatorId"); - - b.Property("DeclineRational") - .HasColumnType("text"); - - b.Property("DeleterId") - .HasColumnType("uuid") - .HasColumnName("DeleterId"); - - b.Property("DeletionTime") - .HasColumnType("timestamp without time zone") - .HasColumnName("DeletionTime"); - - b.Property("DueDate") - .HasColumnType("timestamp without time zone"); - - b.Property("DueDiligenceStatus") - .HasColumnType("text"); - - b.Property("EconomicRegion") - .HasColumnType("text"); - - b.Property("ElectoralDistrict") - .HasColumnType("text"); - - b.Property("ExtraProperties") - .IsRequired() - .HasColumnType("text") - .HasColumnName("ExtraProperties"); - - b.Property("FinalDecisionDate") - .HasColumnType("timestamp without time zone"); - - b.Property("Forestry") - .HasColumnType("text"); - - b.Property("ForestryFocus") - .HasColumnType("text"); - - b.Property("IsDeleted") - .ValueGeneratedOnAdd() - .HasColumnType("boolean") - .HasDefaultValue(false) - .HasColumnName("IsDeleted"); - - b.Property("LastModificationTime") - .HasColumnType("timestamp without time zone") - .HasColumnName("LastModificationTime"); - - b.Property("LastModifierId") - .HasColumnType("uuid") - .HasColumnName("LastModifierId"); - - b.Property("LikelihoodOfFunding") - .HasColumnType("text"); - - b.Property("Notes") - .HasColumnType("text"); - - b.Property("NotificationDate") - .HasColumnType("timestamp without time zone"); - - b.Property("OwnerId") - .HasColumnType("uuid"); - - b.Property("Payload") - .HasColumnType("jsonb"); - - b.Property("PercentageTotalProjectBudget") - .HasColumnType("double precision"); - - b.Property("Place") - .HasColumnType("text"); - - b.Property("ProjectEndDate") - .HasColumnType("timestamp without time zone"); - - b.Property("ProjectFundingTotal") - .HasColumnType("numeric"); - - b.Property("ProjectName") - .IsRequired() - .HasMaxLength(255) - .HasColumnType("character varying(255)"); - - b.Property("ProjectStartDate") - .HasColumnType("timestamp without time zone"); - - b.Property("ProjectSummary") - .HasColumnType("text"); - - b.Property("ProposalDate") - .HasColumnType("timestamp without time zone"); - - b.Property("RecommendedAmount") - .HasColumnType("numeric"); - - b.Property("ReferenceNo") - .IsRequired() - .HasColumnType("text"); - - b.Property("RegionalDistrict") - .HasColumnType("text"); - - b.Property("RequestedAmount") - .HasColumnType("numeric"); - - b.Property("RiskRanking") - .HasColumnType("text"); - - b.Property("SigningAuthorityBusinessPhone") - .HasColumnType("text"); - - b.Property("SigningAuthorityCellPhone") - .HasColumnType("text"); - - b.Property("SigningAuthorityEmail") - .HasColumnType("text"); - - b.Property("SigningAuthorityFullName") - .HasColumnType("text"); - - b.Property("SigningAuthorityTitle") - .HasColumnType("text"); - - b.Property("SubStatus") - .HasColumnType("text"); - - b.Property("SubmissionDate") - .HasColumnType("timestamp without time zone"); - - b.Property("TenantId") - .HasColumnType("uuid") - .HasColumnName("TenantId"); - - b.Property("TotalProjectBudget") - .HasColumnType("numeric"); - - b.Property("TotalScore") - .HasColumnType("integer"); - - b.HasKey("Id"); - - b.HasIndex("ApplicantId"); - - b.HasIndex("ApplicationFormId"); - - b.HasIndex("ApplicationStatusId"); - - b.HasIndex("OwnerId"); - - b.ToTable("Applications", (string)null); - }); - - modelBuilder.Entity("Unity.GrantManager.Applications.ApplicationAssignment", b => - { - b.Property("Id") - .HasColumnType("uuid"); - - b.Property("ApplicationId") - .HasColumnType("uuid"); - - b.Property("AssigneeId") - .HasColumnType("uuid"); - - b.Property("ConcurrencyStamp") - .IsConcurrencyToken() - .IsRequired() - .HasMaxLength(40) - .HasColumnType("character varying(40)") - .HasColumnName("ConcurrencyStamp"); - - b.Property("CreationTime") - .HasColumnType("timestamp without time zone") - .HasColumnName("CreationTime"); - - b.Property("CreatorId") - .HasColumnType("uuid") - .HasColumnName("CreatorId"); - - b.Property("Duty") - .HasColumnType("text"); - - b.Property("ExtraProperties") - .IsRequired() - .HasColumnType("text") - .HasColumnName("ExtraProperties"); - - b.Property("LastModificationTime") - .HasColumnType("timestamp without time zone") - .HasColumnName("LastModificationTime"); - - b.Property("LastModifierId") - .HasColumnType("uuid") - .HasColumnName("LastModifierId"); - - b.Property("TenantId") - .HasColumnType("uuid") - .HasColumnName("TenantId"); - - b.HasKey("Id"); - - b.HasIndex("ApplicationId"); - - b.HasIndex("AssigneeId"); - - b.ToTable("ApplicationAssignments", (string)null); - }); - - modelBuilder.Entity("Unity.GrantManager.Applications.ApplicationAttachment", b => - { - b.Property("Id") - .HasColumnType("uuid"); - - b.Property("ApplicationId") - .HasColumnType("uuid"); - - b.Property("ConcurrencyStamp") - .IsConcurrencyToken() - .IsRequired() - .HasMaxLength(40) - .HasColumnType("character varying(40)") - .HasColumnName("ConcurrencyStamp"); - - b.Property("CreationTime") - .HasColumnType("timestamp without time zone") - .HasColumnName("CreationTime"); - - b.Property("CreatorId") - .HasColumnType("uuid") - .HasColumnName("CreatorId"); - - b.Property("DisplayName") - .HasMaxLength(1024) - .HasColumnType("character varying(1024)"); - - b.Property("ExtraProperties") - .IsRequired() - .HasColumnType("text") - .HasColumnName("ExtraProperties"); - - b.Property("FileName") - .HasColumnType("text"); - - b.Property("LastModificationTime") - .HasColumnType("timestamp without time zone") - .HasColumnName("LastModificationTime"); - - b.Property("LastModifierId") - .HasColumnType("uuid") - .HasColumnName("LastModifierId"); - - b.Property("S3ObjectKey") - .IsRequired() - .HasColumnType("text"); - - b.Property("TenantId") - .HasColumnType("uuid") - .HasColumnName("TenantId"); - - b.Property("Time") - .HasColumnType("timestamp without time zone"); - - b.Property("UserId") - .HasColumnType("uuid"); - - b.HasKey("Id"); - - b.HasIndex("ApplicationId"); - - b.ToTable("ApplicationAttachments", (string)null); - }); - - modelBuilder.Entity("Unity.GrantManager.Applications.ApplicationChefsFileAttachment", b => - { - b.Property("Id") - .HasColumnType("uuid"); - - b.Property("ApplicationId") - .HasColumnType("uuid"); - - b.Property("ChefsFileId") - .HasColumnType("text"); - - b.Property("ChefsSumbissionId") - .HasColumnType("text"); - - b.Property("ConcurrencyStamp") - .IsConcurrencyToken() - .IsRequired() - .HasMaxLength(40) - .HasColumnType("character varying(40)") - .HasColumnName("ConcurrencyStamp"); - - b.Property("CreationTime") - .HasColumnType("timestamp without time zone") - .HasColumnName("CreationTime"); - - b.Property("CreatorId") - .HasColumnType("uuid") - .HasColumnName("CreatorId"); - - b.Property("DisplayName") - .HasMaxLength(1024) - .HasColumnType("character varying(1024)"); - - b.Property("ExtraProperties") - .IsRequired() - .HasColumnType("text") - .HasColumnName("ExtraProperties"); - - b.Property("FileName") - .HasColumnType("text"); - - b.Property("LastModificationTime") - .HasColumnType("timestamp without time zone") - .HasColumnName("LastModificationTime"); - - b.Property("LastModifierId") - .HasColumnType("uuid") - .HasColumnName("LastModifierId"); - - b.Property("TenantId") - .HasColumnType("uuid") - .HasColumnName("TenantId"); - - b.HasKey("Id"); - - b.HasIndex("ApplicationId"); - - b.ToTable("ApplicationChefsFileAttachments", (string)null); - }); - - modelBuilder.Entity("Unity.GrantManager.Applications.ApplicationContact", b => - { - b.Property("Id") - .HasColumnType("uuid"); - - b.Property("ApplicationId") - .HasColumnType("uuid"); - - b.Property("ConcurrencyStamp") - .IsConcurrencyToken() - .IsRequired() - .HasMaxLength(40) - .HasColumnType("character varying(40)") - .HasColumnName("ConcurrencyStamp"); - - b.Property("ContactEmail") - .HasColumnType("text"); - - b.Property("ContactFullName") - .IsRequired() - .HasColumnType("text"); - - b.Property("ContactMobilePhone") - .HasColumnType("text"); - - b.Property("ContactTitle") - .HasColumnType("text"); - - b.Property("ContactType") - .IsRequired() - .HasColumnType("text"); - - b.Property("ContactWorkPhone") - .HasColumnType("text"); - - b.Property("CreationTime") - .HasColumnType("timestamp without time zone") - .HasColumnName("CreationTime"); - - b.Property("CreatorId") - .HasColumnType("uuid") - .HasColumnName("CreatorId"); - - b.Property("ExtraProperties") - .IsRequired() - .HasColumnType("text") - .HasColumnName("ExtraProperties"); - - b.Property("LastModificationTime") - .HasColumnType("timestamp without time zone") - .HasColumnName("LastModificationTime"); - - b.Property("LastModifierId") - .HasColumnType("uuid") - .HasColumnName("LastModifierId"); - - b.Property("TenantId") - .HasColumnType("uuid") - .HasColumnName("TenantId"); - - b.HasKey("Id"); - - b.HasIndex("ApplicationId"); - - b.ToTable("ApplicationContact", (string)null); - }); - - modelBuilder.Entity("Unity.GrantManager.Applications.ApplicationForm", b => - { - b.Property("Id") - .HasColumnType("uuid"); - - b.Property("ApiKey") - .HasColumnType("text"); - - b.Property("ApplicationFormDescription") - .HasColumnType("text"); - - b.Property("ApplicationFormName") - .IsRequired() - .HasMaxLength(255) - .HasColumnType("character varying(255)"); - - b.Property("AttemptedConnectionDate") - .HasColumnType("timestamp without time zone"); - - b.Property("AvailableChefsFields") - .HasColumnType("text"); - - b.Property("Category") - .HasColumnType("text"); - - b.Property("ChefsApplicationFormGuid") - .HasColumnType("text"); - - b.Property("ChefsCriteriaFormGuid") - .HasColumnType("text"); - - b.Property("ConcurrencyStamp") - .IsConcurrencyToken() - .IsRequired() - .HasMaxLength(40) - .HasColumnType("character varying(40)") - .HasColumnName("ConcurrencyStamp"); - - b.Property("ConnectionHttpStatus") - .HasColumnType("text"); - - b.Property("CreationTime") - .HasColumnType("timestamp without time zone") - .HasColumnName("CreationTime"); - - b.Property("CreatorId") - .HasColumnType("uuid") - .HasColumnName("CreatorId"); - - b.Property("DeleterId") - .HasColumnType("uuid") - .HasColumnName("DeleterId"); - - b.Property("DeletionTime") - .HasColumnType("timestamp without time zone") - .HasColumnName("DeletionTime"); - - b.Property("ElectoralDistrictAddressType") - .HasColumnType("integer"); - - b.Property("ExtraProperties") - .IsRequired() - .HasColumnType("text") - .HasColumnName("ExtraProperties"); - - b.Property("IntakeId") - .HasColumnType("uuid"); - - b.Property("IsDeleted") - .ValueGeneratedOnAdd() - .HasColumnType("boolean") - .HasDefaultValue(false) - .HasColumnName("IsDeleted"); - - b.Property("IsDirectApproval") - .HasColumnType("boolean"); - - b.Property("LastModificationTime") - .HasColumnType("timestamp without time zone") - .HasColumnName("LastModificationTime"); - - b.Property("LastModifierId") - .HasColumnType("uuid") - .HasColumnName("LastModifierId"); - - b.Property("Payable") - .HasColumnType("boolean"); - - b.Property("RenderFormIoToHtml") - .HasColumnType("boolean"); - - b.Property("ScoresheetId") - .HasColumnType("uuid"); - - b.Property("TenantId") - .HasColumnType("uuid") - .HasColumnName("TenantId"); - - b.Property("Version") - .HasColumnType("integer"); - - b.HasKey("Id"); - - b.HasIndex("IntakeId"); - - b.ToTable("ApplicationForms", (string)null); - }); - - modelBuilder.Entity("Unity.GrantManager.Applications.ApplicationFormSubmission", b => - { - b.Property("Id") - .HasColumnType("uuid"); - - b.Property("ApplicantId") - .HasColumnType("uuid"); - - b.Property("ApplicationFormId") - .HasColumnType("uuid"); - - b.Property("ApplicationFormVersionId") - .HasColumnType("uuid"); - - b.Property("ApplicationId") - .HasColumnType("uuid"); - - b.Property("ChefsSubmissionGuid") - .IsRequired() - .HasColumnType("text"); - - b.Property("ConcurrencyStamp") - .IsConcurrencyToken() - .IsRequired() - .HasMaxLength(40) - .HasColumnType("character varying(40)") - .HasColumnName("ConcurrencyStamp"); - - b.Property("CreationTime") - .HasColumnType("timestamp without time zone") - .HasColumnName("CreationTime"); - - b.Property("CreatorId") - .HasColumnType("uuid") - .HasColumnName("CreatorId"); - - b.Property("ExtraProperties") - .IsRequired() - .HasColumnType("text") - .HasColumnName("ExtraProperties"); - - b.Property("FormVersionId") - .HasColumnType("uuid"); - - b.Property("LastModificationTime") - .HasColumnType("timestamp without time zone") - .HasColumnName("LastModificationTime"); - - b.Property("LastModifierId") - .HasColumnType("uuid") - .HasColumnName("LastModifierId"); - - b.Property("OidcSub") - .IsRequired() - .HasColumnType("text"); - - b.Property("RenderedHTML") - .HasColumnType("text"); - - b.Property("ReportData") - .IsRequired() - .HasColumnType("jsonb"); - - b.Property("Submission") - .IsRequired() - .HasColumnType("jsonb"); - - b.Property("TenantId") - .HasColumnType("uuid") - .HasColumnName("TenantId"); - - b.HasKey("Id"); - - b.HasIndex("ApplicantId"); - - b.HasIndex("ApplicationFormId"); - - b.ToTable("ApplicationFormSubmissions", (string)null); - }); - - modelBuilder.Entity("Unity.GrantManager.Applications.ApplicationFormVersion", b => - { - b.Property("Id") - .HasColumnType("uuid"); - - b.Property("ApplicationFormId") - .HasColumnType("uuid"); - - b.Property("AvailableChefsFields") - .HasColumnType("text"); - - b.Property("ChefsApplicationFormGuid") - .HasColumnType("text"); - - b.Property("ChefsFormVersionGuid") - .HasColumnType("text"); - - b.Property("ConcurrencyStamp") - .IsConcurrencyToken() - .IsRequired() - .HasMaxLength(40) - .HasColumnType("character varying(40)") - .HasColumnName("ConcurrencyStamp"); - - b.Property("CreationTime") - .HasColumnType("timestamp without time zone") - .HasColumnName("CreationTime"); - - b.Property("CreatorId") - .HasColumnType("uuid") - .HasColumnName("CreatorId"); - - b.Property("ExtraProperties") - .IsRequired() - .HasColumnType("text") - .HasColumnName("ExtraProperties"); - - b.Property("FormSchema") - .HasColumnType("jsonb"); - - b.Property("LastModificationTime") - .HasColumnType("timestamp without time zone") - .HasColumnName("LastModificationTime"); - - b.Property("LastModifierId") - .HasColumnType("uuid") - .HasColumnName("LastModifierId"); - - b.Property("Published") - .HasColumnType("boolean"); - - b.Property("ReportColumns") - .IsRequired() - .HasColumnType("text"); - - b.Property("ReportKeys") - .IsRequired() - .HasColumnType("text"); - - b.Property("ReportViewName") - .IsRequired() - .HasColumnType("text"); - - b.Property("SubmissionHeaderMapping") - .HasColumnType("text"); - - b.Property("TenantId") - .HasColumnType("uuid") - .HasColumnName("TenantId"); - - b.Property("Version") - .HasColumnType("integer"); - - b.HasKey("Id"); - - b.HasIndex("ApplicationFormId"); - - b.ToTable("ApplicationFormVersion", (string)null); - }); - - modelBuilder.Entity("Unity.GrantManager.Applications.ApplicationLink", b => - { - b.Property("Id") - .HasColumnType("uuid"); - - b.Property("ApplicationId") - .HasColumnType("uuid"); - - b.Property("ConcurrencyStamp") - .IsConcurrencyToken() - .IsRequired() - .HasMaxLength(40) - .HasColumnType("character varying(40)") - .HasColumnName("ConcurrencyStamp"); - - b.Property("CreationTime") - .HasColumnType("timestamp without time zone") - .HasColumnName("CreationTime"); - - b.Property("CreatorId") - .HasColumnType("uuid") - .HasColumnName("CreatorId"); - - b.Property("ExtraProperties") - .IsRequired() - .HasColumnType("text") - .HasColumnName("ExtraProperties"); - - b.Property("LastModificationTime") - .HasColumnType("timestamp without time zone") - .HasColumnName("LastModificationTime"); - - b.Property("LastModifierId") - .HasColumnType("uuid") - .HasColumnName("LastModifierId"); - - b.Property("LinkedApplicationId") - .HasColumnType("uuid"); - - b.Property("TenantId") - .HasColumnType("uuid") - .HasColumnName("TenantId"); - - b.HasKey("Id"); - - b.HasIndex("ApplicationId"); - - b.ToTable("ApplicationLinks", (string)null); - }); - - modelBuilder.Entity("Unity.GrantManager.Applications.ApplicationStatus", b => - { - b.Property("Id") - .HasColumnType("uuid"); - - b.Property("ConcurrencyStamp") - .IsConcurrencyToken() - .IsRequired() - .HasMaxLength(40) - .HasColumnType("character varying(40)") - .HasColumnName("ConcurrencyStamp"); - - b.Property("CreationTime") - .HasColumnType("timestamp without time zone") - .HasColumnName("CreationTime"); - - b.Property("CreatorId") - .HasColumnType("uuid") - .HasColumnName("CreatorId"); - - b.Property("ExternalStatus") - .IsRequired() - .HasColumnType("text"); - - b.Property("ExtraProperties") - .IsRequired() - .HasColumnType("text") - .HasColumnName("ExtraProperties"); - - b.Property("InternalStatus") - .IsRequired() - .HasColumnType("text"); - - b.Property("LastModificationTime") - .HasColumnType("timestamp without time zone") - .HasColumnName("LastModificationTime"); - - b.Property("LastModifierId") - .HasColumnType("uuid") - .HasColumnName("LastModifierId"); - - b.Property("StatusCode") - .IsRequired() - .HasMaxLength(250) - .HasColumnType("character varying(250)"); - - b.Property("TenantId") - .HasColumnType("uuid") - .HasColumnName("TenantId"); - - b.HasKey("Id"); - - b.HasIndex("StatusCode") - .IsUnique(); - - b.ToTable("ApplicationStatuses", (string)null); - }); - - modelBuilder.Entity("Unity.GrantManager.Applications.ApplicationTags", b => - { - b.Property("Id") - .HasColumnType("uuid"); - - b.Property("ApplicationId") - .HasColumnType("uuid"); - - b.Property("ConcurrencyStamp") - .IsConcurrencyToken() - .IsRequired() - .HasMaxLength(40) - .HasColumnType("character varying(40)") - .HasColumnName("ConcurrencyStamp"); - - b.Property("CreationTime") - .HasColumnType("timestamp without time zone") - .HasColumnName("CreationTime"); - - b.Property("CreatorId") - .HasColumnType("uuid") - .HasColumnName("CreatorId"); - - b.Property("ExtraProperties") - .IsRequired() - .HasColumnType("text") - .HasColumnName("ExtraProperties"); - - b.Property("LastModificationTime") - .HasColumnType("timestamp without time zone") - .HasColumnName("LastModificationTime"); - - b.Property("LastModifierId") - .HasColumnType("uuid") - .HasColumnName("LastModifierId"); - - b.Property("TenantId") - .HasColumnType("uuid") - .HasColumnName("TenantId"); - - b.Property("Text") - .IsRequired() - .HasMaxLength(250) - .HasColumnType("character varying(250)"); - - b.HasKey("Id"); - - b.HasIndex("ApplicationId"); - - b.ToTable("ApplicationTags", (string)null); - }); - - modelBuilder.Entity("Unity.GrantManager.Applications.AssessmentAttachment", b => - { - b.Property("Id") - .HasColumnType("uuid"); - - b.Property("AssessmentId") - .HasColumnType("uuid"); - - b.Property("ConcurrencyStamp") - .IsConcurrencyToken() - .IsRequired() - .HasMaxLength(40) - .HasColumnType("character varying(40)") - .HasColumnName("ConcurrencyStamp"); - - b.Property("CreationTime") - .HasColumnType("timestamp without time zone") - .HasColumnName("CreationTime"); - - b.Property("CreatorId") - .HasColumnType("uuid") - .HasColumnName("CreatorId"); - - b.Property("DisplayName") - .HasMaxLength(1024) - .HasColumnType("character varying(1024)"); - - b.Property("ExtraProperties") - .IsRequired() - .HasColumnType("text") - .HasColumnName("ExtraProperties"); - - b.Property("FileName") - .HasColumnType("text"); - - b.Property("LastModificationTime") - .HasColumnType("timestamp without time zone") - .HasColumnName("LastModificationTime"); - - b.Property("LastModifierId") - .HasColumnType("uuid") - .HasColumnName("LastModifierId"); - - b.Property("S3ObjectKey") - .IsRequired() - .HasColumnType("text"); - - b.Property("TenantId") - .HasColumnType("uuid") - .HasColumnName("TenantId"); - - b.Property("Time") - .HasColumnType("timestamp without time zone"); - - b.Property("UserId") - .HasColumnType("uuid"); - - b.HasKey("Id"); - - b.HasIndex("AssessmentId"); - - b.ToTable("AssessmentAttachments", (string)null); - }); - - modelBuilder.Entity("Unity.GrantManager.Assessments.Assessment", b => - { - b.Property("Id") - .HasColumnType("uuid"); - - b.Property("ApplicationId") - .HasColumnType("uuid"); - - b.Property("ApprovalRecommended") - .HasColumnType("boolean"); - - b.Property("AssessorId") - .HasColumnType("uuid"); - - b.Property("CleanGrowth") - .HasColumnType("integer"); - - b.Property("ConcurrencyStamp") - .IsConcurrencyToken() - .IsRequired() - .HasMaxLength(40) - .HasColumnType("character varying(40)") - .HasColumnName("ConcurrencyStamp"); - - b.Property("CreationTime") - .HasColumnType("timestamp without time zone") - .HasColumnName("CreationTime"); - - b.Property("CreatorId") - .HasColumnType("uuid") - .HasColumnName("CreatorId"); - - b.Property("EconomicImpact") - .HasColumnType("integer"); - - b.Property("EndDate") - .HasColumnType("timestamp without time zone"); - - b.Property("ExtraProperties") - .IsRequired() - .HasColumnType("text") - .HasColumnName("ExtraProperties"); - - b.Property("FinancialAnalysis") - .HasColumnType("integer"); - - b.Property("InclusiveGrowth") - .HasColumnType("integer"); - - b.Property("IsComplete") - .HasColumnType("boolean"); - - b.Property("LastModificationTime") - .HasColumnType("timestamp without time zone") - .HasColumnName("LastModificationTime"); - - b.Property("LastModifierId") - .HasColumnType("uuid") - .HasColumnName("LastModifierId"); - - b.Property("Status") - .IsRequired() - .HasMaxLength(50) - .HasColumnType("character varying(50)"); - - b.Property("TenantId") - .HasColumnType("uuid") - .HasColumnName("TenantId"); - - b.HasKey("Id"); - - b.HasIndex("ApplicationId"); - - b.HasIndex("AssessorId"); - - b.ToTable("Assessments", (string)null); - }); - - modelBuilder.Entity("Unity.GrantManager.Comments.ApplicationComment", b => - { - b.Property("Id") - .HasColumnType("uuid"); - - b.Property("ApplicationId") - .HasColumnType("uuid"); - - b.Property("Comment") - .IsRequired() - .HasColumnType("text"); - - b.Property("CommenterId") - .HasColumnType("uuid"); - - b.Property("ConcurrencyStamp") - .IsConcurrencyToken() - .IsRequired() - .HasMaxLength(40) - .HasColumnType("character varying(40)") - .HasColumnName("ConcurrencyStamp"); - - b.Property("CreationTime") - .HasColumnType("timestamp without time zone") - .HasColumnName("CreationTime"); - - b.Property("CreatorId") - .HasColumnType("uuid") - .HasColumnName("CreatorId"); - - b.Property("ExtraProperties") - .IsRequired() - .HasColumnType("text") - .HasColumnName("ExtraProperties"); - - b.Property("LastModificationTime") - .HasColumnType("timestamp without time zone") - .HasColumnName("LastModificationTime"); - - b.Property("LastModifierId") - .HasColumnType("uuid") - .HasColumnName("LastModifierId"); - - b.Property("TenantId") - .HasColumnType("uuid") - .HasColumnName("TenantId"); - - b.HasKey("Id"); - - b.HasIndex("ApplicationId"); - - b.HasIndex("CommenterId"); - - b.ToTable("ApplicationComments", (string)null); - }); - - modelBuilder.Entity("Unity.GrantManager.Comments.AssessmentComment", b => - { - b.Property("Id") - .HasColumnType("uuid"); - - b.Property("AssessmentId") - .HasColumnType("uuid"); - - b.Property("Comment") - .IsRequired() - .HasColumnType("text"); - - b.Property("CommenterId") - .HasColumnType("uuid"); - - b.Property("ConcurrencyStamp") - .IsConcurrencyToken() - .IsRequired() - .HasMaxLength(40) - .HasColumnType("character varying(40)") - .HasColumnName("ConcurrencyStamp"); - - b.Property("CreationTime") - .HasColumnType("timestamp without time zone") - .HasColumnName("CreationTime"); - - b.Property("CreatorId") - .HasColumnType("uuid") - .HasColumnName("CreatorId"); - - b.Property("ExtraProperties") - .IsRequired() - .HasColumnType("text") - .HasColumnName("ExtraProperties"); - - b.Property("LastModificationTime") - .HasColumnType("timestamp without time zone") - .HasColumnName("LastModificationTime"); - - b.Property("LastModifierId") - .HasColumnType("uuid") - .HasColumnName("LastModifierId"); - - b.Property("TenantId") - .HasColumnType("uuid") - .HasColumnName("TenantId"); - - b.HasKey("Id"); - - b.HasIndex("AssessmentId"); - - b.HasIndex("CommenterId"); - - b.ToTable("AssessmentComments", (string)null); - }); - - modelBuilder.Entity("Unity.GrantManager.Identity.Person", b => - { - b.Property("Id") - .HasColumnType("uuid"); - - b.Property("Badge") - .IsRequired() - .HasColumnType("text"); - - b.Property("ConcurrencyStamp") - .IsConcurrencyToken() - .IsRequired() - .HasMaxLength(40) - .HasColumnType("character varying(40)") - .HasColumnName("ConcurrencyStamp"); - - b.Property("CreationTime") - .HasColumnType("timestamp without time zone") - .HasColumnName("CreationTime"); - - b.Property("CreatorId") - .HasColumnType("uuid") - .HasColumnName("CreatorId"); - - b.Property("ExtraProperties") - .IsRequired() - .HasColumnType("text") - .HasColumnName("ExtraProperties"); - - b.Property("FullName") - .IsRequired() - .HasColumnType("text"); - - b.Property("LastModificationTime") - .HasColumnType("timestamp without time zone") - .HasColumnName("LastModificationTime"); - - b.Property("LastModifierId") - .HasColumnType("uuid") - .HasColumnName("LastModifierId"); - - b.Property("OidcDisplayName") - .IsRequired() - .HasColumnType("text"); - - b.Property("OidcSub") - .IsRequired() - .HasColumnType("text"); - - b.Property("TenantId") - .HasColumnType("uuid") - .HasColumnName("TenantId"); - - b.HasKey("Id"); - - b.HasIndex("OidcSub"); - - b.ToTable("Persons", (string)null); - }); - - modelBuilder.Entity("Unity.GrantManager.Intakes.Intake", b => - { - b.Property("Id") - .HasColumnType("uuid"); - - b.Property("Budget") - .HasColumnType("double precision"); - - b.Property("ConcurrencyStamp") - .IsConcurrencyToken() - .IsRequired() - .HasMaxLength(40) - .HasColumnType("character varying(40)") - .HasColumnName("ConcurrencyStamp"); - - b.Property("CreationTime") - .HasColumnType("timestamp without time zone") - .HasColumnName("CreationTime"); - - b.Property("CreatorId") - .HasColumnType("uuid") - .HasColumnName("CreatorId"); - - b.Property("DeleterId") - .HasColumnType("uuid") - .HasColumnName("DeleterId"); - - b.Property("DeletionTime") - .HasColumnType("timestamp without time zone") - .HasColumnName("DeletionTime"); - - b.Property("EndDate") - .HasColumnType("timestamp without time zone"); - - b.Property("ExtraProperties") - .IsRequired() - .HasColumnType("text") - .HasColumnName("ExtraProperties"); - - b.Property("IntakeName") - .IsRequired() - .HasMaxLength(255) - .HasColumnType("character varying(255)"); - - b.Property("IsDeleted") - .ValueGeneratedOnAdd() - .HasColumnType("boolean") - .HasDefaultValue(false) - .HasColumnName("IsDeleted"); - - b.Property("LastModificationTime") - .HasColumnType("timestamp without time zone") - .HasColumnName("LastModificationTime"); - - b.Property("LastModifierId") - .HasColumnType("uuid") - .HasColumnName("LastModifierId"); - - b.Property("StartDate") - .HasColumnType("timestamp without time zone"); - - b.Property("TenantId") - .HasColumnType("uuid") - .HasColumnName("TenantId"); - - b.HasKey("Id"); - - b.ToTable("Intakes", (string)null); - }); - - modelBuilder.Entity("Unity.Notifications.Emails.EmailLog", b => - { - b.Property("Id") - .ValueGeneratedOnAdd() - .HasColumnType("uuid"); - - b.Property("ApplicantId") - .HasColumnType("uuid"); - - b.Property("ApplicationId") - .HasColumnType("uuid"); - - b.Property("AssessmentId") - .HasColumnType("uuid"); - - b.Property("BCC") - .IsRequired() - .HasColumnType("text"); - - b.Property("Body") - .IsRequired() - .HasColumnType("text"); - - b.Property("BodyType") - .IsRequired() - .HasColumnType("text"); - - b.Property("CC") - .IsRequired() - .HasColumnType("text"); - - b.Property("ChesMsgId") - .HasColumnType("uuid"); - - b.Property("ChesResponse") - .IsRequired() - .HasColumnType("text"); - - b.Property("ChesStatus") - .IsRequired() - .HasColumnType("text"); - - b.Property("ConcurrencyStamp") - .IsConcurrencyToken() - .IsRequired() - .HasMaxLength(40) - .HasColumnType("character varying(40)") - .HasColumnName("ConcurrencyStamp"); - - b.Property("CreationTime") - .HasColumnType("timestamp without time zone") - .HasColumnName("CreationTime"); - - b.Property("CreatorId") - .HasColumnType("uuid") - .HasColumnName("CreatorId"); - - b.Property("ExtraProperties") - .IsRequired() - .HasColumnType("text") - .HasColumnName("ExtraProperties"); - - b.Property("FromAddress") - .IsRequired() - .HasColumnType("text"); - - b.Property("LastModificationTime") - .HasColumnType("timestamp without time zone") - .HasColumnName("LastModificationTime"); - - b.Property("LastModifierId") - .HasColumnType("uuid") - .HasColumnName("LastModifierId"); - - b.Property("Priority") - .IsRequired() - .HasColumnType("text"); - - b.Property("RetryAttempts") - .HasColumnType("integer"); - - b.Property("SendOnDateTime") - .HasColumnType("timestamp without time zone"); - - b.Property("SentDateTime") - .HasColumnType("timestamp without time zone"); - - b.Property("Status") - .IsRequired() - .HasColumnType("text"); - - b.Property("Subject") - .IsRequired() - .HasColumnType("text"); - - b.Property("Tag") - .IsRequired() - .HasColumnType("text"); - - b.Property("TemplateName") - .IsRequired() - .HasColumnType("text"); - - b.Property("TenantId") - .HasColumnType("uuid") - .HasColumnName("TenantId"); - - b.Property("ToAddress") - .IsRequired() - .HasColumnType("text"); - - b.HasKey("Id"); - - b.ToTable("EmailLogs", "Notifications"); - }); - - modelBuilder.Entity("Unity.Notifications.Templates.EmailTemplate", b => - { - b.Property("Id") - .ValueGeneratedOnAdd() - .HasColumnType("uuid"); - - b.Property("BodyHTML") - .IsRequired() - .HasColumnType("text"); - - b.Property("BodyText") - .IsRequired() - .HasColumnType("text"); - - b.Property("ConcurrencyStamp") - .IsConcurrencyToken() - .IsRequired() - .HasMaxLength(40) - .HasColumnType("character varying(40)") - .HasColumnName("ConcurrencyStamp"); - - b.Property("CreationTime") - .HasColumnType("timestamp without time zone") - .HasColumnName("CreationTime"); - - b.Property("CreatorId") - .HasColumnType("uuid") - .HasColumnName("CreatorId"); - - b.Property("DeleterId") - .HasColumnType("uuid") - .HasColumnName("DeleterId"); - - b.Property("DeletionTime") - .HasColumnType("timestamp without time zone") - .HasColumnName("DeletionTime"); - - b.Property("Description") - .IsRequired() - .HasColumnType("text"); - - b.Property("ExtraProperties") - .IsRequired() - .HasColumnType("text") - .HasColumnName("ExtraProperties"); - - b.Property("IsDeleted") - .ValueGeneratedOnAdd() - .HasColumnType("boolean") - .HasDefaultValue(false) - .HasColumnName("IsDeleted"); - - b.Property("LastModificationTime") - .HasColumnType("timestamp without time zone") - .HasColumnName("LastModificationTime"); - - b.Property("LastModifierId") - .HasColumnType("uuid") - .HasColumnName("LastModifierId"); - - b.Property("Name") - .IsRequired() - .HasColumnType("text"); - - b.Property("SendFrom") - .IsRequired() - .HasColumnType("text"); - - b.Property("Subject") - .IsRequired() - .HasColumnType("text"); - - b.Property("TenantId") - .HasColumnType("uuid") - .HasColumnName("TenantId"); - - b.HasKey("Id"); - - b.ToTable("EmailTemplates", "Notifications"); - }); - - modelBuilder.Entity("Unity.Notifications.Templates.Subscriber", b => - { - b.Property("Id") - .ValueGeneratedOnAdd() - .HasColumnType("uuid"); - - b.Property("ConcurrencyStamp") - .IsConcurrencyToken() - .IsRequired() - .HasMaxLength(40) - .HasColumnType("character varying(40)") - .HasColumnName("ConcurrencyStamp"); - - b.Property("CreationTime") - .HasColumnType("timestamp without time zone") - .HasColumnName("CreationTime"); - - b.Property("CreatorId") - .HasColumnType("uuid") - .HasColumnName("CreatorId"); - - b.Property("Email") - .IsRequired() - .HasColumnType("text"); - - b.Property("ExtraProperties") - .IsRequired() - .HasColumnType("text") - .HasColumnName("ExtraProperties"); - - b.Property("FirstName") - .IsRequired() - .HasColumnType("text"); - - b.Property("LastModificationTime") - .HasColumnType("timestamp without time zone") - .HasColumnName("LastModificationTime"); - - b.Property("LastModifierId") - .HasColumnType("uuid") - .HasColumnName("LastModifierId"); - - b.Property("LastName") - .IsRequired() - .HasColumnType("text"); - - b.Property("TenantId") - .HasColumnType("uuid") - .HasColumnName("TenantId"); - - b.HasKey("Id"); - - b.ToTable("Subscribers", "Notifications"); - }); - - modelBuilder.Entity("Unity.Notifications.Templates.SubscriptionGroup", b => - { - b.Property("Id") - .ValueGeneratedOnAdd() - .HasColumnType("uuid"); - - b.Property("ConcurrencyStamp") - .IsConcurrencyToken() - .IsRequired() - .HasMaxLength(40) - .HasColumnType("character varying(40)") - .HasColumnName("ConcurrencyStamp"); - - b.Property("CreationTime") - .HasColumnType("timestamp without time zone") - .HasColumnName("CreationTime"); - - b.Property("CreatorId") - .HasColumnType("uuid") - .HasColumnName("CreatorId"); - - b.Property("ExtraProperties") - .IsRequired() - .HasColumnType("text") - .HasColumnName("ExtraProperties"); - - b.Property("LastModificationTime") - .HasColumnType("timestamp without time zone") - .HasColumnName("LastModificationTime"); - - b.Property("LastModifierId") - .HasColumnType("uuid") - .HasColumnName("LastModifierId"); - - b.Property("Name") - .IsRequired() - .HasColumnType("text"); - - b.Property("TenantId") - .HasColumnType("uuid") - .HasColumnName("TenantId"); - - b.HasKey("Id"); - - b.ToTable("SubscriptionGroups", "Notifications"); - }); - - modelBuilder.Entity("Unity.Notifications.Templates.SubscriptionGroupSubscription", b => - { - b.Property("Id") - .ValueGeneratedOnAdd() - .HasColumnType("uuid"); - - b.Property("ConcurrencyStamp") - .IsConcurrencyToken() - .IsRequired() - .HasMaxLength(40) - .HasColumnType("character varying(40)") - .HasColumnName("ConcurrencyStamp"); - - b.Property("CreationTime") - .HasColumnType("timestamp without time zone") - .HasColumnName("CreationTime"); - - b.Property("CreatorId") - .HasColumnType("uuid") - .HasColumnName("CreatorId"); - - b.Property("ExtraProperties") - .IsRequired() - .HasColumnType("text") - .HasColumnName("ExtraProperties"); - - b.Property("GroupId") - .HasColumnType("uuid"); - - b.Property("LastModificationTime") - .HasColumnType("timestamp without time zone") - .HasColumnName("LastModificationTime"); - - b.Property("LastModifierId") - .HasColumnType("uuid") - .HasColumnName("LastModifierId"); - - b.Property("SubscriberId") - .HasColumnType("uuid"); - - b.Property("TenantId") - .HasColumnType("uuid") - .HasColumnName("TenantId"); - - b.HasKey("Id"); - - b.HasIndex("GroupId"); - - b.HasIndex("SubscriberId"); - - b.ToTable("SubscriptionGroupSubscribers", "Notifications"); - }); - - modelBuilder.Entity("Unity.Notifications.Templates.TemplateVariable", b => - { - b.Property("Id") - .ValueGeneratedOnAdd() - .HasColumnType("uuid"); - - b.Property("ConcurrencyStamp") - .IsConcurrencyToken() - .IsRequired() - .HasMaxLength(40) - .HasColumnType("character varying(40)") - .HasColumnName("ConcurrencyStamp"); - - b.Property("CreationTime") - .HasColumnType("timestamp without time zone") - .HasColumnName("CreationTime"); - - b.Property("CreatorId") - .HasColumnType("uuid") - .HasColumnName("CreatorId"); - - b.Property("ExtraProperties") - .IsRequired() - .HasColumnType("text") - .HasColumnName("ExtraProperties"); - - b.Property("LastModificationTime") - .HasColumnType("timestamp without time zone") - .HasColumnName("LastModificationTime"); - - b.Property("LastModifierId") - .HasColumnType("uuid") - .HasColumnName("LastModifierId"); - - b.Property("MapTo") - .IsRequired() - .HasColumnType("text"); - - b.Property("Name") - .IsRequired() - .HasColumnType("text"); - - b.Property("TenantId") - .HasColumnType("uuid") - .HasColumnName("TenantId"); - - b.Property("Token") - .IsRequired() - .HasColumnType("text"); - - b.HasKey("Id"); - - b.ToTable("TemplateVariables", "Notifications"); - }); - - modelBuilder.Entity("Unity.Notifications.Templates.Trigger", b => - { - b.Property("Id") - .ValueGeneratedOnAdd() - .HasColumnType("uuid"); - - b.Property("Active") - .HasColumnType("boolean"); - - b.Property("ConcurrencyStamp") - .IsConcurrencyToken() - .IsRequired() - .HasMaxLength(40) - .HasColumnType("character varying(40)") - .HasColumnName("ConcurrencyStamp"); - - b.Property("CreationTime") - .HasColumnType("timestamp without time zone") - .HasColumnName("CreationTime"); - - b.Property("CreatorId") - .HasColumnType("uuid") - .HasColumnName("CreatorId"); - - b.Property("ExtraProperties") - .IsRequired() - .HasColumnType("text") - .HasColumnName("ExtraProperties"); - - b.Property("InternalName") - .IsRequired() - .HasColumnType("text"); - - b.Property("LastModificationTime") - .HasColumnType("timestamp without time zone") - .HasColumnName("LastModificationTime"); - - b.Property("LastModifierId") - .HasColumnType("uuid") - .HasColumnName("LastModifierId"); - - b.Property("Name") - .IsRequired() - .HasColumnType("text"); - - b.Property("TenantId") - .HasColumnType("uuid") - .HasColumnName("TenantId"); - - b.HasKey("Id"); - - b.ToTable("Triggers", "Notifications"); - }); - - modelBuilder.Entity("Unity.Notifications.Templates.TriggerSubscription", b => - { - b.Property("Id") - .ValueGeneratedOnAdd() - .HasColumnType("uuid"); - - b.Property("ConcurrencyStamp") - .IsConcurrencyToken() - .IsRequired() - .HasMaxLength(40) - .HasColumnType("character varying(40)") - .HasColumnName("ConcurrencyStamp"); - - b.Property("CreationTime") - .HasColumnType("timestamp without time zone") - .HasColumnName("CreationTime"); - - b.Property("CreatorId") - .HasColumnType("uuid") - .HasColumnName("CreatorId"); - - b.Property("ExtraProperties") - .IsRequired() - .HasColumnType("text") - .HasColumnName("ExtraProperties"); - - b.Property("LastModificationTime") - .HasColumnType("timestamp without time zone") - .HasColumnName("LastModificationTime"); - - b.Property("LastModifierId") - .HasColumnType("uuid") - .HasColumnName("LastModifierId"); - - b.Property("SubscriptionGroupId") - .HasColumnType("uuid"); - - b.Property("TemplateId") - .HasColumnType("uuid"); - - b.Property("TenantId") - .HasColumnType("uuid") - .HasColumnName("TenantId"); - - b.Property("TriggerId") - .HasColumnType("uuid"); - - b.HasKey("Id"); - - b.HasIndex("SubscriptionGroupId"); - - b.HasIndex("TemplateId"); - - b.HasIndex("TriggerId"); - - b.ToTable("TriggerSubscriptions", "Notifications"); - }); - - modelBuilder.Entity("Unity.Payments.Domain.PaymentConfigurations.PaymentConfiguration", b => - { - b.Property("Id") - .ValueGeneratedOnAdd() - .HasColumnType("uuid"); - - b.Property("ConcurrencyStamp") - .IsConcurrencyToken() - .IsRequired() - .HasMaxLength(40) - .HasColumnType("character varying(40)") - .HasColumnName("ConcurrencyStamp"); - - b.Property("CreationTime") - .HasColumnType("timestamp without time zone") - .HasColumnName("CreationTime"); - - b.Property("CreatorId") - .HasColumnType("uuid") - .HasColumnName("CreatorId"); - - b.Property("DeleterId") - .HasColumnType("uuid") - .HasColumnName("DeleterId"); - - b.Property("DeletionTime") - .HasColumnType("timestamp without time zone") - .HasColumnName("DeletionTime"); - - b.Property("ExtraProperties") - .IsRequired() - .HasColumnType("text") - .HasColumnName("ExtraProperties"); - - b.Property("IsDeleted") - .ValueGeneratedOnAdd() - .HasColumnType("boolean") - .HasDefaultValue(false) - .HasColumnName("IsDeleted"); - - b.Property("LastModificationTime") - .HasColumnType("timestamp without time zone") - .HasColumnName("LastModificationTime"); - - b.Property("LastModifierId") - .HasColumnType("uuid") - .HasColumnName("LastModifierId"); - - b.Property("MinistryClient") - .HasColumnType("text"); - - b.Property("PaymentIdPrefix") - .IsRequired() - .HasColumnType("text"); - - b.Property("PaymentThreshold") - .HasColumnType("numeric"); - - b.Property("ProjectNumber") - .HasColumnType("text"); - - b.Property("Responsibility") - .HasColumnType("text"); - - b.Property("ServiceLine") - .HasColumnType("text"); - - b.Property("Stob") - .HasColumnType("text"); - - b.Property("TenantId") - .HasColumnType("uuid") - .HasColumnName("TenantId"); - - b.HasKey("Id"); - - b.ToTable("PaymentConfigurations", "Payments"); - }); - - modelBuilder.Entity("Unity.Payments.Domain.PaymentRequests.ExpenseApproval", b => - { - b.Property("Id") - .ValueGeneratedOnAdd() - .HasColumnType("uuid"); - - b.Property("CreationTime") - .HasColumnType("timestamp without time zone") - .HasColumnName("CreationTime"); - - b.Property("CreatorId") - .HasColumnType("uuid") - .HasColumnName("CreatorId"); - - b.Property("DecisionDate") - .HasColumnType("timestamp without time zone"); - - b.Property("DecisionUserId") - .HasColumnType("uuid"); - - b.Property("DeleterId") - .HasColumnType("uuid") - .HasColumnName("DeleterId"); - - b.Property("DeletionTime") - .HasColumnType("timestamp without time zone") - .HasColumnName("DeletionTime"); - - b.Property("IsDeleted") - .ValueGeneratedOnAdd() - .HasColumnType("boolean") - .HasDefaultValue(false) - .HasColumnName("IsDeleted"); - - b.Property("LastModificationTime") - .HasColumnType("timestamp without time zone") - .HasColumnName("LastModificationTime"); - - b.Property("LastModifierId") - .HasColumnType("uuid") - .HasColumnName("LastModifierId"); - - b.Property("PaymentRequestId") - .HasColumnType("uuid"); - - b.Property("Status") - .HasColumnType("integer"); - - b.Property("TenantId") - .HasColumnType("uuid") - .HasColumnName("TenantId"); - - b.Property("Type") - .HasColumnType("integer"); - - b.HasKey("Id"); - - b.HasIndex("PaymentRequestId"); - - b.ToTable("ExpenseApprovals", "Payments"); - }); - - modelBuilder.Entity("Unity.Payments.Domain.PaymentRequests.PaymentRequest", b => - { - b.Property("Id") - .ValueGeneratedOnAdd() - .HasColumnType("uuid"); - - b.Property("Amount") - .HasColumnType("numeric"); - - b.Property("BatchName") - .IsRequired() - .HasColumnType("text"); - - b.Property("BatchNumber") - .HasColumnType("numeric"); - - b.Property("CasHttpStatusCode") - .HasColumnType("integer"); - - b.Property("CasResponse") - .HasColumnType("text"); - - b.Property("ConcurrencyStamp") - .IsConcurrencyToken() - .IsRequired() - .HasMaxLength(40) - .HasColumnType("character varying(40)") - .HasColumnName("ConcurrencyStamp"); - - b.Property("ContractNumber") - .IsRequired() - .HasColumnType("text"); - - b.Property("CorrelationId") - .HasColumnType("uuid"); - - b.Property("CorrelationProvider") - .IsRequired() - .HasColumnType("text"); - - b.Property("CreationTime") - .HasColumnType("timestamp without time zone") - .HasColumnName("CreationTime"); - - b.Property("CreatorId") - .HasColumnType("uuid") - .HasColumnName("CreatorId"); - - b.Property("DeleterId") - .HasColumnType("uuid") - .HasColumnName("DeleterId"); - - b.Property("DeletionTime") - .HasColumnType("timestamp without time zone") - .HasColumnName("DeletionTime"); - - b.Property("Description") - .HasColumnType("text"); - - b.Property("ExtraProperties") - .IsRequired() - .HasColumnType("text") - .HasColumnName("ExtraProperties"); - - b.Property("InvoiceNumber") - .IsRequired() - .HasColumnType("text"); - - b.Property("InvoiceStatus") - .HasColumnType("text"); - - b.Property("IsDeleted") - .ValueGeneratedOnAdd() - .HasColumnType("boolean") - .HasDefaultValue(false) - .HasColumnName("IsDeleted"); - - b.Property("IsRecon") - .HasColumnType("boolean"); - - b.Property("LastModificationTime") - .HasColumnType("timestamp without time zone") - .HasColumnName("LastModificationTime"); - - b.Property("LastModifierId") - .HasColumnType("uuid") - .HasColumnName("LastModifierId"); - - b.Property("PayeeName") - .IsRequired() - .HasColumnType("text"); - - b.Property("PaymentDate") - .HasColumnType("text"); - - b.Property("PaymentNumber") - .HasColumnType("text"); - - b.Property("PaymentStatus") - .HasColumnType("text"); - - b.Property("ReferenceNumber") - .IsRequired() - .HasColumnType("text"); - - b.Property("RequesterName") - .IsRequired() - .HasColumnType("text"); - - b.Property("SiteId") - .HasColumnType("uuid"); - - b.Property("Status") - .HasColumnType("integer"); - - b.Property("SubmissionConfirmationCode") - .IsRequired() - .HasColumnType("text"); - - b.Property("SupplierName") - .HasColumnType("text"); - - b.Property("SupplierNumber") - .IsRequired() - .HasColumnType("text"); - - b.Property("TenantId") - .HasColumnType("uuid") - .HasColumnName("TenantId"); - - b.HasKey("Id"); - - b.HasIndex("ReferenceNumber") - .IsUnique(); - - b.HasIndex("SiteId"); - - b.ToTable("PaymentRequests", "Payments"); - }); - - modelBuilder.Entity("Unity.Payments.Domain.PaymentTags.PaymentTag", b => - { - b.Property("Id") - .ValueGeneratedOnAdd() - .HasColumnType("uuid"); - - b.Property("ConcurrencyStamp") - .IsConcurrencyToken() - .IsRequired() - .HasMaxLength(40) - .HasColumnType("character varying(40)") - .HasColumnName("ConcurrencyStamp"); - - b.Property("CreationTime") - .HasColumnType("timestamp without time zone") - .HasColumnName("CreationTime"); - - b.Property("CreatorId") - .HasColumnType("uuid") - .HasColumnName("CreatorId"); - - b.Property("ExtraProperties") - .IsRequired() - .HasColumnType("text") - .HasColumnName("ExtraProperties"); - - b.Property("LastModificationTime") - .HasColumnType("timestamp without time zone") - .HasColumnName("LastModificationTime"); - - b.Property("LastModifierId") - .HasColumnType("uuid") - .HasColumnName("LastModifierId"); - - b.Property("PaymentRequestId") - .HasColumnType("uuid"); - - b.Property("TenantId") - .HasColumnType("uuid") - .HasColumnName("TenantId"); - - b.Property("Text") - .IsRequired() - .HasMaxLength(250) - .HasColumnType("character varying(250)"); - - b.HasKey("Id"); - - b.HasIndex("PaymentRequestId"); - - b.ToTable("PaymentTags", "Payments"); - }); - - modelBuilder.Entity("Unity.Payments.Domain.Suppliers.Site", b => - { - b.Property("Id") - .ValueGeneratedOnAdd() - .HasColumnType("uuid"); - - b.Property("AddressLine1") - .HasColumnType("text"); - - b.Property("AddressLine2") - .HasColumnType("text"); - - b.Property("AddressLine3") - .HasColumnType("text"); - - b.Property("BankAccount") - .HasColumnType("text"); - - b.Property("City") - .HasColumnType("text"); - - b.Property("Country") - .HasColumnType("text"); - - b.Property("CreationTime") - .HasColumnType("timestamp without time zone") - .HasColumnName("CreationTime"); - - b.Property("CreatorId") - .HasColumnType("uuid") - .HasColumnName("CreatorId"); - - b.Property("DeleterId") - .HasColumnType("uuid") - .HasColumnName("DeleterId"); - - b.Property("DeletionTime") - .HasColumnType("timestamp without time zone") - .HasColumnName("DeletionTime"); - - b.Property("EFTAdvicePref") - .HasColumnType("text"); - - b.Property("EmailAddress") - .HasColumnType("text"); - - b.Property("IsDeleted") - .ValueGeneratedOnAdd() - .HasColumnType("boolean") - .HasDefaultValue(false) - .HasColumnName("IsDeleted"); - - b.Property("LastModificationTime") - .HasColumnType("timestamp without time zone") - .HasColumnName("LastModificationTime"); - - b.Property("LastModifierId") - .HasColumnType("uuid") - .HasColumnName("LastModifierId"); - - b.Property("LastUpdatedInCas") - .HasColumnType("timestamp without time zone"); - - b.Property("MarkDeletedInUse") - .HasColumnType("boolean"); - - b.Property("Number") - .IsRequired() - .HasColumnType("text"); - - b.Property("PaymentGroup") - .HasColumnType("integer"); - - b.Property("PostalCode") - .HasColumnType("text"); - - b.Property("ProviderId") - .HasColumnType("text"); - - b.Property("Province") - .HasColumnType("text"); - - b.Property("SiteProtected") - .HasColumnType("text"); - - b.Property("Status") - .HasColumnType("text"); - - b.Property("SupplierId") - .HasColumnType("uuid"); - - b.Property("TenantId") - .HasColumnType("uuid") - .HasColumnName("TenantId"); - - b.HasKey("Id"); - - b.HasIndex("SupplierId"); - - b.ToTable("Sites", "Payments"); - }); - - modelBuilder.Entity("Unity.Payments.Domain.Suppliers.Supplier", b => - { - b.Property("Id") - .ValueGeneratedOnAdd() - .HasColumnType("uuid"); - - b.Property("BusinessNumber") - .HasColumnType("text"); - - b.Property("City") - .HasColumnType("text"); - - b.Property("ConcurrencyStamp") - .IsConcurrencyToken() - .IsRequired() - .HasMaxLength(40) - .HasColumnType("character varying(40)") - .HasColumnName("ConcurrencyStamp"); - - b.Property("CorrelationId") - .HasColumnType("uuid"); - - b.Property("CorrelationProvider") - .IsRequired() - .HasColumnType("text"); - - b.Property("CreationTime") - .HasColumnType("timestamp without time zone") - .HasColumnName("CreationTime"); - - b.Property("CreatorId") - .HasColumnType("uuid") - .HasColumnName("CreatorId"); - - b.Property("DeleterId") - .HasColumnType("uuid") - .HasColumnName("DeleterId"); - - b.Property("DeletionTime") - .HasColumnType("timestamp without time zone") - .HasColumnName("DeletionTime"); - - b.Property("ExtraProperties") - .IsRequired() - .HasColumnType("text") - .HasColumnName("ExtraProperties"); - - b.Property("IsDeleted") - .ValueGeneratedOnAdd() - .HasColumnType("boolean") - .HasDefaultValue(false) - .HasColumnName("IsDeleted"); - - b.Property("LastModificationTime") - .HasColumnType("timestamp without time zone") - .HasColumnName("LastModificationTime"); - - b.Property("LastModifierId") - .HasColumnType("uuid") - .HasColumnName("LastModifierId"); - - b.Property("LastUpdatedInCAS") - .HasColumnType("timestamp without time zone"); - - b.Property("MailingAddress") - .HasColumnType("text"); - - b.Property("Name") - .HasColumnType("text"); - - b.Property("Number") - .HasColumnType("text"); - - b.Property("PostalCode") - .HasColumnType("text"); - - b.Property("ProviderId") - .HasColumnType("text"); - - b.Property("Province") - .HasColumnType("text"); - - b.Property("SIN") - .HasColumnType("text"); - - b.Property("StandardIndustryClassification") - .HasColumnType("text"); - - b.Property("Status") - .HasColumnType("text"); - - b.Property("Subcategory") - .HasColumnType("text"); - - b.Property("SupplierProtected") - .HasColumnType("text"); - - b.Property("TenantId") - .HasColumnType("uuid") - .HasColumnName("TenantId"); - - b.HasKey("Id"); - - b.ToTable("Suppliers", "Payments"); - }); - - modelBuilder.Entity("Unity.Flex.Domain.ScoresheetInstances.ScoresheetInstance", b => - { - b.HasOne("Unity.Flex.Domain.Scoresheets.Scoresheet", "Scoresheet") - .WithMany("Instances") - .HasForeignKey("ScoresheetId") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired(); - - b.Navigation("Scoresheet"); - }); - - modelBuilder.Entity("Unity.Flex.Domain.Scoresheets.Answer", b => - { - b.HasOne("Unity.Flex.Domain.Scoresheets.Question", "Question") - .WithMany("Answers") - .HasForeignKey("QuestionId") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired(); - - b.HasOne("Unity.Flex.Domain.ScoresheetInstances.ScoresheetInstance", null) - .WithMany("Answers") - .HasForeignKey("ScoresheetInstanceId") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired(); - - b.Navigation("Question"); - }); - - modelBuilder.Entity("Unity.Flex.Domain.Scoresheets.Question", b => - { - b.HasOne("Unity.Flex.Domain.Scoresheets.ScoresheetSection", "Section") - .WithMany("Fields") - .HasForeignKey("SectionId") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired(); - - b.Navigation("Section"); - }); - - modelBuilder.Entity("Unity.Flex.Domain.Scoresheets.ScoresheetSection", b => - { - b.HasOne("Unity.Flex.Domain.Scoresheets.Scoresheet", "Scoresheet") - .WithMany("Sections") - .HasForeignKey("ScoresheetId") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired(); - - b.Navigation("Scoresheet"); - }); - - modelBuilder.Entity("Unity.Flex.Domain.WorksheetInstances.CustomFieldValue", b => - { - b.HasOne("Unity.Flex.Domain.WorksheetInstances.WorksheetInstance", null) - .WithMany("Values") - .HasForeignKey("WorksheetInstanceId") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired(); - }); - - modelBuilder.Entity("Unity.Flex.Domain.WorksheetLinks.WorksheetLink", b => - { - b.HasOne("Unity.Flex.Domain.Worksheets.Worksheet", "Worksheet") - .WithMany("Links") - .HasForeignKey("WorksheetId") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired(); - - b.Navigation("Worksheet"); - }); - - modelBuilder.Entity("Unity.Flex.Domain.Worksheets.CustomField", b => - { - b.HasOne("Unity.Flex.Domain.Worksheets.WorksheetSection", "Section") - .WithMany("Fields") - .HasForeignKey("SectionId") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired(); - - b.Navigation("Section"); - }); - - modelBuilder.Entity("Unity.Flex.Domain.Worksheets.WorksheetSection", b => - { - b.HasOne("Unity.Flex.Domain.Worksheets.Worksheet", "Worksheet") - .WithMany("Sections") - .HasForeignKey("WorksheetId") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired(); - - b.Navigation("Worksheet"); - }); - - modelBuilder.Entity("Unity.GrantManager.Applications.ApplicantAddress", b => - { - b.HasOne("Unity.GrantManager.Applications.Applicant", "Applicant") - .WithMany("ApplicantAddresses") - .HasForeignKey("ApplicantId") - .OnDelete(DeleteBehavior.NoAction) - .IsRequired(); - - b.Navigation("Applicant"); - }); - - modelBuilder.Entity("Unity.GrantManager.Applications.ApplicantAgent", b => - { - b.HasOne("Unity.GrantManager.Applications.Applicant", null) - .WithMany() - .HasForeignKey("ApplicantId") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired(); - - b.HasOne("Unity.GrantManager.Applications.Application", "Application") - .WithOne("ApplicantAgent") - .HasForeignKey("Unity.GrantManager.Applications.ApplicantAgent", "ApplicationId"); - - b.HasOne("Unity.GrantManager.Identity.Person", null) - .WithMany() - .HasForeignKey("OidcSubUser") - .HasPrincipalKey("OidcSub"); - - b.Navigation("Application"); - }); - - modelBuilder.Entity("Unity.GrantManager.Applications.Application", b => - { - b.HasOne("Unity.GrantManager.Applications.Applicant", "Applicant") - .WithMany() - .HasForeignKey("ApplicantId") - .OnDelete(DeleteBehavior.NoAction) - .IsRequired(); - - b.HasOne("Unity.GrantManager.Applications.ApplicationForm", "ApplicationForm") - .WithMany() - .HasForeignKey("ApplicationFormId") - .OnDelete(DeleteBehavior.NoAction) - .IsRequired(); - - b.HasOne("Unity.GrantManager.Applications.ApplicationStatus", "ApplicationStatus") - .WithMany("Applications") - .HasForeignKey("ApplicationStatusId") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired(); - - b.HasOne("Unity.GrantManager.Identity.Person", "Owner") - .WithMany() - .HasForeignKey("OwnerId") - .OnDelete(DeleteBehavior.NoAction); - - b.Navigation("Applicant"); - - b.Navigation("ApplicationForm"); - - b.Navigation("ApplicationStatus"); - - b.Navigation("Owner"); - }); - - modelBuilder.Entity("Unity.GrantManager.Applications.ApplicationAssignment", b => - { - b.HasOne("Unity.GrantManager.Applications.Application", "Application") - .WithMany("ApplicationAssignments") - .HasForeignKey("ApplicationId") - .OnDelete(DeleteBehavior.NoAction) - .IsRequired(); - - b.HasOne("Unity.GrantManager.Identity.Person", "Assignee") - .WithMany() - .HasForeignKey("AssigneeId") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired(); - - b.Navigation("Application"); - - b.Navigation("Assignee"); - }); - - modelBuilder.Entity("Unity.GrantManager.Applications.ApplicationAttachment", b => - { - b.HasOne("Unity.GrantManager.Applications.Application", null) - .WithMany() - .HasForeignKey("ApplicationId") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired(); - }); - - modelBuilder.Entity("Unity.GrantManager.Applications.ApplicationChefsFileAttachment", b => - { - b.HasOne("Unity.GrantManager.Applications.Application", null) - .WithMany() - .HasForeignKey("ApplicationId") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired(); - }); - - modelBuilder.Entity("Unity.GrantManager.Applications.ApplicationContact", b => - { - b.HasOne("Unity.GrantManager.Applications.Application", null) - .WithMany() - .HasForeignKey("ApplicationId") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired(); - }); - - modelBuilder.Entity("Unity.GrantManager.Applications.ApplicationForm", b => - { - b.HasOne("Unity.GrantManager.Intakes.Intake", null) - .WithMany() - .HasForeignKey("IntakeId") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired(); - }); - - modelBuilder.Entity("Unity.GrantManager.Applications.ApplicationFormSubmission", b => - { - b.HasOne("Unity.GrantManager.Applications.Applicant", null) - .WithMany() - .HasForeignKey("ApplicantId") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired(); - - b.HasOne("Unity.GrantManager.Applications.ApplicationForm", null) - .WithMany() - .HasForeignKey("ApplicationFormId") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired(); - }); - - modelBuilder.Entity("Unity.GrantManager.Applications.ApplicationFormVersion", b => - { - b.HasOne("Unity.GrantManager.Applications.ApplicationForm", null) - .WithMany() - .HasForeignKey("ApplicationFormId") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired(); - }); - - modelBuilder.Entity("Unity.GrantManager.Applications.ApplicationLink", b => - { - b.HasOne("Unity.GrantManager.Applications.Application", null) - .WithMany() - .HasForeignKey("ApplicationId") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired(); - }); - - modelBuilder.Entity("Unity.GrantManager.Applications.ApplicationTags", b => - { - b.HasOne("Unity.GrantManager.Applications.Application", "Application") - .WithMany("ApplicationTags") - .HasForeignKey("ApplicationId") - .OnDelete(DeleteBehavior.NoAction) - .IsRequired(); - - b.Navigation("Application"); - }); - - modelBuilder.Entity("Unity.GrantManager.Applications.AssessmentAttachment", b => - { - b.HasOne("Unity.GrantManager.Assessments.Assessment", null) - .WithMany() - .HasForeignKey("AssessmentId") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired(); - }); - - modelBuilder.Entity("Unity.GrantManager.Assessments.Assessment", b => - { - b.HasOne("Unity.GrantManager.Applications.Application", "Application") - .WithMany("Assessments") - .HasForeignKey("ApplicationId") - .OnDelete(DeleteBehavior.NoAction) - .IsRequired(); - - b.HasOne("Unity.GrantManager.Identity.Person", null) - .WithMany() - .HasForeignKey("AssessorId") - .OnDelete(DeleteBehavior.NoAction) - .IsRequired(); - - b.Navigation("Application"); - }); - - modelBuilder.Entity("Unity.GrantManager.Comments.ApplicationComment", b => - { - b.HasOne("Unity.GrantManager.Applications.Application", null) - .WithMany() - .HasForeignKey("ApplicationId") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired(); - - b.HasOne("Unity.GrantManager.Identity.Person", null) - .WithMany() - .HasForeignKey("CommenterId") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired(); - }); - - modelBuilder.Entity("Unity.GrantManager.Comments.AssessmentComment", b => - { - b.HasOne("Unity.GrantManager.Assessments.Assessment", null) - .WithMany() - .HasForeignKey("AssessmentId") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired(); - - b.HasOne("Unity.GrantManager.Identity.Person", null) - .WithMany() - .HasForeignKey("CommenterId") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired(); - }); - - modelBuilder.Entity("Unity.Notifications.Templates.SubscriptionGroupSubscription", b => - { - b.HasOne("Unity.Notifications.Templates.SubscriptionGroup", "SubscriptionGroup") - .WithMany() - .HasForeignKey("GroupId"); - - b.HasOne("Unity.Notifications.Templates.Subscriber", "Subscriber") - .WithMany() - .HasForeignKey("SubscriberId"); - - b.Navigation("Subscriber"); - - b.Navigation("SubscriptionGroup"); - }); - - modelBuilder.Entity("Unity.Notifications.Templates.TriggerSubscription", b => - { - b.HasOne("Unity.Notifications.Templates.SubscriptionGroup", "SubscriptionGroup") - .WithMany() - .HasForeignKey("SubscriptionGroupId") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired(); - - b.HasOne("Unity.Notifications.Templates.EmailTemplate", "EmailTemplate") - .WithMany() - .HasForeignKey("TemplateId") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired(); - - b.HasOne("Unity.Notifications.Templates.Trigger", "Trigger") - .WithMany() - .HasForeignKey("TriggerId") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired(); - - b.Navigation("EmailTemplate"); - - b.Navigation("SubscriptionGroup"); - - b.Navigation("Trigger"); - }); - - modelBuilder.Entity("Unity.Payments.Domain.PaymentRequests.ExpenseApproval", b => - { - b.HasOne("Unity.Payments.Domain.PaymentRequests.PaymentRequest", "PaymentRequest") - .WithMany("ExpenseApprovals") - .HasForeignKey("PaymentRequestId") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired(); - - b.Navigation("PaymentRequest"); - }); - - modelBuilder.Entity("Unity.Payments.Domain.PaymentRequests.PaymentRequest", b => - { - b.HasOne("Unity.Payments.Domain.Suppliers.Site", "Site") - .WithMany() - .HasForeignKey("SiteId") - .OnDelete(DeleteBehavior.NoAction) - .IsRequired(); - - b.Navigation("Site"); - }); - - modelBuilder.Entity("Unity.Payments.Domain.PaymentTags.PaymentTag", b => - { - b.HasOne("Unity.Payments.Domain.PaymentRequests.PaymentRequest", null) - .WithMany("PaymentTags") - .HasForeignKey("PaymentRequestId") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired(); - }); - - modelBuilder.Entity("Unity.Payments.Domain.Suppliers.Site", b => - { - b.HasOne("Unity.Payments.Domain.Suppliers.Supplier", "Supplier") - .WithMany("Sites") - .HasForeignKey("SupplierId") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired(); - - b.Navigation("Supplier"); - }); - - modelBuilder.Entity("Unity.Flex.Domain.ScoresheetInstances.ScoresheetInstance", b => - { - b.Navigation("Answers"); - }); - - modelBuilder.Entity("Unity.Flex.Domain.Scoresheets.Question", b => - { - b.Navigation("Answers"); - }); - - modelBuilder.Entity("Unity.Flex.Domain.Scoresheets.Scoresheet", b => - { - b.Navigation("Instances"); - - b.Navigation("Sections"); - }); - - modelBuilder.Entity("Unity.Flex.Domain.Scoresheets.ScoresheetSection", b => - { - b.Navigation("Fields"); - }); - - modelBuilder.Entity("Unity.Flex.Domain.WorksheetInstances.WorksheetInstance", b => - { - b.Navigation("Values"); - }); - - modelBuilder.Entity("Unity.Flex.Domain.Worksheets.Worksheet", b => - { - b.Navigation("Links"); - - b.Navigation("Sections"); - }); - - modelBuilder.Entity("Unity.Flex.Domain.Worksheets.WorksheetSection", b => - { - b.Navigation("Fields"); - }); - - modelBuilder.Entity("Unity.GrantManager.Applications.Applicant", b => - { - b.Navigation("ApplicantAddresses"); - }); - - modelBuilder.Entity("Unity.GrantManager.Applications.Application", b => - { - b.Navigation("ApplicantAgent"); - - b.Navigation("ApplicationAssignments"); - - b.Navigation("ApplicationTags"); - - b.Navigation("Assessments"); - }); - - modelBuilder.Entity("Unity.GrantManager.Applications.ApplicationStatus", b => - { - b.Navigation("Applications"); - }); - - modelBuilder.Entity("Unity.Payments.Domain.PaymentRequests.PaymentRequest", b => - { - b.Navigation("ExpenseApprovals"); - - b.Navigation("PaymentTags"); - }); - - modelBuilder.Entity("Unity.Payments.Domain.Suppliers.Supplier", b => - { - b.Navigation("Sites"); - }); -#pragma warning restore 612, 618 - } - } -} +// +using System; +using Microsoft.EntityFrameworkCore; +using Microsoft.EntityFrameworkCore.Infrastructure; +using Microsoft.EntityFrameworkCore.Storage.ValueConversion; +using Npgsql.EntityFrameworkCore.PostgreSQL.Metadata; +using Unity.GrantManager.EntityFrameworkCore; +using Volo.Abp.EntityFrameworkCore; + +#nullable disable + +namespace Unity.GrantManager.Migrations.TenantMigrations +{ + [DbContext(typeof(GrantTenantDbContext))] + partial class GrantTenantDbContextModelSnapshot : ModelSnapshot + { + protected override void BuildModel(ModelBuilder modelBuilder) + { +#pragma warning disable 612, 618 + modelBuilder + .HasAnnotation("_Abp_DatabaseProvider", EfCoreDatabaseProvider.PostgreSql) + .HasAnnotation("ProductVersion", "9.0.5") + .HasAnnotation("Relational:MaxIdentifierLength", 63); + + NpgsqlModelBuilderExtensions.UseIdentityByDefaultColumns(modelBuilder); + + modelBuilder.Entity("Unity.Flex.Domain.ScoresheetInstances.ScoresheetInstance", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("uuid"); + + b.Property("ConcurrencyStamp") + .IsConcurrencyToken() + .IsRequired() + .HasMaxLength(40) + .HasColumnType("character varying(40)") + .HasColumnName("ConcurrencyStamp"); + + b.Property("CorrelationId") + .HasColumnType("uuid"); + + b.Property("CorrelationProvider") + .IsRequired() + .HasColumnType("text"); + + b.Property("CreationTime") + .HasColumnType("timestamp without time zone") + .HasColumnName("CreationTime"); + + b.Property("CreatorId") + .HasColumnType("uuid") + .HasColumnName("CreatorId"); + + b.Property("DeleterId") + .HasColumnType("uuid") + .HasColumnName("DeleterId"); + + b.Property("DeletionTime") + .HasColumnType("timestamp without time zone") + .HasColumnName("DeletionTime"); + + b.Property("ExtraProperties") + .IsRequired() + .HasColumnType("text") + .HasColumnName("ExtraProperties"); + + b.Property("IsDeleted") + .ValueGeneratedOnAdd() + .HasColumnType("boolean") + .HasDefaultValue(false) + .HasColumnName("IsDeleted"); + + b.Property("LastModificationTime") + .HasColumnType("timestamp without time zone") + .HasColumnName("LastModificationTime"); + + b.Property("LastModifierId") + .HasColumnType("uuid") + .HasColumnName("LastModifierId"); + + b.Property("ReportData") + .IsRequired() + .HasColumnType("jsonb"); + + b.Property("ScoresheetId") + .HasColumnType("uuid"); + + b.Property("TenantId") + .HasColumnType("uuid") + .HasColumnName("TenantId"); + + b.Property("Value") + .IsRequired() + .HasColumnType("text"); + + b.HasKey("Id"); + + b.HasIndex("ScoresheetId"); + + b.ToTable("ScoresheetInstances", "Flex"); + }); + + modelBuilder.Entity("Unity.Flex.Domain.Scoresheets.Answer", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("uuid"); + + b.Property("CreationTime") + .HasColumnType("timestamp without time zone") + .HasColumnName("CreationTime"); + + b.Property("CreatorId") + .HasColumnType("uuid") + .HasColumnName("CreatorId"); + + b.Property("CurrentValue") + .HasColumnType("jsonb"); + + b.Property("DeleterId") + .HasColumnType("uuid") + .HasColumnName("DeleterId"); + + b.Property("DeletionTime") + .HasColumnType("timestamp without time zone") + .HasColumnName("DeletionTime"); + + b.Property("IsDeleted") + .ValueGeneratedOnAdd() + .HasColumnType("boolean") + .HasDefaultValue(false) + .HasColumnName("IsDeleted"); + + b.Property("LastModificationTime") + .HasColumnType("timestamp without time zone") + .HasColumnName("LastModificationTime"); + + b.Property("LastModifierId") + .HasColumnType("uuid") + .HasColumnName("LastModifierId"); + + b.Property("QuestionId") + .HasColumnType("uuid"); + + b.Property("ScoresheetInstanceId") + .HasColumnType("uuid"); + + b.Property("TenantId") + .HasColumnType("uuid") + .HasColumnName("TenantId"); + + b.Property("Version") + .HasColumnType("bigint"); + + b.HasKey("Id"); + + b.HasIndex("QuestionId"); + + b.HasIndex("ScoresheetInstanceId"); + + b.ToTable("Answers", "Flex"); + }); + + modelBuilder.Entity("Unity.Flex.Domain.Scoresheets.Question", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("uuid"); + + b.Property("CreationTime") + .HasColumnType("timestamp without time zone") + .HasColumnName("CreationTime"); + + b.Property("CreatorId") + .HasColumnType("uuid") + .HasColumnName("CreatorId"); + + b.Property("Definition") + .IsRequired() + .HasColumnType("jsonb"); + + b.Property("DeleterId") + .HasColumnType("uuid") + .HasColumnName("DeleterId"); + + b.Property("DeletionTime") + .HasColumnType("timestamp without time zone") + .HasColumnName("DeletionTime"); + + b.Property("Description") + .HasColumnType("text"); + + b.Property("Enabled") + .HasColumnType("boolean"); + + b.Property("IsDeleted") + .ValueGeneratedOnAdd() + .HasColumnType("boolean") + .HasDefaultValue(false) + .HasColumnName("IsDeleted"); + + b.Property("Label") + .IsRequired() + .HasColumnType("text"); + + b.Property("LastModificationTime") + .HasColumnType("timestamp without time zone") + .HasColumnName("LastModificationTime"); + + b.Property("LastModifierId") + .HasColumnType("uuid") + .HasColumnName("LastModifierId"); + + b.Property("Name") + .IsRequired() + .HasColumnType("text"); + + b.Property("Order") + .HasColumnType("bigint"); + + b.Property("SectionId") + .HasColumnType("uuid"); + + b.Property("TenantId") + .HasColumnType("uuid") + .HasColumnName("TenantId"); + + b.Property("Type") + .HasColumnType("integer"); + + b.HasKey("Id"); + + b.HasIndex("SectionId"); + + b.ToTable("Questions", "Flex"); + }); + + modelBuilder.Entity("Unity.Flex.Domain.Scoresheets.Scoresheet", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("uuid"); + + b.Property("ConcurrencyStamp") + .IsConcurrencyToken() + .IsRequired() + .HasMaxLength(40) + .HasColumnType("character varying(40)") + .HasColumnName("ConcurrencyStamp"); + + b.Property("CreationTime") + .HasColumnType("timestamp without time zone") + .HasColumnName("CreationTime"); + + b.Property("CreatorId") + .HasColumnType("uuid") + .HasColumnName("CreatorId"); + + b.Property("DeleterId") + .HasColumnType("uuid") + .HasColumnName("DeleterId"); + + b.Property("DeletionTime") + .HasColumnType("timestamp without time zone") + .HasColumnName("DeletionTime"); + + b.Property("ExtraProperties") + .IsRequired() + .HasColumnType("text") + .HasColumnName("ExtraProperties"); + + b.Property("IsDeleted") + .ValueGeneratedOnAdd() + .HasColumnType("boolean") + .HasDefaultValue(false) + .HasColumnName("IsDeleted"); + + b.Property("LastModificationTime") + .HasColumnType("timestamp without time zone") + .HasColumnName("LastModificationTime"); + + b.Property("LastModifierId") + .HasColumnType("uuid") + .HasColumnName("LastModifierId"); + + b.Property("Name") + .IsRequired() + .HasColumnType("text"); + + b.Property("Order") + .HasColumnType("bigint"); + + b.Property("Published") + .HasColumnType("boolean"); + + b.Property("ReportColumns") + .IsRequired() + .HasColumnType("text"); + + b.Property("ReportKeys") + .IsRequired() + .HasColumnType("text"); + + b.Property("ReportViewName") + .IsRequired() + .HasColumnType("text"); + + b.Property("TenantId") + .HasColumnType("uuid") + .HasColumnName("TenantId"); + + b.Property("Title") + .IsRequired() + .HasColumnType("text"); + + b.Property("Version") + .HasColumnType("bigint"); + + b.HasKey("Id"); + + b.ToTable("Scoresheets", "Flex"); + }); + + modelBuilder.Entity("Unity.Flex.Domain.Scoresheets.ScoresheetSection", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("uuid"); + + b.Property("CreationTime") + .HasColumnType("timestamp without time zone") + .HasColumnName("CreationTime"); + + b.Property("CreatorId") + .HasColumnType("uuid") + .HasColumnName("CreatorId"); + + b.Property("DeleterId") + .HasColumnType("uuid") + .HasColumnName("DeleterId"); + + b.Property("DeletionTime") + .HasColumnType("timestamp without time zone") + .HasColumnName("DeletionTime"); + + b.Property("IsDeleted") + .ValueGeneratedOnAdd() + .HasColumnType("boolean") + .HasDefaultValue(false) + .HasColumnName("IsDeleted"); + + b.Property("LastModificationTime") + .HasColumnType("timestamp without time zone") + .HasColumnName("LastModificationTime"); + + b.Property("LastModifierId") + .HasColumnType("uuid") + .HasColumnName("LastModifierId"); + + b.Property("Name") + .IsRequired() + .HasColumnType("text"); + + b.Property("Order") + .HasColumnType("bigint"); + + b.Property("ScoresheetId") + .HasColumnType("uuid"); + + b.Property("TenantId") + .HasColumnType("uuid") + .HasColumnName("TenantId"); + + b.HasKey("Id"); + + b.HasIndex("ScoresheetId"); + + b.ToTable("ScoresheetSections", "Flex"); + }); + + modelBuilder.Entity("Unity.Flex.Domain.WorksheetInstances.CustomFieldValue", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("uuid"); + + b.Property("CreationTime") + .HasColumnType("timestamp without time zone") + .HasColumnName("CreationTime"); + + b.Property("CreatorId") + .HasColumnType("uuid") + .HasColumnName("CreatorId"); + + b.Property("CurrentValue") + .IsRequired() + .HasColumnType("jsonb"); + + b.Property("CustomFieldId") + .HasColumnType("uuid"); + + b.Property("LastModificationTime") + .HasColumnType("timestamp without time zone") + .HasColumnName("LastModificationTime"); + + b.Property("LastModifierId") + .HasColumnType("uuid") + .HasColumnName("LastModifierId"); + + b.Property("TenantId") + .HasColumnType("uuid") + .HasColumnName("TenantId"); + + b.Property("WorksheetInstanceId") + .HasColumnType("uuid"); + + b.HasKey("Id"); + + b.HasIndex("WorksheetInstanceId"); + + b.ToTable("CustomFieldValues", "Flex"); + }); + + modelBuilder.Entity("Unity.Flex.Domain.WorksheetInstances.WorksheetInstance", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("uuid"); + + b.Property("ConcurrencyStamp") + .IsConcurrencyToken() + .IsRequired() + .HasMaxLength(40) + .HasColumnType("character varying(40)") + .HasColumnName("ConcurrencyStamp"); + + b.Property("CorrelationId") + .HasColumnType("uuid"); + + b.Property("CorrelationProvider") + .IsRequired() + .HasColumnType("text"); + + b.Property("CreationTime") + .HasColumnType("timestamp without time zone") + .HasColumnName("CreationTime"); + + b.Property("CreatorId") + .HasColumnType("uuid") + .HasColumnName("CreatorId"); + + b.Property("CurrentValue") + .IsRequired() + .HasColumnType("jsonb"); + + b.Property("DeleterId") + .HasColumnType("uuid") + .HasColumnName("DeleterId"); + + b.Property("DeletionTime") + .HasColumnType("timestamp without time zone") + .HasColumnName("DeletionTime"); + + b.Property("ExtraProperties") + .IsRequired() + .HasColumnType("text") + .HasColumnName("ExtraProperties"); + + b.Property("IsDeleted") + .ValueGeneratedOnAdd() + .HasColumnType("boolean") + .HasDefaultValue(false) + .HasColumnName("IsDeleted"); + + b.Property("LastModificationTime") + .HasColumnType("timestamp without time zone") + .HasColumnName("LastModificationTime"); + + b.Property("LastModifierId") + .HasColumnType("uuid") + .HasColumnName("LastModifierId"); + + b.Property("ReportData") + .IsRequired() + .HasColumnType("jsonb"); + + b.Property("TenantId") + .HasColumnType("uuid") + .HasColumnName("TenantId"); + + b.Property("UiAnchor") + .IsRequired() + .HasColumnType("text"); + + b.Property("WorksheetCorrelationId") + .HasColumnType("uuid"); + + b.Property("WorksheetCorrelationProvider") + .IsRequired() + .HasColumnType("text"); + + b.Property("WorksheetId") + .HasColumnType("uuid"); + + b.HasKey("Id"); + + b.ToTable("WorksheetInstances", "Flex"); + }); + + modelBuilder.Entity("Unity.Flex.Domain.WorksheetLinks.WorksheetLink", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("uuid"); + + b.Property("ConcurrencyStamp") + .IsConcurrencyToken() + .IsRequired() + .HasMaxLength(40) + .HasColumnType("character varying(40)") + .HasColumnName("ConcurrencyStamp"); + + b.Property("CorrelationId") + .HasColumnType("uuid"); + + b.Property("CorrelationProvider") + .IsRequired() + .HasColumnType("text"); + + b.Property("CreationTime") + .HasColumnType("timestamp without time zone") + .HasColumnName("CreationTime"); + + b.Property("CreatorId") + .HasColumnType("uuid") + .HasColumnName("CreatorId"); + + b.Property("ExtraProperties") + .IsRequired() + .HasColumnType("text") + .HasColumnName("ExtraProperties"); + + b.Property("LastModificationTime") + .HasColumnType("timestamp without time zone") + .HasColumnName("LastModificationTime"); + + b.Property("LastModifierId") + .HasColumnType("uuid") + .HasColumnName("LastModifierId"); + + b.Property("Order") + .HasColumnType("bigint"); + + b.Property("TenantId") + .HasColumnType("uuid") + .HasColumnName("TenantId"); + + b.Property("UiAnchor") + .IsRequired() + .HasColumnType("text"); + + b.Property("WorksheetId") + .HasColumnType("uuid"); + + b.HasKey("Id"); + + b.HasIndex("WorksheetId"); + + b.ToTable("WorksheetLinks", "Flex"); + }); + + modelBuilder.Entity("Unity.Flex.Domain.Worksheets.CustomField", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("uuid"); + + b.Property("CreationTime") + .HasColumnType("timestamp without time zone") + .HasColumnName("CreationTime"); + + b.Property("CreatorId") + .HasColumnType("uuid") + .HasColumnName("CreatorId"); + + b.Property("Definition") + .IsRequired() + .HasColumnType("jsonb"); + + b.Property("DeleterId") + .HasColumnType("uuid") + .HasColumnName("DeleterId"); + + b.Property("DeletionTime") + .HasColumnType("timestamp without time zone") + .HasColumnName("DeletionTime"); + + b.Property("Enabled") + .HasColumnType("boolean"); + + b.Property("IsDeleted") + .ValueGeneratedOnAdd() + .HasColumnType("boolean") + .HasDefaultValue(false) + .HasColumnName("IsDeleted"); + + b.Property("Key") + .IsRequired() + .HasColumnType("text"); + + b.Property("Label") + .IsRequired() + .HasColumnType("text"); + + b.Property("LastModificationTime") + .HasColumnType("timestamp without time zone") + .HasColumnName("LastModificationTime"); + + b.Property("LastModifierId") + .HasColumnType("uuid") + .HasColumnName("LastModifierId"); + + b.Property("Name") + .IsRequired() + .HasColumnType("text"); + + b.Property("Order") + .HasColumnType("bigint"); + + b.Property("SectionId") + .HasColumnType("uuid"); + + b.Property("TenantId") + .HasColumnType("uuid") + .HasColumnName("TenantId"); + + b.Property("Type") + .HasColumnType("integer"); + + b.HasKey("Id"); + + b.HasIndex("SectionId"); + + b.ToTable("CustomFields", "Flex"); + }); + + modelBuilder.Entity("Unity.Flex.Domain.Worksheets.Worksheet", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("uuid"); + + b.Property("ConcurrencyStamp") + .IsConcurrencyToken() + .IsRequired() + .HasMaxLength(40) + .HasColumnType("character varying(40)") + .HasColumnName("ConcurrencyStamp"); + + b.Property("CreationTime") + .HasColumnType("timestamp without time zone") + .HasColumnName("CreationTime"); + + b.Property("CreatorId") + .HasColumnType("uuid") + .HasColumnName("CreatorId"); + + b.Property("DeleterId") + .HasColumnType("uuid") + .HasColumnName("DeleterId"); + + b.Property("DeletionTime") + .HasColumnType("timestamp without time zone") + .HasColumnName("DeletionTime"); + + b.Property("ExtraProperties") + .IsRequired() + .HasColumnType("text") + .HasColumnName("ExtraProperties"); + + b.Property("IsDeleted") + .ValueGeneratedOnAdd() + .HasColumnType("boolean") + .HasDefaultValue(false) + .HasColumnName("IsDeleted"); + + b.Property("LastModificationTime") + .HasColumnType("timestamp without time zone") + .HasColumnName("LastModificationTime"); + + b.Property("LastModifierId") + .HasColumnType("uuid") + .HasColumnName("LastModifierId"); + + b.Property("Name") + .IsRequired() + .HasColumnType("text"); + + b.Property("Published") + .HasColumnType("boolean"); + + b.Property("ReportColumns") + .IsRequired() + .HasColumnType("text"); + + b.Property("ReportKeys") + .IsRequired() + .HasColumnType("text"); + + b.Property("ReportViewName") + .IsRequired() + .HasColumnType("text"); + + b.Property("TenantId") + .HasColumnType("uuid") + .HasColumnName("TenantId"); + + b.Property("Title") + .IsRequired() + .HasColumnType("text"); + + b.Property("Version") + .HasColumnType("bigint"); + + b.HasKey("Id"); + + b.ToTable("Worksheets", "Flex"); + }); + + modelBuilder.Entity("Unity.Flex.Domain.Worksheets.WorksheetSection", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("uuid"); + + b.Property("CreationTime") + .HasColumnType("timestamp without time zone") + .HasColumnName("CreationTime"); + + b.Property("CreatorId") + .HasColumnType("uuid") + .HasColumnName("CreatorId"); + + b.Property("DeleterId") + .HasColumnType("uuid") + .HasColumnName("DeleterId"); + + b.Property("DeletionTime") + .HasColumnType("timestamp without time zone") + .HasColumnName("DeletionTime"); + + b.Property("IsDeleted") + .ValueGeneratedOnAdd() + .HasColumnType("boolean") + .HasDefaultValue(false) + .HasColumnName("IsDeleted"); + + b.Property("LastModificationTime") + .HasColumnType("timestamp without time zone") + .HasColumnName("LastModificationTime"); + + b.Property("LastModifierId") + .HasColumnType("uuid") + .HasColumnName("LastModifierId"); + + b.Property("Name") + .IsRequired() + .HasColumnType("text"); + + b.Property("Order") + .HasColumnType("bigint"); + + b.Property("TenantId") + .HasColumnType("uuid") + .HasColumnName("TenantId"); + + b.Property("WorksheetId") + .HasColumnType("uuid"); + + b.HasKey("Id"); + + b.HasIndex("WorksheetId"); + + b.ToTable("WorksheetSections", "Flex"); + }); + + modelBuilder.Entity("Unity.GrantManager.Applications.Applicant", b => + { + b.Property("Id") + .HasColumnType("uuid"); + + b.Property("ApplicantName") + .IsRequired() + .HasMaxLength(600) + .HasColumnType("character varying(600)"); + + b.Property("ApproxNumberOfEmployees") + .HasColumnType("text"); + + b.Property("BusinessNumber") + .HasColumnType("text"); + + b.Property("ConcurrencyStamp") + .IsConcurrencyToken() + .IsRequired() + .HasMaxLength(40) + .HasColumnType("character varying(40)") + .HasColumnName("ConcurrencyStamp"); + + b.Property("CreationTime") + .HasColumnType("timestamp without time zone") + .HasColumnName("CreationTime"); + + b.Property("CreatorId") + .HasColumnType("uuid") + .HasColumnName("CreatorId"); + + b.Property("ElectoralDistrict") + .HasColumnType("text"); + + b.Property("ExtraProperties") + .IsRequired() + .HasColumnType("text") + .HasColumnName("ExtraProperties"); + + b.Property("FiscalDay") + .HasColumnType("integer"); + + b.Property("FiscalMonth") + .HasColumnType("text"); + + b.Property("IndigenousOrgInd") + .HasColumnType("text"); + + b.Property("IsDuplicated") + .HasColumnType("boolean"); + + b.Property("LastModificationTime") + .HasColumnType("timestamp without time zone") + .HasColumnName("LastModificationTime"); + + b.Property("LastModifierId") + .HasColumnType("uuid") + .HasColumnName("LastModifierId"); + + b.Property("MatchPercentage") + .HasColumnType("numeric"); + + b.Property("NonRegOrgName") + .HasColumnType("text"); + + b.Property("NonRegisteredBusinessName") + .HasColumnType("text"); + + b.Property("OrgName") + .HasColumnType("text"); + + b.Property("OrgNumber") + .HasColumnType("text"); + + b.Property("OrgStatus") + .HasColumnType("text"); + + b.Property("OrganizationSize") + .HasColumnType("text"); + + b.Property("OrganizationType") + .HasColumnType("text"); + + b.Property("RedStop") + .HasColumnType("boolean"); + + b.Property("Sector") + .HasColumnType("text"); + + b.Property("SectorSubSectorIndustryDesc") + .HasColumnType("text"); + + b.Property("SiteId") + .HasColumnType("uuid"); + + b.Property("StartedOperatingDate") + .HasColumnType("date"); + + b.Property("Status") + .HasColumnType("text"); + + b.Property("SubSector") + .HasColumnType("text"); + + b.Property("SupplierId") + .HasColumnType("uuid"); + + b.Property("TenantId") + .HasColumnType("uuid") + .HasColumnName("TenantId"); + + b.Property("UnityApplicantId") + .HasColumnType("text"); + + b.HasKey("Id"); + + b.HasIndex("ApplicantName"); + + b.ToTable("Applicants", (string)null); + }); + + modelBuilder.Entity("Unity.GrantManager.Applications.ApplicantAddress", b => + { + b.Property("Id") + .HasColumnType("uuid"); + + b.Property("AddressType") + .HasColumnType("integer"); + + b.Property("ApplicantId") + .HasColumnType("uuid"); + + b.Property("City") + .HasColumnType("text"); + + b.Property("ConcurrencyStamp") + .IsConcurrencyToken() + .IsRequired() + .HasMaxLength(40) + .HasColumnType("character varying(40)") + .HasColumnName("ConcurrencyStamp"); + + b.Property("Country") + .HasColumnType("text"); + + b.Property("CreationTime") + .HasColumnType("timestamp without time zone") + .HasColumnName("CreationTime"); + + b.Property("CreatorId") + .HasColumnType("uuid") + .HasColumnName("CreatorId"); + + b.Property("ExtraProperties") + .IsRequired() + .HasColumnType("text") + .HasColumnName("ExtraProperties"); + + b.Property("LastModificationTime") + .HasColumnType("timestamp without time zone") + .HasColumnName("LastModificationTime"); + + b.Property("LastModifierId") + .HasColumnType("uuid") + .HasColumnName("LastModifierId"); + + b.Property("Postal") + .HasColumnType("text"); + + b.Property("Province") + .HasColumnType("text"); + + b.Property("Street") + .HasColumnType("text"); + + b.Property("Street2") + .HasColumnType("text"); + + b.Property("TenantId") + .HasColumnType("uuid") + .HasColumnName("TenantId"); + + b.Property("Unit") + .HasColumnType("text"); + + b.HasKey("Id"); + + b.HasIndex("ApplicantId"); + + b.ToTable("ApplicantAddresses", (string)null); + }); + + modelBuilder.Entity("Unity.GrantManager.Applications.ApplicantAgent", b => + { + b.Property("Id") + .HasColumnType("uuid"); + + b.Property("ApplicantId") + .HasColumnType("uuid"); + + b.Property("ApplicationId") + .HasColumnType("uuid"); + + b.Property("BceidBusinessGuid") + .HasColumnType("uuid"); + + b.Property("BceidBusinessName") + .HasColumnType("text"); + + b.Property("BceidUserGuid") + .HasColumnType("uuid"); + + b.Property("BceidUserName") + .HasColumnType("text"); + + b.Property("ConcurrencyStamp") + .IsConcurrencyToken() + .IsRequired() + .HasMaxLength(40) + .HasColumnType("character varying(40)") + .HasColumnName("ConcurrencyStamp"); + + b.Property("ContactOrder") + .HasColumnType("integer"); + + b.Property("CreationTime") + .HasColumnType("timestamp without time zone") + .HasColumnName("CreationTime"); + + b.Property("CreatorId") + .HasColumnType("uuid") + .HasColumnName("CreatorId"); + + b.Property("Email") + .HasColumnType("text"); + + b.Property("ExtraProperties") + .IsRequired() + .HasColumnType("text") + .HasColumnName("ExtraProperties"); + + b.Property("IdentityEmail") + .HasColumnType("text"); + + b.Property("IdentityName") + .HasColumnType("text"); + + b.Property("IdentityProvider") + .HasColumnType("text"); + + b.Property("IsActive") + .HasColumnType("boolean"); + + b.Property("IsConfirmed") + .HasColumnType("boolean"); + + b.Property("LastModificationTime") + .HasColumnType("timestamp without time zone") + .HasColumnName("LastModificationTime"); + + b.Property("LastModifierId") + .HasColumnType("uuid") + .HasColumnName("LastModifierId"); + + b.Property("Name") + .IsRequired() + .HasColumnType("text"); + + b.Property("OidcSubUser") + .HasColumnType("text"); + + b.Property("Phone") + .HasColumnType("text"); + + b.Property("Phone2") + .HasColumnType("text"); + + b.Property("Phone2Extension") + .HasColumnType("text"); + + b.Property("PhoneExtension") + .HasColumnType("text"); + + b.Property("RoleForApplicant") + .IsRequired() + .HasColumnType("text"); + + b.Property("TenantId") + .HasColumnType("uuid") + .HasColumnName("TenantId"); + + b.Property("Title") + .HasColumnType("text"); + + b.HasKey("Id"); + + b.HasIndex("ApplicantId"); + + b.HasIndex("ApplicationId") + .IsUnique(); + + b.HasIndex("OidcSubUser"); + + b.ToTable("ApplicantAgents", (string)null); + }); + + modelBuilder.Entity("Unity.GrantManager.Applications.Application", b => + { + b.Property("Id") + .HasColumnType("uuid"); + + b.Property("Acquisition") + .HasColumnType("text"); + + b.Property("ApplicantId") + .HasColumnType("uuid"); + + b.Property("ApplicationFormId") + .HasColumnType("uuid"); + + b.Property("ApplicationStatusId") + .HasColumnType("uuid"); + + b.Property("ApprovedAmount") + .HasColumnType("numeric"); + + b.Property("AssessmentResultDate") + .HasColumnType("timestamp without time zone"); + + b.Property("AssessmentResultStatus") + .HasColumnType("text"); + + b.Property("AssessmentStartDate") + .HasColumnType("timestamp without time zone"); + + b.Property("City") + .HasColumnType("text"); + + b.Property("Community") + .HasColumnType("text"); + + b.Property("CommunityPopulation") + .HasColumnType("integer"); + + b.Property("ConcurrencyStamp") + .IsConcurrencyToken() + .IsRequired() + .HasMaxLength(40) + .HasColumnType("character varying(40)") + .HasColumnName("ConcurrencyStamp"); + + b.Property("ContractExecutionDate") + .HasColumnType("timestamp without time zone"); + + b.Property("ContractNumber") + .HasColumnType("text"); + + b.Property("CreationTime") + .HasColumnType("timestamp without time zone") + .HasColumnName("CreationTime"); + + b.Property("CreatorId") + .HasColumnType("uuid") + .HasColumnName("CreatorId"); + + b.Property("DeclineRational") + .HasColumnType("text"); + + b.Property("DeleterId") + .HasColumnType("uuid") + .HasColumnName("DeleterId"); + + b.Property("DeletionTime") + .HasColumnType("timestamp without time zone") + .HasColumnName("DeletionTime"); + + b.Property("DueDate") + .HasColumnType("timestamp without time zone"); + + b.Property("DueDiligenceStatus") + .HasColumnType("text"); + + b.Property("EconomicRegion") + .HasColumnType("text"); + + b.Property("ElectoralDistrict") + .HasColumnType("text"); + + b.Property("ExtraProperties") + .IsRequired() + .HasColumnType("text") + .HasColumnName("ExtraProperties"); + + b.Property("FinalDecisionDate") + .HasColumnType("timestamp without time zone"); + + b.Property("Forestry") + .HasColumnType("text"); + + b.Property("ForestryFocus") + .HasColumnType("text"); + + b.Property("IsDeleted") + .ValueGeneratedOnAdd() + .HasColumnType("boolean") + .HasDefaultValue(false) + .HasColumnName("IsDeleted"); + + b.Property("LastModificationTime") + .HasColumnType("timestamp without time zone") + .HasColumnName("LastModificationTime"); + + b.Property("LastModifierId") + .HasColumnType("uuid") + .HasColumnName("LastModifierId"); + + b.Property("LikelihoodOfFunding") + .HasColumnType("text"); + + b.Property("Notes") + .HasColumnType("text"); + + b.Property("NotificationDate") + .HasColumnType("timestamp without time zone"); + + b.Property("OwnerId") + .HasColumnType("uuid"); + + b.Property("Payload") + .HasColumnType("jsonb"); + + b.Property("PercentageTotalProjectBudget") + .HasColumnType("double precision"); + + b.Property("Place") + .HasColumnType("text"); + + b.Property("ProjectEndDate") + .HasColumnType("timestamp without time zone"); + + b.Property("ProjectFundingTotal") + .HasColumnType("numeric"); + + b.Property("ProjectName") + .IsRequired() + .HasMaxLength(255) + .HasColumnType("character varying(255)"); + + b.Property("ProjectStartDate") + .HasColumnType("timestamp without time zone"); + + b.Property("ProjectSummary") + .HasColumnType("text"); + + b.Property("ProposalDate") + .HasColumnType("timestamp without time zone"); + + b.Property("RecommendedAmount") + .HasColumnType("numeric"); + + b.Property("ReferenceNo") + .IsRequired() + .HasColumnType("text"); + + b.Property("RegionalDistrict") + .HasColumnType("text"); + + b.Property("RequestedAmount") + .HasColumnType("numeric"); + + b.Property("RiskRanking") + .HasColumnType("text"); + + b.Property("SigningAuthorityBusinessPhone") + .HasColumnType("text"); + + b.Property("SigningAuthorityCellPhone") + .HasColumnType("text"); + + b.Property("SigningAuthorityEmail") + .HasColumnType("text"); + + b.Property("SigningAuthorityFullName") + .HasColumnType("text"); + + b.Property("SigningAuthorityTitle") + .HasColumnType("text"); + + b.Property("SubStatus") + .HasColumnType("text"); + + b.Property("SubmissionDate") + .HasColumnType("timestamp without time zone"); + + b.Property("TenantId") + .HasColumnType("uuid") + .HasColumnName("TenantId"); + + b.Property("TotalProjectBudget") + .HasColumnType("numeric"); + + b.Property("TotalScore") + .HasColumnType("integer"); + + b.HasKey("Id"); + + b.HasIndex("ApplicantId"); + + b.HasIndex("ApplicationFormId"); + + b.HasIndex("ApplicationStatusId"); + + b.HasIndex("OwnerId"); + + b.ToTable("Applications", (string)null); + }); + + modelBuilder.Entity("Unity.GrantManager.Applications.ApplicationAssignment", b => + { + b.Property("Id") + .HasColumnType("uuid"); + + b.Property("ApplicationId") + .HasColumnType("uuid"); + + b.Property("AssigneeId") + .HasColumnType("uuid"); + + b.Property("ConcurrencyStamp") + .IsConcurrencyToken() + .IsRequired() + .HasMaxLength(40) + .HasColumnType("character varying(40)") + .HasColumnName("ConcurrencyStamp"); + + b.Property("CreationTime") + .HasColumnType("timestamp without time zone") + .HasColumnName("CreationTime"); + + b.Property("CreatorId") + .HasColumnType("uuid") + .HasColumnName("CreatorId"); + + b.Property("Duty") + .HasColumnType("text"); + + b.Property("ExtraProperties") + .IsRequired() + .HasColumnType("text") + .HasColumnName("ExtraProperties"); + + b.Property("LastModificationTime") + .HasColumnType("timestamp without time zone") + .HasColumnName("LastModificationTime"); + + b.Property("LastModifierId") + .HasColumnType("uuid") + .HasColumnName("LastModifierId"); + + b.Property("TenantId") + .HasColumnType("uuid") + .HasColumnName("TenantId"); + + b.HasKey("Id"); + + b.HasIndex("ApplicationId"); + + b.HasIndex("AssigneeId"); + + b.ToTable("ApplicationAssignments", (string)null); + }); + + modelBuilder.Entity("Unity.GrantManager.Applications.ApplicationAttachment", b => + { + b.Property("Id") + .HasColumnType("uuid"); + + b.Property("ApplicationId") + .HasColumnType("uuid"); + + b.Property("ConcurrencyStamp") + .IsConcurrencyToken() + .IsRequired() + .HasMaxLength(40) + .HasColumnType("character varying(40)") + .HasColumnName("ConcurrencyStamp"); + + b.Property("CreationTime") + .HasColumnType("timestamp without time zone") + .HasColumnName("CreationTime"); + + b.Property("CreatorId") + .HasColumnType("uuid") + .HasColumnName("CreatorId"); + + b.Property("DisplayName") + .HasMaxLength(1024) + .HasColumnType("character varying(1024)"); + + b.Property("ExtraProperties") + .IsRequired() + .HasColumnType("text") + .HasColumnName("ExtraProperties"); + + b.Property("FileName") + .HasColumnType("text"); + + b.Property("LastModificationTime") + .HasColumnType("timestamp without time zone") + .HasColumnName("LastModificationTime"); + + b.Property("LastModifierId") + .HasColumnType("uuid") + .HasColumnName("LastModifierId"); + + b.Property("S3ObjectKey") + .IsRequired() + .HasColumnType("text"); + + b.Property("TenantId") + .HasColumnType("uuid") + .HasColumnName("TenantId"); + + b.Property("Time") + .HasColumnType("timestamp without time zone"); + + b.Property("UserId") + .HasColumnType("uuid"); + + b.HasKey("Id"); + + b.HasIndex("ApplicationId"); + + b.ToTable("ApplicationAttachments", (string)null); + }); + + modelBuilder.Entity("Unity.GrantManager.Applications.ApplicationChefsFileAttachment", b => + { + b.Property("Id") + .HasColumnType("uuid"); + + b.Property("ApplicationId") + .HasColumnType("uuid"); + + b.Property("ChefsFileId") + .HasColumnType("text"); + + b.Property("ChefsSumbissionId") + .HasColumnType("text"); + + b.Property("ConcurrencyStamp") + .IsConcurrencyToken() + .IsRequired() + .HasMaxLength(40) + .HasColumnType("character varying(40)") + .HasColumnName("ConcurrencyStamp"); + + b.Property("CreationTime") + .HasColumnType("timestamp without time zone") + .HasColumnName("CreationTime"); + + b.Property("CreatorId") + .HasColumnType("uuid") + .HasColumnName("CreatorId"); + + b.Property("DisplayName") + .HasMaxLength(1024) + .HasColumnType("character varying(1024)"); + + b.Property("ExtraProperties") + .IsRequired() + .HasColumnType("text") + .HasColumnName("ExtraProperties"); + + b.Property("FileName") + .HasColumnType("text"); + + b.Property("LastModificationTime") + .HasColumnType("timestamp without time zone") + .HasColumnName("LastModificationTime"); + + b.Property("LastModifierId") + .HasColumnType("uuid") + .HasColumnName("LastModifierId"); + + b.Property("TenantId") + .HasColumnType("uuid") + .HasColumnName("TenantId"); + + b.HasKey("Id"); + + b.HasIndex("ApplicationId"); + + b.ToTable("ApplicationChefsFileAttachments", (string)null); + }); + + modelBuilder.Entity("Unity.GrantManager.Applications.ApplicationContact", b => + { + b.Property("Id") + .HasColumnType("uuid"); + + b.Property("ApplicationId") + .HasColumnType("uuid"); + + b.Property("ConcurrencyStamp") + .IsConcurrencyToken() + .IsRequired() + .HasMaxLength(40) + .HasColumnType("character varying(40)") + .HasColumnName("ConcurrencyStamp"); + + b.Property("ContactEmail") + .HasColumnType("text"); + + b.Property("ContactFullName") + .IsRequired() + .HasColumnType("text"); + + b.Property("ContactMobilePhone") + .HasColumnType("text"); + + b.Property("ContactTitle") + .HasColumnType("text"); + + b.Property("ContactType") + .IsRequired() + .HasColumnType("text"); + + b.Property("ContactWorkPhone") + .HasColumnType("text"); + + b.Property("CreationTime") + .HasColumnType("timestamp without time zone") + .HasColumnName("CreationTime"); + + b.Property("CreatorId") + .HasColumnType("uuid") + .HasColumnName("CreatorId"); + + b.Property("ExtraProperties") + .IsRequired() + .HasColumnType("text") + .HasColumnName("ExtraProperties"); + + b.Property("LastModificationTime") + .HasColumnType("timestamp without time zone") + .HasColumnName("LastModificationTime"); + + b.Property("LastModifierId") + .HasColumnType("uuid") + .HasColumnName("LastModifierId"); + + b.Property("TenantId") + .HasColumnType("uuid") + .HasColumnName("TenantId"); + + b.HasKey("Id"); + + b.HasIndex("ApplicationId"); + + b.ToTable("ApplicationContact", (string)null); + }); + + modelBuilder.Entity("Unity.GrantManager.Applications.ApplicationForm", b => + { + b.Property("Id") + .HasColumnType("uuid"); + + b.Property("ApiKey") + .HasColumnType("text"); + + b.Property("ApplicationFormDescription") + .HasColumnType("text"); + + b.Property("ApplicationFormName") + .IsRequired() + .HasMaxLength(255) + .HasColumnType("character varying(255)"); + + b.Property("AttemptedConnectionDate") + .HasColumnType("timestamp without time zone"); + + b.Property("AvailableChefsFields") + .HasColumnType("text"); + + b.Property("Category") + .HasColumnType("text"); + + b.Property("ChefsApplicationFormGuid") + .HasColumnType("text"); + + b.Property("ChefsCriteriaFormGuid") + .HasColumnType("text"); + + b.Property("ConcurrencyStamp") + .IsConcurrencyToken() + .IsRequired() + .HasMaxLength(40) + .HasColumnType("character varying(40)") + .HasColumnName("ConcurrencyStamp"); + + b.Property("ConnectionHttpStatus") + .HasColumnType("text"); + + b.Property("CreationTime") + .HasColumnType("timestamp without time zone") + .HasColumnName("CreationTime"); + + b.Property("CreatorId") + .HasColumnType("uuid") + .HasColumnName("CreatorId"); + + b.Property("DeleterId") + .HasColumnType("uuid") + .HasColumnName("DeleterId"); + + b.Property("DeletionTime") + .HasColumnType("timestamp without time zone") + .HasColumnName("DeletionTime"); + + b.Property("ElectoralDistrictAddressType") + .HasColumnType("integer"); + + b.Property("ExtraProperties") + .IsRequired() + .HasColumnType("text") + .HasColumnName("ExtraProperties"); + + b.Property("IntakeId") + .HasColumnType("uuid"); + + b.Property("IsDeleted") + .ValueGeneratedOnAdd() + .HasColumnType("boolean") + .HasDefaultValue(false) + .HasColumnName("IsDeleted"); + + b.Property("IsDirectApproval") + .HasColumnType("boolean"); + + b.Property("LastModificationTime") + .HasColumnType("timestamp without time zone") + .HasColumnName("LastModificationTime"); + + b.Property("LastModifierId") + .HasColumnType("uuid") + .HasColumnName("LastModifierId"); + + b.Property("Payable") + .HasColumnType("boolean"); + + b.Property("RenderFormIoToHtml") + .HasColumnType("boolean"); + + b.Property("ScoresheetId") + .HasColumnType("uuid"); + + b.Property("TenantId") + .HasColumnType("uuid") + .HasColumnName("TenantId"); + + b.Property("Version") + .HasColumnType("integer"); + + b.HasKey("Id"); + + b.HasIndex("IntakeId"); + + b.ToTable("ApplicationForms", (string)null); + }); + + modelBuilder.Entity("Unity.GrantManager.Applications.ApplicationFormSubmission", b => + { + b.Property("Id") + .HasColumnType("uuid"); + + b.Property("ApplicantId") + .HasColumnType("uuid"); + + b.Property("ApplicationFormId") + .HasColumnType("uuid"); + + b.Property("ApplicationFormVersionId") + .HasColumnType("uuid"); + + b.Property("ApplicationId") + .HasColumnType("uuid"); + + b.Property("ChefsSubmissionGuid") + .IsRequired() + .HasColumnType("text"); + + b.Property("ConcurrencyStamp") + .IsConcurrencyToken() + .IsRequired() + .HasMaxLength(40) + .HasColumnType("character varying(40)") + .HasColumnName("ConcurrencyStamp"); + + b.Property("CreationTime") + .HasColumnType("timestamp without time zone") + .HasColumnName("CreationTime"); + + b.Property("CreatorId") + .HasColumnType("uuid") + .HasColumnName("CreatorId"); + + b.Property("ExtraProperties") + .IsRequired() + .HasColumnType("text") + .HasColumnName("ExtraProperties"); + + b.Property("FormVersionId") + .HasColumnType("uuid"); + + b.Property("LastModificationTime") + .HasColumnType("timestamp without time zone") + .HasColumnName("LastModificationTime"); + + b.Property("LastModifierId") + .HasColumnType("uuid") + .HasColumnName("LastModifierId"); + + b.Property("OidcSub") + .IsRequired() + .HasColumnType("text"); + + b.Property("RenderedHTML") + .HasColumnType("text"); + + b.Property("ReportData") + .IsRequired() + .HasColumnType("jsonb"); + + b.Property("Submission") + .IsRequired() + .HasColumnType("jsonb"); + + b.Property("TenantId") + .HasColumnType("uuid") + .HasColumnName("TenantId"); + + b.HasKey("Id"); + + b.HasIndex("ApplicantId"); + + b.HasIndex("ApplicationFormId"); + + b.ToTable("ApplicationFormSubmissions", (string)null); + }); + + modelBuilder.Entity("Unity.GrantManager.Applications.ApplicationFormVersion", b => + { + b.Property("Id") + .HasColumnType("uuid"); + + b.Property("ApplicationFormId") + .HasColumnType("uuid"); + + b.Property("AvailableChefsFields") + .HasColumnType("text"); + + b.Property("ChefsApplicationFormGuid") + .HasColumnType("text"); + + b.Property("ChefsFormVersionGuid") + .HasColumnType("text"); + + b.Property("ConcurrencyStamp") + .IsConcurrencyToken() + .IsRequired() + .HasMaxLength(40) + .HasColumnType("character varying(40)") + .HasColumnName("ConcurrencyStamp"); + + b.Property("CreationTime") + .HasColumnType("timestamp without time zone") + .HasColumnName("CreationTime"); + + b.Property("CreatorId") + .HasColumnType("uuid") + .HasColumnName("CreatorId"); + + b.Property("ExtraProperties") + .IsRequired() + .HasColumnType("text") + .HasColumnName("ExtraProperties"); + + b.Property("FormSchema") + .HasColumnType("jsonb"); + + b.Property("LastModificationTime") + .HasColumnType("timestamp without time zone") + .HasColumnName("LastModificationTime"); + + b.Property("LastModifierId") + .HasColumnType("uuid") + .HasColumnName("LastModifierId"); + + b.Property("Published") + .HasColumnType("boolean"); + + b.Property("ReportColumns") + .IsRequired() + .HasColumnType("text"); + + b.Property("ReportKeys") + .IsRequired() + .HasColumnType("text"); + + b.Property("ReportViewName") + .IsRequired() + .HasColumnType("text"); + + b.Property("SubmissionHeaderMapping") + .HasColumnType("text"); + + b.Property("TenantId") + .HasColumnType("uuid") + .HasColumnName("TenantId"); + + b.Property("Version") + .HasColumnType("integer"); + + b.HasKey("Id"); + + b.HasIndex("ApplicationFormId"); + + b.ToTable("ApplicationFormVersion", (string)null); + }); + + modelBuilder.Entity("Unity.GrantManager.Applications.ApplicationLink", b => + { + b.Property("Id") + .HasColumnType("uuid"); + + b.Property("ApplicationId") + .HasColumnType("uuid"); + + b.Property("ConcurrencyStamp") + .IsConcurrencyToken() + .IsRequired() + .HasMaxLength(40) + .HasColumnType("character varying(40)") + .HasColumnName("ConcurrencyStamp"); + + b.Property("CreationTime") + .HasColumnType("timestamp without time zone") + .HasColumnName("CreationTime"); + + b.Property("CreatorId") + .HasColumnType("uuid") + .HasColumnName("CreatorId"); + + b.Property("ExtraProperties") + .IsRequired() + .HasColumnType("text") + .HasColumnName("ExtraProperties"); + + b.Property("LastModificationTime") + .HasColumnType("timestamp without time zone") + .HasColumnName("LastModificationTime"); + + b.Property("LastModifierId") + .HasColumnType("uuid") + .HasColumnName("LastModifierId"); + + b.Property("LinkedApplicationId") + .HasColumnType("uuid"); + + b.Property("TenantId") + .HasColumnType("uuid") + .HasColumnName("TenantId"); + + b.HasKey("Id"); + + b.HasIndex("ApplicationId"); + + b.ToTable("ApplicationLinks", (string)null); + }); + + modelBuilder.Entity("Unity.GrantManager.Applications.ApplicationStatus", b => + { + b.Property("Id") + .HasColumnType("uuid"); + + b.Property("ConcurrencyStamp") + .IsConcurrencyToken() + .IsRequired() + .HasMaxLength(40) + .HasColumnType("character varying(40)") + .HasColumnName("ConcurrencyStamp"); + + b.Property("CreationTime") + .HasColumnType("timestamp without time zone") + .HasColumnName("CreationTime"); + + b.Property("CreatorId") + .HasColumnType("uuid") + .HasColumnName("CreatorId"); + + b.Property("ExternalStatus") + .IsRequired() + .HasColumnType("text"); + + b.Property("ExtraProperties") + .IsRequired() + .HasColumnType("text") + .HasColumnName("ExtraProperties"); + + b.Property("InternalStatus") + .IsRequired() + .HasColumnType("text"); + + b.Property("LastModificationTime") + .HasColumnType("timestamp without time zone") + .HasColumnName("LastModificationTime"); + + b.Property("LastModifierId") + .HasColumnType("uuid") + .HasColumnName("LastModifierId"); + + b.Property("StatusCode") + .IsRequired() + .HasMaxLength(250) + .HasColumnType("character varying(250)"); + + b.Property("TenantId") + .HasColumnType("uuid") + .HasColumnName("TenantId"); + + b.HasKey("Id"); + + b.HasIndex("StatusCode") + .IsUnique(); + + b.ToTable("ApplicationStatuses", (string)null); + }); + + modelBuilder.Entity("Unity.GrantManager.Applications.ApplicationTags", b => + { + b.Property("Id") + .HasColumnType("uuid"); + + b.Property("ApplicationId") + .HasColumnType("uuid"); + + b.Property("ConcurrencyStamp") + .IsConcurrencyToken() + .IsRequired() + .HasMaxLength(40) + .HasColumnType("character varying(40)") + .HasColumnName("ConcurrencyStamp"); + + b.Property("CreationTime") + .HasColumnType("timestamp without time zone") + .HasColumnName("CreationTime"); + + b.Property("CreatorId") + .HasColumnType("uuid") + .HasColumnName("CreatorId"); + + b.Property("ExtraProperties") + .IsRequired() + .HasColumnType("text") + .HasColumnName("ExtraProperties"); + + b.Property("LastModificationTime") + .HasColumnType("timestamp without time zone") + .HasColumnName("LastModificationTime"); + + b.Property("LastModifierId") + .HasColumnType("uuid") + .HasColumnName("LastModifierId"); + + b.Property("TagId") + .HasColumnType("uuid"); + + b.Property("TenantId") + .HasColumnType("uuid") + .HasColumnName("TenantId"); + + b.Property("Text") + .IsRequired() + .HasColumnType("text"); + + b.HasKey("Id"); + + b.HasIndex("ApplicationId"); + + b.HasIndex("TagId"); + + b.ToTable("ApplicationTags", (string)null); + }); + + modelBuilder.Entity("Unity.GrantManager.Applications.AssessmentAttachment", b => + { + b.Property("Id") + .HasColumnType("uuid"); + + b.Property("AssessmentId") + .HasColumnType("uuid"); + + b.Property("ConcurrencyStamp") + .IsConcurrencyToken() + .IsRequired() + .HasMaxLength(40) + .HasColumnType("character varying(40)") + .HasColumnName("ConcurrencyStamp"); + + b.Property("CreationTime") + .HasColumnType("timestamp without time zone") + .HasColumnName("CreationTime"); + + b.Property("CreatorId") + .HasColumnType("uuid") + .HasColumnName("CreatorId"); + + b.Property("DisplayName") + .HasMaxLength(1024) + .HasColumnType("character varying(1024)"); + + b.Property("ExtraProperties") + .IsRequired() + .HasColumnType("text") + .HasColumnName("ExtraProperties"); + + b.Property("FileName") + .HasColumnType("text"); + + b.Property("LastModificationTime") + .HasColumnType("timestamp without time zone") + .HasColumnName("LastModificationTime"); + + b.Property("LastModifierId") + .HasColumnType("uuid") + .HasColumnName("LastModifierId"); + + b.Property("S3ObjectKey") + .IsRequired() + .HasColumnType("text"); + + b.Property("TenantId") + .HasColumnType("uuid") + .HasColumnName("TenantId"); + + b.Property("Time") + .HasColumnType("timestamp without time zone"); + + b.Property("UserId") + .HasColumnType("uuid"); + + b.HasKey("Id"); + + b.HasIndex("AssessmentId"); + + b.ToTable("AssessmentAttachments", (string)null); + }); + + modelBuilder.Entity("Unity.GrantManager.Assessments.Assessment", b => + { + b.Property("Id") + .HasColumnType("uuid"); + + b.Property("ApplicationId") + .HasColumnType("uuid"); + + b.Property("ApprovalRecommended") + .HasColumnType("boolean"); + + b.Property("AssessorId") + .HasColumnType("uuid"); + + b.Property("CleanGrowth") + .HasColumnType("integer"); + + b.Property("ConcurrencyStamp") + .IsConcurrencyToken() + .IsRequired() + .HasMaxLength(40) + .HasColumnType("character varying(40)") + .HasColumnName("ConcurrencyStamp"); + + b.Property("CreationTime") + .HasColumnType("timestamp without time zone") + .HasColumnName("CreationTime"); + + b.Property("CreatorId") + .HasColumnType("uuid") + .HasColumnName("CreatorId"); + + b.Property("EconomicImpact") + .HasColumnType("integer"); + + b.Property("EndDate") + .HasColumnType("timestamp without time zone"); + + b.Property("ExtraProperties") + .IsRequired() + .HasColumnType("text") + .HasColumnName("ExtraProperties"); + + b.Property("FinancialAnalysis") + .HasColumnType("integer"); + + b.Property("InclusiveGrowth") + .HasColumnType("integer"); + + b.Property("IsComplete") + .HasColumnType("boolean"); + + b.Property("LastModificationTime") + .HasColumnType("timestamp without time zone") + .HasColumnName("LastModificationTime"); + + b.Property("LastModifierId") + .HasColumnType("uuid") + .HasColumnName("LastModifierId"); + + b.Property("Status") + .IsRequired() + .HasMaxLength(50) + .HasColumnType("character varying(50)"); + + b.Property("TenantId") + .HasColumnType("uuid") + .HasColumnName("TenantId"); + + b.HasKey("Id"); + + b.HasIndex("ApplicationId"); + + b.HasIndex("AssessorId"); + + b.ToTable("Assessments", (string)null); + }); + + modelBuilder.Entity("Unity.GrantManager.Comments.ApplicationComment", b => + { + b.Property("Id") + .HasColumnType("uuid"); + + b.Property("ApplicationId") + .HasColumnType("uuid"); + + b.Property("Comment") + .IsRequired() + .HasColumnType("text"); + + b.Property("CommenterId") + .HasColumnType("uuid"); + + b.Property("ConcurrencyStamp") + .IsConcurrencyToken() + .IsRequired() + .HasMaxLength(40) + .HasColumnType("character varying(40)") + .HasColumnName("ConcurrencyStamp"); + + b.Property("CreationTime") + .HasColumnType("timestamp without time zone") + .HasColumnName("CreationTime"); + + b.Property("CreatorId") + .HasColumnType("uuid") + .HasColumnName("CreatorId"); + + b.Property("ExtraProperties") + .IsRequired() + .HasColumnType("text") + .HasColumnName("ExtraProperties"); + + b.Property("LastModificationTime") + .HasColumnType("timestamp without time zone") + .HasColumnName("LastModificationTime"); + + b.Property("LastModifierId") + .HasColumnType("uuid") + .HasColumnName("LastModifierId"); + + b.Property("TenantId") + .HasColumnType("uuid") + .HasColumnName("TenantId"); + + b.HasKey("Id"); + + b.HasIndex("ApplicationId"); + + b.HasIndex("CommenterId"); + + b.ToTable("ApplicationComments", (string)null); + }); + + modelBuilder.Entity("Unity.GrantManager.Comments.AssessmentComment", b => + { + b.Property("Id") + .HasColumnType("uuid"); + + b.Property("AssessmentId") + .HasColumnType("uuid"); + + b.Property("Comment") + .IsRequired() + .HasColumnType("text"); + + b.Property("CommenterId") + .HasColumnType("uuid"); + + b.Property("ConcurrencyStamp") + .IsConcurrencyToken() + .IsRequired() + .HasMaxLength(40) + .HasColumnType("character varying(40)") + .HasColumnName("ConcurrencyStamp"); + + b.Property("CreationTime") + .HasColumnType("timestamp without time zone") + .HasColumnName("CreationTime"); + + b.Property("CreatorId") + .HasColumnType("uuid") + .HasColumnName("CreatorId"); + + b.Property("ExtraProperties") + .IsRequired() + .HasColumnType("text") + .HasColumnName("ExtraProperties"); + + b.Property("LastModificationTime") + .HasColumnType("timestamp without time zone") + .HasColumnName("LastModificationTime"); + + b.Property("LastModifierId") + .HasColumnType("uuid") + .HasColumnName("LastModifierId"); + + b.Property("TenantId") + .HasColumnType("uuid") + .HasColumnName("TenantId"); + + b.HasKey("Id"); + + b.HasIndex("AssessmentId"); + + b.HasIndex("CommenterId"); + + b.ToTable("AssessmentComments", (string)null); + }); + + modelBuilder.Entity("Unity.GrantManager.GlobalTag.Tag", b => + { + b.Property("Id") + .HasColumnType("uuid"); + + b.Property("ConcurrencyStamp") + .IsConcurrencyToken() + .IsRequired() + .HasMaxLength(40) + .HasColumnType("character varying(40)") + .HasColumnName("ConcurrencyStamp"); + + b.Property("CreationTime") + .HasColumnType("timestamp without time zone") + .HasColumnName("CreationTime"); + + b.Property("CreatorId") + .HasColumnType("uuid") + .HasColumnName("CreatorId"); + + b.Property("ExtraProperties") + .IsRequired() + .HasColumnType("text") + .HasColumnName("ExtraProperties"); + + b.Property("LastModificationTime") + .HasColumnType("timestamp without time zone") + .HasColumnName("LastModificationTime"); + + b.Property("LastModifierId") + .HasColumnType("uuid") + .HasColumnName("LastModifierId"); + + b.Property("Name") + .IsRequired() + .HasColumnType("text"); + + b.Property("TenantId") + .HasColumnType("uuid") + .HasColumnName("TenantId"); + + b.HasKey("Id"); + + b.ToTable("Tags", (string)null); + }); + + modelBuilder.Entity("Unity.GrantManager.Identity.Person", b => + { + b.Property("Id") + .HasColumnType("uuid"); + + b.Property("Badge") + .IsRequired() + .HasColumnType("text"); + + b.Property("ConcurrencyStamp") + .IsConcurrencyToken() + .IsRequired() + .HasMaxLength(40) + .HasColumnType("character varying(40)") + .HasColumnName("ConcurrencyStamp"); + + b.Property("CreationTime") + .HasColumnType("timestamp without time zone") + .HasColumnName("CreationTime"); + + b.Property("CreatorId") + .HasColumnType("uuid") + .HasColumnName("CreatorId"); + + b.Property("ExtraProperties") + .IsRequired() + .HasColumnType("text") + .HasColumnName("ExtraProperties"); + + b.Property("FullName") + .IsRequired() + .HasColumnType("text"); + + b.Property("LastModificationTime") + .HasColumnType("timestamp without time zone") + .HasColumnName("LastModificationTime"); + + b.Property("LastModifierId") + .HasColumnType("uuid") + .HasColumnName("LastModifierId"); + + b.Property("OidcDisplayName") + .IsRequired() + .HasColumnType("text"); + + b.Property("OidcSub") + .IsRequired() + .HasColumnType("text"); + + b.Property("TenantId") + .HasColumnType("uuid") + .HasColumnName("TenantId"); + + b.HasKey("Id"); + + b.HasIndex("OidcSub"); + + b.ToTable("Persons", (string)null); + }); + + modelBuilder.Entity("Unity.GrantManager.Intakes.Intake", b => + { + b.Property("Id") + .HasColumnType("uuid"); + + b.Property("Budget") + .HasColumnType("double precision"); + + b.Property("ConcurrencyStamp") + .IsConcurrencyToken() + .IsRequired() + .HasMaxLength(40) + .HasColumnType("character varying(40)") + .HasColumnName("ConcurrencyStamp"); + + b.Property("CreationTime") + .HasColumnType("timestamp without time zone") + .HasColumnName("CreationTime"); + + b.Property("CreatorId") + .HasColumnType("uuid") + .HasColumnName("CreatorId"); + + b.Property("DeleterId") + .HasColumnType("uuid") + .HasColumnName("DeleterId"); + + b.Property("DeletionTime") + .HasColumnType("timestamp without time zone") + .HasColumnName("DeletionTime"); + + b.Property("EndDate") + .HasColumnType("timestamp without time zone"); + + b.Property("ExtraProperties") + .IsRequired() + .HasColumnType("text") + .HasColumnName("ExtraProperties"); + + b.Property("IntakeName") + .IsRequired() + .HasMaxLength(255) + .HasColumnType("character varying(255)"); + + b.Property("IsDeleted") + .ValueGeneratedOnAdd() + .HasColumnType("boolean") + .HasDefaultValue(false) + .HasColumnName("IsDeleted"); + + b.Property("LastModificationTime") + .HasColumnType("timestamp without time zone") + .HasColumnName("LastModificationTime"); + + b.Property("LastModifierId") + .HasColumnType("uuid") + .HasColumnName("LastModifierId"); + + b.Property("StartDate") + .HasColumnType("timestamp without time zone"); + + b.Property("TenantId") + .HasColumnType("uuid") + .HasColumnName("TenantId"); + + b.HasKey("Id"); + + b.ToTable("Intakes", (string)null); + }); + + modelBuilder.Entity("Unity.Notifications.Emails.EmailLog", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("uuid"); + + b.Property("ApplicantId") + .HasColumnType("uuid"); + + b.Property("ApplicationId") + .HasColumnType("uuid"); + + b.Property("AssessmentId") + .HasColumnType("uuid"); + + b.Property("BCC") + .IsRequired() + .HasColumnType("text"); + + b.Property("Body") + .IsRequired() + .HasColumnType("text"); + + b.Property("BodyType") + .IsRequired() + .HasColumnType("text"); + + b.Property("CC") + .IsRequired() + .HasColumnType("text"); + + b.Property("ChesMsgId") + .HasColumnType("uuid"); + + b.Property("ChesResponse") + .IsRequired() + .HasColumnType("text"); + + b.Property("ChesStatus") + .IsRequired() + .HasColumnType("text"); + + b.Property("ConcurrencyStamp") + .IsConcurrencyToken() + .IsRequired() + .HasMaxLength(40) + .HasColumnType("character varying(40)") + .HasColumnName("ConcurrencyStamp"); + + b.Property("CreationTime") + .HasColumnType("timestamp without time zone") + .HasColumnName("CreationTime"); + + b.Property("CreatorId") + .HasColumnType("uuid") + .HasColumnName("CreatorId"); + + b.Property("ExtraProperties") + .IsRequired() + .HasColumnType("text") + .HasColumnName("ExtraProperties"); + + b.Property("FromAddress") + .IsRequired() + .HasColumnType("text"); + + b.Property("LastModificationTime") + .HasColumnType("timestamp without time zone") + .HasColumnName("LastModificationTime"); + + b.Property("LastModifierId") + .HasColumnType("uuid") + .HasColumnName("LastModifierId"); + + b.Property("Priority") + .IsRequired() + .HasColumnType("text"); + + b.Property("RetryAttempts") + .HasColumnType("integer"); + + b.Property("SendOnDateTime") + .HasColumnType("timestamp without time zone"); + + b.Property("SentDateTime") + .HasColumnType("timestamp without time zone"); + + b.Property("Status") + .IsRequired() + .HasColumnType("text"); + + b.Property("Subject") + .IsRequired() + .HasColumnType("text"); + + b.Property("Tag") + .IsRequired() + .HasColumnType("text"); + + b.Property("TemplateName") + .IsRequired() + .HasColumnType("text"); + + b.Property("TenantId") + .HasColumnType("uuid") + .HasColumnName("TenantId"); + + b.Property("ToAddress") + .IsRequired() + .HasColumnType("text"); + + b.HasKey("Id"); + + b.ToTable("EmailLogs", "Notifications"); + }); + + modelBuilder.Entity("Unity.Notifications.Templates.EmailTemplate", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("uuid"); + + b.Property("BodyHTML") + .IsRequired() + .HasColumnType("text"); + + b.Property("BodyText") + .IsRequired() + .HasColumnType("text"); + + b.Property("ConcurrencyStamp") + .IsConcurrencyToken() + .IsRequired() + .HasMaxLength(40) + .HasColumnType("character varying(40)") + .HasColumnName("ConcurrencyStamp"); + + b.Property("CreationTime") + .HasColumnType("timestamp without time zone") + .HasColumnName("CreationTime"); + + b.Property("CreatorId") + .HasColumnType("uuid") + .HasColumnName("CreatorId"); + + b.Property("DeleterId") + .HasColumnType("uuid") + .HasColumnName("DeleterId"); + + b.Property("DeletionTime") + .HasColumnType("timestamp without time zone") + .HasColumnName("DeletionTime"); + + b.Property("Description") + .IsRequired() + .HasColumnType("text"); + + b.Property("ExtraProperties") + .IsRequired() + .HasColumnType("text") + .HasColumnName("ExtraProperties"); + + b.Property("IsDeleted") + .ValueGeneratedOnAdd() + .HasColumnType("boolean") + .HasDefaultValue(false) + .HasColumnName("IsDeleted"); + + b.Property("LastModificationTime") + .HasColumnType("timestamp without time zone") + .HasColumnName("LastModificationTime"); + + b.Property("LastModifierId") + .HasColumnType("uuid") + .HasColumnName("LastModifierId"); + + b.Property("Name") + .IsRequired() + .HasColumnType("text"); + + b.Property("SendFrom") + .IsRequired() + .HasColumnType("text"); + + b.Property("Subject") + .IsRequired() + .HasColumnType("text"); + + b.Property("TenantId") + .HasColumnType("uuid") + .HasColumnName("TenantId"); + + b.HasKey("Id"); + + b.ToTable("EmailTemplates", "Notifications"); + }); + + modelBuilder.Entity("Unity.Notifications.Templates.Subscriber", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("uuid"); + + b.Property("ConcurrencyStamp") + .IsConcurrencyToken() + .IsRequired() + .HasMaxLength(40) + .HasColumnType("character varying(40)") + .HasColumnName("ConcurrencyStamp"); + + b.Property("CreationTime") + .HasColumnType("timestamp without time zone") + .HasColumnName("CreationTime"); + + b.Property("CreatorId") + .HasColumnType("uuid") + .HasColumnName("CreatorId"); + + b.Property("Email") + .IsRequired() + .HasColumnType("text"); + + b.Property("ExtraProperties") + .IsRequired() + .HasColumnType("text") + .HasColumnName("ExtraProperties"); + + b.Property("FirstName") + .IsRequired() + .HasColumnType("text"); + + b.Property("LastModificationTime") + .HasColumnType("timestamp without time zone") + .HasColumnName("LastModificationTime"); + + b.Property("LastModifierId") + .HasColumnType("uuid") + .HasColumnName("LastModifierId"); + + b.Property("LastName") + .IsRequired() + .HasColumnType("text"); + + b.Property("TenantId") + .HasColumnType("uuid") + .HasColumnName("TenantId"); + + b.HasKey("Id"); + + b.ToTable("Subscribers", "Notifications"); + }); + + modelBuilder.Entity("Unity.Notifications.Templates.SubscriptionGroup", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("uuid"); + + b.Property("ConcurrencyStamp") + .IsConcurrencyToken() + .IsRequired() + .HasMaxLength(40) + .HasColumnType("character varying(40)") + .HasColumnName("ConcurrencyStamp"); + + b.Property("CreationTime") + .HasColumnType("timestamp without time zone") + .HasColumnName("CreationTime"); + + b.Property("CreatorId") + .HasColumnType("uuid") + .HasColumnName("CreatorId"); + + b.Property("ExtraProperties") + .IsRequired() + .HasColumnType("text") + .HasColumnName("ExtraProperties"); + + b.Property("LastModificationTime") + .HasColumnType("timestamp without time zone") + .HasColumnName("LastModificationTime"); + + b.Property("LastModifierId") + .HasColumnType("uuid") + .HasColumnName("LastModifierId"); + + b.Property("Name") + .IsRequired() + .HasColumnType("text"); + + b.Property("TenantId") + .HasColumnType("uuid") + .HasColumnName("TenantId"); + + b.HasKey("Id"); + + b.ToTable("SubscriptionGroups", "Notifications"); + }); + + modelBuilder.Entity("Unity.Notifications.Templates.SubscriptionGroupSubscription", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("uuid"); + + b.Property("ConcurrencyStamp") + .IsConcurrencyToken() + .IsRequired() + .HasMaxLength(40) + .HasColumnType("character varying(40)") + .HasColumnName("ConcurrencyStamp"); + + b.Property("CreationTime") + .HasColumnType("timestamp without time zone") + .HasColumnName("CreationTime"); + + b.Property("CreatorId") + .HasColumnType("uuid") + .HasColumnName("CreatorId"); + + b.Property("ExtraProperties") + .IsRequired() + .HasColumnType("text") + .HasColumnName("ExtraProperties"); + + b.Property("GroupId") + .HasColumnType("uuid"); + + b.Property("LastModificationTime") + .HasColumnType("timestamp without time zone") + .HasColumnName("LastModificationTime"); + + b.Property("LastModifierId") + .HasColumnType("uuid") + .HasColumnName("LastModifierId"); + + b.Property("SubscriberId") + .HasColumnType("uuid"); + + b.Property("TenantId") + .HasColumnType("uuid") + .HasColumnName("TenantId"); + + b.HasKey("Id"); + + b.HasIndex("GroupId"); + + b.HasIndex("SubscriberId"); + + b.ToTable("SubscriptionGroupSubscribers", "Notifications"); + }); + + modelBuilder.Entity("Unity.Notifications.Templates.TemplateVariable", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("uuid"); + + b.Property("ConcurrencyStamp") + .IsConcurrencyToken() + .IsRequired() + .HasMaxLength(40) + .HasColumnType("character varying(40)") + .HasColumnName("ConcurrencyStamp"); + + b.Property("CreationTime") + .HasColumnType("timestamp without time zone") + .HasColumnName("CreationTime"); + + b.Property("CreatorId") + .HasColumnType("uuid") + .HasColumnName("CreatorId"); + + b.Property("ExtraProperties") + .IsRequired() + .HasColumnType("text") + .HasColumnName("ExtraProperties"); + + b.Property("LastModificationTime") + .HasColumnType("timestamp without time zone") + .HasColumnName("LastModificationTime"); + + b.Property("LastModifierId") + .HasColumnType("uuid") + .HasColumnName("LastModifierId"); + + b.Property("MapTo") + .IsRequired() + .HasColumnType("text"); + + b.Property("Name") + .IsRequired() + .HasColumnType("text"); + + b.Property("TenantId") + .HasColumnType("uuid") + .HasColumnName("TenantId"); + + b.Property("Token") + .IsRequired() + .HasColumnType("text"); + + b.HasKey("Id"); + + b.ToTable("TemplateVariables", "Notifications"); + }); + + modelBuilder.Entity("Unity.Notifications.Templates.Trigger", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("uuid"); + + b.Property("Active") + .HasColumnType("boolean"); + + b.Property("ConcurrencyStamp") + .IsConcurrencyToken() + .IsRequired() + .HasMaxLength(40) + .HasColumnType("character varying(40)") + .HasColumnName("ConcurrencyStamp"); + + b.Property("CreationTime") + .HasColumnType("timestamp without time zone") + .HasColumnName("CreationTime"); + + b.Property("CreatorId") + .HasColumnType("uuid") + .HasColumnName("CreatorId"); + + b.Property("ExtraProperties") + .IsRequired() + .HasColumnType("text") + .HasColumnName("ExtraProperties"); + + b.Property("InternalName") + .IsRequired() + .HasColumnType("text"); + + b.Property("LastModificationTime") + .HasColumnType("timestamp without time zone") + .HasColumnName("LastModificationTime"); + + b.Property("LastModifierId") + .HasColumnType("uuid") + .HasColumnName("LastModifierId"); + + b.Property("Name") + .IsRequired() + .HasColumnType("text"); + + b.Property("TenantId") + .HasColumnType("uuid") + .HasColumnName("TenantId"); + + b.HasKey("Id"); + + b.ToTable("Triggers", "Notifications"); + }); + + modelBuilder.Entity("Unity.Notifications.Templates.TriggerSubscription", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("uuid"); + + b.Property("ConcurrencyStamp") + .IsConcurrencyToken() + .IsRequired() + .HasMaxLength(40) + .HasColumnType("character varying(40)") + .HasColumnName("ConcurrencyStamp"); + + b.Property("CreationTime") + .HasColumnType("timestamp without time zone") + .HasColumnName("CreationTime"); + + b.Property("CreatorId") + .HasColumnType("uuid") + .HasColumnName("CreatorId"); + + b.Property("ExtraProperties") + .IsRequired() + .HasColumnType("text") + .HasColumnName("ExtraProperties"); + + b.Property("LastModificationTime") + .HasColumnType("timestamp without time zone") + .HasColumnName("LastModificationTime"); + + b.Property("LastModifierId") + .HasColumnType("uuid") + .HasColumnName("LastModifierId"); + + b.Property("SubscriptionGroupId") + .HasColumnType("uuid"); + + b.Property("TemplateId") + .HasColumnType("uuid"); + + b.Property("TenantId") + .HasColumnType("uuid") + .HasColumnName("TenantId"); + + b.Property("TriggerId") + .HasColumnType("uuid"); + + b.HasKey("Id"); + + b.HasIndex("SubscriptionGroupId"); + + b.HasIndex("TemplateId"); + + b.HasIndex("TriggerId"); + + b.ToTable("TriggerSubscriptions", "Notifications"); + }); + + modelBuilder.Entity("Unity.Payments.Domain.PaymentConfigurations.PaymentConfiguration", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("uuid"); + + b.Property("ConcurrencyStamp") + .IsConcurrencyToken() + .IsRequired() + .HasMaxLength(40) + .HasColumnType("character varying(40)") + .HasColumnName("ConcurrencyStamp"); + + b.Property("CreationTime") + .HasColumnType("timestamp without time zone") + .HasColumnName("CreationTime"); + + b.Property("CreatorId") + .HasColumnType("uuid") + .HasColumnName("CreatorId"); + + b.Property("DeleterId") + .HasColumnType("uuid") + .HasColumnName("DeleterId"); + + b.Property("DeletionTime") + .HasColumnType("timestamp without time zone") + .HasColumnName("DeletionTime"); + + b.Property("ExtraProperties") + .IsRequired() + .HasColumnType("text") + .HasColumnName("ExtraProperties"); + + b.Property("IsDeleted") + .ValueGeneratedOnAdd() + .HasColumnType("boolean") + .HasDefaultValue(false) + .HasColumnName("IsDeleted"); + + b.Property("LastModificationTime") + .HasColumnType("timestamp without time zone") + .HasColumnName("LastModificationTime"); + + b.Property("LastModifierId") + .HasColumnType("uuid") + .HasColumnName("LastModifierId"); + + b.Property("MinistryClient") + .HasColumnType("text"); + + b.Property("PaymentIdPrefix") + .IsRequired() + .HasColumnType("text"); + + b.Property("PaymentThreshold") + .HasColumnType("numeric"); + + b.Property("ProjectNumber") + .HasColumnType("text"); + + b.Property("Responsibility") + .HasColumnType("text"); + + b.Property("ServiceLine") + .HasColumnType("text"); + + b.Property("Stob") + .HasColumnType("text"); + + b.Property("TenantId") + .HasColumnType("uuid") + .HasColumnName("TenantId"); + + b.HasKey("Id"); + + b.ToTable("PaymentConfigurations", "Payments"); + }); + + modelBuilder.Entity("Unity.Payments.Domain.PaymentRequests.ExpenseApproval", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("uuid"); + + b.Property("CreationTime") + .HasColumnType("timestamp without time zone") + .HasColumnName("CreationTime"); + + b.Property("CreatorId") + .HasColumnType("uuid") + .HasColumnName("CreatorId"); + + b.Property("DecisionDate") + .HasColumnType("timestamp without time zone"); + + b.Property("DecisionUserId") + .HasColumnType("uuid"); + + b.Property("DeleterId") + .HasColumnType("uuid") + .HasColumnName("DeleterId"); + + b.Property("DeletionTime") + .HasColumnType("timestamp without time zone") + .HasColumnName("DeletionTime"); + + b.Property("IsDeleted") + .ValueGeneratedOnAdd() + .HasColumnType("boolean") + .HasDefaultValue(false) + .HasColumnName("IsDeleted"); + + b.Property("LastModificationTime") + .HasColumnType("timestamp without time zone") + .HasColumnName("LastModificationTime"); + + b.Property("LastModifierId") + .HasColumnType("uuid") + .HasColumnName("LastModifierId"); + + b.Property("PaymentRequestId") + .HasColumnType("uuid"); + + b.Property("Status") + .HasColumnType("integer"); + + b.Property("TenantId") + .HasColumnType("uuid") + .HasColumnName("TenantId"); + + b.Property("Type") + .HasColumnType("integer"); + + b.HasKey("Id"); + + b.HasIndex("PaymentRequestId"); + + b.ToTable("ExpenseApprovals", "Payments"); + }); + + modelBuilder.Entity("Unity.Payments.Domain.PaymentRequests.PaymentRequest", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("uuid"); + + b.Property("Amount") + .HasColumnType("numeric"); + + b.Property("BatchName") + .IsRequired() + .HasColumnType("text"); + + b.Property("BatchNumber") + .HasColumnType("numeric"); + + b.Property("CasHttpStatusCode") + .HasColumnType("integer"); + + b.Property("CasResponse") + .HasColumnType("text"); + + b.Property("ConcurrencyStamp") + .IsConcurrencyToken() + .IsRequired() + .HasMaxLength(40) + .HasColumnType("character varying(40)") + .HasColumnName("ConcurrencyStamp"); + + b.Property("ContractNumber") + .IsRequired() + .HasColumnType("text"); + + b.Property("CorrelationId") + .HasColumnType("uuid"); + + b.Property("CorrelationProvider") + .IsRequired() + .HasColumnType("text"); + + b.Property("CreationTime") + .HasColumnType("timestamp without time zone") + .HasColumnName("CreationTime"); + + b.Property("CreatorId") + .HasColumnType("uuid") + .HasColumnName("CreatorId"); + + b.Property("DeleterId") + .HasColumnType("uuid") + .HasColumnName("DeleterId"); + + b.Property("DeletionTime") + .HasColumnType("timestamp without time zone") + .HasColumnName("DeletionTime"); + + b.Property("Description") + .HasColumnType("text"); + + b.Property("ExtraProperties") + .IsRequired() + .HasColumnType("text") + .HasColumnName("ExtraProperties"); + + b.Property("InvoiceNumber") + .IsRequired() + .HasColumnType("text"); + + b.Property("InvoiceStatus") + .HasColumnType("text"); + + b.Property("IsDeleted") + .ValueGeneratedOnAdd() + .HasColumnType("boolean") + .HasDefaultValue(false) + .HasColumnName("IsDeleted"); + + b.Property("IsRecon") + .HasColumnType("boolean"); + + b.Property("LastModificationTime") + .HasColumnType("timestamp without time zone") + .HasColumnName("LastModificationTime"); + + b.Property("LastModifierId") + .HasColumnType("uuid") + .HasColumnName("LastModifierId"); + + b.Property("PayeeName") + .IsRequired() + .HasColumnType("text"); + + b.Property("PaymentDate") + .HasColumnType("text"); + + b.Property("PaymentNumber") + .HasColumnType("text"); + + b.Property("PaymentStatus") + .HasColumnType("text"); + + b.Property("ReferenceNumber") + .IsRequired() + .HasColumnType("text"); + + b.Property("RequesterName") + .IsRequired() + .HasColumnType("text"); + + b.Property("SiteId") + .HasColumnType("uuid"); + + b.Property("Status") + .HasColumnType("integer"); + + b.Property("SubmissionConfirmationCode") + .IsRequired() + .HasColumnType("text"); + + b.Property("SupplierName") + .HasColumnType("text"); + + b.Property("SupplierNumber") + .IsRequired() + .HasColumnType("text"); + + b.Property("TenantId") + .HasColumnType("uuid") + .HasColumnName("TenantId"); + + b.HasKey("Id"); + + b.HasIndex("ReferenceNumber") + .IsUnique(); + + b.HasIndex("SiteId"); + + b.ToTable("PaymentRequests", "Payments"); + }); + + modelBuilder.Entity("Unity.Payments.Domain.PaymentTags.PaymentTag", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("uuid"); + + b.Property("ConcurrencyStamp") + .IsConcurrencyToken() + .IsRequired() + .HasMaxLength(40) + .HasColumnType("character varying(40)") + .HasColumnName("ConcurrencyStamp"); + + b.Property("CreationTime") + .HasColumnType("timestamp without time zone") + .HasColumnName("CreationTime"); + + b.Property("CreatorId") + .HasColumnType("uuid") + .HasColumnName("CreatorId"); + + b.Property("ExtraProperties") + .IsRequired() + .HasColumnType("text") + .HasColumnName("ExtraProperties"); + + b.Property("LastModificationTime") + .HasColumnType("timestamp without time zone") + .HasColumnName("LastModificationTime"); + + b.Property("LastModifierId") + .HasColumnType("uuid") + .HasColumnName("LastModifierId"); + + b.Property("PaymentRequestId") + .HasColumnType("uuid"); + + b.Property("TagId") + .HasColumnType("uuid"); + + b.Property("TenantId") + .HasColumnType("uuid") + .HasColumnName("TenantId"); + + b.Property("Text") + .IsRequired() + .HasColumnType("text"); + + b.HasKey("Id"); + + b.HasIndex("PaymentRequestId"); + + b.HasIndex("TagId"); + + b.ToTable("PaymentTags", "Payments"); + }); + + modelBuilder.Entity("Unity.Payments.Domain.Suppliers.Site", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("uuid"); + + b.Property("AddressLine1") + .HasColumnType("text"); + + b.Property("AddressLine2") + .HasColumnType("text"); + + b.Property("AddressLine3") + .HasColumnType("text"); + + b.Property("BankAccount") + .HasColumnType("text"); + + b.Property("City") + .HasColumnType("text"); + + b.Property("Country") + .HasColumnType("text"); + + b.Property("CreationTime") + .HasColumnType("timestamp without time zone") + .HasColumnName("CreationTime"); + + b.Property("CreatorId") + .HasColumnType("uuid") + .HasColumnName("CreatorId"); + + b.Property("DeleterId") + .HasColumnType("uuid") + .HasColumnName("DeleterId"); + + b.Property("DeletionTime") + .HasColumnType("timestamp without time zone") + .HasColumnName("DeletionTime"); + + b.Property("EFTAdvicePref") + .HasColumnType("text"); + + b.Property("EmailAddress") + .HasColumnType("text"); + + b.Property("IsDeleted") + .ValueGeneratedOnAdd() + .HasColumnType("boolean") + .HasDefaultValue(false) + .HasColumnName("IsDeleted"); + + b.Property("LastModificationTime") + .HasColumnType("timestamp without time zone") + .HasColumnName("LastModificationTime"); + + b.Property("LastModifierId") + .HasColumnType("uuid") + .HasColumnName("LastModifierId"); + + b.Property("LastUpdatedInCas") + .HasColumnType("timestamp without time zone"); + + b.Property("MarkDeletedInUse") + .HasColumnType("boolean"); + + b.Property("Number") + .IsRequired() + .HasColumnType("text"); + + b.Property("PaymentGroup") + .HasColumnType("integer"); + + b.Property("PostalCode") + .HasColumnType("text"); + + b.Property("ProviderId") + .HasColumnType("text"); + + b.Property("Province") + .HasColumnType("text"); + + b.Property("SiteProtected") + .HasColumnType("text"); + + b.Property("Status") + .HasColumnType("text"); + + b.Property("SupplierId") + .HasColumnType("uuid"); + + b.Property("TenantId") + .HasColumnType("uuid") + .HasColumnName("TenantId"); + + b.HasKey("Id"); + + b.HasIndex("SupplierId"); + + b.ToTable("Sites", "Payments"); + }); + + modelBuilder.Entity("Unity.Payments.Domain.Suppliers.Supplier", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("uuid"); + + b.Property("BusinessNumber") + .HasColumnType("text"); + + b.Property("City") + .HasColumnType("text"); + + b.Property("ConcurrencyStamp") + .IsConcurrencyToken() + .IsRequired() + .HasMaxLength(40) + .HasColumnType("character varying(40)") + .HasColumnName("ConcurrencyStamp"); + + b.Property("CorrelationId") + .HasColumnType("uuid"); + + b.Property("CorrelationProvider") + .IsRequired() + .HasColumnType("text"); + + b.Property("CreationTime") + .HasColumnType("timestamp without time zone") + .HasColumnName("CreationTime"); + + b.Property("CreatorId") + .HasColumnType("uuid") + .HasColumnName("CreatorId"); + + b.Property("DeleterId") + .HasColumnType("uuid") + .HasColumnName("DeleterId"); + + b.Property("DeletionTime") + .HasColumnType("timestamp without time zone") + .HasColumnName("DeletionTime"); + + b.Property("ExtraProperties") + .IsRequired() + .HasColumnType("text") + .HasColumnName("ExtraProperties"); + + b.Property("IsDeleted") + .ValueGeneratedOnAdd() + .HasColumnType("boolean") + .HasDefaultValue(false) + .HasColumnName("IsDeleted"); + + b.Property("LastModificationTime") + .HasColumnType("timestamp without time zone") + .HasColumnName("LastModificationTime"); + + b.Property("LastModifierId") + .HasColumnType("uuid") + .HasColumnName("LastModifierId"); + + b.Property("LastUpdatedInCAS") + .HasColumnType("timestamp without time zone"); + + b.Property("MailingAddress") + .HasColumnType("text"); + + b.Property("Name") + .HasColumnType("text"); + + b.Property("Number") + .HasColumnType("text"); + + b.Property("PostalCode") + .HasColumnType("text"); + + b.Property("ProviderId") + .HasColumnType("text"); + + b.Property("Province") + .HasColumnType("text"); + + b.Property("SIN") + .HasColumnType("text"); + + b.Property("StandardIndustryClassification") + .HasColumnType("text"); + + b.Property("Status") + .HasColumnType("text"); + + b.Property("Subcategory") + .HasColumnType("text"); + + b.Property("SupplierProtected") + .HasColumnType("text"); + + b.Property("TenantId") + .HasColumnType("uuid") + .HasColumnName("TenantId"); + + b.HasKey("Id"); + + b.ToTable("Suppliers", "Payments"); + }); + + modelBuilder.Entity("Unity.Flex.Domain.ScoresheetInstances.ScoresheetInstance", b => + { + b.HasOne("Unity.Flex.Domain.Scoresheets.Scoresheet", "Scoresheet") + .WithMany("Instances") + .HasForeignKey("ScoresheetId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("Scoresheet"); + }); + + modelBuilder.Entity("Unity.Flex.Domain.Scoresheets.Answer", b => + { + b.HasOne("Unity.Flex.Domain.Scoresheets.Question", "Question") + .WithMany("Answers") + .HasForeignKey("QuestionId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("Unity.Flex.Domain.ScoresheetInstances.ScoresheetInstance", null) + .WithMany("Answers") + .HasForeignKey("ScoresheetInstanceId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("Question"); + }); + + modelBuilder.Entity("Unity.Flex.Domain.Scoresheets.Question", b => + { + b.HasOne("Unity.Flex.Domain.Scoresheets.ScoresheetSection", "Section") + .WithMany("Fields") + .HasForeignKey("SectionId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("Section"); + }); + + modelBuilder.Entity("Unity.Flex.Domain.Scoresheets.ScoresheetSection", b => + { + b.HasOne("Unity.Flex.Domain.Scoresheets.Scoresheet", "Scoresheet") + .WithMany("Sections") + .HasForeignKey("ScoresheetId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("Scoresheet"); + }); + + modelBuilder.Entity("Unity.Flex.Domain.WorksheetInstances.CustomFieldValue", b => + { + b.HasOne("Unity.Flex.Domain.WorksheetInstances.WorksheetInstance", null) + .WithMany("Values") + .HasForeignKey("WorksheetInstanceId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + }); + + modelBuilder.Entity("Unity.Flex.Domain.WorksheetLinks.WorksheetLink", b => + { + b.HasOne("Unity.Flex.Domain.Worksheets.Worksheet", "Worksheet") + .WithMany("Links") + .HasForeignKey("WorksheetId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("Worksheet"); + }); + + modelBuilder.Entity("Unity.Flex.Domain.Worksheets.CustomField", b => + { + b.HasOne("Unity.Flex.Domain.Worksheets.WorksheetSection", "Section") + .WithMany("Fields") + .HasForeignKey("SectionId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("Section"); + }); + + modelBuilder.Entity("Unity.Flex.Domain.Worksheets.WorksheetSection", b => + { + b.HasOne("Unity.Flex.Domain.Worksheets.Worksheet", "Worksheet") + .WithMany("Sections") + .HasForeignKey("WorksheetId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("Worksheet"); + }); + + modelBuilder.Entity("Unity.GrantManager.Applications.ApplicantAddress", b => + { + b.HasOne("Unity.GrantManager.Applications.Applicant", "Applicant") + .WithMany("ApplicantAddresses") + .HasForeignKey("ApplicantId") + .OnDelete(DeleteBehavior.NoAction) + .IsRequired(); + + b.Navigation("Applicant"); + }); + + modelBuilder.Entity("Unity.GrantManager.Applications.ApplicantAgent", b => + { + b.HasOne("Unity.GrantManager.Applications.Applicant", null) + .WithMany() + .HasForeignKey("ApplicantId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("Unity.GrantManager.Applications.Application", "Application") + .WithOne("ApplicantAgent") + .HasForeignKey("Unity.GrantManager.Applications.ApplicantAgent", "ApplicationId"); + + b.HasOne("Unity.GrantManager.Identity.Person", null) + .WithMany() + .HasForeignKey("OidcSubUser") + .HasPrincipalKey("OidcSub"); + + b.Navigation("Application"); + }); + + modelBuilder.Entity("Unity.GrantManager.Applications.Application", b => + { + b.HasOne("Unity.GrantManager.Applications.Applicant", "Applicant") + .WithMany() + .HasForeignKey("ApplicantId") + .OnDelete(DeleteBehavior.NoAction) + .IsRequired(); + + b.HasOne("Unity.GrantManager.Applications.ApplicationForm", "ApplicationForm") + .WithMany() + .HasForeignKey("ApplicationFormId") + .OnDelete(DeleteBehavior.NoAction) + .IsRequired(); + + b.HasOne("Unity.GrantManager.Applications.ApplicationStatus", "ApplicationStatus") + .WithMany("Applications") + .HasForeignKey("ApplicationStatusId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("Unity.GrantManager.Identity.Person", "Owner") + .WithMany() + .HasForeignKey("OwnerId") + .OnDelete(DeleteBehavior.NoAction); + + b.Navigation("Applicant"); + + b.Navigation("ApplicationForm"); + + b.Navigation("ApplicationStatus"); + + b.Navigation("Owner"); + }); + + modelBuilder.Entity("Unity.GrantManager.Applications.ApplicationAssignment", b => + { + b.HasOne("Unity.GrantManager.Applications.Application", "Application") + .WithMany("ApplicationAssignments") + .HasForeignKey("ApplicationId") + .OnDelete(DeleteBehavior.NoAction) + .IsRequired(); + + b.HasOne("Unity.GrantManager.Identity.Person", "Assignee") + .WithMany() + .HasForeignKey("AssigneeId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("Application"); + + b.Navigation("Assignee"); + }); + + modelBuilder.Entity("Unity.GrantManager.Applications.ApplicationAttachment", b => + { + b.HasOne("Unity.GrantManager.Applications.Application", null) + .WithMany() + .HasForeignKey("ApplicationId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + }); + + modelBuilder.Entity("Unity.GrantManager.Applications.ApplicationChefsFileAttachment", b => + { + b.HasOne("Unity.GrantManager.Applications.Application", null) + .WithMany() + .HasForeignKey("ApplicationId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + }); + + modelBuilder.Entity("Unity.GrantManager.Applications.ApplicationContact", b => + { + b.HasOne("Unity.GrantManager.Applications.Application", null) + .WithMany() + .HasForeignKey("ApplicationId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + }); + + modelBuilder.Entity("Unity.GrantManager.Applications.ApplicationForm", b => + { + b.HasOne("Unity.GrantManager.Intakes.Intake", null) + .WithMany() + .HasForeignKey("IntakeId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + }); + + modelBuilder.Entity("Unity.GrantManager.Applications.ApplicationFormSubmission", b => + { + b.HasOne("Unity.GrantManager.Applications.Applicant", null) + .WithMany() + .HasForeignKey("ApplicantId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("Unity.GrantManager.Applications.ApplicationForm", null) + .WithMany() + .HasForeignKey("ApplicationFormId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + }); + + modelBuilder.Entity("Unity.GrantManager.Applications.ApplicationFormVersion", b => + { + b.HasOne("Unity.GrantManager.Applications.ApplicationForm", null) + .WithMany() + .HasForeignKey("ApplicationFormId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + }); + + modelBuilder.Entity("Unity.GrantManager.Applications.ApplicationLink", b => + { + b.HasOne("Unity.GrantManager.Applications.Application", null) + .WithMany() + .HasForeignKey("ApplicationId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + }); + + modelBuilder.Entity("Unity.GrantManager.Applications.ApplicationTags", b => + { + b.HasOne("Unity.GrantManager.Applications.Application", "Application") + .WithMany("ApplicationTags") + .HasForeignKey("ApplicationId") + .OnDelete(DeleteBehavior.NoAction) + .IsRequired(); + + b.HasOne("Unity.GrantManager.GlobalTag.Tag", "Tag") + .WithMany() + .HasForeignKey("TagId") + .OnDelete(DeleteBehavior.NoAction) + .IsRequired(); + + b.Navigation("Application"); + + b.Navigation("Tag"); + }); + + modelBuilder.Entity("Unity.GrantManager.Applications.AssessmentAttachment", b => + { + b.HasOne("Unity.GrantManager.Assessments.Assessment", null) + .WithMany() + .HasForeignKey("AssessmentId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + }); + + modelBuilder.Entity("Unity.GrantManager.Assessments.Assessment", b => + { + b.HasOne("Unity.GrantManager.Applications.Application", "Application") + .WithMany("Assessments") + .HasForeignKey("ApplicationId") + .OnDelete(DeleteBehavior.NoAction) + .IsRequired(); + + b.HasOne("Unity.GrantManager.Identity.Person", null) + .WithMany() + .HasForeignKey("AssessorId") + .OnDelete(DeleteBehavior.NoAction) + .IsRequired(); + + b.Navigation("Application"); + }); + + modelBuilder.Entity("Unity.GrantManager.Comments.ApplicationComment", b => + { + b.HasOne("Unity.GrantManager.Applications.Application", null) + .WithMany() + .HasForeignKey("ApplicationId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("Unity.GrantManager.Identity.Person", null) + .WithMany() + .HasForeignKey("CommenterId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + }); + + modelBuilder.Entity("Unity.GrantManager.Comments.AssessmentComment", b => + { + b.HasOne("Unity.GrantManager.Assessments.Assessment", null) + .WithMany() + .HasForeignKey("AssessmentId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("Unity.GrantManager.Identity.Person", null) + .WithMany() + .HasForeignKey("CommenterId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + }); + + modelBuilder.Entity("Unity.Notifications.Templates.SubscriptionGroupSubscription", b => + { + b.HasOne("Unity.Notifications.Templates.SubscriptionGroup", "SubscriptionGroup") + .WithMany() + .HasForeignKey("GroupId"); + + b.HasOne("Unity.Notifications.Templates.Subscriber", "Subscriber") + .WithMany() + .HasForeignKey("SubscriberId"); + + b.Navigation("Subscriber"); + + b.Navigation("SubscriptionGroup"); + }); + + modelBuilder.Entity("Unity.Notifications.Templates.TriggerSubscription", b => + { + b.HasOne("Unity.Notifications.Templates.SubscriptionGroup", "SubscriptionGroup") + .WithMany() + .HasForeignKey("SubscriptionGroupId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("Unity.Notifications.Templates.EmailTemplate", "EmailTemplate") + .WithMany() + .HasForeignKey("TemplateId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("Unity.Notifications.Templates.Trigger", "Trigger") + .WithMany() + .HasForeignKey("TriggerId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("EmailTemplate"); + + b.Navigation("SubscriptionGroup"); + + b.Navigation("Trigger"); + }); + + modelBuilder.Entity("Unity.Payments.Domain.PaymentRequests.ExpenseApproval", b => + { + b.HasOne("Unity.Payments.Domain.PaymentRequests.PaymentRequest", "PaymentRequest") + .WithMany("ExpenseApprovals") + .HasForeignKey("PaymentRequestId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("PaymentRequest"); + }); + + modelBuilder.Entity("Unity.Payments.Domain.PaymentRequests.PaymentRequest", b => + { + b.HasOne("Unity.Payments.Domain.Suppliers.Site", "Site") + .WithMany() + .HasForeignKey("SiteId") + .OnDelete(DeleteBehavior.NoAction) + .IsRequired(); + + b.Navigation("Site"); + }); + + modelBuilder.Entity("Unity.Payments.Domain.PaymentTags.PaymentTag", b => + { + b.HasOne("Unity.Payments.Domain.PaymentRequests.PaymentRequest", null) + .WithMany("PaymentTags") + .HasForeignKey("PaymentRequestId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("Unity.GrantManager.GlobalTag.Tag", "Tag") + .WithMany() + .HasForeignKey("TagId") + .OnDelete(DeleteBehavior.NoAction) + .IsRequired(); + + b.Navigation("Tag"); + }); + + modelBuilder.Entity("Unity.Payments.Domain.Suppliers.Site", b => + { + b.HasOne("Unity.Payments.Domain.Suppliers.Supplier", "Supplier") + .WithMany("Sites") + .HasForeignKey("SupplierId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("Supplier"); + }); + + modelBuilder.Entity("Unity.Flex.Domain.ScoresheetInstances.ScoresheetInstance", b => + { + b.Navigation("Answers"); + }); + + modelBuilder.Entity("Unity.Flex.Domain.Scoresheets.Question", b => + { + b.Navigation("Answers"); + }); + + modelBuilder.Entity("Unity.Flex.Domain.Scoresheets.Scoresheet", b => + { + b.Navigation("Instances"); + + b.Navigation("Sections"); + }); + + modelBuilder.Entity("Unity.Flex.Domain.Scoresheets.ScoresheetSection", b => + { + b.Navigation("Fields"); + }); + + modelBuilder.Entity("Unity.Flex.Domain.WorksheetInstances.WorksheetInstance", b => + { + b.Navigation("Values"); + }); + + modelBuilder.Entity("Unity.Flex.Domain.Worksheets.Worksheet", b => + { + b.Navigation("Links"); + + b.Navigation("Sections"); + }); + + modelBuilder.Entity("Unity.Flex.Domain.Worksheets.WorksheetSection", b => + { + b.Navigation("Fields"); + }); + + modelBuilder.Entity("Unity.GrantManager.Applications.Applicant", b => + { + b.Navigation("ApplicantAddresses"); + }); + + modelBuilder.Entity("Unity.GrantManager.Applications.Application", b => + { + b.Navigation("ApplicantAgent"); + + b.Navigation("ApplicationAssignments"); + + b.Navigation("ApplicationTags"); + + b.Navigation("Assessments"); + }); + + modelBuilder.Entity("Unity.GrantManager.Applications.ApplicationStatus", b => + { + b.Navigation("Applications"); + }); + + modelBuilder.Entity("Unity.Payments.Domain.PaymentRequests.PaymentRequest", b => + { + b.Navigation("ExpenseApprovals"); + + b.Navigation("PaymentTags"); + }); + + modelBuilder.Entity("Unity.Payments.Domain.Suppliers.Supplier", b => + { + b.Navigation("Sites"); + }); +#pragma warning restore 612, 618 + } + } +} diff --git a/applications/Unity.GrantManager/src/Unity.GrantManager.EntityFrameworkCore/Repositories/ApplicationRepository.cs b/applications/Unity.GrantManager/src/Unity.GrantManager.EntityFrameworkCore/Repositories/ApplicationRepository.cs index 2c50b4ba3..934edfc77 100644 --- a/applications/Unity.GrantManager/src/Unity.GrantManager.EntityFrameworkCore/Repositories/ApplicationRepository.cs +++ b/applications/Unity.GrantManager/src/Unity.GrantManager.EntityFrameworkCore/Repositories/ApplicationRepository.cs @@ -52,6 +52,7 @@ private async Task> BuildBaseQueryAsync() .Include(s => s.ApplicationStatus) .Include(s => s.ApplicationForm) .Include(s => s.ApplicationTags) + .ThenInclude(x => x.Tag) .Include(s => s.Owner) .Include(s => s.ApplicationAssignments!) .ThenInclude(t => t.Assignee) diff --git a/applications/Unity.GrantManager/src/Unity.GrantManager.EntityFrameworkCore/Repositories/ApplicationTagsRepository.cs b/applications/Unity.GrantManager/src/Unity.GrantManager.EntityFrameworkCore/Repositories/ApplicationTagsRepository.cs index b2a6b6869..dc4fb873b 100644 --- a/applications/Unity.GrantManager/src/Unity.GrantManager.EntityFrameworkCore/Repositories/ApplicationTagsRepository.cs +++ b/applications/Unity.GrantManager/src/Unity.GrantManager.EntityFrameworkCore/Repositories/ApplicationTagsRepository.cs @@ -22,46 +22,20 @@ public class ApplicationTagsRepository(IDbContextProvider public virtual async Task> GetTagSummary() { var dbSet = await GetDbSetAsync(); - var results = dbSet - .AsNoTracking() - .AsEnumerable() // Forces client-side evaluation - .SelectMany(tag => tag.Text.Split(',', StringSplitOptions.RemoveEmptyEntries) - .Select(t => t.Trim())) - .GroupBy(tag => tag) - .Select(group => new TagSummaryCount( - group.Key, - group.Count() - )).ToList(); - + var results = await dbSet + .AsNoTracking() + .Include(x => x.Tag) // Ensure Tag is loaded + .GroupBy(x => x.Tag) + .Select(group => new TagSummaryCount( + group.Key, + group.Count() + )) + .ToListAsync(); return results; - } - - /// - /// For a given Tag, finds the maximum length available for renaming. - /// - /// The tag to be replaced. - /// The maximum length available for renaming - public virtual async Task GetMaxRenameLengthAsync(string originalTag) - { - var dbContext = await GetDbContextAsync(); - var entityType = dbContext.Model.FindEntityType(typeof(ApplicationTags)); - var property = entityType?.FindProperty(nameof(ApplicationTags.Text)); - - int maxColumnLength = property?.GetMaxLength() ?? 0; - - var dbSet = await GetDbSetAsync(); - int? maxTagSetLength = await dbSet - .AsNoTracking() - .Where(t => t.Text.Contains(originalTag)) - .Select(t => t.Text.Length) - .OrderByDescending(len => len) - .FirstOrDefaultAsync(); - - if (maxTagSetLength == null || maxTagSetLength == 0) - { - return maxColumnLength; - } - - return maxColumnLength + originalTag.Length - maxTagSetLength.Value; + } + + public override async Task> WithDetailsAsync() + { + return (await GetQueryableAsync()).Include(x => x.Tag); } } diff --git a/applications/Unity.GrantManager/src/Unity.GrantManager.EntityFrameworkCore/Repositories/TagsRepository.cs b/applications/Unity.GrantManager/src/Unity.GrantManager.EntityFrameworkCore/Repositories/TagsRepository.cs new file mode 100644 index 000000000..ad3a38bec --- /dev/null +++ b/applications/Unity.GrantManager/src/Unity.GrantManager.EntityFrameworkCore/Repositories/TagsRepository.cs @@ -0,0 +1,80 @@ +using Microsoft.EntityFrameworkCore; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Threading.Tasks; +using Unity.GrantManager.GlobalTag; +using Unity.GrantManager.EntityFrameworkCore; +using Unity.GrantManager.Applications; +using Unity.Payments.EntityFrameworkCore; +using Volo.Abp.DependencyInjection; +using Volo.Abp.Domain.Repositories.EntityFrameworkCore; +using Volo.Abp.EntityFrameworkCore; +using Volo.Abp.MultiTenancy; +using Volo.Abp.Domain.ChangeTracking; + +namespace Unity.GrantManager.Repositories; + +[Dependency(ReplaceServices = true)] +[ExposeServices(typeof(ITagsRepository))] +public class TagsRepository + : EfCoreRepository, + ITagsRepository +{ + private readonly IDbContextProvider _paymentDbContextProvider; + private readonly ICurrentTenant _currentTenant; + + public TagsRepository( + IDbContextProvider dbContextProvider, + IDbContextProvider paymentDbContextProvider, + ICurrentTenant currentTenant + ) : base(dbContextProvider) + { + _paymentDbContextProvider = paymentDbContextProvider; + _currentTenant = currentTenant; + } + + [DisableEntityChangeTracking] + public virtual async Task> GetTagUsageSummaryAsync() + { + var grantDbContext = await GetDbContextAsync(); + var tenantId = _currentTenant.Id; + + var tags = await grantDbContext.Tags + .AsNoTracking() + .Where(x => x.TenantId == tenantId) + .ToListAsync(); + + var applicationTagCounts = await grantDbContext.ApplicationTags + .AsNoTracking() + .Where(x => x.TenantId == tenantId) + .GroupBy(x => x.TagId) + .Select(g => new { TagId = g.Key, Count = g.Count() }) + .ToListAsync(); + + var paymentDbContext = await _paymentDbContextProvider.GetDbContextAsync(); + + var paymentTagCounts = await paymentDbContext.PaymentTags + .AsNoTracking() + .Where(x => x.TenantId == tenantId) + .GroupBy(x => x.TagId) + .Select(g => new { TagId = g.Key, Count = g.Count() }) + .ToListAsync(); + + var result = tags.Select(tag => + { + var appCount = applicationTagCounts.FirstOrDefault(x => x.TagId == tag.Id)?.Count ?? 0; + var payCount = paymentTagCounts.FirstOrDefault(x => x.TagId == tag.Id)?.Count ?? 0; + + return new TagUsageSummary + { + TagId = tag.Id, + TagName = tag.Name, + ApplicationTagCount = appCount, + PaymentTagCount = payCount + }; + }).ToList(); + + return result; + } +} diff --git a/applications/Unity.GrantManager/src/Unity.GrantManager.Web/Identity/PolicyRegistrant.cs b/applications/Unity.GrantManager/src/Unity.GrantManager.Web/Identity/PolicyRegistrant.cs index 33eb40802..81915dbf5 100644 --- a/applications/Unity.GrantManager/src/Unity.GrantManager.Web/Identity/PolicyRegistrant.cs +++ b/applications/Unity.GrantManager/src/Unity.GrantManager.Web/Identity/PolicyRegistrant.cs @@ -177,6 +177,8 @@ internal static void Register(ServiceConfigurationContext context) // Setting Management - Tag Management authorizationBuilder.AddPolicy(UnitySelector.SettingManagement.Tags.Default, policy => policy.RequireClaim(PermissionConstant, UnitySelector.SettingManagement.Tags.Default)); + authorizationBuilder.AddPolicy(UnitySelector.SettingManagement.Tags.Create, + policy => policy.RequireClaim(PermissionConstant, UnitySelector.SettingManagement.Tags.Create)); authorizationBuilder.AddPolicy(UnitySelector.SettingManagement.Tags.Update, policy => policy.RequireClaim(PermissionConstant, UnitySelector.SettingManagement.Tags.Update)); authorizationBuilder.AddPolicy(UnitySelector.SettingManagement.Tags.Delete, diff --git a/applications/Unity.GrantManager/src/Unity.GrantManager.Web/Mapping/GrantApplicationsMapper.cs b/applications/Unity.GrantManager/src/Unity.GrantManager.Web/Mapping/GrantApplicationsMapper.cs index de831593f..914dde8e9 100644 --- a/applications/Unity.GrantManager/src/Unity.GrantManager.Web/Mapping/GrantApplicationsMapper.cs +++ b/applications/Unity.GrantManager/src/Unity.GrantManager.Web/Mapping/GrantApplicationsMapper.cs @@ -2,8 +2,10 @@ using Unity.GrantManager.Applications; using Unity.GrantManager.GrantApplications; using Unity.GrantManager.Web.Pages.ApplicationContact; +using Unity.GrantManager.Web.Pages.Sites.ViewModels; using Unity.GrantManager.Web.Views.Shared.Components.ApplicantInfo; using Unity.GrantManager.Web.Views.Shared.Components.SummaryWidget; +using Unity.Payments.Suppliers; namespace Unity.GrantManager.Web.Mapping; @@ -20,6 +22,8 @@ public GrantApplicationsMapper() CreateMap(); CreateMap(); CreateMap(); + CreateMap(); + CreateMap(); CreateMap() .ForMember(dest => dest.PostalCode, opt => opt.MapFrom(src => src.Postal)); } diff --git a/applications/Unity.GrantManager/src/Unity.GrantManager.Web/Pages/ApplicationTags/ApplicationTags.js b/applications/Unity.GrantManager/src/Unity.GrantManager.Web/Pages/ApplicationTags/ApplicationTags.js index d073e2e93..d3548d970 100644 --- a/applications/Unity.GrantManager/src/Unity.GrantManager.Web/Pages/ApplicationTags/ApplicationTags.js +++ b/applications/Unity.GrantManager/src/Unity.GrantManager.Web/Pages/ApplicationTags/ApplicationTags.js @@ -1,14 +1,13 @@ $(function () { let suggestionsArray = []; - - // Plugin Constructor + let TagsInput = function (opts) { this.options = Object.assign(TagsInput.defaults, opts); this.init(); } - // Initialize the plugin + TagsInput.prototype.init = function (opts) { this.options = opts ? Object.assign(this.options, opts) : this.options; @@ -33,25 +32,21 @@ $(function () { } - // Add Tags + TagsInput.prototype.addTag = function (tagData) { let defaultClass = 'tags-common'; - let tagText, tagClass; + let id,tagText, tagClass; - if (typeof tagData === 'string') { - tagText = tagData; - tagClass = defaultClass; - - } else { - tagText = tagData.text || ''; + id = tagData.Id; + tagText = tagData.Name || ''; tagClass = tagData.class || defaultClass; - - } + + if (this.anyErrors(tagText)) return; - this.arr.push(tagText); + this.arr.push({ Id: id, Name: tagText }); let tagInput = this; @@ -62,7 +57,7 @@ $(function () { let closeIcon = document.createElement('a'); closeIcon.innerHTML = '×'; - // delete the tag when icon is clicked + closeIcon.addEventListener('click', function (e) { e.preventDefault(); let tag = this.parentNode; @@ -76,15 +71,16 @@ $(function () { tag.appendChild(closeIcon); this.wrapper.insertBefore(tag, this.input); this.orignal_input.value = JSON.stringify(this.arr); - + updateSelectedTagsInput(this.arr) return this; } - // Delete Tags + TagsInput.prototype.deleteTag = function (tag, i) { let self = this; - if (this.arr[i] == 'Uncommon Tags') { - abp.message.confirm('Are you sure to delete all the uncommon tags?') + + if (this.arr[i].Name === 'Uncommon Tags') { + abp.message.confirm('Are you sure you want to delete all the uncommon tags?') .then(function (confirmed) { if (confirmed) { tag.remove(); @@ -92,34 +88,34 @@ $(function () { self.orignal_input.value = JSON.stringify(self.arr); return self; } - }); - } - else { + } else { tag.remove(); this.arr.splice(i, 1); this.orignal_input.value = JSON.stringify(this.arr); return this; } - } - // Make sure input string have no error with the plugin + TagsInput.prototype.anyErrors = function (string) { if (this.options.max != null && this.arr.length >= this.options.max) { console.log('max tags limit reached'); return true; } - if (!this.options.duplicate && this.arr.indexOf(string) != -1) { - console.log('duplicate found " ' + string + ' " ') + if ( + !this.options.duplicate && + this.arr.some(tag => tag.Name === string) + ) { + console.log('duplicate found "' + string + '"'); return true; } return false; } - // Add tags programmatically + TagsInput.prototype.addData = function (array) { let plugin = this; @@ -129,7 +125,7 @@ $(function () { return this; } - // Get the Input String + TagsInput.prototype.getInputString = function () { return this.arr.join(','); } @@ -138,7 +134,7 @@ $(function () { } - // destroy the plugin + TagsInput.prototype.destroy = function () { this.orignal_input.removeAttribute('hidden'); @@ -156,7 +152,7 @@ $(function () { this.initialized = false; } - // Private function to initialize the tag input plugin + function init(tags) { tags.wrapper.append(tags.input); tags.wrapper.classList.add(tags.options.wrapperClass); @@ -165,11 +161,12 @@ $(function () { tags.input.addEventListener('input', function () { const inputValue = tags.input.value.trim().toLowerCase(); - // Show suggestions only after the first character entry + if (inputValue.length > 1) { - const suggestions = suggestionsArray.filter(tag => tag.toLowerCase().includes(inputValue)); + const suggestions = suggestionsArray.filter(tag => + (tag.Name.toLowerCase()).includes(inputValue)); - // Display suggestions below the input element + if (suggestions.length) { displaySuggestions(tags, suggestions); } else { @@ -177,18 +174,18 @@ $(function () { } } else { - // Remove suggestions if input is empty + removeSuggestions(tags); } }); } - // Function to display auto-completion suggestions + function displaySuggestions(tags, suggestions) { - // Remove previous suggestions + removeSuggestions(tags); - // Create suggestion container + const suggestionContainer = document.createElement('div'); suggestionContainer.classList.add('tags-suggestion-container'); const suggestionTitleElement = document.createElement('div'); @@ -196,13 +193,13 @@ $(function () { suggestionTitleElement.innerText = 'ALL TAGS'; suggestionContainer.appendChild(suggestionTitleElement); - // Add suggestions to the container + suggestions.forEach(suggestion => { const suggestionElement = document.createElement('div'); suggestionElement.className = 'tags-suggestion-element'; - suggestionElement.innerText = suggestion; + suggestionElement.innerText = typeof suggestion === 'string' ? suggestion : suggestion.Name; - // Add click event to add suggestion as a new tag + suggestionElement.addEventListener('click', function () { tags.addTag(suggestion); removeSuggestions(tags); @@ -212,11 +209,11 @@ $(function () { suggestionContainer.appendChild(suggestionElement); }); - // Append the suggestion container below the input + tags.wrapper.appendChild(suggestionContainer); } - // Function to remove auto-completion suggestions + function removeSuggestions(tags) { const suggestionContainer = tags.wrapper.querySelector('.tags-suggestion-container'); if (suggestionContainer) { @@ -224,15 +221,15 @@ $(function () { } } - // initialize the Events + function initEvents(tags) { tags.wrapper.addEventListener('click', function () { tags.input.focus(); }); - // for saving tags that are typed, but not added as a chip/pill + tags.input.addEventListener('focusout', function () { - $('#applicationTagsModelSaveBtn').click(function () { + $('#assignTagsModelSaveBtn').click(function () { trimAndAddTag(tags); }) }); @@ -250,19 +247,41 @@ $(function () { }); } + function trimAndAddTag(tags) { let str = tags.input.value.trim(); - if (str != "") { - tags.addTag(str); + if (!str) { + tags.input.value = ""; + return; } + + + const matched = suggestionsArray.find(s => + + s.Name.toLowerCase() === str.toLowerCase() + ); + + if (matched) { + tags.addTag(typeof matched === 'string' ? { name: matched } : matched); + } else { + abp.message.warn('Please select a tag from the suggestions.'); + } + tags.input.value = ""; } + function updateSelectedTagsInput(tagsArray) { + + let jsonValue = JSON.stringify(tagsArray); + $('#SelectedTagsJson').val(jsonValue); + + } + TagsInput.prototype.getTags = function () { - return this.arr.slice(); // Return a copy of the array to prevent external modification + return this.arr.slice(); } - // Set All the Default Values + TagsInput.defaults = { selector: '', wrapperClass: 'tags-input-wrapper', @@ -273,7 +292,4 @@ $(function () { window.TagsInput = TagsInput; - }); - - diff --git a/applications/Unity.GrantManager/src/Unity.GrantManager.Web/Pages/ApplicationTags/ApplicationTagsSelectionModal.cshtml b/applications/Unity.GrantManager/src/Unity.GrantManager.Web/Pages/ApplicationTags/ApplicationTagsSelectionModal.cshtml index 35955ec97..cb696be86 100644 --- a/applications/Unity.GrantManager/src/Unity.GrantManager.Web/Pages/ApplicationTags/ApplicationTagsSelectionModal.cshtml +++ b/applications/Unity.GrantManager/src/Unity.GrantManager.Web/Pages/ApplicationTags/ApplicationTagsSelectionModal.cshtml @@ -4,24 +4,28 @@ @{ Layout = null; } +@using Newtonsoft.Json +
- + + - - - - + + + + +
- +
diff --git a/applications/Unity.GrantManager/src/Unity.GrantManager.Web/Pages/ApplicationTags/ApplicationTagsSelectionModal.cshtml.cs b/applications/Unity.GrantManager/src/Unity.GrantManager.Web/Pages/ApplicationTags/ApplicationTagsSelectionModal.cshtml.cs index 5b08d1ccd..2b2114a83 100644 --- a/applications/Unity.GrantManager/src/Unity.GrantManager.Web/Pages/ApplicationTags/ApplicationTagsSelectionModal.cshtml.cs +++ b/applications/Unity.GrantManager/src/Unity.GrantManager.Web/Pages/ApplicationTags/ApplicationTagsSelectionModal.cshtml.cs @@ -6,153 +6,158 @@ using System.ComponentModel; using System.Linq; using System.Threading.Tasks; +using Unity.GrantManager.GlobalTag; using Unity.GrantManager.GrantApplications; using Volo.Abp.AspNetCore.Mvc.UI.RazorPages; namespace Unity.GrantManager.Web.Pages.ApplicationTags { - class NewTagItem + public class NewTagItem { public string? ApplicationId { get; set; } - public string? CommonText { get; set; } - public string? UncommonText { get; set; } + public List CommonTags { get; set; } = new(); + public List UncommonTags { get; set; } = new(); } + public class ApplicationTagsModalModel : AbpPageModel { [BindProperty] - [DisplayName("")] + [DisplayName("Tags")] public string? SelectedTags { get; set; } = string.Empty; [BindProperty] - public string? AllTags { get; set; } = string.Empty; + [DisplayName("All Tags")] + public List AllTags { get; set; } = new(); [BindProperty] + [DisplayName("Selected Applications")] public string? SelectedApplicationIds { get; set; } = string.Empty; [BindProperty] + [DisplayName("Action Type")] public string? ActionType { get; set; } = string.Empty; private readonly IApplicationTagsService _applicationTagsService; + private readonly ITagsService _tagsService; + [BindProperty] + [DisplayName("Common Tags")] + public List CommonTags { get; set; } = new(); [BindProperty] - public string? CommonTags { get; set; } = string.Empty; + [DisplayName("Uncommon Tags")] + public List UncommonTags { get; set; } = new(); [BindProperty] - public string? UncommonTags { get; set; } = string.Empty; + [DisplayName("Tags")] + public List Tags { get; set; } = new(); [BindProperty] - public string? Tags { get; set; } = string.Empty; + public string? SelectedTagsJson { get; set; } + [BindProperty] + public string? TagsJson { get; set; } - public ApplicationTagsModalModel(IApplicationTagsService applicatioTagsService) + public ApplicationTagsModalModel(IApplicationTagsService applicationTagsService, ITagsService tagsService) { - _applicationTagsService = applicatioTagsService ?? throw new ArgumentNullException(nameof(applicatioTagsService)); - + _applicationTagsService = applicationTagsService ?? throw new ArgumentNullException(nameof(applicationTagsService)); + _tagsService = tagsService ?? throw new ArgumentNullException(nameof(tagsService)); } public async Task OnGetAsync(string applicationIds, string actionType) { - SelectedApplicationIds = applicationIds; ActionType = actionType; + var applications = JsonConvert.DeserializeObject>(SelectedApplicationIds); if (applications != null && applications.Count > 0) { try { - var allTags = await _applicationTagsService.GetListAsync(); - + CommonTags = new List(); + UncommonTags = new List(); + var allTags = await _tagsService.GetListAsync(); var tags = await _applicationTagsService.GetListWithApplicationIdsAsync(applications); + var groupedTags = tags + .Where(x => x.Tag != null) + .GroupBy(x => x.ApplicationId) + .ToDictionary( + g => g.Key, + g => g.Select(x => x.Tag!).DistinctBy(t => t.Id).ToList() + ); + foreach (var missingId in applications.Except(groupedTags.Keys)) + { + groupedTags[missingId] = new List(); + } + List commonTags = new(); - // Add default objects for missing applicationIds - var missingApplicationIds = applications.Except(tags.Select(tag => tag.ApplicationId)); - tags = tags.Concat(missingApplicationIds.Select(appId => new ApplicationTagsDto + if (groupedTags.Values.Count > 0) { - ApplicationId = appId, - Text = "", // You can set default values here - Id = Guid.NewGuid() // Assuming Id is a Guid - })).ToList(); + commonTags = groupedTags.Values + .Aggregate((prev, next) => prev.IntersectBy(next.Select(t => t.Id), t => t.Id).ToList()); + } - var newArray = tags.Select(item => + Tags = groupedTags.Select(kvp => { - var textValues = item.Text.Split(','); - var commonText = tags - .SelectMany(x => x.Text.Split(',')) - .GroupBy(text => text) - .Where(group => group.Count() == tags.Count) - .Select(group => group.Key); + var appId = kvp.Key; + var tagList = kvp.Value; - var uncommonText = textValues.Except(commonText); + var uncommonTags = tagList + .Where(tag => !commonTags.Any(ct => ct.Id == tag.Id)) + .ToList(); return new NewTagItem { - ApplicationId = item.ApplicationId.ToString(), - CommonText = string.Join(",", commonText), - UncommonText = string.Join(",", uncommonText) + ApplicationId = appId.ToString(), + CommonTags = commonTags.OrderBy(t => t.Name).ToList(), + UncommonTags = uncommonTags.OrderBy(t => t.Name).ToList() }; - }).ToArray(); - - var allUniqueCommonTexts = newArray - .SelectMany(item => (item.CommonText?.Split(',') ?? Array.Empty())) - .Where(text => !string.IsNullOrEmpty(text)) - .Distinct() - .OrderBy(text => text); + }).ToList(); - var allUniqueUncommonTexts = newArray - .SelectMany(item => (item.UncommonText?.Split(',') ?? Array.Empty())) - .Where(text => !string.IsNullOrEmpty(text)) - .Distinct() - .OrderBy(text => text); - - - - var allUniqueTexts = allTags - .SelectMany(obj => obj.Text.ToString().Split(',').Select(t => t.Trim())) - .Distinct(); - var uniqueCommonTextsString = string.Join(",", allUniqueCommonTexts); - var uniqueUncommonTextsString = string.Join(",", allUniqueUncommonTexts); - var allUniqueTextsString = string.Join(",", allUniqueTexts); + if (Tags.Count > 0) + { - AllTags = allUniqueTextsString; - CommonTags = uniqueCommonTextsString; - UncommonTags = uniqueUncommonTextsString; - Tags = JsonConvert.SerializeObject(newArray); + CommonTags = Tags + .SelectMany(item => item.CommonTags) + .GroupBy(tag => tag.Id) + .Select(group => group.First()) + .OrderBy(tag => tag.Name) + .ToList(); + + UncommonTags = Tags + .SelectMany(item => item.UncommonTags) + .GroupBy(tag => tag.Id) + .Select(group => group.First()) + .OrderBy(tag => tag.Name) + .ToList(); + } + AllTags = allTags + .DistinctBy(tag => tag.Id) + .OrderBy(tag => tag.Name) + .ToList(); } catch (Exception ex) { Logger.LogError(ex, message: "Error loading tag select list"); } } - } - public async Task OnPostAsync() { const string uncommonTags = "Uncommon Tags"; // Move to constants? + if (SelectedApplicationIds == null) return NoContent(); try { var applicationIds = JsonConvert.DeserializeObject>(SelectedApplicationIds); - if (SelectedTags != null) + if (SelectedTags != null && applicationIds != null && applicationIds.Count > 0) { - string[]? stringArray = JsonConvert.DeserializeObject(SelectedTags); - - if (null != applicationIds) - { - var selectedApplicationIds = applicationIds.ToArray(); - - if (Tags != null) - { - var tags = JsonConvert.DeserializeObject(Tags)?.ToList(); - - await ProcessTagsAsync(uncommonTags, stringArray, selectedApplicationIds, tags); - } - } - + var selectedTagList = DeserializeJson>(SelectedTags) ?? []; + var tagItems = string.IsNullOrWhiteSpace(TagsJson)? null : DeserializeJson>(TagsJson); + await ProcessTagsAsync(uncommonTags, selectedTagList, applicationIds.ToArray(), tagItems); + } - } catch (Exception ex) { @@ -162,44 +167,56 @@ public async Task OnPostAsync() return NoContent(); } - private async Task ProcessTagsAsync(string uncommonTags, string[]? stringArray, Guid[] selectedApplicationIds, List? tags) + private async Task ProcessTagsAsync(string uncommonTagsLabel, List selectedTags, Guid[] selectedApplicationIds, List? tags) { - foreach (var item in selectedApplicationIds) + for (int i = 0; i < selectedApplicationIds.Length; i++) { - var applicationTagString = ""; + var item = selectedApplicationIds[i]; + var tagList = new List(); - if (tags != null - && tags.Count > 0 - && stringArray != null - && stringArray.Length > 0 - && stringArray.Contains(uncommonTags)) + if (selectedTags.Any(t => t.Name == uncommonTagsLabel) && tags != null) { - NewTagItem? applicationTag = tags.Find(tagItem => tagItem.ApplicationId == item.ToString()); - - if (applicationTag != null) + var applicationTag = tags.FirstOrDefault(tagItem => tagItem.ApplicationId == item.ToString()); + if (applicationTag?.UncommonTags != null) { - applicationTagString += applicationTag.UncommonText; + tagList.AddRange(applicationTag.UncommonTags); } } - if (stringArray != null && stringArray.Length > 0) + + var commonTagsOnly = selectedTags + .Where(tag => tag.Name != uncommonTagsLabel) + .ToList(); + + tagList.AddRange(commonTagsOnly); + + var distinctTags = tagList + .Where(tag => tag != null && tag.Id != Guid.Empty) + .GroupBy(tag => tag.Id) + .Select(group => group.First()) + .ToList(); + + try { - var applicationCommonTagArray = stringArray.Where(item => item != uncommonTags).ToArray(); - if (applicationCommonTagArray.Length > 0) - { - applicationTagString += (applicationTagString == "" ? string.Join(",", applicationCommonTagArray) : (',' + string.Join(",", applicationCommonTagArray))); - } + await _applicationTagsService.AssignTagsAsync(new AssignApplicationTagsDto + { + ApplicationId = item, + Tags = distinctTags + }); + } + catch (Exception ex) + { + Console.WriteLine($"Error processing ApplicationId {item}: {ex.Message}"); + } - - await _applicationTagsService.CreateorUpdateTagsAsync(item, new ApplicationTagsDto { ApplicationId = item, Text = RemoveDuplicates(applicationTagString) }); } - } - private string RemoveDuplicates(string applicationTagString) + + + } + private static T? DeserializeJson(string jsonString) where T : class { - var tagArray = applicationTagString.Split(","); - var noDuplicates = tagArray.Distinct().ToArray(); - return string.Join(",", noDuplicates); + return string.IsNullOrEmpty(jsonString) ? null : JsonConvert.DeserializeObject(jsonString); } } } diff --git a/applications/Unity.GrantManager/src/Unity.GrantManager.Web/Pages/Dashboard/Index.cshtml.cs b/applications/Unity.GrantManager/src/Unity.GrantManager.Web/Pages/Dashboard/Index.cshtml.cs index 3f050da0f..9155568cd 100644 --- a/applications/Unity.GrantManager/src/Unity.GrantManager.Web/Pages/Dashboard/Index.cshtml.cs +++ b/applications/Unity.GrantManager/src/Unity.GrantManager.Web/Pages/Dashboard/Index.cshtml.cs @@ -153,8 +153,8 @@ join user in users on userAssignment.AssigneeId equals user.Id private async Task GetTagsFilter() { - var tagResult = await _applicationTagsRepository.GetListAsync(); - var tags = tagResult.SelectMany(tag => tag.Text.Split(',').Select(t => t.Trim())).Distinct(); + var tagResult = await _applicationTagsRepository.GetListAsync(true); + var tags = tagResult.SelectMany(tag => tag.Tag.Name.Split(',').Select(t => t.Trim())).Distinct(); TagsOptionsList = tags.Select(tag => new SelectListItem { diff --git a/applications/Unity.GrantManager/src/Unity.GrantManager.Web/Pages/GrantApplications/Index.js b/applications/Unity.GrantManager/src/Unity.GrantManager.Web/Pages/GrantApplications/Index.js index 7f40bfe57..e7050d8e9 100644 --- a/applications/Unity.GrantManager/src/Unity.GrantManager.Web/Pages/GrantApplications/Index.js +++ b/applications/Unity.GrantManager/src/Unity.GrantManager.Web/Pages/GrantApplications/Index.js @@ -724,7 +724,11 @@ data: 'applicationTag', className: '', render: function (data) { - return data.replace(/,/g, ', ') ?? ''; + + let tagNames = data + .filter(x => x?.tag?.name) + .map(x => x.tag.name); + return tagNames.join(', ') ?? ''; }, index: columnIndex } diff --git a/applications/Unity.GrantManager/src/Unity.GrantManager.Web/Pages/SettingManagement/TagManagement/RenameTagModal.cshtml b/applications/Unity.GrantManager/src/Unity.GrantManager.Web/Pages/SettingManagement/TagManagement/RenameTagModal.cshtml index 99b743841..ee30591b1 100644 --- a/applications/Unity.GrantManager/src/Unity.GrantManager.Web/Pages/SettingManagement/TagManagement/RenameTagModal.cshtml +++ b/applications/Unity.GrantManager/src/Unity.GrantManager.Web/Pages/SettingManagement/TagManagement/RenameTagModal.cshtml @@ -18,6 +18,7 @@ + diff --git a/applications/Unity.GrantManager/src/Unity.GrantManager.Web/Pages/SettingManagement/TagManagement/RenameTagModal.cshtml.cs b/applications/Unity.GrantManager/src/Unity.GrantManager.Web/Pages/SettingManagement/TagManagement/RenameTagModal.cshtml.cs index f4208b99f..2cc33b001 100644 --- a/applications/Unity.GrantManager/src/Unity.GrantManager.Web/Pages/SettingManagement/TagManagement/RenameTagModal.cshtml.cs +++ b/applications/Unity.GrantManager/src/Unity.GrantManager.Web/Pages/SettingManagement/TagManagement/RenameTagModal.cshtml.cs @@ -4,14 +4,18 @@ using System.ComponentModel; using System.ComponentModel.DataAnnotations; using System.Threading.Tasks; +using Unity.GrantManager.GlobalTag; using Unity.GrantManager.GrantApplications; using Volo.Abp.AspNetCore.Mvc.UI.RazorPages; using Volo.Abp.Validation; namespace Unity.GrantManager.Web.Pages.SettingManagement.TagManagement; -public class RenameTagModal(IApplicationTagsService applicationTagService) : AbpPageModel +public class RenameTagModal(ITagsService tagService) : AbpPageModel { + [HiddenInput] + [BindProperty(SupportsGet = true)] + public Guid SelectedTagId { get; set; } [HiddenInput] [BindProperty(SupportsGet = true)] public string SelectedTagText { get; set; } = string.Empty; @@ -23,6 +27,7 @@ public void OnGet() { ViewModel = new RenameTagViewModel { + TagId = SelectedTagId, OriginalTag = SelectedTagText, ReplacementTag = SelectedTagText }; @@ -30,6 +35,9 @@ public void OnGet() public class RenameTagViewModel { + [Required] + [HiddenInput] + public required Guid TagId { get; set; } [Required] [HiddenInput] public required string OriginalTag { get; set; } @@ -52,11 +60,11 @@ public async Task OnPostAsync() try { - await applicationTagService.RenameTagGlobalAsync(ViewModel.OriginalTag, ViewModel.ReplacementTag); + await tagService.RenameTagGlobalAsync(ViewModel.TagId,ViewModel.OriginalTag, ViewModel.ReplacementTag); } catch (Exception ex) { - Logger.LogError(ex, message: "Error updating application tags"); + throw new AbpValidationException(ex.Message); } return NoContent(); diff --git a/applications/Unity.GrantManager/src/Unity.GrantManager.Web/Pages/Sites/UpdateModal.cshtml b/applications/Unity.GrantManager/src/Unity.GrantManager.Web/Pages/Sites/UpdateModal.cshtml new file mode 100644 index 000000000..8a48a2fd7 --- /dev/null +++ b/applications/Unity.GrantManager/src/Unity.GrantManager.Web/Pages/Sites/UpdateModal.cshtml @@ -0,0 +1,31 @@ +@page +@using Unity.GrantManager.Localization +@using Microsoft.Extensions.Localization +@using Volo.Abp.AspNetCore.Mvc.UI.Bootstrap.TagHelpers.Modal + +@model Unity.GrantManager.Web.Pages.Sites.UpdateModalModel + +@inject IStringLocalizer L +@{ + Layout = null; +} + + + + + + + + @if (Model.Site != null) + { + + } + + + + + + + diff --git a/applications/Unity.GrantManager/src/Unity.GrantManager.Web/Pages/Sites/UpdateModal.cshtml.cs b/applications/Unity.GrantManager/src/Unity.GrantManager.Web/Pages/Sites/UpdateModal.cshtml.cs new file mode 100644 index 000000000..ce7c1bac0 --- /dev/null +++ b/applications/Unity.GrantManager/src/Unity.GrantManager.Web/Pages/Sites/UpdateModal.cshtml.cs @@ -0,0 +1,50 @@ +using Microsoft.AspNetCore.Mvc; +using System; +using System.Linq; +using System.Threading.Tasks; +using Unity.GrantManager.Web.Pages.Sites.ViewModels; +using Unity.Payments.Suppliers; + +namespace Unity.GrantManager.Web.Pages.Sites; + +public class UpdateModalModel(ISiteAppService siteAppService) : GrantManagerPageModel +{ + [HiddenInput] + [BindProperty(SupportsGet = true)] + public Guid Id { get; set; } + + [BindProperty] + public CreateUpdateSiteViewModel? Site { get; set; } + + public async Task OnGetAsync() + { + if (Id == Guid.Empty) + { + throw new ArgumentException("Id cannot be empty"); + } + + Site = new(); + var siteDto = await siteAppService.GetAsync(Id); + Site = ObjectMapper.Map(siteDto); + + var addressParts = new[] + { + siteDto.AddressLine1, + siteDto.AddressLine2, + siteDto.AddressLine3, + siteDto.City, + siteDto.Province, + siteDto.PostalCode, + siteDto.Country + }; + + Site.MailingAddress = string.Join(", ", addressParts.Where(part => !string.IsNullOrWhiteSpace(part))); + } + + public async Task OnPostAsync() + { + var updateDto = ObjectMapper.Map(Site!); + await siteAppService.UpdatePaygroupAsync(updateDto.PaymentGroup, updateDto.Id); + return NoContent(); + } +} diff --git a/applications/Unity.GrantManager/src/Unity.GrantManager.Web/Pages/Sites/ViewModel/CreateUpdateApplicationFormViewModel.cs b/applications/Unity.GrantManager/src/Unity.GrantManager.Web/Pages/Sites/ViewModel/CreateUpdateApplicationFormViewModel.cs new file mode 100644 index 000000000..c5277fa5d --- /dev/null +++ b/applications/Unity.GrantManager/src/Unity.GrantManager.Web/Pages/Sites/ViewModel/CreateUpdateApplicationFormViewModel.cs @@ -0,0 +1,46 @@ +using Microsoft.AspNetCore.Mvc; +using System; +using System.ComponentModel; +using System.ComponentModel.DataAnnotations; +using Unity.Payments.Enums; +using Volo.Abp.AspNetCore.Mvc.UI.Bootstrap.TagHelpers.Form; + +namespace Unity.GrantManager.Web.Pages.Sites.ViewModels +{ + public class CreateUpdateSiteViewModel + { + + [DisplayName("Site #")] + [ReadOnlyInput] + public string Number { get; set; } = null!; + + [Required] + [DisplayName("Payment Group")] + public PaymentGroup PaymentGroup { get; set; } + + [ReadOnlyInput] + [DisplayName("Bank Account")] + public string? BankAccount { get; set; } + + [ReadOnlyInput] + [DisplayName("Mailing Address")] + public string? MailingAddress { get; set; } + + [ReadOnlyInput] + [DisplayName("Status")] + public string? Status { get; set; } + + + [HiddenInput] + public Guid Id { get; set; } + + // Property to display a warning if PaymentGroup is 1 and BankAccount is not set + [HiddenInput] + public bool ShowBankAccountWarning => + (int)PaymentGroup == 1 && string.IsNullOrWhiteSpace(BankAccount); + + [HiddenInput] + public string BankAccountWarningMessage => + "Warning: A bank account is required for EFT payments. If you select EFT without one, your payment will fail. Please contact CAS to add a bank account."; + } +} diff --git a/applications/Unity.GrantManager/src/Unity.GrantManager.Web/Pages/Tags/CreateTagsModal.cshtml b/applications/Unity.GrantManager/src/Unity.GrantManager.Web/Pages/Tags/CreateTagsModal.cshtml new file mode 100644 index 000000000..90abacb03 --- /dev/null +++ b/applications/Unity.GrantManager/src/Unity.GrantManager.Web/Pages/Tags/CreateTagsModal.cshtml @@ -0,0 +1,21 @@ +@page +@model Unity.GrantManager.Web.Pages.Tags.CreateTagsModalModel +@using Volo.Abp.AspNetCore.Mvc.UI.Bootstrap.TagHelpers.Modal +@{ + Layout = null; +} + + + + + +
+ +
+
+ + + + +
+ diff --git a/applications/Unity.GrantManager/src/Unity.GrantManager.Web/Pages/Tags/CreateTagsModal.cshtml.cs b/applications/Unity.GrantManager/src/Unity.GrantManager.Web/Pages/Tags/CreateTagsModal.cshtml.cs new file mode 100644 index 000000000..1e6764f2a --- /dev/null +++ b/applications/Unity.GrantManager/src/Unity.GrantManager.Web/Pages/Tags/CreateTagsModal.cshtml.cs @@ -0,0 +1,58 @@ +using Microsoft.AspNetCore.Authorization; +using Microsoft.AspNetCore.Mvc; +using Microsoft.Extensions.Logging; +using System; +using System.Collections.Generic; +using System.ComponentModel.DataAnnotations; +using System.Threading.Tasks; +using Unity.GrantManager.GlobalTag; +using Unity.Modules.Shared; +using Volo.Abp.AspNetCore.Mvc.UI.RazorPages; +using Volo.Abp.Validation; + +namespace Unity.GrantManager.Web.Pages.Tags +{ + public class NewTag + { + public string? ApplicationId { get; set; } + public List CommonTags { get; set; } = new(); + public List UncommonTags { get; set; } = new(); + } + + [Authorize(UnitySelector.SettingManagement.Tags.Create)] + public class CreateTagsModalModel : AbpPageModel + { + + [BindProperty] + [Required(ErrorMessage = "Tag Name is required")] + [RegularExpression(@"^[^\s,]+$", ErrorMessage = "Tag cannot contain spaces or commas.")] + public string Tag { get; set; } = string.Empty; + + private readonly ITagsService _tagsService; + + + public CreateTagsModalModel(ITagsService tagsService) + { + _tagsService = tagsService ?? throw new ArgumentNullException(nameof(tagsService)); + } + + + + public async Task OnPostAsync() + { + + try + { + await _tagsService.CreateTagsAsync(new TagDto { Name = Tag }); + } + catch (Exception ex) + { + Logger.LogError(ex, message: "Error creating application tags"); + throw new AbpValidationException(ex.Message); + + } + + return NoContent(); + } + } +} diff --git a/applications/Unity.GrantManager/src/Unity.GrantManager.Web/Views/Settings/TagManagement/TagManagement.js b/applications/Unity.GrantManager/src/Unity.GrantManager.Web/Views/Settings/TagManagement/TagManagement.js index 9697cb08b..8bfda579d 100644 --- a/applications/Unity.GrantManager/src/Unity.GrantManager.Web/Views/Settings/TagManagement/TagManagement.js +++ b/applications/Unity.GrantManager/src/Unity.GrantManager.Web/Views/Settings/TagManagement/TagManagement.js @@ -1,18 +1,35 @@ const TagTypes = {}; let userCanUpdate = abp.auth.isGranted('Unity.GrantManager.SettingManagement.Tags.Update'); let userCanDelete = abp.auth.isGranted('Unity.GrantManager.SettingManagement.Tags.Delete'); +let addNewTagModal = new abp.ModalManager({ + viewUrl: 'Tags/CreateTagsModal' +}); function defineTagSummaryColumnDefs() { - // Define columns - start with fixed columns const columnDefs = [ { title: "Tags", - name: 'text', - data: 'text' + name: 'tag', + data: 'tag.name' + }, + { + title: "TagData", + name: 'tag', + data: 'tag', + visible: false, + searchable: false, + orderable: false + }, + { + title: "TagId", + name: 'tag.id', + data: 'tag.id', + visible: false, + searchable: false, + orderable: false } ]; - // Add a column for each tag type Object.values(TagTypes).forEach(tagType => { columnDefs.push({ title: `${tagType.name} Count`, @@ -31,11 +48,10 @@ function defineTagSummaryColumnDefs() { data: 'totalCount' }); - // Add the actions column columnDefs.push({ title: "Actions", name: 'actions', - data: 'text', + data: 'tag.name', orderable: false, render: function (data, type, row) { let $buttonWrapper = $('
').addClass('d-flex flex-nowrap gap-1'); @@ -79,60 +95,65 @@ function mapTagWithType(tag, tagType) { return { ...tag, tagType: tagType.name, - tagTypeKey: Object.keys(TagTypes).find(key => TagTypes[key] === tagType) + tagTypeKey: Object.keys(TagTypes).find(key => TagTypes[key] === tagType), + tag: { + ...tag.tag + } }; } -function getUnifiedTagSummaryAjax(requestData, callback, settings) { - // Fetch data from all tag types and combine - let promises = Object.values(TagTypes).map(tagType => - tagType.service.getTagSummary() - .then(result => - (result.items || []).map(tag => mapTagWithType(tag, tagType)) - ) - ); - - Promise.all(promises).then(results => { - // Combine all tags into a single array - const allTags = results.flat(); - - // Create a map to combine tags with the same text + + +function loadUnifiedTagSummary() { + return unity.grantManager.globalTag.tags.getTagSummary().then(result => { + const allTags = result.items || []; const tagMap = new Map(); allTags.forEach(tag => { - if (!tagMap.has(tag.text)) { - // Initialize a new entry for this tag text - tagMap.set(tag.text, { - text: tag.text, + const tagName = tag.tagName; + + if (!tagMap.has(tagName)) { + tagMap.set(tagName, { + tag: { + id: tag.tagId, + name: tagName + }, totalCount: 0, tagTypeCounts: {}, tagTypeKeys: {} }); } - const tagEntry = tagMap.get(tag.text); - const tagTypeName = tag.tagType; + const tagEntry = tagMap.get(tagName); - // Add count for this tag type - tagEntry.tagTypeCounts[tagTypeName] = tag.count; - - // Add to total count - tagEntry.totalCount += tag.count; + if (tag.applicationTagCount > 0) { + tagEntry.tagTypeCounts["Application"] = tag.applicationTagCount; + tagEntry.totalCount += tag.applicationTagCount; + tagEntry.tagTypeKeys["Application"] = "APPLICATIONS"; + } - // Store the tag type key for action buttons - tagEntry.tagTypeKeys[tagTypeName] = tag.tagTypeKey; + if (tag.paymentTagCount > 0) { + tagEntry.tagTypeCounts["Payment"] = tag.paymentTagCount; + tagEntry.totalCount += tag.paymentTagCount; + tagEntry.tagTypeKeys["Payment"] = "PAYMENTS"; + } }); - // Convert map to array for DataTable - const combinedTags = Array.from(tagMap.values()); - + return Array.from(tagMap.values()).map(entry => ({ + ...entry, + tag: { ...entry.tag } + })); + }); +} +function getUnifiedTagSummaryAjax(requestData, callback, settings) { + loadUnifiedTagSummary().then(combinedTags => { callback({ recordsTotal: combinedTags.length, recordsFiltered: combinedTags.length, data: combinedTags }); }).catch(error => { - console.error("Error fetching global tags:", error); + console.error("Error fetching tag summary:", error); callback({ recordsTotal: 0, recordsFiltered: 0, @@ -140,11 +161,9 @@ function getUnifiedTagSummaryAjax(requestData, callback, settings) { }); }); } - $(function () { abp.log.debug('TagManagement.js initialized!'); - // Modal Validation Configuration abp.modals.RenameTag = function () { let formElements = {}; let initialFormState = {}; @@ -159,11 +178,8 @@ $(function () { initialFormState = formElements.form.serialize(); - // Set up form change event listener - formElements.form.on('change input', function() { - // Trigger validation + formElements.form.on('change input', function () { $(this).valid(); - // Update save button state based on form validity let currentFormState = formElements.form.serialize(); formElements.saveButton.prop('disabled', !$(this).valid() || initialFormState === currentFormState); }); @@ -212,36 +228,38 @@ $(function () { globalTagsTable.on('click', 'td button.edit-button', function (event) { event.stopPropagation(); - let rowData = globalTagsTable.row(event.target.closest('tr')).data(); - handleUpdateTag(rowData.text); + let rowData = globalTagsTable.row(event.target.closest('tr')).data(); + console.log("rowData", rowData) + handleUpdateTag(rowData.tag.id,rowData.tag.name); }); globalTagsTable.on('click', 'td button.delete-button', function (event) { event.stopPropagation(); let rowData = globalTagsTable.row(event.target.closest('tr')).data(); - handleDeleteTag(rowData.text); + handleDeleteTag(rowData.tag.id,rowData.tag.name); }); abp.log.debug('Global Tags Table initialized!'); - function handleUpdateTag(tagText) { + function handleUpdateTag(id, tagText) { + console.log("handleUpdateTag ") _renameTagModal.open({ + SelectedTagId : id, SelectedTagText: tagText }); } - function handleDeleteTag(tagText) { + function handleDeleteTag(id,tagText) { + console.log("handleDeleteTag") abp.message.confirm(`Are you sure you want to delete the "${tagText}" tag?`, "Delete Tag?") .then(function (confirmed) { if (confirmed) { try { - // Needs to be fixed to work globally - unity.grantManager.grantApplications.applicationTags.deleteTagGlobal(tagText) + unity.grantManager.globalTag.tags.deleteTagGlobal(id) .done(function (result) { abp.notify.success(`The tag "${tagText}" has been deleted.`); - if (globalTagsTable) { - globalTagsTable.ajax.reload(); // Also refresh global table + globalTagsTable.ajax.reload(); } }) .fail(onTagDeleteFailure); @@ -258,8 +276,25 @@ $(function () { console.log(error); } } - + function refreshGlobalTagsTable() { + loadUnifiedTagSummary().then(combinedTags => { + globalTagsTable.clear(); + globalTagsTable.rows.add(combinedTags); + globalTagsTable.draw(); + }); + } _renameTagModal.onResult(function () { - globalTagsTable.ajax.reload(); + + refreshGlobalTagsTable(); + }); + + if (abp.auth.isGranted('Unity.GrantManager.SettingManagement.Tags.Create')) { + $('#addNewTag').click(function () { + addNewTagModal.open(); + }); + } + + addNewTagModal.onResult(function () { + refreshGlobalTagsTable(); }); -}); \ No newline at end of file +}); diff --git a/applications/Unity.GrantManager/src/Unity.GrantManager.Web/Views/Settings/TagManagement/TagManagementViewComponent.cshtml b/applications/Unity.GrantManager/src/Unity.GrantManager.Web/Views/Settings/TagManagement/TagManagementViewComponent.cshtml index 10770d4cc..6e0cb90dd 100644 --- a/applications/Unity.GrantManager/src/Unity.GrantManager.Web/Views/Settings/TagManagement/TagManagementViewComponent.cshtml +++ b/applications/Unity.GrantManager/src/Unity.GrantManager.Web/Views/Settings/TagManagement/TagManagementViewComponent.cshtml @@ -1,4 +1,9 @@ - +@using Unity.Modules.Shared +@using Volo.Abp.Authorization.Permissions + +@inject IPermissionChecker PermissionChecker + +
@@ -6,8 +11,12 @@

Manage Tags

- +
+ @if (await PermissionChecker.IsGrantedAsync(UnitySelector.SettingManagement.Tags.Create)) + { + + }
diff --git a/applications/Unity.GrantManager/src/Unity.GrantManager.Web/Views/Shared/Components/ActionBar/Default.js b/applications/Unity.GrantManager/src/Unity.GrantManager.Web/Views/Shared/Components/ActionBar/Default.js index 71111177e..8ba4186ee 100644 --- a/applications/Unity.GrantManager/src/Unity.GrantManager.Web/Views/Shared/Components/ActionBar/Default.js +++ b/applications/Unity.GrantManager/src/Unity.GrantManager.Web/Views/Shared/Components/ActionBar/Default.js @@ -29,31 +29,31 @@ $(function () { max: 50 }); let suggestionsArray = []; - let uncommonTags = $('#UncommonTags').val(); - let commonTags = $('#CommonTags').val(); - let allTags = $('#AllTags').val(); + let uncommonTags = JSON.parse($('#UncommonTags').val()); + let commonTags = JSON.parse($('#CommonTags').val()); + let allTags = JSON.parse($('#AllTags').val()); if (allTags) { - suggestionsArray = allTags.split(','); + suggestionsArray = allTags; } tagInput.setSuggestions(suggestionsArray); let tagInputArray = []; - if (uncommonTags && uncommonTags != null) { - tagInputArray.push({ text: 'Uncommon Tags', class: 'tags-uncommon', id: 0 }) + if (uncommonTags && uncommonTags.length != 0) { + tagInputArray.push({ tagId: '00000000-0000-0000-0000-000000000000', Name: 'Uncommon Tags', class: 'tags-uncommon', Id: '00000000-0000-0000-0000-000000000000' }) } - const commonTagsArray = commonTags.split(','); - if (commonTags && commonTagsArray.length) { + + if (commonTags?.length) { - if (commonTagsArray.length) { + - commonTagsArray.forEach(function (item, index) { + commonTags.forEach(function (item, index) { - tagInputArray.push({ text: item, class: 'tags-common', id: index + 1 }) + tagInputArray.push({ tagId: item.Id, Name: item.Name, class: 'tags-common', Id: item.Id }) }); - } + } tagInput.addData(tagInputArray); diff --git a/applications/Unity.GrantManager/src/Unity.GrantManager.Web/Views/Shared/Components/ApplicantInfo/ApplicantSummaryViewModel.cs b/applications/Unity.GrantManager/src/Unity.GrantManager.Web/Views/Shared/Components/ApplicantInfo/ApplicantSummaryViewModel.cs index 5740a523b..9de368ee1 100644 --- a/applications/Unity.GrantManager/src/Unity.GrantManager.Web/Views/Shared/Components/ApplicantInfo/ApplicantSummaryViewModel.cs +++ b/applications/Unity.GrantManager/src/Unity.GrantManager.Web/Views/Shared/Components/ApplicantInfo/ApplicantSummaryViewModel.cs @@ -58,5 +58,7 @@ public class ApplicantSummaryViewModel public string? SectorSubSectorIndustryDesc { get; set; } public bool RedStop { get; set; } + + public string? ApplicantName { get; set; } } diff --git a/applications/Unity.GrantManager/src/Unity.GrantManager.Web/Views/Shared/Components/ApplicantInfo/Default.cshtml b/applications/Unity.GrantManager/src/Unity.GrantManager.Web/Views/Shared/Components/ApplicantInfo/Default.cshtml index 07e3db7c2..acf0ab5a6 100644 --- a/applications/Unity.GrantManager/src/Unity.GrantManager.Web/Views/Shared/Components/ApplicantInfo/Default.cshtml +++ b/applications/Unity.GrantManager/src/Unity.GrantManager.Web/Views/Shared/Components/ApplicantInfo/Default.cshtml @@ -150,6 +150,19 @@
+ + + + +
+
+ +
+
+
+ + + @@ -173,17 +186,8 @@ -
-
- -
-
+
- - - - -
diff --git a/applications/Unity.GrantManager/src/Unity.GrantManager.Web/Views/Shared/Components/ApplicationTagsWidget/ApplicationTagsWidgetViewComponent.cs b/applications/Unity.GrantManager/src/Unity.GrantManager.Web/Views/Shared/Components/ApplicationTagsWidget/ApplicationTagsWidgetViewComponent.cs index 029be931d..c0ce8d573 100644 --- a/applications/Unity.GrantManager/src/Unity.GrantManager.Web/Views/Shared/Components/ApplicationTagsWidget/ApplicationTagsWidgetViewComponent.cs +++ b/applications/Unity.GrantManager/src/Unity.GrantManager.Web/Views/Shared/Components/ApplicationTagsWidget/ApplicationTagsWidgetViewComponent.cs @@ -29,7 +29,7 @@ public async Task InvokeAsync(Guid applicationId) string applicationText = ""; if(applicationTags != null) { - applicationText = applicationTags.Text; + applicationText = applicationTags?.Tag?.Name ?? ""; } return View(new ApplicationTagsWidgetViewModel() { ApplicationTags = applicationText.Replace(",", ", ")}); diff --git a/applications/Unity.GrantManager/test/Unity.GrantManager.Application.Tests/Applications/ApplicationTagsAppServiceTests.cs b/applications/Unity.GrantManager/test/Unity.GrantManager.Application.Tests/Applications/ApplicationTagsAppServiceTests.cs index 3d4c84f08..642b1e1ae 100644 --- a/applications/Unity.GrantManager/test/Unity.GrantManager.Application.Tests/Applications/ApplicationTagsAppServiceTests.cs +++ b/applications/Unity.GrantManager/test/Unity.GrantManager.Application.Tests/Applications/ApplicationTagsAppServiceTests.cs @@ -8,6 +8,8 @@ using Unity.GrantManager.Applications; using Xunit.Abstractions; using System.Collections.Generic; +using Unity.GrantManager.GlobalTag; +using System.Xml.Linq; namespace Unity.GrantManager.GrantApplications { @@ -15,8 +17,8 @@ public class ApplicationTagsAppServiceTests : GrantManagerApplicationTestBase { private readonly IApplicationTagsService _applicationTagssAppService; private readonly IRepository _applicationsRepository; - - + + private readonly ITagsService _tagsService; private readonly IUnitOfWorkManager _unitOfWorkManager; public ApplicationTagsAppServiceTests(ITestOutputHelper outputHelper) : base(outputHelper) @@ -24,6 +26,7 @@ public ApplicationTagsAppServiceTests(ITestOutputHelper outputHelper) : base(out _applicationTagssAppService = GetRequiredService(); _applicationsRepository = GetRequiredService>(); _unitOfWorkManager = GetRequiredService(); + _tagsService = GetRequiredService(); } [Fact] @@ -56,21 +59,30 @@ public async Task GetListWithApplicationIdAsync_Should_Return_ApplicationTags() [Fact] [Trait("Category", "Integration")] - public async Task CreateorUpdateTagsAsync_Should_Create_ApplicationTag() + public async Task AssignTags() { // Arrange Login(GrantManagerTestData.User1_UserId); using var uow = _unitOfWorkManager.Begin(); var application = (await _applicationsRepository.GetListAsync())[0]; - + + var newTag = await _tagsService.CreateTagsAsync(new TagDto { Name = "Environment" }); + + + var tag = new TagDto + { + Id = newTag.Id, + Name = "Environment" + }; // Act - var addedTag = await _applicationTagssAppService.CreateorUpdateTagsAsync(application.Id, new ApplicationTagsDto() + var assignDto = new AssignApplicationTagsDto { ApplicationId = application.Id, - Text = "Tag" - }); + Tags = new List { tag } + }; + var addedTag = await _applicationTagssAppService.AssignTagsAsync(assignDto); // Assert (await _applicationTagssAppService.GetApplicationTagsAsync(application.Id)) .ShouldNotBeNull(); diff --git a/applications/Unity.GrantManager/test/Unity.GrantManager.Web.Tests/Components/ApplicationTagWidgetTests.cs b/applications/Unity.GrantManager/test/Unity.GrantManager.Web.Tests/Components/ApplicationTagWidgetTests.cs index 988d45ead..feaabb2cf 100644 --- a/applications/Unity.GrantManager/test/Unity.GrantManager.Web.Tests/Components/ApplicationTagWidgetTests.cs +++ b/applications/Unity.GrantManager/test/Unity.GrantManager.Web.Tests/Components/ApplicationTagWidgetTests.cs @@ -5,6 +5,7 @@ using Shouldly; using System; using System.Threading.Tasks; +using Unity.GrantManager.GlobalTag; using Unity.GrantManager.GrantApplications; using Unity.GrantManager.Web.Views.Shared.Components.ApplicationTagsWidget; using Xunit; @@ -16,12 +17,18 @@ public class ApplicationTagsWidgetTests : GrantManagerWebTestBase [Fact] public async Task ApplicationTagsWidgetReturnsStatus() { - // Arrange + // Arrange var applicationService = Substitute.For(); var expected = "Mock"; var applicationId = Guid.NewGuid(); var httpContext = new DefaultHttpContext(); - applicationService.GetApplicationTagsAsync(applicationId).Returns(await Task.FromResult(new ApplicationTagsDto() { ApplicationId = Guid.Empty, Text = "Mock" })); + + // Fix: Ensure 'Tag' is initialized to avoid null dereference + applicationService.GetApplicationTagsAsync(applicationId).Returns(await Task.FromResult(new ApplicationTagsDto() + { + ApplicationId = Guid.Empty, + Tag = new TagDto { Id = Guid.Empty, Name = "Mock" } + })); var viewContext = new ViewContext { @@ -37,13 +44,13 @@ public async Task ApplicationTagsWidgetReturnsStatus() ViewComponentContext = viewComponentContext }; - //Act + // Act var result = await viewComponent.InvokeAsync(applicationId) as ViewViewComponentResult; ApplicationTagsWidgetViewModel? resultModel; resultModel = result!.ViewData!.Model! as ApplicationTagsWidgetViewModel; - //Assert + // Assert resultModel!.ApplicationTags.ShouldBe(expected); } }