diff --git a/applications/Unity.GrantManager/modules/Unity.Flex/src/Unity.Flex.Application.Contracts/Reporting/Configuration/IWorksheetsMetadataService.cs b/applications/Unity.GrantManager/modules/Unity.Flex/src/Unity.Flex.Application.Contracts/Reporting/Configuration/IWorksheetsMetadataService.cs index 17ba6be14..e1d3ec774 100644 --- a/applications/Unity.GrantManager/modules/Unity.Flex/src/Unity.Flex.Application.Contracts/Reporting/Configuration/IWorksheetsMetadataService.cs +++ b/applications/Unity.GrantManager/modules/Unity.Flex/src/Unity.Flex.Application.Contracts/Reporting/Configuration/IWorksheetsMetadataService.cs @@ -5,7 +5,7 @@ namespace Unity.Flex.Reporting.Configuration { public interface IWorksheetsMetadataService { - Task GetWorksheetSchemaMetaDataAsync(Guid worksheetId); + Task GetWorksheetSchemaMetaDataAsync(Guid worksheetId, Guid formVersionId); Task GetWorksheetSchemaMetaDataItemAsync(Guid worksheetId, string fieldKey); } } diff --git a/applications/Unity.GrantManager/modules/Unity.Flex/src/Unity.Flex.Application/Reporting/Configuration/WorksheetFieldSchemaParser.cs b/applications/Unity.GrantManager/modules/Unity.Flex/src/Unity.Flex.Application/Reporting/Configuration/WorksheetFieldSchemaParser.cs index 8077c8fe6..1e4ab34f1 100644 --- a/applications/Unity.GrantManager/modules/Unity.Flex/src/Unity.Flex.Application/Reporting/Configuration/WorksheetFieldSchemaParser.cs +++ b/applications/Unity.GrantManager/modules/Unity.Flex/src/Unity.Flex.Application/Reporting/Configuration/WorksheetFieldSchemaParser.cs @@ -1,3 +1,4 @@ +using System; using System.Collections.Generic; using System.Linq; using System.Text.Json; @@ -15,6 +16,13 @@ namespace Unity.Flex.Reporting.Configuration public static partial class WorksheetFieldSchemaParser { private const string UnknownSectionName = "unknown_section"; + private const string ComponentsPropertyName = "components"; + + private static readonly JsonDocumentOptions LenientJsonOptions = new() + { + AllowTrailingCommas = true, + CommentHandling = JsonCommentHandling.Skip + }; /// /// Parses a custom field and returns component metadata items. @@ -23,8 +31,13 @@ public static partial class WorksheetFieldSchemaParser /// /// The custom field to parse /// The worksheet containing the field (for name context) + /// Optional form schema JSON string for resolving dynamic DataGrid columns + /// Optional submission header mapping /// List of component metadata items - public static List ParseField(CustomField field, Worksheet worksheet) + public static List ParseField(CustomField field, + Worksheet worksheet, + string? formSchema = null, + string? submissionHeaderMapping = null) { if (field == null) return []; @@ -34,7 +47,7 @@ public static List ParseField(CustomField fie switch (field.Type) { case CustomFieldType.DataGrid: - components.AddRange(ParseDataGridField(field, worksheet)); + components.AddRange(ParseDataGridField(field, worksheet, formSchema, submissionHeaderMapping)); break; case CustomFieldType.CheckboxGroup: @@ -58,8 +71,12 @@ public static List ParseField(CustomField fie /// Parses all fields in a worksheet and returns flattened component metadata. /// /// The worksheet to parse + /// Optional form schema JSON string for resolving dynamic DataGrid columns + /// Optional submission header mapping (not used in current implementation) /// List of all component metadata items - public static List ParseWorksheet(Worksheet worksheet) + public static List ParseWorksheet(Worksheet worksheet, + string? formSchema = null, + string? submissionHeaderMapping = null) { if (worksheet?.Sections == null) return []; @@ -67,17 +84,23 @@ public static List ParseWorksheet(Worksheet w return [..worksheet.Sections .Where(section => section.Fields != null) .SelectMany(section => section.Fields) - .SelectMany(field => ParseField(field, worksheet))]; + .SelectMany(field => ParseField(field, worksheet, formSchema, submissionHeaderMapping))]; } /// /// Parses a DataGrid field and returns metadata for each column defined in the DataGrid definition. - /// If dynamic is true, creates a placeholder column for dynamically determined columns. + /// If dynamic is true, attempts to extract columns from the form schema. If form schema is not available + /// or parsing fails, creates a placeholder column for dynamically determined columns. /// /// The DataGrid field to parse /// The worksheet containing the field + /// Optional form schema JSON string for resolving dynamic DataGrid columns + /// Optional submission header mapping (not used in current implementation) /// List of component metadata items for each DataGrid column - private static List ParseDataGridField(CustomField field, Worksheet worksheet) + private static List ParseDataGridField(CustomField field, + Worksheet worksheet, + string? formSchema = null, + string? submissionHeaderMapping = null) { var components = new List(); @@ -98,25 +121,68 @@ private static List ParseDataGridField(Custom var worksheetName = SanitizeName(worksheet.Name); var dataGridName = SanitizeName(field.Key); - // If dynamic is true, create a placeholder for dynamically determined columns + // Track whether we successfully extracted columns from CHEFS schema + bool extractedFromChefs = false; + + // If dynamic is true, try to extract columns from form schema if (dataGridDefinition.Dynamic) - { - var dynamicComponent = new WorksheetComponentMetaDataItemDto + { + var headerMappingKey = MatchHeaderMapping(field.Name + ".DataGrid", submissionHeaderMapping); + List? dynamicColumns = null; + + if (!string.IsNullOrWhiteSpace(headerMappingKey)) { - Id = $"{field.Id}_dynamic", - Key = "dynamic_columns", - Label = "Dynamic Columns", - Type = "Dynamic", - Path = $"{worksheetName}->{sectionName}->{dataGridName}->dynamic_columns", - TypePath = $"worksheet->section->datagrid->Dynamic", - DataPath = $"({worksheetName}){dataGridName}->dynamic_columns" - }; + dynamicColumns = ExtractDynamicDataGridColumns(headerMappingKey, formSchema); + } - components.Add(dynamicComponent); + if (dynamicColumns != null && dynamicColumns.Count > 0) + { + // We found columns in the form schema, use them + // CHEFS schema includes ALL columns (both static and dynamic), so we mark this as extracted + extractedFromChefs = true; + + foreach (var column in dynamicColumns) + { + // Use the key for the component Key (becomes PropertyName), sanitize for ID + var columnKey = !string.IsNullOrEmpty(column.Key) ? column.Key : column.Name; + var sanitizedKey = SanitizeName(columnKey); + + var component = new WorksheetComponentMetaDataItemDto + { + Id = $"{field.Id}_{sanitizedKey}", + Key = columnKey, + Label = column.Name, + Type = MapDataGridColumnType(column.Type), + Path = $"{worksheetName}->{sectionName}->{dataGridName}->{columnKey}", + TypePath = $"worksheet->section->datagrid->{MapDataGridColumnType(column.Type)}", + DataPath = $"({worksheetName}){dataGridName}->{columnKey}" + }; + + components.Add(component); + } + } + else + { + // Form schema not available or no columns found, create dynamic placeholder + var dynamicComponent = new WorksheetComponentMetaDataItemDto + { + Id = $"{field.Id}_dynamic", + Key = "dynamic_columns", + Label = "Dynamic Columns", + Type = "Dynamic", + Path = $"{worksheetName}->{sectionName}->{dataGridName}->dynamic_columns", + TypePath = $"worksheet->section->datagrid->Dynamic", + DataPath = $"({worksheetName}){dataGridName}->dynamic_columns" + }; + + components.Add(dynamicComponent); + } } - // Process additional defined columns (if any) - if (dataGridDefinition.Columns != null && dataGridDefinition.Columns.Count > 0) + // Process additional defined columns only if we haven't already extracted them from CHEFS + // When dynamic is true and CHEFS extraction succeeded, the CHEFS schema already includes + // all columns (both static and dynamic), so we skip this to avoid duplicates + if (!extractedFromChefs && dataGridDefinition.Columns != null && dataGridDefinition.Columns.Count > 0) { // Create a component for each column in the DataGrid foreach (var column in dataGridDefinition.Columns) @@ -137,7 +203,7 @@ private static List ParseDataGridField(Custom components.Add(component); } } - else if (!dataGridDefinition.Dynamic) + else if (!dataGridDefinition.Dynamic && (dataGridDefinition.Columns == null || dataGridDefinition.Columns.Count == 0)) { // If no columns defined and not dynamic, return the DataGrid itself as a component return [CreateSimpleComponent(field, worksheet)]; @@ -153,6 +219,30 @@ private static List ParseDataGridField(Custom } } + private static string? MatchHeaderMapping(string keyToSearch, string? submissionHeaderMapping) + { + if (string.IsNullOrWhiteSpace(submissionHeaderMapping)) + return null; + + try + { + using var document = JsonDocument.Parse(submissionHeaderMapping, LenientJsonOptions); + var root = document.RootElement; + + if (root.TryGetProperty(keyToSearch, out var valueElement)) + { + return valueElement.GetString(); + } + } + catch (JsonException) + { + // Failed to parse submission header mapping + return null; + } + + return null; + } + /// /// Parses a CheckboxGroup field and returns metadata for each checkbox option defined in the CheckboxGroup definition. /// @@ -298,6 +388,172 @@ private static string SanitizeName(string name) return SantizedNameExpression().Replace(name.Trim().Replace(" ", "_"), ""); } + /// + /// Extracts DataGrid column definitions from a form schema JSON string. + /// Searches for a DataGrid component with the specified key in the form schema and returns its columns. + /// + /// The key of the DataGrid field to find + /// The form schema JSON string to search + /// List of DataGrid column definitions, or null if not found or schema is invalid + private static List? ExtractDynamicDataGridColumns(string dataGridKey, string? formSchema) + { + if (string.IsNullOrWhiteSpace(formSchema)) + return null; + + try + { + using var document = JsonDocument.Parse(formSchema, LenientJsonOptions); + var root = document.RootElement; + + // CHEFS form schemas have a "components" array at the root + if (root.TryGetProperty(ComponentsPropertyName, out var componentsElement)) + { + return FindDataGridInComponents(componentsElement, dataGridKey); + } + } + catch (JsonException) + { + // Failed to parse form schema + return null; + } + + return null; + } + + /// + /// Recursively searches for a DataGrid component with the specified key in a components array. + /// + /// The JSON element representing a components array + /// The key of the DataGrid to find + /// List of DataGrid column definitions, or null if not found + private static List? FindDataGridInComponents(JsonElement componentsElement, string dataGridKey) + { + if (componentsElement.ValueKind != JsonValueKind.Array) + return null; + + foreach (var component in componentsElement.EnumerateArray()) + { + // Check if this component matches the DataGrid key and has a type + if (component.TryGetProperty("key", out var keyElement) && + keyElement.GetString() == dataGridKey && + component.TryGetProperty("type", out var typeElement)) + { + var type = typeElement.GetString()?.ToLower(); + if (type == "datagrid") + { + return ExtractColumnsFromDataGrid(component); + } + } + + // Recursively search in nested components (for panels, columns, etc.) + if (component.TryGetProperty(ComponentsPropertyName, out var nestedComponents)) + { + var result = FindDataGridInComponents(nestedComponents, dataGridKey); + if (result != null) + return result; + } + + // Also check columns property (for layout components) + var layoutResult = FindDataGridInLayoutColumns(component, dataGridKey); + if (layoutResult != null) + return layoutResult; + } + + return null; + } + + /// + /// Searches for a DataGrid component within layout column components. + /// + /// The JSON element representing a layout component + /// The key of the DataGrid to find + /// List of DataGrid column definitions, or null if not found + private static List? FindDataGridInLayoutColumns(JsonElement component, string dataGridKey) + { + if (!component.TryGetProperty("columns", out var columnsElement) || + columnsElement.ValueKind != JsonValueKind.Array) + return null; + + foreach (var column in columnsElement.EnumerateArray()) + { + if (column.TryGetProperty(ComponentsPropertyName, out var columnComponents)) + { + var result = FindDataGridInComponents(columnComponents, dataGridKey); + if (result != null) + return result; + } + } + + return null; + } + + /// + /// Extracts column definitions from a DataGrid component in the form schema. + /// + /// The JSON element representing a DataGrid component + /// List of DataGrid column definitions + private static List? ExtractColumnsFromDataGrid(JsonElement dataGridComponent) + { + var columns = new List(); + + // CHEFS DataGrid components have a "components" property that contains the column definitions + if (dataGridComponent.TryGetProperty(ComponentsPropertyName, out var componentsElement) && + componentsElement.ValueKind == JsonValueKind.Array) + { + foreach (var columnComponent in componentsElement.EnumerateArray()) + { + // Get the key (property name) from the column component + var columnKey = columnComponent.TryGetProperty("key", out var keyElement) + ? keyElement.GetString() + : null; + + // Get the label (display name) from the column component + var columnLabel = columnComponent.TryGetProperty("label", out var labelElement) + ? labelElement.GetString() + : columnKey; + + var columnType = columnComponent.TryGetProperty("type", out var typeElement) + ? MapChefsTypeToDataGridType(typeElement.GetString()) + : "text"; + + if (!string.IsNullOrEmpty(columnKey)) + { + columns.Add(new DataGridDefinitionColumn + { + Key = columnKey, + Name = columnLabel ?? columnKey, + Type = columnType + }); + } + } + } + + return columns.Count > 0 ? columns : null; + } + + /// + /// Maps CHEFS form component types to DataGrid column types. + /// + /// The CHEFS component type + /// Mapped DataGrid column type + private static string MapChefsTypeToDataGridType(string? chefsType) + { + return chefsType?.ToLowerInvariant() switch + { + "textfield" => "text", + "textarea" => "text", + "number" => "numeric", + "currency" => "currency", + "checkbox" => "checkbox", + "day" => "date", + "datetime" => "datetime", + "email" => "text", + "phonenumber" => "text", + "url" => "text", + _ => "text" // Default to text for unknown types + }; + } + [GeneratedRegex(@"[^a-zA-Z0-9_\-]")] private static partial Regex SantizedNameExpression(); } diff --git a/applications/Unity.GrantManager/modules/Unity.Flex/src/Unity.Flex.Application/Reporting/Configuration/WorksheetsMetadataService.cs b/applications/Unity.GrantManager/modules/Unity.Flex/src/Unity.Flex.Application/Reporting/Configuration/WorksheetsMetadataService.cs index d51a1f863..13c9b2efd 100644 --- a/applications/Unity.GrantManager/modules/Unity.Flex/src/Unity.Flex.Application/Reporting/Configuration/WorksheetsMetadataService.cs +++ b/applications/Unity.GrantManager/modules/Unity.Flex/src/Unity.Flex.Application/Reporting/Configuration/WorksheetsMetadataService.cs @@ -2,19 +2,22 @@ using System.Linq; using System.Threading.Tasks; using Unity.Flex.Domain.Worksheets; +using Unity.GrantManager.ApplicationForms; using Volo.Abp.DependencyInjection; namespace Unity.Flex.Reporting.Configuration { - public class WorksheetsMetadataService(IWorksheetRepository worksheetRepository) + public class WorksheetsMetadataService(IWorksheetRepository worksheetRepository, + IApplicationFormVersionAppService formVersionAppService) : IWorksheetsMetadataService, ITransientDependency { - public async Task GetWorksheetSchemaMetaDataAsync(Guid worksheetId) + public async Task GetWorksheetSchemaMetaDataAsync(Guid worksheetId, Guid formVersionId) { var worksheet = await worksheetRepository.GetAsync(worksheetId); - + var version = await formVersionAppService.GetAsync(formVersionId); + // Use the utility class to parse all fields in the worksheet - var components = WorksheetFieldSchemaParser.ParseWorksheet(worksheet); + var components = WorksheetFieldSchemaParser.ParseWorksheet(worksheet, version.FormSchema, version.SubmissionHeaderMapping); return new WorksheetComponentMetaDataDto() { diff --git a/applications/Unity.GrantManager/modules/Unity.Flex/src/Unity.Flex.Shared/Worksheets/Definitions/DataGridDefinition.cs b/applications/Unity.GrantManager/modules/Unity.Flex/src/Unity.Flex.Shared/Worksheets/Definitions/DataGridDefinition.cs index 368a06274..bcb81619d 100644 --- a/applications/Unity.GrantManager/modules/Unity.Flex/src/Unity.Flex.Shared/Worksheets/Definitions/DataGridDefinition.cs +++ b/applications/Unity.GrantManager/modules/Unity.Flex/src/Unity.Flex.Shared/Worksheets/Definitions/DataGridDefinition.cs @@ -27,6 +27,9 @@ public class DataGridDefinitionColumn [JsonPropertyName("type")] public string Type { get; set; } = string.Empty; + + [JsonPropertyName("key")] + public string Key { get; set; } = string.Empty; } public enum DataGridDefinitionSummaryOption diff --git a/applications/Unity.GrantManager/modules/Unity.Flex/test/Unity.Flex.Application.Tests/Reporting/WorksheetFieldSchemaParserTests.cs b/applications/Unity.GrantManager/modules/Unity.Flex/test/Unity.Flex.Application.Tests/Reporting/WorksheetFieldSchemaParserTests.cs index 2be221dcf..72ca6ade8 100644 --- a/applications/Unity.GrantManager/modules/Unity.Flex/test/Unity.Flex.Application.Tests/Reporting/WorksheetFieldSchemaParserTests.cs +++ b/applications/Unity.GrantManager/modules/Unity.Flex/test/Unity.Flex.Application.Tests/Reporting/WorksheetFieldSchemaParserTests.cs @@ -141,19 +141,19 @@ public async Task ParseField_WithNonDataGridType_ShouldReturnSimpleComponent() { // Arrange using var uow = _unitOfWorkManager.Begin(); - + var worksheet = new Worksheet(Guid.NewGuid(), "TestWorksheet", "Test Worksheet"); var section = new WorksheetSection(Guid.NewGuid(), "TestSection"); worksheet.Sections.Add(section); - + await _worksheetRepository.InsertAsync(worksheet, true); await uow.SaveChangesAsync(); - + var field = new CustomField(Guid.NewGuid(), "testTextField", "TestWorksheet", "Test Text Field", CustomFieldType.Text, "{}"); section.AddField(field); await uow.SaveChangesAsync(); - + worksheet = await _worksheetRepository.GetAsync(worksheet.Id); // Act @@ -162,11 +162,346 @@ public async Task ParseField_WithNonDataGridType_ShouldReturnSimpleComponent() // Assert result.ShouldNotBeNull(); result.Count.ShouldBe(1); - + var component = result.First(); component.Id.ShouldBe(field.Id.ToString()); component.Key.ShouldBe("testTextField"); component.Type.ShouldBe("Text"); } + + [Fact] + public async Task ParseDataGridField_DynamicWithFormSchema_ShouldExtractColumnsFromChefsSchema() + { + // Arrange + using var uow = _unitOfWorkManager.Begin(); + + var worksheet = new Worksheet(Guid.NewGuid(), "TestWorksheet", "Test Worksheet"); + var section = new WorksheetSection(Guid.NewGuid(), "TestSection"); + worksheet.Sections.Add(section); + + await _worksheetRepository.InsertAsync(worksheet, true); + await uow.SaveChangesAsync(); + + var field = new CustomField(Guid.NewGuid(), "testDataGrid", "TestWorksheet", "Test DataGrid", + CustomFieldType.DataGrid, + @"{""dynamic"": true, ""columns"": [], ""summaryOption"": ""None""}"); + section.AddField(field); + await uow.SaveChangesAsync(); + + worksheet = await _worksheetRepository.GetAsync(worksheet.Id); + + // The header mapping maps "field.Name.DataGrid" -> the CHEFS datagrid key + var submissionHeaderMapping = $@"{{""{field.Name}.DataGrid"": ""chefsDataGrid1""}}"; + + var formSchema = @"{ + ""components"": [ + { + ""key"": ""chefsDataGrid1"", + ""type"": ""datagrid"", + ""components"": [ + { ""key"": ""firstName"", ""label"": ""First Name"", ""type"": ""textfield"" }, + { ""key"": ""amount"", ""label"": ""Amount"", ""type"": ""number"" } + ] + } + ] + }"; + + // Act + var result = WorksheetFieldSchemaParser.ParseField(field, worksheet, formSchema, submissionHeaderMapping); + + // Assert — should extract columns from CHEFS schema, no dynamic placeholder + result.ShouldNotBeNull(); + result.Count.ShouldBe(2); + result.ShouldNotContain(c => c.Key == "dynamic_columns"); + + var firstNameCol = result.FirstOrDefault(c => c.Key == "firstName"); + firstNameCol.ShouldNotBeNull(); + firstNameCol.Label.ShouldBe("First Name"); + firstNameCol.Type.ShouldBe("Text"); + + var amountCol = result.FirstOrDefault(c => c.Key == "amount"); + amountCol.ShouldNotBeNull(); + amountCol.Label.ShouldBe("Amount"); + amountCol.Type.ShouldBe("Numeric"); + } + + [Fact] + public async Task ParseDataGridField_DynamicWithFormSchema_ShouldSkipDefinedColumnsWhenChefsExtracted() + { + // Arrange + using var uow = _unitOfWorkManager.Begin(); + + var worksheet = new Worksheet(Guid.NewGuid(), "TestWorksheet", "Test Worksheet"); + var section = new WorksheetSection(Guid.NewGuid(), "TestSection"); + worksheet.Sections.Add(section); + + await _worksheetRepository.InsertAsync(worksheet, true); + await uow.SaveChangesAsync(); + + // Definition has both dynamic=true AND static columns defined + var field = new CustomField(Guid.NewGuid(), "testDataGrid", "TestWorksheet", "Test DataGrid", + CustomFieldType.DataGrid, + @"{""dynamic"": true, ""columns"": [{""name"": ""staticCol"", ""type"": ""Text""}], ""summaryOption"": ""None""}"); + section.AddField(field); + await uow.SaveChangesAsync(); + + worksheet = await _worksheetRepository.GetAsync(worksheet.Id); + + var submissionHeaderMapping = $@"{{""{field.Name}.DataGrid"": ""chefsGrid""}}"; + + var formSchema = @"{ + ""components"": [ + { + ""key"": ""chefsGrid"", + ""type"": ""datagrid"", + ""components"": [ + { ""key"": ""dynamicCol"", ""label"": ""Dynamic Column"", ""type"": ""textfield"" } + ] + } + ] + }"; + + // Act + var result = WorksheetFieldSchemaParser.ParseField(field, worksheet, formSchema, submissionHeaderMapping); + + // Assert — CHEFS extraction succeeded, so static columns should be skipped to avoid duplicates + result.ShouldNotBeNull(); + result.Count.ShouldBe(1); + result.ShouldNotContain(c => c.Key == "staticCol"); + result.ShouldNotContain(c => c.Key == "dynamic_columns"); + + var dynamicCol = result.First(); + dynamicCol.Key.ShouldBe("dynamicCol"); + dynamicCol.Label.ShouldBe("Dynamic Column"); + dynamicCol.Type.ShouldBe("Text"); + } + + [Fact] + public async Task ParseDataGridField_DynamicWithNoHeaderMapping_ShouldFallBackToPlaceholder() + { + // Arrange + using var uow = _unitOfWorkManager.Begin(); + + var worksheet = new Worksheet(Guid.NewGuid(), "TestWorksheet", "Test Worksheet"); + var section = new WorksheetSection(Guid.NewGuid(), "TestSection"); + worksheet.Sections.Add(section); + + await _worksheetRepository.InsertAsync(worksheet, true); + await uow.SaveChangesAsync(); + + var field = new CustomField(Guid.NewGuid(), "testDataGrid", "TestWorksheet", "Test DataGrid", + CustomFieldType.DataGrid, + @"{""dynamic"": true, ""columns"": [{""name"": ""col1"", ""type"": ""Text""}], ""summaryOption"": ""None""}"); + section.AddField(field); + await uow.SaveChangesAsync(); + + worksheet = await _worksheetRepository.GetAsync(worksheet.Id); + + // Header mapping does NOT contain an entry for this field + var submissionHeaderMapping = @"{""unrelated_key.DataGrid"": ""someGrid""}"; + var formSchema = @"{ ""components"": [] }"; + + // Act + var result = WorksheetFieldSchemaParser.ParseField(field, worksheet, formSchema, submissionHeaderMapping); + + // Assert — no matching header mapping, so dynamic placeholder + static columns + result.ShouldNotBeNull(); + result.Count.ShouldBe(2); // 1 dynamic placeholder + 1 defined column + + result.ShouldContain(c => c.Key == "dynamic_columns"); + result.ShouldContain(c => c.Key == "col1"); + } + + [Fact] + public async Task ParseDataGridField_DynamicWithNestedFormSchema_ShouldFindDataGridInPanel() + { + // Arrange + using var uow = _unitOfWorkManager.Begin(); + + var worksheet = new Worksheet(Guid.NewGuid(), "TestWorksheet", "Test Worksheet"); + var section = new WorksheetSection(Guid.NewGuid(), "TestSection"); + worksheet.Sections.Add(section); + + await _worksheetRepository.InsertAsync(worksheet, true); + await uow.SaveChangesAsync(); + + var field = new CustomField(Guid.NewGuid(), "testDataGrid", "TestWorksheet", "Test DataGrid", + CustomFieldType.DataGrid, + @"{""dynamic"": true, ""columns"": [], ""summaryOption"": ""None""}"); + section.AddField(field); + await uow.SaveChangesAsync(); + + worksheet = await _worksheetRepository.GetAsync(worksheet.Id); + + var submissionHeaderMapping = $@"{{""{field.Name}.DataGrid"": ""nestedGrid""}}"; + + // DataGrid is nested inside a panel component + var formSchema = @"{ + ""components"": [ + { + ""key"": ""panel1"", + ""type"": ""panel"", + ""components"": [ + { + ""key"": ""nestedGrid"", + ""type"": ""datagrid"", + ""components"": [ + { ""key"": ""nestedCol"", ""label"": ""Nested Column"", ""type"": ""textarea"" } + ] + } + ] + } + ] + }"; + + // Act + var result = WorksheetFieldSchemaParser.ParseField(field, worksheet, formSchema, submissionHeaderMapping); + + // Assert — should find the datagrid inside the panel via recursive search + result.ShouldNotBeNull(); + result.Count.ShouldBe(1); + result.ShouldNotContain(c => c.Key == "dynamic_columns"); + + var col = result.First(); + col.Key.ShouldBe("nestedCol"); + col.Label.ShouldBe("Nested Column"); + col.Type.ShouldBe("Text"); // textarea maps to text + } + + [Fact] + public async Task ParseDataGridField_DynamicWithLayoutColumns_ShouldFindDataGridInLayoutColumn() + { + // Arrange + using var uow = _unitOfWorkManager.Begin(); + + var worksheet = new Worksheet(Guid.NewGuid(), "TestWorksheet", "Test Worksheet"); + var section = new WorksheetSection(Guid.NewGuid(), "TestSection"); + worksheet.Sections.Add(section); + + await _worksheetRepository.InsertAsync(worksheet, true); + await uow.SaveChangesAsync(); + + var field = new CustomField(Guid.NewGuid(), "testDataGrid", "TestWorksheet", "Test DataGrid", + CustomFieldType.DataGrid, + @"{""dynamic"": true, ""columns"": [], ""summaryOption"": ""None""}"); + section.AddField(field); + await uow.SaveChangesAsync(); + + worksheet = await _worksheetRepository.GetAsync(worksheet.Id); + + var submissionHeaderMapping = $@"{{""{field.Name}.DataGrid"": ""layoutGrid""}}"; + + // DataGrid is inside a layout "columns" element + var formSchema = @"{ + ""components"": [ + { + ""key"": ""layout1"", + ""type"": ""columns"", + ""columns"": [ + { + ""components"": [ + { + ""key"": ""layoutGrid"", + ""type"": ""datagrid"", + ""components"": [ + { ""key"": ""layoutCol"", ""label"": ""Layout Column"", ""type"": ""currency"" } + ] + } + ] + } + ] + } + ] + }"; + + // Act + var result = WorksheetFieldSchemaParser.ParseField(field, worksheet, formSchema, submissionHeaderMapping); + + // Assert — should find the datagrid inside layout columns + result.ShouldNotBeNull(); + result.Count.ShouldBe(1); + result.ShouldNotContain(c => c.Key == "dynamic_columns"); + + var col = result.First(); + col.Key.ShouldBe("layoutCol"); + col.Label.ShouldBe("Layout Column"); + col.Type.ShouldBe("Currency"); + } + + [Fact] + public async Task ParseDataGridField_DynamicWithInvalidFormSchema_ShouldFallBackToPlaceholder() + { + // Arrange + using var uow = _unitOfWorkManager.Begin(); + + var worksheet = new Worksheet(Guid.NewGuid(), "TestWorksheet", "Test Worksheet"); + var section = new WorksheetSection(Guid.NewGuid(), "TestSection"); + worksheet.Sections.Add(section); + + await _worksheetRepository.InsertAsync(worksheet, true); + await uow.SaveChangesAsync(); + + var field = new CustomField(Guid.NewGuid(), "testDataGrid", "TestWorksheet", "Test DataGrid", + CustomFieldType.DataGrid, + @"{""dynamic"": true, ""columns"": [], ""summaryOption"": ""None""}"); + section.AddField(field); + await uow.SaveChangesAsync(); + + worksheet = await _worksheetRepository.GetAsync(worksheet.Id); + + var submissionHeaderMapping = $@"{{""{field.Name}.DataGrid"": ""someGrid""}}"; + var formSchema = "not valid json {{{"; + + // Act + var result = WorksheetFieldSchemaParser.ParseField(field, worksheet, formSchema, submissionHeaderMapping); + + // Assert — invalid form schema should fall back to dynamic placeholder + result.ShouldNotBeNull(); + result.ShouldContain(c => c.Key == "dynamic_columns"); + result.First(c => c.Key == "dynamic_columns").Type.ShouldBe("Dynamic"); + } + + [Fact] + public async Task ParseDataGridField_DynamicWithFormSchemaKeyMismatch_ShouldFallBackToPlaceholder() + { + // Arrange + using var uow = _unitOfWorkManager.Begin(); + + var worksheet = new Worksheet(Guid.NewGuid(), "TestWorksheet", "Test Worksheet"); + var section = new WorksheetSection(Guid.NewGuid(), "TestSection"); + worksheet.Sections.Add(section); + + await _worksheetRepository.InsertAsync(worksheet, true); + await uow.SaveChangesAsync(); + + var field = new CustomField(Guid.NewGuid(), "testDataGrid", "TestWorksheet", "Test DataGrid", + CustomFieldType.DataGrid, + @"{""dynamic"": true, ""columns"": [], ""summaryOption"": ""None""}"); + section.AddField(field); + await uow.SaveChangesAsync(); + + worksheet = await _worksheetRepository.GetAsync(worksheet.Id); + + // Header mapping points to a key that does NOT exist in the form schema + var submissionHeaderMapping = $@"{{""{field.Name}.DataGrid"": ""nonExistentGrid""}}"; + var formSchema = @"{ + ""components"": [ + { + ""key"": ""differentGrid"", + ""type"": ""datagrid"", + ""components"": [ + { ""key"": ""col1"", ""label"": ""Col 1"", ""type"": ""textfield"" } + ] + } + ] + }"; + + // Act + var result = WorksheetFieldSchemaParser.ParseField(field, worksheet, formSchema, submissionHeaderMapping); + + // Assert — key mismatch means no columns extracted, should fall back to placeholder + result.ShouldNotBeNull(); + result.ShouldContain(c => c.Key == "dynamic_columns"); + } } } \ No newline at end of file diff --git a/applications/Unity.GrantManager/modules/Unity.Reporting/src/Unity.Reporting.Application/Configuration/FieldsProviders/ScoresheetFieldsProvider.cs b/applications/Unity.GrantManager/modules/Unity.Reporting/src/Unity.Reporting.Application/Configuration/FieldsProviders/ScoresheetFieldsProvider.cs index 265b964e3..4b856b3af 100644 --- a/applications/Unity.GrantManager/modules/Unity.Reporting/src/Unity.Reporting.Application/Configuration/FieldsProviders/ScoresheetFieldsProvider.cs +++ b/applications/Unity.GrantManager/modules/Unity.Reporting/src/Unity.Reporting.Application/Configuration/FieldsProviders/ScoresheetFieldsProvider.cs @@ -5,11 +5,10 @@ using System.Threading.Tasks; using Unity.Flex.Reporting.Configuration; using Unity.GrantManager.ApplicationForms; -using Unity.Reporting.Configuration.FieldsProviders; using Unity.Reporting.Domain.Configuration; using Volo.Abp.DependencyInjection; -namespace Unity.Reporting.Configuration.FieldProviders +namespace Unity.Reporting.Configuration.FieldsProviders { /// /// Fields provider implementation for Unity.Flex scoresheets that extracts field metadata from scoresheet configurations. @@ -146,7 +145,7 @@ private static Dictionary GetStoredScoresheetInfo(ReportColumnsM try { // Parse the mapping JSON to extract metadata - var mapping = JsonSerializer.Deserialize(reportColumnsMap.Mapping); + var mapping = JsonSerializer.Deserialize(reportColumnsMap.Mapping); var info = mapping?.Metadata?.Info; if (info != null) { @@ -222,19 +221,19 @@ private static string ExtractScoresheetId(string infoString) return infoString; } - } - /// - /// Simplified internal mapping class structure for JSON deserialization compatibility. - /// Used specifically for parsing stored mapping metadata to extract scoresheet information - /// during change detection operations without requiring the full mapping object structure. - /// - internal class Mapping - { /// - /// Gets or sets the metadata information associated with the mapping. - /// Contains contextual information about scoresheets and other correlation-specific details. + /// Simplified private mapping class structure for JSON deserialization compatibility. + /// Used specifically for parsing stored mapping metadata to extract scoresheet information + /// during change detection operations without requiring the full mapping object structure. /// - public MapMetadataDto? Metadata { get; set; } + private sealed class ScoresheetMapping + { + /// + /// Gets or sets the metadata information associated with the mapping. + /// Contains contextual information about scoresheets and other correlation-specific details. + /// + public MapMetadataDto? Metadata { get; set; } + } } } diff --git a/applications/Unity.GrantManager/modules/Unity.Reporting/src/Unity.Reporting.Application/Configuration/FieldsProviders/WorksheetFieldsProvider.cs b/applications/Unity.GrantManager/modules/Unity.Reporting/src/Unity.Reporting.Application/Configuration/FieldsProviders/WorksheetFieldsProvider.cs index 135bb2ae8..b609850c8 100644 --- a/applications/Unity.GrantManager/modules/Unity.Reporting/src/Unity.Reporting.Application/Configuration/FieldsProviders/WorksheetFieldsProvider.cs +++ b/applications/Unity.GrantManager/modules/Unity.Reporting/src/Unity.Reporting.Application/Configuration/FieldsProviders/WorksheetFieldsProvider.cs @@ -4,12 +4,11 @@ using System.Threading.Tasks; using Unity.Flex.Reporting.Configuration; using Unity.Flex.WorksheetLinks; -using Unity.Reporting.Configuration.FieldsProviders; using Unity.Reporting.Domain.Configuration; using Volo.Abp.DependencyInjection; using System.Text.Json; -namespace Unity.Reporting.Configuration.FieldProviders +namespace Unity.Reporting.Configuration.FieldsProviders { /// /// Fields provider implementation for Unity.Flex worksheets that extracts field metadata from linked worksheets. @@ -37,7 +36,7 @@ public async Task GetFieldsMetadataAsync(Guid correlationId foreach (var link in links) { - var metadata = await worksheetsMetadataService.GetWorksheetSchemaMetaDataAsync(link.WorksheetId); + var metadata = await worksheetsMetadataService.GetWorksheetSchemaMetaDataAsync(link.WorksheetId, correlationId); worksheetMetadata.Add(metadata); // Add worksheet information to the metadata map diff --git a/applications/Unity.GrantManager/modules/Unity.Reporting/src/Unity.Reporting.Application/EntityFrameworkCore/Repositories/ReportColumnsMapRepository.cs b/applications/Unity.GrantManager/modules/Unity.Reporting/src/Unity.Reporting.Application/EntityFrameworkCore/Repositories/ReportColumnsMapRepository.cs index d8350599a..2e559ef4c 100644 --- a/applications/Unity.GrantManager/modules/Unity.Reporting/src/Unity.Reporting.Application/EntityFrameworkCore/Repositories/ReportColumnsMapRepository.cs +++ b/applications/Unity.GrantManager/modules/Unity.Reporting/src/Unity.Reporting.Application/EntityFrameworkCore/Repositories/ReportColumnsMapRepository.cs @@ -118,13 +118,15 @@ public async Task GetViewPreviewDataAsync(string viewName, ViewD ColumnNames = await GetViewColumnNamesAsync(normalizedViewName) }; - // Build the preview query using the LIMIT 1 subquery pattern + // Build the preview query - select the most recently created application var previewQuery = $@" SELECT * FROM ""Reporting"".""{normalizedViewName}"" WHERE ""application_id"" = ( - SELECT ""application_id"" - FROM ""Reporting"".""{normalizedViewName}"" + SELECT v.""application_id"" + FROM ""Reporting"".""{normalizedViewName}"" v + INNER JOIN ""Applications"" a ON v.""application_id"" = a.""Id"" + ORDER BY a.""CreationTime"" DESC LIMIT 1 )"; diff --git a/applications/Unity.GrantManager/modules/Unity.Reporting/src/Unity.Reporting.Web/Views/Shared/Components/ReportingConfiguration/Default.cshtml b/applications/Unity.GrantManager/modules/Unity.Reporting/src/Unity.Reporting.Web/Views/Shared/Components/ReportingConfiguration/Default.cshtml index 03e3c82fe..871fa26a8 100644 --- a/applications/Unity.GrantManager/modules/Unity.Reporting/src/Unity.Reporting.Web/Views/Shared/Components/ReportingConfiguration/Default.cshtml +++ b/applications/Unity.GrantManager/modules/Unity.Reporting/src/Unity.Reporting.Web/Views/Shared/Components/ReportingConfiguration/Default.cshtml @@ -102,6 +102,17 @@ +
+ + + Unmapped DataGrid + +
+ @if (await PermissionChecker.IsGrantedAsync(ReportingPermissions.Configuration.Delete)) {
private async Task ResolveFormViewUrlAsync() { @@ -100,7 +100,7 @@ private async Task ResolveFormViewUrlAsync() { trimmed = trimmed[..^apiSegment.Length]; } - return $"{trimmed}/form/view?s="; + return $"{trimmed}/user/view?s="; } catch (Exception ex) { diff --git a/applications/Unity.GrantManager/src/Unity.GrantManager.EntityFrameworkCore/Migrations/HostMigrations/20260304172547_CommunitiesCustomScript.Designer.cs b/applications/Unity.GrantManager/src/Unity.GrantManager.EntityFrameworkCore/Migrations/HostMigrations/20260304172547_CommunitiesCustomScript.Designer.cs new file mode 100644 index 000000000..23445b6ad --- /dev/null +++ b/applications/Unity.GrantManager/src/Unity.GrantManager.EntityFrameworkCore/Migrations/HostMigrations/20260304172547_CommunitiesCustomScript.Designer.cs @@ -0,0 +1,2616 @@ +// +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.HostMigrations +{ + [DbContext(typeof(GrantManagerDbContext))] + [Migration("20260304172547_CommunitiesCustomScript")] + partial class CommunitiesCustomScript + { + /// + protected override void BuildTargetModel(ModelBuilder modelBuilder) + { +#pragma warning disable 612, 618 + modelBuilder + .HasAnnotation("_Abp_DatabaseProvider", EfCoreDatabaseProvider.PostgreSql) + .HasAnnotation("ProductVersion", "9.0.5") + .HasAnnotation("Relational:MaxIdentifierLength", 63); + + NpgsqlModelBuilderExtensions.UseIdentityByDefaultColumns(modelBuilder); + + modelBuilder.Entity("AppAny.Quartz.EntityFrameworkCore.Migrations.QuartzBlobTrigger", b => + { + b.Property("SchedulerName") + .HasColumnType("text") + .HasColumnName("sched_name"); + + b.Property("TriggerName") + .HasColumnType("text") + .HasColumnName("trigger_name"); + + b.Property("TriggerGroup") + .HasColumnType("text") + .HasColumnName("trigger_group"); + + b.Property("BlobData") + .HasColumnType("bytea") + .HasColumnName("blob_data"); + + b.HasKey("SchedulerName", "TriggerName", "TriggerGroup"); + + b.ToTable("qrtz_blob_triggers", (string)null); + }); + + modelBuilder.Entity("AppAny.Quartz.EntityFrameworkCore.Migrations.QuartzCalendar", b => + { + b.Property("SchedulerName") + .HasColumnType("text") + .HasColumnName("sched_name"); + + b.Property("CalendarName") + .HasColumnType("text") + .HasColumnName("calendar_name"); + + b.Property("Calendar") + .IsRequired() + .HasColumnType("bytea") + .HasColumnName("calendar"); + + b.HasKey("SchedulerName", "CalendarName"); + + b.ToTable("qrtz_calendars", (string)null); + }); + + modelBuilder.Entity("AppAny.Quartz.EntityFrameworkCore.Migrations.QuartzCronTrigger", b => + { + b.Property("SchedulerName") + .HasColumnType("text") + .HasColumnName("sched_name"); + + b.Property("TriggerName") + .HasColumnType("text") + .HasColumnName("trigger_name"); + + b.Property("TriggerGroup") + .HasColumnType("text") + .HasColumnName("trigger_group"); + + b.Property("CronExpression") + .IsRequired() + .HasColumnType("text") + .HasColumnName("cron_expression"); + + b.Property("TimeZoneId") + .HasColumnType("text") + .HasColumnName("time_zone_id"); + + b.HasKey("SchedulerName", "TriggerName", "TriggerGroup"); + + b.ToTable("qrtz_cron_triggers", (string)null); + }); + + modelBuilder.Entity("AppAny.Quartz.EntityFrameworkCore.Migrations.QuartzFiredTrigger", b => + { + b.Property("SchedulerName") + .HasColumnType("text") + .HasColumnName("sched_name"); + + b.Property("EntryId") + .HasColumnType("text") + .HasColumnName("entry_id"); + + b.Property("FiredTime") + .HasColumnType("bigint") + .HasColumnName("fired_time"); + + b.Property("InstanceName") + .IsRequired() + .HasColumnType("text") + .HasColumnName("instance_name"); + + b.Property("IsNonConcurrent") + .HasColumnType("bool") + .HasColumnName("is_nonconcurrent"); + + b.Property("JobGroup") + .HasColumnType("text") + .HasColumnName("job_group"); + + b.Property("JobName") + .HasColumnType("text") + .HasColumnName("job_name"); + + b.Property("Priority") + .HasColumnType("integer") + .HasColumnName("priority"); + + b.Property("RequestsRecovery") + .HasColumnType("bool") + .HasColumnName("requests_recovery"); + + b.Property("ScheduledTime") + .HasColumnType("bigint") + .HasColumnName("sched_time"); + + b.Property("State") + .IsRequired() + .HasColumnType("text") + .HasColumnName("state"); + + b.Property("TriggerGroup") + .IsRequired() + .HasColumnType("text") + .HasColumnName("trigger_group"); + + b.Property("TriggerName") + .IsRequired() + .HasColumnType("text") + .HasColumnName("trigger_name"); + + b.HasKey("SchedulerName", "EntryId"); + + b.HasIndex("InstanceName") + .HasDatabaseName("idx_qrtz_ft_trig_inst_name"); + + b.HasIndex("JobGroup") + .HasDatabaseName("idx_qrtz_ft_job_group"); + + b.HasIndex("JobName") + .HasDatabaseName("idx_qrtz_ft_job_name"); + + b.HasIndex("RequestsRecovery") + .HasDatabaseName("idx_qrtz_ft_job_req_recovery"); + + b.HasIndex("TriggerGroup") + .HasDatabaseName("idx_qrtz_ft_trig_group"); + + b.HasIndex("TriggerName") + .HasDatabaseName("idx_qrtz_ft_trig_name"); + + b.HasIndex("SchedulerName", "TriggerName", "TriggerGroup") + .HasDatabaseName("idx_qrtz_ft_trig_nm_gp"); + + b.ToTable("qrtz_fired_triggers", (string)null); + }); + + modelBuilder.Entity("AppAny.Quartz.EntityFrameworkCore.Migrations.QuartzJobDetail", b => + { + b.Property("SchedulerName") + .HasColumnType("text") + .HasColumnName("sched_name"); + + b.Property("JobName") + .HasColumnType("text") + .HasColumnName("job_name"); + + b.Property("JobGroup") + .HasColumnType("text") + .HasColumnName("job_group"); + + b.Property("Description") + .HasColumnType("text") + .HasColumnName("description"); + + b.Property("IsDurable") + .HasColumnType("bool") + .HasColumnName("is_durable"); + + b.Property("IsNonConcurrent") + .HasColumnType("bool") + .HasColumnName("is_nonconcurrent"); + + b.Property("IsUpdateData") + .HasColumnType("bool") + .HasColumnName("is_update_data"); + + b.Property("JobClassName") + .IsRequired() + .HasColumnType("text") + .HasColumnName("job_class_name"); + + b.Property("JobData") + .HasColumnType("bytea") + .HasColumnName("job_data"); + + b.Property("RequestsRecovery") + .HasColumnType("bool") + .HasColumnName("requests_recovery"); + + b.HasKey("SchedulerName", "JobName", "JobGroup"); + + b.HasIndex("RequestsRecovery") + .HasDatabaseName("idx_qrtz_j_req_recovery"); + + b.ToTable("qrtz_job_details", (string)null); + }); + + modelBuilder.Entity("AppAny.Quartz.EntityFrameworkCore.Migrations.QuartzLock", b => + { + b.Property("SchedulerName") + .HasColumnType("text") + .HasColumnName("sched_name"); + + b.Property("LockName") + .HasColumnType("text") + .HasColumnName("lock_name"); + + b.HasKey("SchedulerName", "LockName"); + + b.ToTable("qrtz_locks", (string)null); + }); + + modelBuilder.Entity("AppAny.Quartz.EntityFrameworkCore.Migrations.QuartzPausedTriggerGroup", b => + { + b.Property("SchedulerName") + .HasColumnType("text") + .HasColumnName("sched_name"); + + b.Property("TriggerGroup") + .HasColumnType("text") + .HasColumnName("trigger_group"); + + b.HasKey("SchedulerName", "TriggerGroup"); + + b.ToTable("qrtz_paused_trigger_grps", (string)null); + }); + + modelBuilder.Entity("AppAny.Quartz.EntityFrameworkCore.Migrations.QuartzSchedulerState", b => + { + b.Property("SchedulerName") + .HasColumnType("text") + .HasColumnName("sched_name"); + + b.Property("InstanceName") + .HasColumnType("text") + .HasColumnName("instance_name"); + + b.Property("CheckInInterval") + .HasColumnType("bigint") + .HasColumnName("checkin_interval"); + + b.Property("LastCheckInTime") + .HasColumnType("bigint") + .HasColumnName("last_checkin_time"); + + b.HasKey("SchedulerName", "InstanceName"); + + b.ToTable("qrtz_scheduler_state", (string)null); + }); + + modelBuilder.Entity("AppAny.Quartz.EntityFrameworkCore.Migrations.QuartzSimplePropertyTrigger", b => + { + b.Property("SchedulerName") + .HasColumnType("text") + .HasColumnName("sched_name"); + + b.Property("TriggerName") + .HasColumnType("text") + .HasColumnName("trigger_name"); + + b.Property("TriggerGroup") + .HasColumnType("text") + .HasColumnName("trigger_group"); + + b.Property("BooleanProperty1") + .HasColumnType("bool") + .HasColumnName("bool_prop_1"); + + b.Property("BooleanProperty2") + .HasColumnType("bool") + .HasColumnName("bool_prop_2"); + + b.Property("DecimalProperty1") + .HasColumnType("numeric") + .HasColumnName("dec_prop_1"); + + b.Property("DecimalProperty2") + .HasColumnType("numeric") + .HasColumnName("dec_prop_2"); + + b.Property("IntegerProperty1") + .HasColumnType("integer") + .HasColumnName("int_prop_1"); + + b.Property("IntegerProperty2") + .HasColumnType("integer") + .HasColumnName("int_prop_2"); + + b.Property("LongProperty1") + .HasColumnType("bigint") + .HasColumnName("long_prop_1"); + + b.Property("LongProperty2") + .HasColumnType("bigint") + .HasColumnName("long_prop_2"); + + b.Property("StringProperty1") + .HasColumnType("text") + .HasColumnName("str_prop_1"); + + b.Property("StringProperty2") + .HasColumnType("text") + .HasColumnName("str_prop_2"); + + b.Property("StringProperty3") + .HasColumnType("text") + .HasColumnName("str_prop_3"); + + b.Property("TimeZoneId") + .HasColumnType("text") + .HasColumnName("time_zone_id"); + + b.HasKey("SchedulerName", "TriggerName", "TriggerGroup"); + + b.ToTable("qrtz_simprop_triggers", (string)null); + }); + + modelBuilder.Entity("AppAny.Quartz.EntityFrameworkCore.Migrations.QuartzSimpleTrigger", b => + { + b.Property("SchedulerName") + .HasColumnType("text") + .HasColumnName("sched_name"); + + b.Property("TriggerName") + .HasColumnType("text") + .HasColumnName("trigger_name"); + + b.Property("TriggerGroup") + .HasColumnType("text") + .HasColumnName("trigger_group"); + + b.Property("RepeatCount") + .HasColumnType("bigint") + .HasColumnName("repeat_count"); + + b.Property("RepeatInterval") + .HasColumnType("bigint") + .HasColumnName("repeat_interval"); + + b.Property("TimesTriggered") + .HasColumnType("bigint") + .HasColumnName("times_triggered"); + + b.HasKey("SchedulerName", "TriggerName", "TriggerGroup"); + + b.ToTable("qrtz_simple_triggers", (string)null); + }); + + modelBuilder.Entity("AppAny.Quartz.EntityFrameworkCore.Migrations.QuartzTrigger", b => + { + b.Property("SchedulerName") + .HasColumnType("text") + .HasColumnName("sched_name"); + + b.Property("TriggerName") + .HasColumnType("text") + .HasColumnName("trigger_name"); + + b.Property("TriggerGroup") + .HasColumnType("text") + .HasColumnName("trigger_group"); + + b.Property("CalendarName") + .HasColumnType("text") + .HasColumnName("calendar_name"); + + b.Property("Description") + .HasColumnType("text") + .HasColumnName("description"); + + b.Property("EndTime") + .HasColumnType("bigint") + .HasColumnName("end_time"); + + b.Property("JobData") + .HasColumnType("bytea") + .HasColumnName("job_data"); + + b.Property("JobGroup") + .IsRequired() + .HasColumnType("text") + .HasColumnName("job_group"); + + b.Property("JobName") + .IsRequired() + .HasColumnType("text") + .HasColumnName("job_name"); + + b.Property("MisfireInstruction") + .HasColumnType("smallint") + .HasColumnName("misfire_instr"); + + b.Property("NextFireTime") + .HasColumnType("bigint") + .HasColumnName("next_fire_time"); + + b.Property("PreviousFireTime") + .HasColumnType("bigint") + .HasColumnName("prev_fire_time"); + + b.Property("Priority") + .HasColumnType("integer") + .HasColumnName("priority"); + + b.Property("StartTime") + .HasColumnType("bigint") + .HasColumnName("start_time"); + + b.Property("TriggerState") + .IsRequired() + .HasColumnType("text") + .HasColumnName("trigger_state"); + + b.Property("TriggerType") + .IsRequired() + .HasColumnType("text") + .HasColumnName("trigger_type"); + + b.HasKey("SchedulerName", "TriggerName", "TriggerGroup"); + + b.HasIndex("NextFireTime") + .HasDatabaseName("idx_qrtz_t_next_fire_time"); + + b.HasIndex("TriggerState") + .HasDatabaseName("idx_qrtz_t_state"); + + b.HasIndex("NextFireTime", "TriggerState") + .HasDatabaseName("idx_qrtz_t_nft_st"); + + b.HasIndex("SchedulerName", "JobName", "JobGroup"); + + b.ToTable("qrtz_triggers", (string)null); + }); + + modelBuilder.Entity("Unity.GrantManager.Applicants.ApplicantTenantMap", 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("LastUpdated") + .HasColumnType("timestamp without time zone"); + + b.Property("OidcSubUsername") + .IsRequired() + .HasColumnType("text"); + + b.Property("TenantId") + .HasColumnType("uuid"); + + b.Property("TenantName") + .IsRequired() + .HasColumnType("text"); + + b.HasKey("Id"); + + b.HasIndex("OidcSubUsername"); + + b.HasIndex("OidcSubUsername", "TenantId") + .IsUnique(); + + b.ToTable("ApplicantTenantMaps", (string)null); + }); + + modelBuilder.Entity("Unity.GrantManager.Integrations.DynamicUrl", 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("DeleterId") + .HasColumnType("uuid") + .HasColumnName("DeleterId"); + + b.Property("DeletionTime") + .HasColumnType("timestamp without time zone") + .HasColumnName("DeletionTime"); + + b.Property("Description") + .IsRequired() + .HasMaxLength(256) + .HasColumnType("character varying(256)"); + + b.Property("IsDeleted") + .ValueGeneratedOnAdd() + .HasColumnType("boolean") + .HasDefaultValue(false) + .HasColumnName("IsDeleted"); + + b.Property("KeyName") + .IsRequired() + .HasMaxLength(128) + .HasColumnType("character varying(128)"); + + 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("Url") + .IsRequired() + .HasColumnType("text"); + + b.HasKey("Id"); + + b.ToTable("DynamicUrls", (string)null); + }); + + modelBuilder.Entity("Unity.GrantManager.Locality.Community", 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("RegionalDistrictCode") + .IsRequired() + .HasColumnType("text"); + + b.Property("Type") + .IsRequired() + .HasColumnType("text"); + + b.HasKey("Id"); + + b.ToTable("Communities", (string)null); + }); + + modelBuilder.Entity("Unity.GrantManager.Locality.EconomicRegion", 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("EconomicRegionCode") + .IsRequired() + .HasColumnType("text"); + + b.Property("EconomicRegionName") + .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.HasKey("Id"); + + b.ToTable("EconomicRegions", (string)null); + }); + + modelBuilder.Entity("Unity.GrantManager.Locality.ElectoralDistrict", 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("ElectoralDistrictCode") + .IsRequired() + .HasColumnType("text"); + + b.Property("ElectoralDistrictName") + .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.HasKey("Id"); + + b.ToTable("ElectoralDistricts", (string)null); + }); + + modelBuilder.Entity("Unity.GrantManager.Locality.RegionalDistrict", 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("EconomicRegionCode") + .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("RegionalDistrictCode") + .IsRequired() + .HasColumnType("text"); + + b.Property("RegionalDistrictName") + .IsRequired() + .HasColumnType("text"); + + b.HasKey("Id"); + + b.ToTable("RegionalDistricts", (string)null); + }); + + modelBuilder.Entity("Unity.GrantManager.Locality.Sector", 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("SectorCode") + .IsRequired() + .HasColumnType("text"); + + b.Property("SectorName") + .IsRequired() + .HasColumnType("text"); + + b.HasKey("Id"); + + b.ToTable("Sectors", (string)null); + }); + + modelBuilder.Entity("Unity.GrantManager.Locality.SubSector", 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("SectorId") + .HasColumnType("uuid"); + + b.Property("SubSectorCode") + .IsRequired() + .HasColumnType("text"); + + b.Property("SubSectorName") + .IsRequired() + .HasColumnType("text"); + + b.HasKey("Id"); + + b.HasIndex("SectorId"); + + b.ToTable("SubSectors", (string)null); + }); + + modelBuilder.Entity("Unity.GrantManager.Tokens.TenantToken", b => + { + b.Property("Id") + .HasColumnType("uuid"); + + 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("Name") + .IsRequired() + .HasColumnType("text"); + + b.Property("TenantId") + .HasColumnType("uuid"); + + b.Property("Value") + .HasColumnType("text"); + + b.HasKey("Id"); + + b.ToTable("TenantTokens", (string)null); + }); + + modelBuilder.Entity("Volo.Abp.AuditLogging.AuditLog", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("uuid"); + + b.Property("ApplicationName") + .HasMaxLength(96) + .HasColumnType("character varying(96)") + .HasColumnName("ApplicationName"); + + b.Property("BrowserInfo") + .HasMaxLength(512) + .HasColumnType("character varying(512)") + .HasColumnName("BrowserInfo"); + + b.Property("ClientId") + .HasMaxLength(64) + .HasColumnType("character varying(64)") + .HasColumnName("ClientId"); + + b.Property("ClientIpAddress") + .HasMaxLength(64) + .HasColumnType("character varying(64)") + .HasColumnName("ClientIpAddress"); + + b.Property("ClientName") + .HasMaxLength(128) + .HasColumnType("character varying(128)") + .HasColumnName("ClientName"); + + b.Property("Comments") + .HasMaxLength(256) + .HasColumnType("character varying(256)") + .HasColumnName("Comments"); + + b.Property("ConcurrencyStamp") + .IsConcurrencyToken() + .IsRequired() + .HasMaxLength(40) + .HasColumnType("character varying(40)") + .HasColumnName("ConcurrencyStamp"); + + b.Property("CorrelationId") + .HasMaxLength(64) + .HasColumnType("character varying(64)") + .HasColumnName("CorrelationId"); + + b.Property("Exceptions") + .HasColumnType("text"); + + b.Property("ExecutionDuration") + .HasColumnType("integer") + .HasColumnName("ExecutionDuration"); + + b.Property("ExecutionTime") + .HasColumnType("timestamp without time zone"); + + b.Property("ExtraProperties") + .IsRequired() + .HasColumnType("text") + .HasColumnName("ExtraProperties"); + + b.Property("HttpMethod") + .HasMaxLength(16) + .HasColumnType("character varying(16)") + .HasColumnName("HttpMethod"); + + b.Property("HttpStatusCode") + .HasColumnType("integer") + .HasColumnName("HttpStatusCode"); + + b.Property("ImpersonatorTenantId") + .HasColumnType("uuid") + .HasColumnName("ImpersonatorTenantId"); + + b.Property("ImpersonatorTenantName") + .HasMaxLength(64) + .HasColumnType("character varying(64)") + .HasColumnName("ImpersonatorTenantName"); + + b.Property("ImpersonatorUserId") + .HasColumnType("uuid") + .HasColumnName("ImpersonatorUserId"); + + b.Property("ImpersonatorUserName") + .HasMaxLength(256) + .HasColumnType("character varying(256)") + .HasColumnName("ImpersonatorUserName"); + + b.Property("TenantId") + .HasColumnType("uuid") + .HasColumnName("TenantId"); + + b.Property("TenantName") + .HasMaxLength(64) + .HasColumnType("character varying(64)") + .HasColumnName("TenantName"); + + b.Property("Url") + .HasMaxLength(256) + .HasColumnType("character varying(256)") + .HasColumnName("Url"); + + b.Property("UserId") + .HasColumnType("uuid") + .HasColumnName("UserId"); + + b.Property("UserName") + .HasMaxLength(256) + .HasColumnType("character varying(256)") + .HasColumnName("UserName"); + + b.HasKey("Id"); + + b.HasIndex("TenantId", "ExecutionTime"); + + b.HasIndex("TenantId", "UserId", "ExecutionTime"); + + b.ToTable("AuditLogs", (string)null); + }); + + modelBuilder.Entity("Volo.Abp.AuditLogging.AuditLogAction", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("uuid"); + + b.Property("AuditLogId") + .HasColumnType("uuid") + .HasColumnName("AuditLogId"); + + b.Property("ExecutionDuration") + .HasColumnType("integer") + .HasColumnName("ExecutionDuration"); + + b.Property("ExecutionTime") + .HasColumnType("timestamp without time zone") + .HasColumnName("ExecutionTime"); + + b.Property("ExtraProperties") + .HasColumnType("text") + .HasColumnName("ExtraProperties"); + + b.Property("MethodName") + .HasMaxLength(128) + .HasColumnType("character varying(128)") + .HasColumnName("MethodName"); + + b.Property("Parameters") + .HasMaxLength(2000) + .HasColumnType("character varying(2000)") + .HasColumnName("Parameters"); + + b.Property("ServiceName") + .HasMaxLength(256) + .HasColumnType("character varying(256)") + .HasColumnName("ServiceName"); + + b.Property("TenantId") + .HasColumnType("uuid") + .HasColumnName("TenantId"); + + b.HasKey("Id"); + + b.HasIndex("AuditLogId"); + + b.HasIndex("TenantId", "ServiceName", "MethodName", "ExecutionTime"); + + b.ToTable("AuditLogActions", (string)null); + }); + + modelBuilder.Entity("Volo.Abp.AuditLogging.EntityChange", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("uuid"); + + b.Property("AuditLogId") + .HasColumnType("uuid") + .HasColumnName("AuditLogId"); + + b.Property("ChangeTime") + .HasColumnType("timestamp without time zone") + .HasColumnName("ChangeTime"); + + b.Property("ChangeType") + .HasColumnType("smallint") + .HasColumnName("ChangeType"); + + b.Property("EntityId") + .HasMaxLength(128) + .HasColumnType("character varying(128)") + .HasColumnName("EntityId"); + + b.Property("EntityTenantId") + .HasColumnType("uuid"); + + b.Property("EntityTypeFullName") + .IsRequired() + .HasMaxLength(128) + .HasColumnType("character varying(128)") + .HasColumnName("EntityTypeFullName"); + + b.Property("ExtraProperties") + .HasColumnType("text") + .HasColumnName("ExtraProperties"); + + b.Property("TenantId") + .HasColumnType("uuid") + .HasColumnName("TenantId"); + + b.HasKey("Id"); + + b.HasIndex("AuditLogId"); + + b.HasIndex("TenantId", "EntityTypeFullName", "EntityId"); + + b.ToTable("EntityChanges", (string)null); + }); + + modelBuilder.Entity("Volo.Abp.AuditLogging.EntityPropertyChange", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("uuid"); + + b.Property("EntityChangeId") + .HasColumnType("uuid"); + + b.Property("NewValue") + .HasMaxLength(512) + .HasColumnType("character varying(512)") + .HasColumnName("NewValue"); + + b.Property("OriginalValue") + .HasMaxLength(512) + .HasColumnType("character varying(512)") + .HasColumnName("OriginalValue"); + + b.Property("PropertyName") + .IsRequired() + .HasMaxLength(128) + .HasColumnType("character varying(128)") + .HasColumnName("PropertyName"); + + b.Property("PropertyTypeFullName") + .IsRequired() + .HasMaxLength(64) + .HasColumnType("character varying(64)") + .HasColumnName("PropertyTypeFullName"); + + b.Property("TenantId") + .HasColumnType("uuid") + .HasColumnName("TenantId"); + + b.HasKey("Id"); + + b.HasIndex("EntityChangeId"); + + b.ToTable("EntityPropertyChanges", (string)null); + }); + + modelBuilder.Entity("Volo.Abp.BackgroundJobs.BackgroundJobRecord", 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("ExtraProperties") + .IsRequired() + .HasColumnType("text") + .HasColumnName("ExtraProperties"); + + b.Property("IsAbandoned") + .ValueGeneratedOnAdd() + .HasColumnType("boolean") + .HasDefaultValue(false); + + b.Property("JobArgs") + .IsRequired() + .HasMaxLength(1048576) + .HasColumnType("character varying(1048576)"); + + b.Property("JobName") + .IsRequired() + .HasMaxLength(128) + .HasColumnType("character varying(128)"); + + b.Property("LastTryTime") + .HasColumnType("timestamp without time zone"); + + b.Property("NextTryTime") + .HasColumnType("timestamp without time zone"); + + b.Property("Priority") + .ValueGeneratedOnAdd() + .HasColumnType("smallint") + .HasDefaultValue((byte)15); + + b.Property("TryCount") + .ValueGeneratedOnAdd() + .HasColumnType("smallint") + .HasDefaultValue((short)0); + + b.HasKey("Id"); + + b.HasIndex("IsAbandoned", "NextTryTime"); + + b.ToTable("BackgroundJobs", (string)null); + }); + + modelBuilder.Entity("Volo.Abp.FeatureManagement.FeatureDefinitionRecord", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("uuid"); + + b.Property("AllowedProviders") + .HasMaxLength(256) + .HasColumnType("character varying(256)"); + + b.Property("DefaultValue") + .HasMaxLength(256) + .HasColumnType("character varying(256)"); + + b.Property("Description") + .HasMaxLength(256) + .HasColumnType("character varying(256)"); + + b.Property("DisplayName") + .IsRequired() + .HasMaxLength(256) + .HasColumnType("character varying(256)"); + + b.Property("ExtraProperties") + .HasColumnType("text") + .HasColumnName("ExtraProperties"); + + b.Property("GroupName") + .IsRequired() + .HasMaxLength(128) + .HasColumnType("character varying(128)"); + + b.Property("IsAvailableToHost") + .HasColumnType("boolean"); + + b.Property("IsVisibleToClients") + .HasColumnType("boolean"); + + b.Property("Name") + .IsRequired() + .HasMaxLength(128) + .HasColumnType("character varying(128)"); + + b.Property("ParentName") + .HasMaxLength(128) + .HasColumnType("character varying(128)"); + + b.Property("ValueType") + .HasMaxLength(2048) + .HasColumnType("character varying(2048)"); + + b.HasKey("Id"); + + b.HasIndex("GroupName"); + + b.HasIndex("Name") + .IsUnique(); + + b.ToTable("Features", (string)null); + }); + + modelBuilder.Entity("Volo.Abp.FeatureManagement.FeatureGroupDefinitionRecord", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("uuid"); + + b.Property("DisplayName") + .IsRequired() + .HasMaxLength(256) + .HasColumnType("character varying(256)"); + + b.Property("ExtraProperties") + .HasColumnType("text") + .HasColumnName("ExtraProperties"); + + b.Property("Name") + .IsRequired() + .HasMaxLength(128) + .HasColumnType("character varying(128)"); + + b.HasKey("Id"); + + b.HasIndex("Name") + .IsUnique(); + + b.ToTable("FeatureGroups", (string)null); + }); + + modelBuilder.Entity("Volo.Abp.FeatureManagement.FeatureValue", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("uuid"); + + b.Property("Name") + .IsRequired() + .HasMaxLength(128) + .HasColumnType("character varying(128)"); + + b.Property("ProviderKey") + .HasMaxLength(64) + .HasColumnType("character varying(64)"); + + b.Property("ProviderName") + .HasMaxLength(64) + .HasColumnType("character varying(64)"); + + b.Property("Value") + .IsRequired() + .HasMaxLength(128) + .HasColumnType("character varying(128)"); + + b.HasKey("Id"); + + b.HasIndex("Name", "ProviderName", "ProviderKey") + .IsUnique(); + + b.ToTable("FeatureValues", (string)null); + }); + + modelBuilder.Entity("Volo.Abp.Identity.IdentityClaimType", 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("Description") + .HasMaxLength(256) + .HasColumnType("character varying(256)"); + + b.Property("ExtraProperties") + .IsRequired() + .HasColumnType("text") + .HasColumnName("ExtraProperties"); + + b.Property("IsStatic") + .HasColumnType("boolean"); + + b.Property("Name") + .IsRequired() + .HasMaxLength(256) + .HasColumnType("character varying(256)"); + + b.Property("Regex") + .HasMaxLength(512) + .HasColumnType("character varying(512)"); + + b.Property("RegexDescription") + .HasMaxLength(128) + .HasColumnType("character varying(128)"); + + b.Property("Required") + .HasColumnType("boolean"); + + b.Property("ValueType") + .HasColumnType("integer"); + + b.HasKey("Id"); + + b.ToTable("ClaimTypes", (string)null); + }); + + modelBuilder.Entity("Volo.Abp.Identity.IdentityLinkUser", b => + { + b.Property("Id") + .HasColumnType("uuid"); + + b.Property("SourceTenantId") + .HasColumnType("uuid"); + + b.Property("SourceUserId") + .HasColumnType("uuid"); + + b.Property("TargetTenantId") + .HasColumnType("uuid"); + + b.Property("TargetUserId") + .HasColumnType("uuid"); + + b.HasKey("Id"); + + b.HasIndex("SourceUserId", "SourceTenantId", "TargetUserId", "TargetTenantId") + .IsUnique(); + + b.ToTable("LinkUsers", (string)null); + }); + + modelBuilder.Entity("Volo.Abp.Identity.IdentityRole", 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("EntityVersion") + .HasColumnType("integer"); + + b.Property("ExtraProperties") + .IsRequired() + .HasColumnType("text") + .HasColumnName("ExtraProperties"); + + b.Property("IsDefault") + .HasColumnType("boolean") + .HasColumnName("IsDefault"); + + b.Property("IsPublic") + .HasColumnType("boolean") + .HasColumnName("IsPublic"); + + b.Property("IsStatic") + .HasColumnType("boolean") + .HasColumnName("IsStatic"); + + b.Property("Name") + .IsRequired() + .HasMaxLength(256) + .HasColumnType("character varying(256)"); + + b.Property("NormalizedName") + .IsRequired() + .HasMaxLength(256) + .HasColumnType("character varying(256)"); + + b.Property("TenantId") + .HasColumnType("uuid") + .HasColumnName("TenantId"); + + b.HasKey("Id"); + + b.HasIndex("NormalizedName"); + + b.ToTable("Roles", (string)null); + }); + + modelBuilder.Entity("Volo.Abp.Identity.IdentityRoleClaim", b => + { + b.Property("Id") + .HasColumnType("uuid"); + + b.Property("ClaimType") + .IsRequired() + .HasMaxLength(256) + .HasColumnType("character varying(256)"); + + b.Property("ClaimValue") + .HasMaxLength(1024) + .HasColumnType("character varying(1024)"); + + b.Property("RoleId") + .HasColumnType("uuid"); + + b.Property("TenantId") + .HasColumnType("uuid") + .HasColumnName("TenantId"); + + b.HasKey("Id"); + + b.HasIndex("RoleId"); + + b.ToTable("RoleClaims", (string)null); + }); + + modelBuilder.Entity("Volo.Abp.Identity.IdentitySecurityLog", b => + { + b.Property("Id") + .HasColumnType("uuid"); + + b.Property("Action") + .HasMaxLength(96) + .HasColumnType("character varying(96)"); + + b.Property("ApplicationName") + .HasMaxLength(96) + .HasColumnType("character varying(96)"); + + b.Property("BrowserInfo") + .HasMaxLength(512) + .HasColumnType("character varying(512)"); + + b.Property("ClientId") + .HasMaxLength(64) + .HasColumnType("character varying(64)"); + + b.Property("ClientIpAddress") + .HasMaxLength(64) + .HasColumnType("character varying(64)"); + + b.Property("ConcurrencyStamp") + .IsConcurrencyToken() + .IsRequired() + .HasMaxLength(40) + .HasColumnType("character varying(40)") + .HasColumnName("ConcurrencyStamp"); + + b.Property("CorrelationId") + .HasMaxLength(64) + .HasColumnType("character varying(64)"); + + b.Property("CreationTime") + .HasColumnType("timestamp without time zone"); + + b.Property("ExtraProperties") + .IsRequired() + .HasColumnType("text") + .HasColumnName("ExtraProperties"); + + b.Property("Identity") + .HasMaxLength(96) + .HasColumnType("character varying(96)"); + + b.Property("TenantId") + .HasColumnType("uuid") + .HasColumnName("TenantId"); + + b.Property("TenantName") + .HasMaxLength(64) + .HasColumnType("character varying(64)"); + + b.Property("UserId") + .HasColumnType("uuid"); + + b.Property("UserName") + .HasMaxLength(256) + .HasColumnType("character varying(256)"); + + b.HasKey("Id"); + + b.HasIndex("TenantId", "Action"); + + b.HasIndex("TenantId", "ApplicationName"); + + b.HasIndex("TenantId", "Identity"); + + b.HasIndex("TenantId", "UserId"); + + b.ToTable("SecurityLogs", (string)null); + }); + + modelBuilder.Entity("Volo.Abp.Identity.IdentitySession", b => + { + b.Property("Id") + .HasColumnType("uuid"); + + b.Property("ClientId") + .HasMaxLength(64) + .HasColumnType("character varying(64)"); + + b.Property("Device") + .IsRequired() + .HasMaxLength(64) + .HasColumnType("character varying(64)"); + + b.Property("DeviceInfo") + .HasMaxLength(64) + .HasColumnType("character varying(64)"); + + b.Property("ExtraProperties") + .HasColumnType("text") + .HasColumnName("ExtraProperties"); + + b.Property("IpAddresses") + .HasMaxLength(2048) + .HasColumnType("character varying(2048)"); + + b.Property("LastAccessed") + .HasColumnType("timestamp without time zone"); + + b.Property("SessionId") + .IsRequired() + .HasMaxLength(128) + .HasColumnType("character varying(128)"); + + b.Property("SignedIn") + .HasColumnType("timestamp without time zone"); + + b.Property("TenantId") + .HasColumnType("uuid") + .HasColumnName("TenantId"); + + b.Property("UserId") + .HasColumnType("uuid"); + + b.HasKey("Id"); + + b.HasIndex("Device"); + + b.HasIndex("SessionId"); + + b.HasIndex("TenantId", "UserId"); + + b.ToTable("Sessions", (string)null); + }); + + modelBuilder.Entity("Volo.Abp.Identity.IdentityUser", b => + { + b.Property("Id") + .HasColumnType("uuid"); + + b.Property("AccessFailedCount") + .ValueGeneratedOnAdd() + .HasColumnType("integer") + .HasDefaultValue(0) + .HasColumnName("AccessFailedCount"); + + 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("DisplayName") + .HasColumnType("text"); + + b.Property("Email") + .IsRequired() + .HasMaxLength(256) + .HasColumnType("character varying(256)") + .HasColumnName("Email"); + + b.Property("EmailConfirmed") + .ValueGeneratedOnAdd() + .HasColumnType("boolean") + .HasDefaultValue(false) + .HasColumnName("EmailConfirmed"); + + b.Property("EntityVersion") + .HasColumnType("integer"); + + b.Property("ExtraProperties") + .IsRequired() + .HasColumnType("text") + .HasColumnName("ExtraProperties"); + + b.Property("IsActive") + .HasColumnType("boolean") + .HasColumnName("IsActive"); + + b.Property("IsDeleted") + .ValueGeneratedOnAdd() + .HasColumnType("boolean") + .HasDefaultValue(false) + .HasColumnName("IsDeleted"); + + b.Property("IsExternal") + .ValueGeneratedOnAdd() + .HasColumnType("boolean") + .HasDefaultValue(false) + .HasColumnName("IsExternal"); + + b.Property("LastModificationTime") + .HasColumnType("timestamp without time zone") + .HasColumnName("LastModificationTime"); + + b.Property("LastModifierId") + .HasColumnType("uuid") + .HasColumnName("LastModifierId"); + + b.Property("LastPasswordChangeTime") + .HasColumnType("timestamp with time zone"); + + b.Property("LockoutEnabled") + .ValueGeneratedOnAdd() + .HasColumnType("boolean") + .HasDefaultValue(false) + .HasColumnName("LockoutEnabled"); + + b.Property("LockoutEnd") + .HasColumnType("timestamp with time zone"); + + b.Property("Name") + .HasMaxLength(64) + .HasColumnType("character varying(64)") + .HasColumnName("Name"); + + b.Property("NormalizedEmail") + .IsRequired() + .HasMaxLength(256) + .HasColumnType("character varying(256)") + .HasColumnName("NormalizedEmail"); + + b.Property("NormalizedUserName") + .IsRequired() + .HasMaxLength(256) + .HasColumnType("character varying(256)") + .HasColumnName("NormalizedUserName"); + + b.Property("OidcSub") + .HasColumnType("text"); + + b.Property("PasswordHash") + .HasMaxLength(256) + .HasColumnType("character varying(256)") + .HasColumnName("PasswordHash"); + + b.Property("PhoneNumber") + .HasMaxLength(16) + .HasColumnType("character varying(16)") + .HasColumnName("PhoneNumber"); + + b.Property("PhoneNumberConfirmed") + .ValueGeneratedOnAdd() + .HasColumnType("boolean") + .HasDefaultValue(false) + .HasColumnName("PhoneNumberConfirmed"); + + b.Property("SecurityStamp") + .IsRequired() + .HasMaxLength(256) + .HasColumnType("character varying(256)") + .HasColumnName("SecurityStamp"); + + b.Property("ShouldChangePasswordOnNextLogin") + .HasColumnType("boolean"); + + b.Property("Surname") + .HasMaxLength(64) + .HasColumnType("character varying(64)") + .HasColumnName("Surname"); + + b.Property("TenantId") + .HasColumnType("uuid") + .HasColumnName("TenantId"); + + b.Property("TwoFactorEnabled") + .ValueGeneratedOnAdd() + .HasColumnType("boolean") + .HasDefaultValue(false) + .HasColumnName("TwoFactorEnabled"); + + b.Property("UserName") + .IsRequired() + .HasMaxLength(256) + .HasColumnType("character varying(256)") + .HasColumnName("UserName"); + + b.HasKey("Id"); + + b.HasIndex("Email"); + + b.HasIndex("NormalizedEmail"); + + b.HasIndex("NormalizedUserName"); + + b.HasIndex("UserName"); + + b.ToTable("Users", (string)null); + }); + + modelBuilder.Entity("Volo.Abp.Identity.IdentityUserClaim", b => + { + b.Property("Id") + .HasColumnType("uuid"); + + b.Property("ClaimType") + .IsRequired() + .HasMaxLength(256) + .HasColumnType("character varying(256)"); + + b.Property("ClaimValue") + .HasMaxLength(1024) + .HasColumnType("character varying(1024)"); + + b.Property("TenantId") + .HasColumnType("uuid") + .HasColumnName("TenantId"); + + b.Property("UserId") + .HasColumnType("uuid"); + + b.HasKey("Id"); + + b.HasIndex("UserId"); + + b.ToTable("UserClaims", (string)null); + }); + + modelBuilder.Entity("Volo.Abp.Identity.IdentityUserDelegation", b => + { + b.Property("Id") + .HasColumnType("uuid"); + + b.Property("EndTime") + .HasColumnType("timestamp without time zone"); + + b.Property("SourceUserId") + .HasColumnType("uuid"); + + b.Property("StartTime") + .HasColumnType("timestamp without time zone"); + + b.Property("TargetUserId") + .HasColumnType("uuid"); + + b.Property("TenantId") + .HasColumnType("uuid") + .HasColumnName("TenantId"); + + b.HasKey("Id"); + + b.ToTable("UserDelegations", (string)null); + }); + + modelBuilder.Entity("Volo.Abp.Identity.IdentityUserLogin", b => + { + b.Property("UserId") + .HasColumnType("uuid"); + + b.Property("LoginProvider") + .HasMaxLength(64) + .HasColumnType("character varying(64)"); + + b.Property("ProviderDisplayName") + .HasMaxLength(128) + .HasColumnType("character varying(128)"); + + b.Property("ProviderKey") + .IsRequired() + .HasMaxLength(196) + .HasColumnType("character varying(196)"); + + b.Property("TenantId") + .HasColumnType("uuid") + .HasColumnName("TenantId"); + + b.HasKey("UserId", "LoginProvider"); + + b.HasIndex("LoginProvider", "ProviderKey"); + + b.ToTable("UserLogins", (string)null); + }); + + modelBuilder.Entity("Volo.Abp.Identity.IdentityUserOrganizationUnit", b => + { + b.Property("OrganizationUnitId") + .HasColumnType("uuid"); + + b.Property("UserId") + .HasColumnType("uuid"); + + b.Property("CreationTime") + .HasColumnType("timestamp without time zone") + .HasColumnName("CreationTime"); + + b.Property("CreatorId") + .HasColumnType("uuid") + .HasColumnName("CreatorId"); + + b.Property("TenantId") + .HasColumnType("uuid") + .HasColumnName("TenantId"); + + b.HasKey("OrganizationUnitId", "UserId"); + + b.HasIndex("UserId", "OrganizationUnitId"); + + b.ToTable("UserOrganizationUnits", (string)null); + }); + + modelBuilder.Entity("Volo.Abp.Identity.IdentityUserRole", b => + { + b.Property("UserId") + .HasColumnType("uuid"); + + b.Property("RoleId") + .HasColumnType("uuid"); + + b.Property("TenantId") + .HasColumnType("uuid") + .HasColumnName("TenantId"); + + b.HasKey("UserId", "RoleId"); + + b.HasIndex("RoleId", "UserId"); + + b.ToTable("UserRoles", (string)null); + }); + + modelBuilder.Entity("Volo.Abp.Identity.IdentityUserToken", b => + { + b.Property("UserId") + .HasColumnType("uuid"); + + b.Property("LoginProvider") + .HasMaxLength(64) + .HasColumnType("character varying(64)"); + + b.Property("Name") + .HasMaxLength(128) + .HasColumnType("character varying(128)"); + + b.Property("TenantId") + .HasColumnType("uuid") + .HasColumnName("TenantId"); + + b.Property("Value") + .HasColumnType("text"); + + b.HasKey("UserId", "LoginProvider", "Name"); + + b.ToTable("UserTokens", (string)null); + }); + + modelBuilder.Entity("Volo.Abp.Identity.OrganizationUnit", b => + { + b.Property("Id") + .HasColumnType("uuid"); + + b.Property("Code") + .IsRequired() + .HasMaxLength(95) + .HasColumnType("character varying(95)") + .HasColumnName("Code"); + + 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("DisplayName") + .IsRequired() + .HasMaxLength(128) + .HasColumnType("character varying(128)") + .HasColumnName("DisplayName"); + + b.Property("EntityVersion") + .HasColumnType("integer"); + + 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("ParentId") + .HasColumnType("uuid"); + + b.Property("TenantId") + .HasColumnType("uuid") + .HasColumnName("TenantId"); + + b.HasKey("Id"); + + b.HasIndex("Code"); + + b.HasIndex("ParentId"); + + b.ToTable("OrganizationUnits", (string)null); + }); + + modelBuilder.Entity("Volo.Abp.Identity.OrganizationUnitRole", b => + { + b.Property("OrganizationUnitId") + .HasColumnType("uuid"); + + b.Property("RoleId") + .HasColumnType("uuid"); + + b.Property("CreationTime") + .HasColumnType("timestamp without time zone") + .HasColumnName("CreationTime"); + + b.Property("CreatorId") + .HasColumnType("uuid") + .HasColumnName("CreatorId"); + + b.Property("TenantId") + .HasColumnType("uuid") + .HasColumnName("TenantId"); + + b.HasKey("OrganizationUnitId", "RoleId"); + + b.HasIndex("RoleId", "OrganizationUnitId"); + + b.ToTable("OrganizationUnitRoles", (string)null); + }); + + modelBuilder.Entity("Volo.Abp.PermissionManagement.PermissionDefinitionRecord", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("uuid"); + + b.Property("DisplayName") + .IsRequired() + .HasMaxLength(256) + .HasColumnType("character varying(256)"); + + b.Property("ExtraProperties") + .HasColumnType("text") + .HasColumnName("ExtraProperties"); + + b.Property("GroupName") + .IsRequired() + .HasMaxLength(128) + .HasColumnType("character varying(128)"); + + b.Property("IsEnabled") + .HasColumnType("boolean"); + + b.Property("MultiTenancySide") + .HasColumnType("smallint"); + + b.Property("Name") + .IsRequired() + .HasMaxLength(128) + .HasColumnType("character varying(128)"); + + b.Property("ParentName") + .HasMaxLength(128) + .HasColumnType("character varying(128)"); + + b.Property("Providers") + .HasMaxLength(128) + .HasColumnType("character varying(128)"); + + b.Property("StateCheckers") + .HasMaxLength(256) + .HasColumnType("character varying(256)"); + + b.HasKey("Id"); + + b.HasIndex("GroupName"); + + b.HasIndex("Name") + .IsUnique(); + + b.ToTable("Permissions", (string)null); + }); + + modelBuilder.Entity("Volo.Abp.PermissionManagement.PermissionGrant", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("uuid"); + + b.Property("Name") + .IsRequired() + .HasMaxLength(128) + .HasColumnType("character varying(128)"); + + b.Property("ProviderKey") + .IsRequired() + .HasMaxLength(64) + .HasColumnType("character varying(64)"); + + b.Property("ProviderName") + .IsRequired() + .HasMaxLength(64) + .HasColumnType("character varying(64)"); + + b.Property("TenantId") + .HasColumnType("uuid") + .HasColumnName("TenantId"); + + b.HasKey("Id"); + + b.HasIndex("TenantId", "Name", "ProviderName", "ProviderKey") + .IsUnique(); + + b.ToTable("PermissionGrants", (string)null); + }); + + modelBuilder.Entity("Volo.Abp.PermissionManagement.PermissionGroupDefinitionRecord", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("uuid"); + + b.Property("DisplayName") + .IsRequired() + .HasMaxLength(256) + .HasColumnType("character varying(256)"); + + b.Property("ExtraProperties") + .HasColumnType("text") + .HasColumnName("ExtraProperties"); + + b.Property("Name") + .IsRequired() + .HasMaxLength(128) + .HasColumnType("character varying(128)"); + + b.HasKey("Id"); + + b.HasIndex("Name") + .IsUnique(); + + b.ToTable("PermissionGroups", (string)null); + }); + + modelBuilder.Entity("Volo.Abp.SettingManagement.Setting", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("uuid"); + + b.Property("Name") + .IsRequired() + .HasMaxLength(128) + .HasColumnType("character varying(128)"); + + b.Property("ProviderKey") + .HasMaxLength(64) + .HasColumnType("character varying(64)"); + + b.Property("ProviderName") + .HasMaxLength(64) + .HasColumnType("character varying(64)"); + + b.Property("Value") + .IsRequired() + .HasMaxLength(2048) + .HasColumnType("character varying(2048)"); + + b.HasKey("Id"); + + b.HasIndex("Name", "ProviderName", "ProviderKey") + .IsUnique(); + + b.ToTable("Settings", (string)null); + }); + + modelBuilder.Entity("Volo.Abp.SettingManagement.SettingDefinitionRecord", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("uuid"); + + b.Property("DefaultValue") + .HasMaxLength(2048) + .HasColumnType("character varying(2048)"); + + b.Property("Description") + .HasMaxLength(512) + .HasColumnType("character varying(512)"); + + b.Property("DisplayName") + .IsRequired() + .HasMaxLength(256) + .HasColumnType("character varying(256)"); + + b.Property("ExtraProperties") + .HasColumnType("text") + .HasColumnName("ExtraProperties"); + + b.Property("IsEncrypted") + .HasColumnType("boolean"); + + b.Property("IsInherited") + .HasColumnType("boolean"); + + b.Property("IsVisibleToClients") + .HasColumnType("boolean"); + + b.Property("Name") + .IsRequired() + .HasMaxLength(128) + .HasColumnType("character varying(128)"); + + b.Property("Providers") + .HasMaxLength(1024) + .HasColumnType("character varying(1024)"); + + b.HasKey("Id"); + + b.HasIndex("Name") + .IsUnique(); + + b.ToTable("SettingDefinitions", (string)null); + }); + + modelBuilder.Entity("Volo.Abp.TenantManagement.Tenant", 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("DeleterId") + .HasColumnType("uuid") + .HasColumnName("DeleterId"); + + b.Property("DeletionTime") + .HasColumnType("timestamp without time zone") + .HasColumnName("DeletionTime"); + + b.Property("EntityVersion") + .HasColumnType("integer"); + + 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() + .HasMaxLength(64) + .HasColumnType("character varying(64)"); + + b.Property("NormalizedName") + .IsRequired() + .HasMaxLength(64) + .HasColumnType("character varying(64)"); + + b.HasKey("Id"); + + b.HasIndex("Name"); + + b.HasIndex("NormalizedName"); + + b.ToTable("Tenants", (string)null); + }); + + modelBuilder.Entity("Volo.Abp.TenantManagement.TenantConnectionString", b => + { + b.Property("TenantId") + .HasColumnType("uuid"); + + b.Property("Name") + .HasMaxLength(64) + .HasColumnType("character varying(64)"); + + b.Property("Value") + .IsRequired() + .HasMaxLength(1024) + .HasColumnType("character varying(1024)"); + + b.HasKey("TenantId", "Name"); + + b.ToTable("TenantConnectionStrings", (string)null); + }); + + modelBuilder.Entity("AppAny.Quartz.EntityFrameworkCore.Migrations.QuartzBlobTrigger", b => + { + b.HasOne("AppAny.Quartz.EntityFrameworkCore.Migrations.QuartzTrigger", "Trigger") + .WithMany("BlobTriggers") + .HasForeignKey("SchedulerName", "TriggerName", "TriggerGroup") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("Trigger"); + }); + + modelBuilder.Entity("AppAny.Quartz.EntityFrameworkCore.Migrations.QuartzCronTrigger", b => + { + b.HasOne("AppAny.Quartz.EntityFrameworkCore.Migrations.QuartzTrigger", "Trigger") + .WithMany("CronTriggers") + .HasForeignKey("SchedulerName", "TriggerName", "TriggerGroup") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("Trigger"); + }); + + modelBuilder.Entity("AppAny.Quartz.EntityFrameworkCore.Migrations.QuartzSimplePropertyTrigger", b => + { + b.HasOne("AppAny.Quartz.EntityFrameworkCore.Migrations.QuartzTrigger", "Trigger") + .WithMany("SimplePropertyTriggers") + .HasForeignKey("SchedulerName", "TriggerName", "TriggerGroup") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("Trigger"); + }); + + modelBuilder.Entity("AppAny.Quartz.EntityFrameworkCore.Migrations.QuartzSimpleTrigger", b => + { + b.HasOne("AppAny.Quartz.EntityFrameworkCore.Migrations.QuartzTrigger", "Trigger") + .WithMany("SimpleTriggers") + .HasForeignKey("SchedulerName", "TriggerName", "TriggerGroup") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("Trigger"); + }); + + modelBuilder.Entity("AppAny.Quartz.EntityFrameworkCore.Migrations.QuartzTrigger", b => + { + b.HasOne("AppAny.Quartz.EntityFrameworkCore.Migrations.QuartzJobDetail", "JobDetail") + .WithMany("Triggers") + .HasForeignKey("SchedulerName", "JobName", "JobGroup") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("JobDetail"); + }); + + modelBuilder.Entity("Unity.GrantManager.Locality.SubSector", b => + { + b.HasOne("Unity.GrantManager.Locality.Sector", "Sector") + .WithMany("SubSectors") + .HasForeignKey("SectorId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("Sector"); + }); + + modelBuilder.Entity("Volo.Abp.AuditLogging.AuditLogAction", b => + { + b.HasOne("Volo.Abp.AuditLogging.AuditLog", null) + .WithMany("Actions") + .HasForeignKey("AuditLogId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + }); + + modelBuilder.Entity("Volo.Abp.AuditLogging.EntityChange", b => + { + b.HasOne("Volo.Abp.AuditLogging.AuditLog", null) + .WithMany("EntityChanges") + .HasForeignKey("AuditLogId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + }); + + modelBuilder.Entity("Volo.Abp.AuditLogging.EntityPropertyChange", b => + { + b.HasOne("Volo.Abp.AuditLogging.EntityChange", null) + .WithMany("PropertyChanges") + .HasForeignKey("EntityChangeId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + }); + + modelBuilder.Entity("Volo.Abp.Identity.IdentityRoleClaim", b => + { + b.HasOne("Volo.Abp.Identity.IdentityRole", null) + .WithMany("Claims") + .HasForeignKey("RoleId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + }); + + modelBuilder.Entity("Volo.Abp.Identity.IdentityUserClaim", b => + { + b.HasOne("Volo.Abp.Identity.IdentityUser", null) + .WithMany("Claims") + .HasForeignKey("UserId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + }); + + modelBuilder.Entity("Volo.Abp.Identity.IdentityUserLogin", b => + { + b.HasOne("Volo.Abp.Identity.IdentityUser", null) + .WithMany("Logins") + .HasForeignKey("UserId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + }); + + modelBuilder.Entity("Volo.Abp.Identity.IdentityUserOrganizationUnit", b => + { + b.HasOne("Volo.Abp.Identity.OrganizationUnit", null) + .WithMany() + .HasForeignKey("OrganizationUnitId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("Volo.Abp.Identity.IdentityUser", null) + .WithMany("OrganizationUnits") + .HasForeignKey("UserId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + }); + + modelBuilder.Entity("Volo.Abp.Identity.IdentityUserRole", b => + { + b.HasOne("Volo.Abp.Identity.IdentityRole", null) + .WithMany() + .HasForeignKey("RoleId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("Volo.Abp.Identity.IdentityUser", null) + .WithMany("Roles") + .HasForeignKey("UserId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + }); + + modelBuilder.Entity("Volo.Abp.Identity.IdentityUserToken", b => + { + b.HasOne("Volo.Abp.Identity.IdentityUser", null) + .WithMany("Tokens") + .HasForeignKey("UserId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + }); + + modelBuilder.Entity("Volo.Abp.Identity.OrganizationUnit", b => + { + b.HasOne("Volo.Abp.Identity.OrganizationUnit", null) + .WithMany() + .HasForeignKey("ParentId"); + }); + + modelBuilder.Entity("Volo.Abp.Identity.OrganizationUnitRole", b => + { + b.HasOne("Volo.Abp.Identity.OrganizationUnit", null) + .WithMany("Roles") + .HasForeignKey("OrganizationUnitId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("Volo.Abp.Identity.IdentityRole", null) + .WithMany() + .HasForeignKey("RoleId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + }); + + modelBuilder.Entity("Volo.Abp.TenantManagement.TenantConnectionString", b => + { + b.HasOne("Volo.Abp.TenantManagement.Tenant", null) + .WithMany("ConnectionStrings") + .HasForeignKey("TenantId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + }); + + modelBuilder.Entity("AppAny.Quartz.EntityFrameworkCore.Migrations.QuartzJobDetail", b => + { + b.Navigation("Triggers"); + }); + + modelBuilder.Entity("AppAny.Quartz.EntityFrameworkCore.Migrations.QuartzTrigger", b => + { + b.Navigation("BlobTriggers"); + + b.Navigation("CronTriggers"); + + b.Navigation("SimplePropertyTriggers"); + + b.Navigation("SimpleTriggers"); + }); + + modelBuilder.Entity("Unity.GrantManager.Locality.Sector", b => + { + b.Navigation("SubSectors"); + }); + + modelBuilder.Entity("Volo.Abp.AuditLogging.AuditLog", b => + { + b.Navigation("Actions"); + + b.Navigation("EntityChanges"); + }); + + modelBuilder.Entity("Volo.Abp.AuditLogging.EntityChange", b => + { + b.Navigation("PropertyChanges"); + }); + + modelBuilder.Entity("Volo.Abp.Identity.IdentityRole", b => + { + b.Navigation("Claims"); + }); + + modelBuilder.Entity("Volo.Abp.Identity.IdentityUser", b => + { + b.Navigation("Claims"); + + b.Navigation("Logins"); + + b.Navigation("OrganizationUnits"); + + b.Navigation("Roles"); + + b.Navigation("Tokens"); + }); + + modelBuilder.Entity("Volo.Abp.Identity.OrganizationUnit", b => + { + b.Navigation("Roles"); + }); + + modelBuilder.Entity("Volo.Abp.TenantManagement.Tenant", b => + { + b.Navigation("ConnectionStrings"); + }); +#pragma warning restore 612, 618 + } + } +} diff --git a/applications/Unity.GrantManager/src/Unity.GrantManager.EntityFrameworkCore/Migrations/HostMigrations/20260304172547_CommunitiesCustomScript.cs b/applications/Unity.GrantManager/src/Unity.GrantManager.EntityFrameworkCore/Migrations/HostMigrations/20260304172547_CommunitiesCustomScript.cs new file mode 100644 index 000000000..cd0e06b71 --- /dev/null +++ b/applications/Unity.GrantManager/src/Unity.GrantManager.EntityFrameworkCore/Migrations/HostMigrations/20260304172547_CommunitiesCustomScript.cs @@ -0,0 +1,32 @@ +using System; +using System.IO; +using System.Reflection; +using Microsoft.EntityFrameworkCore.Migrations; + +#nullable disable + +namespace Unity.GrantManager.Migrations.HostMigrations +{ + /// + public partial class CommunitiesCustomScript : Migration + { + /// + protected override void Up(MigrationBuilder migrationBuilder) + { + var assembly = Assembly.GetExecutingAssembly(); + var resourceName = "Unity.GrantManager.Scripts.unitydb-communities-script.sql"; + + using Stream stream = assembly.GetManifestResourceStream(resourceName) + ?? throw new InvalidOperationException($"Could not find embedded resource: {resourceName}"); + using StreamReader reader = new StreamReader(stream); + string sql = reader.ReadToEnd(); + migrationBuilder.Sql(sql); + } + + /// + protected override void Down(MigrationBuilder migrationBuilder) + { + + } + } +} diff --git a/applications/Unity.GrantManager/src/Unity.GrantManager.EntityFrameworkCore/Scripts/unitydb-communities-script.sql b/applications/Unity.GrantManager/src/Unity.GrantManager.EntityFrameworkCore/Scripts/unitydb-communities-script.sql new file mode 100644 index 000000000..c82ffd847 --- /dev/null +++ b/applications/Unity.GrantManager/src/Unity.GrantManager.EntityFrameworkCore/Scripts/unitydb-communities-script.sql @@ -0,0 +1,21 @@ + +DO $$ +DECLARE + json_data jsonb := '[{"Name" : "Becher Bay 1", "Type" : "", "RegionalDistrictCode" : "1"}, {"Name" : "Central Saanich", "Type" : "", "RegionalDistrictCode" : "1"}, {"Name" : "Cole Bay 3", "Type" : "", "RegionalDistrictCode" : "1"}, {"Name" : "Colwood", "Type" : "", "RegionalDistrictCode" : "1"}, {"Name" : "East Saanich 2", "Type" : "", "RegionalDistrictCode" : "1"}, {"Name" : "Esquimalt", "Type" : "", "RegionalDistrictCode" : "1"}, {"Name" : "Esquimalt", "Type" : "", "RegionalDistrictCode" : "1"}, {"Name" : "Galiano Island 9", "Type" : "", "RegionalDistrictCode" : "1"}, {"Name" : "Gordon River 2", "Type" : "", "RegionalDistrictCode" : "1"}, {"Name" : "Highlands", "Type" : "", "RegionalDistrictCode" : "1"}, {"Name" : "Juan de Fuca (Part 1)", "Type" : "", "RegionalDistrictCode" : "1"}, {"Name" : "Juan de Fuca (Part 2)", "Type" : "", "RegionalDistrictCode" : "1"}, {"Name" : "Langford", "Type" : "", "RegionalDistrictCode" : "1"}, {"Name" : "Metchosin", "Type" : "", "RegionalDistrictCode" : "1"}, {"Name" : "New Songhees 1A", "Type" : "", "RegionalDistrictCode" : "1"}, {"Name" : "North Saanich", "Type" : "", "RegionalDistrictCode" : "1"}, {"Name" : "Oak Bay", "Type" : "", "RegionalDistrictCode" : "1"}, {"Name" : "Saanich", "Type" : "", "RegionalDistrictCode" : "1"}, {"Name" : "Saltspring Island", "Type" : "", "RegionalDistrictCode" : "1"}, {"Name" : "Sidney", "Type" : "", "RegionalDistrictCode" : "1"}, {"Name" : "Sooke", "Type" : "", "RegionalDistrictCode" : "1"}, {"Name" : "Southern Gulf Islands", "Type" : "", "RegionalDistrictCode" : "1"}, {"Name" : "South Saanich 1", "Type" : "", "RegionalDistrictCode" : "1"}, {"Name" : "T''Sou-ke", "Type" : "", "RegionalDistrictCode" : "1"}, {"Name" : "Union Bay 4", "Type" : "", "RegionalDistrictCode" : "1"}, {"Name" : "Victoria", "Type" : "", "RegionalDistrictCode" : "1"}, {"Name" : "View Royal", "Type" : "", "RegionalDistrictCode" : "1"}, {"Name" : "Abbotsford", "Type" : "", "RegionalDistrictCode" : "10"}, {"Name" : "Aitchelitch 9", "Type" : "", "RegionalDistrictCode" : "10"}, {"Name" : "Albert Flat 5", "Type" : "", "RegionalDistrictCode" : "10"}, {"Name" : "Boothrouyd 5B", "Type" : "", "RegionalDistrictCode" : "10"}, {"Name" : "Boothroyd 13", "Type" : "", "RegionalDistrictCode" : "10"}, {"Name" : "Boston Bar 1A", "Type" : "", "RegionalDistrictCode" : "10"}, {"Name" : "Bucktum 4", "Type" : "", "RegionalDistrictCode" : "10"}, {"Name" : "Chawathil 4", "Type" : "", "RegionalDistrictCode" : "10"}, {"Name" : "Cheam 1", "Type" : "", "RegionalDistrictCode" : "10"}, {"Name" : "Chehalis 5", "Type" : "", "RegionalDistrictCode" : "10"}, {"Name" : "Chilliwack", "Type" : "", "RegionalDistrictCode" : "10"}, {"Name" : "Coqualeetza", "Type" : "", "RegionalDistrictCode" : "10"}, {"Name" : "Douglas 8", "Type" : "", "RegionalDistrictCode" : "10"}, {"Name" : "Fraser Valley A", "Type" : "", "RegionalDistrictCode" : "10"}, {"Name" : "Fraser Valley B", "Type" : "", "RegionalDistrictCode" : "10"}, {"Name" : "Fraser Valley C", "Type" : "", "RegionalDistrictCode" : "10"}, {"Name" : "Fraser Valley D", "Type" : "", "RegionalDistrictCode" : "10"}, {"Name" : "Fraser Valley E", "Type" : "", "RegionalDistrictCode" : "10"}, {"Name" : "Fraser Valley F", "Type" : "", "RegionalDistrictCode" : "10"}, {"Name" : "Fraser Valley G", "Type" : "", "RegionalDistrictCode" : "10"}, {"Name" : "Fraser Valley H", "Type" : "", "RegionalDistrictCode" : "10"}, {"Name" : "Harrison Hot Springs", "Type" : "", "RegionalDistrictCode" : "10"}, {"Name" : "Holachten 8", "Type" : "", "RegionalDistrictCode" : "10"}, {"Name" : "Hope", "Type" : "", "RegionalDistrictCode" : "10"}, {"Name" : "Inkahtsaph 6", "Type" : "", "RegionalDistrictCode" : "10"}, {"Name" : "Kahmoose 4", "Type" : "", "RegionalDistrictCode" : "10"}, {"Name" : "Kent", "Type" : "", "RegionalDistrictCode" : "10"}, {"Name" : "Kopchitchin 2", "Type" : "", "RegionalDistrictCode" : "10"}, {"Name" : "Kwawkwawapilt 6", "Type" : "", "RegionalDistrictCode" : "10"}, {"Name" : "Lakahahmen 11", "Type" : "", "RegionalDistrictCode" : "10"}, {"Name" : "Langley 2", "Type" : "", "RegionalDistrictCode" : "10"}, {"Name" : "Lukseetsissum 9", "Type" : "", "RegionalDistrictCode" : "10"}, {"Name" : "Matsqui Main 2", "Type" : "", "RegionalDistrictCode" : "10"}, {"Name" : "Mission", "Type" : "", "RegionalDistrictCode" : "10"}, {"Name" : "Ohamil 1", "Type" : "", "RegionalDistrictCode" : "10"}, {"Name" : "Paqulh", "Type" : "", "RegionalDistrictCode" : "10"}, {"Name" : "Peters 1", "Type" : "", "RegionalDistrictCode" : "10"}, {"Name" : "Popkum 1", "Type" : "", "RegionalDistrictCode" : "10"}, {"Name" : "Puckatholetchin 11", "Type" : "", "RegionalDistrictCode" : "10"}, {"Name" : "Q''alatkú7em", "Type" : "", "RegionalDistrictCode" : "10"}, {"Name" : "Ruby Creek 2", "Type" : "", "RegionalDistrictCode" : "10"}, {"Name" : "Sachteen", "Type" : "", "RegionalDistrictCode" : "10"}, {"Name" : "Saddle Rock 9", "Type" : "", "RegionalDistrictCode" : "10"}, {"Name" : "Schelowat 1", "Type" : "", "RegionalDistrictCode" : "10"}, {"Name" : "Schkam 2", "Type" : "", "RegionalDistrictCode" : "10"}, {"Name" : "Scowlitz 1", "Type" : "", "RegionalDistrictCode" : "10"}, {"Name" : "Seabird Island", "Type" : "", "RegionalDistrictCode" : "10"}, {"Name" : "Skawahlook 1", "Type" : "", "RegionalDistrictCode" : "10"}, {"Name" : "Skookumchuck 4", "Type" : "", "RegionalDistrictCode" : "10"}, {"Name" : "Skookumchuck 4A", "Type" : "", "RegionalDistrictCode" : "10"}, {"Name" : "Skowkale", "Type" : "", "RegionalDistrictCode" : "10"}, {"Name" : "Skwah 4", "Type" : "", "RegionalDistrictCode" : "10"}, {"Name" : "Skwali 3", "Type" : "", "RegionalDistrictCode" : "10"}, {"Name" : "Skway 5", "Type" : "", "RegionalDistrictCode" : "10"}, {"Name" : "Skweahm 10", "Type" : "", "RegionalDistrictCode" : "10"}, {"Name" : "Soowahlie 14", "Type" : "", "RegionalDistrictCode" : "10"}, {"Name" : "Speyum 3", "Type" : "", "RegionalDistrictCode" : "10"}, {"Name" : "Spuzzum 1", "Type" : "", "RegionalDistrictCode" : "10"}, {"Name" : "Squawkum Creek 3", "Type" : "", "RegionalDistrictCode" : "10"}, {"Name" : "Squiaala", "Type" : "", "RegionalDistrictCode" : "10"}, {"Name" : "Stullawheets 8", "Type" : "", "RegionalDistrictCode" : "10"}, {"Name" : "Tipella 7", "Type" : "", "RegionalDistrictCode" : "10"}, {"Name" : "Tseatah 2", "Type" : "", "RegionalDistrictCode" : "10"}, {"Name" : "Tuckkwiowhum 1", "Type" : "", "RegionalDistrictCode" : "10"}, {"Name" : "Tzeachten 13", "Type" : "", "RegionalDistrictCode" : "10"}, {"Name" : "Upper Sumas 6", "Type" : "", "RegionalDistrictCode" : "10"}, {"Name" : "Yakweakwioose 12", "Type" : "", "RegionalDistrictCode" : "10"}, {"Name" : "Yale Town 1", "Type" : "", "RegionalDistrictCode" : "10"}, {"Name" : "Anmore", "Type" : "", "RegionalDistrictCode" : "11"}, {"Name" : "Barnston Island 3", "Type" : "", "RegionalDistrictCode" : "11"}, {"Name" : "Belcarra", "Type" : "", "RegionalDistrictCode" : "11"}, {"Name" : "Bowen Island", "Type" : "", "RegionalDistrictCode" : "11"}, {"Name" : "Burnaby", "Type" : "", "RegionalDistrictCode" : "11"}, {"Name" : "Burrard Inlet 3", "Type" : "", "RegionalDistrictCode" : "11"}, {"Name" : "Capilano 5", "Type" : "", "RegionalDistrictCode" : "11"}, {"Name" : "Coquitlam", "Type" : "", "RegionalDistrictCode" : "11"}, {"Name" : "Coquitlam 1", "Type" : "", "RegionalDistrictCode" : "11"}, {"Name" : "Coquitlam 2", "Type" : "", "RegionalDistrictCode" : "11"}, {"Name" : "Delta", "Type" : "", "RegionalDistrictCode" : "11"}, {"Name" : "Katzie 1", "Type" : "", "RegionalDistrictCode" : "11"}, {"Name" : "Katzie 2", "Type" : "", "RegionalDistrictCode" : "11"}, {"Name" : "Kitsilano 6", "Type" : "", "RegionalDistrictCode" : "11"}, {"Name" : "Langley", "Type" : "", "RegionalDistrictCode" : "11"}, {"Name" : "Langley", "Type" : "", "RegionalDistrictCode" : "11"}, {"Name" : "Lions Bay", "Type" : "", "RegionalDistrictCode" : "11"}, {"Name" : "Maple Ridge", "Type" : "", "RegionalDistrictCode" : "11"}, {"Name" : "Matsqui 4", "Type" : "", "RegionalDistrictCode" : "11"}, {"Name" : "McMillan Island 6", "Type" : "", "RegionalDistrictCode" : "11"}, {"Name" : "Metro Vancouver A", "Type" : "", "RegionalDistrictCode" : "11"}, {"Name" : "Mission 1", "Type" : "", "RegionalDistrictCode" : "11"}, {"Name" : "Musqueam 2", "Type" : "", "RegionalDistrictCode" : "11"}, {"Name" : "Musqueam 4", "Type" : "", "RegionalDistrictCode" : "11"}, {"Name" : "New Westminster", "Type" : "", "RegionalDistrictCode" : "11"}, {"Name" : "North Vancouver", "Type" : "", "RegionalDistrictCode" : "11"}, {"Name" : "North Vancouver", "Type" : "", "RegionalDistrictCode" : "11"}, {"Name" : "Pitt Meadows", "Type" : "", "RegionalDistrictCode" : "11"}, {"Name" : "Port Coquitlam", "Type" : "", "RegionalDistrictCode" : "11"}, {"Name" : "Port Moody", "Type" : "", "RegionalDistrictCode" : "11"}, {"Name" : "Richmond", "Type" : "", "RegionalDistrictCode" : "11"}, {"Name" : "Semiahmoo", "Type" : "", "RegionalDistrictCode" : "11"}, {"Name" : "Seymour Creek 2", "Type" : "", "RegionalDistrictCode" : "11"}, {"Name" : "Surrey", "Type" : "", "RegionalDistrictCode" : "11"}, {"Name" : "Tsawwassen", "Type" : "", "RegionalDistrictCode" : "11"}, {"Name" : "Vancouver", "Type" : "", "RegionalDistrictCode" : "11"}, {"Name" : "West Vancouver", "Type" : "", "RegionalDistrictCode" : "11"}, {"Name" : "White Rock", "Type" : "", "RegionalDistrictCode" : "11"}, {"Name" : "Whonnock 1", "Type" : "", "RegionalDistrictCode" : "11"}, {"Name" : "Chekwelp 26", "Type" : "", "RegionalDistrictCode" : "12"}, {"Name" : "Gibsons", "Type" : "", "RegionalDistrictCode" : "12"}, {"Name" : "Sechelt", "Type" : "", "RegionalDistrictCode" : "12"}, {"Name" : "Sechelt (Part)", "Type" : "", "RegionalDistrictCode" : "12"}, {"Name" : "Sunshine Coast A", "Type" : "", "RegionalDistrictCode" : "12"}, {"Name" : "Sunshine Coast B", "Type" : "", "RegionalDistrictCode" : "12"}, {"Name" : "Sunshine Coast D", "Type" : "", "RegionalDistrictCode" : "12"}, {"Name" : "Sunshine Coast E", "Type" : "", "RegionalDistrictCode" : "12"}, {"Name" : "Sunshine Coast F", "Type" : "", "RegionalDistrictCode" : "12"}, {"Name" : "Bridge River 1", "Type" : "", "RegionalDistrictCode" : "13"}, {"Name" : "Cayoosh Creek 1", "Type" : "", "RegionalDistrictCode" : "13"}, {"Name" : "Cheakamus 11", "Type" : "", "RegionalDistrictCode" : "13"}, {"Name" : "Chilhil 6", "Type" : "", "RegionalDistrictCode" : "13"}, {"Name" : "Fountain 1", "Type" : "", "RegionalDistrictCode" : "13"}, {"Name" : "Fountain 10", "Type" : "", "RegionalDistrictCode" : "13"}, {"Name" : "Fountain 11", "Type" : "", "RegionalDistrictCode" : "13"}, {"Name" : "Fountain 12", "Type" : "", "RegionalDistrictCode" : "13"}, {"Name" : "Fountain 1B", "Type" : "", "RegionalDistrictCode" : "13"}, {"Name" : "Fountain 1D", "Type" : "", "RegionalDistrictCode" : "13"}, {"Name" : "Fountain 3", "Type" : "", "RegionalDistrictCode" : "13"}, {"Name" : "Fountain 3A", "Type" : "", "RegionalDistrictCode" : "13"}, {"Name" : "Fountain Creek 8", "Type" : "", "RegionalDistrictCode" : "13"}, {"Name" : "Kowtain 17", "Type" : "", "RegionalDistrictCode" : "13"}, {"Name" : "Lillooet", "Type" : "", "RegionalDistrictCode" : "13"}, {"Name" : "Lillooet 1", "Type" : "", "RegionalDistrictCode" : "13"}, {"Name" : "McCartney''s Flat 4", "Type" : "", "RegionalDistrictCode" : "13"}, {"Name" : "Mission 5", "Type" : "", "RegionalDistrictCode" : "13"}, {"Name" : "Mount Currie", "Type" : "", "RegionalDistrictCode" : "13"}, {"Name" : "Necait 6", "Type" : "", "RegionalDistrictCode" : "13"}, {"Name" : "Nequatque", "Type" : "", "RegionalDistrictCode" : "13"}, {"Name" : "Nesikep 6", "Type" : "", "RegionalDistrictCode" : "13"}, {"Name" : "Nesuch 3", "Type" : "", "RegionalDistrictCode" : "13"}, {"Name" : "Pashilqua 2", "Type" : "", "RegionalDistrictCode" : "13"}, {"Name" : "Pavilion 1", "Type" : "", "RegionalDistrictCode" : "13"}, {"Name" : "Pemberton", "Type" : "", "RegionalDistrictCode" : "13"}, {"Name" : "Seaichem 16", "Type" : "", "RegionalDistrictCode" : "13"}, {"Name" : "Seton Lake 5", "Type" : "", "RegionalDistrictCode" : "13"}, {"Name" : "Slosh 1", "Type" : "", "RegionalDistrictCode" : "13"}, {"Name" : "Squamish", "Type" : "", "RegionalDistrictCode" : "13"}, {"Name" : "Squamish-Lillooet A", "Type" : "", "RegionalDistrictCode" : "13"}, {"Name" : "Squamish-Lillooet B", "Type" : "", "RegionalDistrictCode" : "13"}, {"Name" : "Squamish-Lillooet C", "Type" : "", "RegionalDistrictCode" : "13"}, {"Name" : "Squamish-Lillooet D", "Type" : "", "RegionalDistrictCode" : "13"}, {"Name" : "Stawamus 24", "Type" : "", "RegionalDistrictCode" : "13"}, {"Name" : "Towinock 2", "Type" : "", "RegionalDistrictCode" : "13"}, {"Name" : "Waiwakum 14", "Type" : "", "RegionalDistrictCode" : "13"}, {"Name" : "Whistler", "Type" : "", "RegionalDistrictCode" : "13"}, {"Name" : "Whitecap 1", "Type" : "", "RegionalDistrictCode" : "13"}, {"Name" : "Yekwaupsum 18", "Type" : "", "RegionalDistrictCode" : "13"}, {"Name" : "Alexis 9", "Type" : "", "RegionalDistrictCode" : "14"}, {"Name" : "Ashnola 10", "Type" : "", "RegionalDistrictCode" : "14"}, {"Name" : "Blind Creek 6", "Type" : "", "RegionalDistrictCode" : "14"}, {"Name" : "Chopaka 7 & 8", "Type" : "", "RegionalDistrictCode" : "14"}, {"Name" : "Chuchuwayha 2", "Type" : "", "RegionalDistrictCode" : "14"}, {"Name" : "Keremeos", "Type" : "", "RegionalDistrictCode" : "14"}, {"Name" : "Lower Similkameen 2", "Type" : "", "RegionalDistrictCode" : "14"}, {"Name" : "Lulu 5", "Type" : "", "RegionalDistrictCode" : "14"}, {"Name" : "Okanagan-Similkameen A", "Type" : "", "RegionalDistrictCode" : "14"}, {"Name" : "Okanagan-Similkameen B", "Type" : "", "RegionalDistrictCode" : "14"}, {"Name" : "Okanagan-Similkameen C", "Type" : "", "RegionalDistrictCode" : "14"}, {"Name" : "Okanagan-Similkameen D", "Type" : "", "RegionalDistrictCode" : "14"}, {"Name" : "Okanagan-Similkameen E", "Type" : "", "RegionalDistrictCode" : "14"}, {"Name" : "Okanagan-Similkameen F", "Type" : "", "RegionalDistrictCode" : "14"}, {"Name" : "Okanagan-Similkameen G", "Type" : "", "RegionalDistrictCode" : "14"}, {"Name" : "Okanagan-Similkameen H", "Type" : "", "RegionalDistrictCode" : "14"}, {"Name" : "Okanagan-Similkameen I", "Type" : "", "RegionalDistrictCode" : "14"}, {"Name" : "Oliver", "Type" : "", "RegionalDistrictCode" : "14"}, {"Name" : "Osoyoos", "Type" : "", "RegionalDistrictCode" : "14"}, {"Name" : "Osoyoos 1", "Type" : "", "RegionalDistrictCode" : "14"}, {"Name" : "Penticton", "Type" : "", "RegionalDistrictCode" : "14"}, {"Name" : "Penticton 1", "Type" : "", "RegionalDistrictCode" : "14"}, {"Name" : "Princeton", "Type" : "", "RegionalDistrictCode" : "14"}, {"Name" : "Summerland", "Type" : "", "RegionalDistrictCode" : "14"}, {"Name" : "105 Mile Post 2", "Type" : "", "RegionalDistrictCode" : "15"}, {"Name" : "Ashcroft", "Type" : "", "RegionalDistrictCode" : "15"}, {"Name" : "Ashcroft 4", "Type" : "", "RegionalDistrictCode" : "15"}, {"Name" : "Barriere", "Type" : "", "RegionalDistrictCode" : "15"}, {"Name" : "Basque 18", "Type" : "", "RegionalDistrictCode" : "15"}, {"Name" : "Bonaparte 3", "Type" : "", "RegionalDistrictCode" : "15"}, {"Name" : "Boothroyd 8A", "Type" : "", "RegionalDistrictCode" : "15"}, {"Name" : "Cache Creek", "Type" : "", "RegionalDistrictCode" : "15"}, {"Name" : "Canoe Creek 1", "Type" : "", "RegionalDistrictCode" : "15"}, {"Name" : "Canoe Creek 2", "Type" : "", "RegionalDistrictCode" : "15"}, {"Name" : "Chase", "Type" : "", "RegionalDistrictCode" : "15"}, {"Name" : "Chuchhraischin", "Type" : "", "RegionalDistrictCode" : "15"}, {"Name" : "Clearwater", "Type" : "", "RegionalDistrictCode" : "15"}, {"Name" : "Clinton", "Type" : "", "RegionalDistrictCode" : "15"}, {"Name" : "Coldwater 1", "Type" : "", "RegionalDistrictCode" : "15"}, {"Name" : "Douglas Lake 3", "Type" : "", "RegionalDistrictCode" : "15"}, {"Name" : "Entlqwekkinh 19", "Type" : "", "RegionalDistrictCode" : "15"}, {"Name" : "Halhalaeden", "Type" : "", "RegionalDistrictCode" : "15"}, {"Name" : "Hamilton Creek 2", "Type" : "", "RegionalDistrictCode" : "15"}, {"Name" : "High Bar 1", "Type" : "", "RegionalDistrictCode" : "15"}, {"Name" : "Inkluckcheen", "Type" : "", "RegionalDistrictCode" : "15"}, {"Name" : "Inklyuhkinatko 2", "Type" : "", "RegionalDistrictCode" : "15"}, {"Name" : "Joeyaska 2", "Type" : "", "RegionalDistrictCode" : "15"}, {"Name" : "Kamloops", "Type" : "", "RegionalDistrictCode" : "15"}, {"Name" : "Kamloops 1", "Type" : "", "RegionalDistrictCode" : "15"}, {"Name" : "Kanaka Bar", "Type" : "", "RegionalDistrictCode" : "15"}, {"Name" : "Kitzowit 20", "Type" : "", "RegionalDistrictCode" : "15"}, {"Name" : "Klahkamich 17", "Type" : "", "RegionalDistrictCode" : "15"}, {"Name" : "Kleetlekut 22", "Type" : "", "RegionalDistrictCode" : "15"}, {"Name" : "Klickkumcheen 18", "Type" : "", "RegionalDistrictCode" : "15"}, {"Name" : "Kloklowuck 7", "Type" : "", "RegionalDistrictCode" : "15"}, {"Name" : "Kumcheen 1", "Type" : "", "RegionalDistrictCode" : "15"}, {"Name" : "Logan Lake", "Type" : "", "RegionalDistrictCode" : "15"}, {"Name" : "Louis Creek 4", "Type" : "", "RegionalDistrictCode" : "15"}, {"Name" : "Lower Hat Creek 2", "Type" : "", "RegionalDistrictCode" : "15"}, {"Name" : "Lytton", "Type" : "", "RegionalDistrictCode" : "15"}, {"Name" : "Lytton 4A", "Type" : "", "RegionalDistrictCode" : "15"}, {"Name" : "Lytton 4E", "Type" : "", "RegionalDistrictCode" : "15"}, {"Name" : "Lytton 9A", "Type" : "", "RegionalDistrictCode" : "15"}, {"Name" : "Lytton 9B", "Type" : "", "RegionalDistrictCode" : "15"}, {"Name" : "Marble Canyon 3", "Type" : "", "RegionalDistrictCode" : "15"}, {"Name" : "Merritt", "Type" : "", "RegionalDistrictCode" : "15"}, {"Name" : "Nekalliston 2", "Type" : "", "RegionalDistrictCode" : "15"}, {"Name" : "Nekliptum 1", "Type" : "", "RegionalDistrictCode" : "15"}, {"Name" : "Neskonlith", "Type" : "", "RegionalDistrictCode" : "15"}, {"Name" : "Nickel Palm 4", "Type" : "", "RegionalDistrictCode" : "15"}, {"Name" : "Nickeyeah 25", "Type" : "", "RegionalDistrictCode" : "15"}, {"Name" : "Nicola Lake 1", "Type" : "", "RegionalDistrictCode" : "15"}, {"Name" : "Nicola Mameet 1", "Type" : "", "RegionalDistrictCode" : "15"}, {"Name" : "Nicomen 1", "Type" : "", "RegionalDistrictCode" : "15"}, {"Name" : "Nkaih 10", "Type" : "", "RegionalDistrictCode" : "15"}, {"Name" : "Nohomeen 23", "Type" : "", "RegionalDistrictCode" : "15"}, {"Name" : "Nooaitch 10", "Type" : "", "RegionalDistrictCode" : "15"}, {"Name" : "North Thompson 1", "Type" : "", "RegionalDistrictCode" : "15"}, {"Name" : "Nuuautin 2", "Type" : "", "RegionalDistrictCode" : "15"}, {"Name" : "Oregon Jack Creek 5", "Type" : "", "RegionalDistrictCode" : "15"}, {"Name" : "Papyum 27", "Type" : "", "RegionalDistrictCode" : "15"}, {"Name" : "Paska Island 3", "Type" : "", "RegionalDistrictCode" : "15"}, {"Name" : "Paul''s Basin 2", "Type" : "", "RegionalDistrictCode" : "15"}, {"Name" : "Pemynoos 9", "Type" : "", "RegionalDistrictCode" : "15"}, {"Name" : "Peq-Paq 22", "Type" : "", "RegionalDistrictCode" : "15"}, {"Name" : "Sahhaltkum 4", "Type" : "", "RegionalDistrictCode" : "15"}, {"Name" : "Seah 5", "Type" : "", "RegionalDistrictCode" : "15"}, {"Name" : "Shackan 11", "Type" : "", "RegionalDistrictCode" : "15"}, {"Name" : "Shawniken 4B", "Type" : "", "RegionalDistrictCode" : "15"}, {"Name" : "Siska Flat", "Type" : "", "RegionalDistrictCode" : "15"}, {"Name" : "Siska Flat 5B", "Type" : "", "RegionalDistrictCode" : "15"}, {"Name" : "Skeetchestn", "Type" : "", "RegionalDistrictCode" : "15"}, {"Name" : "Skuppah 2A", "Type" : "", "RegionalDistrictCode" : "15"}, {"Name" : "Skuppah 4", "Type" : "", "RegionalDistrictCode" : "15"}, {"Name" : "Skwayaynope 26", "Type" : "", "RegionalDistrictCode" : "15"}, {"Name" : "Spences Bridge", "Type" : "", "RegionalDistrictCode" : "15"}, {"Name" : "Spintlum Flat 3", "Type" : "", "RegionalDistrictCode" : "15"}, {"Name" : "Squaam 2", "Type" : "", "RegionalDistrictCode" : "15"}, {"Name" : "Stequmwhulpa 5", "Type" : "", "RegionalDistrictCode" : "15"}, {"Name" : "Stryen 9", "Type" : "", "RegionalDistrictCode" : "15"}, {"Name" : "Sun Peaks Mountain", "Type" : "", "RegionalDistrictCode" : "15"}, {"Name" : "Thompson-Nicola A (Wells Gray Country)", "Type" : "", "RegionalDistrictCode" : "15"}, {"Name" : "Thompson-Nicola B (Thompson Headwaters)", "Type" : "", "RegionalDistrictCode" : "15"}, {"Name" : "Thompson-Nicola E (Bonaparte Plateau)", "Type" : "", "RegionalDistrictCode" : "15"}, {"Name" : "Thompson-Nicola I (Blue Sky Country)", "Type" : "", "RegionalDistrictCode" : "15"}, {"Name" : "Thompson-Nicola J (Copper Desert Country)", "Type" : "", "RegionalDistrictCode" : "15"}, {"Name" : "Thompson-Nicola L (Grasslands)", "Type" : "", "RegionalDistrictCode" : "15"}, {"Name" : "Thompson-Nicola M (Beautiful Nicola Valley - North)", "Type" : "", "RegionalDistrictCode" : "15"}, {"Name" : "Thompson-Nicola N (Beautiful Nicola Valley - South)", "Type" : "", "RegionalDistrictCode" : "15"}, {"Name" : "Thompson-Nicola O (Lower North Thompson)", "Type" : "", "RegionalDistrictCode" : "15"}, {"Name" : "Thompson-Nicola P (Rivers and the Peaks)", "Type" : "", "RegionalDistrictCode" : "15"}, {"Name" : "Toops 3", "Type" : "", "RegionalDistrictCode" : "15"}, {"Name" : "Tsaukan 12", "Type" : "", "RegionalDistrictCode" : "15"}, {"Name" : "Twoyqhalsht 16", "Type" : "", "RegionalDistrictCode" : "15"}, {"Name" : "Upper Hat Creek 1", "Type" : "", "RegionalDistrictCode" : "15"}, {"Name" : "Upper Nepa 6", "Type" : "", "RegionalDistrictCode" : "15"}, {"Name" : "Whispering Pines 4", "Type" : "", "RegionalDistrictCode" : "15"}, {"Name" : "Yawaucht 11", "Type" : "", "RegionalDistrictCode" : "15"}, {"Name" : "Zacht 5", "Type" : "", "RegionalDistrictCode" : "15"}, {"Name" : "Zoht 4", "Type" : "", "RegionalDistrictCode" : "15"}, {"Name" : "Central Okanagan", "Type" : "", "RegionalDistrictCode" : "16"}, {"Name" : "Central Okanagan West", "Type" : "", "RegionalDistrictCode" : "16"}, {"Name" : "Duck Lake 7", "Type" : "", "RegionalDistrictCode" : "16"}, {"Name" : "Kelowna", "Type" : "", "RegionalDistrictCode" : "16"}, {"Name" : "Lake Country", "Type" : "", "RegionalDistrictCode" : "16"}, {"Name" : "Peachland", "Type" : "", "RegionalDistrictCode" : "16"}, {"Name" : "Tsinstikeptum 10", "Type" : "", "RegionalDistrictCode" : "16"}, {"Name" : "Tsinstikeptum 9", "Type" : "", "RegionalDistrictCode" : "16"}, {"Name" : "West Kelowna", "Type" : "", "RegionalDistrictCode" : "16"}, {"Name" : "Armstrong", "Type" : "", "RegionalDistrictCode" : "17"}, {"Name" : "Coldstream", "Type" : "", "RegionalDistrictCode" : "17"}, {"Name" : "Enderby", "Type" : "", "RegionalDistrictCode" : "17"}, {"Name" : "Enderby 2", "Type" : "", "RegionalDistrictCode" : "17"}, {"Name" : "Harris 3", "Type" : "", "RegionalDistrictCode" : "17"}, {"Name" : "Lumby", "Type" : "", "RegionalDistrictCode" : "17"}, {"Name" : "North Okanagan B", "Type" : "", "RegionalDistrictCode" : "17"}, {"Name" : "North Okanagan C", "Type" : "", "RegionalDistrictCode" : "17"}, {"Name" : "North Okanagan D", "Type" : "", "RegionalDistrictCode" : "17"}, {"Name" : "North Okanagan E", "Type" : "", "RegionalDistrictCode" : "17"}, {"Name" : "North Okanagan F", "Type" : "", "RegionalDistrictCode" : "17"}, {"Name" : "Okanagan (Part) 1", "Type" : "", "RegionalDistrictCode" : "17"}, {"Name" : "Priest''s Valley 6", "Type" : "", "RegionalDistrictCode" : "17"}, {"Name" : "Spallumcheen", "Type" : "", "RegionalDistrictCode" : "17"}, {"Name" : "Vernon", "Type" : "", "RegionalDistrictCode" : "17"}, {"Name" : "Chum Creek 2", "Type" : "", "RegionalDistrictCode" : "18"}, {"Name" : "Columbia Shuswap A", "Type" : "", "RegionalDistrictCode" : "18"}, {"Name" : "Columbia Shuswap B", "Type" : "", "RegionalDistrictCode" : "18"}, {"Name" : "Columbia Shuswap C", "Type" : "", "RegionalDistrictCode" : "18"}, {"Name" : "Columbia Shuswap D", "Type" : "", "RegionalDistrictCode" : "18"}, {"Name" : "Columbia Shuswap E", "Type" : "", "RegionalDistrictCode" : "18"}, {"Name" : "Columbia Shuswap F", "Type" : "", "RegionalDistrictCode" : "18"}, {"Name" : "Columbia Shuswap G", "Type" : "", "RegionalDistrictCode" : "18"}, {"Name" : "Golden", "Type" : "", "RegionalDistrictCode" : "18"}, {"Name" : "Hustalen 1", "Type" : "", "RegionalDistrictCode" : "18"}, {"Name" : "North Bay 5", "Type" : "", "RegionalDistrictCode" : "18"}, {"Name" : "Okanagan (Part) 1", "Type" : "", "RegionalDistrictCode" : "18"}, {"Name" : "Quaaout 1", "Type" : "", "RegionalDistrictCode" : "18"}, {"Name" : "Revelstoke", "Type" : "", "RegionalDistrictCode" : "18"}, {"Name" : "Salmon Arm", "Type" : "", "RegionalDistrictCode" : "18"}, {"Name" : "Salmon River 1", "Type" : "", "RegionalDistrictCode" : "18"}, {"Name" : "Scotch Creek 4", "Type" : "", "RegionalDistrictCode" : "18"}, {"Name" : "Sicamous", "Type" : "", "RegionalDistrictCode" : "18"}, {"Name" : "Switsemalph", "Type" : "", "RegionalDistrictCode" : "18"}, {"Name" : "Switsemalph 3", "Type" : "", "RegionalDistrictCode" : "18"}, {"Name" : "Canal Flats", "Type" : "", "RegionalDistrictCode" : "19"}, {"Name" : "Cassimayooks (Mayook) 5", "Type" : "", "RegionalDistrictCode" : "19"}, {"Name" : "Columbia Lake 3", "Type" : "", "RegionalDistrictCode" : "19"}, {"Name" : "Cranbrook", "Type" : "", "RegionalDistrictCode" : "19"}, {"Name" : "East Kootenay A", "Type" : "", "RegionalDistrictCode" : "19"}, {"Name" : "East Kootenay B", "Type" : "", "RegionalDistrictCode" : "19"}, {"Name" : "East Kootenay C", "Type" : "", "RegionalDistrictCode" : "19"}, {"Name" : "East Kootenay E", "Type" : "", "RegionalDistrictCode" : "19"}, {"Name" : "East Kootenay F", "Type" : "", "RegionalDistrictCode" : "19"}, {"Name" : "East Kootenay G", "Type" : "", "RegionalDistrictCode" : "19"}, {"Name" : "Elkford", "Type" : "", "RegionalDistrictCode" : "19"}, {"Name" : "Fernie", "Type" : "", "RegionalDistrictCode" : "19"}, {"Name" : "Invermere", "Type" : "", "RegionalDistrictCode" : "19"}, {"Name" : "Isidore''s Ranch 4", "Type" : "", "RegionalDistrictCode" : "19"}, {"Name" : "Kimberley", "Type" : "", "RegionalDistrictCode" : "19"}, {"Name" : "Kootenay 1", "Type" : "", "RegionalDistrictCode" : "19"}, {"Name" : "Radium Hot Springs", "Type" : "", "RegionalDistrictCode" : "19"}, {"Name" : "Shuswap", "Type" : "", "RegionalDistrictCode" : "19"}, {"Name" : "Sparwood", "Type" : "", "RegionalDistrictCode" : "19"}, {"Name" : "St. Mary''s", "Type" : "", "RegionalDistrictCode" : "19"}, {"Name" : "Tobacco Plains 2", "Type" : "", "RegionalDistrictCode" : "19"}, {"Name" : "Chemainus 13", "Type" : "", "RegionalDistrictCode" : "2"}, {"Name" : "Cowichan", "Type" : "", "RegionalDistrictCode" : "2"}, {"Name" : "Cowichan Lake", "Type" : "", "RegionalDistrictCode" : "2"}, {"Name" : "Cowichan Valley A", "Type" : "", "RegionalDistrictCode" : "2"}, {"Name" : "Cowichan Valley B", "Type" : "", "RegionalDistrictCode" : "2"}, {"Name" : "Cowichan Valley C", "Type" : "", "RegionalDistrictCode" : "2"}, {"Name" : "Cowichan Valley D", "Type" : "", "RegionalDistrictCode" : "2"}, {"Name" : "Cowichan Valley E", "Type" : "", "RegionalDistrictCode" : "2"}, {"Name" : "Cowichan Valley F", "Type" : "", "RegionalDistrictCode" : "2"}, {"Name" : "Cowichan Valley G", "Type" : "", "RegionalDistrictCode" : "2"}, {"Name" : "Cowichan Valley H", "Type" : "", "RegionalDistrictCode" : "2"}, {"Name" : "Cowichan Valley I", "Type" : "", "RegionalDistrictCode" : "2"}, {"Name" : "Duncan", "Type" : "", "RegionalDistrictCode" : "2"}, {"Name" : "Est-Patrolas 4", "Type" : "", "RegionalDistrictCode" : "2"}, {"Name" : "Halalt 2", "Type" : "", "RegionalDistrictCode" : "2"}, {"Name" : "Kil-pah-las 3", "Type" : "", "RegionalDistrictCode" : "2"}, {"Name" : "Ladysmith", "Type" : "", "RegionalDistrictCode" : "2"}, {"Name" : "Lake Cowichan", "Type" : "", "RegionalDistrictCode" : "2"}, {"Name" : "Lyacksun 3", "Type" : "", "RegionalDistrictCode" : "2"}, {"Name" : "Malachan 11", "Type" : "", "RegionalDistrictCode" : "2"}, {"Name" : "Malahat 11", "Type" : "", "RegionalDistrictCode" : "2"}, {"Name" : "North Cowichan", "Type" : "", "RegionalDistrictCode" : "2"}, {"Name" : "Oyster Bay 12", "Type" : "", "RegionalDistrictCode" : "2"}, {"Name" : "Penelakut Island 7", "Type" : "", "RegionalDistrictCode" : "2"}, {"Name" : "Portier Pass 5", "Type" : "", "RegionalDistrictCode" : "2"}, {"Name" : "Shingle Point 4", "Type" : "", "RegionalDistrictCode" : "2"}, {"Name" : "Squaw-Hay-One 11", "Type" : "", "RegionalDistrictCode" : "2"}, {"Name" : "Theik 2", "Type" : "", "RegionalDistrictCode" : "2"}, {"Name" : "Tsussie 6", "Type" : "", "RegionalDistrictCode" : "2"}, {"Name" : "Tzart-Lam 5", "Type" : "", "RegionalDistrictCode" : "2"}, {"Name" : "Castlegar", "Type" : "", "RegionalDistrictCode" : "20"}, {"Name" : "Central Kootenay A", "Type" : "", "RegionalDistrictCode" : "20"}, {"Name" : "Central Kootenay B", "Type" : "", "RegionalDistrictCode" : "20"}, {"Name" : "Central Kootenay C", "Type" : "", "RegionalDistrictCode" : "20"}, {"Name" : "Central Kootenay D", "Type" : "", "RegionalDistrictCode" : "20"}, {"Name" : "Central Kootenay E", "Type" : "", "RegionalDistrictCode" : "20"}, {"Name" : "Central Kootenay F", "Type" : "", "RegionalDistrictCode" : "20"}, {"Name" : "Central Kootenay G", "Type" : "", "RegionalDistrictCode" : "20"}, {"Name" : "Central Kootenay H", "Type" : "", "RegionalDistrictCode" : "20"}, {"Name" : "Central Kootenay I", "Type" : "", "RegionalDistrictCode" : "20"}, {"Name" : "Central Kootenay J", "Type" : "", "RegionalDistrictCode" : "20"}, {"Name" : "Central Kootenay K", "Type" : "", "RegionalDistrictCode" : "20"}, {"Name" : "Creston", "Type" : "", "RegionalDistrictCode" : "20"}, {"Name" : "Creston 1", "Type" : "", "RegionalDistrictCode" : "20"}, {"Name" : "Kaslo", "Type" : "", "RegionalDistrictCode" : "20"}, {"Name" : "Lower Kootenay 1C", "Type" : "", "RegionalDistrictCode" : "20"}, {"Name" : "Lower Kootenay 5", "Type" : "", "RegionalDistrictCode" : "20"}, {"Name" : "Nakusp", "Type" : "", "RegionalDistrictCode" : "20"}, {"Name" : "Nelson", "Type" : "", "RegionalDistrictCode" : "20"}, {"Name" : "New Denver", "Type" : "", "RegionalDistrictCode" : "20"}, {"Name" : "Salmo", "Type" : "", "RegionalDistrictCode" : "20"}, {"Name" : "Silverton", "Type" : "", "RegionalDistrictCode" : "20"}, {"Name" : "Slocan", "Type" : "", "RegionalDistrictCode" : "20"}, {"Name" : "Fruitvale", "Type" : "", "RegionalDistrictCode" : "21"}, {"Name" : "Grand Forks", "Type" : "", "RegionalDistrictCode" : "21"}, {"Name" : "Greenwood", "Type" : "", "RegionalDistrictCode" : "21"}, {"Name" : "Kootenay Boundary A", "Type" : "", "RegionalDistrictCode" : "21"}, {"Name" : "Kootenay Boundary B / Lower Columbia-Old-Glory", "Type" : "", "RegionalDistrictCode" : "21"}, {"Name" : "Kootenay Boundary C / Christina Lake", "Type" : "", "RegionalDistrictCode" : "21"}, {"Name" : "Kootenay Boundary D / Rural Grand Forks", "Type" : "", "RegionalDistrictCode" : "21"}, {"Name" : "Kootenay Boundary E / West Boundary", "Type" : "", "RegionalDistrictCode" : "21"}, {"Name" : "Midway", "Type" : "", "RegionalDistrictCode" : "21"}, {"Name" : "Montrose", "Type" : "", "RegionalDistrictCode" : "21"}, {"Name" : "Rossland", "Type" : "", "RegionalDistrictCode" : "21"}, {"Name" : "Trail", "Type" : "", "RegionalDistrictCode" : "21"}, {"Name" : "Warfield", "Type" : "", "RegionalDistrictCode" : "21"}, {"Name" : "Agats Meadow 8", "Type" : "", "RegionalDistrictCode" : "22"}, {"Name" : "Alexandria", "Type" : "", "RegionalDistrictCode" : "22"}, {"Name" : "Alexis Creek 14", "Type" : "", "RegionalDistrictCode" : "22"}, {"Name" : "Alexis Creek 16", "Type" : "", "RegionalDistrictCode" : "22"}, {"Name" : "Alexis Creek 21", "Type" : "", "RegionalDistrictCode" : "22"}, {"Name" : "Alexis Creek 34", "Type" : "", "RegionalDistrictCode" : "22"}, {"Name" : "Alkali Lake 1", "Type" : "", "RegionalDistrictCode" : "22"}, {"Name" : "Alkali Lake 4A", "Type" : "", "RegionalDistrictCode" : "22"}, {"Name" : "Anahim''s Flat 1", "Type" : "", "RegionalDistrictCode" : "22"}, {"Name" : "Anahim''s Meadow", "Type" : "", "RegionalDistrictCode" : "22"}, {"Name" : "Baezaeko River 27", "Type" : "", "RegionalDistrictCode" : "22"}, {"Name" : "Baptiste Meadow 2", "Type" : "", "RegionalDistrictCode" : "22"}, {"Name" : "Betty Creek 18", "Type" : "", "RegionalDistrictCode" : "22"}, {"Name" : "Canim Lake 1", "Type" : "", "RegionalDistrictCode" : "22"}, {"Name" : "Canim Lake 2", "Type" : "", "RegionalDistrictCode" : "22"}, {"Name" : "Canim Lake 4", "Type" : "", "RegionalDistrictCode" : "22"}, {"Name" : "Canoe Creek 3", "Type" : "", "RegionalDistrictCode" : "22"}, {"Name" : "Cariboo A", "Type" : "", "RegionalDistrictCode" : "22"}, {"Name" : "Cariboo B", "Type" : "", "RegionalDistrictCode" : "22"}, {"Name" : "Cariboo C", "Type" : "", "RegionalDistrictCode" : "22"}, {"Name" : "Cariboo D", "Type" : "", "RegionalDistrictCode" : "22"}, {"Name" : "Cariboo E", "Type" : "", "RegionalDistrictCode" : "22"}, {"Name" : "Cariboo F", "Type" : "", "RegionalDistrictCode" : "22"}, {"Name" : "Cariboo G", "Type" : "", "RegionalDistrictCode" : "22"}, {"Name" : "Cariboo H", "Type" : "", "RegionalDistrictCode" : "22"}, {"Name" : "Cariboo I", "Type" : "", "RegionalDistrictCode" : "22"}, {"Name" : "Cariboo J", "Type" : "", "RegionalDistrictCode" : "22"}, {"Name" : "Cariboo K", "Type" : "", "RegionalDistrictCode" : "22"}, {"Name" : "Cariboo L", "Type" : "", "RegionalDistrictCode" : "22"}, {"Name" : "Charley Boy''s Meadow 3", "Type" : "", "RegionalDistrictCode" : "22"}, {"Name" : "Chilco Lake 1", "Type" : "", "RegionalDistrictCode" : "22"}, {"Name" : "Chilco Lake 1A", "Type" : "", "RegionalDistrictCode" : "22"}, {"Name" : "Coglistiko River 29", "Type" : "", "RegionalDistrictCode" : "22"}, {"Name" : "Deep Creek 2", "Type" : "", "RegionalDistrictCode" : "22"}, {"Name" : "Dog Creek 1", "Type" : "", "RegionalDistrictCode" : "22"}, {"Name" : "Dog Creek 2", "Type" : "", "RegionalDistrictCode" : "22"}, {"Name" : "Dragon Lake 3", "Type" : "", "RegionalDistrictCode" : "22"}, {"Name" : "Euchinico Creek 17", "Type" : "", "RegionalDistrictCode" : "22"}, {"Name" : "Fishtrap 19", "Type" : "", "RegionalDistrictCode" : "22"}, {"Name" : "Garden", "Type" : "", "RegionalDistrictCode" : "22"}, {"Name" : "Johny Sticks 2", "Type" : "", "RegionalDistrictCode" : "22"}, {"Name" : "Kluskus 1", "Type" : "", "RegionalDistrictCode" : "22"}, {"Name" : "Lezbye 6", "Type" : "", "RegionalDistrictCode" : "22"}, {"Name" : "Little Springs", "Type" : "", "RegionalDistrictCode" : "22"}, {"Name" : "Lohbiee 3", "Type" : "", "RegionalDistrictCode" : "22"}, {"Name" : "Michel Gardens 36", "Type" : "", "RegionalDistrictCode" : "22"}, {"Name" : "Nazco 20", "Type" : "", "RegionalDistrictCode" : "22"}, {"Name" : "One Hundred Mile House", "Type" : "", "RegionalDistrictCode" : "22"}, {"Name" : "Puntzi Lake 2", "Type" : "", "RegionalDistrictCode" : "22"}, {"Name" : "Quesnel", "Type" : "", "RegionalDistrictCode" : "22"}, {"Name" : "Quesnel 1", "Type" : "", "RegionalDistrictCode" : "22"}, {"Name" : "Redstone Flat 1", "Type" : "", "RegionalDistrictCode" : "22"}, {"Name" : "Redstone Flat 1A", "Type" : "", "RegionalDistrictCode" : "22"}, {"Name" : "Salmon River Meadow 7", "Type" : "", "RegionalDistrictCode" : "22"}, {"Name" : "Sandy Harry 4", "Type" : "", "RegionalDistrictCode" : "22"}, {"Name" : "Soda Creek 1", "Type" : "", "RegionalDistrictCode" : "22"}, {"Name" : "Squinas 2", "Type" : "", "RegionalDistrictCode" : "22"}, {"Name" : "Stone 1", "Type" : "", "RegionalDistrictCode" : "22"}, {"Name" : "Sundayman''s Meadow 3", "Type" : "", "RegionalDistrictCode" : "22"}, {"Name" : "Swan Lake 3", "Type" : "", "RegionalDistrictCode" : "22"}, {"Name" : "Tanakut 4", "Type" : "", "RegionalDistrictCode" : "22"}, {"Name" : "Thomas Squinas Ranch 2A", "Type" : "", "RegionalDistrictCode" : "22"}, {"Name" : "Toosey 1", "Type" : "", "RegionalDistrictCode" : "22"}, {"Name" : "Towdystan Lake 3", "Type" : "", "RegionalDistrictCode" : "22"}, {"Name" : "Trout Lake Alec 16", "Type" : "", "RegionalDistrictCode" : "22"}, {"Name" : "Ulkatcho 13", "Type" : "", "RegionalDistrictCode" : "22"}, {"Name" : "Ulkatcho 14A", "Type" : "", "RegionalDistrictCode" : "22"}, {"Name" : "Wells", "Type" : "", "RegionalDistrictCode" : "22"}, {"Name" : "Williams Lake", "Type" : "", "RegionalDistrictCode" : "22"}, {"Name" : "Williams Lake 1", "Type" : "", "RegionalDistrictCode" : "22"}, {"Name" : "Windy Mouth 7", "Type" : "", "RegionalDistrictCode" : "22"}, {"Name" : "Fort George 2", "Type" : "", "RegionalDistrictCode" : "23"}, {"Name" : "Fraser-Fort George A", "Type" : "", "RegionalDistrictCode" : "23"}, {"Name" : "Fraser-Fort George C", "Type" : "", "RegionalDistrictCode" : "23"}, {"Name" : "Fraser-Fort George D", "Type" : "", "RegionalDistrictCode" : "23"}, {"Name" : "Fraser-Fort George E", "Type" : "", "RegionalDistrictCode" : "23"}, {"Name" : "Fraser-Fort George F", "Type" : "", "RegionalDistrictCode" : "23"}, {"Name" : "Fraser-Fort George G", "Type" : "", "RegionalDistrictCode" : "23"}, {"Name" : "Fraser-Fort George H", "Type" : "", "RegionalDistrictCode" : "23"}, {"Name" : "Mackenzie", "Type" : "", "RegionalDistrictCode" : "23"}, {"Name" : "McBride", "Type" : "", "RegionalDistrictCode" : "23"}, {"Name" : "McCleod Lake 5", "Type" : "", "RegionalDistrictCode" : "23"}, {"Name" : "McLeod Lake 1", "Type" : "", "RegionalDistrictCode" : "23"}, {"Name" : "Prince George", "Type" : "", "RegionalDistrictCode" : "23"}, {"Name" : "Valemount", "Type" : "", "RegionalDistrictCode" : "23"}, {"Name" : "Daajing Giids", "Type" : "", "RegionalDistrictCode" : "24"}, {"Name" : "Dolphin Island 1", "Type" : "", "RegionalDistrictCode" : "24"}, {"Name" : "Kulkayu (Hartley Bay) 4", "Type" : "", "RegionalDistrictCode" : "24"}, {"Name" : "Kulkayu (Hartley Bay) 4A", "Type" : "", "RegionalDistrictCode" : "24"}, {"Name" : "Lax Kw''alaams 1", "Type" : "", "RegionalDistrictCode" : "24"}, {"Name" : "Masset", "Type" : "", "RegionalDistrictCode" : "24"}, {"Name" : "Masset 1", "Type" : "", "RegionalDistrictCode" : "24"}, {"Name" : "North Coast A", "Type" : "", "RegionalDistrictCode" : "24"}, {"Name" : "North Coast C", "Type" : "", "RegionalDistrictCode" : "24"}, {"Name" : "North Coast D", "Type" : "", "RegionalDistrictCode" : "24"}, {"Name" : "North Coast E", "Type" : "", "RegionalDistrictCode" : "24"}, {"Name" : "Port Clements", "Type" : "", "RegionalDistrictCode" : "24"}, {"Name" : "Port Edward", "Type" : "", "RegionalDistrictCode" : "24"}, {"Name" : "Prince Rupert", "Type" : "", "RegionalDistrictCode" : "24"}, {"Name" : "S1/2 Tsimpsean 2", "Type" : "", "RegionalDistrictCode" : "24"}, {"Name" : "Skidegate 1", "Type" : "", "RegionalDistrictCode" : "24"}, {"Name" : "Tlaa Gaa Aawtlaas 28", "Type" : "", "RegionalDistrictCode" : "24"}, {"Name" : "Anlaw 4", "Type" : "", "RegionalDistrictCode" : "25"}, {"Name" : "Babine 17", "Type" : "", "RegionalDistrictCode" : "25"}, {"Name" : "Bulkley River 19", "Type" : "", "RegionalDistrictCode" : "25"}, {"Name" : "Coryatsaqua (Moricetown) 2", "Type" : "", "RegionalDistrictCode" : "25"}, {"Name" : "Dease Lake 9", "Type" : "", "RegionalDistrictCode" : "25"}, {"Name" : "Gitanmaax 1", "Type" : "", "RegionalDistrictCode" : "25"}, {"Name" : "Gitanyow 1", "Type" : "", "RegionalDistrictCode" : "25"}, {"Name" : "Gitsegukla 1", "Type" : "", "RegionalDistrictCode" : "25"}, {"Name" : "Gitwangak 1", "Type" : "", "RegionalDistrictCode" : "25"}, {"Name" : "Guhthe Tah 12", "Type" : "", "RegionalDistrictCode" : "25"}, {"Name" : "Hagwilget 1", "Type" : "", "RegionalDistrictCode" : "25"}, {"Name" : "Hazelton", "Type" : "", "RegionalDistrictCode" : "25"}, {"Name" : "Iskut 6", "Type" : "", "RegionalDistrictCode" : "25"}, {"Name" : "Kispiox 1", "Type" : "", "RegionalDistrictCode" : "25"}, {"Name" : "Kitamaat 2", "Type" : "", "RegionalDistrictCode" : "25"}, {"Name" : "Kitasoo 1", "Type" : "", "RegionalDistrictCode" : "25"}, {"Name" : "Kitimat", "Type" : "", "RegionalDistrictCode" : "25"}, {"Name" : "Kitimat-Stikine A", "Type" : "", "RegionalDistrictCode" : "25"}, {"Name" : "Kitimat-Stikine B", "Type" : "", "RegionalDistrictCode" : "25"}, {"Name" : "Kitimat-Stikine C (Part 1)", "Type" : "", "RegionalDistrictCode" : "25"}, {"Name" : "Kitimat-Stikine C (Part 2)", "Type" : "", "RegionalDistrictCode" : "25"}, {"Name" : "Kitimat-Stikine D", "Type" : "", "RegionalDistrictCode" : "25"}, {"Name" : "Kitimat-Stikine E", "Type" : "", "RegionalDistrictCode" : "25"}, {"Name" : "Kitimat-Stikine F", "Type" : "", "RegionalDistrictCode" : "25"}, {"Name" : "Kitselas 1", "Type" : "", "RegionalDistrictCode" : "25"}, {"Name" : "Kitsumkaylum 1", "Type" : "", "RegionalDistrictCode" : "25"}, {"Name" : "Kshish 4", "Type" : "", "RegionalDistrictCode" : "25"}, {"Name" : "Kulspai 6", "Type" : "", "RegionalDistrictCode" : "25"}, {"Name" : "Moricetown 1", "Type" : "", "RegionalDistrictCode" : "25"}, {"Name" : "New Hazelton", "Type" : "", "RegionalDistrictCode" : "25"}, {"Name" : "Nisga''a", "Type" : "", "RegionalDistrictCode" : "25"}, {"Name" : "Sik-e-dakh 2", "Type" : "", "RegionalDistrictCode" : "25"}, {"Name" : "Stewart", "Type" : "", "RegionalDistrictCode" : "25"}, {"Name" : "Tahltan 1", "Type" : "", "RegionalDistrictCode" : "25"}, {"Name" : "Telegraph Creek", "Type" : "", "RegionalDistrictCode" : "25"}, {"Name" : "Terrace", "Type" : "", "RegionalDistrictCode" : "25"}, {"Name" : "Babine 16", "Type" : "", "RegionalDistrictCode" : "26"}, {"Name" : "Babine 25", "Type" : "", "RegionalDistrictCode" : "26"}, {"Name" : "Babine 6", "Type" : "", "RegionalDistrictCode" : "26"}, {"Name" : "Babine Lake 21B", "Type" : "", "RegionalDistrictCode" : "26"}, {"Name" : "Binche 2", "Type" : "", "RegionalDistrictCode" : "26"}, {"Name" : "Bulkley-Nechako A", "Type" : "", "RegionalDistrictCode" : "26"}, {"Name" : "Bulkley-Nechako B", "Type" : "", "RegionalDistrictCode" : "26"}, {"Name" : "Bulkley-Nechako C", "Type" : "", "RegionalDistrictCode" : "26"}, {"Name" : "Bulkley-Nechako D", "Type" : "", "RegionalDistrictCode" : "26"}, {"Name" : "Bulkley-Nechako E", "Type" : "", "RegionalDistrictCode" : "26"}, {"Name" : "Bulkley-Nechako F", "Type" : "", "RegionalDistrictCode" : "26"}, {"Name" : "Bulkley-Nechako G", "Type" : "", "RegionalDistrictCode" : "26"}, {"Name" : "Burns Lake", "Type" : "", "RegionalDistrictCode" : "26"}, {"Name" : "Burns Lake 18", "Type" : "", "RegionalDistrictCode" : "26"}, {"Name" : "Cheslatta 1", "Type" : "", "RegionalDistrictCode" : "26"}, {"Name" : "Duncan Lake 2", "Type" : "", "RegionalDistrictCode" : "26"}, {"Name" : "Dzitline Lee 9", "Type" : "", "RegionalDistrictCode" : "26"}, {"Name" : "Fort St. James", "Type" : "", "RegionalDistrictCode" : "26"}, {"Name" : "Francois Lake 7", "Type" : "", "RegionalDistrictCode" : "26"}, {"Name" : "Fraser Lake", "Type" : "", "RegionalDistrictCode" : "26"}, {"Name" : "Granisle", "Type" : "", "RegionalDistrictCode" : "26"}, {"Name" : "Houston", "Type" : "", "RegionalDistrictCode" : "26"}, {"Name" : "Jean Baptiste 28", "Type" : "", "RegionalDistrictCode" : "26"}, {"Name" : "Laketown 3", "Type" : "", "RegionalDistrictCode" : "26"}, {"Name" : "Mission Lands 17", "Type" : "", "RegionalDistrictCode" : "26"}, {"Name" : "Nak''azdli", "Type" : "", "RegionalDistrictCode" : "26"}, {"Name" : "Nautley (Fort Fraser) 1", "Type" : "", "RegionalDistrictCode" : "26"}, {"Name" : "Nedoats 11", "Type" : "", "RegionalDistrictCode" : "26"}, {"Name" : "Noonla 6", "Type" : "", "RegionalDistrictCode" : "26"}, {"Name" : "North Tacla Lake", "Type" : "", "RegionalDistrictCode" : "26"}, {"Name" : "Omineca 1", "Type" : "", "RegionalDistrictCode" : "26"}, {"Name" : "Palling 1", "Type" : "", "RegionalDistrictCode" : "26"}, {"Name" : "Poison Creek 17A", "Type" : "", "RegionalDistrictCode" : "26"}, {"Name" : "Seaspunkut 4", "Type" : "", "RegionalDistrictCode" : "26"}, {"Name" : "Skins Lake 16A", "Type" : "", "RegionalDistrictCode" : "26"}, {"Name" : "Skins Lake 16B", "Type" : "", "RegionalDistrictCode" : "26"}, {"Name" : "Smithers", "Type" : "", "RegionalDistrictCode" : "26"}, {"Name" : "Sowchea 3", "Type" : "", "RegionalDistrictCode" : "26"}, {"Name" : "Stellaquo (Stella) 1", "Type" : "", "RegionalDistrictCode" : "26"}, {"Name" : "Stony Creek 1", "Type" : "", "RegionalDistrictCode" : "26"}, {"Name" : "Tache 1", "Type" : "", "RegionalDistrictCode" : "26"}, {"Name" : "Tacla Lake (Ferry Landing) 9", "Type" : "", "RegionalDistrictCode" : "26"}, {"Name" : "Tadinlay 15", "Type" : "", "RegionalDistrictCode" : "26"}, {"Name" : "Tatla''t East 2", "Type" : "", "RegionalDistrictCode" : "26"}, {"Name" : "Tatla West 11", "Type" : "", "RegionalDistrictCode" : "26"}, {"Name" : "Telkwa", "Type" : "", "RegionalDistrictCode" : "26"}, {"Name" : "Uncha Lake 13A", "Type" : "", "RegionalDistrictCode" : "26"}, {"Name" : "Vanderhoof", "Type" : "", "RegionalDistrictCode" : "26"}, {"Name" : "Williams Prairie Meadow 1A", "Type" : "", "RegionalDistrictCode" : "26"}, {"Name" : "Woyenne 27", "Type" : "", "RegionalDistrictCode" : "26"}, {"Name" : "Ye Koo Che 3", "Type" : "", "RegionalDistrictCode" : "26"}, {"Name" : "Dease River 1", "Type" : "", "RegionalDistrictCode" : "27"}, {"Name" : "Five Mile Point 3", "Type" : "", "RegionalDistrictCode" : "27"}, {"Name" : "Good Hope Lake", "Type" : "", "RegionalDistrictCode" : "27"}, {"Name" : "Liard River 3", "Type" : "", "RegionalDistrictCode" : "27"}, {"Name" : "Lower Post", "Type" : "", "RegionalDistrictCode" : "27"}, {"Name" : "Stikine Region", "Type" : "", "RegionalDistrictCode" : "27"}, {"Name" : "Unnamed 10", "Type" : "", "RegionalDistrictCode" : "27"}, {"Name" : "Blueberry River 205", "Type" : "", "RegionalDistrictCode" : "28"}, {"Name" : "Chetwynd", "Type" : "", "RegionalDistrictCode" : "28"}, {"Name" : "Dawson Creek", "Type" : "", "RegionalDistrictCode" : "28"}, {"Name" : "Doig River 206", "Type" : "", "RegionalDistrictCode" : "28"}, {"Name" : "East Moberly Lake 169", "Type" : "", "RegionalDistrictCode" : "28"}, {"Name" : "Finlay River 6", "Type" : "", "RegionalDistrictCode" : "28"}, {"Name" : "Fort St. John", "Type" : "", "RegionalDistrictCode" : "28"}, {"Name" : "Fort Ware 1", "Type" : "", "RegionalDistrictCode" : "28"}, {"Name" : "Halfway River 168", "Type" : "", "RegionalDistrictCode" : "28"}, {"Name" : "Hudson''s Hope", "Type" : "", "RegionalDistrictCode" : "28"}, {"Name" : "Ingenika Point", "Type" : "", "RegionalDistrictCode" : "28"}, {"Name" : "Mesilinka 7", "Type" : "", "RegionalDistrictCode" : "28"}, {"Name" : "Peace River B", "Type" : "", "RegionalDistrictCode" : "28"}, {"Name" : "Peace River C", "Type" : "", "RegionalDistrictCode" : "28"}, {"Name" : "Peace River D", "Type" : "", "RegionalDistrictCode" : "28"}, {"Name" : "Peace River E", "Type" : "", "RegionalDistrictCode" : "28"}, {"Name" : "Pouce Coupe", "Type" : "", "RegionalDistrictCode" : "28"}, {"Name" : "Taylor", "Type" : "", "RegionalDistrictCode" : "28"}, {"Name" : "Tumbler Ridge", "Type" : "", "RegionalDistrictCode" : "28"}, {"Name" : "West Moberly Lake 168A", "Type" : "", "RegionalDistrictCode" : "28"}, {"Name" : "Wochiigii Nané?", "Type" : "", "RegionalDistrictCode" : "28"}, {"Name" : "Fontas 1", "Type" : "", "RegionalDistrictCode" : "29"}, {"Name" : "Fort Nelson 2", "Type" : "", "RegionalDistrictCode" : "29"}, {"Name" : "Kahntah 3", "Type" : "", "RegionalDistrictCode" : "29"}, {"Name" : "Northern Rockies", "Type" : "", "RegionalDistrictCode" : "29"}, {"Name" : "Prophet River 4", "Type" : "", "RegionalDistrictCode" : "29"}, {"Name" : "Lantzville", "Type" : "", "RegionalDistrictCode" : "3"}, {"Name" : "Nanaimo", "Type" : "", "RegionalDistrictCode" : "3"}, {"Name" : "Nanaimo A", "Type" : "", "RegionalDistrictCode" : "3"}, {"Name" : "Nanaimo B", "Type" : "", "RegionalDistrictCode" : "3"}, {"Name" : "Nanaimo C", "Type" : "", "RegionalDistrictCode" : "3"}, {"Name" : "Nanaimo E", "Type" : "", "RegionalDistrictCode" : "3"}, {"Name" : "Nanaimo F", "Type" : "", "RegionalDistrictCode" : "3"}, {"Name" : "Nanaimo G", "Type" : "", "RegionalDistrictCode" : "3"}, {"Name" : "Nanaimo H", "Type" : "", "RegionalDistrictCode" : "3"}, {"Name" : "Nanaimo River", "Type" : "", "RegionalDistrictCode" : "3"}, {"Name" : "Nanaimo Town 1", "Type" : "", "RegionalDistrictCode" : "3"}, {"Name" : "Nanoose", "Type" : "", "RegionalDistrictCode" : "3"}, {"Name" : "Parksville", "Type" : "", "RegionalDistrictCode" : "3"}, {"Name" : "Qualicum", "Type" : "", "RegionalDistrictCode" : "3"}, {"Name" : "Qualicum Beach", "Type" : "", "RegionalDistrictCode" : "3"}, {"Name" : "Ahahswinis 1", "Type" : "", "RegionalDistrictCode" : "4"}, {"Name" : "Alberni 2", "Type" : "", "RegionalDistrictCode" : "4"}, {"Name" : "Alberni-Clayoquot A", "Type" : "", "RegionalDistrictCode" : "4"}, {"Name" : "Alberni-Clayoquot B", "Type" : "", "RegionalDistrictCode" : "4"}, {"Name" : "Alberni-Clayoquot C", "Type" : "", "RegionalDistrictCode" : "4"}, {"Name" : "Alberni-Clayoquot D", "Type" : "", "RegionalDistrictCode" : "4"}, {"Name" : "Alberni-Clayoquot E", "Type" : "", "RegionalDistrictCode" : "4"}, {"Name" : "Alberni-Clayoquot F", "Type" : "", "RegionalDistrictCode" : "4"}, {"Name" : "Anacla 12", "Type" : "", "RegionalDistrictCode" : "4"}, {"Name" : "Clakamucus 2", "Type" : "", "RegionalDistrictCode" : "4"}, {"Name" : "Elhlateese 2", "Type" : "", "RegionalDistrictCode" : "4"}, {"Name" : "Esowista 3", "Type" : "", "RegionalDistrictCode" : "4"}, {"Name" : "Hesquiat 1", "Type" : "", "RegionalDistrictCode" : "4"}, {"Name" : "Ittatsoo 1", "Type" : "", "RegionalDistrictCode" : "4"}, {"Name" : "Klehkoot 2", "Type" : "", "RegionalDistrictCode" : "4"}, {"Name" : "Macoah 1", "Type" : "", "RegionalDistrictCode" : "4"}, {"Name" : "Marktosis 15", "Type" : "", "RegionalDistrictCode" : "4"}, {"Name" : "Numukamis 1", "Type" : "", "RegionalDistrictCode" : "4"}, {"Name" : "Opitsat 1", "Type" : "", "RegionalDistrictCode" : "4"}, {"Name" : "Port Alberni", "Type" : "", "RegionalDistrictCode" : "4"}, {"Name" : "Refuge Cove 6", "Type" : "", "RegionalDistrictCode" : "4"}, {"Name" : "Sachsa 4", "Type" : "", "RegionalDistrictCode" : "4"}, {"Name" : "Tin Wis 11", "Type" : "", "RegionalDistrictCode" : "4"}, {"Name" : "Tofino", "Type" : "", "RegionalDistrictCode" : "4"}, {"Name" : "Tsahaheh 1", "Type" : "", "RegionalDistrictCode" : "4"}, {"Name" : "Ucluelet", "Type" : "", "RegionalDistrictCode" : "4"}, {"Name" : "Ahaminaquus 12", "Type" : "", "RegionalDistrictCode" : "5"}, {"Name" : "Campbell River", "Type" : "", "RegionalDistrictCode" : "5"}, {"Name" : "Campbell River 11", "Type" : "", "RegionalDistrictCode" : "5"}, {"Name" : "Cape Mudge 10", "Type" : "", "RegionalDistrictCode" : "5"}, {"Name" : "Chenahkint 12", "Type" : "", "RegionalDistrictCode" : "5"}, {"Name" : "Ehatis 11", "Type" : "", "RegionalDistrictCode" : "5"}, {"Name" : "Gold River", "Type" : "", "RegionalDistrictCode" : "5"}, {"Name" : "Homalco 9", "Type" : "", "RegionalDistrictCode" : "5"}, {"Name" : "Houpsitas 6", "Type" : "", "RegionalDistrictCode" : "5"}, {"Name" : "Nenagwas 12", "Type" : "", "RegionalDistrictCode" : "5"}, {"Name" : "Oclucje 7", "Type" : "", "RegionalDistrictCode" : "5"}, {"Name" : "Quinsam 12", "Type" : "", "RegionalDistrictCode" : "5"}, {"Name" : "Sayward", "Type" : "", "RegionalDistrictCode" : "5"}, {"Name" : "Squirrel Cove 8", "Type" : "", "RegionalDistrictCode" : "5"}, {"Name" : "Strathcona A", "Type" : "", "RegionalDistrictCode" : "5"}, {"Name" : "Strathcona B", "Type" : "", "RegionalDistrictCode" : "5"}, {"Name" : "Strathcona C", "Type" : "", "RegionalDistrictCode" : "5"}, {"Name" : "Strathcona D (Oyster Bay - Buttle Lake)", "Type" : "", "RegionalDistrictCode" : "5"}, {"Name" : "Tahsis", "Type" : "", "RegionalDistrictCode" : "5"}, {"Name" : "Tork 7", "Type" : "", "RegionalDistrictCode" : "5"}, {"Name" : "Tsa Xana 18", "Type" : "", "RegionalDistrictCode" : "5"}, {"Name" : "Village Island 1", "Type" : "", "RegionalDistrictCode" : "5"}, {"Name" : "Yuquot 1", "Type" : "", "RegionalDistrictCode" : "5"}, {"Name" : "Zeballos", "Type" : "", "RegionalDistrictCode" : "5"}, {"Name" : "Comox", "Type" : "", "RegionalDistrictCode" : "6"}, {"Name" : "Comox 1", "Type" : "", "RegionalDistrictCode" : "6"}, {"Name" : "Comox Valley A", "Type" : "", "RegionalDistrictCode" : "6"}, {"Name" : "Comox Valley B (Lazo North)", "Type" : "", "RegionalDistrictCode" : "6"}, {"Name" : "Comox Valley C (Puntledge - Black Creek)", "Type" : "", "RegionalDistrictCode" : "6"}, {"Name" : "Courtenay", "Type" : "", "RegionalDistrictCode" : "6"}, {"Name" : "Cumberland", "Type" : "", "RegionalDistrictCode" : "6"}, {"Name" : "Pentledge 2", "Type" : "", "RegionalDistrictCode" : "6"}, {"Name" : "Powell River", "Type" : "", "RegionalDistrictCode" : "7"}, {"Name" : "qathet A", "Type" : "", "RegionalDistrictCode" : "7"}, {"Name" : "qathet B", "Type" : "", "RegionalDistrictCode" : "7"}, {"Name" : "qathet C", "Type" : "", "RegionalDistrictCode" : "7"}, {"Name" : "qathet D", "Type" : "", "RegionalDistrictCode" : "7"}, {"Name" : "qathet E", "Type" : "", "RegionalDistrictCode" : "7"}, {"Name" : "Sechelt (Part)", "Type" : "", "RegionalDistrictCode" : "7"}, {"Name" : "Sliammon 1", "Type" : "", "RegionalDistrictCode" : "7"}, {"Name" : "Alert Bay", "Type" : "", "RegionalDistrictCode" : "8"}, {"Name" : "Alert Bay", "Type" : "", "RegionalDistrictCode" : "8"}, {"Name" : "Dead Point 5", "Type" : "", "RegionalDistrictCode" : "8"}, {"Name" : "Fort Rupert 1", "Type" : "", "RegionalDistrictCode" : "8"}, {"Name" : "Gwayasdums 1", "Type" : "", "RegionalDistrictCode" : "8"}, {"Name" : "Hope Island 1", "Type" : "", "RegionalDistrictCode" : "8"}, {"Name" : "Hopetown 10A", "Type" : "", "RegionalDistrictCode" : "8"}, {"Name" : "Kippase 2", "Type" : "", "RegionalDistrictCode" : "8"}, {"Name" : "Mount Waddington A", "Type" : "", "RegionalDistrictCode" : "8"}, {"Name" : "Mount Waddington B", "Type" : "", "RegionalDistrictCode" : "8"}, {"Name" : "Mount Waddington C", "Type" : "", "RegionalDistrictCode" : "8"}, {"Name" : "Mount Waddington D", "Type" : "", "RegionalDistrictCode" : "8"}, {"Name" : "Nimpkish 2", "Type" : "", "RegionalDistrictCode" : "8"}, {"Name" : "Port Alice", "Type" : "", "RegionalDistrictCode" : "8"}, {"Name" : "Port Hardy", "Type" : "", "RegionalDistrictCode" : "8"}, {"Name" : "Port McNeill", "Type" : "", "RegionalDistrictCode" : "8"}, {"Name" : "Quaee 7", "Type" : "", "RegionalDistrictCode" : "8"}, {"Name" : "Quatsino Subdivision 18", "Type" : "", "RegionalDistrictCode" : "8"}, {"Name" : "Thomas Point 5", "Type" : "", "RegionalDistrictCode" : "8"}, {"Name" : "Thomas Point 5A", "Type" : "", "RegionalDistrictCode" : "8"}, {"Name" : "Tsulquate 4", "Type" : "", "RegionalDistrictCode" : "8"}, {"Name" : "Bella Bella 1", "Type" : "", "RegionalDistrictCode" : "9"}, {"Name" : "Bella Coola 1", "Type" : "", "RegionalDistrictCode" : "9"}, {"Name" : "Central Coast A", "Type" : "", "RegionalDistrictCode" : "9"}, {"Name" : "Central Coast C", "Type" : "", "RegionalDistrictCode" : "9"}, {"Name" : "Central Coast D", "Type" : "", "RegionalDistrictCode" : "9"}, {"Name" : "Central Coast E", "Type" : "", "RegionalDistrictCode" : "9"}, {"Name" : "Katit 1", "Type" : "", "RegionalDistrictCode" : "9"}]'; +BEGIN + -- Cleanup existing data in "Communities" table + DELETE FROM public."Communities"; + -- Insert into "Communities" table + INSERT INTO public."Communities" + ("Id", "Name", "Type","RegionalDistrictCode", "ExtraProperties", "ConcurrencyStamp", "CreationTime") + SELECT + gen_random_uuid(), + data->>'Name', + data->>'Type', + data->>'RegionalDistrictCode', + '', + '', + pg_catalog.now() + FROM jsonb_array_elements(json_data::jsonb) AS data; + +END $$; \ No newline at end of file diff --git a/applications/Unity.GrantManager/src/Unity.GrantManager.EntityFrameworkCore/Unity.GrantManager.EntityFrameworkCore.csproj b/applications/Unity.GrantManager/src/Unity.GrantManager.EntityFrameworkCore/Unity.GrantManager.EntityFrameworkCore.csproj index 8ac379d27..6d06183c8 100644 --- a/applications/Unity.GrantManager/src/Unity.GrantManager.EntityFrameworkCore/Unity.GrantManager.EntityFrameworkCore.csproj +++ b/applications/Unity.GrantManager/src/Unity.GrantManager.EntityFrameworkCore/Unity.GrantManager.EntityFrameworkCore.csproj @@ -10,6 +10,7 @@ + @@ -18,6 +19,7 @@ + diff --git a/applications/Unity.GrantManager/test/Unity.GrantManager.Application.Tests/Applicants/SubmissionInfoDataProviderTests.cs b/applications/Unity.GrantManager/test/Unity.GrantManager.Application.Tests/Applicants/SubmissionInfoDataProviderTests.cs index 6e578e896..ecae9fbfc 100644 --- a/applications/Unity.GrantManager/test/Unity.GrantManager.Application.Tests/Applicants/SubmissionInfoDataProviderTests.cs +++ b/applications/Unity.GrantManager/test/Unity.GrantManager.Application.Tests/Applicants/SubmissionInfoDataProviderTests.cs @@ -276,7 +276,7 @@ public async Task GetDataAsync_ShouldResolveLinkSourceFromIntakeApiBase() // Assert var dto = result.ShouldBeOfType(); - dto.LinkSource.ShouldBe("https://chefs-dev.apps.silver.devops.gov.bc.ca/app/form/view?s="); + dto.LinkSource.ShouldBe("https://chefs-dev.apps.silver.devops.gov.bc.ca/app/user/view?s="); } [Fact] diff --git a/database/scripts/unitydb-communities-script.sql b/database/scripts/unitydb-communities-script.sql index 0f0d27b3a..c82ffd847 100644 --- a/database/scripts/unitydb-communities-script.sql +++ b/database/scripts/unitydb-communities-script.sql @@ -1,11 +1,10 @@ DO $$ DECLARE --- Cleanup existing data in "Communities" table - DELETE FROM public."Communities"; --- Insert into "Communities" table. json_data jsonb := '[{"Name" : "Becher Bay 1", "Type" : "", "RegionalDistrictCode" : "1"}, {"Name" : "Central Saanich", "Type" : "", "RegionalDistrictCode" : "1"}, {"Name" : "Cole Bay 3", "Type" : "", "RegionalDistrictCode" : "1"}, {"Name" : "Colwood", "Type" : "", "RegionalDistrictCode" : "1"}, {"Name" : "East Saanich 2", "Type" : "", "RegionalDistrictCode" : "1"}, {"Name" : "Esquimalt", "Type" : "", "RegionalDistrictCode" : "1"}, {"Name" : "Esquimalt", "Type" : "", "RegionalDistrictCode" : "1"}, {"Name" : "Galiano Island 9", "Type" : "", "RegionalDistrictCode" : "1"}, {"Name" : "Gordon River 2", "Type" : "", "RegionalDistrictCode" : "1"}, {"Name" : "Highlands", "Type" : "", "RegionalDistrictCode" : "1"}, {"Name" : "Juan de Fuca (Part 1)", "Type" : "", "RegionalDistrictCode" : "1"}, {"Name" : "Juan de Fuca (Part 2)", "Type" : "", "RegionalDistrictCode" : "1"}, {"Name" : "Langford", "Type" : "", "RegionalDistrictCode" : "1"}, {"Name" : "Metchosin", "Type" : "", "RegionalDistrictCode" : "1"}, {"Name" : "New Songhees 1A", "Type" : "", "RegionalDistrictCode" : "1"}, {"Name" : "North Saanich", "Type" : "", "RegionalDistrictCode" : "1"}, {"Name" : "Oak Bay", "Type" : "", "RegionalDistrictCode" : "1"}, {"Name" : "Saanich", "Type" : "", "RegionalDistrictCode" : "1"}, {"Name" : "Saltspring Island", "Type" : "", "RegionalDistrictCode" : "1"}, {"Name" : "Sidney", "Type" : "", "RegionalDistrictCode" : "1"}, {"Name" : "Sooke", "Type" : "", "RegionalDistrictCode" : "1"}, {"Name" : "Southern Gulf Islands", "Type" : "", "RegionalDistrictCode" : "1"}, {"Name" : "South Saanich 1", "Type" : "", "RegionalDistrictCode" : "1"}, {"Name" : "T''Sou-ke", "Type" : "", "RegionalDistrictCode" : "1"}, {"Name" : "Union Bay 4", "Type" : "", "RegionalDistrictCode" : "1"}, {"Name" : "Victoria", "Type" : "", "RegionalDistrictCode" : "1"}, {"Name" : "View Royal", "Type" : "", "RegionalDistrictCode" : "1"}, {"Name" : "Abbotsford", "Type" : "", "RegionalDistrictCode" : "10"}, {"Name" : "Aitchelitch 9", "Type" : "", "RegionalDistrictCode" : "10"}, {"Name" : "Albert Flat 5", "Type" : "", "RegionalDistrictCode" : "10"}, {"Name" : "Boothrouyd 5B", "Type" : "", "RegionalDistrictCode" : "10"}, {"Name" : "Boothroyd 13", "Type" : "", "RegionalDistrictCode" : "10"}, {"Name" : "Boston Bar 1A", "Type" : "", "RegionalDistrictCode" : "10"}, {"Name" : "Bucktum 4", "Type" : "", "RegionalDistrictCode" : "10"}, {"Name" : "Chawathil 4", "Type" : "", "RegionalDistrictCode" : "10"}, {"Name" : "Cheam 1", "Type" : "", "RegionalDistrictCode" : "10"}, {"Name" : "Chehalis 5", "Type" : "", "RegionalDistrictCode" : "10"}, {"Name" : "Chilliwack", "Type" : "", "RegionalDistrictCode" : "10"}, {"Name" : "Coqualeetza", "Type" : "", "RegionalDistrictCode" : "10"}, {"Name" : "Douglas 8", "Type" : "", "RegionalDistrictCode" : "10"}, {"Name" : "Fraser Valley A", "Type" : "", "RegionalDistrictCode" : "10"}, {"Name" : "Fraser Valley B", "Type" : "", "RegionalDistrictCode" : "10"}, {"Name" : "Fraser Valley C", "Type" : "", "RegionalDistrictCode" : "10"}, {"Name" : "Fraser Valley D", "Type" : "", "RegionalDistrictCode" : "10"}, {"Name" : "Fraser Valley E", "Type" : "", "RegionalDistrictCode" : "10"}, {"Name" : "Fraser Valley F", "Type" : "", "RegionalDistrictCode" : "10"}, {"Name" : "Fraser Valley G", "Type" : "", "RegionalDistrictCode" : "10"}, {"Name" : "Fraser Valley H", "Type" : "", "RegionalDistrictCode" : "10"}, {"Name" : "Harrison Hot Springs", "Type" : "", "RegionalDistrictCode" : "10"}, {"Name" : "Holachten 8", "Type" : "", "RegionalDistrictCode" : "10"}, {"Name" : "Hope", "Type" : "", "RegionalDistrictCode" : "10"}, {"Name" : "Inkahtsaph 6", "Type" : "", "RegionalDistrictCode" : "10"}, {"Name" : "Kahmoose 4", "Type" : "", "RegionalDistrictCode" : "10"}, {"Name" : "Kent", "Type" : "", "RegionalDistrictCode" : "10"}, {"Name" : "Kopchitchin 2", "Type" : "", "RegionalDistrictCode" : "10"}, {"Name" : "Kwawkwawapilt 6", "Type" : "", "RegionalDistrictCode" : "10"}, {"Name" : "Lakahahmen 11", "Type" : "", "RegionalDistrictCode" : "10"}, {"Name" : "Langley 2", "Type" : "", "RegionalDistrictCode" : "10"}, {"Name" : "Lukseetsissum 9", "Type" : "", "RegionalDistrictCode" : "10"}, {"Name" : "Matsqui Main 2", "Type" : "", "RegionalDistrictCode" : "10"}, {"Name" : "Mission", "Type" : "", "RegionalDistrictCode" : "10"}, {"Name" : "Ohamil 1", "Type" : "", "RegionalDistrictCode" : "10"}, {"Name" : "Paqulh", "Type" : "", "RegionalDistrictCode" : "10"}, {"Name" : "Peters 1", "Type" : "", "RegionalDistrictCode" : "10"}, {"Name" : "Popkum 1", "Type" : "", "RegionalDistrictCode" : "10"}, {"Name" : "Puckatholetchin 11", "Type" : "", "RegionalDistrictCode" : "10"}, {"Name" : "Q''alatkú7em", "Type" : "", "RegionalDistrictCode" : "10"}, {"Name" : "Ruby Creek 2", "Type" : "", "RegionalDistrictCode" : "10"}, {"Name" : "Sachteen", "Type" : "", "RegionalDistrictCode" : "10"}, {"Name" : "Saddle Rock 9", "Type" : "", "RegionalDistrictCode" : "10"}, {"Name" : "Schelowat 1", "Type" : "", "RegionalDistrictCode" : "10"}, {"Name" : "Schkam 2", "Type" : "", "RegionalDistrictCode" : "10"}, {"Name" : "Scowlitz 1", "Type" : "", "RegionalDistrictCode" : "10"}, {"Name" : "Seabird Island", "Type" : "", "RegionalDistrictCode" : "10"}, {"Name" : "Skawahlook 1", "Type" : "", "RegionalDistrictCode" : "10"}, {"Name" : "Skookumchuck 4", "Type" : "", "RegionalDistrictCode" : "10"}, {"Name" : "Skookumchuck 4A", "Type" : "", "RegionalDistrictCode" : "10"}, {"Name" : "Skowkale", "Type" : "", "RegionalDistrictCode" : "10"}, {"Name" : "Skwah 4", "Type" : "", "RegionalDistrictCode" : "10"}, {"Name" : "Skwali 3", "Type" : "", "RegionalDistrictCode" : "10"}, {"Name" : "Skway 5", "Type" : "", "RegionalDistrictCode" : "10"}, {"Name" : "Skweahm 10", "Type" : "", "RegionalDistrictCode" : "10"}, {"Name" : "Soowahlie 14", "Type" : "", "RegionalDistrictCode" : "10"}, {"Name" : "Speyum 3", "Type" : "", "RegionalDistrictCode" : "10"}, {"Name" : "Spuzzum 1", "Type" : "", "RegionalDistrictCode" : "10"}, {"Name" : "Squawkum Creek 3", "Type" : "", "RegionalDistrictCode" : "10"}, {"Name" : "Squiaala", "Type" : "", "RegionalDistrictCode" : "10"}, {"Name" : "Stullawheets 8", "Type" : "", "RegionalDistrictCode" : "10"}, {"Name" : "Tipella 7", "Type" : "", "RegionalDistrictCode" : "10"}, {"Name" : "Tseatah 2", "Type" : "", "RegionalDistrictCode" : "10"}, {"Name" : "Tuckkwiowhum 1", "Type" : "", "RegionalDistrictCode" : "10"}, {"Name" : "Tzeachten 13", "Type" : "", "RegionalDistrictCode" : "10"}, {"Name" : "Upper Sumas 6", "Type" : "", "RegionalDistrictCode" : "10"}, {"Name" : "Yakweakwioose 12", "Type" : "", "RegionalDistrictCode" : "10"}, {"Name" : "Yale Town 1", "Type" : "", "RegionalDistrictCode" : "10"}, {"Name" : "Anmore", "Type" : "", "RegionalDistrictCode" : "11"}, {"Name" : "Barnston Island 3", "Type" : "", "RegionalDistrictCode" : "11"}, {"Name" : "Belcarra", "Type" : "", "RegionalDistrictCode" : "11"}, {"Name" : "Bowen Island", "Type" : "", "RegionalDistrictCode" : "11"}, {"Name" : "Burnaby", "Type" : "", "RegionalDistrictCode" : "11"}, {"Name" : "Burrard Inlet 3", "Type" : "", "RegionalDistrictCode" : "11"}, {"Name" : "Capilano 5", "Type" : "", "RegionalDistrictCode" : "11"}, {"Name" : "Coquitlam", "Type" : "", "RegionalDistrictCode" : "11"}, {"Name" : "Coquitlam 1", "Type" : "", "RegionalDistrictCode" : "11"}, {"Name" : "Coquitlam 2", "Type" : "", "RegionalDistrictCode" : "11"}, {"Name" : "Delta", "Type" : "", "RegionalDistrictCode" : "11"}, {"Name" : "Katzie 1", "Type" : "", "RegionalDistrictCode" : "11"}, {"Name" : "Katzie 2", "Type" : "", "RegionalDistrictCode" : "11"}, {"Name" : "Kitsilano 6", "Type" : "", "RegionalDistrictCode" : "11"}, {"Name" : "Langley", "Type" : "", "RegionalDistrictCode" : "11"}, {"Name" : "Langley", "Type" : "", "RegionalDistrictCode" : "11"}, {"Name" : "Lions Bay", "Type" : "", "RegionalDistrictCode" : "11"}, {"Name" : "Maple Ridge", "Type" : "", "RegionalDistrictCode" : "11"}, {"Name" : "Matsqui 4", "Type" : "", "RegionalDistrictCode" : "11"}, {"Name" : "McMillan Island 6", "Type" : "", "RegionalDistrictCode" : "11"}, {"Name" : "Metro Vancouver A", "Type" : "", "RegionalDistrictCode" : "11"}, {"Name" : "Mission 1", "Type" : "", "RegionalDistrictCode" : "11"}, {"Name" : "Musqueam 2", "Type" : "", "RegionalDistrictCode" : "11"}, {"Name" : "Musqueam 4", "Type" : "", "RegionalDistrictCode" : "11"}, {"Name" : "New Westminster", "Type" : "", "RegionalDistrictCode" : "11"}, {"Name" : "North Vancouver", "Type" : "", "RegionalDistrictCode" : "11"}, {"Name" : "North Vancouver", "Type" : "", "RegionalDistrictCode" : "11"}, {"Name" : "Pitt Meadows", "Type" : "", "RegionalDistrictCode" : "11"}, {"Name" : "Port Coquitlam", "Type" : "", "RegionalDistrictCode" : "11"}, {"Name" : "Port Moody", "Type" : "", "RegionalDistrictCode" : "11"}, {"Name" : "Richmond", "Type" : "", "RegionalDistrictCode" : "11"}, {"Name" : "Semiahmoo", "Type" : "", "RegionalDistrictCode" : "11"}, {"Name" : "Seymour Creek 2", "Type" : "", "RegionalDistrictCode" : "11"}, {"Name" : "Surrey", "Type" : "", "RegionalDistrictCode" : "11"}, {"Name" : "Tsawwassen", "Type" : "", "RegionalDistrictCode" : "11"}, {"Name" : "Vancouver", "Type" : "", "RegionalDistrictCode" : "11"}, {"Name" : "West Vancouver", "Type" : "", "RegionalDistrictCode" : "11"}, {"Name" : "White Rock", "Type" : "", "RegionalDistrictCode" : "11"}, {"Name" : "Whonnock 1", "Type" : "", "RegionalDistrictCode" : "11"}, {"Name" : "Chekwelp 26", "Type" : "", "RegionalDistrictCode" : "12"}, {"Name" : "Gibsons", "Type" : "", "RegionalDistrictCode" : "12"}, {"Name" : "Sechelt", "Type" : "", "RegionalDistrictCode" : "12"}, {"Name" : "Sechelt (Part)", "Type" : "", "RegionalDistrictCode" : "12"}, {"Name" : "Sunshine Coast A", "Type" : "", "RegionalDistrictCode" : "12"}, {"Name" : "Sunshine Coast B", "Type" : "", "RegionalDistrictCode" : "12"}, {"Name" : "Sunshine Coast D", "Type" : "", "RegionalDistrictCode" : "12"}, {"Name" : "Sunshine Coast E", "Type" : "", "RegionalDistrictCode" : "12"}, {"Name" : "Sunshine Coast F", "Type" : "", "RegionalDistrictCode" : "12"}, {"Name" : "Bridge River 1", "Type" : "", "RegionalDistrictCode" : "13"}, {"Name" : "Cayoosh Creek 1", "Type" : "", "RegionalDistrictCode" : "13"}, {"Name" : "Cheakamus 11", "Type" : "", "RegionalDistrictCode" : "13"}, {"Name" : "Chilhil 6", "Type" : "", "RegionalDistrictCode" : "13"}, {"Name" : "Fountain 1", "Type" : "", "RegionalDistrictCode" : "13"}, {"Name" : "Fountain 10", "Type" : "", "RegionalDistrictCode" : "13"}, {"Name" : "Fountain 11", "Type" : "", "RegionalDistrictCode" : "13"}, {"Name" : "Fountain 12", "Type" : "", "RegionalDistrictCode" : "13"}, {"Name" : "Fountain 1B", "Type" : "", "RegionalDistrictCode" : "13"}, {"Name" : "Fountain 1D", "Type" : "", "RegionalDistrictCode" : "13"}, {"Name" : "Fountain 3", "Type" : "", "RegionalDistrictCode" : "13"}, {"Name" : "Fountain 3A", "Type" : "", "RegionalDistrictCode" : "13"}, {"Name" : "Fountain Creek 8", "Type" : "", "RegionalDistrictCode" : "13"}, {"Name" : "Kowtain 17", "Type" : "", "RegionalDistrictCode" : "13"}, {"Name" : "Lillooet", "Type" : "", "RegionalDistrictCode" : "13"}, {"Name" : "Lillooet 1", "Type" : "", "RegionalDistrictCode" : "13"}, {"Name" : "McCartney''s Flat 4", "Type" : "", "RegionalDistrictCode" : "13"}, {"Name" : "Mission 5", "Type" : "", "RegionalDistrictCode" : "13"}, {"Name" : "Mount Currie", "Type" : "", "RegionalDistrictCode" : "13"}, {"Name" : "Necait 6", "Type" : "", "RegionalDistrictCode" : "13"}, {"Name" : "Nequatque", "Type" : "", "RegionalDistrictCode" : "13"}, {"Name" : "Nesikep 6", "Type" : "", "RegionalDistrictCode" : "13"}, {"Name" : "Nesuch 3", "Type" : "", "RegionalDistrictCode" : "13"}, {"Name" : "Pashilqua 2", "Type" : "", "RegionalDistrictCode" : "13"}, {"Name" : "Pavilion 1", "Type" : "", "RegionalDistrictCode" : "13"}, {"Name" : "Pemberton", "Type" : "", "RegionalDistrictCode" : "13"}, {"Name" : "Seaichem 16", "Type" : "", "RegionalDistrictCode" : "13"}, {"Name" : "Seton Lake 5", "Type" : "", "RegionalDistrictCode" : "13"}, {"Name" : "Slosh 1", "Type" : "", "RegionalDistrictCode" : "13"}, {"Name" : "Squamish", "Type" : "", "RegionalDistrictCode" : "13"}, {"Name" : "Squamish-Lillooet A", "Type" : "", "RegionalDistrictCode" : "13"}, {"Name" : "Squamish-Lillooet B", "Type" : "", "RegionalDistrictCode" : "13"}, {"Name" : "Squamish-Lillooet C", "Type" : "", "RegionalDistrictCode" : "13"}, {"Name" : "Squamish-Lillooet D", "Type" : "", "RegionalDistrictCode" : "13"}, {"Name" : "Stawamus 24", "Type" : "", "RegionalDistrictCode" : "13"}, {"Name" : "Towinock 2", "Type" : "", "RegionalDistrictCode" : "13"}, {"Name" : "Waiwakum 14", "Type" : "", "RegionalDistrictCode" : "13"}, {"Name" : "Whistler", "Type" : "", "RegionalDistrictCode" : "13"}, {"Name" : "Whitecap 1", "Type" : "", "RegionalDistrictCode" : "13"}, {"Name" : "Yekwaupsum 18", "Type" : "", "RegionalDistrictCode" : "13"}, {"Name" : "Alexis 9", "Type" : "", "RegionalDistrictCode" : "14"}, {"Name" : "Ashnola 10", "Type" : "", "RegionalDistrictCode" : "14"}, {"Name" : "Blind Creek 6", "Type" : "", "RegionalDistrictCode" : "14"}, {"Name" : "Chopaka 7 & 8", "Type" : "", "RegionalDistrictCode" : "14"}, {"Name" : "Chuchuwayha 2", "Type" : "", "RegionalDistrictCode" : "14"}, {"Name" : "Keremeos", "Type" : "", "RegionalDistrictCode" : "14"}, {"Name" : "Lower Similkameen 2", "Type" : "", "RegionalDistrictCode" : "14"}, {"Name" : "Lulu 5", "Type" : "", "RegionalDistrictCode" : "14"}, {"Name" : "Okanagan-Similkameen A", "Type" : "", "RegionalDistrictCode" : "14"}, {"Name" : "Okanagan-Similkameen B", "Type" : "", "RegionalDistrictCode" : "14"}, {"Name" : "Okanagan-Similkameen C", "Type" : "", "RegionalDistrictCode" : "14"}, {"Name" : "Okanagan-Similkameen D", "Type" : "", "RegionalDistrictCode" : "14"}, {"Name" : "Okanagan-Similkameen E", "Type" : "", "RegionalDistrictCode" : "14"}, {"Name" : "Okanagan-Similkameen F", "Type" : "", "RegionalDistrictCode" : "14"}, {"Name" : "Okanagan-Similkameen G", "Type" : "", "RegionalDistrictCode" : "14"}, {"Name" : "Okanagan-Similkameen H", "Type" : "", "RegionalDistrictCode" : "14"}, {"Name" : "Okanagan-Similkameen I", "Type" : "", "RegionalDistrictCode" : "14"}, {"Name" : "Oliver", "Type" : "", "RegionalDistrictCode" : "14"}, {"Name" : "Osoyoos", "Type" : "", "RegionalDistrictCode" : "14"}, {"Name" : "Osoyoos 1", "Type" : "", "RegionalDistrictCode" : "14"}, {"Name" : "Penticton", "Type" : "", "RegionalDistrictCode" : "14"}, {"Name" : "Penticton 1", "Type" : "", "RegionalDistrictCode" : "14"}, {"Name" : "Princeton", "Type" : "", "RegionalDistrictCode" : "14"}, {"Name" : "Summerland", "Type" : "", "RegionalDistrictCode" : "14"}, {"Name" : "105 Mile Post 2", "Type" : "", "RegionalDistrictCode" : "15"}, {"Name" : "Ashcroft", "Type" : "", "RegionalDistrictCode" : "15"}, {"Name" : "Ashcroft 4", "Type" : "", "RegionalDistrictCode" : "15"}, {"Name" : "Barriere", "Type" : "", "RegionalDistrictCode" : "15"}, {"Name" : "Basque 18", "Type" : "", "RegionalDistrictCode" : "15"}, {"Name" : "Bonaparte 3", "Type" : "", "RegionalDistrictCode" : "15"}, {"Name" : "Boothroyd 8A", "Type" : "", "RegionalDistrictCode" : "15"}, {"Name" : "Cache Creek", "Type" : "", "RegionalDistrictCode" : "15"}, {"Name" : "Canoe Creek 1", "Type" : "", "RegionalDistrictCode" : "15"}, {"Name" : "Canoe Creek 2", "Type" : "", "RegionalDistrictCode" : "15"}, {"Name" : "Chase", "Type" : "", "RegionalDistrictCode" : "15"}, {"Name" : "Chuchhraischin", "Type" : "", "RegionalDistrictCode" : "15"}, {"Name" : "Clearwater", "Type" : "", "RegionalDistrictCode" : "15"}, {"Name" : "Clinton", "Type" : "", "RegionalDistrictCode" : "15"}, {"Name" : "Coldwater 1", "Type" : "", "RegionalDistrictCode" : "15"}, {"Name" : "Douglas Lake 3", "Type" : "", "RegionalDistrictCode" : "15"}, {"Name" : "Entlqwekkinh 19", "Type" : "", "RegionalDistrictCode" : "15"}, {"Name" : "Halhalaeden", "Type" : "", "RegionalDistrictCode" : "15"}, {"Name" : "Hamilton Creek 2", "Type" : "", "RegionalDistrictCode" : "15"}, {"Name" : "High Bar 1", "Type" : "", "RegionalDistrictCode" : "15"}, {"Name" : "Inkluckcheen", "Type" : "", "RegionalDistrictCode" : "15"}, {"Name" : "Inklyuhkinatko 2", "Type" : "", "RegionalDistrictCode" : "15"}, {"Name" : "Joeyaska 2", "Type" : "", "RegionalDistrictCode" : "15"}, {"Name" : "Kamloops", "Type" : "", "RegionalDistrictCode" : "15"}, {"Name" : "Kamloops 1", "Type" : "", "RegionalDistrictCode" : "15"}, {"Name" : "Kanaka Bar", "Type" : "", "RegionalDistrictCode" : "15"}, {"Name" : "Kitzowit 20", "Type" : "", "RegionalDistrictCode" : "15"}, {"Name" : "Klahkamich 17", "Type" : "", "RegionalDistrictCode" : "15"}, {"Name" : "Kleetlekut 22", "Type" : "", "RegionalDistrictCode" : "15"}, {"Name" : "Klickkumcheen 18", "Type" : "", "RegionalDistrictCode" : "15"}, {"Name" : "Kloklowuck 7", "Type" : "", "RegionalDistrictCode" : "15"}, {"Name" : "Kumcheen 1", "Type" : "", "RegionalDistrictCode" : "15"}, {"Name" : "Logan Lake", "Type" : "", "RegionalDistrictCode" : "15"}, {"Name" : "Louis Creek 4", "Type" : "", "RegionalDistrictCode" : "15"}, {"Name" : "Lower Hat Creek 2", "Type" : "", "RegionalDistrictCode" : "15"}, {"Name" : "Lytton", "Type" : "", "RegionalDistrictCode" : "15"}, {"Name" : "Lytton 4A", "Type" : "", "RegionalDistrictCode" : "15"}, {"Name" : "Lytton 4E", "Type" : "", "RegionalDistrictCode" : "15"}, {"Name" : "Lytton 9A", "Type" : "", "RegionalDistrictCode" : "15"}, {"Name" : "Lytton 9B", "Type" : "", "RegionalDistrictCode" : "15"}, {"Name" : "Marble Canyon 3", "Type" : "", "RegionalDistrictCode" : "15"}, {"Name" : "Merritt", "Type" : "", "RegionalDistrictCode" : "15"}, {"Name" : "Nekalliston 2", "Type" : "", "RegionalDistrictCode" : "15"}, {"Name" : "Nekliptum 1", "Type" : "", "RegionalDistrictCode" : "15"}, {"Name" : "Neskonlith", "Type" : "", "RegionalDistrictCode" : "15"}, {"Name" : "Nickel Palm 4", "Type" : "", "RegionalDistrictCode" : "15"}, {"Name" : "Nickeyeah 25", "Type" : "", "RegionalDistrictCode" : "15"}, {"Name" : "Nicola Lake 1", "Type" : "", "RegionalDistrictCode" : "15"}, {"Name" : "Nicola Mameet 1", "Type" : "", "RegionalDistrictCode" : "15"}, {"Name" : "Nicomen 1", "Type" : "", "RegionalDistrictCode" : "15"}, {"Name" : "Nkaih 10", "Type" : "", "RegionalDistrictCode" : "15"}, {"Name" : "Nohomeen 23", "Type" : "", "RegionalDistrictCode" : "15"}, {"Name" : "Nooaitch 10", "Type" : "", "RegionalDistrictCode" : "15"}, {"Name" : "North Thompson 1", "Type" : "", "RegionalDistrictCode" : "15"}, {"Name" : "Nuuautin 2", "Type" : "", "RegionalDistrictCode" : "15"}, {"Name" : "Oregon Jack Creek 5", "Type" : "", "RegionalDistrictCode" : "15"}, {"Name" : "Papyum 27", "Type" : "", "RegionalDistrictCode" : "15"}, {"Name" : "Paska Island 3", "Type" : "", "RegionalDistrictCode" : "15"}, {"Name" : "Paul''s Basin 2", "Type" : "", "RegionalDistrictCode" : "15"}, {"Name" : "Pemynoos 9", "Type" : "", "RegionalDistrictCode" : "15"}, {"Name" : "Peq-Paq 22", "Type" : "", "RegionalDistrictCode" : "15"}, {"Name" : "Sahhaltkum 4", "Type" : "", "RegionalDistrictCode" : "15"}, {"Name" : "Seah 5", "Type" : "", "RegionalDistrictCode" : "15"}, {"Name" : "Shackan 11", "Type" : "", "RegionalDistrictCode" : "15"}, {"Name" : "Shawniken 4B", "Type" : "", "RegionalDistrictCode" : "15"}, {"Name" : "Siska Flat", "Type" : "", "RegionalDistrictCode" : "15"}, {"Name" : "Siska Flat 5B", "Type" : "", "RegionalDistrictCode" : "15"}, {"Name" : "Skeetchestn", "Type" : "", "RegionalDistrictCode" : "15"}, {"Name" : "Skuppah 2A", "Type" : "", "RegionalDistrictCode" : "15"}, {"Name" : "Skuppah 4", "Type" : "", "RegionalDistrictCode" : "15"}, {"Name" : "Skwayaynope 26", "Type" : "", "RegionalDistrictCode" : "15"}, {"Name" : "Spences Bridge", "Type" : "", "RegionalDistrictCode" : "15"}, {"Name" : "Spintlum Flat 3", "Type" : "", "RegionalDistrictCode" : "15"}, {"Name" : "Squaam 2", "Type" : "", "RegionalDistrictCode" : "15"}, {"Name" : "Stequmwhulpa 5", "Type" : "", "RegionalDistrictCode" : "15"}, {"Name" : "Stryen 9", "Type" : "", "RegionalDistrictCode" : "15"}, {"Name" : "Sun Peaks Mountain", "Type" : "", "RegionalDistrictCode" : "15"}, {"Name" : "Thompson-Nicola A (Wells Gray Country)", "Type" : "", "RegionalDistrictCode" : "15"}, {"Name" : "Thompson-Nicola B (Thompson Headwaters)", "Type" : "", "RegionalDistrictCode" : "15"}, {"Name" : "Thompson-Nicola E (Bonaparte Plateau)", "Type" : "", "RegionalDistrictCode" : "15"}, {"Name" : "Thompson-Nicola I (Blue Sky Country)", "Type" : "", "RegionalDistrictCode" : "15"}, {"Name" : "Thompson-Nicola J (Copper Desert Country)", "Type" : "", "RegionalDistrictCode" : "15"}, {"Name" : "Thompson-Nicola L (Grasslands)", "Type" : "", "RegionalDistrictCode" : "15"}, {"Name" : "Thompson-Nicola M (Beautiful Nicola Valley - North)", "Type" : "", "RegionalDistrictCode" : "15"}, {"Name" : "Thompson-Nicola N (Beautiful Nicola Valley - South)", "Type" : "", "RegionalDistrictCode" : "15"}, {"Name" : "Thompson-Nicola O (Lower North Thompson)", "Type" : "", "RegionalDistrictCode" : "15"}, {"Name" : "Thompson-Nicola P (Rivers and the Peaks)", "Type" : "", "RegionalDistrictCode" : "15"}, {"Name" : "Toops 3", "Type" : "", "RegionalDistrictCode" : "15"}, {"Name" : "Tsaukan 12", "Type" : "", "RegionalDistrictCode" : "15"}, {"Name" : "Twoyqhalsht 16", "Type" : "", "RegionalDistrictCode" : "15"}, {"Name" : "Upper Hat Creek 1", "Type" : "", "RegionalDistrictCode" : "15"}, {"Name" : "Upper Nepa 6", "Type" : "", "RegionalDistrictCode" : "15"}, {"Name" : "Whispering Pines 4", "Type" : "", "RegionalDistrictCode" : "15"}, {"Name" : "Yawaucht 11", "Type" : "", "RegionalDistrictCode" : "15"}, {"Name" : "Zacht 5", "Type" : "", "RegionalDistrictCode" : "15"}, {"Name" : "Zoht 4", "Type" : "", "RegionalDistrictCode" : "15"}, {"Name" : "Central Okanagan", "Type" : "", "RegionalDistrictCode" : "16"}, {"Name" : "Central Okanagan West", "Type" : "", "RegionalDistrictCode" : "16"}, {"Name" : "Duck Lake 7", "Type" : "", "RegionalDistrictCode" : "16"}, {"Name" : "Kelowna", "Type" : "", "RegionalDistrictCode" : "16"}, {"Name" : "Lake Country", "Type" : "", "RegionalDistrictCode" : "16"}, {"Name" : "Peachland", "Type" : "", "RegionalDistrictCode" : "16"}, {"Name" : "Tsinstikeptum 10", "Type" : "", "RegionalDistrictCode" : "16"}, {"Name" : "Tsinstikeptum 9", "Type" : "", "RegionalDistrictCode" : "16"}, {"Name" : "West Kelowna", "Type" : "", "RegionalDistrictCode" : "16"}, {"Name" : "Armstrong", "Type" : "", "RegionalDistrictCode" : "17"}, {"Name" : "Coldstream", "Type" : "", "RegionalDistrictCode" : "17"}, {"Name" : "Enderby", "Type" : "", "RegionalDistrictCode" : "17"}, {"Name" : "Enderby 2", "Type" : "", "RegionalDistrictCode" : "17"}, {"Name" : "Harris 3", "Type" : "", "RegionalDistrictCode" : "17"}, {"Name" : "Lumby", "Type" : "", "RegionalDistrictCode" : "17"}, {"Name" : "North Okanagan B", "Type" : "", "RegionalDistrictCode" : "17"}, {"Name" : "North Okanagan C", "Type" : "", "RegionalDistrictCode" : "17"}, {"Name" : "North Okanagan D", "Type" : "", "RegionalDistrictCode" : "17"}, {"Name" : "North Okanagan E", "Type" : "", "RegionalDistrictCode" : "17"}, {"Name" : "North Okanagan F", "Type" : "", "RegionalDistrictCode" : "17"}, {"Name" : "Okanagan (Part) 1", "Type" : "", "RegionalDistrictCode" : "17"}, {"Name" : "Priest''s Valley 6", "Type" : "", "RegionalDistrictCode" : "17"}, {"Name" : "Spallumcheen", "Type" : "", "RegionalDistrictCode" : "17"}, {"Name" : "Vernon", "Type" : "", "RegionalDistrictCode" : "17"}, {"Name" : "Chum Creek 2", "Type" : "", "RegionalDistrictCode" : "18"}, {"Name" : "Columbia Shuswap A", "Type" : "", "RegionalDistrictCode" : "18"}, {"Name" : "Columbia Shuswap B", "Type" : "", "RegionalDistrictCode" : "18"}, {"Name" : "Columbia Shuswap C", "Type" : "", "RegionalDistrictCode" : "18"}, {"Name" : "Columbia Shuswap D", "Type" : "", "RegionalDistrictCode" : "18"}, {"Name" : "Columbia Shuswap E", "Type" : "", "RegionalDistrictCode" : "18"}, {"Name" : "Columbia Shuswap F", "Type" : "", "RegionalDistrictCode" : "18"}, {"Name" : "Columbia Shuswap G", "Type" : "", "RegionalDistrictCode" : "18"}, {"Name" : "Golden", "Type" : "", "RegionalDistrictCode" : "18"}, {"Name" : "Hustalen 1", "Type" : "", "RegionalDistrictCode" : "18"}, {"Name" : "North Bay 5", "Type" : "", "RegionalDistrictCode" : "18"}, {"Name" : "Okanagan (Part) 1", "Type" : "", "RegionalDistrictCode" : "18"}, {"Name" : "Quaaout 1", "Type" : "", "RegionalDistrictCode" : "18"}, {"Name" : "Revelstoke", "Type" : "", "RegionalDistrictCode" : "18"}, {"Name" : "Salmon Arm", "Type" : "", "RegionalDistrictCode" : "18"}, {"Name" : "Salmon River 1", "Type" : "", "RegionalDistrictCode" : "18"}, {"Name" : "Scotch Creek 4", "Type" : "", "RegionalDistrictCode" : "18"}, {"Name" : "Sicamous", "Type" : "", "RegionalDistrictCode" : "18"}, {"Name" : "Switsemalph", "Type" : "", "RegionalDistrictCode" : "18"}, {"Name" : "Switsemalph 3", "Type" : "", "RegionalDistrictCode" : "18"}, {"Name" : "Canal Flats", "Type" : "", "RegionalDistrictCode" : "19"}, {"Name" : "Cassimayooks (Mayook) 5", "Type" : "", "RegionalDistrictCode" : "19"}, {"Name" : "Columbia Lake 3", "Type" : "", "RegionalDistrictCode" : "19"}, {"Name" : "Cranbrook", "Type" : "", "RegionalDistrictCode" : "19"}, {"Name" : "East Kootenay A", "Type" : "", "RegionalDistrictCode" : "19"}, {"Name" : "East Kootenay B", "Type" : "", "RegionalDistrictCode" : "19"}, {"Name" : "East Kootenay C", "Type" : "", "RegionalDistrictCode" : "19"}, {"Name" : "East Kootenay E", "Type" : "", "RegionalDistrictCode" : "19"}, {"Name" : "East Kootenay F", "Type" : "", "RegionalDistrictCode" : "19"}, {"Name" : "East Kootenay G", "Type" : "", "RegionalDistrictCode" : "19"}, {"Name" : "Elkford", "Type" : "", "RegionalDistrictCode" : "19"}, {"Name" : "Fernie", "Type" : "", "RegionalDistrictCode" : "19"}, {"Name" : "Invermere", "Type" : "", "RegionalDistrictCode" : "19"}, {"Name" : "Isidore''s Ranch 4", "Type" : "", "RegionalDistrictCode" : "19"}, {"Name" : "Kimberley", "Type" : "", "RegionalDistrictCode" : "19"}, {"Name" : "Kootenay 1", "Type" : "", "RegionalDistrictCode" : "19"}, {"Name" : "Radium Hot Springs", "Type" : "", "RegionalDistrictCode" : "19"}, {"Name" : "Shuswap", "Type" : "", "RegionalDistrictCode" : "19"}, {"Name" : "Sparwood", "Type" : "", "RegionalDistrictCode" : "19"}, {"Name" : "St. Mary''s", "Type" : "", "RegionalDistrictCode" : "19"}, {"Name" : "Tobacco Plains 2", "Type" : "", "RegionalDistrictCode" : "19"}, {"Name" : "Chemainus 13", "Type" : "", "RegionalDistrictCode" : "2"}, {"Name" : "Cowichan", "Type" : "", "RegionalDistrictCode" : "2"}, {"Name" : "Cowichan Lake", "Type" : "", "RegionalDistrictCode" : "2"}, {"Name" : "Cowichan Valley A", "Type" : "", "RegionalDistrictCode" : "2"}, {"Name" : "Cowichan Valley B", "Type" : "", "RegionalDistrictCode" : "2"}, {"Name" : "Cowichan Valley C", "Type" : "", "RegionalDistrictCode" : "2"}, {"Name" : "Cowichan Valley D", "Type" : "", "RegionalDistrictCode" : "2"}, {"Name" : "Cowichan Valley E", "Type" : "", "RegionalDistrictCode" : "2"}, {"Name" : "Cowichan Valley F", "Type" : "", "RegionalDistrictCode" : "2"}, {"Name" : "Cowichan Valley G", "Type" : "", "RegionalDistrictCode" : "2"}, {"Name" : "Cowichan Valley H", "Type" : "", "RegionalDistrictCode" : "2"}, {"Name" : "Cowichan Valley I", "Type" : "", "RegionalDistrictCode" : "2"}, {"Name" : "Duncan", "Type" : "", "RegionalDistrictCode" : "2"}, {"Name" : "Est-Patrolas 4", "Type" : "", "RegionalDistrictCode" : "2"}, {"Name" : "Halalt 2", "Type" : "", "RegionalDistrictCode" : "2"}, {"Name" : "Kil-pah-las 3", "Type" : "", "RegionalDistrictCode" : "2"}, {"Name" : "Ladysmith", "Type" : "", "RegionalDistrictCode" : "2"}, {"Name" : "Lake Cowichan", "Type" : "", "RegionalDistrictCode" : "2"}, {"Name" : "Lyacksun 3", "Type" : "", "RegionalDistrictCode" : "2"}, {"Name" : "Malachan 11", "Type" : "", "RegionalDistrictCode" : "2"}, {"Name" : "Malahat 11", "Type" : "", "RegionalDistrictCode" : "2"}, {"Name" : "North Cowichan", "Type" : "", "RegionalDistrictCode" : "2"}, {"Name" : "Oyster Bay 12", "Type" : "", "RegionalDistrictCode" : "2"}, {"Name" : "Penelakut Island 7", "Type" : "", "RegionalDistrictCode" : "2"}, {"Name" : "Portier Pass 5", "Type" : "", "RegionalDistrictCode" : "2"}, {"Name" : "Shingle Point 4", "Type" : "", "RegionalDistrictCode" : "2"}, {"Name" : "Squaw-Hay-One 11", "Type" : "", "RegionalDistrictCode" : "2"}, {"Name" : "Theik 2", "Type" : "", "RegionalDistrictCode" : "2"}, {"Name" : "Tsussie 6", "Type" : "", "RegionalDistrictCode" : "2"}, {"Name" : "Tzart-Lam 5", "Type" : "", "RegionalDistrictCode" : "2"}, {"Name" : "Castlegar", "Type" : "", "RegionalDistrictCode" : "20"}, {"Name" : "Central Kootenay A", "Type" : "", "RegionalDistrictCode" : "20"}, {"Name" : "Central Kootenay B", "Type" : "", "RegionalDistrictCode" : "20"}, {"Name" : "Central Kootenay C", "Type" : "", "RegionalDistrictCode" : "20"}, {"Name" : "Central Kootenay D", "Type" : "", "RegionalDistrictCode" : "20"}, {"Name" : "Central Kootenay E", "Type" : "", "RegionalDistrictCode" : "20"}, {"Name" : "Central Kootenay F", "Type" : "", "RegionalDistrictCode" : "20"}, {"Name" : "Central Kootenay G", "Type" : "", "RegionalDistrictCode" : "20"}, {"Name" : "Central Kootenay H", "Type" : "", "RegionalDistrictCode" : "20"}, {"Name" : "Central Kootenay I", "Type" : "", "RegionalDistrictCode" : "20"}, {"Name" : "Central Kootenay J", "Type" : "", "RegionalDistrictCode" : "20"}, {"Name" : "Central Kootenay K", "Type" : "", "RegionalDistrictCode" : "20"}, {"Name" : "Creston", "Type" : "", "RegionalDistrictCode" : "20"}, {"Name" : "Creston 1", "Type" : "", "RegionalDistrictCode" : "20"}, {"Name" : "Kaslo", "Type" : "", "RegionalDistrictCode" : "20"}, {"Name" : "Lower Kootenay 1C", "Type" : "", "RegionalDistrictCode" : "20"}, {"Name" : "Lower Kootenay 5", "Type" : "", "RegionalDistrictCode" : "20"}, {"Name" : "Nakusp", "Type" : "", "RegionalDistrictCode" : "20"}, {"Name" : "Nelson", "Type" : "", "RegionalDistrictCode" : "20"}, {"Name" : "New Denver", "Type" : "", "RegionalDistrictCode" : "20"}, {"Name" : "Salmo", "Type" : "", "RegionalDistrictCode" : "20"}, {"Name" : "Silverton", "Type" : "", "RegionalDistrictCode" : "20"}, {"Name" : "Slocan", "Type" : "", "RegionalDistrictCode" : "20"}, {"Name" : "Fruitvale", "Type" : "", "RegionalDistrictCode" : "21"}, {"Name" : "Grand Forks", "Type" : "", "RegionalDistrictCode" : "21"}, {"Name" : "Greenwood", "Type" : "", "RegionalDistrictCode" : "21"}, {"Name" : "Kootenay Boundary A", "Type" : "", "RegionalDistrictCode" : "21"}, {"Name" : "Kootenay Boundary B / Lower Columbia-Old-Glory", "Type" : "", "RegionalDistrictCode" : "21"}, {"Name" : "Kootenay Boundary C / Christina Lake", "Type" : "", "RegionalDistrictCode" : "21"}, {"Name" : "Kootenay Boundary D / Rural Grand Forks", "Type" : "", "RegionalDistrictCode" : "21"}, {"Name" : "Kootenay Boundary E / West Boundary", "Type" : "", "RegionalDistrictCode" : "21"}, {"Name" : "Midway", "Type" : "", "RegionalDistrictCode" : "21"}, {"Name" : "Montrose", "Type" : "", "RegionalDistrictCode" : "21"}, {"Name" : "Rossland", "Type" : "", "RegionalDistrictCode" : "21"}, {"Name" : "Trail", "Type" : "", "RegionalDistrictCode" : "21"}, {"Name" : "Warfield", "Type" : "", "RegionalDistrictCode" : "21"}, {"Name" : "Agats Meadow 8", "Type" : "", "RegionalDistrictCode" : "22"}, {"Name" : "Alexandria", "Type" : "", "RegionalDistrictCode" : "22"}, {"Name" : "Alexis Creek 14", "Type" : "", "RegionalDistrictCode" : "22"}, {"Name" : "Alexis Creek 16", "Type" : "", "RegionalDistrictCode" : "22"}, {"Name" : "Alexis Creek 21", "Type" : "", "RegionalDistrictCode" : "22"}, {"Name" : "Alexis Creek 34", "Type" : "", "RegionalDistrictCode" : "22"}, {"Name" : "Alkali Lake 1", "Type" : "", "RegionalDistrictCode" : "22"}, {"Name" : "Alkali Lake 4A", "Type" : "", "RegionalDistrictCode" : "22"}, {"Name" : "Anahim''s Flat 1", "Type" : "", "RegionalDistrictCode" : "22"}, {"Name" : "Anahim''s Meadow", "Type" : "", "RegionalDistrictCode" : "22"}, {"Name" : "Baezaeko River 27", "Type" : "", "RegionalDistrictCode" : "22"}, {"Name" : "Baptiste Meadow 2", "Type" : "", "RegionalDistrictCode" : "22"}, {"Name" : "Betty Creek 18", "Type" : "", "RegionalDistrictCode" : "22"}, {"Name" : "Canim Lake 1", "Type" : "", "RegionalDistrictCode" : "22"}, {"Name" : "Canim Lake 2", "Type" : "", "RegionalDistrictCode" : "22"}, {"Name" : "Canim Lake 4", "Type" : "", "RegionalDistrictCode" : "22"}, {"Name" : "Canoe Creek 3", "Type" : "", "RegionalDistrictCode" : "22"}, {"Name" : "Cariboo A", "Type" : "", "RegionalDistrictCode" : "22"}, {"Name" : "Cariboo B", "Type" : "", "RegionalDistrictCode" : "22"}, {"Name" : "Cariboo C", "Type" : "", "RegionalDistrictCode" : "22"}, {"Name" : "Cariboo D", "Type" : "", "RegionalDistrictCode" : "22"}, {"Name" : "Cariboo E", "Type" : "", "RegionalDistrictCode" : "22"}, {"Name" : "Cariboo F", "Type" : "", "RegionalDistrictCode" : "22"}, {"Name" : "Cariboo G", "Type" : "", "RegionalDistrictCode" : "22"}, {"Name" : "Cariboo H", "Type" : "", "RegionalDistrictCode" : "22"}, {"Name" : "Cariboo I", "Type" : "", "RegionalDistrictCode" : "22"}, {"Name" : "Cariboo J", "Type" : "", "RegionalDistrictCode" : "22"}, {"Name" : "Cariboo K", "Type" : "", "RegionalDistrictCode" : "22"}, {"Name" : "Cariboo L", "Type" : "", "RegionalDistrictCode" : "22"}, {"Name" : "Charley Boy''s Meadow 3", "Type" : "", "RegionalDistrictCode" : "22"}, {"Name" : "Chilco Lake 1", "Type" : "", "RegionalDistrictCode" : "22"}, {"Name" : "Chilco Lake 1A", "Type" : "", "RegionalDistrictCode" : "22"}, {"Name" : "Coglistiko River 29", "Type" : "", "RegionalDistrictCode" : "22"}, {"Name" : "Deep Creek 2", "Type" : "", "RegionalDistrictCode" : "22"}, {"Name" : "Dog Creek 1", "Type" : "", "RegionalDistrictCode" : "22"}, {"Name" : "Dog Creek 2", "Type" : "", "RegionalDistrictCode" : "22"}, {"Name" : "Dragon Lake 3", "Type" : "", "RegionalDistrictCode" : "22"}, {"Name" : "Euchinico Creek 17", "Type" : "", "RegionalDistrictCode" : "22"}, {"Name" : "Fishtrap 19", "Type" : "", "RegionalDistrictCode" : "22"}, {"Name" : "Garden", "Type" : "", "RegionalDistrictCode" : "22"}, {"Name" : "Johny Sticks 2", "Type" : "", "RegionalDistrictCode" : "22"}, {"Name" : "Kluskus 1", "Type" : "", "RegionalDistrictCode" : "22"}, {"Name" : "Lezbye 6", "Type" : "", "RegionalDistrictCode" : "22"}, {"Name" : "Little Springs", "Type" : "", "RegionalDistrictCode" : "22"}, {"Name" : "Lohbiee 3", "Type" : "", "RegionalDistrictCode" : "22"}, {"Name" : "Michel Gardens 36", "Type" : "", "RegionalDistrictCode" : "22"}, {"Name" : "Nazco 20", "Type" : "", "RegionalDistrictCode" : "22"}, {"Name" : "One Hundred Mile House", "Type" : "", "RegionalDistrictCode" : "22"}, {"Name" : "Puntzi Lake 2", "Type" : "", "RegionalDistrictCode" : "22"}, {"Name" : "Quesnel", "Type" : "", "RegionalDistrictCode" : "22"}, {"Name" : "Quesnel 1", "Type" : "", "RegionalDistrictCode" : "22"}, {"Name" : "Redstone Flat 1", "Type" : "", "RegionalDistrictCode" : "22"}, {"Name" : "Redstone Flat 1A", "Type" : "", "RegionalDistrictCode" : "22"}, {"Name" : "Salmon River Meadow 7", "Type" : "", "RegionalDistrictCode" : "22"}, {"Name" : "Sandy Harry 4", "Type" : "", "RegionalDistrictCode" : "22"}, {"Name" : "Soda Creek 1", "Type" : "", "RegionalDistrictCode" : "22"}, {"Name" : "Squinas 2", "Type" : "", "RegionalDistrictCode" : "22"}, {"Name" : "Stone 1", "Type" : "", "RegionalDistrictCode" : "22"}, {"Name" : "Sundayman''s Meadow 3", "Type" : "", "RegionalDistrictCode" : "22"}, {"Name" : "Swan Lake 3", "Type" : "", "RegionalDistrictCode" : "22"}, {"Name" : "Tanakut 4", "Type" : "", "RegionalDistrictCode" : "22"}, {"Name" : "Thomas Squinas Ranch 2A", "Type" : "", "RegionalDistrictCode" : "22"}, {"Name" : "Toosey 1", "Type" : "", "RegionalDistrictCode" : "22"}, {"Name" : "Towdystan Lake 3", "Type" : "", "RegionalDistrictCode" : "22"}, {"Name" : "Trout Lake Alec 16", "Type" : "", "RegionalDistrictCode" : "22"}, {"Name" : "Ulkatcho 13", "Type" : "", "RegionalDistrictCode" : "22"}, {"Name" : "Ulkatcho 14A", "Type" : "", "RegionalDistrictCode" : "22"}, {"Name" : "Wells", "Type" : "", "RegionalDistrictCode" : "22"}, {"Name" : "Williams Lake", "Type" : "", "RegionalDistrictCode" : "22"}, {"Name" : "Williams Lake 1", "Type" : "", "RegionalDistrictCode" : "22"}, {"Name" : "Windy Mouth 7", "Type" : "", "RegionalDistrictCode" : "22"}, {"Name" : "Fort George 2", "Type" : "", "RegionalDistrictCode" : "23"}, {"Name" : "Fraser-Fort George A", "Type" : "", "RegionalDistrictCode" : "23"}, {"Name" : "Fraser-Fort George C", "Type" : "", "RegionalDistrictCode" : "23"}, {"Name" : "Fraser-Fort George D", "Type" : "", "RegionalDistrictCode" : "23"}, {"Name" : "Fraser-Fort George E", "Type" : "", "RegionalDistrictCode" : "23"}, {"Name" : "Fraser-Fort George F", "Type" : "", "RegionalDistrictCode" : "23"}, {"Name" : "Fraser-Fort George G", "Type" : "", "RegionalDistrictCode" : "23"}, {"Name" : "Fraser-Fort George H", "Type" : "", "RegionalDistrictCode" : "23"}, {"Name" : "Mackenzie", "Type" : "", "RegionalDistrictCode" : "23"}, {"Name" : "McBride", "Type" : "", "RegionalDistrictCode" : "23"}, {"Name" : "McCleod Lake 5", "Type" : "", "RegionalDistrictCode" : "23"}, {"Name" : "McLeod Lake 1", "Type" : "", "RegionalDistrictCode" : "23"}, {"Name" : "Prince George", "Type" : "", "RegionalDistrictCode" : "23"}, {"Name" : "Valemount", "Type" : "", "RegionalDistrictCode" : "23"}, {"Name" : "Daajing Giids", "Type" : "", "RegionalDistrictCode" : "24"}, {"Name" : "Dolphin Island 1", "Type" : "", "RegionalDistrictCode" : "24"}, {"Name" : "Kulkayu (Hartley Bay) 4", "Type" : "", "RegionalDistrictCode" : "24"}, {"Name" : "Kulkayu (Hartley Bay) 4A", "Type" : "", "RegionalDistrictCode" : "24"}, {"Name" : "Lax Kw''alaams 1", "Type" : "", "RegionalDistrictCode" : "24"}, {"Name" : "Masset", "Type" : "", "RegionalDistrictCode" : "24"}, {"Name" : "Masset 1", "Type" : "", "RegionalDistrictCode" : "24"}, {"Name" : "North Coast A", "Type" : "", "RegionalDistrictCode" : "24"}, {"Name" : "North Coast C", "Type" : "", "RegionalDistrictCode" : "24"}, {"Name" : "North Coast D", "Type" : "", "RegionalDistrictCode" : "24"}, {"Name" : "North Coast E", "Type" : "", "RegionalDistrictCode" : "24"}, {"Name" : "Port Clements", "Type" : "", "RegionalDistrictCode" : "24"}, {"Name" : "Port Edward", "Type" : "", "RegionalDistrictCode" : "24"}, {"Name" : "Prince Rupert", "Type" : "", "RegionalDistrictCode" : "24"}, {"Name" : "S1/2 Tsimpsean 2", "Type" : "", "RegionalDistrictCode" : "24"}, {"Name" : "Skidegate 1", "Type" : "", "RegionalDistrictCode" : "24"}, {"Name" : "Tlaa Gaa Aawtlaas 28", "Type" : "", "RegionalDistrictCode" : "24"}, {"Name" : "Anlaw 4", "Type" : "", "RegionalDistrictCode" : "25"}, {"Name" : "Babine 17", "Type" : "", "RegionalDistrictCode" : "25"}, {"Name" : "Bulkley River 19", "Type" : "", "RegionalDistrictCode" : "25"}, {"Name" : "Coryatsaqua (Moricetown) 2", "Type" : "", "RegionalDistrictCode" : "25"}, {"Name" : "Dease Lake 9", "Type" : "", "RegionalDistrictCode" : "25"}, {"Name" : "Gitanmaax 1", "Type" : "", "RegionalDistrictCode" : "25"}, {"Name" : "Gitanyow 1", "Type" : "", "RegionalDistrictCode" : "25"}, {"Name" : "Gitsegukla 1", "Type" : "", "RegionalDistrictCode" : "25"}, {"Name" : "Gitwangak 1", "Type" : "", "RegionalDistrictCode" : "25"}, {"Name" : "Guhthe Tah 12", "Type" : "", "RegionalDistrictCode" : "25"}, {"Name" : "Hagwilget 1", "Type" : "", "RegionalDistrictCode" : "25"}, {"Name" : "Hazelton", "Type" : "", "RegionalDistrictCode" : "25"}, {"Name" : "Iskut 6", "Type" : "", "RegionalDistrictCode" : "25"}, {"Name" : "Kispiox 1", "Type" : "", "RegionalDistrictCode" : "25"}, {"Name" : "Kitamaat 2", "Type" : "", "RegionalDistrictCode" : "25"}, {"Name" : "Kitasoo 1", "Type" : "", "RegionalDistrictCode" : "25"}, {"Name" : "Kitimat", "Type" : "", "RegionalDistrictCode" : "25"}, {"Name" : "Kitimat-Stikine A", "Type" : "", "RegionalDistrictCode" : "25"}, {"Name" : "Kitimat-Stikine B", "Type" : "", "RegionalDistrictCode" : "25"}, {"Name" : "Kitimat-Stikine C (Part 1)", "Type" : "", "RegionalDistrictCode" : "25"}, {"Name" : "Kitimat-Stikine C (Part 2)", "Type" : "", "RegionalDistrictCode" : "25"}, {"Name" : "Kitimat-Stikine D", "Type" : "", "RegionalDistrictCode" : "25"}, {"Name" : "Kitimat-Stikine E", "Type" : "", "RegionalDistrictCode" : "25"}, {"Name" : "Kitimat-Stikine F", "Type" : "", "RegionalDistrictCode" : "25"}, {"Name" : "Kitselas 1", "Type" : "", "RegionalDistrictCode" : "25"}, {"Name" : "Kitsumkaylum 1", "Type" : "", "RegionalDistrictCode" : "25"}, {"Name" : "Kshish 4", "Type" : "", "RegionalDistrictCode" : "25"}, {"Name" : "Kulspai 6", "Type" : "", "RegionalDistrictCode" : "25"}, {"Name" : "Moricetown 1", "Type" : "", "RegionalDistrictCode" : "25"}, {"Name" : "New Hazelton", "Type" : "", "RegionalDistrictCode" : "25"}, {"Name" : "Nisga''a", "Type" : "", "RegionalDistrictCode" : "25"}, {"Name" : "Sik-e-dakh 2", "Type" : "", "RegionalDistrictCode" : "25"}, {"Name" : "Stewart", "Type" : "", "RegionalDistrictCode" : "25"}, {"Name" : "Tahltan 1", "Type" : "", "RegionalDistrictCode" : "25"}, {"Name" : "Telegraph Creek", "Type" : "", "RegionalDistrictCode" : "25"}, {"Name" : "Terrace", "Type" : "", "RegionalDistrictCode" : "25"}, {"Name" : "Babine 16", "Type" : "", "RegionalDistrictCode" : "26"}, {"Name" : "Babine 25", "Type" : "", "RegionalDistrictCode" : "26"}, {"Name" : "Babine 6", "Type" : "", "RegionalDistrictCode" : "26"}, {"Name" : "Babine Lake 21B", "Type" : "", "RegionalDistrictCode" : "26"}, {"Name" : "Binche 2", "Type" : "", "RegionalDistrictCode" : "26"}, {"Name" : "Bulkley-Nechako A", "Type" : "", "RegionalDistrictCode" : "26"}, {"Name" : "Bulkley-Nechako B", "Type" : "", "RegionalDistrictCode" : "26"}, {"Name" : "Bulkley-Nechako C", "Type" : "", "RegionalDistrictCode" : "26"}, {"Name" : "Bulkley-Nechako D", "Type" : "", "RegionalDistrictCode" : "26"}, {"Name" : "Bulkley-Nechako E", "Type" : "", "RegionalDistrictCode" : "26"}, {"Name" : "Bulkley-Nechako F", "Type" : "", "RegionalDistrictCode" : "26"}, {"Name" : "Bulkley-Nechako G", "Type" : "", "RegionalDistrictCode" : "26"}, {"Name" : "Burns Lake", "Type" : "", "RegionalDistrictCode" : "26"}, {"Name" : "Burns Lake 18", "Type" : "", "RegionalDistrictCode" : "26"}, {"Name" : "Cheslatta 1", "Type" : "", "RegionalDistrictCode" : "26"}, {"Name" : "Duncan Lake 2", "Type" : "", "RegionalDistrictCode" : "26"}, {"Name" : "Dzitline Lee 9", "Type" : "", "RegionalDistrictCode" : "26"}, {"Name" : "Fort St. James", "Type" : "", "RegionalDistrictCode" : "26"}, {"Name" : "Francois Lake 7", "Type" : "", "RegionalDistrictCode" : "26"}, {"Name" : "Fraser Lake", "Type" : "", "RegionalDistrictCode" : "26"}, {"Name" : "Granisle", "Type" : "", "RegionalDistrictCode" : "26"}, {"Name" : "Houston", "Type" : "", "RegionalDistrictCode" : "26"}, {"Name" : "Jean Baptiste 28", "Type" : "", "RegionalDistrictCode" : "26"}, {"Name" : "Laketown 3", "Type" : "", "RegionalDistrictCode" : "26"}, {"Name" : "Mission Lands 17", "Type" : "", "RegionalDistrictCode" : "26"}, {"Name" : "Nak''azdli", "Type" : "", "RegionalDistrictCode" : "26"}, {"Name" : "Nautley (Fort Fraser) 1", "Type" : "", "RegionalDistrictCode" : "26"}, {"Name" : "Nedoats 11", "Type" : "", "RegionalDistrictCode" : "26"}, {"Name" : "Noonla 6", "Type" : "", "RegionalDistrictCode" : "26"}, {"Name" : "North Tacla Lake", "Type" : "", "RegionalDistrictCode" : "26"}, {"Name" : "Omineca 1", "Type" : "", "RegionalDistrictCode" : "26"}, {"Name" : "Palling 1", "Type" : "", "RegionalDistrictCode" : "26"}, {"Name" : "Poison Creek 17A", "Type" : "", "RegionalDistrictCode" : "26"}, {"Name" : "Seaspunkut 4", "Type" : "", "RegionalDistrictCode" : "26"}, {"Name" : "Skins Lake 16A", "Type" : "", "RegionalDistrictCode" : "26"}, {"Name" : "Skins Lake 16B", "Type" : "", "RegionalDistrictCode" : "26"}, {"Name" : "Smithers", "Type" : "", "RegionalDistrictCode" : "26"}, {"Name" : "Sowchea 3", "Type" : "", "RegionalDistrictCode" : "26"}, {"Name" : "Stellaquo (Stella) 1", "Type" : "", "RegionalDistrictCode" : "26"}, {"Name" : "Stony Creek 1", "Type" : "", "RegionalDistrictCode" : "26"}, {"Name" : "Tache 1", "Type" : "", "RegionalDistrictCode" : "26"}, {"Name" : "Tacla Lake (Ferry Landing) 9", "Type" : "", "RegionalDistrictCode" : "26"}, {"Name" : "Tadinlay 15", "Type" : "", "RegionalDistrictCode" : "26"}, {"Name" : "Tatla''t East 2", "Type" : "", "RegionalDistrictCode" : "26"}, {"Name" : "Tatla West 11", "Type" : "", "RegionalDistrictCode" : "26"}, {"Name" : "Telkwa", "Type" : "", "RegionalDistrictCode" : "26"}, {"Name" : "Uncha Lake 13A", "Type" : "", "RegionalDistrictCode" : "26"}, {"Name" : "Vanderhoof", "Type" : "", "RegionalDistrictCode" : "26"}, {"Name" : "Williams Prairie Meadow 1A", "Type" : "", "RegionalDistrictCode" : "26"}, {"Name" : "Woyenne 27", "Type" : "", "RegionalDistrictCode" : "26"}, {"Name" : "Ye Koo Che 3", "Type" : "", "RegionalDistrictCode" : "26"}, {"Name" : "Dease River 1", "Type" : "", "RegionalDistrictCode" : "27"}, {"Name" : "Five Mile Point 3", "Type" : "", "RegionalDistrictCode" : "27"}, {"Name" : "Good Hope Lake", "Type" : "", "RegionalDistrictCode" : "27"}, {"Name" : "Liard River 3", "Type" : "", "RegionalDistrictCode" : "27"}, {"Name" : "Lower Post", "Type" : "", "RegionalDistrictCode" : "27"}, {"Name" : "Stikine Region", "Type" : "", "RegionalDistrictCode" : "27"}, {"Name" : "Unnamed 10", "Type" : "", "RegionalDistrictCode" : "27"}, {"Name" : "Blueberry River 205", "Type" : "", "RegionalDistrictCode" : "28"}, {"Name" : "Chetwynd", "Type" : "", "RegionalDistrictCode" : "28"}, {"Name" : "Dawson Creek", "Type" : "", "RegionalDistrictCode" : "28"}, {"Name" : "Doig River 206", "Type" : "", "RegionalDistrictCode" : "28"}, {"Name" : "East Moberly Lake 169", "Type" : "", "RegionalDistrictCode" : "28"}, {"Name" : "Finlay River 6", "Type" : "", "RegionalDistrictCode" : "28"}, {"Name" : "Fort St. John", "Type" : "", "RegionalDistrictCode" : "28"}, {"Name" : "Fort Ware 1", "Type" : "", "RegionalDistrictCode" : "28"}, {"Name" : "Halfway River 168", "Type" : "", "RegionalDistrictCode" : "28"}, {"Name" : "Hudson''s Hope", "Type" : "", "RegionalDistrictCode" : "28"}, {"Name" : "Ingenika Point", "Type" : "", "RegionalDistrictCode" : "28"}, {"Name" : "Mesilinka 7", "Type" : "", "RegionalDistrictCode" : "28"}, {"Name" : "Peace River B", "Type" : "", "RegionalDistrictCode" : "28"}, {"Name" : "Peace River C", "Type" : "", "RegionalDistrictCode" : "28"}, {"Name" : "Peace River D", "Type" : "", "RegionalDistrictCode" : "28"}, {"Name" : "Peace River E", "Type" : "", "RegionalDistrictCode" : "28"}, {"Name" : "Pouce Coupe", "Type" : "", "RegionalDistrictCode" : "28"}, {"Name" : "Taylor", "Type" : "", "RegionalDistrictCode" : "28"}, {"Name" : "Tumbler Ridge", "Type" : "", "RegionalDistrictCode" : "28"}, {"Name" : "West Moberly Lake 168A", "Type" : "", "RegionalDistrictCode" : "28"}, {"Name" : "Wochiigii Nané?", "Type" : "", "RegionalDistrictCode" : "28"}, {"Name" : "Fontas 1", "Type" : "", "RegionalDistrictCode" : "29"}, {"Name" : "Fort Nelson 2", "Type" : "", "RegionalDistrictCode" : "29"}, {"Name" : "Kahntah 3", "Type" : "", "RegionalDistrictCode" : "29"}, {"Name" : "Northern Rockies", "Type" : "", "RegionalDistrictCode" : "29"}, {"Name" : "Prophet River 4", "Type" : "", "RegionalDistrictCode" : "29"}, {"Name" : "Lantzville", "Type" : "", "RegionalDistrictCode" : "3"}, {"Name" : "Nanaimo", "Type" : "", "RegionalDistrictCode" : "3"}, {"Name" : "Nanaimo A", "Type" : "", "RegionalDistrictCode" : "3"}, {"Name" : "Nanaimo B", "Type" : "", "RegionalDistrictCode" : "3"}, {"Name" : "Nanaimo C", "Type" : "", "RegionalDistrictCode" : "3"}, {"Name" : "Nanaimo E", "Type" : "", "RegionalDistrictCode" : "3"}, {"Name" : "Nanaimo F", "Type" : "", "RegionalDistrictCode" : "3"}, {"Name" : "Nanaimo G", "Type" : "", "RegionalDistrictCode" : "3"}, {"Name" : "Nanaimo H", "Type" : "", "RegionalDistrictCode" : "3"}, {"Name" : "Nanaimo River", "Type" : "", "RegionalDistrictCode" : "3"}, {"Name" : "Nanaimo Town 1", "Type" : "", "RegionalDistrictCode" : "3"}, {"Name" : "Nanoose", "Type" : "", "RegionalDistrictCode" : "3"}, {"Name" : "Parksville", "Type" : "", "RegionalDistrictCode" : "3"}, {"Name" : "Qualicum", "Type" : "", "RegionalDistrictCode" : "3"}, {"Name" : "Qualicum Beach", "Type" : "", "RegionalDistrictCode" : "3"}, {"Name" : "Ahahswinis 1", "Type" : "", "RegionalDistrictCode" : "4"}, {"Name" : "Alberni 2", "Type" : "", "RegionalDistrictCode" : "4"}, {"Name" : "Alberni-Clayoquot A", "Type" : "", "RegionalDistrictCode" : "4"}, {"Name" : "Alberni-Clayoquot B", "Type" : "", "RegionalDistrictCode" : "4"}, {"Name" : "Alberni-Clayoquot C", "Type" : "", "RegionalDistrictCode" : "4"}, {"Name" : "Alberni-Clayoquot D", "Type" : "", "RegionalDistrictCode" : "4"}, {"Name" : "Alberni-Clayoquot E", "Type" : "", "RegionalDistrictCode" : "4"}, {"Name" : "Alberni-Clayoquot F", "Type" : "", "RegionalDistrictCode" : "4"}, {"Name" : "Anacla 12", "Type" : "", "RegionalDistrictCode" : "4"}, {"Name" : "Clakamucus 2", "Type" : "", "RegionalDistrictCode" : "4"}, {"Name" : "Elhlateese 2", "Type" : "", "RegionalDistrictCode" : "4"}, {"Name" : "Esowista 3", "Type" : "", "RegionalDistrictCode" : "4"}, {"Name" : "Hesquiat 1", "Type" : "", "RegionalDistrictCode" : "4"}, {"Name" : "Ittatsoo 1", "Type" : "", "RegionalDistrictCode" : "4"}, {"Name" : "Klehkoot 2", "Type" : "", "RegionalDistrictCode" : "4"}, {"Name" : "Macoah 1", "Type" : "", "RegionalDistrictCode" : "4"}, {"Name" : "Marktosis 15", "Type" : "", "RegionalDistrictCode" : "4"}, {"Name" : "Numukamis 1", "Type" : "", "RegionalDistrictCode" : "4"}, {"Name" : "Opitsat 1", "Type" : "", "RegionalDistrictCode" : "4"}, {"Name" : "Port Alberni", "Type" : "", "RegionalDistrictCode" : "4"}, {"Name" : "Refuge Cove 6", "Type" : "", "RegionalDistrictCode" : "4"}, {"Name" : "Sachsa 4", "Type" : "", "RegionalDistrictCode" : "4"}, {"Name" : "Tin Wis 11", "Type" : "", "RegionalDistrictCode" : "4"}, {"Name" : "Tofino", "Type" : "", "RegionalDistrictCode" : "4"}, {"Name" : "Tsahaheh 1", "Type" : "", "RegionalDistrictCode" : "4"}, {"Name" : "Ucluelet", "Type" : "", "RegionalDistrictCode" : "4"}, {"Name" : "Ahaminaquus 12", "Type" : "", "RegionalDistrictCode" : "5"}, {"Name" : "Campbell River", "Type" : "", "RegionalDistrictCode" : "5"}, {"Name" : "Campbell River 11", "Type" : "", "RegionalDistrictCode" : "5"}, {"Name" : "Cape Mudge 10", "Type" : "", "RegionalDistrictCode" : "5"}, {"Name" : "Chenahkint 12", "Type" : "", "RegionalDistrictCode" : "5"}, {"Name" : "Ehatis 11", "Type" : "", "RegionalDistrictCode" : "5"}, {"Name" : "Gold River", "Type" : "", "RegionalDistrictCode" : "5"}, {"Name" : "Homalco 9", "Type" : "", "RegionalDistrictCode" : "5"}, {"Name" : "Houpsitas 6", "Type" : "", "RegionalDistrictCode" : "5"}, {"Name" : "Nenagwas 12", "Type" : "", "RegionalDistrictCode" : "5"}, {"Name" : "Oclucje 7", "Type" : "", "RegionalDistrictCode" : "5"}, {"Name" : "Quinsam 12", "Type" : "", "RegionalDistrictCode" : "5"}, {"Name" : "Sayward", "Type" : "", "RegionalDistrictCode" : "5"}, {"Name" : "Squirrel Cove 8", "Type" : "", "RegionalDistrictCode" : "5"}, {"Name" : "Strathcona A", "Type" : "", "RegionalDistrictCode" : "5"}, {"Name" : "Strathcona B", "Type" : "", "RegionalDistrictCode" : "5"}, {"Name" : "Strathcona C", "Type" : "", "RegionalDistrictCode" : "5"}, {"Name" : "Strathcona D (Oyster Bay - Buttle Lake)", "Type" : "", "RegionalDistrictCode" : "5"}, {"Name" : "Tahsis", "Type" : "", "RegionalDistrictCode" : "5"}, {"Name" : "Tork 7", "Type" : "", "RegionalDistrictCode" : "5"}, {"Name" : "Tsa Xana 18", "Type" : "", "RegionalDistrictCode" : "5"}, {"Name" : "Village Island 1", "Type" : "", "RegionalDistrictCode" : "5"}, {"Name" : "Yuquot 1", "Type" : "", "RegionalDistrictCode" : "5"}, {"Name" : "Zeballos", "Type" : "", "RegionalDistrictCode" : "5"}, {"Name" : "Comox", "Type" : "", "RegionalDistrictCode" : "6"}, {"Name" : "Comox 1", "Type" : "", "RegionalDistrictCode" : "6"}, {"Name" : "Comox Valley A", "Type" : "", "RegionalDistrictCode" : "6"}, {"Name" : "Comox Valley B (Lazo North)", "Type" : "", "RegionalDistrictCode" : "6"}, {"Name" : "Comox Valley C (Puntledge - Black Creek)", "Type" : "", "RegionalDistrictCode" : "6"}, {"Name" : "Courtenay", "Type" : "", "RegionalDistrictCode" : "6"}, {"Name" : "Cumberland", "Type" : "", "RegionalDistrictCode" : "6"}, {"Name" : "Pentledge 2", "Type" : "", "RegionalDistrictCode" : "6"}, {"Name" : "Powell River", "Type" : "", "RegionalDistrictCode" : "7"}, {"Name" : "qathet A", "Type" : "", "RegionalDistrictCode" : "7"}, {"Name" : "qathet B", "Type" : "", "RegionalDistrictCode" : "7"}, {"Name" : "qathet C", "Type" : "", "RegionalDistrictCode" : "7"}, {"Name" : "qathet D", "Type" : "", "RegionalDistrictCode" : "7"}, {"Name" : "qathet E", "Type" : "", "RegionalDistrictCode" : "7"}, {"Name" : "Sechelt (Part)", "Type" : "", "RegionalDistrictCode" : "7"}, {"Name" : "Sliammon 1", "Type" : "", "RegionalDistrictCode" : "7"}, {"Name" : "Alert Bay", "Type" : "", "RegionalDistrictCode" : "8"}, {"Name" : "Alert Bay", "Type" : "", "RegionalDistrictCode" : "8"}, {"Name" : "Dead Point 5", "Type" : "", "RegionalDistrictCode" : "8"}, {"Name" : "Fort Rupert 1", "Type" : "", "RegionalDistrictCode" : "8"}, {"Name" : "Gwayasdums 1", "Type" : "", "RegionalDistrictCode" : "8"}, {"Name" : "Hope Island 1", "Type" : "", "RegionalDistrictCode" : "8"}, {"Name" : "Hopetown 10A", "Type" : "", "RegionalDistrictCode" : "8"}, {"Name" : "Kippase 2", "Type" : "", "RegionalDistrictCode" : "8"}, {"Name" : "Mount Waddington A", "Type" : "", "RegionalDistrictCode" : "8"}, {"Name" : "Mount Waddington B", "Type" : "", "RegionalDistrictCode" : "8"}, {"Name" : "Mount Waddington C", "Type" : "", "RegionalDistrictCode" : "8"}, {"Name" : "Mount Waddington D", "Type" : "", "RegionalDistrictCode" : "8"}, {"Name" : "Nimpkish 2", "Type" : "", "RegionalDistrictCode" : "8"}, {"Name" : "Port Alice", "Type" : "", "RegionalDistrictCode" : "8"}, {"Name" : "Port Hardy", "Type" : "", "RegionalDistrictCode" : "8"}, {"Name" : "Port McNeill", "Type" : "", "RegionalDistrictCode" : "8"}, {"Name" : "Quaee 7", "Type" : "", "RegionalDistrictCode" : "8"}, {"Name" : "Quatsino Subdivision 18", "Type" : "", "RegionalDistrictCode" : "8"}, {"Name" : "Thomas Point 5", "Type" : "", "RegionalDistrictCode" : "8"}, {"Name" : "Thomas Point 5A", "Type" : "", "RegionalDistrictCode" : "8"}, {"Name" : "Tsulquate 4", "Type" : "", "RegionalDistrictCode" : "8"}, {"Name" : "Bella Bella 1", "Type" : "", "RegionalDistrictCode" : "9"}, {"Name" : "Bella Coola 1", "Type" : "", "RegionalDistrictCode" : "9"}, {"Name" : "Central Coast A", "Type" : "", "RegionalDistrictCode" : "9"}, {"Name" : "Central Coast C", "Type" : "", "RegionalDistrictCode" : "9"}, {"Name" : "Central Coast D", "Type" : "", "RegionalDistrictCode" : "9"}, {"Name" : "Central Coast E", "Type" : "", "RegionalDistrictCode" : "9"}, {"Name" : "Katit 1", "Type" : "", "RegionalDistrictCode" : "9"}]'; BEGIN + -- Cleanup existing data in "Communities" table + DELETE FROM public."Communities"; -- Insert into "Communities" table INSERT INTO public."Communities" ("Id", "Name", "Type","RegionalDistrictCode", "ExtraProperties", "ConcurrencyStamp", "CreationTime")