diff --git a/applications/Unity.GrantManager/modules/Unity.Flex/src/Unity.Flex.Web/Pages/Components/DataGrid/DataGridWriteService.cs b/applications/Unity.GrantManager/modules/Unity.Flex/src/Unity.Flex.Web/Pages/Components/DataGrid/DataGridWriteService.cs index 6a1440df97..7489f231e2 100644 --- a/applications/Unity.GrantManager/modules/Unity.Flex/src/Unity.Flex.Web/Pages/Components/DataGrid/DataGridWriteService.cs +++ b/applications/Unity.GrantManager/modules/Unity.Flex/src/Unity.Flex.Web/Pages/Components/DataGrid/DataGridWriteService.cs @@ -279,6 +279,22 @@ internal async Task UpdateRowAsync(RowInputData rowInputDa }; } + internal async Task DeleteRowAsync(Guid valueId, uint row, Guid worksheetInstanceId) + { + var currentValue = await customFieldValueAppService.GetAsync(valueId); + var dataGridValue = DataGridServiceUtils.DeserializeDataGridValue(currentValue.CurrentValue); + if (dataGridValue == null) return; + + var dataGridRowsValue = DataGridServiceUtils.DeserializeDataGridRowsValue(dataGridValue.Value?.ToString()); + if (dataGridRowsValue == null || row >= (uint)dataGridRowsValue.Rows.Count) return; + + dataGridRowsValue.Rows.RemoveAt((int)row); + dataGridValue.Value = dataGridRowsValue; + + await customFieldValueAppService.ExplicitSetAsync(valueId, JsonSerializer.Serialize(dataGridValue)); + await customFieldValueAppService.SyncWorksheetInstanceValueAsync(worksheetInstanceId); + } + internal async Task>> GenerateKeyValueTypesAsync(Guid customFieldId, Dictionary? keyValuePairs) { var result = new List>(); diff --git a/applications/Unity.GrantManager/modules/Unity.Flex/src/Unity.Flex.Web/Unity.Flex.Web.csproj b/applications/Unity.GrantManager/modules/Unity.Flex/src/Unity.Flex.Web/Unity.Flex.Web.csproj index 349cb06a44..1b9333d47f 100644 --- a/applications/Unity.GrantManager/modules/Unity.Flex/src/Unity.Flex.Web/Unity.Flex.Web.csproj +++ b/applications/Unity.GrantManager/modules/Unity.Flex/src/Unity.Flex.Web/Unity.Flex.Web.csproj @@ -43,6 +43,10 @@ + + + + true diff --git a/applications/Unity.GrantManager/modules/Unity.Flex/src/Unity.Flex.Web/Views/Shared/Components/DataGridWidget/DataGridWidgetController.cs b/applications/Unity.GrantManager/modules/Unity.Flex/src/Unity.Flex.Web/Views/Shared/Components/DataGridWidget/DataGridWidgetController.cs index e128b73cdb..9b265278cf 100644 --- a/applications/Unity.GrantManager/modules/Unity.Flex/src/Unity.Flex.Web/Views/Shared/Components/DataGridWidget/DataGridWidgetController.cs +++ b/applications/Unity.GrantManager/modules/Unity.Flex/src/Unity.Flex.Web/Views/Shared/Components/DataGridWidget/DataGridWidgetController.cs @@ -1,14 +1,22 @@ -using Microsoft.AspNetCore.Mvc; +using Microsoft.AspNetCore.Authorization; +using Microsoft.AspNetCore.Mvc; using Microsoft.Extensions.Logging; using System; +using System.Threading.Tasks; +using Unity.Flex.Web.Pages.Flex; using Unity.Flex.Web.Views.Shared.Components.WorksheetInstanceWidget.ViewModels; +using Unity.Flex.Worksheets; +using Unity.Flex.WorksheetInstances; using Volo.Abp.AspNetCore.Mvc; namespace Unity.Flex.Web.Views.Shared.Components.DataGridWidget { [ApiExplorerSettings(IgnoreApi = true)] [Route("Flex/Widgets/DataGrid")] - public class DataGridWidgetController : AbpController + public class DataGridWidgetController( + ICustomFieldAppService customFieldAppService, + ICustomFieldValueAppService customFieldValueAppService, + DataGridWriteService dataGridWriteService) : AbpController { [HttpGet] [Route("Refresh")] @@ -33,5 +41,54 @@ public IActionResult Refresh(WorksheetFieldViewModel? fieldModel, worksheetInstanceId }); } + + [Authorize] + [HttpPost] + [Route("DeleteRow")] + public async Task DeleteRow( + Guid valueId, + uint row, + Guid worksheetInstanceId) + { + await dataGridWriteService.DeleteRowAsync(valueId, row, worksheetInstanceId); + return new OkObjectResult(new { row, worksheetInstanceId }); + } + + [Authorize] + [HttpGet] + [Route("RefreshByField")] + public async Task RefreshByField( + Guid valueId, + Guid fieldId, + string modelName, + Guid worksheetId, + Guid worksheetInstanceId, + string uiAnchor) + { + var field = await customFieldAppService.GetAsync(fieldId); + var value = await customFieldValueAppService.GetAsync(valueId); + + var fieldModel = new WorksheetFieldViewModel + { + Id = field.Id, + Name = field.Name, + Label = field.Label, + Type = field.Type, + Order = field.Order, + Enabled = field.Enabled, + Definition = field.Definition, + CurrentValue = value.CurrentValue, + CurrentValueId = valueId, + UiAnchor = uiAnchor + }; + + return ViewComponent(typeof(DataGridWidget), new + { + fieldModel, + modelName, + worksheetId, + worksheetInstanceId + }); + } } } diff --git a/applications/Unity.GrantManager/modules/Unity.Flex/src/Unity.Flex.Web/Views/Shared/Components/DataGridWidget/Default.css b/applications/Unity.GrantManager/modules/Unity.Flex/src/Unity.Flex.Web/Views/Shared/Components/DataGridWidget/Default.css index 856b7c5a22..99348aa925 100644 --- a/applications/Unity.GrantManager/modules/Unity.Flex/src/Unity.Flex.Web/Views/Shared/Components/DataGridWidget/Default.css +++ b/applications/Unity.GrantManager/modules/Unity.Flex/src/Unity.Flex.Web/Views/Shared/Components/DataGridWidget/Default.css @@ -33,6 +33,17 @@ .custom-grid-container { display: flex; flex-direction: column; + position: relative; +} + +.grid-loading-overlay { + position: absolute; + inset: 0; + background: rgba(255, 255, 255, 0.75); + display: flex; + align-items: center; + justify-content: center; + z-index: 10; } .grid-position { @@ -61,4 +72,31 @@ color: #8a8886; margin-left: 4px; vertical-align: middle; +} + +.custom-dynamic-table .dropdown { + display: inline-block; +} + +.custom-dynamic-table .dropdown-content { + display: none; + position: fixed; + right: auto; + background-color: #f9f9f9; + min-width: 160px; + box-shadow: 0px 8px 16px 0px rgba(0,0,0,0.2); + z-index: 1039; + --bs-btn-active-color: var(--bc-colors-white-primary-500); + --bs-btn-active-bg: var(--bc-colors-blue-primary-500); +} + +.custom-dynamic-table .dropdown:hover .dropdown-content { + display: block; +} + +.custom-dynamic-table .dropdown-content .btn.fullWidth { + width: calc(100% - 16px); + display: block; + text-align: left; + margin: 10px 8px; } \ No newline at end of file diff --git a/applications/Unity.GrantManager/modules/Unity.Flex/src/Unity.Flex.Web/Views/Shared/Components/DataGridWidget/Default.js b/applications/Unity.GrantManager/modules/Unity.Flex/src/Unity.Flex.Web/Views/Shared/Components/DataGridWidget/Default.js index 7fd001ce6c..ba2d1bcb57 100644 --- a/applications/Unity.GrantManager/modules/Unity.Flex/src/Unity.Flex.Web/Views/Shared/Components/DataGridWidget/Default.js +++ b/applications/Unity.GrantManager/modules/Unity.Flex/src/Unity.Flex.Web/Views/Shared/Components/DataGridWidget/Default.js @@ -1,9 +1,61 @@ +function getDatagridActionsRowButtonTemplate(actions) { + if (actions.length === 0) return ''; + + if (actions.length === 1) { + if (actions.includes('EDIT')) + return ''; + if (actions.includes('DELETE')) + return ''; + return ''; + } + + let items = ''; + if (actions.includes('EDIT')) + items += ''; + if (actions.includes('DELETE')) + items += ''; + + return ``; +} + +// Function to set data attributes on the row +function setRowDataAttributes(row, rowIndex) { + row.attr('data-row-no', rowIndex); +} + +// Function to format currency as CAD +function formatDatagridCurrency(value) { + return new Intl.NumberFormat('en-CA', + { style: 'currency', currency: 'CAD', minimumFractionDigits: 2, maximumFractionDigits: 2 }).format(value); +} + +// Function to check if a value is numeric +function isDatagridCellNumeric(value) { + return Number.isFinite(Number.parseFloat(value)); +} + +// Function to calculate sum for a specific column +function calculateDatagridColumnSum(table, columnIndex) { + let total = 0; + table.column(columnIndex).data().each(function (value) { + // Remove currency symbols and commas for numeric check + let cleanedValue = value.replace(/[^\d.-]/g, ''); + if (isDatagridCellNumeric(cleanedValue)) { + total += Number.parseFloat(cleanedValue); + } + }); + return total; +} + $(function () { const UIElements = { tables: $('.custom-dynamic-table'), tableSearches: $('.custom-tbl-search') }; - + let editDatagridRowModal = new abp.ModalManager({ viewUrl: '../Components/DataGrid/EditDataRowModal' }); @@ -19,23 +71,13 @@ $(function () { // Refresh any update table level attributes resetTableAttributes($(newRowNode), response); - // Create the edit button HTML and append it to the last cell of the new row - $(newRowNode).find('td:last').html(getEditRowButtonTemplate()); - - // Attach click event handler to the newly added button - $(newRowNode).find('.row-edit-btn').on('click', function () { - let button = this; // `this` refers to the button element - editDataRow(button); - }); + // Configure action buttons on the last cell of the new row + let fieldId = $(newRowNode).closest('table')[0].id; + configureActionButtonsForCell($(newRowNode).find('td:last')[0], getTableActions(fieldId)); abp.notify.success('Row added successfully.', 'New Row'); } - // Function to set data attributes on the row - function setRowDataAttributes(row, rowIndex) { - row.attr('data-row-no', rowIndex); - } - // Function to reset the table level attributes function resetTableAttributes(row, response) { let table = row.closest('table'); @@ -62,10 +104,10 @@ $(function () { function updateRow(table, dataToUpdate, rowIndex) { $.each(dataToUpdate, function (columnName, newValue) { let columnIndex = getColumnIndex(table, columnName); - if (columnIndex !== -1) { - table.cell(rowIndex, columnIndex).data(newValue); - } else { + if (columnIndex === -1) { console.warn('Column not found:', columnName); + } else { + table.cell(rowIndex, columnIndex).data(newValue); } }); @@ -105,18 +147,6 @@ $(function () { handleEditDatagridRowModalResult(response); }); - // Function to calculate sum for a specific column - function calculateColumnSum(table, columnIndex) { - let total = 0; - table.column(columnIndex).data().each(function (value) { - // Remove currency symbols and commas for numeric check - let cleanedValue = value.replace(/[^\d.-]/g, ''); - if (isNumeric(cleanedValue)) { - total += parseFloat(cleanedValue); - } - }); - return total; - } // Function to update totals function updateTotals(table, fieldId) { @@ -129,11 +159,11 @@ $(function () { let columnIndex = getColumnIndex(table, key); if (columnIndex !== -1) { - let total = calculateColumnSum(table, columnIndex); + let total = calculateDatagridColumnSum(table, columnIndex); // Update the input field with the calculated total if ($(this).data('field-type') === 'Currency') { - $(this).val(formatCurrency(total)); + $(this).val(formatDatagridCurrency(total)); } else { $(this).val(total); } @@ -141,17 +171,6 @@ $(function () { }); } - // Function to format currency as CAD - function formatCurrency(value) { - return new Intl.NumberFormat('en-CA', - { style: 'currency', currency: 'CAD', minimumFractionDigits: 2, maximumFractionDigits: 2 }).format(value); - } - - // Function to check if a value is numeric - function isNumeric(value) { - return !isNaN(value) && isFinite(value); - } - // Function to get the index of a column by its key function getColumnIndex(table, key) { let headers = table.columns().header().toArray(); @@ -274,28 +293,37 @@ $(function () { } function configureButtons(fieldId) { - let options = ($(`#table-options-${fieldId}`).val()).split(','); + let options = new Set(($(`#table-options-${fieldId}`).val()).split(',')); // Always include ColumnVisibility button regardless of options - let availableOptions = actionButtons.filter(item => options.includes(item.id) || item.id === 'ColumnVisibility'); + let availableOptions = actionButtons.filter(item => options.has(item.id) || item.id === 'ColumnVisibility'); return availableOptions; } + function getTableActions(fieldId) { + let options = new Set(($(`#table-options-${fieldId}`).val()).split(',')); + let actions = ['EDIT']; + if (options.has('AddRecord')) actions.push('DELETE'); + return actions; + } + // Function to configure action buttons for a table cell - function configureActionButtonForCell(cell) { - cell.innerHTML = getEditRowButtonTemplate(); // Add edit button to each cell + function configureActionButtonsForCell(cell, actions) { + cell.innerHTML = getDatagridActionsRowButtonTemplate(actions); - // Attach click event handler to the newly added button $(cell).find('.row-edit-btn').on('click', function () { - let button = this; // `this` refers to the button element - editDataRow(button); + editDataRow(this); + }); + + $(cell).find('.row-delete-btn').on('click', function () { + deleteDataRow(this); }); } // Function to setup the actions column - function setupActionsColumn(table, columnIndex) { - table.column(columnIndex).header().innerHTML = 'Actions'; // Update column header if needed + function setupActionsColumn(table, columnIndex, actions) { + table.column(columnIndex).header().innerHTML = 'Actions'; table.column(columnIndex).nodes().each(function (cell) { - configureActionButtonForCell(cell); + configureActionButtonsForCell(cell, actions); }); } @@ -303,18 +331,15 @@ $(function () { // Move buttons to custom container table.buttons().container().prependTo(`#btn-container-${fieldId}`); - // Add edit buttons to the last column (Actions) + let actions = getTableActions(fieldId); + table.columns().every(function (index) { - if (index === table.columns().count() - 1) { // Check if it is the last column - setupActionsColumn(table, index); + if (index === table.columns().count() - 1) { + setupActionsColumn(table, index, actions); } }); } - function getEditRowButtonTemplate() { - return ''; - } - function editDataRow(button) { // Get the parent element of the button let row = $(button).closest('tr'); @@ -336,6 +361,75 @@ $(function () { }); } + function refreshGridAfterDelete(fieldId, tableDataSet, container) { + $.ajax({ + url: abp.appPath + 'Flex/Widgets/DataGrid/RefreshByField', + type: 'GET', + data: { + valueId: tableDataSet.valueId, + fieldId: fieldId, + modelName: fieldId, + worksheetId: tableDataSet.wsId, + worksheetInstanceId: tableDataSet.wsiId, + uiAnchor: tableDataSet.wsAnchor + }, + success: function (html) { + $('#' + fieldId).DataTable().destroy(); + $('#table-options-' + fieldId).parent().html(html); + buildDataTables($('#' + fieldId)); + abp.notify.success('Row deleted successfully.', 'Delete Row'); + }, + error: function () { + container.find('.grid-loading-overlay').remove(); + abp.notify.error('Failed to refresh the grid.', 'Delete Row'); + } + }); + } + + function deleteDataRow(button) { + let row = $(button).closest('tr'); + let rowDataSet = row[0].dataset; + let table = $(button).closest('table'); + let tableDataSet = table[0].dataset; + let fieldId = tableDataSet.fieldId; + let container = table.closest('.custom-grid-container'); + + abp.message.confirm( + 'Are you sure you want to delete this row?', + 'Delete Row', + function (confirmed) { + if (!confirmed) return; + + container.append('
Loading...
'); + + $.ajax({ + url: abp.appPath + 'Flex/Widgets/DataGrid/DeleteRow', + type: 'POST', + data: { + valueId: tableDataSet.valueId, + row: rowDataSet.rowNo, + worksheetInstanceId: tableDataSet.wsiId, + }, + success: function () { + refreshGridAfterDelete(fieldId, tableDataSet, container); + }, + error: function () { + container.find('.grid-loading-overlay').remove(); + abp.notify.error('Failed to delete the row.', 'Delete Row'); + } + }); + } + ); + } + + $(document).on('mouseenter', '.custom-dynamic-table .dropdown', function () { + let rect = this.getBoundingClientRect(); + $(this).find('.dropdown-content').css({ + top: rect.bottom + 'px', + left: rect.left + 'px' + }); + }); + PubSub.subscribe( 'worksheet_preview_datagrid_refresh', () => { diff --git a/applications/Unity.GrantManager/modules/Unity.Flex/test/Unity.Flex.Application.Tests/DataGrid/DataGridWriteServiceTests.cs b/applications/Unity.GrantManager/modules/Unity.Flex/test/Unity.Flex.Application.Tests/DataGrid/DataGridWriteServiceTests.cs new file mode 100644 index 0000000000..c6a7c93642 --- /dev/null +++ b/applications/Unity.GrantManager/modules/Unity.Flex/test/Unity.Flex.Application.Tests/DataGrid/DataGridWriteServiceTests.cs @@ -0,0 +1,119 @@ +using NSubstitute; +using Shouldly; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text.Json; +using System.Threading.Tasks; +using Unity.Flex.Web.Pages.Flex; +using Unity.Flex.Worksheets; +using Unity.Flex.Worksheets.Values; +using Unity.Flex.WorksheetInstances; +using Xunit; + +namespace Unity.Flex.DataGrid; + +public class DataGridWriteServiceTests +{ + private readonly ICustomFieldAppService _customFieldAppService; + private readonly ICustomFieldValueAppService _customFieldValueAppService; + private readonly IWorksheetInstanceAppService _worksheetInstanceAppService; + private readonly DataGridWriteService _service; + + public DataGridWriteServiceTests() + { + _customFieldAppService = Substitute.For(); + _customFieldValueAppService = Substitute.For(); + _worksheetInstanceAppService = Substitute.For(); + _service = new DataGridWriteService(_customFieldAppService, _customFieldValueAppService, _worksheetInstanceAppService); + } + + [Fact] + [Trait("Category", "Unit")] + public async Task DeleteRowAsync_RemovesCorrectRow() + { + // Arrange + var valueId = Guid.NewGuid(); + var worksheetInstanceId = Guid.NewGuid(); + + SetupValueWithRows(valueId, ["row0", "row1", "row2"]); + + string? capturedJson = null; + _customFieldValueAppService + .ExplicitSetAsync(valueId, Arg.Do(j => capturedJson = j)) + .Returns(Task.CompletedTask); + + // Act + await _service.DeleteRowAsync(valueId, 1, worksheetInstanceId); + + // Assert + var rows = DeserializeRows(capturedJson); + rows.Count.ShouldBe(2); + rows[0].Cells[0].Value.ShouldBe("row0"); + rows[1].Cells[0].Value.ShouldBe("row2"); + } + + [Fact] + [Trait("Category", "Unit")] + public async Task DeleteRowAsync_LastRow_LeavesEmptyRowsArray() + { + // Arrange + var valueId = Guid.NewGuid(); + var worksheetInstanceId = Guid.NewGuid(); + + SetupValueWithRows(valueId, ["row0"]); + + string? capturedJson = null; + _customFieldValueAppService + .ExplicitSetAsync(valueId, Arg.Do(j => capturedJson = j)) + .Returns(Task.CompletedTask); + + // Act + await _service.DeleteRowAsync(valueId, 0, worksheetInstanceId); + + // Assert + var rows = DeserializeRows(capturedJson); + rows.ShouldBeEmpty(); + } + + [Fact] + [Trait("Category", "Unit")] + public async Task DeleteRowAsync_OutOfBoundsRow_DoesNotPersist() + { + // Arrange + var valueId = Guid.NewGuid(); + var worksheetInstanceId = Guid.NewGuid(); + + SetupValueWithRows(valueId, ["row0"]); + + // Act + await _service.DeleteRowAsync(valueId, 5, worksheetInstanceId); + + // Assert + await _customFieldValueAppService + .DidNotReceive() + .ExplicitSetAsync(Arg.Any(), Arg.Any()); + } + + private void SetupValueWithRows(Guid valueId, IEnumerable rowValues) + { + var rows = rowValues.Select(v => new DataGridRow + { + Cells = [new DataGridRowCell("col", v)] + }).ToList(); + + var json = JsonSerializer.Serialize(new DataGridValue(new DataGridRowsValue(rows))); + + _customFieldValueAppService + .GetAsync(valueId) + .Returns(new CustomFieldValueDto { Id = valueId, CurrentValue = json }); + } + + private static List DeserializeRows(string? json) + { + json.ShouldNotBeNull(); + var grid = JsonSerializer.Deserialize(json!); + var rowsJson = grid!.Value!.ToString()!; + return JsonSerializer.Deserialize(rowsJson)!.Rows; + } +} diff --git a/applications/Unity.GrantManager/modules/Unity.Flex/test/Unity.Flex.Application.Tests/Unity.Flex.Application.Tests.csproj b/applications/Unity.GrantManager/modules/Unity.Flex/test/Unity.Flex.Application.Tests/Unity.Flex.Application.Tests.csproj index f7a1f763c1..fbe7add032 100644 --- a/applications/Unity.GrantManager/modules/Unity.Flex/test/Unity.Flex.Application.Tests/Unity.Flex.Application.Tests.csproj +++ b/applications/Unity.GrantManager/modules/Unity.Flex/test/Unity.Flex.Application.Tests/Unity.Flex.Application.Tests.csproj @@ -10,6 +10,7 @@ + diff --git a/applications/Unity.GrantManager/modules/Unity.Payments/src/Unity.Payments.Application.Contracts/PaymentRequests/IPaymentRequestAppService.cs b/applications/Unity.GrantManager/modules/Unity.Payments/src/Unity.Payments.Application.Contracts/PaymentRequests/IPaymentRequestAppService.cs index bd604dbc3c..d4b8dd0de1 100644 --- a/applications/Unity.GrantManager/modules/Unity.Payments/src/Unity.Payments.Application.Contracts/PaymentRequests/IPaymentRequestAppService.cs +++ b/applications/Unity.GrantManager/modules/Unity.Payments/src/Unity.Payments.Application.Contracts/PaymentRequests/IPaymentRequestAppService.cs @@ -10,7 +10,7 @@ public interface IPaymentRequestAppService : IApplicationService { Task> CreateAsync(List paymentRequests); Task> CreateHistoricalAsync(List paymentRequests); - Task> GetListAsync(PagedAndSortedResultRequestDto input); + Task> GetListAsync(PaymentRequestListInputDto input); Task GetTotalPaymentRequestAmountByCorrelationIdAsync(Guid correlationId); Task> GetListByApplicationIdAsync(Guid applicationId); Task> GetListByPaymentIdsAsync(List paymentIds); diff --git a/applications/Unity.GrantManager/modules/Unity.Payments/src/Unity.Payments.Application.Contracts/PaymentRequests/PaymentRequestListInputDto.cs b/applications/Unity.GrantManager/modules/Unity.Payments/src/Unity.Payments.Application.Contracts/PaymentRequests/PaymentRequestListInputDto.cs new file mode 100644 index 0000000000..ede13c1d91 --- /dev/null +++ b/applications/Unity.GrantManager/modules/Unity.Payments/src/Unity.Payments.Application.Contracts/PaymentRequests/PaymentRequestListInputDto.cs @@ -0,0 +1,10 @@ +using System.Collections.Generic; +using Volo.Abp.Application.Dtos; + +namespace Unity.Payments.PaymentRequests +{ + public class PaymentRequestListInputDto : PagedAndSortedResultRequestDto + { + public IReadOnlyList? RequestedFields { get; set; } + } +} \ No newline at end of file diff --git a/applications/Unity.GrantManager/modules/Unity.Payments/src/Unity.Payments.Application/Domain/Services/IPaymentRequestQueryManager.cs b/applications/Unity.GrantManager/modules/Unity.Payments/src/Unity.Payments.Application/Domain/Services/IPaymentRequestQueryManager.cs index b2acd68f79..f9c74fb61c 100644 --- a/applications/Unity.GrantManager/modules/Unity.Payments/src/Unity.Payments.Application/Domain/Services/IPaymentRequestQueryManager.cs +++ b/applications/Unity.GrantManager/modules/Unity.Payments/src/Unity.Payments.Application/Domain/Services/IPaymentRequestQueryManager.cs @@ -13,7 +13,7 @@ public interface IPaymentRequestQueryManager Task GetPaymentRequestCountAsync(); Task GetPaymentRequestByIdAsync(Guid paymentRequestId); Task> GetPaymentRequestsByIdsAsync(List paymentRequestIds, bool includeDetails = false); - Task> GetPagedPaymentRequestsWithIncludesAsync(int skipCount, int maxResultCount, string sorting); + Task> GetPagedPaymentRequestsWithIncludesAsync(int skipCount, int maxResultCount, string sorting, IReadOnlyList? requestedFields = null); Task> GetListByApplicationIdAsync(Guid applicationId); Task> GetListByApplicationIdsAsync(List applicationIds); Task> GetListByPaymentIdsAsync(List paymentIds); @@ -24,7 +24,7 @@ public interface IPaymentRequestQueryManager // DTO Creation & Mapping Task CreatePaymentRequestDtoAsync(Guid paymentRequestId); - Task> MapToDtoAndLoadDetailsAsync(List paymentsList); + Task> MapToDtoAndLoadDetailsAsync(List paymentsList, IReadOnlyList? requestedFields = null); Task GetAccountDistributionCodeAsync(AccountCodingDto? accountCoding); // Queue Operations diff --git a/applications/Unity.GrantManager/modules/Unity.Payments/src/Unity.Payments.Application/Domain/Services/PaymentRequestQueryManager.cs b/applications/Unity.GrantManager/modules/Unity.Payments/src/Unity.Payments.Application/Domain/Services/PaymentRequestQueryManager.cs index 0b61ed196f..0cc8b10f6c 100644 --- a/applications/Unity.GrantManager/modules/Unity.Payments/src/Unity.Payments.Application/Domain/Services/PaymentRequestQueryManager.cs +++ b/applications/Unity.GrantManager/modules/Unity.Payments/src/Unity.Payments.Application/Domain/Services/PaymentRequestQueryManager.cs @@ -23,6 +23,43 @@ public class PaymentRequestQueryManager( IObjectMapper objectMapper, IApplicationRepository applicationRepository) : DomainService, IPaymentRequestQueryManager { + private static readonly HashSet SiteFields = new(StringComparer.OrdinalIgnoreCase) + { + "siteNumber", + "payGroup" + }; + + private static readonly HashSet AccountCodingFields = new(StringComparer.OrdinalIgnoreCase) + { + "accountCodingDisplay" + }; + + private static readonly HashSet TagFields = new(StringComparer.OrdinalIgnoreCase) + { + "paymentTags" + }; + + private static readonly HashSet RequesterFields = new(StringComparer.OrdinalIgnoreCase) + { + "paymentRequesterName" + }; + + private static readonly HashSet ExpenseApprovalFields = new(StringComparer.OrdinalIgnoreCase) + { + "l1ApproverName", + "l1ApprovalDate", + "l2ApproverName", + "l2ApprovalDate", + "l3ApproverName", + "l3ApprovalDate" + }; + + private static readonly HashSet ApplicantFields = new(StringComparer.OrdinalIgnoreCase) + { + "applicantName", + "category" + }; + public Task GetPaymentRequestCountBySiteIdAsync(Guid siteId) { return paymentRequestRepository.GetPaymentRequestCountBySiteId(siteId); @@ -43,17 +80,40 @@ public async Task> GetPaymentRequestsByIdsAsync(List return await paymentRequestRepository.GetListAsync(x => paymentRequestIds.Contains(x.Id), includeDetails: includeDetails); } - public async Task> GetPagedPaymentRequestsWithIncludesAsync(int skipCount, int maxResultCount, string sorting) + public async Task> GetPagedPaymentRequestsWithIncludesAsync(int skipCount, int maxResultCount, string sorting, IReadOnlyList? requestedFields = null) { - await paymentRequestRepository.GetPagedListAsync(skipCount, maxResultCount, sorting, includeDetails: true); - var paymentsQueryable = await paymentRequestRepository.GetQueryableAsync(); + var includeSite = IncludesAny(requestedFields, SiteFields); + var includeAccountCoding = IncludesAny(requestedFields, AccountCodingFields); + var includeTags = IncludesAny(requestedFields, TagFields); + var includeExpenseApprovals = IncludesAny(requestedFields, ExpenseApprovalFields); + + paymentsQueryable = paymentsQueryable.AsNoTracking(); + + if (includeSite) + { + paymentsQueryable = paymentsQueryable.Include(pr => pr.Site); + } + + if (includeAccountCoding) + { + paymentsQueryable = paymentsQueryable.Include(pr => pr.AccountCoding); + } + + if (includeTags) + { + paymentsQueryable = paymentsQueryable + .Include(pr => pr.PaymentTags) + .ThenInclude(pt => pt.Tag); + } + + if (includeExpenseApprovals) + { + paymentsQueryable = paymentsQueryable.Include(pr => pr.ExpenseApprovals); + } + #pragma warning disable CS8620 // Argument cannot be used for parameter due to differences in the nullability of reference types. - var paymentWithIncludes = await paymentsQueryable - .Include(pr => pr.AccountCoding) - .Include(pr => pr.PaymentTags) - .ThenInclude(pt => pt.Tag) - .ToListAsync(); + var paymentWithIncludes = await paymentsQueryable.ToListAsync(); #pragma warning restore CS8620 // Argument cannot be used for parameter due to differences in the nullability of reference types. return paymentWithIncludes; @@ -126,11 +186,29 @@ public async Task GetTotalPaymentRequestAmountByCorrelationIdAsync(Guid return await paymentRequestRepository.GetTotalPaymentRequestAmountByCorrelationIdAsync(correlationId); } - public async Task> MapToDtoAndLoadDetailsAsync(List paymentsList) + public async Task> MapToDtoAndLoadDetailsAsync(List paymentsList, IReadOnlyList? requestedFields = null) { + var includeApplicant = IncludesAny(requestedFields, ApplicantFields); + var includeRequester = IncludesAny(requestedFields, RequesterFields); + var includeExpenseApprovals = IncludesAny(requestedFields, ExpenseApprovalFields); + var includeAccountCoding = IncludesAny(requestedFields, AccountCodingFields); + var paymentDtos = objectMapper.Map, List>(paymentsList); - // Batch-fetch applicant IDs for all unique correlation IDs (application IDs) + if (includeApplicant) + { + await LoadApplicantDetailsAsync(paymentDtos); + } + + var userDictionary = await BuildUserDictionaryAsync(paymentDtos, includeRequester, includeExpenseApprovals); + + await ApplyUserDetailsToPaymentsAsync(paymentDtos, userDictionary, includeRequester, includeAccountCoding, includeExpenseApprovals); + + return paymentDtos; + } + + private async Task LoadApplicantDetailsAsync(List paymentDtos) + { var applicationIds = paymentDtos .Select(p => p.CorrelationId) .Distinct() @@ -151,22 +229,36 @@ public async Task> MapToDtoAndLoadDetailsAsync(List> BuildUserDictionaryAsync( + List paymentDtos, + bool includeRequester, + bool includeExpenseApprovals) + { + var userDictionary = new Dictionary(); - // Flatten all DecisionUserIds from ExpenseApprovals across all PaymentRequestDtos - List paymentRequesterIds = [.. paymentDtos - .Select(payment => payment.CreatorId) - .OfType() - .Distinct()]; + if (!includeRequester && !includeExpenseApprovals) + { + return userDictionary; + } - List expenseApprovalCreatorIds = [.. paymentDtos - .SelectMany(payment => payment.ExpenseApprovals) - .Where(expenseApproval => expenseApproval.Status != ExpenseApprovalStatus.Requested) - .Select(expenseApproval => expenseApproval.DecisionUserId) - .OfType() - .Distinct()]; + var paymentRequesterIds = includeRequester + ? paymentDtos + .Select(payment => payment.CreatorId) + .OfType() + .Distinct() + : []; + + var expenseApprovalCreatorIds = includeExpenseApprovals + ? paymentDtos + .SelectMany(payment => payment.ExpenseApprovals ?? []) + .Where(expenseApproval => expenseApproval.Status != ExpenseApprovalStatus.Requested) + .Select(expenseApproval => expenseApproval.DecisionUserId) + .OfType() + .Distinct() + : []; - // Call external lookup for each distinct User Id and store in a dictionary. - var userDictionary = new Dictionary(); var allUserIds = paymentRequesterIds.Concat(expenseApprovalCreatorIds).Distinct(); foreach (var userId in allUserIds) { @@ -177,34 +269,59 @@ public async Task> MapToDtoAndLoadDetailsAsync(List paymentDtos, + Dictionary userDictionary, + bool includeRequester, + bool includeAccountCoding, + bool includeExpenseApprovals) + { foreach (var paymentRequestDto in paymentDtos) { - if (paymentRequestDto.CreatorId.HasValue + if (includeRequester + && paymentRequestDto.CreatorId.HasValue && userDictionary.TryGetValue(paymentRequestDto.CreatorId.Value, out var paymentRequestUserDto)) { paymentRequestDto.CreatorUser = paymentRequestUserDto; } - if (paymentRequestDto.AccountCoding != null) + if (includeAccountCoding && paymentRequestDto.AccountCoding != null) { paymentRequestDto.AccountCodingDisplay = await GetAccountDistributionCodeAsync(paymentRequestDto.AccountCoding); } - if (paymentRequestDto.ExpenseApprovals != null) + if (includeExpenseApprovals && paymentRequestDto.ExpenseApprovals != null) { - foreach (var expenseApproval in paymentRequestDto.ExpenseApprovals) - { - if (expenseApproval.DecisionUserId.HasValue - && userDictionary.TryGetValue(expenseApproval.DecisionUserId.Value, out var expenseApprovalUserDto)) - { - expenseApproval.DecisionUser = expenseApprovalUserDto; - } - } + ApplyExpenseApprovalUsers(paymentRequestDto.ExpenseApprovals, userDictionary); } } + } - return paymentDtos; + private static void ApplyExpenseApprovalUsers( + IEnumerable expenseApprovals, + Dictionary userDictionary) + { + foreach (var expenseApproval in expenseApprovals) + { + if (expenseApproval.DecisionUserId.HasValue + && userDictionary.TryGetValue(expenseApproval.DecisionUserId.Value, out var expenseApprovalUserDto)) + { + expenseApproval.DecisionUser = expenseApprovalUserDto; + } + } + } + + private static bool IncludesAny(IReadOnlyList? requestedFields, IReadOnlySet fieldsToCheck) + { + if (requestedFields == null || requestedFields.Count == 0) + { + return true; + } + + return requestedFields.Any(fieldsToCheck.Contains); } public Task GetAccountDistributionCodeAsync(AccountCodingDto? accountCoding) 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 f476876bd9..1953c6caf4 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 @@ -42,6 +42,13 @@ public static void ConfigurePayments( .OnDelete(DeleteBehavior.NoAction); b.HasIndex(e => e.ReferenceNumber).IsUnique(); + b.HasIndex(e => e.CreationTime); + b.HasIndex(e => e.Status); + b.HasIndex(e => e.CorrelationId); + b.HasIndex(e => e.SiteId); + b.HasIndex(e => e.AccountCodingId); + b.HasIndex(e => new { e.TenantId, e.CreationTime }) + .HasFilter("\"IsDeleted\" = false"); // FSB Notification Tracking b.Property(x => x.FsbNotificationEmailLogId).IsRequired(false); 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 fd46067031..58a7ae9520 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 @@ -325,18 +325,28 @@ public async Task> GetListByApplicationIdsAsync(List> GetListAsync(PagedAndSortedResultRequestDto input) - { - var totalCount = await paymentRequestQueryManager.GetPaymentRequestCountAsync(); + public async Task> GetListAsync(PaymentRequestListInputDto input) + { using (dataFilter.Disable()) { - var paymentWithIncludes = await paymentRequestQueryManager.GetPagedPaymentRequestsWithIncludesAsync(input.SkipCount, input.MaxResultCount, input.Sorting ?? string.Empty); + var paymentWithIncludes = await paymentRequestQueryManager.GetPagedPaymentRequestsWithIncludesAsync( + input.SkipCount, + input.MaxResultCount, + input.Sorting ?? string.Empty, + input.RequestedFields); - var mappedPayments = await paymentRequestQueryManager.MapToDtoAndLoadDetailsAsync(paymentWithIncludes); + var mappedPayments = await paymentRequestQueryManager.MapToDtoAndLoadDetailsAsync( + paymentWithIncludes, + input.RequestedFields); paymentRequestQueryManager.ApplyErrorSummary(mappedPayments); - return new PagedResultDto(totalCount, mappedPayments); +#pragma warning disable S125 + //While the DataTable is client side, server side count query is not necessary. + //var totalCount = await paymentRequestQueryManager.GetPaymentRequestCountAsync(); +#pragma warning restore S125 + return new PagedResultDto(paymentWithIncludes.Count, mappedPayments); + } } diff --git a/applications/Unity.GrantManager/modules/Unity.Payments/src/Unity.Payments.Web/Pages/PaymentRequests/Index.css b/applications/Unity.GrantManager/modules/Unity.Payments/src/Unity.Payments.Web/Pages/PaymentRequests/Index.css index 267a66e061..814119e4a9 100644 --- a/applications/Unity.GrantManager/modules/Unity.Payments/src/Unity.Payments.Web/Pages/PaymentRequests/Index.css +++ b/applications/Unity.GrantManager/modules/Unity.Payments/src/Unity.Payments.Web/Pages/PaymentRequests/Index.css @@ -51,3 +51,36 @@ background-color: #FEEAEA; color: #FF0909 !important; } + +/* DataTables stateRestore - Save View */ +.container-fluid .dtsr-background { + background: rgba(0, 0, 0, 0.5) !important; +} + +.cstm-save-view .dt-button-collection { + width: 230px; +} + +.cstm-save-view .dt-button-split a { + line-height: 35px; +} + +.container-fluid .dtsr-creation-title, +.container-fluid .dtsr-confirmation-title { + font-weight: 700; + font-size: 1.25rem; +} + +.container-fluid .dtsr-creation input, +.container-fluid .dtsr-rename-modal input { + font-size: var(--bc-font-size); + color: var(--bc-colors-grey-text-500); + border-radius: 4px !important; + border: 2px solid var(--bc-colors-blue-primary); +} + +.container-fluid div.dtsr-confirmation button, +.container-fluid div.dtsr-creation button { + color: var(--bc-colors-white-primary-500); + background-color: var(--bc-colors-blue-primary); +} 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 fed4e46b91..f07a18be78 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 @@ -1,6 +1,7 @@ $(function () { const l = abp.localization.getResource('Payments'); const nullPlaceholder = '—'; + const requestedFieldsStorageKey = 'PaymentRequests_RequestedFields'; const formatter = createNumberFormatter(); const guidPattern = /^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$/i; let dt = $('#PaymentRequestListTable'); @@ -9,11 +10,11 @@ $(function () { const listColumns = getColumns(); const defaultVisibleColumns = [ + 'select', 'referenceNumber', 'batchName', 'applicantName', 'supplierNumber', - 'creationTime', 'siteNumber', 'contactNumber', 'invoiceNumber', @@ -30,6 +31,30 @@ $(function () { 'accountCodingDisplay', 'category' ]; + let initialLoad = true; + let isRestoringState = false; + let refreshDataTimeout = null; + + let languageSetValues = { + buttons: { + stateRestore: 'View %d' + }, + stateRestore: { + creationModal: { + title: 'Create View', + name: 'Name', + button: 'Save', + }, + emptyStates: 'No saved views', + renameTitle: 'Rename View', + renameLabel: 'New name for "%s"', + removeTitle: 'Delete View', + removeConfirm: 'Are you sure you want to delete "%s"?', + removeSubmit: 'Delete', + duplicateError: 'A view with this name already exists.', + removeError: 'Failed to remove view.', + } + }; let paymentRequestStatusModal = new abp.ModalManager({ viewUrl: 'PaymentApprovals/UpdatePaymentRequestStatus', @@ -128,6 +153,66 @@ $(function () { id: 'btn-toggle-filter' } }, + { + extend: 'savedStates', + className: 'custom-table-btn flex-none btn btn-secondary grp-savedStates', + config: { + creationModal: true, + splitSecondaries: [ + { extend: 'updateState', text: ' Update' }, + { extend: 'renameState', text: ' Rename' }, + { extend: 'removeState', text: ' Delete' } + ] + }, + buttons: [ + { extend: 'createState', text: 'Save As View' }, + { + text: 'Reset to Default View', + action: function (e, dt, node, config) { + let dtInit = dt.init(); + let initialSortOrder = dtInit?.order ?? []; + + dt.columns().visible(false); + + const allColumnNames = dt.settings()[0].aoColumns + .map(col => col.name) + .filter(colName => !defaultVisibleColumns.includes(colName)); + + const orderedIndexes = []; + defaultVisibleColumns.forEach((colName) => { + const colIdx = dt.column(`${colName}:name`).index(); + if (colIdx !== undefined && colIdx !== -1) { + dt.column(colIdx).visible(true); + orderedIndexes.push(colIdx); + } + }); + + allColumnNames.forEach((colName) => { + const colIdx = dt.column(`${colName}:name`).index(); + if (colIdx !== undefined && colIdx !== -1) { + orderedIndexes.push(colIdx); + } + }); + + dt.colReorder.order(orderedIndexes); + dt.columns.adjust(); + + if (typeof dt.filterRow === 'function') { + const filterRowApi = dt.filterRow(); + if (filterRowApi && typeof filterRowApi?.clearFilters === 'function') { + filterRowApi.clearFilters(); + } + } + + $('.dt-search input').val(''); + $('#search').val(''); + dt.search('').order(initialSortOrder).draw(); + } + }, + { extend: 'removeAllStates', text: 'Delete All Views' }, + { extend: 'spacer', style: 'bar' } + ] + }, { extend: 'csv', text: 'Export', @@ -173,16 +258,96 @@ $(function () { dir: 'desc' }, dataEndpoint: unity.payments.paymentRequests.paymentRequest.getList, - data: {}, + data: function () { + let requestedFields; + if (dataTable) { + try { + const cols = dataTable.settings()[0].aoColumns; + requestedFields = cols + .filter(function (col, idx) { return dataTable.column(idx).visible(); }) + .map(function (col) { return col.sName; }) + .filter(function (name) { return !!name; }); + if (requestedFields.length > 0) { + localStorage.setItem(requestedFieldsStorageKey, JSON.stringify(requestedFields)); + } + } catch { + // DataTable may still be initializing. + } + } + + if (!requestedFields || requestedFields.length === 0) { + try { + const saved = localStorage.getItem(requestedFieldsStorageKey); + if (saved) { + requestedFields = JSON.parse(saved); + } + } catch { + // Ignore local storage parse errors and use defaults. + } + } + + if (!requestedFields || requestedFields.length === 0) { + requestedFields = defaultVisibleColumns; + } + + return { + requestedFields: requestedFields + }; + }, responseCallback, actionButtons, + deferRender: true, pagingEnabled: true, reorderEnabled: true, - languageSetValues: {}, + languageSetValues, dataTableName: 'PaymentRequestListTable', dynamicButtonContainerId: 'dynamicButtonContainerId', useNullPlaceholder: true, - fixedHeaders: true + fixedHeaders: true, + onStateSaveParams: function (settings, data) { + data.customFilters = { + externalSearchValue: $('#search').val() || '' + }; + }, + onStateLoadParams: function (settings, data) { + if (!initialLoad) { + isRestoringState = true; + if (data?.customFilters) { + $('#search').val(data.customFilters.externalSearchValue || ''); + } + } + }, + onStateLoaded: function (dtApi, data) { + if (!initialLoad) { + isRestoringState = false; + dtApi.ajax.reload(null, false); + } + initialLoad = false; + } + }); + + $('.grp-savedStates').text('Save View'); + $('.grp-savedStates').closest('.btn-group').addClass('cstm-save-view'); + + dataTable.on('column-visibility.dt', function (e, settings, columnIdx) { + try { + const cols = dataTable.settings()[0].aoColumns; + const visibleFields = cols + .filter(function (col, idx) { return dataTable.column(idx).visible(); }) + .map(function (col) { return col.sName; }) + .filter(function (name) { return !!name; }); + if (visibleFields.length > 0) { + localStorage.setItem(requestedFieldsStorageKey, JSON.stringify(visibleFields)); + } + // During a saved-view restore, isRestoringState is true and onStateLoaded + // fires a single authoritative reload after all columns are applied. + if (!isRestoringState && cols[columnIdx]?.refreshData) { + clearTimeout(refreshDataTimeout); + refreshDataTimeout = setTimeout(function () { + dataTable.ajax.reload(null, false); + }, 300); + } + } catch { } }); // Attach the draw event to add custom row coloring logic @@ -380,6 +545,7 @@ $(function () { name: 'applicantName', data: 'payeeName', className: 'data-table-header', + refreshData: true, index: columnIndex, render: function (data, type, row) { let applicantName = (typeof data !== 'string' || data.trim() === '') ? 'Applicant Name' : data; @@ -422,7 +588,7 @@ $(function () { const safeCode = $.fn.dataTable.render.text().display(code); - if (type === 'display' && abp.auth.isGranted('GrantApplicationManagement.Applicants.ViewList')) { + if (type === 'display' && abp.auth.isGranted('GrantApplicationManagement.Applications')) { const applicationId = row?.correlationId; const isGuid = applicationId && guidPattern.test(applicationId); @@ -466,6 +632,7 @@ $(function () { name: 'siteNumber', data: 'site', className: 'data-table-header', + refreshData: true, index: columnIndex, render: function (data) { return data?.number; @@ -499,6 +666,7 @@ $(function () { name: 'payGroup', data: 'site', className: 'data-table-header', + refreshData: true, index: columnIndex, render: function (data) { if (!data) return ''; @@ -621,6 +789,7 @@ $(function () { name: 'paymentRequesterName', data: 'creatorUser', className: 'data-table-header', + refreshData: true, index: columnIndex, render: function (data) { return formatName(data); @@ -634,6 +803,7 @@ $(function () { name: `l${level}ApproverName`, data: 'expenseApprovals', className: 'data-table-header', + refreshData: true, index: columnIndex, render: function (data) { const approval = getExpenseApprovalsDetails(data, level); @@ -652,6 +822,7 @@ $(function () { name: `l${level}ApprovalDate`, data: 'expenseApprovals', className: 'data-table-header text-nowrap', + refreshData: true, index: columnIndex, render: function (data, type) { let approval = getExpenseApprovalsDetails(data, level); @@ -729,9 +900,10 @@ $(function () { name: 'paymentTags', data: 'paymentTags', className: '', + refreshData: true, index: columnIndex, render: function (data) { - let tagNames = data + let tagNames = (data ?? []) .filter(x => x?.tag?.name) .map(x => x.tag.name); return tagNames.join(', ') ?? ''; @@ -756,6 +928,7 @@ $(function () { name: 'accountCodingDisplay', data: 'accountCodingDisplay', className: 'data-table-header', + refreshData: true, index: columnIndex, render: function (data) { if (data + "" !== "undefined" && data?.length > 0) { @@ -789,6 +962,7 @@ $(function () { title: l('ApplicationPaymentListTable:Category'), name: 'category', data: 'category', + refreshData: true, className: 'data-table-header', index: columnIndex, render: function (data) { @@ -798,10 +972,13 @@ $(function () { } function getExpenseApprovalsDetails(expenseApprovals, type) { - return expenseApprovals.find(x => x.type == type); + return (expenseApprovals ?? []).find(x => x.type == type); } $('#search').on('input', function () { + if (isRestoringState) { + return; + } let table = $('#PaymentRequestListTable').DataTable(); table.search($(this).val()).draw(); }); diff --git a/applications/Unity.GrantManager/modules/Unity.Payments/test/Unity.Payments.Application.Tests/BatchPaymentRequests/PaymentRequestAppService_Tests.cs b/applications/Unity.GrantManager/modules/Unity.Payments/test/Unity.Payments.Application.Tests/BatchPaymentRequests/PaymentRequestAppService_Tests.cs index 35c286753a..91e0cc56c0 100644 --- a/applications/Unity.GrantManager/modules/Unity.Payments/test/Unity.Payments.Application.Tests/BatchPaymentRequests/PaymentRequestAppService_Tests.cs +++ b/applications/Unity.GrantManager/modules/Unity.Payments/test/Unity.Payments.Application.Tests/BatchPaymentRequests/PaymentRequestAppService_Tests.cs @@ -121,7 +121,7 @@ public async Task GetListAsync_ReturnsPaymentsList() _ = await _paymentRequestRepository.InsertAsync(new PaymentRequest(Guid.NewGuid(), paymentRequestDto), true); // Act - var paymentRequests = await _paymentRequestAppService.GetListAsync(new Volo.Abp.Application.Dtos.PagedAndSortedResultRequestDto() + var paymentRequests = await _paymentRequestAppService.GetListAsync(new PaymentRequestListInputDto() { MaxResultCount = 100 }); @@ -158,7 +158,7 @@ public async Task GetListAsync_ReturnsPagedPaymentsList() _ = await _paymentRequestRepository.InsertAsync(new PaymentRequest(Guid.NewGuid(), paymentRequestDto), true); // Act - var paymentRequests = await _paymentRequestAppService.GetListAsync(new Volo.Abp.Application.Dtos.PagedAndSortedResultRequestDto + var paymentRequests = await _paymentRequestAppService.GetListAsync(new PaymentRequestListInputDto { MaxResultCount = 10, SkipCount = 0, 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 d92d21a3dd..833ac0b40c 100644 --- a/applications/Unity.GrantManager/src/Unity.GrantManager.Domain/Permissions/PermissionGrantsDataSeeder.cs +++ b/applications/Unity.GrantManager/src/Unity.GrantManager.Domain/Permissions/PermissionGrantsDataSeeder.cs @@ -1,337 +1,348 @@ -using System.Collections.Generic; -using System.Threading.Tasks; -using Unity.AI.Permissions; -using Unity.Flex.Permissions; -using Unity.GrantManager.Identity; -using Unity.Modules.Shared; -using Unity.Notifications.Permissions; -using Unity.Payments.Permissions; -using Volo.Abp.Authorization.Permissions; -using Volo.Abp.Data; -using Volo.Abp.DependencyInjection; -using Volo.Abp.PermissionManagement; - -namespace Unity.GrantManager.Permissions -{ - internal class PermissionGrantsDataSeeder : IDataSeedContributor, ITransientDependency - { - private readonly IPermissionDataSeeder _permissionDataSeeder; - - public PermissionGrantsDataSeeder(IPermissionDataSeeder permissionDataSeeder) - { - _permissionDataSeeder = permissionDataSeeder; - } - - public readonly List ReviewAndAssessment_CommonPermissions = [ - UnitySelector.Review.Default, - UnitySelector.Review.Approval.Default, - UnitySelector.Review.Approval.Update.Default, - - UnitySelector.Review.AssessmentResults.Default, - UnitySelector.Review.AssessmentResults.Update.Default, - - UnitySelector.Review.AssessmentReviewList.Default, - UnitySelector.Review.AssessmentReviewList.Create, - UnitySelector.Review.AssessmentReviewList.Update.SendBack, - UnitySelector.Review.AssessmentReviewList.Update.Complete - ]; - - public readonly List ApplicantInfo_CommonPermissions = [ - UnitySelector.Applicant.Default, - UnitySelector.Applicant.Summary.Default, - UnitySelector.Applicant.Summary.Update, - UnitySelector.Applicant.Contact.Default, - UnitySelector.Applicant.Contact.Update, - UnitySelector.Applicant.Authority.Default, - UnitySelector.Applicant.Authority.Update, - UnitySelector.Applicant.Location.Default, - UnitySelector.Applicant.Location.Update, - UnitySelector.Applicant.AdditionalContact.Default, - UnitySelector.Applicant.AdditionalContact.Create, - UnitySelector.Applicant.AdditionalContact.Update, - - ]; - - public readonly List ProjectInfo_CommonPermissions = [ - UnitySelector.Project.Default, - UnitySelector.Project.Summary.Default, - UnitySelector.Project.Summary.Update.Default, - UnitySelector.Project.Location.Default, - UnitySelector.Project.Location.Update.Default, - ]; - - public readonly List PaymentInfo_CommonPermissions = [ - UnitySelector.Payment.Default, - UnitySelector.Payment.Summary.Default, - UnitySelector.Payment.Supplier.Default, - UnitySelector.Payment.PaymentList.Default - ]; - - public readonly List Notifications_CommonPermissions = [ - NotificationsPermissions.Email.Default, - NotificationsPermissions.Email.Send, - ]; - - public readonly List Dashboard_CommonPermissions = [ - GrantApplicationPermissions.Dashboard.Default, - GrantApplicationPermissions.Dashboard.ViewDashboard, - GrantApplicationPermissions.Dashboard.ApplicationStatusCount, - GrantApplicationPermissions.Dashboard.EconomicRegionCount, - GrantApplicationPermissions.Dashboard.ApplicationTagsCount, - GrantApplicationPermissions.Dashboard.ApplicationAssigneeCount, - GrantApplicationPermissions.Dashboard.RequestedAmountPerSubsector, - GrantApplicationPermissions.Dashboard.RequestApprovedCount, - ]; - - public readonly List SettingManagement_Tags_CommonPermissions = [ - UnitySelector.SettingManagement.Tags.Default, - UnitySelector.SettingManagement.Tags.Create, - UnitySelector.SettingManagement.Tags.Update, - UnitySelector.SettingManagement.Tags.Delete - ]; - - public readonly List Tags_CommonPermissions = [ - UnitySelector.Application.Tags.Create, - UnitySelector.Application.Tags.Delete, - UnitySelector.Payment.Tags.Create, - UnitySelector.Payment.Tags.Delete, - ]; - - public async Task SeedAsync(DataSeedContext context) - { - // Default permission grants based on role - - // - Program Manager - await _permissionDataSeeder.SeedAsync(RolePermissionValueProvider.ProviderName, UnityRoles.ProgramManager, - [ - GrantManagerPermissions.Default, - GrantApplicationPermissions.Applications.Default, - GrantApplicationPermissions.Assignments.AssignInitial, - GrantApplicationPermissions.Reviews.StartInitial, - GrantApplicationPermissions.Reviews.CompleteInitial, - GrantApplicationPermissions.Comments.Add, - GrantManagerPermissions.Organizations.Default, - GrantManagerPermissions.Organizations.ManageProfiles, - IdentitySeedPermissions.Users.Default, - IdentitySeedPermissions.Users.Create, - IdentitySeedPermissions.Users.Update, - IdentitySeedPermissions.Users.Delete, - IdentitySeedPermissions.Users.ManagePermissions, - IdentitySeedPermissions.Roles.Default, - IdentitySeedPermissions.Roles.Create, - IdentitySeedPermissions.Roles.Update, - IdentitySeedPermissions.Roles.Delete, - IdentitySeedPermissions.Roles.ManagePermissions, - GrantManagerPermissions.Intakes.Default, - GrantManagerPermissions.ApplicationForms.Default, - - .. SettingManagement_Tags_CommonPermissions, - .. ReviewAndAssessment_CommonPermissions, - .. ApplicantInfo_CommonPermissions, - .. ProjectInfo_CommonPermissions, - .. PaymentInfo_CommonPermissions, - UnitySelector.Payment.Supplier.Update, - .. Notifications_CommonPermissions, - .. Dashboard_CommonPermissions, - .. Tags_CommonPermissions, - AIPermissions.Configuration.ConfigureAI, - FlexPermissions.Worksheets.Default, - FlexPermissions.Worksheets.Delete - ], context.TenantId); - - // - Reviewer - await _permissionDataSeeder.SeedAsync(RolePermissionValueProvider.ProviderName, UnityRoles.Reviewer, - [ - GrantManagerPermissions.Default, - GrantApplicationPermissions.Applications.Default, - GrantApplicationPermissions.Reviews.StartInitial, - GrantApplicationPermissions.Reviews.CompleteInitial, - GrantApplicationPermissions.Comments.Add, - - .. ReviewAndAssessment_CommonPermissions, - .. ApplicantInfo_CommonPermissions, - .. ProjectInfo_CommonPermissions, - .. PaymentInfo_CommonPermissions, - .. Notifications_CommonPermissions, - .. Dashboard_CommonPermissions - ], context.TenantId); - - // - Assessor - await _permissionDataSeeder.SeedAsync(RolePermissionValueProvider.ProviderName, UnityRoles.Assessor, - [ - GrantManagerPermissions.Default, - GrantApplicationPermissions.Applications.Default, - GrantApplicationPermissions.Reviews.StartInitial, - GrantApplicationPermissions.Reviews.CompleteInitial, - GrantApplicationPermissions.Comments.Add, - - .. ReviewAndAssessment_CommonPermissions, - .. ApplicantInfo_CommonPermissions, - .. ProjectInfo_CommonPermissions, - .. PaymentInfo_CommonPermissions, - .. Notifications_CommonPermissions, - .. Dashboard_CommonPermissions, - .. Tags_CommonPermissions - ], context.TenantId); - - // - TeamLead - await _permissionDataSeeder.SeedAsync(RolePermissionValueProvider.ProviderName, UnityRoles.TeamLead, - [ - GrantManagerPermissions.Default, - GrantApplicationPermissions.Applications.Default, - GrantApplicationPermissions.Assignments.AssignInitial, - GrantApplicationPermissions.Applicants.AssignApplicant, - GrantApplicationPermissions.Reviews.StartInitial, - GrantApplicationPermissions.Reviews.CompleteInitial, - GrantApplicationPermissions.Comments.Add, - GrantManagerPermissions.Organizations.Default, - GrantManagerPermissions.Organizations.ManageProfiles, - GrantApplicationPermissions.Approvals.BulkApplicationApproval, - GrantApplicationPermissions.Approvals.DeferAfterApproval, - - .. SettingManagement_Tags_CommonPermissions, - .. ReviewAndAssessment_CommonPermissions, - .. ApplicantInfo_CommonPermissions, - .. ProjectInfo_CommonPermissions, - .. PaymentInfo_CommonPermissions, - UnitySelector.Payment.Supplier.Update, - .. Notifications_CommonPermissions, - .. Dashboard_CommonPermissions, - .. Tags_CommonPermissions, - - // Role Specific Permissions - UnitySelector.Project.Summary.Update.UpdateFinalStateFields, - UnitySelector.Project.Location.Update.UpdateFinalStateFields, - ], context.TenantId); - - // - Approver - await _permissionDataSeeder.SeedAsync(RolePermissionValueProvider.ProviderName, UnityRoles.Approver, - [ - GrantManagerPermissions.Default, - GrantApplicationPermissions.Applications.Default, - GrantApplicationPermissions.Approvals.Complete, - GrantApplicationPermissions.Approvals.DeferAfterApproval, - GrantApplicationPermissions.Comments.Add, - - .. ReviewAndAssessment_CommonPermissions, - .. ApplicantInfo_CommonPermissions, - .. ProjectInfo_CommonPermissions, - .. PaymentInfo_CommonPermissions, - .. Notifications_CommonPermissions, - .. Dashboard_CommonPermissions - ], context.TenantId); - - // - SystemAdmin - await _permissionDataSeeder.SeedAsync(RolePermissionValueProvider.ProviderName, UnityRoles.SystemAdmin, - [ - GrantManagerPermissions.Default, - UnitySettingManagementPermissions.UserInterface, - GrantManagerPermissions.Organizations.Default, - GrantManagerPermissions.Organizations.ManageProfiles, - GrantManagerPermissions.Intakes.Default, - GrantManagerPermissions.ApplicationForms.Default, - - - .. SettingManagement_Tags_CommonPermissions, - .. ReviewAndAssessment_CommonPermissions, - .. ApplicantInfo_CommonPermissions, - .. ProjectInfo_CommonPermissions, - .. PaymentInfo_CommonPermissions, - UnitySelector.Payment.Supplier.Update, - .. Notifications_CommonPermissions, - NotificationsPermissions.Settings, - .. Dashboard_CommonPermissions, - .. Tags_CommonPermissions, - UnitySettingManagementPermissions.ConfigurePayments, - UnitySettingManagementPermissions.BackgroundJobSettings, - AIPermissions.Configuration.ConfigureAI, - ], context.TenantId); - - - // -L1 Approver - await _permissionDataSeeder.SeedAsync(RolePermissionValueProvider.ProviderName, UnityRoles.L1Approver, - [ - GrantManagerPermissions.Default, - GrantApplicationPermissions.Applications.Default, - PaymentsPermissions.Payments.Default, - PaymentsPermissions.Payments.L1ApproveOrDecline, - - .. ReviewAndAssessment_CommonPermissions, - .. ApplicantInfo_CommonPermissions, - .. ProjectInfo_CommonPermissions, - .. PaymentInfo_CommonPermissions, - .. Notifications_CommonPermissions, - .. Dashboard_CommonPermissions - ], context.TenantId); - - // -L2 Approver - await _permissionDataSeeder.SeedAsync(RolePermissionValueProvider.ProviderName, UnityRoles.L2Approver, - [ - GrantManagerPermissions.Default, - GrantApplicationPermissions.Applications.Default, - PaymentsPermissions.Payments.Default, - PaymentsPermissions.Payments.L2ApproveOrDecline, - - .. ReviewAndAssessment_CommonPermissions, - .. ApplicantInfo_CommonPermissions, - .. ProjectInfo_CommonPermissions, - .. PaymentInfo_CommonPermissions, - .. Notifications_CommonPermissions, - .. Dashboard_CommonPermissions - ], context.TenantId); - - // -L3 Approver - await _permissionDataSeeder.SeedAsync(RolePermissionValueProvider.ProviderName, UnityRoles.L3Approver, - [ - GrantManagerPermissions.Default, - GrantApplicationPermissions.Applications.Default, - PaymentsPermissions.Payments.Default, - PaymentsPermissions.Payments.L3ApproveOrDecline, - - .. ReviewAndAssessment_CommonPermissions, - .. ApplicantInfo_CommonPermissions, - .. ProjectInfo_CommonPermissions, - .. PaymentInfo_CommonPermissions, - .. Notifications_CommonPermissions, - .. Dashboard_CommonPermissions - ], context.TenantId); - - // -External Assessor - await _permissionDataSeeder.SeedAsync(RolePermissionValueProvider.ProviderName, UnityRoles.ExternalAssessor, - [ - GrantManagerPermissions.Default, - GrantApplicationPermissions.Applications.Default, - PaymentsPermissions.Payments.Default, - - UnitySelector.Review.Default, - UnitySelector.Review.Approval.Default, - UnitySelector.Review.AssessmentResults.Default, - UnitySelector.Review.AssessmentReviewList.Default, - UnitySelector.Review.AssessmentReviewList.Create, - UnitySelector.Review.AssessmentReviewList.Update.SendBack, - UnitySelector.Review.AssessmentReviewList.Update.Complete, - UnitySelector.Review.Worksheet.Default, - - UnitySelector.Applicant.Default, - UnitySelector.Applicant.Summary.Default, - UnitySelector.Applicant.Contact.Default, - UnitySelector.Applicant.Authority.Default, - UnitySelector.Applicant.Location.Default, - UnitySelector.Applicant.AdditionalContact.Default, - - UnitySelector.Project.Default, - UnitySelector.Project.Summary.Default, - UnitySelector.Project.Location.Default, - - UnitySelector.Payment.Default, - UnitySelector.Payment.Summary.Default, - UnitySelector.Payment.Supplier.Default, - UnitySelector.Payment.PaymentList.Default, - - NotificationsPermissions.Email.Default - ], context.TenantId); - - } - } -} - +using System.Collections.Generic; +using System.Threading.Tasks; +using Unity.AI.Permissions; +using Unity.Flex.Permissions; +using Unity.GrantManager.Identity; +using Unity.Modules.Shared; +using Unity.Notifications.Permissions; +using Unity.Payments.Permissions; +using Volo.Abp.Authorization.Permissions; +using Volo.Abp.Data; +using Volo.Abp.DependencyInjection; +using Volo.Abp.PermissionManagement; + +namespace Unity.GrantManager.Permissions +{ + internal class PermissionGrantsDataSeeder : IDataSeedContributor, ITransientDependency + { + private readonly IPermissionDataSeeder _permissionDataSeeder; + + public PermissionGrantsDataSeeder(IPermissionDataSeeder permissionDataSeeder) + { + _permissionDataSeeder = permissionDataSeeder; + } + + public readonly List ReviewAndAssessment_CommonPermissions = [ + UnitySelector.Review.Default, + UnitySelector.Review.Approval.Default, + UnitySelector.Review.Approval.Update.Default, + + UnitySelector.Review.AssessmentResults.Default, + UnitySelector.Review.AssessmentResults.Update.Default, + + UnitySelector.Review.AssessmentReviewList.Default, + UnitySelector.Review.AssessmentReviewList.Create, + UnitySelector.Review.AssessmentReviewList.Update.SendBack, + UnitySelector.Review.AssessmentReviewList.Update.Complete + ]; + + public readonly List ApplicantInfo_CommonPermissions = [ + UnitySelector.Applicant.Default, + UnitySelector.Applicant.Summary.Default, + UnitySelector.Applicant.Summary.Update, + UnitySelector.Applicant.Contact.Default, + UnitySelector.Applicant.Contact.Update, + UnitySelector.Applicant.Authority.Default, + UnitySelector.Applicant.Authority.Update, + UnitySelector.Applicant.Location.Default, + UnitySelector.Applicant.Location.Update, + UnitySelector.Applicant.AdditionalContact.Default, + UnitySelector.Applicant.AdditionalContact.Create, + UnitySelector.Applicant.AdditionalContact.Update, + + ]; + + public readonly List ProjectInfo_CommonPermissions = [ + UnitySelector.Project.Default, + UnitySelector.Project.Summary.Default, + UnitySelector.Project.Summary.Update.Default, + UnitySelector.Project.Location.Default, + UnitySelector.Project.Location.Update.Default, + ]; + + public readonly List PaymentInfo_CommonPermissions = [ + UnitySelector.Payment.Default, + UnitySelector.Payment.Summary.Default, + UnitySelector.Payment.Supplier.Default, + UnitySelector.Payment.PaymentList.Default + ]; + + public readonly List Notifications_CommonPermissions = [ + NotificationsPermissions.Email.Default, + NotificationsPermissions.Email.Send, + NotificationsPermissions.Email.DeleteDraft + ]; + + public readonly List NotificationsScheduling_CommonPermissions = [ + NotificationsPermissions.Email.CancelScheduled, + NotificationsPermissions.Email.ScheduleCreate, + NotificationsPermissions.Email.ScheduleDelete, + NotificationsPermissions.Email.ScheduleCancel + ]; + + public readonly List Dashboard_CommonPermissions = [ + GrantApplicationPermissions.Dashboard.Default, + GrantApplicationPermissions.Dashboard.ViewDashboard, + GrantApplicationPermissions.Dashboard.ApplicationStatusCount, + GrantApplicationPermissions.Dashboard.EconomicRegionCount, + GrantApplicationPermissions.Dashboard.ApplicationTagsCount, + GrantApplicationPermissions.Dashboard.ApplicationAssigneeCount, + GrantApplicationPermissions.Dashboard.RequestedAmountPerSubsector, + GrantApplicationPermissions.Dashboard.RequestApprovedCount, + ]; + + public readonly List SettingManagement_Tags_CommonPermissions = [ + UnitySelector.SettingManagement.Tags.Default, + UnitySelector.SettingManagement.Tags.Create, + UnitySelector.SettingManagement.Tags.Update, + UnitySelector.SettingManagement.Tags.Delete + ]; + + public readonly List Tags_CommonPermissions = [ + UnitySelector.Application.Tags.Create, + UnitySelector.Application.Tags.Delete, + UnitySelector.Payment.Tags.Create, + UnitySelector.Payment.Tags.Delete, + ]; + + public async Task SeedAsync(DataSeedContext context) + { + // Default permission grants based on role + + // - Program Manager + await _permissionDataSeeder.SeedAsync(RolePermissionValueProvider.ProviderName, UnityRoles.ProgramManager, + [ + GrantManagerPermissions.Default, + GrantApplicationPermissions.Applications.Default, + GrantApplicationPermissions.Assignments.AssignInitial, + GrantApplicationPermissions.Reviews.StartInitial, + GrantApplicationPermissions.Reviews.CompleteInitial, + GrantApplicationPermissions.Comments.Add, + GrantManagerPermissions.Organizations.Default, + GrantManagerPermissions.Organizations.ManageProfiles, + IdentitySeedPermissions.Users.Default, + IdentitySeedPermissions.Users.Create, + IdentitySeedPermissions.Users.Update, + IdentitySeedPermissions.Users.Delete, + IdentitySeedPermissions.Users.ManagePermissions, + IdentitySeedPermissions.Roles.Default, + IdentitySeedPermissions.Roles.Create, + IdentitySeedPermissions.Roles.Update, + IdentitySeedPermissions.Roles.Delete, + IdentitySeedPermissions.Roles.ManagePermissions, + GrantManagerPermissions.Intakes.Default, + GrantManagerPermissions.ApplicationForms.Default, + + .. SettingManagement_Tags_CommonPermissions, + .. ReviewAndAssessment_CommonPermissions, + .. ApplicantInfo_CommonPermissions, + .. ProjectInfo_CommonPermissions, + .. PaymentInfo_CommonPermissions, + UnitySelector.Payment.Supplier.Update, + .. Notifications_CommonPermissions, + .. NotificationsScheduling_CommonPermissions, + .. Dashboard_CommonPermissions, + .. Tags_CommonPermissions, + AIPermissions.Configuration.ConfigureAI, + FlexPermissions.Worksheets.Default, + FlexPermissions.Worksheets.Delete + ], context.TenantId); + + // - Reviewer + await _permissionDataSeeder.SeedAsync(RolePermissionValueProvider.ProviderName, UnityRoles.Reviewer, + [ + GrantManagerPermissions.Default, + GrantApplicationPermissions.Applications.Default, + GrantApplicationPermissions.Reviews.StartInitial, + GrantApplicationPermissions.Reviews.CompleteInitial, + GrantApplicationPermissions.Comments.Add, + + .. ReviewAndAssessment_CommonPermissions, + .. ApplicantInfo_CommonPermissions, + .. ProjectInfo_CommonPermissions, + .. PaymentInfo_CommonPermissions, + .. Notifications_CommonPermissions, + .. Dashboard_CommonPermissions + ], context.TenantId); + + // - Assessor + await _permissionDataSeeder.SeedAsync(RolePermissionValueProvider.ProviderName, UnityRoles.Assessor, + [ + GrantManagerPermissions.Default, + GrantApplicationPermissions.Applications.Default, + GrantApplicationPermissions.Reviews.StartInitial, + GrantApplicationPermissions.Reviews.CompleteInitial, + GrantApplicationPermissions.Comments.Add, + + .. ReviewAndAssessment_CommonPermissions, + .. ApplicantInfo_CommonPermissions, + .. ProjectInfo_CommonPermissions, + .. PaymentInfo_CommonPermissions, + .. Notifications_CommonPermissions, + .. Dashboard_CommonPermissions, + .. Tags_CommonPermissions + ], context.TenantId); + + // - TeamLead + await _permissionDataSeeder.SeedAsync(RolePermissionValueProvider.ProviderName, UnityRoles.TeamLead, + [ + GrantManagerPermissions.Default, + GrantApplicationPermissions.Applications.Default, + GrantApplicationPermissions.Assignments.AssignInitial, + GrantApplicationPermissions.Applicants.AssignApplicant, + GrantApplicationPermissions.Reviews.StartInitial, + GrantApplicationPermissions.Reviews.CompleteInitial, + GrantApplicationPermissions.Comments.Add, + GrantManagerPermissions.Organizations.Default, + GrantManagerPermissions.Organizations.ManageProfiles, + GrantApplicationPermissions.Approvals.BulkApplicationApproval, + GrantApplicationPermissions.Approvals.DeferAfterApproval, + + .. SettingManagement_Tags_CommonPermissions, + .. ReviewAndAssessment_CommonPermissions, + .. ApplicantInfo_CommonPermissions, + .. ProjectInfo_CommonPermissions, + .. PaymentInfo_CommonPermissions, + UnitySelector.Payment.Supplier.Update, + .. Notifications_CommonPermissions, + .. NotificationsScheduling_CommonPermissions, + .. Dashboard_CommonPermissions, + .. Tags_CommonPermissions, + + // Role Specific Permissions + UnitySelector.Project.Summary.Update.UpdateFinalStateFields, + UnitySelector.Project.Location.Update.UpdateFinalStateFields, + ], context.TenantId); + + // - Approver + await _permissionDataSeeder.SeedAsync(RolePermissionValueProvider.ProviderName, UnityRoles.Approver, + [ + GrantManagerPermissions.Default, + GrantApplicationPermissions.Applications.Default, + GrantApplicationPermissions.Approvals.Complete, + GrantApplicationPermissions.Approvals.DeferAfterApproval, + GrantApplicationPermissions.Comments.Add, + + .. ReviewAndAssessment_CommonPermissions, + .. ApplicantInfo_CommonPermissions, + .. ProjectInfo_CommonPermissions, + .. PaymentInfo_CommonPermissions, + .. Notifications_CommonPermissions, + .. Dashboard_CommonPermissions + ], context.TenantId); + + // - SystemAdmin + await _permissionDataSeeder.SeedAsync(RolePermissionValueProvider.ProviderName, UnityRoles.SystemAdmin, + [ + GrantManagerPermissions.Default, + UnitySettingManagementPermissions.UserInterface, + GrantManagerPermissions.Organizations.Default, + GrantManagerPermissions.Organizations.ManageProfiles, + GrantManagerPermissions.Intakes.Default, + GrantManagerPermissions.ApplicationForms.Default, + + + .. SettingManagement_Tags_CommonPermissions, + .. ReviewAndAssessment_CommonPermissions, + .. ApplicantInfo_CommonPermissions, + .. ProjectInfo_CommonPermissions, + .. PaymentInfo_CommonPermissions, + UnitySelector.Payment.Supplier.Update, + .. Notifications_CommonPermissions, + .. NotificationsScheduling_CommonPermissions, + NotificationsPermissions.Settings, + .. Dashboard_CommonPermissions, + .. Tags_CommonPermissions, + UnitySettingManagementPermissions.ConfigurePayments, + UnitySettingManagementPermissions.BackgroundJobSettings, + AIPermissions.Configuration.ConfigureAI, + ], context.TenantId); + + + // -L1 Approver + await _permissionDataSeeder.SeedAsync(RolePermissionValueProvider.ProviderName, UnityRoles.L1Approver, + [ + GrantManagerPermissions.Default, + GrantApplicationPermissions.Applications.Default, + PaymentsPermissions.Payments.Default, + PaymentsPermissions.Payments.L1ApproveOrDecline, + + .. ReviewAndAssessment_CommonPermissions, + .. ApplicantInfo_CommonPermissions, + .. ProjectInfo_CommonPermissions, + .. PaymentInfo_CommonPermissions, + .. Notifications_CommonPermissions, + .. Dashboard_CommonPermissions + ], context.TenantId); + + // -L2 Approver + await _permissionDataSeeder.SeedAsync(RolePermissionValueProvider.ProviderName, UnityRoles.L2Approver, + [ + GrantManagerPermissions.Default, + GrantApplicationPermissions.Applications.Default, + PaymentsPermissions.Payments.Default, + PaymentsPermissions.Payments.L2ApproveOrDecline, + + .. ReviewAndAssessment_CommonPermissions, + .. ApplicantInfo_CommonPermissions, + .. ProjectInfo_CommonPermissions, + .. PaymentInfo_CommonPermissions, + .. Notifications_CommonPermissions, + .. Dashboard_CommonPermissions + ], context.TenantId); + + // -L3 Approver + await _permissionDataSeeder.SeedAsync(RolePermissionValueProvider.ProviderName, UnityRoles.L3Approver, + [ + GrantManagerPermissions.Default, + GrantApplicationPermissions.Applications.Default, + PaymentsPermissions.Payments.Default, + PaymentsPermissions.Payments.L3ApproveOrDecline, + + .. ReviewAndAssessment_CommonPermissions, + .. ApplicantInfo_CommonPermissions, + .. ProjectInfo_CommonPermissions, + .. PaymentInfo_CommonPermissions, + .. Notifications_CommonPermissions, + .. Dashboard_CommonPermissions + ], context.TenantId); + + // -External Assessor + await _permissionDataSeeder.SeedAsync(RolePermissionValueProvider.ProviderName, UnityRoles.ExternalAssessor, + [ + GrantManagerPermissions.Default, + GrantApplicationPermissions.Applications.Default, + PaymentsPermissions.Payments.Default, + + UnitySelector.Review.Default, + UnitySelector.Review.Approval.Default, + UnitySelector.Review.AssessmentResults.Default, + UnitySelector.Review.AssessmentReviewList.Default, + UnitySelector.Review.AssessmentReviewList.Create, + UnitySelector.Review.AssessmentReviewList.Update.SendBack, + UnitySelector.Review.AssessmentReviewList.Update.Complete, + UnitySelector.Review.Worksheet.Default, + + UnitySelector.Applicant.Default, + UnitySelector.Applicant.Summary.Default, + UnitySelector.Applicant.Contact.Default, + UnitySelector.Applicant.Authority.Default, + UnitySelector.Applicant.Location.Default, + UnitySelector.Applicant.AdditionalContact.Default, + + UnitySelector.Project.Default, + UnitySelector.Project.Summary.Default, + UnitySelector.Project.Location.Default, + + UnitySelector.Payment.Default, + UnitySelector.Payment.Summary.Default, + UnitySelector.Payment.Supplier.Default, + UnitySelector.Payment.PaymentList.Default, + + NotificationsPermissions.Email.Default + ], context.TenantId); + + } + } +} + diff --git a/applications/Unity.GrantManager/src/Unity.GrantManager.EntityFrameworkCore/Migrations/TenantMigrations/20260625194120_Add_PaymentRequests_Performance_Indexes.Designer.cs b/applications/Unity.GrantManager/src/Unity.GrantManager.EntityFrameworkCore/Migrations/TenantMigrations/20260625194120_Add_PaymentRequests_Performance_Indexes.Designer.cs new file mode 100644 index 0000000000..ff211430f6 --- /dev/null +++ b/applications/Unity.GrantManager/src/Unity.GrantManager.EntityFrameworkCore/Migrations/TenantMigrations/20260625194120_Add_PaymentRequests_Performance_Indexes.Designer.cs @@ -0,0 +1,5077 @@ +// +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("20260625194120_Add_PaymentRequests_Performance_Indexes")] + partial class Add_PaymentRequests_Performance_Indexes + { + /// + protected override void BuildTargetModel(ModelBuilder modelBuilder) + { +#pragma warning disable 612, 618 + modelBuilder + .HasAnnotation("_Abp_DatabaseProvider", EfCoreDatabaseProvider.PostgreSql) + .HasAnnotation("ProductVersion", "10.0.3") + .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("IsArchived") + .HasColumnType("boolean"); + + 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("IsArchived") + .HasColumnType("boolean"); + + 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("Definition") + .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("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("AuditComments") + .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("DeleterId") + .HasColumnType("uuid"); + + b.Property("DeletionTime") + .HasColumnType("timestamp without time zone"); + + b.Property("ExtraProperties") + .IsRequired() + .HasColumnType("text") + .HasColumnName("ExtraProperties"); + + b.Property("FiscalDay") + .HasColumnType("integer"); + + b.Property("FiscalMonth") + .HasColumnType("text"); + + b.Property("FundingHistoryComments") + .HasColumnType("text"); + + b.Property("IndigenousOrgInd") + .HasColumnType("text"); + + b.Property("IsDeleted") + .HasColumnType("boolean"); + + b.Property("IsDuplicated") + .HasColumnType("boolean"); + + b.Property("IssueTrackingComments") + .HasColumnType("text"); + + 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("ReportsComments") + .HasColumnType("text"); + + b.Property("Sector") + .HasColumnType("text"); + + b.Property("SectorSubSectorIndustryDesc") + .HasColumnType("text"); + + 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.HasIndex("OrgName"); + + b.HasIndex("OrgNumber"); + + b.HasIndex("Status"); + + b.HasIndex("SupplierId"); + + b.HasIndex("TenantId"); + + b.HasIndex("UnityApplicantId"); + + b.HasIndex("TenantId", "IsDeleted", "CreationTime") + .HasFilter("\"IsDeleted\" = false"); + + 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("ApplicationId") + .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.HasIndex("ApplicationId"); + + 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("TenantId", "ApplicationId"); + + b.ToTable("ApplicantAgents", (string)null); + }); + + modelBuilder.Entity("Unity.GrantManager.Applications.ApplicantAttachment", b => + { + b.Property("Id") + .HasColumnType("uuid"); + + b.Property("ApplicantId") + .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("ApplicantId"); + + b.ToTable("ApplicantAttachments", (string)null); + }); + + modelBuilder.Entity("Unity.GrantManager.Applications.Application", b => + { + b.Property("Id") + .HasColumnType("uuid"); + + b.Property("AIAnalysis") + .HasColumnType("text"); + + b.Property("AIScoresheetAnswers") + .HasColumnType("jsonb"); + + b.Property("Acquisition") + .HasColumnType("text"); + + b.Property("ApplicantElectoralDistrict") + .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("DefaultSiteId") + .HasColumnType("uuid"); + + 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.Property("UnityApplicationId") + .HasColumnType("text"); + + b.HasKey("Id"); + + b.HasIndex("ApplicantId"); + + b.HasIndex("ApplicationFormId"); + + b.HasIndex("ApplicationStatusId"); + + b.HasIndex("OwnerId"); + + b.HasIndex("ReferenceNo"); + + b.HasIndex("TenantId", "SubmissionDate") + .HasFilter("\"IsDeleted\" = false"); + + 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.HasIndex("TenantId", "ApplicationId"); + + 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("AISummary") + .HasColumnType("text"); + + b.Property("ApplicationId") + .HasColumnType("uuid"); + + b.Property("ChefsFileId") + .HasColumnType("text"); + + b.Property("ChefsSubmissionId") + .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("AccountCodingId") + .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("AutomaticallyGenerateAIAnalysis") + .HasColumnType("boolean"); + + 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("DefaultPaymentGroup") + .HasColumnType("integer"); + + 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("FormHierarchy") + .HasColumnType("integer"); + + 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("ManuallyInitiateAIAnalysis") + .HasColumnType("boolean"); + + b.Property("ParentFormId") + .HasColumnType("uuid"); + + b.Property("Payable") + .HasColumnType("boolean"); + + b.Property("PaymentApprovalThreshold") + .HasColumnType("numeric"); + + b.Property("Prefix") + .HasMaxLength(100) + .HasColumnType("character varying(100)"); + + b.Property("PreventPayment") + .HasColumnType("boolean"); + + b.Property("ScoresheetId") + .HasColumnType("uuid"); + + b.Property("SuffixType") + .HasColumnType("integer"); + + b.Property("TenantId") + .HasColumnType("uuid") + .HasColumnName("TenantId"); + + b.Property("Version") + .HasColumnType("integer"); + + b.HasKey("Id"); + + b.HasIndex("IntakeId"); + + b.HasIndex("ParentFormId"); + + b.HasIndex("TenantId", "IsDeleted") + .HasFilter("\"IsDeleted\" = false"); + + 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("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("LinkType") + .IsRequired() + .ValueGeneratedOnAdd() + .HasColumnType("text") + .HasDefaultValue("Related"); + + b.Property("LinkedApplicationId") + .HasColumnType("uuid"); + + b.Property("TenantId") + .HasColumnType("uuid") + .HasColumnName("TenantId"); + + b.HasKey("Id"); + + b.HasIndex("ApplicationId"); + + b.HasIndex("TenantId", "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("NotifiedStatus") + .HasColumnType("text"); + + 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.HasKey("Id"); + + b.HasIndex("ApplicationId"); + + b.HasIndex("TagId"); + + b.HasIndex("TenantId", "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.Applications.AuditHistory", b => + { + b.Property("Id") + .HasColumnType("uuid"); + + b.Property("ApplicantId") + .HasColumnType("uuid"); + + b.Property("AuditDate") + .HasColumnType("timestamp without time zone"); + + b.Property("AuditNote") + .HasColumnType("text"); + + b.Property("AuditStatus") + .HasColumnType("text"); + + b.Property("AuditTrackingNumber") + .HasColumnType("text"); + + b.Property("AuditorName") + .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("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("ApplicantId"); + + b.ToTable("AuditHistories", (string)null); + }); + + modelBuilder.Entity("Unity.GrantManager.Applications.FundingHistory", b => + { + b.Property("Id") + .HasColumnType("uuid"); + + b.Property("ApplicantId") + .HasColumnType("uuid"); + + b.Property("ApprovedAmount") + .HasColumnType("numeric"); + + 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("FundingNotes") + .HasColumnType("text"); + + b.Property("FundingYear") + .HasColumnType("text"); + + b.Property("GrantCategory") + .HasColumnType("text"); + + b.Property("LastModificationTime") + .HasColumnType("timestamp without time zone") + .HasColumnName("LastModificationTime"); + + b.Property("LastModifierId") + .HasColumnType("uuid") + .HasColumnName("LastModifierId"); + + b.Property("OneTimeConsideration") + .HasColumnType("numeric"); + + b.Property("PaidDate") + .HasColumnType("timestamp without time zone"); + + b.Property("ReconsiderationAmount") + .HasColumnType("numeric"); + + b.Property("RenewedFunding") + .HasColumnType("boolean"); + + b.Property("TenantId") + .HasColumnType("uuid") + .HasColumnName("TenantId"); + + b.Property("TotalGrantAmount") + .HasColumnType("numeric"); + + b.HasKey("Id"); + + b.HasIndex("ApplicantId"); + + b.ToTable("FundingHistories", (string)null); + }); + + modelBuilder.Entity("Unity.GrantManager.Applications.IssueTracking", b => + { + b.Property("Id") + .HasColumnType("uuid"); + + b.Property("ApplicantId") + .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("IssueDescription") + .HasColumnType("text"); + + b.Property("IssueHeading") + .HasColumnType("text"); + + b.Property("LastModificationTime") + .HasColumnType("timestamp without time zone") + .HasColumnName("LastModificationTime"); + + b.Property("LastModifierId") + .HasColumnType("uuid") + .HasColumnName("LastModifierId"); + + b.Property("ResolutionNote") + .HasColumnType("text"); + + b.Property("Resolved") + .HasColumnType("boolean"); + + b.Property("TenantId") + .HasColumnType("uuid") + .HasColumnName("TenantId"); + + b.Property("Year") + .HasColumnType("text"); + + b.HasKey("Id"); + + b.HasIndex("ApplicantId"); + + b.ToTable("IssueTrackings", (string)null); + }); + + modelBuilder.Entity("Unity.GrantManager.Applications.ReportsHistory", b => + { + b.Property("Id") + .HasColumnType("uuid"); + + b.Property("ApplicantId") + .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("FiscalYear") + .HasColumnType("text"); + + b.Property("IncompleteReport") + .HasColumnType("boolean"); + + b.Property("LastModificationTime") + .HasColumnType("timestamp without time zone") + .HasColumnName("LastModificationTime"); + + b.Property("LastModifierId") + .HasColumnType("uuid") + .HasColumnName("LastModifierId"); + + b.Property("Note") + .HasColumnType("text"); + + b.Property("Outstanding") + .HasColumnType("boolean"); + + b.Property("ReportDate") + .HasColumnType("timestamp without time zone"); + + b.Property("TenantId") + .HasColumnType("uuid") + .HasColumnName("TenantId"); + + b.HasKey("Id"); + + b.HasIndex("ApplicantId"); + + b.ToTable("ReportsHistories", (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("IsAiAssessment") + .HasColumnType("boolean"); + + 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.ApplicantComment", b => + { + b.Property("Id") + .HasColumnType("uuid"); + + b.Property("ApplicantId") + .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("PinDateTime") + .HasColumnType("timestamp without time zone"); + + b.Property("TenantId") + .HasColumnType("uuid") + .HasColumnName("TenantId"); + + b.HasKey("Id"); + + b.HasIndex("ApplicantId"); + + b.HasIndex("CommenterId"); + + b.ToTable("ApplicantComments", (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("PinDateTime") + .HasColumnType("timestamp without time zone"); + + 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("PinDateTime") + .HasColumnType("timestamp without time zone"); + + 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.Contacts.Contact", 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("Email") + .HasMaxLength(255) + .HasColumnType("character varying(255)"); + + b.Property("ExtraProperties") + .IsRequired() + .HasColumnType("text") + .HasColumnName("ExtraProperties"); + + b.Property("HomePhoneNumber") + .HasMaxLength(50) + .HasColumnType("character varying(50)"); + + b.Property("LastModificationTime") + .HasColumnType("timestamp without time zone") + .HasColumnName("LastModificationTime"); + + b.Property("LastModifierId") + .HasColumnType("uuid") + .HasColumnName("LastModifierId"); + + b.Property("MobilePhoneNumber") + .HasMaxLength(50) + .HasColumnType("character varying(50)"); + + b.Property("Name") + .IsRequired() + .HasMaxLength(255) + .HasColumnType("character varying(255)"); + + b.Property("TenantId") + .HasColumnType("uuid") + .HasColumnName("TenantId"); + + b.Property("Title") + .HasMaxLength(255) + .HasColumnType("character varying(255)"); + + b.Property("WorkPhoneExtension") + .HasMaxLength(50) + .HasColumnType("character varying(50)"); + + b.Property("WorkPhoneNumber") + .HasMaxLength(50) + .HasColumnType("character varying(50)"); + + b.HasKey("Id"); + + b.ToTable("Contacts", (string)null); + }); + + modelBuilder.Entity("Unity.GrantManager.Contacts.ContactLink", b => + { + b.Property("Id") + .HasColumnType("uuid"); + + b.Property("ConcurrencyStamp") + .IsConcurrencyToken() + .IsRequired() + .HasMaxLength(40) + .HasColumnType("character varying(40)") + .HasColumnName("ConcurrencyStamp"); + + b.Property("ContactId") + .HasColumnType("uuid"); + + 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("IsActive") + .HasColumnType("boolean"); + + b.Property("IsPrimary") + .HasColumnType("boolean"); + + b.Property("LastModificationTime") + .HasColumnType("timestamp without time zone") + .HasColumnName("LastModificationTime"); + + b.Property("LastModifierId") + .HasColumnType("uuid") + .HasColumnName("LastModifierId"); + + b.Property("RelatedEntityId") + .HasColumnType("uuid"); + + b.Property("RelatedEntityType") + .IsRequired() + .HasMaxLength(100) + .HasColumnType("character varying(100)"); + + b.Property("Role") + .HasMaxLength(100) + .HasColumnType("character varying(100)"); + + b.Property("TenantId") + .HasColumnType("uuid") + .HasColumnName("TenantId"); + + b.HasKey("Id"); + + b.HasIndex("RelatedEntityType", "RelatedEntityId"); + + b.HasIndex("ContactId", "RelatedEntityType", "RelatedEntityId"); + + b.ToTable("ContactLinks", (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.HasIndex("TenantId"); + + 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.EmailGroups.EmailGroup", 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("Description") + .IsRequired() + .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("Name") + .IsRequired() + .HasColumnType("text"); + + b.Property("TenantId") + .HasColumnType("uuid") + .HasColumnName("TenantId"); + + b.Property("Type") + .IsRequired() + .HasColumnType("text"); + + b.HasKey("Id"); + + b.ToTable("EmailGroups", "Notifications"); + }); + + modelBuilder.Entity("Unity.Notifications.EmailGroups.EmailGroupUser", 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("TenantId") + .HasColumnType("uuid") + .HasColumnName("TenantId"); + + b.Property("UserId") + .HasColumnType("uuid"); + + b.HasKey("Id"); + + b.HasIndex("GroupId"); + + b.ToTable("EmailGroupUsers", "Notifications"); + }); + + 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("ChesHttpStatusCode") + .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("PaymentRequestIds") + .IsRequired() + .HasColumnType("text"); + + 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.Emails.EmailLogAttachment", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("uuid"); + + b.Property("ConcurrencyStamp") + .IsConcurrencyToken() + .IsRequired() + .HasMaxLength(40) + .HasColumnType("character varying(40)") + .HasColumnName("ConcurrencyStamp"); + + b.Property("ContentType") + .IsRequired() + .HasColumnType("text"); + + 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("EmailLogId") + .HasColumnType("uuid"); + + b.Property("ExtraProperties") + .IsRequired() + .HasColumnType("text") + .HasColumnName("ExtraProperties"); + + b.Property("FileName") + .HasColumnType("text"); + + b.Property("FileSize") + .HasColumnType("bigint"); + + 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("EmailLogId"); + + b.HasIndex("S3ObjectKey"); + + b.ToTable("EmailLogAttachments", "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.AccountCodings.AccountCoding", 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("Description") + .HasMaxLength(35) + .HasColumnType("character varying(35)"); + + 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("MinistryClient") + .IsRequired() + .HasColumnType("text"); + + b.Property("ProjectNumber") + .IsRequired() + .HasColumnType("text"); + + b.Property("Responsibility") + .IsRequired() + .HasColumnType("text"); + + b.Property("ServiceLine") + .IsRequired() + .HasColumnType("text"); + + b.Property("Stob") + .IsRequired() + .HasColumnType("text"); + + b.Property("TenantId") + .HasColumnType("uuid") + .HasColumnName("TenantId"); + + b.HasKey("Id"); + + b.ToTable("AccountCodings", "Payments"); + }); + + 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("DefaultAccountCodingId") + .HasColumnType("uuid"); + + 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("PaymentIdPrefix") + .IsRequired() + .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("AccountCodingId") + .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("FsbApNotified") + .HasMaxLength(10) + .HasColumnType("character varying(10)"); + + b.Property("FsbNotificationEmailLogId") + .HasColumnType("uuid"); + + b.Property("FsbNotificationSentDate") + .HasColumnType("timestamp without time zone"); + + 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("Note") + .HasColumnType("text"); + + 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("AccountCodingId"); + + b.HasIndex("CorrelationId"); + + b.HasIndex("CreationTime"); + + b.HasIndex("FsbNotificationEmailLogId"); + + b.HasIndex("ReferenceNumber") + .IsUnique(); + + b.HasIndex("SiteId"); + + b.HasIndex("Status"); + + b.HasIndex("TenantId", "CreationTime") + .HasFilter("\"IsDeleted\" = false"); + + 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.HasKey("Id"); + + b.HasIndex("PaymentRequestId"); + + b.HasIndex("TagId"); + + b.ToTable("PaymentTags", "Payments"); + }); + + modelBuilder.Entity("Unity.Payments.Domain.PaymentThresholds.PaymentThreshold", 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("Description") + .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("TenantId") + .HasColumnType("uuid") + .HasColumnName("TenantId"); + + b.Property("Threshold") + .HasColumnType("numeric"); + + b.Property("UserId") + .HasColumnType("uuid"); + + b.HasKey("Id"); + + b.ToTable("PaymentThresholds", "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("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.Reporting.Domain.Configuration.ReportColumnsMap", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("uuid"); + + 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("LastModificationTime") + .HasColumnType("timestamp without time zone") + .HasColumnName("LastModificationTime"); + + b.Property("LastModifierId") + .HasColumnType("uuid") + .HasColumnName("LastModifierId"); + + b.Property("Mapping") + .IsRequired() + .HasColumnType("jsonb"); + + b.Property("RoleStatus") + .HasColumnType("integer"); + + b.Property("TenantId") + .HasColumnType("uuid") + .HasColumnName("TenantId"); + + b.Property("ViewName") + .IsRequired() + .HasColumnType("text"); + + b.Property("ViewStatus") + .HasColumnType("integer"); + + b.HasKey("Id"); + + b.ToTable("ReportColumnsMaps", "Reporting"); + }); + + 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.HasOne("Unity.GrantManager.Applications.Application", "Application") + .WithMany("ApplicantAddresses") + .HasForeignKey("ApplicationId"); + + b.Navigation("Applicant"); + + b.Navigation("Application"); + }); + + 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.Navigation("Application"); + }); + + modelBuilder.Entity("Unity.GrantManager.Applications.ApplicantAttachment", b => + { + b.HasOne("Unity.GrantManager.Applications.Applicant", null) + .WithMany() + .HasForeignKey("ApplicantId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + }); + + 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(); + + b.HasOne("Unity.GrantManager.Applications.ApplicationForm", null) + .WithMany() + .HasForeignKey("ParentFormId") + .OnDelete(DeleteBehavior.NoAction); + }); + + 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("ApplicationLinks") + .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.Applications.AuditHistory", b => + { + b.HasOne("Unity.GrantManager.Applications.Applicant", null) + .WithMany() + .HasForeignKey("ApplicantId"); + }); + + modelBuilder.Entity("Unity.GrantManager.Applications.FundingHistory", b => + { + b.HasOne("Unity.GrantManager.Applications.Applicant", null) + .WithMany() + .HasForeignKey("ApplicantId"); + }); + + modelBuilder.Entity("Unity.GrantManager.Applications.IssueTracking", b => + { + b.HasOne("Unity.GrantManager.Applications.Applicant", null) + .WithMany() + .HasForeignKey("ApplicantId"); + }); + + modelBuilder.Entity("Unity.GrantManager.Applications.ReportsHistory", b => + { + b.HasOne("Unity.GrantManager.Applications.Applicant", null) + .WithMany() + .HasForeignKey("ApplicantId"); + }); + + 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.ApplicantComment", b => + { + b.HasOne("Unity.GrantManager.Applications.Applicant", null) + .WithMany() + .HasForeignKey("ApplicantId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("Unity.GrantManager.Identity.Person", null) + .WithMany() + .HasForeignKey("CommenterId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + }); + + 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.GrantManager.Contacts.ContactLink", b => + { + b.HasOne("Unity.GrantManager.Contacts.Contact", null) + .WithMany() + .HasForeignKey("ContactId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + }); + + modelBuilder.Entity("Unity.Notifications.EmailGroups.EmailGroupUser", b => + { + b.HasOne("Unity.Notifications.EmailGroups.EmailGroup", null) + .WithMany() + .HasForeignKey("GroupId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + }); + + modelBuilder.Entity("Unity.Notifications.Emails.EmailLogAttachment", b => + { + b.HasOne("Unity.Notifications.Emails.EmailLog", null) + .WithMany() + .HasForeignKey("EmailLogId") + .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.AccountCodings.AccountCoding", "AccountCoding") + .WithMany() + .HasForeignKey("AccountCodingId") + .OnDelete(DeleteBehavior.NoAction); + + b.HasOne("Unity.Payments.Domain.Suppliers.Site", "Site") + .WithMany() + .HasForeignKey("SiteId") + .OnDelete(DeleteBehavior.NoAction); + + b.Navigation("AccountCoding"); + + 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("ApplicantAddresses"); + + b.Navigation("ApplicantAgent"); + + b.Navigation("ApplicationAssignments"); + + b.Navigation("ApplicationLinks"); + + 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/20260625194120_Add_PaymentRequests_Performance_Indexes.cs b/applications/Unity.GrantManager/src/Unity.GrantManager.EntityFrameworkCore/Migrations/TenantMigrations/20260625194120_Add_PaymentRequests_Performance_Indexes.cs new file mode 100644 index 0000000000..cbb149a700 --- /dev/null +++ b/applications/Unity.GrantManager/src/Unity.GrantManager.EntityFrameworkCore/Migrations/TenantMigrations/20260625194120_Add_PaymentRequests_Performance_Indexes.cs @@ -0,0 +1,63 @@ +using Microsoft.EntityFrameworkCore.Migrations; + +#nullable disable + +namespace Unity.GrantManager.Migrations.TenantMigrations +{ + /// + public partial class Add_PaymentRequests_Performance_Indexes : Migration + { + /// + protected override void Up(MigrationBuilder migrationBuilder) + { + migrationBuilder.CreateIndex( + name: "IX_PaymentRequests_CorrelationId", + schema: "Payments", + table: "PaymentRequests", + column: "CorrelationId"); + + migrationBuilder.CreateIndex( + name: "IX_PaymentRequests_CreationTime", + schema: "Payments", + table: "PaymentRequests", + column: "CreationTime"); + + migrationBuilder.CreateIndex( + name: "IX_PaymentRequests_Status", + schema: "Payments", + table: "PaymentRequests", + column: "Status"); + + migrationBuilder.CreateIndex( + name: "IX_PaymentRequests_TenantId_CreationTime", + schema: "Payments", + table: "PaymentRequests", + columns: new[] { "TenantId", "CreationTime" }, + filter: "\"IsDeleted\" = false"); + } + + /// + protected override void Down(MigrationBuilder migrationBuilder) + { + migrationBuilder.DropIndex( + name: "IX_PaymentRequests_CorrelationId", + schema: "Payments", + table: "PaymentRequests"); + + migrationBuilder.DropIndex( + name: "IX_PaymentRequests_CreationTime", + schema: "Payments", + table: "PaymentRequests"); + + migrationBuilder.DropIndex( + name: "IX_PaymentRequests_Status", + schema: "Payments", + table: "PaymentRequests"); + + migrationBuilder.DropIndex( + name: "IX_PaymentRequests_TenantId_CreationTime", + schema: "Payments", + table: "PaymentRequests"); + } + } +} 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 595756df54..f9b2cabbe5 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 @@ -4200,6 +4200,10 @@ protected override void BuildModel(ModelBuilder modelBuilder) b.HasIndex("AccountCodingId"); + b.HasIndex("CorrelationId"); + + b.HasIndex("CreationTime"); + b.HasIndex("FsbNotificationEmailLogId"); b.HasIndex("ReferenceNumber") @@ -4207,6 +4211,11 @@ protected override void BuildModel(ModelBuilder modelBuilder) b.HasIndex("SiteId"); + b.HasIndex("Status"); + + b.HasIndex("TenantId", "CreationTime") + .HasFilter("\"IsDeleted\" = false"); + b.ToTable("PaymentRequests", "Payments"); });